create-principles-disciple 1.102.0 → 1.104.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/console/dist/server/config/pd-config-store.d.ts +50 -1
- package/console/dist/server/config/pd-config-store.js +364 -1
- package/console/dist/server/models/ActivationsConsoleModel.d.ts +7 -4
- package/console/dist/server/models/ActivationsConsoleModel.js +7 -6
- package/console/dist/server/routes/config.js +92 -2
- package/console/dist/ui/api.d.ts +44 -3
- package/console/dist/ui/api.js +58 -2
- package/console/dist/ui/components/onboarding/DemoResultView.js +19 -1
- package/console/dist/ui/i18n/en.json +63 -2
- package/console/dist/ui/i18n/zh-CN.json +63 -2
- package/console/dist/ui/pages/activation/ActivationPage.js +11 -11
- package/console/dist/ui/pages/activation/ActivationValidators.js +14 -13
- package/console/dist/ui/pages/control-center/AgentCard.js +56 -7
- package/console/dist/ui/pages/control-center/ControlCenterPage.js +2 -1
- package/console/dist/ui/pages/control-center/RuntimeProfileManager.d.ts +31 -0
- package/console/dist/ui/pages/control-center/RuntimeProfileManager.js +234 -0
- package/console/dist/ui/pages/debt/DebtPage.js +2 -2
- package/console/dist/ui/utils/validators.d.ts +26 -3
- package/console/dist/ui/utils/validators.js +23 -6
- package/console/dist/web/assets/app.css +41 -0
- package/console/dist/web/assets/app.js +1918 -1160
- package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.js +8 -10
- package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.js.map +1 -1
- package/core/dist/runtime-v2/adapter/__tests__/l2-resolve-model-compat.test.d.ts +2 -0
- package/core/dist/runtime-v2/adapter/__tests__/l2-resolve-model-compat.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/adapter/__tests__/l2-resolve-model-compat.test.js +81 -0
- package/core/dist/runtime-v2/adapter/__tests__/l2-resolve-model-compat.test.js.map +1 -0
- package/core/dist/runtime-v2/adapter/__tests__/pi-ai-runtime-adapter.test.js +25 -6
- package/core/dist/runtime-v2/adapter/__tests__/pi-ai-runtime-adapter.test.js.map +1 -1
- package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts +8 -0
- package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +4 -1
- package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
- package/core/dist/runtime-v2/candidate-intake-service.d.ts.map +1 -1
- package/core/dist/runtime-v2/candidate-intake-service.js +92 -6
- package/core/dist/runtime-v2/candidate-intake-service.js.map +1 -1
- package/core/dist/runtime-v2/candidate-intake.d.ts +38 -0
- package/core/dist/runtime-v2/candidate-intake.d.ts.map +1 -1
- package/core/dist/runtime-v2/candidate-intake.js +48 -0
- package/core/dist/runtime-v2/candidate-intake.js.map +1 -1
- package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js +26 -1
- package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js.map +1 -1
- package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +9 -5
- package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -1
- package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js +53 -33
- package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-agent-binding.d.ts +2 -0
- package/core/dist/runtime-v2/config/pd-config-agent-binding.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-agent-binding.js +3 -0
- package/core/dist/runtime-v2/config/pd-config-agent-binding.js.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-defaults.d.ts +7 -3
- package/core/dist/runtime-v2/config/pd-config-defaults.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-defaults.js +27 -3
- package/core/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-redaction.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-redaction.js +5 -2
- package/core/dist/runtime-v2/config/pd-config-redaction.js.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-types.d.ts +6 -0
- package/core/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-types.js.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-validate.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-validate.js +11 -6
- package/core/dist/runtime-v2/config/pd-config-validate.js.map +1 -1
- package/core/dist/runtime-v2/index.d.ts +2 -1
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +1 -0
- package/core/dist/runtime-v2/index.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.js +7 -0
- package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.js +7 -6
- package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js +1 -1
- package/core/dist/runtime-v2/internalization/diag-distiller-runner.js +4 -4
- package/core/dist/runtime-v2/internalization/diag-distiller-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js +5 -5
- package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/diag-router-runner.js +4 -4
- package/core/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
- package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts +2 -0
- package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
- package/core/dist/runtime-v2/pain-signal-runtime-factory.js +2 -0
- package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +5 -1
- package/dist/installer.js.map +1 -1
- package/dist/mvp-config.d.ts.map +1 -1
- package/dist/mvp-config.js +22 -10
- package/dist/mvp-config.js.map +1 -1
- package/package.json +1 -1
- package/pd-cli/dist/commands/__tests__/runtime-probe-config.test.js +2 -2
- package/pd-cli/dist/commands/__tests__/runtime-probe-config.test.js.map +1 -1
- package/pd-cli/dist/commands/demo-story-a.d.ts.map +1 -1
- package/pd-cli/dist/commands/demo-story-a.js +4 -2
- package/pd-cli/dist/commands/demo-story-a.js.map +1 -1
- package/pd-cli/dist/commands/proven-channel-baseline.d.ts.map +1 -1
- package/pd-cli/dist/commands/proven-channel-baseline.js +4 -2
- package/pd-cli/dist/commands/proven-channel-baseline.js.map +1 -1
- package/pd-cli/dist/commands/runtime-activation.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-activation.js +8 -2
- package/pd-cli/dist/commands/runtime-activation.js.map +1 -1
- package/pd-cli/dist/commands/runtime-canary.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-canary.js +4 -2
- package/pd-cli/dist/commands/runtime-canary.js.map +1 -1
- package/pd-cli/dist/commands/runtime-health-snapshot.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-health-snapshot.js +4 -2
- package/pd-cli/dist/commands/runtime-health-snapshot.js.map +1 -1
- package/pd-cli/dist/commands/runtime-init.js +2 -2
- package/pd-cli/dist/commands/runtime-init.js.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-integrity.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-integrity.js +4 -2
- package/pd-cli/dist/commands/runtime-internalization-integrity.js.map +1 -1
- package/pd-cli/dist/services/config-doctor.d.ts.map +1 -1
- package/pd-cli/dist/services/config-doctor.js +9 -2
- package/pd-cli/dist/services/config-doctor.js.map +1 -1
- package/pd-cli/dist/services/runtime-adapter-resolver.d.ts.map +1 -1
- package/pd-cli/dist/services/runtime-adapter-resolver.js +1 -0
- package/pd-cli/dist/services/runtime-adapter-resolver.js.map +1 -1
- package/plugin/dist/commands/thinking-os.js +25 -7
- package/plugin/dist/commands/workflow-debug.d.ts +1 -3
- package/plugin/dist/commands/workflow-debug.js +26 -5
- package/plugin/dist/core/rule-host.d.ts +5 -2
- package/plugin/dist/core/rule-host.js +15 -2
- package/plugin/dist/hooks/after-tool-call-helpers.js +20 -3
- package/plugin/dist/hooks/gate.js +1 -1
- package/plugin/dist/i18n/commands.js +24 -0
- package/plugin/dist/index.js +88 -36
- package/plugin/dist/service/evolution-dedup.d.ts +1 -1
- package/plugin/dist/service/evolution-worker.d.ts +7 -31
- package/plugin/dist/service/evolution-worker.js +17 -36
- package/plugin/dist/service/queue-io.js +14 -2
- package/plugin/dist/service/queue-migration.d.ts +27 -26
- package/plugin/dist/service/queue-migration.js +57 -0
- package/plugin/docs/COMMAND_REFERENCE.md +0 -1
- package/plugin/docs/COMMAND_REFERENCE_EN.md +0 -2
- package/plugin/scripts/sync-plugin.mjs +12 -0
- package/plugin/templates/langs/en/core/AGENTS.md +2 -2
- package/plugin/templates/langs/en/core/TOOLS.md +1 -1
- package/plugin/templates/langs/en/skills/pd-mentor/SKILL.md +2 -3
- package/plugin/templates/langs/zh/core/AGENTS.md +2 -2
- package/plugin/templates/langs/zh/core/TOOLS.md +1 -1
- package/plugin/templates/langs/zh/skills/pd-mentor/SKILL.md +2 -3
- package/templates/langs/en/core/AGENTS.md +2 -2
- package/templates/langs/en/core/BOOTSTRAP.md +4 -17
- package/templates/langs/en/core/TOOLS.md +1 -1
- package/templates/langs/en/skills/pd-mentor/SKILL.md +8 -26
- package/templates/langs/zh/core/AGENTS.md +2 -2
- package/templates/langs/zh/core/BOOTSTRAP.md +4 -17
- package/templates/langs/zh/core/TOOLS.md +1 -1
- package/templates/langs/zh/skills/pd-mentor/SKILL.md +8 -26
- package/plugin/dist/constants/diagnostician.d.ts +0 -12
- package/plugin/dist/constants/diagnostician.js +0 -65
- package/plugin/dist/service/evolution-queue-migration.d.ts +0 -128
- package/plugin/dist/service/evolution-queue-migration.js +0 -53
- package/plugin/templates/langs/en/skills/pd-diagnostician/SKILL.md +0 -466
- package/plugin/templates/langs/zh/skills/pd-diagnostician/SKILL.md +0 -391
- package/templates/langs/en/skills/pd-daily/SKILL.md +0 -199
- package/templates/langs/en/skills/pd-grooming/SKILL.md +0 -46
- package/templates/langs/zh/skills/pd-daily/SKILL.md +0 -283
- package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +0 -287
- package/templates/langs/zh/skills/pd-grooming/SKILL.md +0 -46
|
@@ -89,13 +89,13 @@ describe('resolveRuntimeConfigFromPdConfig', () => {
|
|
|
89
89
|
if (isRuntimeConfigError(diagResult))
|
|
90
90
|
return;
|
|
91
91
|
expect(diagResult.runtimeKind).toBe('pi-ai');
|
|
92
|
-
// default (no override) →
|
|
92
|
+
// default (no override) → pd.default (pi-ai placeholder), needs_setup without env var
|
|
93
93
|
const defaultEffective = computeEffectivePdConfig(null);
|
|
94
94
|
const defaultResult = resolveRuntimeConfigFromPdConfig(defaultEffective, envWithoutKey);
|
|
95
|
-
expect(isRuntimeConfigError(defaultResult)).toBe(
|
|
96
|
-
if (isRuntimeConfigError(defaultResult))
|
|
95
|
+
expect(isRuntimeConfigError(defaultResult)).toBe(true);
|
|
96
|
+
if (!isRuntimeConfigError(defaultResult))
|
|
97
97
|
return;
|
|
98
|
-
expect(defaultResult.
|
|
98
|
+
expect(defaultResult.reason).toBe('needs_setup');
|
|
99
99
|
});
|
|
100
100
|
it('AC4: missing env var fails loud with reason + nextAction', () => {
|
|
101
101
|
const config = makeConfigWithPdLocalProfile();
|
|
@@ -108,15 +108,13 @@ describe('resolveRuntimeConfigFromPdConfig', () => {
|
|
|
108
108
|
expect(result.message).toContain('ANTHROPIC_API_KEY');
|
|
109
109
|
expect(result.nextAction).toBeTruthy();
|
|
110
110
|
});
|
|
111
|
-
it('AC5:
|
|
111
|
+
it('AC5: null config defaults to pi-ai placeholder, returns needs_setup without env var', () => {
|
|
112
112
|
const effective = computeEffectivePdConfig(null);
|
|
113
113
|
const result = resolveRuntimeConfigFromPdConfig(effective, envWithoutKey);
|
|
114
|
-
expect(isRuntimeConfigError(result)).toBe(
|
|
115
|
-
if (isRuntimeConfigError(result))
|
|
114
|
+
expect(isRuntimeConfigError(result)).toBe(true);
|
|
115
|
+
if (!isRuntimeConfigError(result))
|
|
116
116
|
return;
|
|
117
|
-
expect(result.
|
|
118
|
-
// source='default' → openclawMode is undefined (delegated, not forced to 'local')
|
|
119
|
-
expect(result.openclawMode).toBeUndefined();
|
|
117
|
+
expect(result.reason).toBe('needs_setup');
|
|
120
118
|
});
|
|
121
119
|
it('returns error for disabled agent', () => {
|
|
122
120
|
const base = getDefaultPdConfig();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-runtime-config-from-pd-config.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"resolve-runtime-config-from-pd-config.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,gCAAgC,EAChC,oBAAoB,GACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,wBAAwB,EACxB,kBAAkB,GAEnB,MAAM,oBAAoB,CAAC;AAE5B,gFAAgF;AAEhF,SAAS,4BAA4B;IACnC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,OAAO;QACL,GAAG,IAAI;QACP,eAAe,EAAE;YACf,GAAG,IAAI,CAAC,eAAe;YACvB,kBAAkB,EAAE;gBAClB,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,WAAW;gBACrB,KAAK,EAAE,mBAAmB;gBAC1B,SAAS,EAAE,mBAAmB;aAC/B;SACF;QACD,cAAc,EAAE;YACd,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc;YAClD,MAAM,EAAE;gBACN,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM;gBAC7B,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,kBAAkB,EAAE;aACrE;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B;IACpC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,OAAO;QACL,GAAG,IAAI;QACP,eAAe,EAAE;YACf,GAAG,IAAI,CAAC,eAAe;YACvB,gBAAgB,EAAE;gBAChB,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,UAAU;gBACpB,KAAK,EAAE,iBAAiB;aACzB;SACF;QACD,cAAc,EAAE;YACd,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc;YAClD,MAAM,EAAE;gBACN,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM;gBAC7B,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,gBAAgB,EAAE;aACnE;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,EAAE,CAC3C,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;AAE/D,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,SAAS,CAAC;AAEnD,gFAAgF;AAEhF,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,6BAA6B,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,gCAAgC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAE1E,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO;QACzC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,MAAM,GAAG,4BAA4B,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,gCAAgC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAEhF,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO;QACzC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,4BAA4B,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAEnD,qCAAqC;QACrC,MAAM,UAAU,GAAG,gCAAgC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QACpF,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,oBAAoB,CAAC,UAAU,CAAC;YAAE,OAAO;QAC7C,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7C,sFAAsF;QACtF,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,gCAAgC,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;QACxF,MAAM,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC;YAAE,OAAO;QACjD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,4BAA4B,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,gCAAgC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAE1E,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO;QAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,MAAM,SAAS,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,gCAAgC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAE1E,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO;QAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;QAClC,MAAM,MAAM,GAAa;YACvB,GAAG,IAAI;YACP,cAAc,EAAE;gBACd,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc;gBAClD,MAAM,EAAE;oBACN,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM;oBAC7B,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;iBAClC;aACF;SACF,CAAC;QACF,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,gCAAgC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAE1E,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO;QAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;QAClC,8DAA8D;QAC9D,MAAM,MAAM,GAAa;YACvB,GAAG,IAAI;YACP,cAAc,EAAE;gBACd,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc;gBAClD,MAAM,EAAE;oBACN,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM;oBAC7B,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,qBAAqB,EAAE;iBACxE;aACF;SACF,CAAC;QACF,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,gCAAgC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAE1E,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO;QAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;QAClC,MAAM,MAAM,GAAa;YACvB,GAAG,IAAI;YACP,eAAe,EAAE;gBACf,GAAG,IAAI,CAAC,eAAe;gBACvB,iBAAiB,EAAE;oBACjB,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,YAAY;oBACtB,KAAK,EAAE,eAAe;oBACtB,SAAS,EAAE,oBAAoB;oBAC/B,OAAO,EAAE,8BAA8B;oBACvC,SAAS,EAAE,MAAM;iBAClB;aACF;YACD,cAAc,EAAE;gBACd,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc;gBAClD,MAAM,EAAE;oBACN,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM;oBAC7B,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,iBAAiB,EAAE;iBACpE;aACF;SACF,CAAC;QACF,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,gCAAgC,CAC7C,SAAS,EACT,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CACnE,CAAC;QAEF,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO;QACzC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l2-resolve-model-compat.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/adapter/__tests__/l2-resolve-model-compat.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression guard for resolveL2Model's `as unknown as Model<string>` cast.
|
|
3
|
+
*
|
|
4
|
+
* resolveL2Model (l2-agent-loop-adapter.ts) constructs a custom Model literal
|
|
5
|
+
* for OpenAI-compatible providers and narrows it via a double assertion because
|
|
6
|
+
* the literal doesn't fully satisfy Model<string>'s discriminant union. The
|
|
7
|
+
* RUNTIME_CONTRACT comment there warns: if @earendil-works/pi-ai changes Model's
|
|
8
|
+
* shape after an upgrade, the cast will NOT be caught at compile time.
|
|
9
|
+
*
|
|
10
|
+
* This test does NOT mock @earendil-works/pi-ai. It runs resolveL2Model against
|
|
11
|
+
* the real installed types/runtime and asserts the returned object still
|
|
12
|
+
* satisfies the live Model<'openai-completions'> shape. If a pi-ai upgrade adds
|
|
13
|
+
* a required field or changes Compat, this test goes red — surfacing the drift
|
|
14
|
+
* that the cast hides.
|
|
15
|
+
*/
|
|
16
|
+
import { describe, it, expect } from 'vitest';
|
|
17
|
+
import { resolveL2Model } from '../l2-agent-loop-adapter.js';
|
|
18
|
+
// Required keys of Model<'openai-completions'>, derived from the real type so
|
|
19
|
+
// this list tracks pi-ai rather than drifting. Optional keys (compat, headers,
|
|
20
|
+
// thinkingLevelMap) are checked separately for *shape* when present.
|
|
21
|
+
const REQUIRED_MODEL_KEYS = [
|
|
22
|
+
'id',
|
|
23
|
+
'name',
|
|
24
|
+
'api',
|
|
25
|
+
'provider',
|
|
26
|
+
'baseUrl',
|
|
27
|
+
'reasoning',
|
|
28
|
+
'input',
|
|
29
|
+
'cost',
|
|
30
|
+
'contextWindow',
|
|
31
|
+
'maxTokens',
|
|
32
|
+
];
|
|
33
|
+
describe('resolveL2Model — pi-ai compat regression (RUNTIME_CONTRACT @ l2-agent-loop-adapter.ts:141)', () => {
|
|
34
|
+
it('returns an object carrying every required Model field (no mock)', () => {
|
|
35
|
+
const model = resolveL2Model('custom-provider', 'm1', 'http://localhost:1234/v1');
|
|
36
|
+
for (const key of REQUIRED_MODEL_KEYS) {
|
|
37
|
+
expect(model, `expected returned model to carry required key '${key}'`).toHaveProperty(key);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
it('constructs an openai-completions model with correct primitive types', () => {
|
|
41
|
+
const model = resolveL2Model('custom-provider', 'm1', 'http://localhost:1234/v1');
|
|
42
|
+
expect(model.api).toBe('openai-completions');
|
|
43
|
+
expect(typeof model.id).toBe('string');
|
|
44
|
+
expect(typeof model.name).toBe('string');
|
|
45
|
+
expect(typeof model.provider).toBe('string');
|
|
46
|
+
expect(typeof model.baseUrl).toBe('string');
|
|
47
|
+
expect(typeof model.reasoning).toBe('boolean');
|
|
48
|
+
expect(Array.isArray(model.input)).toBe(true);
|
|
49
|
+
expect(typeof model.contextWindow).toBe('number');
|
|
50
|
+
expect(typeof model.maxTokens).toBe('number');
|
|
51
|
+
// cost is a nested object with numeric fields
|
|
52
|
+
expect(typeof model.cost).toBe('object');
|
|
53
|
+
expect(model.cost).not.toBeNull();
|
|
54
|
+
});
|
|
55
|
+
it('provides a compat block whose fields are accepted by the live Compat type', () => {
|
|
56
|
+
// The cast in resolveL2Model only hides shape drift for the *top-level* Model.
|
|
57
|
+
// If pi-ai renames/adds a required OpenAICompletionsCompat field, the literal's
|
|
58
|
+
// compat may no longer satisfy it. We assert the fields resolveL2Model sets are
|
|
59
|
+
// present and correctly typed; a future pi-ai upgrade that, e.g., turns
|
|
60
|
+
// maxTokensField into a 3-value union or makes thinkingFormat required-with-new-shape
|
|
61
|
+
// should be caught by re-reviewing this test.
|
|
62
|
+
const model = resolveL2Model('custom-provider', 'm1', 'http://localhost:1234/v1');
|
|
63
|
+
expect(model.compat).toBeDefined();
|
|
64
|
+
const compat = model.compat;
|
|
65
|
+
if (compat) {
|
|
66
|
+
// ResolveL2Model sets these; verify they survive as the right type.
|
|
67
|
+
expect(typeof compat.supportsUsageInStreaming).toBe('boolean');
|
|
68
|
+
expect(typeof compat.thinkingFormat).toBe('string');
|
|
69
|
+
// thinkingFormat must be one of the live union members; 'deepseek' is current.
|
|
70
|
+
// If pi-ai drops 'deepseek', this fails and the literal must be updated.
|
|
71
|
+
expect(compat.thinkingFormat).toBe('deepseek');
|
|
72
|
+
expect(compat.maxTokensField).toBe('max_tokens');
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
it('throws runtime_unavailable when provider is unknown and no baseUrl is given', () => {
|
|
76
|
+
// Negative branch — currently untested elsewhere. resolveL2Model must fail loud
|
|
77
|
+
// (rc-3/rc-9) rather than silently construct an unusable model.
|
|
78
|
+
expect(() => resolveL2Model('not-a-known-provider', 'm1')).toThrow();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=l2-resolve-model-compat.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l2-resolve-model-compat.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/adapter/__tests__/l2-resolve-model-compat.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -107,7 +107,7 @@ function findTelemetryEvent(eventType) {
|
|
|
107
107
|
// Runtime Contract Rule 2 (no `as` bypass): validate the mock-call shape
|
|
108
108
|
// before treating it as a telemetry payload.
|
|
109
109
|
const call = mockEmitTelemetry.mock.calls.find((c) => {
|
|
110
|
-
const payload = c
|
|
110
|
+
const [payload] = c;
|
|
111
111
|
return (typeof payload === 'object' &&
|
|
112
112
|
payload !== null &&
|
|
113
113
|
Object.hasOwn(payload, 'eventType') &&
|
|
@@ -115,7 +115,7 @@ function findTelemetryEvent(eventType) {
|
|
|
115
115
|
});
|
|
116
116
|
if (!call)
|
|
117
117
|
return undefined;
|
|
118
|
-
const payload = call
|
|
118
|
+
const [payload] = call;
|
|
119
119
|
return typeof payload === 'object' && payload !== null
|
|
120
120
|
? payload
|
|
121
121
|
: undefined;
|
|
@@ -128,7 +128,7 @@ function isToolContext(value) {
|
|
|
128
128
|
if (typeof value !== 'object' || value === null || !Object.hasOwn(value, 'tools')) {
|
|
129
129
|
return false;
|
|
130
130
|
}
|
|
131
|
-
const tools = value
|
|
131
|
+
const { tools } = value;
|
|
132
132
|
if (!Array.isArray(tools))
|
|
133
133
|
return false;
|
|
134
134
|
return tools.every((tool) => {
|
|
@@ -304,6 +304,25 @@ describe('PiAiRuntimeAdapter', () => {
|
|
|
304
304
|
expect(context.messages[0].content).toBe('{"pain":"signal","severity":0.8}');
|
|
305
305
|
}
|
|
306
306
|
});
|
|
307
|
+
// ── systemPrompt support (PRI-501 follow-up) ──
|
|
308
|
+
it('TC1: passes config.systemPrompt to Context.systemPrompt when set', async () => {
|
|
309
|
+
const adapter = makeAdapter({ systemPrompt: 'You are a diagnostician.' });
|
|
310
|
+
await adapter.startRun(makeStartRunInput());
|
|
311
|
+
const [, context] = mockComplete.mock.calls[0];
|
|
312
|
+
expect(context.systemPrompt).toBe('You are a diagnostician.');
|
|
313
|
+
});
|
|
314
|
+
it('TC2: omits Context.systemPrompt when config.systemPrompt is unset (backward compat)', async () => {
|
|
315
|
+
const adapter = makeAdapter();
|
|
316
|
+
await adapter.startRun(makeStartRunInput());
|
|
317
|
+
const [, context] = mockComplete.mock.calls[0];
|
|
318
|
+
expect(context.systemPrompt).toBeUndefined();
|
|
319
|
+
});
|
|
320
|
+
it('TC3: omits Context.systemPrompt when config.systemPrompt is empty string', async () => {
|
|
321
|
+
const adapter = makeAdapter({ systemPrompt: '' });
|
|
322
|
+
await adapter.startRun(makeStartRunInput());
|
|
323
|
+
const [, context] = mockComplete.mock.calls[0];
|
|
324
|
+
expect(context.systemPrompt).toBeUndefined();
|
|
325
|
+
});
|
|
307
326
|
});
|
|
308
327
|
// ── JSON extraction (balanced parsing) ──
|
|
309
328
|
describe('JSON extraction (balanced parsing)', () => {
|
|
@@ -1737,7 +1756,7 @@ describe('PiAiRuntimeAdapter', () => {
|
|
|
1737
1756
|
// Verify fallback telemetry was emitted for tool_call path.
|
|
1738
1757
|
// Runtime Contract Rule 2: validate shape before reading eventType.
|
|
1739
1758
|
const fallbackEvents = mockEmitTelemetry.mock.calls.filter((c) => {
|
|
1740
|
-
const payload = c
|
|
1759
|
+
const [payload] = c;
|
|
1741
1760
|
return (typeof payload === 'object' &&
|
|
1742
1761
|
payload !== null &&
|
|
1743
1762
|
Object.hasOwn(payload, 'eventType') &&
|
|
@@ -1770,7 +1789,7 @@ describe('PiAiRuntimeAdapter', () => {
|
|
|
1770
1789
|
if (!isToolContext(rawContext))
|
|
1771
1790
|
throw new Error('invalid tool context');
|
|
1772
1791
|
expect(rawContext.tools.length).toBe(1);
|
|
1773
|
-
const tool = rawContext.tools
|
|
1792
|
+
const [tool] = rawContext.tools;
|
|
1774
1793
|
if (!tool)
|
|
1775
1794
|
throw new Error('expected exactly one tool');
|
|
1776
1795
|
// Name derived from schemaRef 'diagnostician-output-v1'
|
|
@@ -1823,7 +1842,7 @@ describe('PiAiRuntimeAdapter', () => {
|
|
|
1823
1842
|
// Verify fallback telemetry.
|
|
1824
1843
|
// Runtime Contract Rule 2: validate shape before reading eventType.
|
|
1825
1844
|
const fallbackEvents = mockEmitTelemetry.mock.calls.filter((c) => {
|
|
1826
|
-
const payload = c
|
|
1845
|
+
const [payload] = c;
|
|
1827
1846
|
return (typeof payload === 'object' &&
|
|
1828
1847
|
payload !== null &&
|
|
1829
1848
|
Object.hasOwn(payload, 'eventType') &&
|