mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-12 21:53:00 -06:00
refactor: export canonical oc-path isPattern and drop retired openai-codex catalog (#121621)
Completes the hasWildcard -> isPattern rename in oc-path (exports the canonical predicate, migrates all callers, deletes the deprecated alias) and removes the retired buildOpenAICodexProvider catalog module with its api.ts re-export and contract-list entries. The dead-option-flag half of this branch converged with an equivalent change that landed on main first.
This commit is contained in:
committed by
GitHub
parent
a0ad38e71a
commit
c12d3d7a05
@@ -397,7 +397,7 @@ export function resolvePositionalSeg(seg: string, container: PositionalContainer
|
|||||||
/**
|
/**
|
||||||
* Wildcard tokens permitted in `findOcPaths` patterns.
|
* Wildcard tokens permitted in `findOcPaths` patterns.
|
||||||
* `*` matches one sub-segment; `**` matches zero or more (recursive).
|
* `*` matches one sub-segment; `**` matches zero or more (recursive).
|
||||||
* Reject in resolve/set via `hasWildcard`.
|
* Reject in resolve/set via `isPattern`.
|
||||||
*/
|
*/
|
||||||
export const WILDCARD_SINGLE = "*";
|
export const WILDCARD_SINGLE = "*";
|
||||||
export const WILDCARD_RECURSIVE = "**";
|
export const WILDCARD_RECURSIVE = "**";
|
||||||
@@ -407,7 +407,7 @@ export const WILDCARD_RECURSIVE = "**";
|
|||||||
* union `{a,b,c}`, or predicate `[k=v]`). Single-match verbs reject
|
* union `{a,b,c}`, or predicate `[k=v]`). Single-match verbs reject
|
||||||
* these; only `findOcPaths` consumes them.
|
* these; only `findOcPaths` consumes them.
|
||||||
*/
|
*/
|
||||||
function isPattern(path: OcPath): boolean {
|
export function isPattern(path: OcPath): boolean {
|
||||||
for (const slot of [path.section, path.item, path.field]) {
|
for (const slot of [path.section, path.item, path.field]) {
|
||||||
if (slot === undefined) {
|
if (slot === undefined) {
|
||||||
continue;
|
continue;
|
||||||
@@ -429,9 +429,6 @@ function isPattern(path: OcPath): boolean {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @deprecated v1 — use {@link isPattern}. Behaviorally identical. */
|
|
||||||
export const hasWildcard = isPattern;
|
|
||||||
|
|
||||||
/** Union segment `{a,b,c}` matches each comma-separated alternative. */
|
/** Union segment `{a,b,c}` matches each comma-separated alternative. */
|
||||||
export function isUnionSeg(seg: string): boolean {
|
export function isUnionSeg(seg: string): boolean {
|
||||||
return seg.length >= 2 && seg.startsWith("{") && seg.endsWith("}");
|
return seg.length >= 2 && seg.startsWith("{") && seg.endsWith("}");
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { describe, expect, it } from "vitest";
|
|||||||
import { findOcPaths } from "../find.js";
|
import { findOcPaths } from "../find.js";
|
||||||
import { parseJsonc } from "../jsonc/parse.js";
|
import { parseJsonc } from "../jsonc/parse.js";
|
||||||
import { parseJsonl } from "../jsonl/parse.js";
|
import { parseJsonl } from "../jsonl/parse.js";
|
||||||
import { formatOcPath, hasWildcard, OcPathError, parseOcPath } from "../oc-path.js";
|
import { formatOcPath, isPattern, OcPathError, parseOcPath } from "../oc-path.js";
|
||||||
import { parseMd } from "../parse.js";
|
import { parseMd } from "../parse.js";
|
||||||
import { resolveOcPath, setOcPath } from "../universal.js";
|
import { resolveOcPath, setOcPath } from "../universal.js";
|
||||||
|
|
||||||
@@ -12,31 +12,31 @@ function requireFirstResult<T>(results: readonly T[]): T {
|
|||||||
return expectDefined(results[0], "first OC path match");
|
return expectDefined(results[0], "first OC path match");
|
||||||
}
|
}
|
||||||
|
|
||||||
describe("hasWildcard", () => {
|
describe("isPattern", () => {
|
||||||
it("detects single-segment * in any slot", () => {
|
it("detects single-segment * in any slot", () => {
|
||||||
expect(hasWildcard(parseOcPath("oc://X/*/y"))).toBe(true);
|
expect(isPattern(parseOcPath("oc://X/*/y"))).toBe(true);
|
||||||
expect(hasWildcard(parseOcPath("oc://X/a/*"))).toBe(true);
|
expect(isPattern(parseOcPath("oc://X/a/*"))).toBe(true);
|
||||||
expect(hasWildcard(parseOcPath("oc://X/a/b/*"))).toBe(true);
|
expect(isPattern(parseOcPath("oc://X/a/b/*"))).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("detects ** in any slot", () => {
|
it("detects ** in any slot", () => {
|
||||||
expect(hasWildcard(parseOcPath("oc://X/**"))).toBe(true);
|
expect(isPattern(parseOcPath("oc://X/**"))).toBe(true);
|
||||||
expect(hasWildcard(parseOcPath("oc://X/a/**/c"))).toBe(true);
|
expect(isPattern(parseOcPath("oc://X/a/**/c"))).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("detects wildcards inside dotted sub-segments", () => {
|
it("detects wildcards inside dotted sub-segments", () => {
|
||||||
expect(hasWildcard(parseOcPath("oc://X/a.*.c"))).toBe(true);
|
expect(isPattern(parseOcPath("oc://X/a.*.c"))).toBe(true);
|
||||||
expect(hasWildcard(parseOcPath("oc://X/a.**.c"))).toBe(true);
|
expect(isPattern(parseOcPath("oc://X/a.**.c"))).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("returns false for plain paths", () => {
|
it("returns false for plain paths", () => {
|
||||||
expect(hasWildcard(parseOcPath("oc://X/a/b/c"))).toBe(false);
|
expect(isPattern(parseOcPath("oc://X/a/b/c"))).toBe(false);
|
||||||
expect(hasWildcard(parseOcPath("oc://X/a.b.c"))).toBe(false);
|
expect(isPattern(parseOcPath("oc://X/a.b.c"))).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("treats `*` inside an identifier as literal", () => {
|
it("treats `*` inside an identifier as literal", () => {
|
||||||
expect(hasWildcard(parseOcPath("oc://X/foo*bar"))).toBe(false);
|
expect(isPattern(parseOcPath("oc://X/foo*bar"))).toBe(false);
|
||||||
expect(hasWildcard(parseOcPath("oc://X/a*"))).toBe(false);
|
expect(isPattern(parseOcPath("oc://X/a*"))).toBe(false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -253,9 +253,9 @@ describe("positional primitives — $first / $last", () => {
|
|||||||
expect(m?.kind === "leaf" && m.valueText).toBe("end");
|
expect(m?.kind === "leaf" && m.valueText).toBe("end");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("hasWildcard returns false for positional tokens", () => {
|
it("isPattern returns false for positional tokens", () => {
|
||||||
expect(hasWildcard(parseOcPath("oc://X/$first/id"))).toBe(false);
|
expect(isPattern(parseOcPath("oc://X/$first/id"))).toBe(false);
|
||||||
expect(hasWildcard(parseOcPath("oc://X/$last/id"))).toBe(false);
|
expect(isPattern(parseOcPath("oc://X/$last/id"))).toBe(false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// OC Path tests cover oc path parse edges plugin behavior.
|
// OC Path tests cover oc path parse edges plugin behavior.
|
||||||
import { describe, expect, it } from "vitest";
|
import { describe, expect, it } from "vitest";
|
||||||
import { OcPathError, formatOcPath, hasWildcard, parseOcPath } from "../../oc-path.js";
|
import { OcPathError, formatOcPath, isPattern, parseOcPath } from "../../oc-path.js";
|
||||||
|
|
||||||
function expectErr(fn: () => unknown, code: string): void {
|
function expectErr(fn: () => unknown, code: string): void {
|
||||||
try {
|
try {
|
||||||
@@ -176,8 +176,8 @@ describe("oc-path-parse-edges", () => {
|
|||||||
|
|
||||||
it("wildcard detection is quote-aware (literal `*` inside quoted segment)", () => {
|
it("wildcard detection is quote-aware (literal `*` inside quoted segment)", () => {
|
||||||
const concrete = parseOcPath('oc://config.jsonc/"items.*.glob"');
|
const concrete = parseOcPath('oc://config.jsonc/"items.*.glob"');
|
||||||
expect(hasWildcard(concrete)).toBe(false);
|
expect(isPattern(concrete)).toBe(false);
|
||||||
const wildcard = parseOcPath("oc://config.jsonc/items/*");
|
const wildcard = parseOcPath("oc://config.jsonc/items/*");
|
||||||
expect(hasWildcard(wildcard)).toBe(true);
|
expect(isPattern(wildcard)).toBe(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import { appendJsonlOcPath as appendJsonlLine, setJsonlOcPath } from "./jsonl/ed
|
|||||||
import { emitJsonl } from "./jsonl/emit.js";
|
import { emitJsonl } from "./jsonl/emit.js";
|
||||||
import { resolveJsonlOcPath } from "./jsonl/resolve.js";
|
import { resolveJsonlOcPath } from "./jsonl/resolve.js";
|
||||||
import type { OcPath } from "./oc-path.js";
|
import type { OcPath } from "./oc-path.js";
|
||||||
import { formatOcPath, hasWildcard, OcPathError, parseArrayIndexSegment } from "./oc-path.js";
|
import { formatOcPath, isPattern, OcPathError, parseArrayIndexSegment } from "./oc-path.js";
|
||||||
import { resolveMdOcPath } from "./resolve.js";
|
import { resolveMdOcPath } from "./resolve.js";
|
||||||
import type { YamlAst } from "./yaml/ast.js";
|
import type { YamlAst } from "./yaml/ast.js";
|
||||||
import { insertYamlOcPath, setYamlOcPath } from "./yaml/edit.js";
|
import { insertYamlOcPath, setYamlOcPath } from "./yaml/edit.js";
|
||||||
@@ -146,7 +146,7 @@ function detectInsertion(path: OcPath): InsertionInfo | null {
|
|||||||
export function resolveOcPath(ast: OcAst, path: OcPath): OcMatch | null {
|
export function resolveOcPath(ast: OcAst, path: OcPath): OcMatch | null {
|
||||||
// Single-match verb: wildcards belong to findOcPaths. Throw with a
|
// Single-match verb: wildcards belong to findOcPaths. Throw with a
|
||||||
// structured code so consumers can route to the right verb.
|
// structured code so consumers can route to the right verb.
|
||||||
if (hasWildcard(path)) {
|
if (isPattern(path)) {
|
||||||
throw new OcPathError(
|
throw new OcPathError(
|
||||||
`resolveOcPath received a wildcard pattern; use findOcPaths instead: ${formatOcPath(path)}`,
|
`resolveOcPath received a wildcard pattern; use findOcPaths instead: ${formatOcPath(path)}`,
|
||||||
formatOcPath(path),
|
formatOcPath(path),
|
||||||
@@ -426,7 +426,7 @@ export function setOcPath(
|
|||||||
value: string,
|
value: string,
|
||||||
options: SetOcPathOptions = {},
|
options: SetOcPathOptions = {},
|
||||||
): SetResult {
|
): SetResult {
|
||||||
if (hasWildcard(path)) {
|
if (isPattern(path)) {
|
||||||
return {
|
return {
|
||||||
ok: false,
|
ok: false,
|
||||||
reason: "wildcard-not-allowed",
|
reason: "wildcard-not-allowed",
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ export {
|
|||||||
OPENAI_DEFAULT_TTS_VOICE,
|
OPENAI_DEFAULT_TTS_VOICE,
|
||||||
} from "./default-models.js";
|
} from "./default-models.js";
|
||||||
export { openaiMediaUnderstandingProvider } from "./media-understanding-provider.js";
|
export { openaiMediaUnderstandingProvider } from "./media-understanding-provider.js";
|
||||||
export { buildOpenAICodexProvider } from "./openai-chatgpt-catalog.js";
|
|
||||||
export { loginOpenAICodexOAuth } from "./openai-chatgpt-oauth.runtime.js";
|
export { loginOpenAICodexOAuth } from "./openai-chatgpt-oauth.runtime.js";
|
||||||
export { refreshOpenAICodexToken } from "./openai-chatgpt-provider.runtime.js";
|
export { refreshOpenAICodexToken } from "./openai-chatgpt-provider.runtime.js";
|
||||||
export { buildOpenAIProvider } from "./openai-provider.js";
|
export { buildOpenAIProvider } from "./openai-provider.js";
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
// Openai plugin module implements openai chatgpt catalog behavior.
|
|
||||||
import type { ModelProviderConfig } from "openclaw/plugin-sdk/provider-model-shared";
|
|
||||||
import { OPENAI_CODEX_RESPONSES_BASE_URL } from "./base-url.js";
|
|
||||||
|
|
||||||
const OPENAI_CODEX_BASE_URL = OPENAI_CODEX_RESPONSES_BASE_URL;
|
|
||||||
|
|
||||||
export function buildOpenAICodexProvider(): ModelProviderConfig {
|
|
||||||
return {
|
|
||||||
baseUrl: OPENAI_CODEX_BASE_URL,
|
|
||||||
api: "openai-chatgpt-responses",
|
|
||||||
models: [],
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -22,7 +22,6 @@ const EXTRA_GUARDED_EXTENSION_PUBLIC_SURFACE_BASENAMES = assertUniqueValues(
|
|||||||
"index.js",
|
"index.js",
|
||||||
"login-qr-api.js",
|
"login-qr-api.js",
|
||||||
"onboard.js",
|
"onboard.js",
|
||||||
"openai-chatgpt-catalog.js",
|
|
||||||
"provider-catalog.js",
|
"provider-catalog.js",
|
||||||
"session-key-api.js",
|
"session-key-api.js",
|
||||||
"setup-api.js",
|
"setup-api.js",
|
||||||
|
|||||||
@@ -1272,7 +1272,7 @@ describe("plugin-sdk subpath exports", () => {
|
|||||||
});
|
});
|
||||||
expectSourceContract("provider-catalog-shared", {
|
expectSourceContract("provider-catalog-shared", {
|
||||||
mentions: ["buildSingleProviderApiKeyCatalog", "buildPairedProviderApiKeyCatalog"],
|
mentions: ["buildSingleProviderApiKeyCatalog", "buildPairedProviderApiKeyCatalog"],
|
||||||
omits: ["buildDeepSeekProvider", "buildOpenAICodexProvider", "buildVeniceProvider"],
|
omits: ["buildDeepSeekProvider", "buildVeniceProvider"],
|
||||||
});
|
});
|
||||||
|
|
||||||
expectSourceMentions("setup", [
|
expectSourceMentions("setup", [
|
||||||
|
|||||||
Reference in New Issue
Block a user