@urateam/core 0.1.49 → 0.1.51

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 (122) hide show
  1. package/dist/__tests__/agentic-deep-review-provider.test.js +6 -1
  2. package/dist/__tests__/agentic-deep-review-provider.test.js.map +1 -1
  3. package/dist/__tests__/audit-session-events.test.d.ts +2 -0
  4. package/dist/__tests__/audit-session-events.test.d.ts.map +1 -0
  5. package/dist/__tests__/audit-session-events.test.js +39 -0
  6. package/dist/__tests__/audit-session-events.test.js.map +1 -0
  7. package/dist/__tests__/db-migration-agent-session-id.test.d.ts +2 -0
  8. package/dist/__tests__/db-migration-agent-session-id.test.d.ts.map +1 -0
  9. package/dist/__tests__/db-migration-agent-session-id.test.js +35 -0
  10. package/dist/__tests__/db-migration-agent-session-id.test.js.map +1 -0
  11. package/dist/__tests__/deep-review-resume.test.d.ts +18 -0
  12. package/dist/__tests__/deep-review-resume.test.d.ts.map +1 -0
  13. package/dist/__tests__/deep-review-resume.test.js +90 -0
  14. package/dist/__tests__/deep-review-resume.test.js.map +1 -0
  15. package/dist/__tests__/execute-stage-session-opts.test.d.ts +17 -0
  16. package/dist/__tests__/execute-stage-session-opts.test.d.ts.map +1 -0
  17. package/dist/__tests__/execute-stage-session-opts.test.js +179 -0
  18. package/dist/__tests__/execute-stage-session-opts.test.js.map +1 -0
  19. package/dist/__tests__/ralph-handoff-suppression.test.d.ts +2 -0
  20. package/dist/__tests__/ralph-handoff-suppression.test.d.ts.map +1 -0
  21. package/dist/__tests__/ralph-handoff-suppression.test.js +37 -0
  22. package/dist/__tests__/ralph-handoff-suppression.test.js.map +1 -0
  23. package/dist/__tests__/session-policy.test.d.ts +2 -0
  24. package/dist/__tests__/session-policy.test.d.ts.map +1 -0
  25. package/dist/__tests__/session-policy.test.js +44 -0
  26. package/dist/__tests__/session-policy.test.js.map +1 -0
  27. package/dist/__tests__/session-resume-fallback.test.d.ts +18 -0
  28. package/dist/__tests__/session-resume-fallback.test.d.ts.map +1 -0
  29. package/dist/__tests__/session-resume-fallback.test.js +137 -0
  30. package/dist/__tests__/session-resume-fallback.test.js.map +1 -0
  31. package/dist/__tests__/session-resume-flag.test.d.ts +2 -0
  32. package/dist/__tests__/session-resume-flag.test.d.ts.map +1 -0
  33. package/dist/__tests__/session-resume-flag.test.js +87 -0
  34. package/dist/__tests__/session-resume-flag.test.js.map +1 -0
  35. package/dist/__tests__/session-store.test.d.ts +2 -0
  36. package/dist/__tests__/session-store.test.d.ts.map +1 -0
  37. package/dist/__tests__/session-store.test.js +44 -0
  38. package/dist/__tests__/session-store.test.js.map +1 -0
  39. package/dist/__tests__/session-volume-check.test.d.ts +2 -0
  40. package/dist/__tests__/session-volume-check.test.d.ts.map +1 -0
  41. package/dist/__tests__/session-volume-check.test.js +28 -0
  42. package/dist/__tests__/session-volume-check.test.js.map +1 -0
  43. package/dist/__tests__/validate-run-mode.test.d.ts +2 -0
  44. package/dist/__tests__/validate-run-mode.test.d.ts.map +1 -0
  45. package/dist/__tests__/validate-run-mode.test.js +102 -0
  46. package/dist/__tests__/validate-run-mode.test.js.map +1 -0
  47. package/dist/__tests__/zombie-age-default.test.d.ts +2 -0
  48. package/dist/__tests__/zombie-age-default.test.d.ts.map +1 -0
  49. package/dist/__tests__/zombie-age-default.test.js +24 -0
  50. package/dist/__tests__/zombie-age-default.test.js.map +1 -0
  51. package/dist/audit/events.d.ts +45 -0
  52. package/dist/audit/events.d.ts.map +1 -1
  53. package/dist/audit/events.js +79 -0
  54. package/dist/audit/events.js.map +1 -1
  55. package/dist/db/client.d.ts.map +1 -1
  56. package/dist/db/client.js +4 -1
  57. package/dist/db/client.js.map +1 -1
  58. package/dist/db/schema.d.ts +19 -0
  59. package/dist/db/schema.d.ts.map +1 -1
  60. package/dist/db/schema.js +2 -0
  61. package/dist/db/schema.js.map +1 -1
  62. package/dist/executor/deep-review.d.ts +28 -1
  63. package/dist/executor/deep-review.d.ts.map +1 -1
  64. package/dist/executor/deep-review.js +113 -9
  65. package/dist/executor/deep-review.js.map +1 -1
  66. package/dist/executor/executor.d.ts +33 -0
  67. package/dist/executor/executor.d.ts.map +1 -1
  68. package/dist/executor/executor.js +94 -4
  69. package/dist/executor/executor.js.map +1 -1
  70. package/dist/executor/index.d.ts +7 -0
  71. package/dist/executor/index.d.ts.map +1 -1
  72. package/dist/executor/index.js +7 -0
  73. package/dist/executor/index.js.map +1 -1
  74. package/dist/executor/prompt/assembler.d.ts +7 -1
  75. package/dist/executor/prompt/assembler.d.ts.map +1 -1
  76. package/dist/executor/prompt/assembler.js +9 -3
  77. package/dist/executor/prompt/assembler.js.map +1 -1
  78. package/dist/executor/prompt/templates.d.ts +25 -6
  79. package/dist/executor/prompt/templates.d.ts.map +1 -1
  80. package/dist/executor/prompt/templates.js +21 -12
  81. package/dist/executor/prompt/templates.js.map +1 -1
  82. package/dist/executor/review/agentic-deep-review.d.ts.map +1 -1
  83. package/dist/executor/review/agentic-deep-review.js +15 -1
  84. package/dist/executor/review/agentic-deep-review.js.map +1 -1
  85. package/dist/executor/review/review-provider.d.ts +21 -0
  86. package/dist/executor/review/review-provider.d.ts.map +1 -1
  87. package/dist/executor/review/review-provider.js.map +1 -1
  88. package/dist/executor/session-policy.d.ts +38 -0
  89. package/dist/executor/session-policy.d.ts.map +1 -0
  90. package/dist/executor/session-policy.js +66 -0
  91. package/dist/executor/session-policy.js.map +1 -0
  92. package/dist/executor/session-store.d.ts +32 -0
  93. package/dist/executor/session-store.d.ts.map +1 -0
  94. package/dist/executor/session-store.js +38 -0
  95. package/dist/executor/session-store.js.map +1 -0
  96. package/dist/executor/validate.d.ts +20 -1
  97. package/dist/executor/validate.d.ts.map +1 -1
  98. package/dist/executor/validate.js +16 -1
  99. package/dist/executor/validate.js.map +1 -1
  100. package/dist/index.d.ts +1 -0
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +1 -0
  103. package/dist/index.js.map +1 -1
  104. package/dist/pipeline/runner.d.ts.map +1 -1
  105. package/dist/pipeline/runner.js +139 -6
  106. package/dist/pipeline/runner.js.map +1 -1
  107. package/dist/pipeline/session-volume-check.d.ts +38 -0
  108. package/dist/pipeline/session-volume-check.d.ts.map +1 -0
  109. package/dist/pipeline/session-volume-check.js +45 -0
  110. package/dist/pipeline/session-volume-check.js.map +1 -0
  111. package/dist/pm/scheduler.d.ts +14 -0
  112. package/dist/pm/scheduler.d.ts.map +1 -1
  113. package/dist/pm/scheduler.js +9 -5
  114. package/dist/pm/scheduler.js.map +1 -1
  115. package/dist/server.d.ts.map +1 -1
  116. package/dist/server.js +16 -0
  117. package/dist/server.js.map +1 -1
  118. package/dist/types.d.ts +8 -0
  119. package/dist/types.d.ts.map +1 -1
  120. package/dist/types.js +19 -0
  121. package/dist/types.js.map +1 -1
  122. package/package.json +1 -1
@@ -45,7 +45,12 @@ describe("AgenticDeepReviewProvider", () => {
45
45
  expect(runs[0].outputTokens).toBe(50);
46
46
  expect(runs[0].durationMs).toBeGreaterThanOrEqual(0);
47
47
  expect(runDeepReviewMock).toHaveBeenCalledOnce();
48
- expect(runDeepReviewMock).toHaveBeenCalledWith(handoff, "/tmp/x");
48
+ // BEC-227: signature converted to single options object so session
49
+ // resume info (`agentSessionId`, `isFirstResumableStage`, `model`)
50
+ // can be threaded through. Legacy callers omit those fields; the
51
+ // provider defaults `agentSessionId` to null and isFirstResumableStage
52
+ // to false, which yields the same fresh-session SDK call shape.
53
+ expect(runDeepReviewMock).toHaveBeenCalledWith(expect.objectContaining({ handoff, workdir: "/tmp/x" }));
49
54
  });
50
55
  it("returns failed run with errorMessage when runDeepReview throws", async () => {
51
56
  runDeepReviewMock.mockRejectedValue(new Error("agent sdk down"));
@@ -1 +1 @@
1
- {"version":3,"file":"agentic-deep-review-provider.test.js","sourceRoot":"","sources":["../../src/__tests__/agentic-deep-review-provider.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agentic-deep-review-provider.test.js","sourceRoot":"","sources":["../../src/__tests__/agentic-deep-review-provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAG9D,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAClC,EAAE,CAAC,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,aAAa,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IACjE,4BAA4B,EAAE,CAAC,QAAmB,EAAE,EAAE,CAAC,QAAQ;CAChE,CAAC,CAAC,CAAC;AAEJ,MAAM,WAAW,GAAG,GAAoB,EAAE,CAAC,CAAC;IAC1C,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,QAAQ;IACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACnC,OAAO,EAAE,EAAE;IACX,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;IAClE,WAAW,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE;CAC9D,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,UAAU,CAAC,GAAG,EAAE,GAAG,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,iBAAiB,CAAC,iBAAiB,CAAC;YAClC,QAAQ,EAAE;gBACR,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;aAC1F;YACD,WAAW,EAAE,GAAG;YAChB,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;QAEH,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAChD,2CAA2C,CAC5C,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,yBAAyB,EAAE,CAAC;QAEjD,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC;YACpC,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,QAAQ;YACjB,OAAO;YACP,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACjD,mEAAmE;QACnE,mEAAmE;QACnE,iEAAiE;QACjE,uEAAuE;QACvE,gEAAgE;QAChE,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAC5C,MAAM,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CACxD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,iBAAiB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACjE,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAChD,2CAA2C,CAC5C,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,yBAAyB,EAAE,CAAC;QAEjD,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC;YACpC,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,QAAQ;YACjB,OAAO;YACP,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=audit-session-events.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-session-events.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/audit-session-events.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { agentSessionCreatedEvent, agentSessionResumedEvent, agentSessionMissingFallbackEvent, systemSessionVolumeWarningEvent, } from "../audit/events.js";
3
+ describe("agent session audit events (BEC-227)", () => {
4
+ it("agentSessionCreatedEvent builds the canonical shape", () => {
5
+ const e = agentSessionCreatedEvent({
6
+ runId: "run-1",
7
+ issueId: "BEC-227",
8
+ sessionId: "uuid-abc",
9
+ });
10
+ expect(e.eventType).toBe("pipeline.agent_session_created");
11
+ expect(e.payload).toMatchObject({ runId: "run-1", issueId: "BEC-227", sessionId: "uuid-abc" });
12
+ });
13
+ it("agentSessionResumedEvent includes priorMessageCount", () => {
14
+ const e = agentSessionResumedEvent({
15
+ runId: "run-1",
16
+ issueId: "BEC-227",
17
+ sessionId: "uuid-abc",
18
+ stage: "implement",
19
+ priorMessageCount: 42,
20
+ });
21
+ expect(e.eventType).toBe("pipeline.agent_session_resumed");
22
+ expect(e.payload.priorMessageCount).toBe(42);
23
+ });
24
+ it("agentSessionMissingFallbackEvent records the missing path", () => {
25
+ const e = agentSessionMissingFallbackEvent({
26
+ runId: "run-1",
27
+ issueId: "BEC-227",
28
+ sessionId: "uuid-abc",
29
+ reason: "jsonl-not-found",
30
+ });
31
+ expect(e.eventType).toBe("pipeline.agent_session_missing_fallback");
32
+ expect(e.payload.reason).toBe("jsonl-not-found");
33
+ });
34
+ it("systemSessionVolumeWarningEvent fires at boot", () => {
35
+ const e = systemSessionVolumeWarningEvent({ projectsDir: "/home/ura/.claude/projects", reason: "tmpfs" });
36
+ expect(e.eventType).toBe("system.session_volume_warning");
37
+ });
38
+ });
39
+ //# sourceMappingURL=audit-session-events.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-session-events.test.js","sourceRoot":"","sources":["../../src/__tests__/audit-session-events.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,oBAAoB,CAAC;AAE5B,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,GAAG,wBAAwB,CAAC;YACjC,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,UAAU;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC3D,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,GAAG,wBAAwB,CAAC;YACjC,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,UAAU;YACrB,KAAK,EAAE,WAAW;YAClB,iBAAiB,EAAE,EAAE;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC3D,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,GAAG,gCAAgC,CAAC;YACzC,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,iBAAiB;SAC1B,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACpE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,+BAA+B,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1G,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=db-migration-agent-session-id.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-migration-agent-session-id.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/db-migration-agent-session-id.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { createDb } from "../db/client.js";
3
+ import { pipelineRuns } from "../db/schema.js";
4
+ describe("agent_session_id migration (BEC-227)", () => {
5
+ it("pipelineRuns has agentSessionId column on a fresh SQLite db", async () => {
6
+ const db = await createDb({ driver: "sqlite", connectionString: ":memory:" });
7
+ await db.insert(pipelineRuns).values({
8
+ id: "test-run-1",
9
+ issueId: "BEC-227",
10
+ issueTitle: "test",
11
+ repoUrl: "https://example.com/repo",
12
+ pipelineKey: "auto-implement",
13
+ status: "queued",
14
+ startedAt: new Date(),
15
+ agentSessionId: "session-uuid-abc",
16
+ });
17
+ const rows = await db.select().from(pipelineRuns);
18
+ expect(rows[0].agentSessionId).toBe("session-uuid-abc");
19
+ });
20
+ it("agentSessionId is nullable (legacy rows)", async () => {
21
+ const db = await createDb({ driver: "sqlite", connectionString: ":memory:" });
22
+ await db.insert(pipelineRuns).values({
23
+ id: "legacy-run-1",
24
+ issueId: "BEC-227",
25
+ issueTitle: "legacy",
26
+ repoUrl: "https://example.com/repo",
27
+ pipelineKey: "auto-implement",
28
+ status: "queued",
29
+ startedAt: new Date(),
30
+ });
31
+ const rows = await db.select().from(pipelineRuns);
32
+ expect(rows[0].agentSessionId).toBeNull();
33
+ });
34
+ });
35
+ //# sourceMappingURL=db-migration-agent-session-id.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-migration-agent-session-id.test.js","sourceRoot":"","sources":["../../src/__tests__/db-migration-agent-session-id.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAc,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,EAAE,GAAU,MAAM,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,CAAC;QACrF,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;YACnC,EAAE,EAAE,YAAY;YAChB,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,0BAA0B;YACnC,WAAW,EAAE,gBAAgB;YAC7B,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,cAAc,EAAE,kBAAkB;SACnC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,EAAE,GAAU,MAAM,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,CAAC;QACrF,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;YACnC,EAAE,EAAE,cAAc;YAClB,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,QAAQ;YACpB,OAAO,EAAE,0BAA0B;YACnC,WAAW,EAAE,gBAAgB;YAC7B,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * BEC-227 — Task 11: deep-review SDK call session resume.
3
+ *
4
+ * `runDeepReview` should pass `options.resume = agentSessionId` to the
5
+ * Claude Agent SDK when:
6
+ * - `agentSessionId` is non-null
7
+ * - `isFirstResumableStage === false`
8
+ * - the resolved model is in the resumable family (sonnet/opus)
9
+ * - the transcript JSONL exists on disk
10
+ *
11
+ * Otherwise (null sessionId, fresh stage, non-resumable model, missing
12
+ * transcript) `options.resume` must be undefined.
13
+ *
14
+ * The OpenRouter fanout providers are deliberately untouched — they have
15
+ * no SDK session of their own to resume.
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=deep-review-resume.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-review-resume.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/deep-review-resume.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * BEC-227 — Task 11: deep-review SDK call session resume.
3
+ *
4
+ * `runDeepReview` should pass `options.resume = agentSessionId` to the
5
+ * Claude Agent SDK when:
6
+ * - `agentSessionId` is non-null
7
+ * - `isFirstResumableStage === false`
8
+ * - the resolved model is in the resumable family (sonnet/opus)
9
+ * - the transcript JSONL exists on disk
10
+ *
11
+ * Otherwise (null sessionId, fresh stage, non-resumable model, missing
12
+ * transcript) `options.resume` must be undefined.
13
+ *
14
+ * The OpenRouter fanout providers are deliberately untouched — they have
15
+ * no SDK session of their own to resume.
16
+ */
17
+ import { describe, it, expect, vi, beforeEach } from "vitest";
18
+ // SDK query mock — capture the options passed in.
19
+ const queryMock = vi.fn();
20
+ vi.mock("@anthropic-ai/claude-agent-sdk", () => ({ query: queryMock }));
21
+ // Force transcriptExists → true so the resume branch fires without needing
22
+ // real filesystem state. This matches the Task-7 pattern in
23
+ // session-resume-fallback.test.ts.
24
+ vi.mock("../executor/session-store.js", async () => {
25
+ const real = await vi.importActual("../executor/session-store.js");
26
+ return {
27
+ ...real,
28
+ transcriptExists: vi.fn().mockReturnValue(true),
29
+ };
30
+ });
31
+ // Silence audit writer — Task 11 doesn't assert audit events.
32
+ vi.mock("../audit/writer.js", async () => {
33
+ const real = await vi.importActual("../audit/writer.js");
34
+ return {
35
+ ...real,
36
+ logAuditEvent: vi.fn().mockResolvedValue(undefined),
37
+ };
38
+ });
39
+ import { runDeepReview } from "../executor/deep-review.js";
40
+ const makeHandoff = () => ({
41
+ runId: "r1",
42
+ issueId: "i1",
43
+ stage: "review",
44
+ timestamp: new Date().toISOString(),
45
+ summary: "summary",
46
+ filesChanged: ["a.ts"],
47
+ approach: "x",
48
+ context: { issueIntent: "x", constraints: [], assumptions: [] },
49
+ tokenBudget: { contextTokensUsed: 0, recommendedMaxTurns: 0 },
50
+ });
51
+ function makeMinimalStream() {
52
+ return (async function* () {
53
+ yield { type: "system" };
54
+ })();
55
+ }
56
+ describe("deep-review resume (BEC-227, Task 11)", () => {
57
+ beforeEach(() => {
58
+ queryMock.mockReset();
59
+ queryMock.mockImplementation(() => makeMinimalStream());
60
+ });
61
+ it("agentSessionId provided + resumable model + not-first → passes resume in options", async () => {
62
+ await runDeepReview({
63
+ handoff: makeHandoff(),
64
+ workdir: "/tmp/x",
65
+ agentSessionId: "uuid-1",
66
+ isFirstResumableStage: false,
67
+ model: "claude-sonnet-4-6",
68
+ });
69
+ expect(queryMock).toHaveBeenCalled();
70
+ // 3 parallel sub-agents — each call should carry the same resume opt.
71
+ for (const call of queryMock.mock.calls) {
72
+ expect(call[0].options.resume).toBe("uuid-1");
73
+ expect(call[0].options.sessionId).toBeUndefined();
74
+ }
75
+ });
76
+ it("agentSessionId null → no resume in options", async () => {
77
+ await runDeepReview({
78
+ handoff: makeHandoff(),
79
+ workdir: "/tmp/x",
80
+ agentSessionId: null,
81
+ model: "claude-sonnet-4-6",
82
+ });
83
+ expect(queryMock).toHaveBeenCalled();
84
+ for (const call of queryMock.mock.calls) {
85
+ expect(call[0].options.resume).toBeUndefined();
86
+ expect(call[0].options.sessionId).toBeUndefined();
87
+ }
88
+ });
89
+ });
90
+ //# sourceMappingURL=deep-review-resume.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-review-resume.test.js","sourceRoot":"","sources":["../../src/__tests__/deep-review-resume.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Tests for BEC-227 — Task 6:
3
+ * Thread `agentSessionId` + `isFirstResumableStage` into `executeStage()`,
4
+ * verify the resulting SDK `query()` options carry the right session shape:
5
+ *
6
+ * - First resumable stage → `options.sessionId` (NOT `options.resume`)
7
+ * - Non-first resumable stage → `options.resume` (NOT `options.sessionId`)
8
+ * - `agentSessionId === null` → neither in options
9
+ *
10
+ * Also asserts the Track C-1 (Phase 1, default-on) `systemPrompt` shape:
11
+ * - `{ type: "preset", preset: "claude_code", excludeDynamicSections: true }`
12
+ *
13
+ * The SDK `query` function and side-effecting helpers are mocked so this is
14
+ * a pure options-shape test — no Agent SDK calls, no git ops, no auth checks.
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=execute-stage-session-opts.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-stage-session-opts.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/execute-stage-session-opts.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Tests for BEC-227 — Task 6:
3
+ * Thread `agentSessionId` + `isFirstResumableStage` into `executeStage()`,
4
+ * verify the resulting SDK `query()` options carry the right session shape:
5
+ *
6
+ * - First resumable stage → `options.sessionId` (NOT `options.resume`)
7
+ * - Non-first resumable stage → `options.resume` (NOT `options.sessionId`)
8
+ * - `agentSessionId === null` → neither in options
9
+ *
10
+ * Also asserts the Track C-1 (Phase 1, default-on) `systemPrompt` shape:
11
+ * - `{ type: "preset", preset: "claude_code", excludeDynamicSections: true }`
12
+ *
13
+ * The SDK `query` function and side-effecting helpers are mocked so this is
14
+ * a pure options-shape test — no Agent SDK calls, no git ops, no auth checks.
15
+ */
16
+ import { describe, it, expect, vi, beforeEach } from "vitest";
17
+ // ── Module mocks (declared before imports) ────────────────────────────────────
18
+ vi.mock("@anthropic-ai/claude-agent-sdk", () => ({
19
+ query: vi.fn(),
20
+ }));
21
+ vi.mock("../executor/auth-check.js", () => ({
22
+ isClaudeAuthValid: vi.fn().mockResolvedValue(true),
23
+ resolveClaudeAuth: vi.fn().mockReturnValue({ method: "session" }),
24
+ }));
25
+ vi.mock("../executor/extract-handoff.js", () => ({
26
+ extractHandoff: vi.fn().mockResolvedValue({
27
+ artifact: {
28
+ runId: "run-bec227",
29
+ issueId: "BEC-227",
30
+ stage: "implement",
31
+ timestamp: new Date().toISOString(),
32
+ summary: "Stub handoff",
33
+ filesChanged: [],
34
+ approach: "Stub",
35
+ context: { issueIntent: "x", constraints: [], assumptions: [] },
36
+ tokenBudget: { contextTokensUsed: 0, recommendedMaxTurns: 1 },
37
+ },
38
+ structured: true,
39
+ }),
40
+ }));
41
+ // BEC-227 Task 7: the resume branch now checks JSONL existence on disk before
42
+ // setting `resume`. These tests fixture a `/tmp/bec227-workdir` cwd that does
43
+ // not actually have a transcript, so we force the existence check to return
44
+ // true to keep the resume call shape exercised here.
45
+ vi.mock("../executor/session-store.js", async () => {
46
+ const real = await vi.importActual("../executor/session-store.js");
47
+ return {
48
+ ...real,
49
+ transcriptExists: vi.fn().mockReturnValue(true),
50
+ };
51
+ });
52
+ // ── Imports ───────────────────────────────────────────────────────────────────
53
+ import { executeStage } from "../executor/executor.js";
54
+ import { createDb } from "../db/client.js";
55
+ import { pipelineRuns } from "../db/schema.js";
56
+ // ── Fixtures ──────────────────────────────────────────────────────────────────
57
+ const testIssue = {
58
+ id: "BEC-227",
59
+ slug: "agent-session-continuity",
60
+ title: "Agent session continuity Phase 1",
61
+ description: "Thread session opts through executeStage",
62
+ acceptanceCriteria: ["session opts passed correctly"],
63
+ labels: ["auto-implement"],
64
+ priority: 4,
65
+ };
66
+ const testRepoConfig = {
67
+ url: "https://github.com/test-org/test-repo",
68
+ defaultBranch: "main",
69
+ testCommand: "echo ok",
70
+ buildCommand: "echo ok",
71
+ };
72
+ /** Seed the required pipeline_runs parent row so stage_runs FK is satisfied. */
73
+ async function seedPipelineRun(db, runId) {
74
+ await db.insert(pipelineRuns).values({
75
+ id: runId,
76
+ issueId: testIssue.id,
77
+ issueTitle: testIssue.title,
78
+ pipelineKey: "auto-implement",
79
+ repoUrl: testRepoConfig.url,
80
+ branch: `agent/${runId}`,
81
+ status: "running",
82
+ });
83
+ }
84
+ /** Minimal Agent SDK stream — one assistant text message then end. */
85
+ function makeMinimalStream() {
86
+ return (async function* () {
87
+ yield {
88
+ type: "assistant",
89
+ content: [{ type: "text", text: "done" }],
90
+ };
91
+ })();
92
+ }
93
+ // ── Tests ─────────────────────────────────────────────────────────────────────
94
+ describe("executeStage — agent session options (BEC-227, Task 6)", () => {
95
+ let db;
96
+ beforeEach(async () => {
97
+ db = await createDb({ connectionString: ":memory:" });
98
+ vi.clearAllMocks();
99
+ });
100
+ it("first resumable stage: passes options.sessionId, NOT options.resume", async () => {
101
+ const { query } = await import("@anthropic-ai/claude-agent-sdk");
102
+ query.mockReturnValue(makeMinimalStream());
103
+ await seedPipelineRun(db, "run-first-resumable");
104
+ await executeStage({
105
+ runId: "run-first-resumable",
106
+ issueId: testIssue.id,
107
+ stage: "reproduce",
108
+ sanitizedIssue: testIssue,
109
+ repoConfig: testRepoConfig,
110
+ workdir: "/tmp/bec227-workdir",
111
+ db,
112
+ agentSessionId: "uuid-1",
113
+ isFirstResumableStage: true,
114
+ });
115
+ expect(query).toHaveBeenCalledOnce();
116
+ const opts = query.mock.calls[0][0].options;
117
+ expect(opts.sessionId).toBe("uuid-1");
118
+ expect(opts.resume).toBeUndefined();
119
+ // Track C-1: systemPrompt preset with excludeDynamicSections=true
120
+ expect(opts.systemPrompt).toEqual({
121
+ type: "preset",
122
+ preset: "claude_code",
123
+ excludeDynamicSections: true,
124
+ });
125
+ });
126
+ it("non-first resumable stage: passes options.resume, NOT options.sessionId", async () => {
127
+ const { query } = await import("@anthropic-ai/claude-agent-sdk");
128
+ query.mockReturnValue(makeMinimalStream());
129
+ await seedPipelineRun(db, "run-non-first-resumable");
130
+ await executeStage({
131
+ runId: "run-non-first-resumable",
132
+ issueId: testIssue.id,
133
+ stage: "implement",
134
+ sanitizedIssue: testIssue,
135
+ repoConfig: testRepoConfig,
136
+ workdir: "/tmp/bec227-workdir",
137
+ db,
138
+ agentSessionId: "uuid-1",
139
+ isFirstResumableStage: false,
140
+ });
141
+ expect(query).toHaveBeenCalledOnce();
142
+ const opts = query.mock.calls[0][0].options;
143
+ expect(opts.resume).toBe("uuid-1");
144
+ expect(opts.sessionId).toBeUndefined();
145
+ // Track C-1 is on regardless of session state
146
+ expect(opts.systemPrompt).toEqual({
147
+ type: "preset",
148
+ preset: "claude_code",
149
+ excludeDynamicSections: true,
150
+ });
151
+ });
152
+ it("agentSessionId=null: neither sessionId nor resume in options, but excludeDynamicSections still ON", async () => {
153
+ const { query } = await import("@anthropic-ai/claude-agent-sdk");
154
+ query.mockReturnValue(makeMinimalStream());
155
+ await seedPipelineRun(db, "run-flag-off");
156
+ await executeStage({
157
+ runId: "run-flag-off",
158
+ issueId: testIssue.id,
159
+ stage: "implement",
160
+ sanitizedIssue: testIssue,
161
+ repoConfig: testRepoConfig,
162
+ workdir: "/tmp/bec227-workdir",
163
+ db,
164
+ agentSessionId: null,
165
+ isFirstResumableStage: false,
166
+ });
167
+ expect(query).toHaveBeenCalledOnce();
168
+ const opts = query.mock.calls[0][0].options;
169
+ expect(opts.sessionId).toBeUndefined();
170
+ expect(opts.resume).toBeUndefined();
171
+ // Track C-1 ships unconditionally — even when no session is involved
172
+ expect(opts.systemPrompt).toEqual({
173
+ type: "preset",
174
+ preset: "claude_code",
175
+ excludeDynamicSections: true,
176
+ });
177
+ });
178
+ });
179
+ //# sourceMappingURL=execute-stage-session-opts.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-stage-session-opts.test.js","sourceRoot":"","sources":["../../src/__tests__/execute-stage-session-opts.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ralph-handoff-suppression.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralph-handoff-suppression.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ralph-handoff-suppression.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { handoffBlock } from "../executor/prompt/templates.js";
3
+ const handoff = {
4
+ runId: "run-1",
5
+ issueId: "ENG-1",
6
+ stage: "implement",
7
+ timestamp: "2026-01-01T00:00:00Z",
8
+ summary: "Implemented feature X",
9
+ filesChanged: ["a.ts"],
10
+ approach: "Wrote function foo",
11
+ context: {
12
+ issueIntent: "Add feature X",
13
+ constraints: [],
14
+ assumptions: [],
15
+ },
16
+ tokenBudget: {
17
+ contextTokensUsed: 100,
18
+ recommendedMaxTurns: 5,
19
+ },
20
+ };
21
+ describe("handoffBlock suppression (BEC-227)", () => {
22
+ it("suppress=true → returns empty string", () => {
23
+ const out = handoffBlock(handoff, { suppress: true });
24
+ expect(out).toBe("");
25
+ });
26
+ it("suppress=false → returns XML block as before", () => {
27
+ const out = handoffBlock(handoff, { suppress: false });
28
+ expect(out).toContain("<previous-stage-context>");
29
+ expect(out).toContain("Implemented feature X");
30
+ });
31
+ it("suppress option omitted → defaults to false (legacy behavior)", () => {
32
+ const out = handoffBlock(handoff);
33
+ expect(out).toContain("<previous-stage-context>");
34
+ expect(out).toContain("Implemented feature X");
35
+ });
36
+ });
37
+ //# sourceMappingURL=ralph-handoff-suppression.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralph-handoff-suppression.test.js","sourceRoot":"","sources":["../../src/__tests__/ralph-handoff-suppression.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,MAAM,OAAO,GAAoB;IAC/B,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,WAAW;IAClB,SAAS,EAAE,sBAAsB;IACjC,OAAO,EAAE,uBAAuB;IAChC,YAAY,EAAE,CAAC,MAAM,CAAC;IACtB,QAAQ,EAAE,oBAAoB;IAC9B,OAAO,EAAE;QACP,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE;KAChB;IACD,WAAW,EAAE;QACX,iBAAiB,EAAE,GAAG;QACtB,mBAAmB,EAAE,CAAC;KACvB;CACF,CAAC;AAEF,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-policy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-policy.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/session-policy.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { isResumable, isAlwaysFreshStage, ALWAYS_FRESH_STAGES } from "../executor/session-policy.js";
3
+ describe("session-policy (BEC-227)", () => {
4
+ describe("isAlwaysFreshStage", () => {
5
+ it("validate stage is always fresh", () => {
6
+ expect(isAlwaysFreshStage("validate")).toBe(true);
7
+ });
8
+ it("ralph-check stage is always fresh", () => {
9
+ expect(isAlwaysFreshStage("ralph-check")).toBe(true);
10
+ });
11
+ it("implement stage is NOT always fresh", () => {
12
+ expect(isAlwaysFreshStage("implement")).toBe(false);
13
+ });
14
+ it("ALWAYS_FRESH_STAGES set is exposed and immutable from caller's perspective", () => {
15
+ expect(ALWAYS_FRESH_STAGES.has("validate")).toBe(true);
16
+ expect(ALWAYS_FRESH_STAGES.has("implement")).toBe(false);
17
+ });
18
+ });
19
+ describe("isResumable", () => {
20
+ it("Sonnet on implement → resumable", () => {
21
+ expect(isResumable("implement", "claude-sonnet-4-6")).toBe(true);
22
+ });
23
+ it("Opus on implement → resumable (same family)", () => {
24
+ expect(isResumable("implement", "claude-opus-4-7")).toBe(true);
25
+ });
26
+ it("Haiku on implement → not resumable (different family)", () => {
27
+ expect(isResumable("implement", "claude-haiku-4-5")).toBe(false);
28
+ });
29
+ it("any model on validate → not resumable", () => {
30
+ expect(isResumable("validate", "claude-sonnet-4-6")).toBe(false);
31
+ });
32
+ it("Sonnet on review → resumable", () => {
33
+ expect(isResumable("review", "claude-sonnet-4-6")).toBe(true);
34
+ });
35
+ it("Sonnet on deep-review → resumable", () => {
36
+ expect(isResumable("deep-review", "claude-sonnet-4-6")).toBe(true);
37
+ });
38
+ it("non-Claude model → not resumable", () => {
39
+ expect(isResumable("review", "qwen/qwen-3-plus")).toBe(false);
40
+ expect(isResumable("review", "openai/gpt-oss-120b")).toBe(false);
41
+ });
42
+ });
43
+ });
44
+ //# sourceMappingURL=session-policy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-policy.test.js","sourceRoot":"","sources":["../../src/__tests__/session-policy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAErG,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;YACpF,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9D,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Tests for BEC-227 — Task 7:
3
+ * JSONL-exists pre-check on the resume path of `executeStage()`.
4
+ *
5
+ * Scenario covered:
6
+ * - When `agentSessionId` is set and `isFirstResumableStage=false` BUT the
7
+ * SDK transcript JSONL file does NOT exist on disk for the (cwd, sessionId)
8
+ * tuple, the executor must:
9
+ * 1. Drop the resume option (call shape is fresh: no `sessionId`, no `resume`)
10
+ * 2. Emit the `pipeline.agent_session_missing_fallback` audit event with
11
+ * `reason: "jsonl-not-found"`
12
+ * 3. Log a warning
13
+ *
14
+ * The SDK `query` and `logAuditEvent` are mocked, and `transcriptExists` is
15
+ * forced to return `false` so this test does not depend on the host filesystem.
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=session-resume-fallback.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-resume-fallback.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/session-resume-fallback.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}