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.
Files changed (160) hide show
  1. package/console/dist/server/config/pd-config-store.d.ts +50 -1
  2. package/console/dist/server/config/pd-config-store.js +364 -1
  3. package/console/dist/server/models/ActivationsConsoleModel.d.ts +7 -4
  4. package/console/dist/server/models/ActivationsConsoleModel.js +7 -6
  5. package/console/dist/server/routes/config.js +92 -2
  6. package/console/dist/ui/api.d.ts +44 -3
  7. package/console/dist/ui/api.js +58 -2
  8. package/console/dist/ui/components/onboarding/DemoResultView.js +19 -1
  9. package/console/dist/ui/i18n/en.json +63 -2
  10. package/console/dist/ui/i18n/zh-CN.json +63 -2
  11. package/console/dist/ui/pages/activation/ActivationPage.js +11 -11
  12. package/console/dist/ui/pages/activation/ActivationValidators.js +14 -13
  13. package/console/dist/ui/pages/control-center/AgentCard.js +56 -7
  14. package/console/dist/ui/pages/control-center/ControlCenterPage.js +2 -1
  15. package/console/dist/ui/pages/control-center/RuntimeProfileManager.d.ts +31 -0
  16. package/console/dist/ui/pages/control-center/RuntimeProfileManager.js +234 -0
  17. package/console/dist/ui/pages/debt/DebtPage.js +2 -2
  18. package/console/dist/ui/utils/validators.d.ts +26 -3
  19. package/console/dist/ui/utils/validators.js +23 -6
  20. package/console/dist/web/assets/app.css +41 -0
  21. package/console/dist/web/assets/app.js +1918 -1160
  22. package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.js +8 -10
  23. package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.js.map +1 -1
  24. package/core/dist/runtime-v2/adapter/__tests__/l2-resolve-model-compat.test.d.ts +2 -0
  25. package/core/dist/runtime-v2/adapter/__tests__/l2-resolve-model-compat.test.d.ts.map +1 -0
  26. package/core/dist/runtime-v2/adapter/__tests__/l2-resolve-model-compat.test.js +81 -0
  27. package/core/dist/runtime-v2/adapter/__tests__/l2-resolve-model-compat.test.js.map +1 -0
  28. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-runtime-adapter.test.js +25 -6
  29. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-runtime-adapter.test.js.map +1 -1
  30. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts +8 -0
  31. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
  32. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +4 -1
  33. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
  34. package/core/dist/runtime-v2/candidate-intake-service.d.ts.map +1 -1
  35. package/core/dist/runtime-v2/candidate-intake-service.js +92 -6
  36. package/core/dist/runtime-v2/candidate-intake-service.js.map +1 -1
  37. package/core/dist/runtime-v2/candidate-intake.d.ts +38 -0
  38. package/core/dist/runtime-v2/candidate-intake.d.ts.map +1 -1
  39. package/core/dist/runtime-v2/candidate-intake.js +48 -0
  40. package/core/dist/runtime-v2/candidate-intake.js.map +1 -1
  41. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js +26 -1
  42. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js.map +1 -1
  43. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +9 -5
  44. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -1
  45. package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js +53 -33
  46. package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js.map +1 -1
  47. package/core/dist/runtime-v2/config/pd-config-agent-binding.d.ts +2 -0
  48. package/core/dist/runtime-v2/config/pd-config-agent-binding.d.ts.map +1 -1
  49. package/core/dist/runtime-v2/config/pd-config-agent-binding.js +3 -0
  50. package/core/dist/runtime-v2/config/pd-config-agent-binding.js.map +1 -1
  51. package/core/dist/runtime-v2/config/pd-config-defaults.d.ts +7 -3
  52. package/core/dist/runtime-v2/config/pd-config-defaults.d.ts.map +1 -1
  53. package/core/dist/runtime-v2/config/pd-config-defaults.js +27 -3
  54. package/core/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
  55. package/core/dist/runtime-v2/config/pd-config-redaction.d.ts.map +1 -1
  56. package/core/dist/runtime-v2/config/pd-config-redaction.js +5 -2
  57. package/core/dist/runtime-v2/config/pd-config-redaction.js.map +1 -1
  58. package/core/dist/runtime-v2/config/pd-config-types.d.ts +6 -0
  59. package/core/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
  60. package/core/dist/runtime-v2/config/pd-config-types.js.map +1 -1
  61. package/core/dist/runtime-v2/config/pd-config-validate.d.ts.map +1 -1
  62. package/core/dist/runtime-v2/config/pd-config-validate.js +11 -6
  63. package/core/dist/runtime-v2/config/pd-config-validate.js.map +1 -1
  64. package/core/dist/runtime-v2/index.d.ts +2 -1
  65. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  66. package/core/dist/runtime-v2/index.js +1 -0
  67. package/core/dist/runtime-v2/index.js.map +1 -1
  68. package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.js +7 -0
  69. package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.js.map +1 -1
  70. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.js +7 -6
  71. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.js.map +1 -1
  72. package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js +1 -1
  73. package/core/dist/runtime-v2/internalization/diag-distiller-runner.js +4 -4
  74. package/core/dist/runtime-v2/internalization/diag-distiller-runner.js.map +1 -1
  75. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js +5 -5
  76. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
  77. package/core/dist/runtime-v2/internalization/diag-router-runner.js +4 -4
  78. package/core/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
  79. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts +2 -0
  80. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  81. package/core/dist/runtime-v2/pain-signal-runtime-factory.js +2 -0
  82. package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  83. package/dist/installer.d.ts.map +1 -1
  84. package/dist/installer.js +5 -1
  85. package/dist/installer.js.map +1 -1
  86. package/dist/mvp-config.d.ts.map +1 -1
  87. package/dist/mvp-config.js +22 -10
  88. package/dist/mvp-config.js.map +1 -1
  89. package/package.json +1 -1
  90. package/pd-cli/dist/commands/__tests__/runtime-probe-config.test.js +2 -2
  91. package/pd-cli/dist/commands/__tests__/runtime-probe-config.test.js.map +1 -1
  92. package/pd-cli/dist/commands/demo-story-a.d.ts.map +1 -1
  93. package/pd-cli/dist/commands/demo-story-a.js +4 -2
  94. package/pd-cli/dist/commands/demo-story-a.js.map +1 -1
  95. package/pd-cli/dist/commands/proven-channel-baseline.d.ts.map +1 -1
  96. package/pd-cli/dist/commands/proven-channel-baseline.js +4 -2
  97. package/pd-cli/dist/commands/proven-channel-baseline.js.map +1 -1
  98. package/pd-cli/dist/commands/runtime-activation.d.ts.map +1 -1
  99. package/pd-cli/dist/commands/runtime-activation.js +8 -2
  100. package/pd-cli/dist/commands/runtime-activation.js.map +1 -1
  101. package/pd-cli/dist/commands/runtime-canary.d.ts.map +1 -1
  102. package/pd-cli/dist/commands/runtime-canary.js +4 -2
  103. package/pd-cli/dist/commands/runtime-canary.js.map +1 -1
  104. package/pd-cli/dist/commands/runtime-health-snapshot.d.ts.map +1 -1
  105. package/pd-cli/dist/commands/runtime-health-snapshot.js +4 -2
  106. package/pd-cli/dist/commands/runtime-health-snapshot.js.map +1 -1
  107. package/pd-cli/dist/commands/runtime-init.js +2 -2
  108. package/pd-cli/dist/commands/runtime-init.js.map +1 -1
  109. package/pd-cli/dist/commands/runtime-internalization-integrity.d.ts.map +1 -1
  110. package/pd-cli/dist/commands/runtime-internalization-integrity.js +4 -2
  111. package/pd-cli/dist/commands/runtime-internalization-integrity.js.map +1 -1
  112. package/pd-cli/dist/services/config-doctor.d.ts.map +1 -1
  113. package/pd-cli/dist/services/config-doctor.js +9 -2
  114. package/pd-cli/dist/services/config-doctor.js.map +1 -1
  115. package/pd-cli/dist/services/runtime-adapter-resolver.d.ts.map +1 -1
  116. package/pd-cli/dist/services/runtime-adapter-resolver.js +1 -0
  117. package/pd-cli/dist/services/runtime-adapter-resolver.js.map +1 -1
  118. package/plugin/dist/commands/thinking-os.js +25 -7
  119. package/plugin/dist/commands/workflow-debug.d.ts +1 -3
  120. package/plugin/dist/commands/workflow-debug.js +26 -5
  121. package/plugin/dist/core/rule-host.d.ts +5 -2
  122. package/plugin/dist/core/rule-host.js +15 -2
  123. package/plugin/dist/hooks/after-tool-call-helpers.js +20 -3
  124. package/plugin/dist/hooks/gate.js +1 -1
  125. package/plugin/dist/i18n/commands.js +24 -0
  126. package/plugin/dist/index.js +88 -36
  127. package/plugin/dist/service/evolution-dedup.d.ts +1 -1
  128. package/plugin/dist/service/evolution-worker.d.ts +7 -31
  129. package/plugin/dist/service/evolution-worker.js +17 -36
  130. package/plugin/dist/service/queue-io.js +14 -2
  131. package/plugin/dist/service/queue-migration.d.ts +27 -26
  132. package/plugin/dist/service/queue-migration.js +57 -0
  133. package/plugin/docs/COMMAND_REFERENCE.md +0 -1
  134. package/plugin/docs/COMMAND_REFERENCE_EN.md +0 -2
  135. package/plugin/scripts/sync-plugin.mjs +12 -0
  136. package/plugin/templates/langs/en/core/AGENTS.md +2 -2
  137. package/plugin/templates/langs/en/core/TOOLS.md +1 -1
  138. package/plugin/templates/langs/en/skills/pd-mentor/SKILL.md +2 -3
  139. package/plugin/templates/langs/zh/core/AGENTS.md +2 -2
  140. package/plugin/templates/langs/zh/core/TOOLS.md +1 -1
  141. package/plugin/templates/langs/zh/skills/pd-mentor/SKILL.md +2 -3
  142. package/templates/langs/en/core/AGENTS.md +2 -2
  143. package/templates/langs/en/core/BOOTSTRAP.md +4 -17
  144. package/templates/langs/en/core/TOOLS.md +1 -1
  145. package/templates/langs/en/skills/pd-mentor/SKILL.md +8 -26
  146. package/templates/langs/zh/core/AGENTS.md +2 -2
  147. package/templates/langs/zh/core/BOOTSTRAP.md +4 -17
  148. package/templates/langs/zh/core/TOOLS.md +1 -1
  149. package/templates/langs/zh/skills/pd-mentor/SKILL.md +8 -26
  150. package/plugin/dist/constants/diagnostician.d.ts +0 -12
  151. package/plugin/dist/constants/diagnostician.js +0 -65
  152. package/plugin/dist/service/evolution-queue-migration.d.ts +0 -128
  153. package/plugin/dist/service/evolution-queue-migration.js +0 -53
  154. package/plugin/templates/langs/en/skills/pd-diagnostician/SKILL.md +0 -466
  155. package/plugin/templates/langs/zh/skills/pd-diagnostician/SKILL.md +0 -391
  156. package/templates/langs/en/skills/pd-daily/SKILL.md +0 -199
  157. package/templates/langs/en/skills/pd-grooming/SKILL.md +0 -46
  158. package/templates/langs/zh/skills/pd-daily/SKILL.md +0 -283
  159. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +0 -287
  160. 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) → openclaw-cli
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(false);
96
- if (isRuntimeConfigError(defaultResult))
95
+ expect(isRuntimeConfigError(defaultResult)).toBe(true);
96
+ if (!isRuntimeConfigError(defaultResult))
97
97
  return;
98
- expect(defaultResult.runtimeKind).toBe('openclaw-cli');
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: existing MVP defaults still work (null config)', () => {
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(false);
115
- if (isRuntimeConfigError(result))
114
+ expect(isRuntimeConfigError(result)).toBe(true);
115
+ if (!isRuntimeConfigError(result))
116
116
  return;
117
- expect(result.runtimeKind).toBe('openclaw-cli');
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":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=l2-resolve-model-compat.test.d.ts.map
@@ -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[0];
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[0];
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.tools;
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[0];
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[0];
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[0];
1845
+ const [payload] = c;
1827
1846
  return (typeof payload === 'object' &&
1828
1847
  payload !== null &&
1829
1848
  Object.hasOwn(payload, 'eventType') &&