@stigmer/runner 3.12.1 → 3.12.3

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 (77) hide show
  1. package/dist/.build-fingerprint +1 -1
  2. package/dist/activities/execute-cursor/capture-flow.d.ts +5 -4
  3. package/dist/activities/execute-cursor/capture-flow.js +5 -4
  4. package/dist/activities/execute-cursor/capture-flow.js.map +1 -1
  5. package/dist/activities/execute-cursor/cas-observations.d.ts +10 -4
  6. package/dist/activities/execute-cursor/cas-observations.js +10 -4
  7. package/dist/activities/execute-cursor/cas-observations.js.map +1 -1
  8. package/dist/activities/execute-cursor/hook-script.js +39 -13
  9. package/dist/activities/execute-cursor/hook-script.js.map +1 -1
  10. package/dist/activities/execute-cursor/skill-resolver.d.ts +23 -0
  11. package/dist/activities/execute-cursor/skill-resolver.js +121 -32
  12. package/dist/activities/execute-cursor/skill-resolver.js.map +1 -1
  13. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +9 -1
  14. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +13 -2
  15. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
  16. package/dist/activities/execute-deep-agent/cas-capture-backend.d.ts +3 -1
  17. package/dist/activities/execute-deep-agent/cas-capture-backend.js +3 -1
  18. package/dist/activities/execute-deep-agent/cas-capture-backend.js.map +1 -1
  19. package/dist/activities/execute-deep-agent/setup.js +8 -0
  20. package/dist/activities/execute-deep-agent/setup.js.map +1 -1
  21. package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +5 -1
  22. package/dist/activities/execute-deep-agent/subagent-wiring.js +25 -10
  23. package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
  24. package/dist/activities/generate-session-subject.d.ts +80 -0
  25. package/dist/activities/generate-session-subject.js +283 -0
  26. package/dist/activities/generate-session-subject.js.map +1 -0
  27. package/dist/client/stigmer-client.d.ts +17 -1
  28. package/dist/client/stigmer-client.js +20 -0
  29. package/dist/client/stigmer-client.js.map +1 -1
  30. package/dist/middleware/approval-gate.d.ts +25 -10
  31. package/dist/middleware/approval-gate.js +33 -14
  32. package/dist/middleware/approval-gate.js.map +1 -1
  33. package/dist/middleware/index.d.ts +6 -5
  34. package/dist/middleware/index.js +8 -5
  35. package/dist/middleware/index.js.map +1 -1
  36. package/dist/middleware/otel-spans.d.ts +2 -1
  37. package/dist/middleware/otel-spans.js +2 -1
  38. package/dist/middleware/otel-spans.js.map +1 -1
  39. package/dist/middleware/tool-intent.d.ts +57 -0
  40. package/dist/middleware/tool-intent.js +152 -0
  41. package/dist/middleware/tool-intent.js.map +1 -0
  42. package/dist/runner-manager.js +3 -1
  43. package/dist/runner-manager.js.map +1 -1
  44. package/dist/runner.js +3 -1
  45. package/dist/runner.js.map +1 -1
  46. package/dist/shared/attachment-vision.js +9 -0
  47. package/dist/shared/attachment-vision.js.map +1 -1
  48. package/dist/shared/mcp-manager.js +8 -0
  49. package/dist/shared/mcp-manager.js.map +1 -1
  50. package/package.json +2 -2
  51. package/src/activities/__tests__/generate-session-subject.test.ts +348 -0
  52. package/src/activities/execute-cursor/__tests__/hook-script.test.ts +60 -9
  53. package/src/activities/execute-cursor/__tests__/skill-resolver.test.ts +267 -8
  54. package/src/activities/execute-cursor/capture-flow.ts +5 -4
  55. package/src/activities/execute-cursor/cas-observations.ts +10 -4
  56. package/src/activities/execute-cursor/hook-script.ts +39 -13
  57. package/src/activities/execute-cursor/skill-resolver.ts +148 -37
  58. package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +13 -2
  59. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +21 -20
  60. package/src/activities/execute-deep-agent/cas-capture-backend.ts +3 -1
  61. package/src/activities/execute-deep-agent/setup.ts +8 -0
  62. package/src/activities/execute-deep-agent/subagent-wiring.ts +26 -10
  63. package/src/activities/generate-session-subject.ts +370 -0
  64. package/src/client/stigmer-client.ts +23 -1
  65. package/src/middleware/__tests__/approval-gate.test.ts +130 -1
  66. package/src/middleware/__tests__/tool-intent.test.ts +266 -0
  67. package/src/middleware/approval-gate.ts +58 -24
  68. package/src/middleware/index.ts +9 -5
  69. package/src/middleware/otel-spans.ts +2 -1
  70. package/src/middleware/tool-intent.ts +174 -0
  71. package/src/runner-manager.ts +3 -0
  72. package/src/runner.ts +3 -0
  73. package/src/shared/__tests__/attachment-vision.test.ts +4 -0
  74. package/src/shared/__tests__/mcp-manager.test.ts +7 -2
  75. package/src/shared/attachment-vision.ts +9 -0
  76. package/src/shared/filereview/__tests__/capture.test.ts +48 -0
  77. package/src/shared/mcp-manager.ts +8 -0
@@ -66,7 +66,7 @@ describe("toMcpClientConfig", () => {
66
66
  });
67
67
  });
68
68
 
69
- it("maps HTTP servers to streamable_http transport", () => {
69
+ it("maps HTTP servers to streamable_http transport with reconnect enabled", () => {
70
70
  const servers = [
71
71
  makeServer({
72
72
  slug: "github",
@@ -80,10 +80,14 @@ describe("toMcpClientConfig", () => {
80
80
  transport: "http",
81
81
  url: "https://api.github.com/mcp",
82
82
  headers: { Authorization: "Bearer tok" },
83
+ // oss#316: severed remote connections (e.g. the hosted bridge
84
+ // restarting mid-execution) re-initialize instead of stranding the
85
+ // agent on a dead session.
86
+ reconnect: { enabled: true, maxAttempts: 3, delayMs: 1_000 },
83
87
  });
84
88
  });
85
89
 
86
- it("maps SSE servers to streamable_http transport", () => {
90
+ it("maps SSE servers to streamable_http transport with reconnect enabled", () => {
87
91
  const servers = [
88
92
  makeServer({
89
93
  slug: "sse-server",
@@ -96,6 +100,7 @@ describe("toMcpClientConfig", () => {
96
100
  transport: "http",
97
101
  url: "https://sse.example.com/mcp",
98
102
  headers: undefined,
103
+ reconnect: { enabled: true, maxAttempts: 3, delayMs: 1_000 },
99
104
  });
100
105
  });
101
106
 
@@ -32,6 +32,15 @@
32
32
 
33
33
  // ---------------------------------------------------------------------------
34
34
  // Budget constants (owner decision, 2026-08-09; project T04)
35
+ //
36
+ // ADVERTISED == ENFORCED (stigmer/stigmer#365): the model registry document
37
+ // advertises these values in its `limits.vision` block (rendered by the
38
+ // cloud's ModelRegistryDocumentCodec, mirrored verbatim by the OSS server)
39
+ // so clients can warn BEFORE an upload this budget would degrade. Both sides
40
+ // pin the literal values in tests — attachment-vision.test.ts here, the
41
+ // codec test there — so changing either side alone fails its own suite.
42
+ // Update both together; deploy the runner first if the budget ever shrinks
43
+ // (never advertise more than the runner accepts).
35
44
  // ---------------------------------------------------------------------------
36
45
 
37
46
  /**
@@ -946,6 +946,54 @@ describe("capture orchestration — CAS-only non-git workspace (Slice 2a)", () =
946
946
  await expect(readFile(join(ws, "drop.txt"), "utf-8")).rejects.toThrow();
947
947
  });
948
948
 
949
+ it("authors a DELETE from {before, after:null} and reconciles it both ways (issue #303)", async () => {
950
+ // The delete flow end-to-end at this seam: the harness captured the
951
+ // pre-delete bytes and the file is gone from disk (the tool ran). The
952
+ // candidate must carry a DELETE with the before blob; an approved DELETE
953
+ // stays deleted, a rejected DELETE is restored byte-exact from the blob.
954
+ const status = newStatus();
955
+ const storage = makeStorage();
956
+ const readBlob = reconcilerReadBlob(storage);
957
+ const enc = (s: string) => new TextEncoder().encode(s);
958
+
959
+ const baseline = await captureBaselineToLedger({
960
+ status, gitRoot: ws, executionId: EXEC_ID, changeSetId: CHANGE_SET_ID,
961
+ harnessId: HARNESS, gitWorkspace: false,
962
+ });
963
+ await captureCandidateToLedger({
964
+ status, gitRoot: ws, executionId: EXEC_ID, changeSetId: CHANGE_SET_ID,
965
+ baselineTree: baseline, harnessId: HARNESS, gitWorkspace: false, storage,
966
+ casCaptures: [
967
+ { path: "gone-approved.txt", before: enc("A"), after: null, captureClass: FileCaptureClass.NON_GIT_CAS },
968
+ { path: "gone-rejected.txt", before: enc("B"), after: null, captureClass: FileCaptureClass.NON_GIT_CAS },
969
+ ],
970
+ });
971
+
972
+ const cand = candidateChanges(status);
973
+ expect(cand.map((c) => c.kind)).toEqual([FileChangeKind.DELETE, FileChangeKind.DELETE]);
974
+ // A DELETE names its path on the BEFORE side only, with the restorable blob.
975
+ expect(cand.map((c) => c.pathBefore)).toEqual(["gone-approved.txt", "gone-rejected.txt"]);
976
+ expect(cand.map((c) => c.pathAfter)).toEqual(["", ""]);
977
+ expect(cand[0].before?.body.case).toBe("ref");
978
+ expect(cand[0].after).toBeUndefined();
979
+
980
+ const changeSet = decidedChangeSet(status, {
981
+ "gone-approved.txt": FileDecisionAction.APPROVE,
982
+ "gone-rejected.txt": FileDecisionAction.REJECT,
983
+ });
984
+ const result = await applyCaptureDecisions({
985
+ status, gitRoot: ws, executionId: EXEC_ID, changeSet, harnessId: HARNESS,
986
+ gitWorkspace: false, storage, readBlob,
987
+ });
988
+
989
+ expect(result.failed).toBe(false);
990
+ expect(result.approvedPaths).toEqual(["gone-approved.txt"]);
991
+ expect(result.rejectedPaths).toEqual(["gone-rejected.txt"]);
992
+ // Approved DELETE: the file stays gone. Rejected DELETE: restored byte-exact.
993
+ await expect(readFile(join(ws, "gone-approved.txt"), "utf-8")).rejects.toThrow();
994
+ expect(await readFile(join(ws, "gone-rejected.txt"), "utf-8")).toBe("B");
995
+ });
996
+
949
997
  it("is not a capture turn when neither a git ref nor a CAS manifest exists", async () => {
950
998
  const status = newStatus();
951
999
  const storage = makeStorage();
@@ -73,6 +73,14 @@ export function toMcpClientConfig(
73
73
  transport: "http",
74
74
  url: server.url,
75
75
  headers: server.headers,
76
+ // Re-establish severed connections (oss#316): when a remote MCP
77
+ // server restarts mid-execution — the hosted bridge's sessions are
78
+ // in-memory, so a deploy orphans every live one — the adapter's
79
+ // onclose hook re-runs initialize, minting a fresh session for
80
+ // subsequent calls instead of stranding the agent on a dead one.
81
+ // Covers transport-close only; a session lost with no stream open
82
+ // still surfaces as a JSON-RPC session-not-found on the next call.
83
+ reconnect: { enabled: true, maxAttempts: 3, delayMs: 1_000 },
76
84
  };
77
85
  }
78
86
  }