create-principles-disciple 1.92.0 → 1.93.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 (136) hide show
  1. package/console/dist/server/config/AuthConfig.js +6 -0
  2. package/console/dist/server/index.js +31 -16
  3. package/console/dist/server/models/ApprovalsGroupedConsoleModel.js +6 -3
  4. package/console/dist/server/models/ConsoleLifecycleDatasource.js +1 -1
  5. package/console/dist/server/routes/activations.js +4 -0
  6. package/console/dist/server/routes/approvals.js +24 -4
  7. package/console/dist/server/routes/feedback-reports.js +7 -5
  8. package/console/dist/server/routes/lifecycle.js +6 -1
  9. package/console/dist/server/routes/principles.js +10 -2
  10. package/console/dist/server/routes/workspaces.js +4 -0
  11. package/console/dist/ui/components/ui/charts.js +4 -1
  12. package/console/dist/ui/components/ui/markdown.js +9 -5
  13. package/console/dist/ui/utils/enum-labels.js +4 -1
  14. package/console/dist/web/assets/app.js +5 -2
  15. package/core/dist/index.d.ts +0 -1
  16. package/core/dist/index.d.ts.map +1 -1
  17. package/core/dist/index.js +0 -2
  18. package/core/dist/index.js.map +1 -1
  19. package/core/dist/pain-signal.d.ts +11 -71
  20. package/core/dist/pain-signal.d.ts.map +1 -1
  21. package/core/dist/pain-signal.js +10 -120
  22. package/core/dist/pain-signal.js.map +1 -1
  23. package/core/dist/principle-tree-ledger.d.ts +4 -87
  24. package/core/dist/principle-tree-ledger.d.ts.map +1 -1
  25. package/core/dist/principle-tree-ledger.js +51 -148
  26. package/core/dist/principle-tree-ledger.js.map +1 -1
  27. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +178 -4
  28. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  29. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.d.ts +12 -0
  30. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.d.ts.map +1 -0
  31. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.js +46 -0
  32. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.js.map +1 -0
  33. package/core/dist/runtime-v2/__tests__/io-deletion.test.d.ts +12 -0
  34. package/core/dist/runtime-v2/__tests__/io-deletion.test.d.ts.map +1 -0
  35. package/core/dist/runtime-v2/__tests__/io-deletion.test.js +92 -0
  36. package/core/dist/runtime-v2/__tests__/io-deletion.test.js.map +1 -0
  37. package/core/dist/runtime-v2/__tests__/ledger-codec.test.d.ts +2 -0
  38. package/core/dist/runtime-v2/__tests__/ledger-codec.test.d.ts.map +1 -0
  39. package/core/dist/runtime-v2/__tests__/ledger-codec.test.js +429 -0
  40. package/core/dist/runtime-v2/__tests__/ledger-codec.test.js.map +1 -0
  41. package/core/dist/runtime-v2/__tests__/ledger-store.test.d.ts +2 -0
  42. package/core/dist/runtime-v2/__tests__/ledger-store.test.d.ts.map +1 -0
  43. package/core/dist/runtime-v2/__tests__/ledger-store.test.js +65 -0
  44. package/core/dist/runtime-v2/__tests__/ledger-store.test.js.map +1 -0
  45. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +146 -0
  46. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  47. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts +2 -0
  48. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts.map +1 -0
  49. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.js +150 -0
  50. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.js.map +1 -0
  51. package/core/dist/runtime-v2/adapter/__tests__/test-double-runtime-adapter.test.js +199 -0
  52. package/core/dist/runtime-v2/adapter/__tests__/test-double-runtime-adapter.test.js.map +1 -1
  53. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +156 -0
  54. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -1
  55. package/core/dist/runtime-v2/index.d.ts +1 -2
  56. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  57. package/core/dist/runtime-v2/index.js +4 -2
  58. package/core/dist/runtime-v2/index.js.map +1 -1
  59. package/core/dist/runtime-v2/principle-tree/ledger-codec.d.ts +30 -0
  60. package/core/dist/runtime-v2/principle-tree/ledger-codec.d.ts.map +1 -0
  61. package/core/dist/runtime-v2/principle-tree/ledger-codec.js +154 -0
  62. package/core/dist/runtime-v2/principle-tree/ledger-codec.js.map +1 -0
  63. package/core/dist/runtime-v2/types/index.d.ts +2 -0
  64. package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
  65. package/core/dist/runtime-v2/types/index.js +1 -0
  66. package/core/dist/runtime-v2/types/index.js.map +1 -1
  67. package/core/dist/runtime-v2/types/ledger-store.d.ts +101 -0
  68. package/core/dist/runtime-v2/types/ledger-store.d.ts.map +1 -0
  69. package/core/dist/runtime-v2/types/ledger-store.js +15 -0
  70. package/core/dist/runtime-v2/types/ledger-store.js.map +1 -0
  71. package/core/dist/runtime-v2/types/pain-signal.d.ts +5 -3
  72. package/core/dist/runtime-v2/types/pain-signal.d.ts.map +1 -1
  73. package/core/dist/runtime-v2/types/pain-signal.js +23 -3
  74. package/core/dist/runtime-v2/types/pain-signal.js.map +1 -1
  75. package/core/package.json +3 -3
  76. package/dist/installer.d.ts.map +1 -1
  77. package/dist/installer.js +9 -3
  78. package/dist/installer.js.map +1 -1
  79. package/dist/mvp-config.d.ts.map +1 -1
  80. package/dist/mvp-config.js +3 -2
  81. package/dist/mvp-config.js.map +1 -1
  82. package/dist/utils/env.d.ts.map +1 -1
  83. package/dist/utils/env.js +10 -4
  84. package/dist/utils/env.js.map +1 -1
  85. package/package.json +1 -1
  86. package/pd-cli/dist/commands/__tests__/legacy-cleanup.test.js +11 -3
  87. package/pd-cli/dist/commands/__tests__/legacy-cleanup.test.js.map +1 -1
  88. package/pd-cli/dist/commands/candidate.d.ts.map +1 -1
  89. package/pd-cli/dist/commands/candidate.js +2 -1
  90. package/pd-cli/dist/commands/candidate.js.map +1 -1
  91. package/pd-cli/dist/commands/health.d.ts.map +1 -1
  92. package/pd-cli/dist/commands/health.js +2 -1
  93. package/pd-cli/dist/commands/health.js.map +1 -1
  94. package/pd-cli/dist/commands/runtime-internalization-integrity.d.ts.map +1 -1
  95. package/pd-cli/dist/commands/runtime-internalization-integrity.js +3 -1
  96. package/pd-cli/dist/commands/runtime-internalization-integrity.js.map +1 -1
  97. package/pd-cli/dist/commands/runtime-uat.d.ts.map +1 -1
  98. package/pd-cli/dist/commands/runtime-uat.js +4 -1
  99. package/pd-cli/dist/commands/runtime-uat.js.map +1 -1
  100. package/pd-cli/dist/legacy/session-history-import.js +7 -5
  101. package/pd-cli/dist/legacy/session-history-import.js.map +1 -1
  102. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js +13 -2
  103. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js.map +1 -1
  104. package/pd-cli/dist/services/pain-flood-simulation-runner.d.ts.map +1 -1
  105. package/pd-cli/dist/services/pain-flood-simulation-runner.js +6 -2
  106. package/pd-cli/dist/services/pain-flood-simulation-runner.js.map +1 -1
  107. package/pd-cli/dist/services/runtime-adapter-resolver.d.ts.map +1 -1
  108. package/pd-cli/dist/services/runtime-adapter-resolver.js +6 -4
  109. package/pd-cli/dist/services/runtime-adapter-resolver.js.map +1 -1
  110. package/plugin/dist/commands/capabilities.js +3 -2
  111. package/plugin/dist/commands/disable-impl.js +1 -1
  112. package/plugin/dist/commands/focus.js +10 -2
  113. package/plugin/dist/commands/rollback-impl.js +1 -1
  114. package/plugin/dist/commands/thinking-os.js +5 -1
  115. package/plugin/dist/core/correction-cue-learner.js +2 -0
  116. package/plugin/dist/core/event-log.js +17 -10
  117. package/plugin/dist/core/focus-history.js +1 -1
  118. package/plugin/dist/core/hygiene/tracker.js +3 -3
  119. package/plugin/dist/core/principle-compiler/compiler.js +2 -0
  120. package/plugin/dist/core/replay-engine.js +1 -1
  121. package/plugin/dist/core/rule-host.js +3 -1
  122. package/plugin/dist/core/thinking-os-parser.js +13 -4
  123. package/plugin/dist/hooks/trajectory-collector.d.ts +20 -4
  124. package/plugin/dist/hooks/trajectory-collector.js +95 -156
  125. package/plugin/dist/index.js +7 -2
  126. package/plugin/dist/openclaw-sdk.d.ts +4 -1
  127. package/plugin/dist/service/evolution-worker.js +7 -3
  128. package/plugin/dist/service/internalization-auto-consumer-service.js +2 -1
  129. package/plugin/dist/service/runtime-summary-service.js +8 -1
  130. package/plugin/dist/service/workflow-watchdog.js +2 -1
  131. package/plugin/dist/utils/retry.js +7 -2
  132. package/plugin/dist/utils/session-key.js +4 -1
  133. package/core/dist/io.d.ts +0 -35
  134. package/core/dist/io.d.ts.map +0 -1
  135. package/core/dist/io.js +0 -95
  136. package/core/dist/io.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ledger-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-store.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/ledger-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * PRI-443: Ledger store types module — pure type definitions, zero I/O.
3
+ *
4
+ * Tests verify:
5
+ * 1. All types are importable from the new pure module
6
+ * 2. The module has zero fs/path imports
7
+ * 3. TREE_NAMESPACE constant is available
8
+ */
9
+ import { describe, it, expect } from 'vitest';
10
+ import { readFileSync } from 'node:fs';
11
+ import { resolve } from 'node:path';
12
+ import { TREE_NAMESPACE } from '../types/ledger-store.js';
13
+ describe('PRI-443: ledger-store.ts pure types module', () => {
14
+ it('TREE_NAMESPACE constant is exported and equals _tree', () => {
15
+ expect(TREE_NAMESPACE).toBe('_tree');
16
+ });
17
+ it('LedgerPrinciple extends Principle with optional fields', () => {
18
+ const principle = {
19
+ id: 'pri-001',
20
+ version: 1,
21
+ text: 'Test principle',
22
+ triggerPattern: 'test',
23
+ action: 'test',
24
+ status: 'active',
25
+ priority: 'P0',
26
+ scope: 'general',
27
+ evaluability: 'manual_only',
28
+ valueScore: 0.5,
29
+ adherenceRate: 0.8,
30
+ painPreventedCount: 0,
31
+ derivedFromPainIds: [],
32
+ ruleIds: [],
33
+ conflictsWithPrincipleIds: [],
34
+ createdAt: '2026-01-01T00:00:00Z',
35
+ updatedAt: '2026-01-01T00:00:00Z',
36
+ suggestedRules: ['rule-1'],
37
+ lastTriggeredAt: '2026-01-02T00:00:00Z',
38
+ };
39
+ expect(principle.id).toBe('pri-001');
40
+ expect(principle.suggestedRules).toEqual(['rule-1']);
41
+ expect(principle.lastTriggeredAt).toBe('2026-01-02T00:00:00Z');
42
+ });
43
+ it('HybridLedgerStore has trainingStore and tree', () => {
44
+ const store = {
45
+ trainingStore: {},
46
+ tree: {
47
+ principles: {},
48
+ rules: {},
49
+ implementations: {},
50
+ metrics: {},
51
+ lastUpdated: '2026-01-01T00:00:00Z',
52
+ },
53
+ };
54
+ expect(store.trainingStore).toEqual({});
55
+ expect(store.tree.principles).toEqual({});
56
+ });
57
+ it('ledger-store.ts has zero fs/path imports (pure module)', () => {
58
+ const src = readFileSync(resolve(__dirname, '..', 'types', 'ledger-store.ts'), 'utf-8');
59
+ expect(src).not.toMatch(/from\s+['"]fs['"]/);
60
+ expect(src).not.toMatch(/from\s+['"]path['"]/);
61
+ expect(src).not.toMatch(/from\s+['"]node:fs/);
62
+ expect(src).not.toMatch(/from\s+['"]node:path/);
63
+ });
64
+ });
65
+ //# sourceMappingURL=ledger-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-store.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/ledger-store.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,SAAS,GAAoB;YACjC,EAAE,EAAE,SAAS;YACb,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,cAAc,EAAE,MAAM;YACtB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,aAAa;YAC3B,UAAU,EAAE,GAAG;YACf,aAAa,EAAE,GAAG;YAClB,kBAAkB,EAAE,CAAC;YACrB,kBAAkB,EAAE,EAAE;YACtB,OAAO,EAAE,EAAE;YACX,yBAAyB,EAAE,EAAE;YAC7B,SAAS,EAAE,sBAAsB;YACjC,SAAS,EAAE,sBAAsB;YACjC,cAAc,EAAE,CAAC,QAAQ,CAAC;YAC1B,eAAe,EAAE,sBAAsB;SACxC,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAsB;YAC/B,aAAa,EAAE,EAAE;YACjB,IAAI,EAAE;gBACJ,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,EAAE;gBACT,eAAe,EAAE,EAAE;gBACnB,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,sBAAsB;aACpC;SACF,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,GAAG,GAAG,YAAY,CACtB,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,CAAC,EACpD,OAAO,CACR,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -222,5 +222,151 @@ describe('recordPainSignalObservability', () => {
222
222
  db.close();
223
223
  }
224
224
  });
225
+ // PRI-406 regression tests — empty string config guards
226
+ it('handles empty workspaceDir gracefully (returns warnings)', () => {
227
+ const { stateDir } = makeWorkspace();
228
+ const result = recordPainSignalObservability({
229
+ workspaceDir: '',
230
+ stateDir,
231
+ data: {
232
+ painId: 'empty_workspace_test',
233
+ painType: 'tool_failure',
234
+ source: 'manual',
235
+ reason: 'empty workspace test',
236
+ score: 60,
237
+ sessionId: 'cli',
238
+ },
239
+ });
240
+ // Should still succeed but may have warnings about path resolution
241
+ expect(result.warnings.length).toBeGreaterThanOrEqual(0);
242
+ // trajectoryPainEventId should still be valid
243
+ expect(result.trajectoryPainEventId).toBeGreaterThan(0);
244
+ });
245
+ it('handles empty stateDir gracefully (returns warnings)', () => {
246
+ const { workspaceDir } = makeWorkspace();
247
+ const result = recordPainSignalObservability({
248
+ workspaceDir,
249
+ stateDir: '',
250
+ data: {
251
+ painId: 'empty_state_test',
252
+ painType: 'tool_failure',
253
+ source: 'manual',
254
+ reason: 'empty state test',
255
+ score: 60,
256
+ sessionId: 'cli',
257
+ },
258
+ });
259
+ // Should still succeed but may have warnings about path resolution
260
+ expect(result.warnings.length).toBeGreaterThanOrEqual(0);
261
+ // trajectoryPainEventId should still be valid (default path used)
262
+ expect(result.trajectoryPainEventId).toBeGreaterThan(0);
263
+ });
264
+ it('handles empty canonicalPainId gracefully (stored as empty string)', () => {
265
+ const { workspaceDir, stateDir } = makeWorkspace();
266
+ const result = recordPainSignalObservability({
267
+ workspaceDir,
268
+ stateDir,
269
+ data: {
270
+ painId: 'empty_canonical_test',
271
+ painType: 'tool_failure',
272
+ source: 'manual',
273
+ reason: 'empty canonical test',
274
+ score: 60,
275
+ sessionId: 'cli',
276
+ },
277
+ canonicalPainId: '',
278
+ runtimeTaskId: 'task_empty',
279
+ });
280
+ expect(result.warnings).toEqual([]);
281
+ expect(result.trajectoryPainEventId).toBeGreaterThan(0);
282
+ // Verify canonical_pain_id is stored as empty string (not null)
283
+ const db = new Database(join(stateDir, 'trajectory.db'), { readonly: true });
284
+ try {
285
+ const row = db.prepare('SELECT canonical_pain_id FROM pain_events WHERE id = ?').get(result.trajectoryPainEventId);
286
+ // Empty string is stored as empty string, not null
287
+ expect(row.canonical_pain_id).toBe('');
288
+ }
289
+ finally {
290
+ db.close();
291
+ }
292
+ });
293
+ it('handles whitespace-only canonicalPainId gracefully (stored as whitespace)', () => {
294
+ const { workspaceDir, stateDir } = makeWorkspace();
295
+ const result = recordPainSignalObservability({
296
+ workspaceDir,
297
+ stateDir,
298
+ data: {
299
+ painId: 'whitespace_canonical_test',
300
+ painType: 'tool_failure',
301
+ source: 'manual',
302
+ reason: 'whitespace canonical test',
303
+ score: 60,
304
+ sessionId: 'cli',
305
+ },
306
+ canonicalPainId: ' ',
307
+ runtimeTaskId: 'task_whitespace',
308
+ });
309
+ expect(result.warnings).toEqual([]);
310
+ expect(result.trajectoryPainEventId).toBeGreaterThan(0);
311
+ // Verify canonical_pain_id is stored as whitespace string (not null)
312
+ const db = new Database(join(stateDir, 'trajectory.db'), { readonly: true });
313
+ try {
314
+ const row = db.prepare('SELECT canonical_pain_id FROM pain_events WHERE id = ?').get(result.trajectoryPainEventId);
315
+ // Whitespace string is stored as whitespace, not null
316
+ expect(row.canonical_pain_id).toBe(' ');
317
+ }
318
+ finally {
319
+ db.close();
320
+ }
321
+ });
322
+ it('preserves original score and reason on UNIQUE constraint violation', () => {
323
+ const { workspaceDir, stateDir } = makeWorkspace();
324
+ const canonicalPainId = 'preserve_original_test';
325
+ // First insert
326
+ recordPainSignalObservability({
327
+ workspaceDir,
328
+ stateDir,
329
+ data: {
330
+ painId: canonicalPainId,
331
+ taskId: 'diagnosis_preserve_001',
332
+ painType: 'user_frustration',
333
+ source: 'manual',
334
+ reason: 'original reason',
335
+ score: 80,
336
+ sessionId: 'cli',
337
+ agentId: 'pd-cli',
338
+ },
339
+ canonicalPainId,
340
+ runtimeTaskId: 'task_001',
341
+ });
342
+ // Second insert with different score/reason
343
+ const result2 = recordPainSignalObservability({
344
+ workspaceDir,
345
+ stateDir,
346
+ data: {
347
+ painId: canonicalPainId,
348
+ taskId: 'diagnosis_preserve_002',
349
+ painType: 'user_frustration',
350
+ source: 'manual',
351
+ reason: 'new reason',
352
+ score: 95,
353
+ sessionId: 'cli',
354
+ agentId: 'pd-cli',
355
+ },
356
+ canonicalPainId,
357
+ runtimeTaskId: 'task_002',
358
+ });
359
+ expect(result2.warnings).toEqual([]);
360
+ // Verify original score and reason are preserved (not updated)
361
+ const db = new Database(join(stateDir, 'trajectory.db'), { readonly: true });
362
+ try {
363
+ const row = db.prepare('SELECT score, reason FROM pain_events WHERE canonical_pain_id = ?').get(canonicalPainId);
364
+ expect(row.score).toBe(80);
365
+ expect(row.reason).toBe('original reason');
366
+ }
367
+ finally {
368
+ db.close();
369
+ }
370
+ });
225
371
  });
226
372
  //# sourceMappingURL=pain-signal-observability.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pain-signal-observability.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-signal-observability.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAEhF,MAAM,QAAQ,GAAa,EAAE,CAAC;AAE9B,SAAS,aAAa;IACpB,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACtE,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,6BAA6B,CAAC;YAC3C,YAAY;YACZ,QAAQ;YACR,IAAI,EAAE;gBACJ,MAAM,EAAE,iBAAiB;gBACzB,MAAM,EAAE,2BAA2B;gBACnC,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,uBAAuB;gBAC/B,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,QAAQ;aAClB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,EAAC,YAAY,EAAC,GAAG,MAAM,CAAC;QAC9B,MAAM,EAAC,mBAAmB,EAAC,GAAG,MAAM,CAAC;QACrC,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,CAAC;QAE1C,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;YAC7C,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE;gBACJ,OAAO,EAAE,iBAAiB;gBAC1B,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,aAAa;aACtB;SACF,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;YAC9C,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE;gBACJ,MAAM,EAAE,iBAAiB;gBACzB,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,CAAC;aACjB;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,EAK1F,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACtB,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,uBAAuB;aAChC,CAAC,CAAC;YAEH,MAAM,iBAAiB,GAAG,EAAE,CAAC,OAAO,CAAC;;OAEpC,CAAC,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,CAAC,iBAAiB,CAAC,CAAC,aAAa,EAAE,CAAC;QAC5C,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,2EAA2E;QAC3E,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAE/C,iDAAiD;QACjD,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzC,yDAAyD;QACzD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;KAoBP,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,EAAE,CAAC;QAEX,+DAA+D;QAC/D,MAAM,MAAM,GAAG,6BAA6B,CAAC;YAC3C,YAAY;YACZ,QAAQ;YACR,IAAI,EAAE;gBACJ,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE,kCAAkC;gBAC1C,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,8BAA8B;gBACtC,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,QAAQ;aAClB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAExD,iCAAiC;QACjC,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,EAK9F,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACtB,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,8BAA8B;aACvC,CAAC,CAAC;YAEH,kEAAkE;YAClE,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAAwB,CAAC;YACjG,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YACnD,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,6BAA6B,CAAC;YAC3C,YAAY;YACZ,QAAQ;YACR,IAAI,EAAE;gBACJ,MAAM,EAAE,gBAAgB;gBACxB,QAAQ,EAAE,cAAc;gBACxB,MAAM,EAAE,cAAc;gBACtB,MAAM,EAAE,mFAAmF;gBAC3F,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACtF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAC;QACnD,MAAM,eAAe,GAAG,2BAA2B,CAAC;QAEpD,gCAAgC;QAChC,MAAM,OAAO,GAAG,6BAA6B,CAAC;YAC5C,YAAY;YACZ,QAAQ;YACR,IAAI,EAAE;gBACJ,MAAM,EAAE,eAAe;gBACvB,MAAM,EAAE,yBAAyB;gBACjC,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,QAAQ;aAClB;YACD,eAAe;YACf,aAAa,EAAE,UAAU;SAC1B,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAErC,4EAA4E;QAC5E,MAAM,OAAO,GAAG,6BAA6B,CAAC;YAC5C,YAAY;YACZ,QAAQ;YACR,IAAI,EAAE;gBACJ,MAAM,EAAE,eAAe;gBACvB,MAAM,EAAE,yBAAyB;gBACjC,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,+BAA+B;gBACvC,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,QAAQ;aAClB;YACD,eAAe;YACf,aAAa,EAAE,UAAU;SAC1B,CAAC,CAAC;QACH,iDAAiD;QACjD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAErC,sDAAsD;QACtD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,wFAAwF,CACzF,CAAC,GAAG,CAAC,eAAe,CAAoE,CAAC;YAC1F,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,qDAAqD;YACrD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"pain-signal-observability.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-signal-observability.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pain-signal-unification.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pain-signal-unification.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-signal-unification.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * PRI-443: Pain signal unification tests.
3
+ *
4
+ * Verifies that the top-level pain-signal.ts re-exports from
5
+ * runtime-v2/types/pain-signal.ts and that the unified schema
6
+ * includes the stricter validations from both versions:
7
+ * - ISO 8601 timestamp format check (from top-level)
8
+ * - Context size limit (from top-level)
9
+ * - version field (from top-level)
10
+ * - isStringRecord type guard instead of `as` (from runtime-v2)
11
+ */
12
+ import { describe, it, expect } from 'vitest';
13
+ import { readFileSync } from 'node:fs';
14
+ import { resolve } from 'node:path';
15
+ import { validatePainSignal, deriveSeverity, PainSignalSchema } from '../../pain-signal.js';
16
+ // Import from runtime-v2 (the canonical source)
17
+ import { validatePainSignal as validatePainSignalV2, PainSignalSchema as PainSignalSchemaV2, } from '../types/pain-signal.js';
18
+ describe('PRI-443: pain-signal.ts unification', () => {
19
+ it('top-level pain-signal.ts re-exports from runtime-v2 (no duplicate code)', () => {
20
+ const src = readFileSync(resolve(__dirname, '..', '..', '..', 'src', 'pain-signal.ts'), 'utf-8');
21
+ // Should NOT contain schema definition — only re-export
22
+ expect(src).not.toMatch(/export\s+const\s+PainSignalSchema\s*=/);
23
+ expect(src).not.toMatch(/export\s+function\s+validatePainSignal\s*\(/);
24
+ // Should contain re-export
25
+ expect(src).toMatch(/from\s+['"]\.\/runtime-v2\/types\/pain-signal\.js['"]/);
26
+ });
27
+ it('top-level and runtime-v2 validatePainSignal are the same function', () => {
28
+ expect(validatePainSignal).toBe(validatePainSignalV2);
29
+ });
30
+ it('top-level and runtime-v2 PainSignalSchema are the same object', () => {
31
+ expect(PainSignalSchema).toBe(PainSignalSchemaV2);
32
+ });
33
+ it('rejects invalid ISO 8601 timestamp', () => {
34
+ const signal = {
35
+ source: 'tool_failure',
36
+ score: 75,
37
+ timestamp: 'not-a-date',
38
+ reason: 'Test',
39
+ sessionId: 'sess-123',
40
+ agentId: 'main',
41
+ traceId: 'trace-abc',
42
+ triggerTextPreview: 'test',
43
+ domain: 'coding',
44
+ severity: 'high',
45
+ context: {},
46
+ };
47
+ const result = validatePainSignal(signal);
48
+ expect(result.valid).toBe(false);
49
+ expect(result.errors.some((e) => e.includes('timestamp'))).toBe(true);
50
+ });
51
+ it('rejects context exceeding 10KB size limit', () => {
52
+ const largeContext = {};
53
+ const bigString = 'x'.repeat(11_000);
54
+ largeContext.big = bigString;
55
+ const signal = {
56
+ source: 'tool_failure',
57
+ score: 75,
58
+ timestamp: '2026-01-01T00:00:00Z',
59
+ reason: 'Test',
60
+ sessionId: 'sess-123',
61
+ agentId: 'main',
62
+ traceId: 'trace-abc',
63
+ triggerTextPreview: 'test',
64
+ domain: 'coding',
65
+ severity: 'high',
66
+ context: largeContext,
67
+ };
68
+ const result = validatePainSignal(signal);
69
+ expect(result.valid).toBe(false);
70
+ expect(result.errors.some((e) => e.includes('Context'))).toBe(true);
71
+ });
72
+ it('rejects context with circular references without crashing (PR review fix)', () => {
73
+ const circularContext = {};
74
+ circularContext.self = circularContext;
75
+ const signal = {
76
+ source: 'tool_failure',
77
+ score: 75,
78
+ timestamp: '2026-01-01T00:00:00Z',
79
+ reason: 'Test',
80
+ sessionId: 'sess-123',
81
+ agentId: 'main',
82
+ traceId: 'trace-abc',
83
+ triggerTextPreview: 'test',
84
+ domain: 'coding',
85
+ severity: 'high',
86
+ context: circularContext,
87
+ };
88
+ const result = validatePainSignal(signal);
89
+ expect(result.valid).toBe(false);
90
+ expect(result.errors.some((e) => e.includes('JSON-serializable'))).toBe(true);
91
+ });
92
+ it('rejects context with BigInt values without crashing (PR review fix)', () => {
93
+ const signal = {
94
+ source: 'tool_failure',
95
+ score: 75,
96
+ timestamp: '2026-01-01T00:00:00Z',
97
+ reason: 'Test',
98
+ sessionId: 'sess-123',
99
+ agentId: 'main',
100
+ traceId: 'trace-abc',
101
+ triggerTextPreview: 'test',
102
+ domain: 'coding',
103
+ severity: 'high',
104
+ context: { bigNum: BigInt(123) },
105
+ };
106
+ const result = validatePainSignal(signal);
107
+ expect(result.valid).toBe(false);
108
+ expect(result.errors.some((e) => e.includes('JSON-serializable'))).toBe(true);
109
+ });
110
+ it('accepts signal with optional sessionId/agentId/traceId missing', () => {
111
+ const signal = {
112
+ source: 'tool_failure',
113
+ score: 75,
114
+ timestamp: '2026-01-01T00:00:00Z',
115
+ reason: 'Test',
116
+ triggerTextPreview: 'test',
117
+ domain: 'coding',
118
+ severity: 'high',
119
+ context: {},
120
+ };
121
+ const result = validatePainSignal(signal);
122
+ expect(result.valid).toBe(true);
123
+ });
124
+ it('includes version field in validated signal', () => {
125
+ const signal = {
126
+ source: 'tool_failure',
127
+ score: 75,
128
+ timestamp: '2026-01-01T00:00:00Z',
129
+ reason: 'Test',
130
+ sessionId: 'sess-123',
131
+ agentId: 'main',
132
+ traceId: 'trace-abc',
133
+ triggerTextPreview: 'test',
134
+ domain: 'coding',
135
+ severity: 'high',
136
+ context: {},
137
+ };
138
+ const result = validatePainSignal(signal);
139
+ expect(result.valid).toBe(true);
140
+ expect(result.signal?.version).toBe('0.1.0');
141
+ });
142
+ it('PainSeverity type is exported', () => {
143
+ const s = 'low';
144
+ expect(s).toBe('low');
145
+ });
146
+ it('deriveSeverity is exported and works', () => {
147
+ expect(deriveSeverity(95)).toBe('critical');
148
+ });
149
+ });
150
+ //# sourceMappingURL=pain-signal-unification.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pain-signal-unification.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-signal-unification.test.ts"],"names":[],"mappings":"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"}
@@ -340,5 +340,204 @@ describe('TestDoubleRuntimeAdapter', () => {
340
340
  expect(payloadB.taskId).toContain('diag_distiller-');
341
341
  });
342
342
  });
343
+ // PRI-401 regression tests — stage-aware dispatch edge cases
344
+ describe('stage-aware dispatch edge cases', () => {
345
+ it('handles taskId with diag_rootcause prefix in middle of string', async () => {
346
+ const adapter = new TestDoubleRuntimeAdapter();
347
+ const handle = await adapter.startRun({
348
+ agentSpec: { agentId: 'test', schemaVersion: 'v1' },
349
+ inputPayload: {},
350
+ contextItems: [],
351
+ timeoutMs: 5000,
352
+ taskRef: { taskId: 'prefix_diag_rootcause-diagnosis_pain-001_suffix' },
353
+ });
354
+ const output = await adapter.fetchOutput(handle.runId);
355
+ expect(output).not.toBeNull();
356
+ if (!output)
357
+ throw new Error('output is null');
358
+ const payload = output.payload;
359
+ // Should dispatch to rootcause output
360
+ expect(payload.rootCauseCategory).toBeDefined();
361
+ });
362
+ it('handles taskId with diag_distiller prefix in middle of string', async () => {
363
+ const adapter = new TestDoubleRuntimeAdapter();
364
+ const handle = await adapter.startRun({
365
+ agentSpec: { agentId: 'test', schemaVersion: 'v1' },
366
+ inputPayload: {},
367
+ contextItems: [],
368
+ timeoutMs: 5000,
369
+ taskRef: { taskId: 'prefix_diag_distiller-diagnosis_pain-001_suffix' },
370
+ });
371
+ const output = await adapter.fetchOutput(handle.runId);
372
+ expect(output).not.toBeNull();
373
+ if (!output)
374
+ throw new Error('output is null');
375
+ const payload = output.payload;
376
+ // Should dispatch to distiller output
377
+ expect(payload.abstractedPrinciple).toBeDefined();
378
+ });
379
+ it('handles taskId with diag_router prefix in middle of string', async () => {
380
+ const adapter = new TestDoubleRuntimeAdapter();
381
+ const handle = await adapter.startRun({
382
+ agentSpec: { agentId: 'test', schemaVersion: 'v1' },
383
+ inputPayload: {},
384
+ contextItems: [],
385
+ timeoutMs: 5000,
386
+ taskRef: { taskId: 'prefix_diag_router-diagnosis_pain-001_suffix' },
387
+ });
388
+ const output = await adapter.fetchOutput(handle.runId);
389
+ expect(output).not.toBeNull();
390
+ if (!output)
391
+ throw new Error('output is null');
392
+ const payload = output.payload;
393
+ // Should dispatch to router output
394
+ expect(payload.recommendations).toBeDefined();
395
+ });
396
+ it('handles empty taskId gracefully', async () => {
397
+ const adapter = new TestDoubleRuntimeAdapter({}, 'fallback-task');
398
+ const handle = await adapter.startRun({
399
+ agentSpec: { agentId: 'test', schemaVersion: 'v1' },
400
+ inputPayload: {},
401
+ contextItems: [],
402
+ timeoutMs: 5000,
403
+ taskRef: { taskId: '' },
404
+ });
405
+ const output = await adapter.fetchOutput(handle.runId);
406
+ expect(output).not.toBeNull();
407
+ if (!output)
408
+ throw new Error('output is null');
409
+ const payload = output.payload;
410
+ // Should fall back to monolithic output
411
+ expect(payload.taskId).toBe('fallback-task');
412
+ expect(payload.rootCauseCategory).toBeUndefined();
413
+ });
414
+ it('handles null taskRef gracefully', async () => {
415
+ const adapter = new TestDoubleRuntimeAdapter({}, 'fallback-task');
416
+ const handle = await adapter.startRun({
417
+ agentSpec: { agentId: 'test', schemaVersion: 'v1' },
418
+ inputPayload: {},
419
+ contextItems: [],
420
+ timeoutMs: 5000,
421
+ // taskRef is not provided
422
+ });
423
+ const output = await adapter.fetchOutput(handle.runId);
424
+ expect(output).not.toBeNull();
425
+ if (!output)
426
+ throw new Error('output is null');
427
+ const payload = output.payload;
428
+ // Should fall back to monolithic output with defaultTaskId
429
+ expect(payload.taskId).toBe('fallback-task');
430
+ });
431
+ it('handles taskRef without taskId gracefully', async () => {
432
+ const adapter = new TestDoubleRuntimeAdapter({}, 'fallback-task');
433
+ // Cast to any to bypass TypeScript type checking for test purposes
434
+ const handle = await adapter.startRun({
435
+ agentSpec: { agentId: 'test', schemaVersion: 'v1' },
436
+ inputPayload: {},
437
+ contextItems: [],
438
+ timeoutMs: 5000,
439
+ taskRef: { taskId: '' }, // Empty taskId to test fallback behavior
440
+ });
441
+ const output = await adapter.fetchOutput(handle.runId);
442
+ expect(output).not.toBeNull();
443
+ if (!output)
444
+ throw new Error('output is null');
445
+ const payload = output.payload;
446
+ // Should fall back to monolithic output with defaultTaskId
447
+ expect(payload.taskId).toBe('fallback-task');
448
+ });
449
+ it('handles multiple sequential runs with different taskIds', async () => {
450
+ const adapter = new TestDoubleRuntimeAdapter();
451
+ // Run 1: rootcause
452
+ const handle1 = await adapter.startRun({
453
+ agentSpec: { agentId: 'test', schemaVersion: 'v1' },
454
+ inputPayload: {},
455
+ contextItems: [],
456
+ timeoutMs: 5000,
457
+ taskRef: { taskId: 'diag_rootcause-diagnosis_pain-001' },
458
+ });
459
+ const output1 = await adapter.fetchOutput(handle1.runId);
460
+ expect(output1).not.toBeNull();
461
+ if (!output1)
462
+ throw new Error('output1 is null');
463
+ const payload1 = output1.payload;
464
+ expect(payload1.rootCauseCategory).toBe('Design');
465
+ // Run 2: distiller
466
+ const handle2 = await adapter.startRun({
467
+ agentSpec: { agentId: 'test', schemaVersion: 'v1' },
468
+ inputPayload: {},
469
+ contextItems: [],
470
+ timeoutMs: 5000,
471
+ taskRef: { taskId: 'diag_distiller-diagnosis_pain-002' },
472
+ });
473
+ const output2 = await adapter.fetchOutput(handle2.runId);
474
+ expect(output2).not.toBeNull();
475
+ if (!output2)
476
+ throw new Error('output2 is null');
477
+ const payload2 = output2.payload;
478
+ expect(payload2.abstractedPrinciple).toBeDefined();
479
+ // Run 3: router
480
+ const handle3 = await adapter.startRun({
481
+ agentSpec: { agentId: 'test', schemaVersion: 'v1' },
482
+ inputPayload: {},
483
+ contextItems: [],
484
+ timeoutMs: 5000,
485
+ taskRef: { taskId: 'diag_router-diagnosis_pain-003' },
486
+ });
487
+ const output3 = await adapter.fetchOutput(handle3.runId);
488
+ expect(output3).not.toBeNull();
489
+ if (!output3)
490
+ throw new Error('output3 is null');
491
+ const payload3 = output3.payload;
492
+ expect(payload3.recommendations).toBeDefined();
493
+ // Verify all outputs are different
494
+ expect(payload1.rootCauseCategory).toBeDefined();
495
+ expect(payload2.abstractedPrinciple).toBeDefined();
496
+ expect(payload3.recommendations).toBeDefined();
497
+ });
498
+ it('handles runId to taskId mapping correctly', async () => {
499
+ const adapter = new TestDoubleRuntimeAdapter();
500
+ const taskId = 'diag_rootcause-diagnosis_pain-mapping';
501
+ const handle = await adapter.startRun({
502
+ agentSpec: { agentId: 'test', schemaVersion: 'v1' },
503
+ inputPayload: {},
504
+ contextItems: [],
505
+ timeoutMs: 5000,
506
+ taskRef: { taskId },
507
+ });
508
+ // Verify runId was created
509
+ expect(handle.runId).toMatch(/^td-\d+$/);
510
+ // Verify output has correct taskId
511
+ const output = await adapter.fetchOutput(handle.runId);
512
+ expect(output).not.toBeNull();
513
+ if (!output)
514
+ throw new Error('output is null');
515
+ const payload = output.payload;
516
+ expect(payload.taskId).toBe(taskId);
517
+ });
518
+ it('handles concurrent fetchOutput calls for same runId', async () => {
519
+ const adapter = new TestDoubleRuntimeAdapter();
520
+ const handle = await adapter.startRun({
521
+ agentSpec: { agentId: 'test', schemaVersion: 'v1' },
522
+ inputPayload: {},
523
+ contextItems: [],
524
+ timeoutMs: 5000,
525
+ taskRef: { taskId: 'diag_rootcause-diagnosis_pain-concurrent' },
526
+ });
527
+ // Fetch output multiple times
528
+ const output1 = await adapter.fetchOutput(handle.runId);
529
+ const output2 = await adapter.fetchOutput(handle.runId);
530
+ const output3 = await adapter.fetchOutput(handle.runId);
531
+ // All should return same output
532
+ expect(output1).not.toBeNull();
533
+ expect(output2).not.toBeNull();
534
+ expect(output3).not.toBeNull();
535
+ const payload1 = output1?.payload;
536
+ const payload2 = output2?.payload;
537
+ const payload3 = output3?.payload;
538
+ expect(payload1.taskId).toBe(payload2.taskId);
539
+ expect(payload2.taskId).toBe(payload3.taskId);
540
+ });
541
+ });
343
542
  });
344
543
  //# sourceMappingURL=test-double-runtime-adapter.test.js.map