ocmm 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codex/agents/dw-builder.toml +3 -3
- package/.codex/agents/dw-clarifier.toml +2 -2
- package/.codex/agents/dw-code-search.toml +2 -2
- package/.codex/agents/dw-coding.toml +2 -2
- package/.codex/agents/dw-complex.toml +2 -2
- package/.codex/agents/dw-creative.toml +2 -2
- package/.codex/agents/dw-deep.toml +3 -3
- package/.codex/agents/dw-doc-search.toml +2 -2
- package/.codex/agents/dw-documenting.toml +2 -2
- package/.codex/agents/dw-explore.toml +2 -2
- package/.codex/agents/dw-frontend.toml +2 -2
- package/.codex/agents/dw-hard-reasoning.toml +2 -2
- package/.codex/agents/dw-media-reader.toml +2 -2
- package/.codex/agents/dw-normal-task.toml +2 -2
- package/.codex/agents/dw-oracle-2nd.toml +8 -0
- package/.codex/agents/dw-oracle.toml +3 -3
- package/.codex/agents/dw-orchestrator.toml +2 -2
- package/.codex/agents/dw-plan-critic.toml +2 -2
- package/.codex/agents/dw-planner.toml +3 -3
- package/.codex/agents/dw-quick.toml +2 -2
- package/.codex/agents/dw-research.toml +2 -2
- package/.codex/agents/dw-reviewer.toml +2 -2
- package/README.md +193 -46
- package/dist/cli/shim.d.ts +4 -2
- package/dist/cli/shim.js +26 -11
- package/dist/cli/shim.js.map +1 -1
- package/dist/codex/plugin-generator.js +121 -96
- package/dist/codex/plugin-generator.js.map +1 -1
- package/dist/config/load.d.ts +32 -23
- package/dist/config/load.js +384 -90
- package/dist/config/load.js.map +1 -1
- package/dist/config/merge.d.ts +18 -0
- package/dist/config/merge.js +46 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/normalize.d.ts +1 -0
- package/dist/config/normalize.js +22 -16
- package/dist/config/normalize.js.map +1 -1
- package/dist/config/profile-aliases.d.ts +12 -0
- package/dist/config/profile-aliases.js +127 -0
- package/dist/config/profile-aliases.js.map +1 -0
- package/dist/config/profile-types.d.ts +13 -0
- package/dist/config/profile-types.js +2 -0
- package/dist/config/profile-types.js.map +1 -0
- package/dist/config/review-agent-migration.d.ts +89 -0
- package/dist/config/review-agent-migration.js +237 -0
- package/dist/config/review-agent-migration.js.map +1 -0
- package/dist/config/schema.d.ts +1364 -219
- package/dist/config/schema.js +169 -36
- package/dist/config/schema.js.map +1 -1
- package/dist/config/tolerant-parse.d.ts +41 -0
- package/dist/config/tolerant-parse.js +164 -0
- package/dist/config/tolerant-parse.js.map +1 -0
- package/dist/data/agents.d.ts +2 -1
- package/dist/data/agents.js +25 -10
- package/dist/data/agents.js.map +1 -1
- package/dist/data/categories.js +2 -1
- package/dist/data/categories.js.map +1 -1
- package/dist/hooks/chat-params.d.ts +2 -0
- package/dist/hooks/chat-params.js +182 -16
- package/dist/hooks/chat-params.js.map +1 -1
- package/dist/hooks/config.d.ts +14 -2
- package/dist/hooks/config.js +538 -60
- package/dist/hooks/config.js.map +1 -1
- package/dist/hooks/event.d.ts +3 -11
- package/dist/hooks/event.js +5 -9
- package/dist/hooks/event.js.map +1 -1
- package/dist/index.js +21 -14
- package/dist/index.js.map +1 -1
- package/dist/intent/model-family.d.ts +2 -0
- package/dist/intent/model-family.js +11 -0
- package/dist/intent/model-family.js.map +1 -1
- package/dist/intent/prompt-loader.d.ts +3 -3
- package/dist/intent/prompt-loader.js +3 -3
- package/dist/permissions/index.d.ts +3 -0
- package/dist/permissions/index.js +43 -28
- package/dist/permissions/index.js.map +1 -1
- package/dist/review-agents/expand.d.ts +36 -0
- package/dist/review-agents/expand.js +157 -0
- package/dist/review-agents/expand.js.map +1 -0
- package/dist/review-agents/names.d.ts +16 -0
- package/dist/review-agents/names.js +55 -0
- package/dist/review-agents/names.js.map +1 -0
- package/dist/routing/effective-route.d.ts +19 -0
- package/dist/routing/effective-route.js +133 -0
- package/dist/routing/effective-route.js.map +1 -0
- package/dist/routing/model-upgrades.d.ts +5 -0
- package/dist/routing/model-upgrades.js +59 -11
- package/dist/routing/model-upgrades.js.map +1 -1
- package/dist/routing/resolver.d.ts +8 -1
- package/dist/routing/resolver.js +29 -9
- package/dist/routing/resolver.js.map +1 -1
- package/dist/routing/route-registry.d.ts +13 -0
- package/dist/routing/route-registry.js +84 -0
- package/dist/routing/route-registry.js.map +1 -0
- package/dist/routing/variant-translator.js +7 -4
- package/dist/routing/variant-translator.js.map +1 -1
- package/dist/runtime-fallback/dispatcher.d.ts +1 -0
- package/dist/runtime-fallback/dispatcher.js +7 -5
- package/dist/runtime-fallback/dispatcher.js.map +1 -1
- package/dist/runtime-fallback/error-classifier.d.ts +3 -1
- package/dist/runtime-fallback/error-classifier.js +135 -1
- package/dist/runtime-fallback/error-classifier.js.map +1 -1
- package/dist/runtime-fallback/event-handler-generic-fallback.d.ts +26 -0
- package/dist/runtime-fallback/event-handler-generic-fallback.js +54 -0
- package/dist/runtime-fallback/event-handler-generic-fallback.js.map +1 -0
- package/dist/runtime-fallback/event-handler-idle-continuation.d.ts +9 -0
- package/dist/runtime-fallback/event-handler-idle-continuation.js +48 -0
- package/dist/runtime-fallback/event-handler-idle-continuation.js.map +1 -0
- package/dist/runtime-fallback/event-handler-support.d.ts +39 -0
- package/dist/runtime-fallback/event-handler-support.js +194 -0
- package/dist/runtime-fallback/event-handler-support.js.map +1 -0
- package/dist/runtime-fallback/event-handler-test-fixtures.d.ts +874 -0
- package/dist/runtime-fallback/event-handler-test-fixtures.js +150 -0
- package/dist/runtime-fallback/event-handler-test-fixtures.js.map +1 -0
- package/dist/runtime-fallback/event-handler.d.ts +13 -1
- package/dist/runtime-fallback/event-handler.js +334 -192
- package/dist/runtime-fallback/event-handler.js.map +1 -1
- package/dist/runtime-fallback/fallback-state.d.ts +8 -5
- package/dist/runtime-fallback/fallback-state.js +9 -6
- package/dist/runtime-fallback/fallback-state.js.map +1 -1
- package/dist/runtime-fallback/index.d.ts +21 -1
- package/dist/runtime-fallback/index.js +7 -1
- package/dist/runtime-fallback/index.js.map +1 -1
- package/dist/runtime-fallback/interruption-output-adapter.d.ts +7 -0
- package/dist/runtime-fallback/interruption-output-adapter.js +91 -0
- package/dist/runtime-fallback/interruption-output-adapter.js.map +1 -0
- package/dist/runtime-fallback/subagent-429-controller-fixture.d.ts +105 -0
- package/dist/runtime-fallback/subagent-429-controller-fixture.js +116 -0
- package/dist/runtime-fallback/subagent-429-controller-fixture.js.map +1 -0
- package/dist/runtime-fallback/subagent-429-controller.d.ts +167 -0
- package/dist/runtime-fallback/subagent-429-controller.js +334 -0
- package/dist/runtime-fallback/subagent-429-controller.js.map +1 -0
- package/dist/runtime-fallback/subagent-429-policy.d.ts +13 -0
- package/dist/runtime-fallback/subagent-429-policy.js +37 -0
- package/dist/runtime-fallback/subagent-429-policy.js.map +1 -0
- package/dist/runtime-fallback/subagent-429-session.d.ts +48 -0
- package/dist/runtime-fallback/subagent-429-session.js +316 -0
- package/dist/runtime-fallback/subagent-429-session.js.map +1 -0
- package/dist/shared/opencode-events.d.ts +22 -0
- package/dist/shared/opencode-events.js +75 -0
- package/dist/shared/opencode-events.js.map +1 -0
- package/dist/shared/types.d.ts +12 -1
- package/package.json +1 -1
- package/plugins/deepwork/.codex-plugin/plugin.json +1 -1
- package/plugins/deepwork/README.md +3 -2
- package/plugins/deepwork/agents/dw-builder.toml +3 -3
- package/plugins/deepwork/agents/dw-clarifier.toml +2 -2
- package/plugins/deepwork/agents/dw-code-search.toml +2 -2
- package/plugins/deepwork/agents/dw-coding.toml +2 -2
- package/plugins/deepwork/agents/dw-complex.toml +2 -2
- package/plugins/deepwork/agents/dw-creative.toml +2 -2
- package/plugins/deepwork/agents/dw-deep.toml +3 -3
- package/plugins/deepwork/agents/dw-doc-search.toml +2 -2
- package/plugins/deepwork/agents/dw-documenting.toml +2 -2
- package/plugins/deepwork/agents/dw-explore.toml +2 -2
- package/plugins/deepwork/agents/dw-frontend.toml +2 -2
- package/plugins/deepwork/agents/dw-hard-reasoning.toml +2 -2
- package/plugins/deepwork/agents/dw-media-reader.toml +2 -2
- package/plugins/deepwork/agents/dw-normal-task.toml +2 -2
- package/plugins/deepwork/agents/dw-oracle-2nd.toml +8 -0
- package/plugins/deepwork/agents/dw-oracle.toml +3 -3
- package/plugins/deepwork/agents/dw-orchestrator.toml +2 -2
- package/plugins/deepwork/agents/dw-plan-critic.toml +2 -2
- package/plugins/deepwork/agents/dw-planner.toml +3 -3
- package/plugins/deepwork/agents/dw-quick.toml +2 -2
- package/plugins/deepwork/agents/dw-research.toml +2 -2
- package/plugins/deepwork/agents/dw-reviewer.toml +2 -2
- package/plugins/deepwork/dist/cli/shim.d.ts +4 -2
- package/plugins/deepwork/dist/cli/shim.js +26 -11
- package/plugins/deepwork/dist/cli/shim.js.map +1 -1
- package/plugins/deepwork/dist/shared/opencode-events.d.ts +22 -0
- package/plugins/deepwork/dist/shared/opencode-events.js +75 -0
- package/plugins/deepwork/dist/shared/opencode-events.js.map +1 -0
- package/plugins/deepwork/dist/shared/types.d.ts +12 -1
- package/plugins/deepwork/package.json +1 -1
- package/plugins/deepwork/skills/deepwork/SKILL.md +74 -58
- package/plugins/deepwork/skills/deepwork-requesting-code-review/SKILL.md +53 -27
- package/plugins/deepwork/skills/deepwork-requesting-code-review/code-reviewer.md +11 -7
- package/plugins/deepwork/skills/deepwork-subagent-driven-development/SKILL.md +34 -21
- package/plugins/deepwork/skills/deepwork-subagent-driven-development/implementer-prompt.md +10 -3
- package/prompts/codex/agents/clarifier.md +4 -0
- package/prompts/codex/agents/orchestrator.md +12 -2
- package/prompts/codex/agents/plan-critic.md +4 -0
- package/prompts/codex/agents/planner.md +15 -10
- package/prompts/codex/agents/reviewer.md +8 -2
- package/prompts/codex/deepwork/gpt-5.6.md +20 -37
- package/prompts/omo/agents/clarifier.md +4 -0
- package/prompts/omo/agents/orchestrator.md +11 -0
- package/prompts/omo/agents/plan-critic.md +4 -0
- package/prompts/omo/agents/planner.md +15 -3
- package/prompts/omo/agents/reviewer.md +8 -2
- package/prompts/omo/deepwork/gpt-5.6.md +20 -37
- package/prompts/v1/agents/clarifier.md +4 -0
- package/prompts/v1/agents/orchestrator.md +12 -2
- package/prompts/v1/agents/plan-critic.md +4 -0
- package/prompts/v1/agents/planner.md +15 -10
- package/prompts/v1/agents/reviewer.md +8 -2
- package/prompts/v1/deepwork/gpt-5.6.md +20 -37
- package/skills/v1/requesting-code-review/SKILL.md +53 -27
- package/skills/v1/requesting-code-review/code-reviewer.md +11 -7
- package/skills/v1/subagent-driven-development/SKILL.md +34 -21
- package/skills/v1/subagent-driven-development/implementer-prompt.md +10 -3
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
function isPlainObjectValue(v) {
|
|
2
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
3
|
+
}
|
|
4
|
+
export const isPlainObject = isPlainObjectValue;
|
|
5
|
+
export const ACCUMULATING_ARRAY_KEYS = new Set([
|
|
6
|
+
"fallbackModels",
|
|
7
|
+
"disabledAgents",
|
|
8
|
+
"disabledHooks",
|
|
9
|
+
"disabledTools",
|
|
10
|
+
"disabledSkills",
|
|
11
|
+
"disabledCommands",
|
|
12
|
+
"disabledMcps",
|
|
13
|
+
]);
|
|
14
|
+
/**
|
|
15
|
+
* Deep-merge two plain-object trees.
|
|
16
|
+
*
|
|
17
|
+
* Default array policy: REPLACE (override wins) for predictable override
|
|
18
|
+
* semantics. Model fallback and feature-disable arrays are UNIONED de-duped
|
|
19
|
+
* instead - these accumulate across user+project layers so global/project
|
|
20
|
+
* gates compose predictably.
|
|
21
|
+
*
|
|
22
|
+
* Pass `{ profileOverlay: true }` to force ALL arrays to replace (use when
|
|
23
|
+
* overlaying a profile that should fully own a field rather than accumulate).
|
|
24
|
+
*/
|
|
25
|
+
export function deepMerge(base, override, parentKey, opts) {
|
|
26
|
+
if (override === undefined)
|
|
27
|
+
return base;
|
|
28
|
+
if (Array.isArray(base) && Array.isArray(override)) {
|
|
29
|
+
if (opts?.profileOverlay)
|
|
30
|
+
return override;
|
|
31
|
+
if (parentKey && ACCUMULATING_ARRAY_KEYS.has(parentKey)) {
|
|
32
|
+
const set = new Set([...base, ...override].map((x) => String(x)));
|
|
33
|
+
return Array.from(set);
|
|
34
|
+
}
|
|
35
|
+
return override;
|
|
36
|
+
}
|
|
37
|
+
if (isPlainObject(base) && isPlainObject(override)) {
|
|
38
|
+
const out = { ...base };
|
|
39
|
+
for (const [k, v] of Object.entries(override)) {
|
|
40
|
+
out[k] = deepMerge(base[k], v, k, opts);
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
return override;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/config/merge.ts"],"names":[],"mappings":"AAAA,SAAS,kBAAkB,CAAC,CAAU;IACpC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAA;AAE/C,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IAC7C,gBAAgB;IAChB,gBAAgB;IAChB,eAAe;IACf,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;CACf,CAAC,CAAA;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CACvB,IAAa,EACb,QAAiB,EACjB,SAAkB,EAClB,IAAmC;IAEnC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,IAAI,IAAI,EAAE,cAAc;YAAE,OAAO,QAAQ,CAAA;QACzC,IAAI,SAAS,IAAI,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACzE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,MAAM,GAAG,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAA;QAChD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QACzC,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -8,6 +8,7 @@ export type NormalizedShorthand = {
|
|
|
8
8
|
disabled?: boolean;
|
|
9
9
|
permission?: Record<string, PermissionValue>;
|
|
10
10
|
};
|
|
11
|
+
export declare function normalizeDirectRequirement(entry: AgentEntry | CategoryEntry | undefined): ModelRequirement | undefined;
|
|
11
12
|
export declare function normalizeShorthand(entry: AgentEntry | CategoryEntry | undefined, options?: {
|
|
12
13
|
resolveAlias?: (name: string) => NormalizedShorthand | undefined;
|
|
13
14
|
visited?: Set<string>;
|
package/dist/config/normalize.js
CHANGED
|
@@ -18,6 +18,25 @@ function normalizeFallbackEntryConfig(raw) {
|
|
|
18
18
|
function normalizeRequirementConfig(req) {
|
|
19
19
|
return req;
|
|
20
20
|
}
|
|
21
|
+
export function normalizeDirectRequirement(entry) {
|
|
22
|
+
if (!entry)
|
|
23
|
+
return undefined;
|
|
24
|
+
if (entry.requirement)
|
|
25
|
+
return normalizeRequirementConfig(entry.requirement);
|
|
26
|
+
const chain = [];
|
|
27
|
+
if (entry.model)
|
|
28
|
+
chain.push(parseModelString(entry.model, entry.variant));
|
|
29
|
+
if (entry.fallbackModels) {
|
|
30
|
+
for (const model of entry.fallbackModels)
|
|
31
|
+
chain.push(normalizeFallbackEntryConfig(model));
|
|
32
|
+
}
|
|
33
|
+
if (chain.length === 0)
|
|
34
|
+
return undefined;
|
|
35
|
+
const requirement = { fallbackChain: chain };
|
|
36
|
+
if (entry.variant)
|
|
37
|
+
requirement.variant = entry.variant;
|
|
38
|
+
return requirement;
|
|
39
|
+
}
|
|
21
40
|
export function normalizeShorthand(entry, options) {
|
|
22
41
|
if (!entry)
|
|
23
42
|
return undefined;
|
|
@@ -32,22 +51,9 @@ export function normalizeShorthand(entry, options) {
|
|
|
32
51
|
if ("permission" in entry && entry.permission) {
|
|
33
52
|
out.permission = { ...(out.permission ?? {}), ...entry.permission };
|
|
34
53
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
const chain = [];
|
|
40
|
-
if (entry.model)
|
|
41
|
-
chain.push(parseModelString(entry.model, entry.variant));
|
|
42
|
-
if (entry.fallbackModels) {
|
|
43
|
-
for (const m of entry.fallbackModels)
|
|
44
|
-
chain.push(normalizeFallbackEntryConfig(m));
|
|
45
|
-
}
|
|
46
|
-
if (chain.length > 0) {
|
|
47
|
-
const req = { fallbackChain: chain };
|
|
48
|
-
if (entry.variant)
|
|
49
|
-
req.variant = entry.variant;
|
|
50
|
-
out.requirement = req;
|
|
54
|
+
const directRequirement = normalizeDirectRequirement(entry);
|
|
55
|
+
if (directRequirement) {
|
|
56
|
+
out.requirement = directRequirement;
|
|
51
57
|
return out;
|
|
52
58
|
}
|
|
53
59
|
// alias resolution (only when no direct model config)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/config/normalize.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,OAAiB;IAEjB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3D,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC/D,MAAM,KAAK,GAAkB;QAC3B,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;QACrC,KAAK;KACN,CAAA;IACD,IAAI,OAAO;QAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;IACpC,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,4BAA4B,CACnC,GAAiC;IAEjC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACzD,OAAO,GAAoB,CAAA;AAC7B,CAAC;AAED,SAAS,0BAA0B,CACjC,GAA2B;IAE3B,OAAO,GAAuB,CAAA;AAChC,CAAC;AASD,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/config/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ProfileDescriptorMap } from "./profile-types.ts";
|
|
2
|
+
import type { AgentEntry, OcmmConfig } from "./schema.ts";
|
|
3
|
+
export type QualifiedAgentAlias = {
|
|
4
|
+
profile: string;
|
|
5
|
+
agent: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function parseQualifiedAgentAlias(alias: string): QualifiedAgentAlias | null;
|
|
8
|
+
export declare function materializeQualifiedAgentAliases(args: {
|
|
9
|
+
config: OcmmConfig;
|
|
10
|
+
baseAgents: Record<string, AgentEntry>;
|
|
11
|
+
profiles: ProfileDescriptorMap;
|
|
12
|
+
}): OcmmConfig;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { deepMerge, isPlainObject } from "./merge.js";
|
|
2
|
+
import { normalizeDirectRequirement } from "./normalize.js";
|
|
3
|
+
export function parseQualifiedAgentAlias(alias) {
|
|
4
|
+
const separator = alias.indexOf(":");
|
|
5
|
+
if (separator < 0)
|
|
6
|
+
return null;
|
|
7
|
+
const profile = alias.slice(0, separator);
|
|
8
|
+
const agent = alias.slice(separator + 1);
|
|
9
|
+
if (!profile || !agent || !/^[A-Za-z0-9_-]+$/.test(profile)) {
|
|
10
|
+
throw new Error(`invalid-qualified-alias: ${alias}`);
|
|
11
|
+
}
|
|
12
|
+
return { profile, agent };
|
|
13
|
+
}
|
|
14
|
+
function cloneFallbackEntry(entry) {
|
|
15
|
+
return {
|
|
16
|
+
...entry,
|
|
17
|
+
providers: [...entry.providers],
|
|
18
|
+
...(entry.thinking ? { thinking: { ...entry.thinking } } : {}),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function cloneRequirement(requirement) {
|
|
22
|
+
return {
|
|
23
|
+
...requirement,
|
|
24
|
+
fallbackChain: requirement.fallbackChain.map(cloneFallbackEntry),
|
|
25
|
+
...(requirement.requiresProvider ? { requiresProvider: [...requirement.requiresProvider] } : {}),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function scopedAgentKey(node) {
|
|
29
|
+
return JSON.stringify([
|
|
30
|
+
node.scope.kind,
|
|
31
|
+
node.scope.kind === "profile" ? node.scope.name : null,
|
|
32
|
+
node.agent,
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
function formatScopedAgent(node) {
|
|
36
|
+
return node.scope.kind === "active"
|
|
37
|
+
? `active:${node.agent}`
|
|
38
|
+
: `profile:${node.scope.name}:${node.agent}`;
|
|
39
|
+
}
|
|
40
|
+
function qualifiedAliasError(path, detail) {
|
|
41
|
+
return new Error(`${detail}: ${path.map(formatScopedAgent).join(" -> ")}`);
|
|
42
|
+
}
|
|
43
|
+
function parseQualifiedAliasAtPath(alias, path) {
|
|
44
|
+
try {
|
|
45
|
+
return parseQualifiedAgentAlias(alias);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
throw qualifiedAliasError(path, err.message);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function materializeQualifiedAgentAliases(args) {
|
|
52
|
+
if (!args.config.agents)
|
|
53
|
+
return args.config;
|
|
54
|
+
const targetViews = new Map();
|
|
55
|
+
const activeAgents = args.config.agents;
|
|
56
|
+
const profileAgents = (name, path) => {
|
|
57
|
+
const cached = targetViews.get(name);
|
|
58
|
+
if (cached)
|
|
59
|
+
return cached;
|
|
60
|
+
const descriptor = args.profiles.get(name);
|
|
61
|
+
if (!descriptor) {
|
|
62
|
+
throw qualifiedAliasError(path, `qualified alias target profile "${name}" not found`);
|
|
63
|
+
}
|
|
64
|
+
if (descriptor.error) {
|
|
65
|
+
const location = descriptor.path ?? descriptor.source;
|
|
66
|
+
throw qualifiedAliasError(path, `qualified alias target profile "${name}" from ${location} is invalid (${descriptor.error.kind}): ${descriptor.error.message}`);
|
|
67
|
+
}
|
|
68
|
+
if (!isPlainObject(descriptor.value)) {
|
|
69
|
+
throw qualifiedAliasError(path, `qualified alias target profile "${name}" has no materialized value`);
|
|
70
|
+
}
|
|
71
|
+
const overlay = isPlainObject(descriptor.value.agents)
|
|
72
|
+
? descriptor.value.agents
|
|
73
|
+
: undefined;
|
|
74
|
+
const view = deepMerge(args.baseAgents, overlay, undefined, { profileOverlay: true });
|
|
75
|
+
targetViews.set(name, view);
|
|
76
|
+
return view;
|
|
77
|
+
};
|
|
78
|
+
const agentsForScope = (scope, path) => scope.kind === "active" ? activeAgents : profileAgents(scope.name, path);
|
|
79
|
+
const resolve = (scope, agent, stack, membership) => {
|
|
80
|
+
const node = { scope, agent };
|
|
81
|
+
const nodeKey = scopedAgentKey(node);
|
|
82
|
+
if (membership.has(nodeKey)) {
|
|
83
|
+
throw qualifiedAliasError([...stack, node], "circular qualified alias");
|
|
84
|
+
}
|
|
85
|
+
membership.add(nodeKey);
|
|
86
|
+
stack.push(node);
|
|
87
|
+
try {
|
|
88
|
+
const path = stack;
|
|
89
|
+
const entry = agentsForScope(scope, path)[agent];
|
|
90
|
+
if (!entry) {
|
|
91
|
+
throw qualifiedAliasError(path, `qualified alias target ${formatScopedAgent(node)} not found`);
|
|
92
|
+
}
|
|
93
|
+
const direct = normalizeDirectRequirement(entry);
|
|
94
|
+
if (direct)
|
|
95
|
+
return cloneRequirement(direct);
|
|
96
|
+
const alias = entry.alias;
|
|
97
|
+
if (!alias) {
|
|
98
|
+
throw qualifiedAliasError(path, `qualified alias target ${formatScopedAgent(node)} has no requirement`);
|
|
99
|
+
}
|
|
100
|
+
const qualified = parseQualifiedAliasAtPath(alias, path);
|
|
101
|
+
if (qualified) {
|
|
102
|
+
return resolve({ kind: "profile", name: qualified.profile }, qualified.agent, stack, membership);
|
|
103
|
+
}
|
|
104
|
+
return resolve(scope, alias, stack, membership);
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
stack.pop();
|
|
108
|
+
membership.delete(nodeKey);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
let agents = activeAgents;
|
|
112
|
+
for (const [name, entry] of Object.entries(activeAgents)) {
|
|
113
|
+
if (normalizeDirectRequirement(entry))
|
|
114
|
+
continue;
|
|
115
|
+
if (!entry.alias)
|
|
116
|
+
continue;
|
|
117
|
+
const source = { scope: { kind: "active" }, agent: name };
|
|
118
|
+
if (!parseQualifiedAliasAtPath(entry.alias, [source]))
|
|
119
|
+
continue;
|
|
120
|
+
const requirement = resolve({ kind: "active" }, name, [], new Set());
|
|
121
|
+
if (agents === activeAgents)
|
|
122
|
+
agents = { ...activeAgents };
|
|
123
|
+
agents[name] = { ...entry, requirement };
|
|
124
|
+
}
|
|
125
|
+
return agents === activeAgents ? args.config : { ...args.config, agents };
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=profile-aliases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-aliases.js","sourceRoot":"","sources":["../../src/config/profile-aliases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type ProfileSource = "inline" | "user-directory" | "project-directory";
|
|
2
|
+
export type ProfileDescriptorError = {
|
|
3
|
+
kind: "parse" | "shape";
|
|
4
|
+
message: string;
|
|
5
|
+
};
|
|
6
|
+
export type ProfileDescriptor = {
|
|
7
|
+
name: string;
|
|
8
|
+
source: ProfileSource;
|
|
9
|
+
path?: string;
|
|
10
|
+
value?: unknown;
|
|
11
|
+
error?: ProfileDescriptorError;
|
|
12
|
+
};
|
|
13
|
+
export type ProfileDescriptorMap = ReadonlyMap<string, ProfileDescriptor>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-types.js","sourceRoot":"","sources":["../../src/config/profile-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context-sensitive pre-schema migration for review-agent config keys.
|
|
3
|
+
*
|
|
4
|
+
* The runtime review-name grammar (`src/review-agents/names.ts`) understands
|
|
5
|
+
* legacy aliases for *runtime* name resolution. Config migration is a separate
|
|
6
|
+
* concern: it runs *before* schema validation, canonicalizes raw `agents`
|
|
7
|
+
* map keys on every base layer and on the selected inline/directory profile,
|
|
8
|
+
* and detects spelling conflicts across active layers.
|
|
9
|
+
*
|
|
10
|
+
* Only raw agent-map keys have migration semantics here:
|
|
11
|
+
* - `oracle-high` -> `oracle-2nd` (legacy config; emits a deprecation warning)
|
|
12
|
+
* - `oracle-second` -> `oracle-2nd` (accepted config alias; silent)
|
|
13
|
+
*
|
|
14
|
+
* `oracle-second-high` and other suffixed aliases are left untouched and are
|
|
15
|
+
* later rejected by the schema's reserved-name check. We never call
|
|
16
|
+
* `parseReviewAgentName("oracle-high")` to interpret a raw config slot key,
|
|
17
|
+
* because that parser treats `oracle-high` as the logical-high tier of slot 1
|
|
18
|
+
* - a meaning this migration intentionally removes.
|
|
19
|
+
*
|
|
20
|
+
* The pure preparation APIs throw `ReviewConfigConflictError` on cross-layer
|
|
21
|
+
* spelling conflicts because choosing either spelling would be ambiguous.
|
|
22
|
+
* Ordinary schema mismatches are left for `loadConfig()`'s tolerant parser,
|
|
23
|
+
* which discards only the invalid field or entry and preserves valid siblings.
|
|
24
|
+
*/
|
|
25
|
+
export type ReviewConfigSpelling = "canonical" | "legacy-oracle-high" | "oracle-second-alias";
|
|
26
|
+
export type ReviewConfigOrigin = {
|
|
27
|
+
canonicalKey: "oracle-2nd";
|
|
28
|
+
originalKey: "oracle-2nd" | "oracle-high" | "oracle-second";
|
|
29
|
+
spelling: ReviewConfigSpelling;
|
|
30
|
+
source: string;
|
|
31
|
+
};
|
|
32
|
+
export type ReviewConfigLayerInput = {
|
|
33
|
+
source: string;
|
|
34
|
+
value: unknown;
|
|
35
|
+
};
|
|
36
|
+
export type PreparedReviewProfile = {
|
|
37
|
+
name: string;
|
|
38
|
+
source: string;
|
|
39
|
+
value: unknown;
|
|
40
|
+
origins: ReadonlyMap<string, ReviewConfigOrigin>;
|
|
41
|
+
};
|
|
42
|
+
export type PreparedReviewConfigLayer = {
|
|
43
|
+
source: string;
|
|
44
|
+
value: unknown;
|
|
45
|
+
};
|
|
46
|
+
export type PreparedReviewConfigLayers = {
|
|
47
|
+
layers: readonly PreparedReviewConfigLayer[];
|
|
48
|
+
baseOrigins: ReadonlyMap<string, ReviewConfigOrigin>;
|
|
49
|
+
inlineProfiles: ReadonlyMap<string, readonly PreparedReviewProfile[]>;
|
|
50
|
+
};
|
|
51
|
+
export declare class ReviewConfigConflictError extends Error {
|
|
52
|
+
readonly code: "OCMM_REVIEW_CONFIG_CONFLICT";
|
|
53
|
+
constructor(message: string);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Prepare all base layers for schema parsing.
|
|
57
|
+
*
|
|
58
|
+
* - Canonicalizes `agents` on every base layer before merge.
|
|
59
|
+
* - Compares base origins across layers: identical original spellings may
|
|
60
|
+
* override by normal precedence; different spellings targeting `oracle-2nd`
|
|
61
|
+
* throw `ReviewConfigConflictError` naming both keys and both sources.
|
|
62
|
+
* - Canonicalizes every inline profile independently before schema parsing and
|
|
63
|
+
* retains each contribution's spelling origins for selection-time checks.
|
|
64
|
+
* - Does not compare inline profiles with base until profile precedence selects
|
|
65
|
+
* the active contribution(s).
|
|
66
|
+
*/
|
|
67
|
+
export declare function prepareConfigLayers(layers: readonly ReviewConfigLayerInput[], warn: (message: string) => void): PreparedReviewConfigLayers;
|
|
68
|
+
/**
|
|
69
|
+
* Canonicalize one directory profile's `agents` map and record its file path.
|
|
70
|
+
* Does NOT compare with base. Throws on within-profile spelling collisions.
|
|
71
|
+
*/
|
|
72
|
+
export declare function prepareReviewProfile(input: {
|
|
73
|
+
name: string;
|
|
74
|
+
source: string;
|
|
75
|
+
value: unknown;
|
|
76
|
+
}, _warn: (message: string) => void): PreparedReviewProfile;
|
|
77
|
+
/**
|
|
78
|
+
* Check that the selected profile contribution(s) are compatible with base.
|
|
79
|
+
*
|
|
80
|
+
* Receives ONLY the profile contribution(s) that actually won precedence:
|
|
81
|
+
* - project-directory winner is a single prepared profile, OR
|
|
82
|
+
* - user-directory winner is a single prepared profile, OR
|
|
83
|
+
* - all inline contributions for that name in user->project order.
|
|
84
|
+
*
|
|
85
|
+
* First checks different spellings across those selected contributions, then
|
|
86
|
+
* checks the winning origin per canonical key against `baseOrigins`. Does
|
|
87
|
+
* NOT inspect shadowed directory or inactive profiles.
|
|
88
|
+
*/
|
|
89
|
+
export declare function assertSelectedReviewProfileCompatible(baseOrigins: ReadonlyMap<string, ReviewConfigOrigin>, selectedProfiles: readonly PreparedReviewProfile[]): void;
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context-sensitive pre-schema migration for review-agent config keys.
|
|
3
|
+
*
|
|
4
|
+
* The runtime review-name grammar (`src/review-agents/names.ts`) understands
|
|
5
|
+
* legacy aliases for *runtime* name resolution. Config migration is a separate
|
|
6
|
+
* concern: it runs *before* schema validation, canonicalizes raw `agents`
|
|
7
|
+
* map keys on every base layer and on the selected inline/directory profile,
|
|
8
|
+
* and detects spelling conflicts across active layers.
|
|
9
|
+
*
|
|
10
|
+
* Only raw agent-map keys have migration semantics here:
|
|
11
|
+
* - `oracle-high` -> `oracle-2nd` (legacy config; emits a deprecation warning)
|
|
12
|
+
* - `oracle-second` -> `oracle-2nd` (accepted config alias; silent)
|
|
13
|
+
*
|
|
14
|
+
* `oracle-second-high` and other suffixed aliases are left untouched and are
|
|
15
|
+
* later rejected by the schema's reserved-name check. We never call
|
|
16
|
+
* `parseReviewAgentName("oracle-high")` to interpret a raw config slot key,
|
|
17
|
+
* because that parser treats `oracle-high` as the logical-high tier of slot 1
|
|
18
|
+
* - a meaning this migration intentionally removes.
|
|
19
|
+
*
|
|
20
|
+
* The pure preparation APIs throw `ReviewConfigConflictError` on cross-layer
|
|
21
|
+
* spelling conflicts because choosing either spelling would be ambiguous.
|
|
22
|
+
* Ordinary schema mismatches are left for `loadConfig()`'s tolerant parser,
|
|
23
|
+
* which discards only the invalid field or entry and preserves valid siblings.
|
|
24
|
+
*/
|
|
25
|
+
export class ReviewConfigConflictError extends Error {
|
|
26
|
+
code = "OCMM_REVIEW_CONFIG_CONFLICT";
|
|
27
|
+
constructor(message) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = "ReviewConfigConflictError";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Canonical key produced by migrating `originalKey`. `null` if not a review-migration key. */
|
|
33
|
+
function migrationTarget(originalKey) {
|
|
34
|
+
if (originalKey === "oracle-2nd")
|
|
35
|
+
return "oracle-2nd";
|
|
36
|
+
if (originalKey === "oracle-high")
|
|
37
|
+
return "oracle-2nd";
|
|
38
|
+
if (originalKey === "oracle-second")
|
|
39
|
+
return "oracle-2nd";
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
function spellingOf(originalKey) {
|
|
43
|
+
if (originalKey === "oracle-high")
|
|
44
|
+
return "legacy-oracle-high";
|
|
45
|
+
if (originalKey === "oracle-second")
|
|
46
|
+
return "oracle-second-alias";
|
|
47
|
+
return "canonical";
|
|
48
|
+
}
|
|
49
|
+
function isPlainObject(v) {
|
|
50
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Canonicalize one `agents` map in place (shallow-copying the enclosing map
|
|
54
|
+
* only when a key must be replaced). Emits a deprecation warning for each
|
|
55
|
+
* `oracle-high` -> `oracle-2nd` migration. Returns the origin map recorded
|
|
56
|
+
* for this agents map.
|
|
57
|
+
*
|
|
58
|
+
* Throws `ReviewConfigConflictError` if two different spellings inside the
|
|
59
|
+
* SAME agents map target `oracle-2nd` (e.g. `oracle-high` and `oracle-2nd`
|
|
60
|
+
* both present). Identical spellings are impossible inside one object.
|
|
61
|
+
*/
|
|
62
|
+
function canonicalizeAgentsMap(agents, source, warn) {
|
|
63
|
+
const origins = new Map();
|
|
64
|
+
let rewritten = null;
|
|
65
|
+
for (const [originalKey, entry] of Object.entries(agents)) {
|
|
66
|
+
const canonicalKey = migrationTarget(originalKey);
|
|
67
|
+
if (canonicalKey === null) {
|
|
68
|
+
if (rewritten)
|
|
69
|
+
rewritten[originalKey] = entry;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (origins.has(canonicalKey)) {
|
|
73
|
+
const existing = origins.get(canonicalKey);
|
|
74
|
+
if (existing.originalKey !== originalKey) {
|
|
75
|
+
throw new ReviewConfigConflictError(`review-agent spelling conflict in ${source}: agents.${existing.originalKey} and agents.${originalKey} both target agents.${canonicalKey}`);
|
|
76
|
+
}
|
|
77
|
+
// Same spelling twice is impossible in a single object; skip defensively.
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (rewritten === null) {
|
|
81
|
+
// Lazily shallow-copy the enclosing map so we never mutate input.
|
|
82
|
+
rewritten = { ...agents };
|
|
83
|
+
}
|
|
84
|
+
if (canonicalKey !== originalKey)
|
|
85
|
+
delete rewritten[originalKey];
|
|
86
|
+
rewritten[canonicalKey] = entry;
|
|
87
|
+
origins.set(canonicalKey, {
|
|
88
|
+
canonicalKey,
|
|
89
|
+
originalKey: originalKey,
|
|
90
|
+
spelling: spellingOf(originalKey),
|
|
91
|
+
source,
|
|
92
|
+
});
|
|
93
|
+
if (originalKey === "oracle-high") {
|
|
94
|
+
warn(`deprecated agents.oracle-high in ${source}; migrated to agents.oracle-2nd. Configure logical high with agents.oracle.variants.high.`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return { value: rewritten ?? agents, origins };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Canonicalize one base config layer's `agents` map. Returns the new layer
|
|
101
|
+
* value (shallow-copied only if `agents` was rewritten) and the recorded
|
|
102
|
+
* origins. Does NOT compare with other layers.
|
|
103
|
+
*/
|
|
104
|
+
function canonicalizeBaseLayer(value, source, warn) {
|
|
105
|
+
if (!isPlainObject(value))
|
|
106
|
+
return { value, origins: new Map() };
|
|
107
|
+
if (!isPlainObject(value.agents))
|
|
108
|
+
return { value, origins: new Map() };
|
|
109
|
+
const { value: agents, origins } = canonicalizeAgentsMap(value.agents, source, warn);
|
|
110
|
+
if (agents === value.agents)
|
|
111
|
+
return { value, origins };
|
|
112
|
+
return { value: { ...value, agents }, origins };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Prepare all base layers for schema parsing.
|
|
116
|
+
*
|
|
117
|
+
* - Canonicalizes `agents` on every base layer before merge.
|
|
118
|
+
* - Compares base origins across layers: identical original spellings may
|
|
119
|
+
* override by normal precedence; different spellings targeting `oracle-2nd`
|
|
120
|
+
* throw `ReviewConfigConflictError` naming both keys and both sources.
|
|
121
|
+
* - Canonicalizes every inline profile independently before schema parsing and
|
|
122
|
+
* retains each contribution's spelling origins for selection-time checks.
|
|
123
|
+
* - Does not compare inline profiles with base until profile precedence selects
|
|
124
|
+
* the active contribution(s).
|
|
125
|
+
*/
|
|
126
|
+
export function prepareConfigLayers(layers, warn) {
|
|
127
|
+
const preparedLayers = [];
|
|
128
|
+
const baseOrigins = new Map();
|
|
129
|
+
const inlineProfiles = new Map();
|
|
130
|
+
for (const layer of layers) {
|
|
131
|
+
const baseRes = canonicalizeBaseLayer(layer.value, layer.source, warn);
|
|
132
|
+
const inlineRes = canonicalizeInlineProfiles(baseRes.value, layer.source, warn);
|
|
133
|
+
// Cross-layer base-origin conflict check.
|
|
134
|
+
for (const [canonicalKey, origin] of baseRes.origins) {
|
|
135
|
+
const existing = baseOrigins.get(canonicalKey);
|
|
136
|
+
if (existing === undefined) {
|
|
137
|
+
baseOrigins.set(canonicalKey, origin);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (existing.spelling !== origin.spelling) {
|
|
141
|
+
throw new ReviewConfigConflictError(`review-agent spelling conflict: agents.${existing.originalKey} in ${existing.source} and agents.${origin.originalKey} in ${origin.source} both target agents.${canonicalKey}`);
|
|
142
|
+
}
|
|
143
|
+
// Same spelling overrides by normal precedence (later layer wins).
|
|
144
|
+
baseOrigins.set(canonicalKey, origin);
|
|
145
|
+
}
|
|
146
|
+
for (const profile of inlineRes.profiles) {
|
|
147
|
+
const contributions = inlineProfiles.get(profile.name) ?? [];
|
|
148
|
+
contributions.push(profile);
|
|
149
|
+
inlineProfiles.set(profile.name, contributions);
|
|
150
|
+
}
|
|
151
|
+
preparedLayers.push({ source: layer.source, value: inlineRes.value });
|
|
152
|
+
}
|
|
153
|
+
return { layers: preparedLayers, baseOrigins, inlineProfiles };
|
|
154
|
+
}
|
|
155
|
+
function canonicalizeInlineProfiles(value, source, warn) {
|
|
156
|
+
if (!isPlainObject(value) || !isPlainObject(value.profiles)) {
|
|
157
|
+
return { value, profiles: [] };
|
|
158
|
+
}
|
|
159
|
+
const contributions = [];
|
|
160
|
+
let rewrittenProfiles = null;
|
|
161
|
+
for (const [name, profileValue] of Object.entries(value.profiles)) {
|
|
162
|
+
const prepared = prepareReviewProfile({ name, source, value: profileValue }, warn);
|
|
163
|
+
contributions.push(prepared);
|
|
164
|
+
if (prepared.value === profileValue)
|
|
165
|
+
continue;
|
|
166
|
+
rewrittenProfiles ??= { ...value.profiles };
|
|
167
|
+
rewrittenProfiles[name] = prepared.value;
|
|
168
|
+
}
|
|
169
|
+
if (rewrittenProfiles === null)
|
|
170
|
+
return { value, profiles: contributions };
|
|
171
|
+
return {
|
|
172
|
+
value: { ...value, profiles: rewrittenProfiles },
|
|
173
|
+
profiles: contributions,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Canonicalize one directory profile's `agents` map and record its file path.
|
|
178
|
+
* Does NOT compare with base. Throws on within-profile spelling collisions.
|
|
179
|
+
*/
|
|
180
|
+
export function prepareReviewProfile(input, _warn) {
|
|
181
|
+
if (!isPlainObject(input.value) || !isPlainObject(input.value.agents)) {
|
|
182
|
+
return { name: input.name, source: input.source, value: input.value, origins: new Map() };
|
|
183
|
+
}
|
|
184
|
+
const { value: agents, origins } = canonicalizeAgentsMap(input.value.agents, input.source, _warn);
|
|
185
|
+
if (agents === input.value.agents) {
|
|
186
|
+
return { name: input.name, source: input.source, value: input.value, origins };
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
name: input.name,
|
|
190
|
+
source: input.source,
|
|
191
|
+
value: { ...input.value, agents },
|
|
192
|
+
origins,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Check that the selected profile contribution(s) are compatible with base.
|
|
197
|
+
*
|
|
198
|
+
* Receives ONLY the profile contribution(s) that actually won precedence:
|
|
199
|
+
* - project-directory winner is a single prepared profile, OR
|
|
200
|
+
* - user-directory winner is a single prepared profile, OR
|
|
201
|
+
* - all inline contributions for that name in user->project order.
|
|
202
|
+
*
|
|
203
|
+
* First checks different spellings across those selected contributions, then
|
|
204
|
+
* checks the winning origin per canonical key against `baseOrigins`. Does
|
|
205
|
+
* NOT inspect shadowed directory or inactive profiles.
|
|
206
|
+
*/
|
|
207
|
+
export function assertSelectedReviewProfileCompatible(baseOrigins, selectedProfiles) {
|
|
208
|
+
if (selectedProfiles.length === 0)
|
|
209
|
+
return;
|
|
210
|
+
// Across selected contributions, later contributions override earlier ones
|
|
211
|
+
// by precedence. Track the winning origin per canonical key and detect
|
|
212
|
+
// cross-contribution spelling conflicts.
|
|
213
|
+
const winningOrigins = new Map();
|
|
214
|
+
for (const profile of selectedProfiles) {
|
|
215
|
+
for (const [canonicalKey, origin] of profile.origins) {
|
|
216
|
+
const existing = winningOrigins.get(canonicalKey);
|
|
217
|
+
if (existing === undefined) {
|
|
218
|
+
winningOrigins.set(canonicalKey, origin);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (existing.spelling !== origin.spelling) {
|
|
222
|
+
throw new ReviewConfigConflictError(`review-agent spelling conflict in profile ${profile.name}: agents.${existing.originalKey} in ${existing.source} and agents.${origin.originalKey} in ${origin.source} both target agents.${canonicalKey}`);
|
|
223
|
+
}
|
|
224
|
+
winningOrigins.set(canonicalKey, origin);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Compare winning origins against base origins.
|
|
228
|
+
for (const [canonicalKey, profileOrigin] of winningOrigins) {
|
|
229
|
+
const baseOrigin = baseOrigins.get(canonicalKey);
|
|
230
|
+
if (baseOrigin === undefined)
|
|
231
|
+
continue;
|
|
232
|
+
if (baseOrigin.spelling !== profileOrigin.spelling) {
|
|
233
|
+
throw new ReviewConfigConflictError(`review-agent spelling conflict: agents.${baseOrigin.originalKey} in ${baseOrigin.source} and agents.${profileOrigin.originalKey} in ${profileOrigin.source} both target agents.${canonicalKey}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=review-agent-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-agent-migration.js","sourceRoot":"","sources":["../../src/config/review-agent-migration.ts"],"names":[],"mappings":"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"}
|