@urateam/core 0.1.50 → 0.1.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/agentic-deep-review-provider.test.js +6 -1
- package/dist/__tests__/agentic-deep-review-provider.test.js.map +1 -1
- package/dist/__tests__/audit-session-events.test.d.ts +2 -0
- package/dist/__tests__/audit-session-events.test.d.ts.map +1 -0
- package/dist/__tests__/audit-session-events.test.js +39 -0
- package/dist/__tests__/audit-session-events.test.js.map +1 -0
- package/dist/__tests__/db-migration-agent-session-id.test.d.ts +2 -0
- package/dist/__tests__/db-migration-agent-session-id.test.d.ts.map +1 -0
- package/dist/__tests__/db-migration-agent-session-id.test.js +35 -0
- package/dist/__tests__/db-migration-agent-session-id.test.js.map +1 -0
- package/dist/__tests__/deep-review-resume.test.d.ts +18 -0
- package/dist/__tests__/deep-review-resume.test.d.ts.map +1 -0
- package/dist/__tests__/deep-review-resume.test.js +90 -0
- package/dist/__tests__/deep-review-resume.test.js.map +1 -0
- package/dist/__tests__/execute-stage-session-opts.test.d.ts +17 -0
- package/dist/__tests__/execute-stage-session-opts.test.d.ts.map +1 -0
- package/dist/__tests__/execute-stage-session-opts.test.js +188 -0
- package/dist/__tests__/execute-stage-session-opts.test.js.map +1 -0
- package/dist/__tests__/ralph-handoff-suppression.test.d.ts +2 -0
- package/dist/__tests__/ralph-handoff-suppression.test.d.ts.map +1 -0
- package/dist/__tests__/ralph-handoff-suppression.test.js +37 -0
- package/dist/__tests__/ralph-handoff-suppression.test.js.map +1 -0
- package/dist/__tests__/session-lazy-creation.test.d.ts +17 -0
- package/dist/__tests__/session-lazy-creation.test.d.ts.map +1 -0
- package/dist/__tests__/session-lazy-creation.test.js +146 -0
- package/dist/__tests__/session-lazy-creation.test.js.map +1 -0
- package/dist/__tests__/session-policy.test.d.ts +2 -0
- package/dist/__tests__/session-policy.test.d.ts.map +1 -0
- package/dist/__tests__/session-policy.test.js +44 -0
- package/dist/__tests__/session-policy.test.js.map +1 -0
- package/dist/__tests__/session-resume-fallback.test.d.ts +22 -0
- package/dist/__tests__/session-resume-fallback.test.d.ts.map +1 -0
- package/dist/__tests__/session-resume-fallback.test.js +145 -0
- package/dist/__tests__/session-resume-fallback.test.js.map +1 -0
- package/dist/__tests__/session-resume-flag.test.d.ts +2 -0
- package/dist/__tests__/session-resume-flag.test.d.ts.map +1 -0
- package/dist/__tests__/session-resume-flag.test.js +87 -0
- package/dist/__tests__/session-resume-flag.test.js.map +1 -0
- package/dist/__tests__/session-store.test.d.ts +2 -0
- package/dist/__tests__/session-store.test.d.ts.map +1 -0
- package/dist/__tests__/session-store.test.js +44 -0
- package/dist/__tests__/session-store.test.js.map +1 -0
- package/dist/__tests__/session-volume-check.test.d.ts +2 -0
- package/dist/__tests__/session-volume-check.test.d.ts.map +1 -0
- package/dist/__tests__/session-volume-check.test.js +28 -0
- package/dist/__tests__/session-volume-check.test.js.map +1 -0
- package/dist/__tests__/validate-run-mode.test.d.ts +2 -0
- package/dist/__tests__/validate-run-mode.test.d.ts.map +1 -0
- package/dist/__tests__/validate-run-mode.test.js +102 -0
- package/dist/__tests__/validate-run-mode.test.js.map +1 -0
- package/dist/__tests__/zombie-age-default.test.d.ts +2 -0
- package/dist/__tests__/zombie-age-default.test.d.ts.map +1 -0
- package/dist/__tests__/zombie-age-default.test.js +24 -0
- package/dist/__tests__/zombie-age-default.test.js.map +1 -0
- package/dist/audit/events.d.ts +45 -0
- package/dist/audit/events.d.ts.map +1 -1
- package/dist/audit/events.js +79 -0
- package/dist/audit/events.js.map +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +4 -1
- package/dist/db/client.js.map +1 -1
- package/dist/db/schema.d.ts +19 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +2 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/executor/deep-review.d.ts +28 -1
- package/dist/executor/deep-review.d.ts.map +1 -1
- package/dist/executor/deep-review.js +113 -9
- package/dist/executor/deep-review.js.map +1 -1
- package/dist/executor/executor.d.ts +33 -0
- package/dist/executor/executor.d.ts.map +1 -1
- package/dist/executor/executor.js +104 -4
- package/dist/executor/executor.js.map +1 -1
- package/dist/executor/index.d.ts +7 -0
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +7 -0
- package/dist/executor/index.js.map +1 -1
- package/dist/executor/prompt/assembler.d.ts +7 -1
- package/dist/executor/prompt/assembler.d.ts.map +1 -1
- package/dist/executor/prompt/assembler.js +9 -3
- package/dist/executor/prompt/assembler.js.map +1 -1
- package/dist/executor/prompt/templates.d.ts +25 -6
- package/dist/executor/prompt/templates.d.ts.map +1 -1
- package/dist/executor/prompt/templates.js +21 -12
- package/dist/executor/prompt/templates.js.map +1 -1
- package/dist/executor/review/agentic-deep-review.d.ts.map +1 -1
- package/dist/executor/review/agentic-deep-review.js +15 -1
- package/dist/executor/review/agentic-deep-review.js.map +1 -1
- package/dist/executor/review/review-provider.d.ts +21 -0
- package/dist/executor/review/review-provider.d.ts.map +1 -1
- package/dist/executor/review/review-provider.js.map +1 -1
- package/dist/executor/session-policy.d.ts +38 -0
- package/dist/executor/session-policy.d.ts.map +1 -0
- package/dist/executor/session-policy.js +66 -0
- package/dist/executor/session-policy.js.map +1 -0
- package/dist/executor/session-store.d.ts +32 -0
- package/dist/executor/session-store.d.ts.map +1 -0
- package/dist/executor/session-store.js +38 -0
- package/dist/executor/session-store.js.map +1 -0
- package/dist/executor/validate.d.ts +20 -1
- package/dist/executor/validate.d.ts.map +1 -1
- package/dist/executor/validate.js +16 -1
- package/dist/executor/validate.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +139 -6
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/pipeline/session-volume-check.d.ts +38 -0
- package/dist/pipeline/session-volume-check.d.ts.map +1 -0
- package/dist/pipeline/session-volume-check.js +45 -0
- package/dist/pipeline/session-volume-check.js.map +1 -0
- package/dist/pm/scheduler.d.ts +14 -0
- package/dist/pm/scheduler.d.ts.map +1 -1
- package/dist/pm/scheduler.js +9 -5
- package/dist/pm/scheduler.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +16 -0
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -1
- 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
|
-
|
|
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":"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,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;
|
|
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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"}
|
|
@@ -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 @@
|
|
|
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,188 @@
|
|
|
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 / BEC-231 update: under BEC-231 the executor derives the
|
|
42
|
+
// session shape from `transcriptExists()` on every stage entry, not from an
|
|
43
|
+
// in-memory `isFirstResumableStage` flag. Mock the helper so each test below
|
|
44
|
+
// can set the return value to exercise either the "first/create" path
|
|
45
|
+
// (false → `sessionId:`) or the "resume" path (true → `resume:`).
|
|
46
|
+
const { transcriptExistsMock } = vi.hoisted(() => ({
|
|
47
|
+
transcriptExistsMock: vi.fn().mockReturnValue(true),
|
|
48
|
+
}));
|
|
49
|
+
vi.mock("../executor/session-store.js", async () => {
|
|
50
|
+
const real = await vi.importActual("../executor/session-store.js");
|
|
51
|
+
return {
|
|
52
|
+
...real,
|
|
53
|
+
transcriptExists: transcriptExistsMock,
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
// ── Imports ───────────────────────────────────────────────────────────────────
|
|
57
|
+
import { executeStage } from "../executor/executor.js";
|
|
58
|
+
import { createDb } from "../db/client.js";
|
|
59
|
+
import { pipelineRuns } from "../db/schema.js";
|
|
60
|
+
// ── Fixtures ──────────────────────────────────────────────────────────────────
|
|
61
|
+
const testIssue = {
|
|
62
|
+
id: "BEC-227",
|
|
63
|
+
slug: "agent-session-continuity",
|
|
64
|
+
title: "Agent session continuity Phase 1",
|
|
65
|
+
description: "Thread session opts through executeStage",
|
|
66
|
+
acceptanceCriteria: ["session opts passed correctly"],
|
|
67
|
+
labels: ["auto-implement"],
|
|
68
|
+
priority: 4,
|
|
69
|
+
};
|
|
70
|
+
const testRepoConfig = {
|
|
71
|
+
url: "https://github.com/test-org/test-repo",
|
|
72
|
+
defaultBranch: "main",
|
|
73
|
+
testCommand: "echo ok",
|
|
74
|
+
buildCommand: "echo ok",
|
|
75
|
+
};
|
|
76
|
+
/** Seed the required pipeline_runs parent row so stage_runs FK is satisfied. */
|
|
77
|
+
async function seedPipelineRun(db, runId) {
|
|
78
|
+
await db.insert(pipelineRuns).values({
|
|
79
|
+
id: runId,
|
|
80
|
+
issueId: testIssue.id,
|
|
81
|
+
issueTitle: testIssue.title,
|
|
82
|
+
pipelineKey: "auto-implement",
|
|
83
|
+
repoUrl: testRepoConfig.url,
|
|
84
|
+
branch: `agent/${runId}`,
|
|
85
|
+
status: "running",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/** Minimal Agent SDK stream — one assistant text message then end. */
|
|
89
|
+
function makeMinimalStream() {
|
|
90
|
+
return (async function* () {
|
|
91
|
+
yield {
|
|
92
|
+
type: "assistant",
|
|
93
|
+
content: [{ type: "text", text: "done" }],
|
|
94
|
+
};
|
|
95
|
+
})();
|
|
96
|
+
}
|
|
97
|
+
// ── Tests ─────────────────────────────────────────────────────────────────────
|
|
98
|
+
describe("executeStage — agent session options (BEC-227, Task 6)", () => {
|
|
99
|
+
let db;
|
|
100
|
+
beforeEach(async () => {
|
|
101
|
+
db = await createDb({ connectionString: ":memory:" });
|
|
102
|
+
vi.clearAllMocks();
|
|
103
|
+
});
|
|
104
|
+
it("first resumable stage (JSONL absent): passes options.sessionId, NOT options.resume", async () => {
|
|
105
|
+
const { query } = await import("@anthropic-ai/claude-agent-sdk");
|
|
106
|
+
query.mockReturnValue(makeMinimalStream());
|
|
107
|
+
// BEC-231: "first resumable stage" semantically means "JSONL doesn't
|
|
108
|
+
// exist yet" — the create path. Force the existence check to false.
|
|
109
|
+
transcriptExistsMock.mockReturnValue(false);
|
|
110
|
+
await seedPipelineRun(db, "run-first-resumable");
|
|
111
|
+
await executeStage({
|
|
112
|
+
runId: "run-first-resumable",
|
|
113
|
+
issueId: testIssue.id,
|
|
114
|
+
stage: "reproduce",
|
|
115
|
+
sanitizedIssue: testIssue,
|
|
116
|
+
repoConfig: testRepoConfig,
|
|
117
|
+
workdir: "/tmp/bec227-workdir",
|
|
118
|
+
db,
|
|
119
|
+
agentSessionId: "uuid-1",
|
|
120
|
+
isFirstResumableStage: true, // BEC-231: ignored; transcriptExists drives the shape
|
|
121
|
+
});
|
|
122
|
+
expect(query).toHaveBeenCalledOnce();
|
|
123
|
+
const opts = query.mock.calls[0][0].options;
|
|
124
|
+
expect(opts.sessionId).toBe("uuid-1");
|
|
125
|
+
expect(opts.resume).toBeUndefined();
|
|
126
|
+
// Track C-1: systemPrompt preset with excludeDynamicSections=true
|
|
127
|
+
expect(opts.systemPrompt).toEqual({
|
|
128
|
+
type: "preset",
|
|
129
|
+
preset: "claude_code",
|
|
130
|
+
excludeDynamicSections: true,
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
it("non-first resumable stage (JSONL present): passes options.resume, NOT options.sessionId", async () => {
|
|
134
|
+
const { query } = await import("@anthropic-ai/claude-agent-sdk");
|
|
135
|
+
query.mockReturnValue(makeMinimalStream());
|
|
136
|
+
// BEC-231: JSONL is present on disk → resume path
|
|
137
|
+
transcriptExistsMock.mockReturnValue(true);
|
|
138
|
+
await seedPipelineRun(db, "run-non-first-resumable");
|
|
139
|
+
await executeStage({
|
|
140
|
+
runId: "run-non-first-resumable",
|
|
141
|
+
issueId: testIssue.id,
|
|
142
|
+
stage: "implement",
|
|
143
|
+
sanitizedIssue: testIssue,
|
|
144
|
+
repoConfig: testRepoConfig,
|
|
145
|
+
workdir: "/tmp/bec227-workdir",
|
|
146
|
+
db,
|
|
147
|
+
agentSessionId: "uuid-1",
|
|
148
|
+
isFirstResumableStage: false,
|
|
149
|
+
});
|
|
150
|
+
expect(query).toHaveBeenCalledOnce();
|
|
151
|
+
const opts = query.mock.calls[0][0].options;
|
|
152
|
+
expect(opts.resume).toBe("uuid-1");
|
|
153
|
+
expect(opts.sessionId).toBeUndefined();
|
|
154
|
+
// Track C-1 is on regardless of session state
|
|
155
|
+
expect(opts.systemPrompt).toEqual({
|
|
156
|
+
type: "preset",
|
|
157
|
+
preset: "claude_code",
|
|
158
|
+
excludeDynamicSections: true,
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
it("agentSessionId=null: neither sessionId nor resume in options, but excludeDynamicSections still ON", async () => {
|
|
162
|
+
const { query } = await import("@anthropic-ai/claude-agent-sdk");
|
|
163
|
+
query.mockReturnValue(makeMinimalStream());
|
|
164
|
+
await seedPipelineRun(db, "run-flag-off");
|
|
165
|
+
await executeStage({
|
|
166
|
+
runId: "run-flag-off",
|
|
167
|
+
issueId: testIssue.id,
|
|
168
|
+
stage: "implement",
|
|
169
|
+
sanitizedIssue: testIssue,
|
|
170
|
+
repoConfig: testRepoConfig,
|
|
171
|
+
workdir: "/tmp/bec227-workdir",
|
|
172
|
+
db,
|
|
173
|
+
agentSessionId: null,
|
|
174
|
+
isFirstResumableStage: false,
|
|
175
|
+
});
|
|
176
|
+
expect(query).toHaveBeenCalledOnce();
|
|
177
|
+
const opts = query.mock.calls[0][0].options;
|
|
178
|
+
expect(opts.sessionId).toBeUndefined();
|
|
179
|
+
expect(opts.resume).toBeUndefined();
|
|
180
|
+
// Track C-1 ships unconditionally — even when no session is involved
|
|
181
|
+
expect(opts.systemPrompt).toEqual({
|
|
182
|
+
type: "preset",
|
|
183
|
+
preset: "claude_code",
|
|
184
|
+
excludeDynamicSections: true,
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
//# 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 @@
|
|
|
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,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BEC-231 — Lazy / retry SDK session creation.
|
|
3
|
+
*
|
|
4
|
+
* Reproduces the production bug surfaced during the BEC-227 Phase 2 dogfood
|
|
5
|
+
* soak: when the first resumable stage's SDK call fails before any JSONL
|
|
6
|
+
* message is written (auth 401, pre-stream stall, etc.), subsequent stages
|
|
7
|
+
* MUST retry the create path (`sessionId:`) rather than blindly using
|
|
8
|
+
* `resume:` against a transcript that never materialized.
|
|
9
|
+
*
|
|
10
|
+
* The pre-BEC-231 implementation used an in-memory `hasInitiatedSession` flag
|
|
11
|
+
* (flipped after the first resumable stage's CALL, not after the SDK actually
|
|
12
|
+
* wrote a message). The new implementation derives the shape from
|
|
13
|
+
* `transcriptExists()` on every stage entry, so a stage 2 invocation against
|
|
14
|
+
* a non-existent JSONL re-attempts creation.
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=session-lazy-creation.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-lazy-creation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/session-lazy-creation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|