@stigmer/runner 3.40.0 → 3.41.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 (278) hide show
  1. package/README.md +3 -1
  2. package/dist/.build-fingerprint +1 -1
  3. package/dist/__test-utils__/execution-record-fixture.d.ts +2 -1
  4. package/dist/__test-utils__/execution-record-fixture.js.map +1 -1
  5. package/dist/activities/call-agent.js +1 -1
  6. package/dist/activities/discover-mcp-server.d.ts +7 -1
  7. package/dist/activities/discover-mcp-server.js +13 -29
  8. package/dist/activities/discover-mcp-server.js.map +1 -1
  9. package/dist/activities/execute-cursor/__test-utils__/fold.d.ts +4 -2
  10. package/dist/activities/execute-cursor/__test-utils__/fold.js +3 -4
  11. package/dist/activities/execute-cursor/__test-utils__/fold.js.map +1 -1
  12. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +1 -0
  13. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
  14. package/dist/activities/execute-cursor/approval-policy.d.ts +1 -29
  15. package/dist/activities/execute-cursor/approval-policy.js +11 -35
  16. package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
  17. package/dist/activities/execute-cursor/boundary-rows.js +4 -4
  18. package/dist/activities/execute-cursor/boundary-rows.js.map +1 -1
  19. package/dist/activities/execute-cursor/translator.d.ts +12 -17
  20. package/dist/activities/execute-cursor/translator.js +13 -30
  21. package/dist/activities/execute-cursor/translator.js.map +1 -1
  22. package/dist/activities/execute-cursor/turn-stream.js +4 -2
  23. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  24. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +11 -1
  25. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +22 -3
  26. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -1
  27. package/dist/activities/execute-deep-agent/inline-publisher.d.ts +33 -2
  28. package/dist/activities/execute-deep-agent/inline-publisher.js +33 -7
  29. package/dist/activities/execute-deep-agent/inline-publisher.js.map +1 -1
  30. package/dist/activities/execute-deep-agent/platform-route.d.ts +48 -13
  31. package/dist/activities/execute-deep-agent/platform-route.js +87 -19
  32. package/dist/activities/execute-deep-agent/platform-route.js.map +1 -1
  33. package/dist/activities/execute-deep-agent/prompt-builder.d.ts +70 -35
  34. package/dist/activities/execute-deep-agent/prompt-builder.js +70 -55
  35. package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
  36. package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +20 -3
  37. package/dist/activities/execute-deep-agent/streaming-side-effects.js +26 -4
  38. package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
  39. package/dist/activities/execute-deep-agent/translator.d.ts +5 -4
  40. package/dist/activities/execute-deep-agent/translator.js +5 -4
  41. package/dist/activities/execute-deep-agent/translator.js.map +1 -1
  42. package/dist/activities/execute-deep-agent/turn-settle.js +6 -6
  43. package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -1
  44. package/dist/activities/execute-deep-agent/turn-setup.d.ts +18 -13
  45. package/dist/activities/execute-deep-agent/turn-setup.js +42 -36
  46. package/dist/activities/execute-deep-agent/turn-setup.js.map +1 -1
  47. package/dist/activities/execute-deep-agent/turn-stream.d.ts +10 -6
  48. package/dist/activities/execute-deep-agent/turn-stream.js +6 -16
  49. package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -1
  50. package/dist/activities/execute-deep-agent/turn.d.ts +4 -1
  51. package/dist/activities/execute-deep-agent/turn.js +15 -6
  52. package/dist/activities/execute-deep-agent/turn.js.map +1 -1
  53. package/dist/activities/workflow-event-activities.js +2 -0
  54. package/dist/activities/workflow-event-activities.js.map +1 -1
  55. package/dist/config.d.ts +9 -0
  56. package/dist/config.js +2 -0
  57. package/dist/config.js.map +1 -1
  58. package/dist/exit-backstop.d.ts +64 -0
  59. package/dist/exit-backstop.js +79 -0
  60. package/dist/exit-backstop.js.map +1 -0
  61. package/dist/harness/terminal-table.d.ts +12 -5
  62. package/dist/harness/terminal-table.js +13 -13
  63. package/dist/harness/terminal-table.js.map +1 -1
  64. package/dist/harness/transcript/builder.d.ts +21 -0
  65. package/dist/harness/transcript/builder.js +53 -31
  66. package/dist/harness/transcript/builder.js.map +1 -1
  67. package/dist/harness/transcript/events.d.ts +22 -26
  68. package/dist/harness/transcript/events.js +6 -5
  69. package/dist/harness/transcript/events.js.map +1 -1
  70. package/dist/harness/turn-context.d.ts +3 -1
  71. package/dist/harness/turn-context.js +5 -3
  72. package/dist/harness/turn-context.js.map +1 -1
  73. package/dist/main.js +10 -4
  74. package/dist/main.js.map +1 -1
  75. package/dist/middleware/cost-advisory.d.ts +6 -3
  76. package/dist/middleware/cost-advisory.js +6 -3
  77. package/dist/middleware/cost-advisory.js.map +1 -1
  78. package/dist/middleware/execution-budget.d.ts +22 -7
  79. package/dist/middleware/execution-budget.js +57 -35
  80. package/dist/middleware/execution-budget.js.map +1 -1
  81. package/dist/middleware/index.d.ts +10 -7
  82. package/dist/middleware/index.js +10 -7
  83. package/dist/middleware/index.js.map +1 -1
  84. package/dist/middleware/types.d.ts +6 -1
  85. package/dist/runner-manager.js +3 -2
  86. package/dist/runner-manager.js.map +1 -1
  87. package/dist/runner.d.ts +25 -0
  88. package/dist/runner.js +41 -14
  89. package/dist/runner.js.map +1 -1
  90. package/dist/shared/approval-policy.d.ts +23 -13
  91. package/dist/shared/approval-policy.js +47 -14
  92. package/dist/shared/approval-policy.js.map +1 -1
  93. package/dist/shared/caller-identity.d.ts +4 -5
  94. package/dist/shared/caller-identity.js +4 -5
  95. package/dist/shared/caller-identity.js.map +1 -1
  96. package/dist/shared/channel-attachment.js +3 -2
  97. package/dist/shared/channel-attachment.js.map +1 -1
  98. package/dist/shared/connect-backfill.d.ts +2 -1
  99. package/dist/shared/connect-backfill.js +2 -2
  100. package/dist/shared/connect-backfill.js.map +1 -1
  101. package/dist/shared/mcp-resolver.d.ts +10 -1
  102. package/dist/shared/mcp-resolver.js +11 -2
  103. package/dist/shared/mcp-resolver.js.map +1 -1
  104. package/dist/shared/memory-attachment.js +3 -2
  105. package/dist/shared/memory-attachment.js.map +1 -1
  106. package/dist/shared/model-error.d.ts +25 -3
  107. package/dist/shared/model-error.js +78 -10
  108. package/dist/shared/model-error.js.map +1 -1
  109. package/dist/shared/platform-server-address.d.ts +71 -0
  110. package/dist/shared/platform-server-address.js +103 -0
  111. package/dist/shared/platform-server-address.js.map +1 -0
  112. package/dist/shared/prompt-sections.d.ts +6 -28
  113. package/dist/shared/prompt-sections.js +6 -35
  114. package/dist/shared/prompt-sections.js.map +1 -1
  115. package/dist/shared/skill-resolver.d.ts +2 -3
  116. package/dist/shared/skill-resolver.js +2 -3
  117. package/dist/shared/skill-resolver.js.map +1 -1
  118. package/dist/shared/synthesized-attachment.d.ts +0 -5
  119. package/dist/shared/synthesized-attachment.js +0 -12
  120. package/dist/shared/synthesized-attachment.js.map +1 -1
  121. package/dist/shared/tool-rounds.d.ts +51 -23
  122. package/dist/shared/tool-rounds.js +67 -24
  123. package/dist/shared/tool-rounds.js.map +1 -1
  124. package/dist/shared/workspace/platform-dir.d.ts +15 -0
  125. package/dist/shared/workspace/platform-dir.js +18 -1
  126. package/dist/shared/workspace/platform-dir.js.map +1 -1
  127. package/dist/shared/workspace/sources/git.js +13 -6
  128. package/dist/shared/workspace/sources/git.js.map +1 -1
  129. package/dist/shared/workspace/stigmer-link.d.ts +21 -14
  130. package/dist/shared/workspace/stigmer-link.js +91 -29
  131. package/dist/shared/workspace/stigmer-link.js.map +1 -1
  132. package/dist/tools/url-guard.d.ts +5 -1
  133. package/dist/tools/url-guard.js +9 -2
  134. package/dist/tools/url-guard.js.map +1 -1
  135. package/dist/worker.d.ts +11 -2
  136. package/dist/worker.js +1 -1
  137. package/dist/worker.js.map +1 -1
  138. package/dist/workflow-engine/tasks/human-input.d.ts +16 -0
  139. package/dist/workflow-engine/tasks/human-input.js +79 -37
  140. package/dist/workflow-engine/tasks/human-input.js.map +1 -1
  141. package/dist/workflow-engine/types.d.ts +14 -4
  142. package/dist/workflow-engine/types.js.map +1 -1
  143. package/dist/workflows/call-agent-orchestrator.d.ts +13 -0
  144. package/dist/workflows/call-agent-orchestrator.js.map +1 -1
  145. package/dist/workflows/engine-core.d.ts +25 -0
  146. package/dist/workflows/engine-core.js.map +1 -1
  147. package/dist/workflows/execute-from-execution.d.ts +3 -0
  148. package/dist/workflows/execute-from-execution.js.map +1 -1
  149. package/dist/workflows/human-input-orchestrator.d.ts +9 -12
  150. package/dist/workflows/human-input-orchestrator.js +12 -44
  151. package/dist/workflows/human-input-orchestrator.js.map +1 -1
  152. package/package.json +5 -5
  153. package/src/__test-utils__/config-fixture.ts +1 -0
  154. package/src/__test-utils__/execution-record-fixture.ts +2 -1
  155. package/src/__test-utils__/harness-contract/runtime-contract.ts +5 -3
  156. package/src/__test-utils__/test-gate.ts +8 -0
  157. package/src/__tests__/exit-backstop.test.ts +91 -0
  158. package/src/__tests__/golden-e2e.test.ts +80 -62
  159. package/src/__tests__/history-encryption-e2e.test.ts +51 -27
  160. package/src/__tests__/runner.test.ts +60 -2
  161. package/src/activities/__tests__/classify-tool-approvals.test.ts +1 -0
  162. package/src/activities/__tests__/discover-mcp-server.hang.test.ts +5 -1
  163. package/src/activities/__tests__/discover-mcp-server.test.ts +90 -49
  164. package/src/activities/__tests__/workflow-event-activities.test.ts +28 -7
  165. package/src/activities/call-agent.ts +1 -1
  166. package/src/activities/discover-mcp-server.ts +27 -37
  167. package/src/activities/execute-cursor/__test-utils__/fold.ts +6 -4
  168. package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +1 -0
  169. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +4 -29
  170. package/src/activities/execute-cursor/__tests__/hermetic/bypassed-tool-call.test.ts +120 -0
  171. package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +5 -5
  172. package/src/activities/execute-cursor/__tests__/hermetic/goldens/file-review-capture.status.json +0 -2
  173. package/src/activities/execute-cursor/__tests__/hermetic/goldens/resolution-error.status.json +1 -1
  174. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.error-delta.status.json +0 -3
  175. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.output-first.status.json +0 -2
  176. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.status.json +0 -2
  177. package/src/activities/execute-cursor/__tests__/hermetic/goldens/stall.status.json +0 -2
  178. package/src/activities/execute-cursor/__tests__/hermetic/goldens/unattributed-hook-block.status.json +0 -3
  179. package/src/activities/execute-cursor/__tests__/hermetic/shell-output-delta.test.ts +9 -7
  180. package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +6 -1
  181. package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +8 -11
  182. package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +1 -3
  183. package/src/activities/execute-cursor/__tests__/translator.test.ts +68 -15
  184. package/src/activities/execute-cursor/approval-policy.ts +11 -36
  185. package/src/activities/execute-cursor/boundary-rows.ts +3 -3
  186. package/src/activities/execute-cursor/translator.ts +15 -32
  187. package/src/activities/execute-cursor/turn-stream.ts +4 -1
  188. package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +33 -2
  189. package/src/activities/execute-deep-agent/__tests__/adapter.test.ts +1 -0
  190. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.build-from-plan.prompt.md +1 -27
  191. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.everything.prompt.md +26 -30
  192. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.plan-mode.prompt.md +1 -26
  193. package/src/activities/execute-deep-agent/__tests__/goldens/user-message.everything.md +36 -0
  194. package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +4 -0
  195. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +1 -1
  196. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +1 -1
  197. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +1 -1
  198. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +8 -73
  199. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/resolution-error.status.json +1 -1
  200. package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +17 -0
  201. package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +86 -26
  202. package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +9 -5
  203. package/src/activities/execute-deep-agent/__tests__/hermetic/thrown-turn-drains-publishes.test.ts +159 -0
  204. package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +84 -0
  205. package/src/activities/execute-deep-agent/__tests__/platform-route.test.ts +47 -10
  206. package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +127 -199
  207. package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +31 -26
  208. package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +34 -0
  209. package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +13 -5
  210. package/src/activities/execute-deep-agent/inline-publisher.ts +47 -7
  211. package/src/activities/execute-deep-agent/platform-route.ts +109 -20
  212. package/src/activities/execute-deep-agent/prompt-builder.ts +104 -92
  213. package/src/activities/execute-deep-agent/streaming-side-effects.ts +27 -4
  214. package/src/activities/execute-deep-agent/translator.ts +5 -4
  215. package/src/activities/execute-deep-agent/turn-settle.ts +6 -6
  216. package/src/activities/execute-deep-agent/turn-setup.ts +43 -38
  217. package/src/activities/execute-deep-agent/turn-stream.ts +15 -22
  218. package/src/activities/execute-deep-agent/turn.ts +16 -7
  219. package/src/activities/workflow-event-activities.ts +2 -0
  220. package/src/config.ts +11 -0
  221. package/src/exit-backstop.ts +97 -0
  222. package/src/harness/README.md +5 -5
  223. package/src/harness/terminal-table.ts +13 -13
  224. package/src/harness/transcript/__tests__/builder.test.ts +93 -21
  225. package/src/harness/transcript/builder.ts +53 -30
  226. package/src/harness/transcript/events.ts +22 -27
  227. package/src/harness/turn-context.ts +5 -3
  228. package/src/main.ts +9 -5
  229. package/src/middleware/__tests__/execution-budget.test.ts +181 -103
  230. package/src/middleware/cost-advisory.ts +6 -3
  231. package/src/middleware/execution-budget.ts +60 -34
  232. package/src/middleware/index.ts +10 -7
  233. package/src/middleware/types.ts +6 -1
  234. package/src/runner-manager.ts +3 -2
  235. package/src/runner.ts +57 -15
  236. package/src/shared/__tests__/approval-policy.test.ts +41 -0
  237. package/src/shared/__tests__/artifact-storage.test.ts +1 -0
  238. package/src/shared/__tests__/connect-backfill.test.ts +15 -11
  239. package/src/shared/__tests__/mcp-resolver.test.ts +72 -10
  240. package/src/shared/__tests__/model-error.test.ts +71 -3
  241. package/src/shared/__tests__/platform-server-address.test.ts +122 -0
  242. package/src/shared/__tests__/prompt-sections.test.ts +2 -54
  243. package/src/shared/__tests__/tool-rounds.test.ts +64 -14
  244. package/src/shared/approval-policy.ts +57 -14
  245. package/src/shared/caller-identity.ts +4 -5
  246. package/src/shared/channel-attachment.ts +2 -2
  247. package/src/shared/connect-backfill.ts +5 -1
  248. package/src/shared/mcp-resolver.ts +11 -1
  249. package/src/shared/memory-attachment.ts +2 -2
  250. package/src/shared/model-error.ts +87 -9
  251. package/src/shared/platform-server-address.ts +123 -0
  252. package/src/shared/prompt-sections.ts +6 -55
  253. package/src/shared/skill-resolver.ts +2 -3
  254. package/src/shared/synthesized-attachment.ts +0 -12
  255. package/src/shared/tool-rounds.ts +70 -24
  256. package/src/shared/workspace/__tests__/git-source.test.ts +11 -5
  257. package/src/shared/workspace/__tests__/stigmer-link.test.ts +107 -10
  258. package/src/shared/workspace/platform-dir.ts +19 -1
  259. package/src/shared/workspace/sources/git.ts +14 -8
  260. package/src/shared/workspace/stigmer-link.ts +99 -29
  261. package/src/tools/__tests__/url-guard.test.ts +19 -1
  262. package/src/tools/url-guard.ts +9 -1
  263. package/src/worker.ts +12 -2
  264. package/src/workflow-engine/__tests__/golden-execution.test.ts +2 -1
  265. package/src/workflow-engine/__tests__/loader.test.ts +1 -1
  266. package/src/workflow-engine/__tests__/tasks/human-input.test.ts +133 -57
  267. package/src/workflow-engine/tasks/human-input.ts +92 -42
  268. package/src/workflow-engine/types.ts +16 -4
  269. package/src/workflows/call-agent-orchestrator.ts +7 -0
  270. package/src/workflows/engine-core.ts +18 -0
  271. package/src/workflows/execute-from-execution.ts +2 -1
  272. package/src/workflows/human-input-orchestrator.ts +15 -56
  273. package/dist/shared/skill-relevance.d.ts +0 -65
  274. package/dist/shared/skill-relevance.js +0 -175
  275. package/dist/shared/skill-relevance.js.map +0 -1
  276. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.skills-below-threshold.prompt.md +0 -146
  277. package/src/shared/__tests__/skill-relevance.test.ts +0 -292
  278. package/src/shared/skill-relevance.ts +0 -222
@@ -30,9 +30,18 @@
30
30
  *
31
31
  * WHEN IT IS MOUNTED
32
32
  * ------------------
33
- * On the turns where the workspace link points at the platform dir — the
34
- * turns whose skill or attachment phase made it — so what the agent can
35
- * reach is exactly what the link exposes to the shell on the same turn.
33
+ * On every turn: `.stigmer/` is the platform's name whether or not the turn
34
+ * mounted anything, so a write there never reaches the workspace. Before
35
+ * #1123 the route existed only on linked turns, and a write under `.stigmer/`
36
+ * on any other turn made a real directory in the user's tree that the next
37
+ * link displaced. What the route exposes follows the link, so the file tools
38
+ * reach exactly what the shell reaches on the same turn:
39
+ * - on a turn whose skill or attachment phase made the link, the platform dir
40
+ * ({@link PlatformContentBackend});
41
+ * - on any other turn, nothing ({@link NoPlatformContentBackend}): the dir
42
+ * still holds earlier turns' skills and inputs, which this turn's shell
43
+ * cannot reach, so the file tools must not either. The root listing then
44
+ * leaves `.stigmer/` out, as the tree does.
36
45
  * The link itself stays: shell commands (a skill's own scripts among them)
37
46
  * run in the workspace and resolve `.stigmer/…` through it.
38
47
  */
@@ -40,11 +49,18 @@ import { CompositeBackend, FilesystemBackend } from "deepagents";
40
49
  import { STIGMER_LOCAL_STATE_DIR, stigmerSymlinkPointsAt } from "../../shared/workspace/stigmer-link.js";
41
50
  /** The route prefix, with the trailing slash `CompositeBackend` needs to match `/.stigmer/x` but never `/.stigmerx`. */
42
51
  export const PLATFORM_ROUTE_PREFIX = `/${STIGMER_LOCAL_STATE_DIR}/`;
52
+ /** The path as the agent named it: the route hands its backend the path with the prefix stripped. */
53
+ function agentPath(routedPath) {
54
+ return `${PLATFORM_ROUTE_PREFIX.slice(0, -1)}${routedPath}`;
55
+ }
43
56
  function readOnly(routedPath) {
44
- const agentPath = `${PLATFORM_ROUTE_PREFIX.slice(0, -1)}${routedPath}`;
45
- return (`Error: '${agentPath}' is platform content (skills, attached inputs, the approved plan) ` +
57
+ return (`Error: '${agentPath(routedPath)}' is platform content (skills, attached inputs, the approved plan) ` +
46
58
  "and is read-only; write your own files in the workspace");
47
59
  }
60
+ function noPlatformContent(routedPath) {
61
+ return (`Error: '${agentPath(routedPath)}' does not exist: this turn has no platform content ` +
62
+ "(no skills or attached inputs)");
63
+ }
48
64
  /** The platform dir, virtual-rooted like every native backend, refusing every mutation. */
49
65
  export class PlatformContentBackend extends FilesystemBackend {
50
66
  constructor(platformDir) {
@@ -64,18 +80,69 @@ export class PlatformContentBackend extends FilesystemBackend {
64
80
  }
65
81
  }
66
82
  /**
67
- * The workspace backend with the platform mounted at {@link PLATFORM_ROUTE_PREFIX}.
83
+ * The `.stigmer/` route on a turn that exposes no platform content: nothing
84
+ * to read, list or find, and every mutation refused with the same message
85
+ * the platform dir's route gives. It stands on no filesystem, so it cannot
86
+ * create or reveal anything, and `ls` answers "does not exist" rather than
87
+ * an empty listing because the root listing leaves `.stigmer/` out.
88
+ */
89
+ export class NoPlatformContentBackend {
90
+ ls(path) {
91
+ return { error: noPlatformContent(path) };
92
+ }
93
+ read(filePath) {
94
+ return { error: noPlatformContent(filePath) };
95
+ }
96
+ readRaw(filePath) {
97
+ return { error: noPlatformContent(filePath) };
98
+ }
99
+ grep() {
100
+ return { matches: [] };
101
+ }
102
+ glob() {
103
+ return { files: [] };
104
+ }
105
+ write(filePath) {
106
+ return { error: readOnly(filePath) };
107
+ }
108
+ edit(filePath) {
109
+ return { error: readOnly(filePath) };
110
+ }
111
+ delete(filePath) {
112
+ return { error: readOnly(filePath) };
113
+ }
114
+ uploadFiles(files) {
115
+ return files.map(([path]) => ({ path, error: "permission_denied" }));
116
+ }
117
+ downloadFiles(paths) {
118
+ return paths.map((path) => ({ path, content: null, error: "file_not_found" }));
119
+ }
120
+ }
121
+ /**
122
+ * The workspace backend with `.stigmer/` routed to {@link PLATFORM_ROUTE_PREFIX}'s
123
+ * backend for this turn.
68
124
  *
69
125
  * One behaviour differs from the stock router: listing `/`. The composite
70
- * adds each route to the root listing, and the workspace backend already
71
- * lists `.stigmer/` by following the link, so the stock listing names the
72
- * same directory twice; the root listing is de-duplicated by path.
126
+ * adds each route to the root listing whatever the route holds. With the
127
+ * platform exposed, the workspace backend also lists `.stigmer/` by following
128
+ * the link, so the stock listing names the same directory twice and is
129
+ * de-duplicated by path. With nothing exposed, `.stigmer/` is left out of the
130
+ * root listing altogether: the route has nothing to show, and a real
131
+ * `.stigmer` the workspace may hold is unreachable behind it.
73
132
  */
74
133
  export class PlatformRoutedBackend extends CompositeBackend {
134
+ exposesPlatform;
135
+ constructor(backend, platform) {
136
+ super(backend, { [PLATFORM_ROUTE_PREFIX]: platform });
137
+ this.exposesPlatform = platform instanceof PlatformContentBackend;
138
+ }
75
139
  async ls(path) {
76
140
  const result = await super.ls(path);
77
141
  if (path !== "/" || !result.files)
78
142
  return result;
143
+ if (!this.exposesPlatform) {
144
+ return { ...result, files: result.files.filter((entry) => entry.path !== PLATFORM_ROUTE_PREFIX) };
145
+ }
79
146
  const seen = new Set();
80
147
  return {
81
148
  ...result,
@@ -89,19 +156,20 @@ export class PlatformRoutedBackend extends CompositeBackend {
89
156
  }
90
157
  }
91
158
  /**
92
- * Mount the platform route over `backend` when this turn exposes platform
93
- * content; otherwise hand `backend` back unchanged. `execute` and the
94
- * sandbox identity stay the workspace backend's (`CompositeBackend` delegates
95
- * both to its default), so a shell-capable graph keeps its `execute` tool and
96
- * a plan-mode graph stays without one.
159
+ * Mount the `.stigmer/` route over `backend` for this turn: the platform dir
160
+ * when the workspace link points at it, the empty route otherwise. Only a
161
+ * session without a platform dir gets `backend` back unchanged. `execute`
162
+ * and the sandbox identity stay the workspace backend's (`CompositeBackend`
163
+ * delegates both to its default), so a shell-capable graph keeps its
164
+ * `execute` tool and a plan-mode graph stays without one.
97
165
  */
98
166
  export async function mountPlatformRoute(backend, options) {
99
167
  const { workspaceDir, platformDir } = options;
100
- if (platformDir === undefined || !(await stigmerSymlinkPointsAt(workspaceDir, platformDir))) {
168
+ if (platformDir === undefined)
101
169
  return backend;
102
- }
103
- return new PlatformRoutedBackend(backend, {
104
- [PLATFORM_ROUTE_PREFIX]: new PlatformContentBackend(platformDir),
105
- });
170
+ const platform = (await stigmerSymlinkPointsAt(workspaceDir, platformDir))
171
+ ? new PlatformContentBackend(platformDir)
172
+ : new NoPlatformContentBackend();
173
+ return new PlatformRoutedBackend(backend, platform);
106
174
  }
107
175
  //# sourceMappingURL=platform-route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform-route.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/platform-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASjE,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAEzG,wHAAwH;AACxH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,uBAAuB,GAAG,CAAC;AAEpE,SAAS,QAAQ,CAAC,UAAkB;IAClC,MAAM,SAAS,GAAG,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC;IACvE,OAAO,CACL,WAAW,SAAS,qEAAqE;QACzF,yDAAyD,CAC1D,CAAC;AACJ,CAAC;AAED,2FAA2F;AAC3F,MAAM,OAAO,sBAAuB,SAAQ,iBAAiB;IAC3D,YAAY,WAAmB;QAC7B,KAAK,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAEQ,KAAK,CAAC,KAAK,CAAC,QAAgB;QACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvC,CAAC;IAEQ,KAAK,CAAC,IAAI,CAAC,QAAgB;QAClC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvC,CAAC;IAEQ,KAAK,CAAC,MAAM,CAAC,QAAgB;QACpC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvC,CAAC;IAEQ,KAAK,CAAC,WAAW,CAAC,KAAkC;QAC3D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,qBAAsB,SAAQ,gBAAgB;IAChD,KAAK,CAAC,EAAE,CAAC,IAAY;QAC5B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,OAAO,MAAM,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,OAAO;YACL,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACnC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACvC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;SACH,CAAC;IACJ,CAAC;CACF;AASD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA2B,EAC3B,OAA6B;IAE7B,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAC9C,IAAI,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,sBAAsB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC5F,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,qBAAqB,CAAC,OAAO,EAAE;QACxC,CAAC,qBAAqB,CAAC,EAAE,IAAI,sBAAsB,CAAC,WAAW,CAAC;KACjE,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"platform-route.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/platform-route.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,32 @@
1
1
  /**
2
- * The native harness's system prompt: what `createDeepAgent` receives as
3
- * `systemPrompt`, rebuilt on EVERY invocation (never checkpointed with the
4
- * message history), so every standing fact is injected on every turn by
5
- * design — a first-turn-only injection would vanish from turn 2 onward.
2
+ * The native harness's prompt: the system prompt `createDeepAgent` receives
3
+ * as `systemPrompt`, and the turn's user message.
4
+ *
5
+ * The system prompt is rebuilt on EVERY invocation (never checkpointed with
6
+ * the message history), so every standing fact is injected on every turn by
7
+ * design — a first-turn-only injection would vanish from turn 2 onward. It is
8
+ * a function of the session and of the execution's settings (its mode), never
9
+ * of the turn. The provider caches tools, system and messages as one prefix,
10
+ * so a system byte that follows the message re-writes the cached prompt and
11
+ * the whole conversation after it, on every turn, at the cache-write price.
12
+ * What belongs to one turn — its input files, the workspace paths it
13
+ * references, the conversation catchup — rides that turn's user message
14
+ * (`composeUserMessage`), which enters the checkpointer with the turn and
15
+ * stays in history. That is the Cursor harness's resumed-turn placement
16
+ * (`execute-cursor/prompt-builder.ts` `buildPrompt`) and the runner's rule
17
+ * that user content goes in user messages, never the system prompt.
6
18
  *
7
19
  * Pure functions: no side effects, no I/O. `turn-setup.ts` gathers the
8
20
  * inputs from the runtime's resolved record and this module renders them.
9
21
  *
10
22
  * What is this harness's and what is shared (since #1096):
11
23
  * - Shared through `shared/prompt-sections.ts`: WHICH standing sections
12
- * render and in WHAT order (`standingContextSections`), the input-files
13
- * bullet and disclosure lines (`inputFileLines`), which skills a prompt
14
- * highlights (`selectSkillsForPrompt`, called from `turn-setup.ts`) and
15
- * the also-available sentence. Their WORDS come from each fact's own
16
- * module; this builder only frames them.
24
+ * render and in WHAT order (`standingContextSections`) and the
25
+ * input-files bullet and disclosure lines (`inputFileLines`). Their WORDS
26
+ * come from each fact's own module; this builder only frames them. Every
27
+ * mounted skill is described on every turn, as the Cursor harness does:
28
+ * choosing skills by the message made the system prompt follow the
29
+ * message.
17
30
  * - This harness's: the framing — `## Heading` markdown sections, the house
18
31
  * style for a system prompt — and every text that quotes this engine's
19
32
  * tools: the `## Skills` activation protocol, the response rules, the
@@ -24,7 +37,8 @@
24
37
  *
25
38
  * The rendered bytes are load-bearing for the hermetic tests: `ScriptedModel`
26
39
  * tells its scripted roles apart by the system prompt's text, so this
27
- * module's whole output is pinned by `__tests__/prompt-goldens.test.ts`.
40
+ * module's whole output — the system prompt and the turn's message — is
41
+ * pinned by `__tests__/prompt-goldens.test.ts`.
28
42
  */
29
43
  import { InteractionMode } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
30
44
  import type { ProvisionResult } from "../../shared/workspace/types.js";
@@ -47,22 +61,6 @@ export interface PromptBuilderInput {
47
61
  * when the agent serves no proactive channel or nothing is sendable.
48
62
  */
49
63
  channelTemplatesPromptSection?: string;
50
- workspaceFileRefs: string[];
51
- workspaceRoot: string;
52
- /** The turn's resolved input files, as the runtime's attachment phase returns them. */
53
- inputFiles: readonly ResolvedAttachment[];
54
- /**
55
- * Vision facts about this turn's attachments (T04): which images the model
56
- * sees inline in the user message and which degraded to path-only.
57
- * Rendered inside the Input Files section.
58
- */
59
- vision?: VisionPromptInfo;
60
- /**
61
- * What kind of URL the turn's storage backend mints (issue #532) — keys
62
- * the Input Files section's hand-off wording (attachment-download-urls.ts).
63
- * One turn-level fact: all attachments ride the one configured storage.
64
- */
65
- downloadUrlKind?: DownloadUrlKind;
66
64
  /**
67
65
  * The execution's interaction mode. PLAN appends the shared plan-mode
68
66
  * directive so the model knows the turn's deliverable is a plan document.
@@ -79,6 +77,14 @@ export interface PromptBuilderInput {
79
77
  * message itself is just a short label ("Build from plan").
80
78
  */
81
79
  buildFromPlan?: boolean;
80
+ /**
81
+ * The approved plan's path among the turn's input files
82
+ * (`implement-plan-prompt.ts` `findApprovedPlanPath`), read only under
83
+ * `buildFromPlan`. Absent when the plan did not materialize, which selects
84
+ * the directive's conversation-plan variant. The Input Files section
85
+ * itself rides the turn's message (`composeUserMessage`).
86
+ */
87
+ approvedPlanPath?: string;
82
88
  /**
83
89
  * Rollover context bridge (cloud DD-013): a digest of the previous
84
90
  * session's conversation, read from `SessionSpec.metadata`. Injected on
@@ -128,17 +134,46 @@ export type { VisionPromptInfo };
128
134
  * sections. Pure function with no I/O.
129
135
  */
130
136
  export declare function buildEnhancedSystemPrompt(input: PromptBuilderInput): string;
137
+ /** The turn's own content, composed around what the user typed. */
138
+ export interface TurnMessageInput {
139
+ /** What the user typed (`spec.message`); never mutated. */
140
+ readonly message: string;
141
+ /** The conversation catchup digest (cloud DD-006), when the turn carries one. */
142
+ readonly conversationCatchup?: string;
143
+ /** This turn's resolved input files, as the runtime's attachment phase returns them. */
144
+ readonly inputFiles: readonly ResolvedAttachment[];
145
+ /**
146
+ * Vision facts about this turn's attachments (T04): which images the model
147
+ * sees inline in this same message and which degraded to path-only.
148
+ * Rendered inside the Input Files section.
149
+ */
150
+ readonly vision?: VisionPromptInfo;
151
+ /**
152
+ * What kind of URL the turn's storage backend mints (issue #532) — keys
153
+ * the Input Files section's hand-off wording (attachment-download-urls.ts).
154
+ * One turn-level fact: all attachments ride the one configured storage.
155
+ */
156
+ readonly downloadUrlKind?: DownloadUrlKind;
157
+ /** The workspace paths the user highlighted for this message (`spec.workspace_file_refs`). */
158
+ readonly workspaceFileRefs: readonly string[];
159
+ }
131
160
  /**
132
- * Compose the turn's USER MESSAGE for the graph invocation: the framed
133
- * conversation catchup (cloud DD-006), when present, prepended to the
134
- * customer's message. In the user message and never the system prompt (A27):
135
- * the system prompt is rebuilt per invocation and would forget the digest one
136
- * turn later, while a message enters the checkpointer with the turn and
137
- * persists in history — the same durability the cursor harness gets from its
138
- * prompt prefix. The caller's `spec.message` is never mutated; the prepend
139
- * exists only in the graph input.
161
+ * Compose the turn's USER MESSAGE for the graph invocation: this turn's
162
+ * payload (its input files, then the workspace paths it references), then the
163
+ * framed conversation catchup (cloud DD-006), then what the user typed, each
164
+ * set off by a horizontal rule. Payload first and context closest to the task
165
+ * is the Cursor harness's resumed-turn order.
166
+ *
167
+ * In the user message and never the system prompt (A27, and the module
168
+ * header): the system prompt is rebuilt per invocation, so a turn's content
169
+ * there would vanish one turn later and, while it lasted, change the cached
170
+ * prefix; a message enters the checkpointer with the turn and persists in
171
+ * history, so a later turn still knows which files an earlier one carried.
172
+ * An approval resume sends no new message and needs none: the payload is
173
+ * already in the checkpointed one. The caller's `spec.message` is never
174
+ * mutated; the composition exists only in the graph input.
140
175
  */
141
- export declare function composeUserMessage(message: string, conversationCatchup: string | undefined): string;
176
+ export declare function composeUserMessage(input: TurnMessageInput): string;
142
177
  /**
143
178
  * The `## Skills` section of this harness's system prompt, rendered from the
144
179
  * runtime's mounted-skill metadata (`shared/skill-resolver.ts`
@@ -1,19 +1,32 @@
1
1
  /**
2
- * The native harness's system prompt: what `createDeepAgent` receives as
3
- * `systemPrompt`, rebuilt on EVERY invocation (never checkpointed with the
4
- * message history), so every standing fact is injected on every turn by
5
- * design — a first-turn-only injection would vanish from turn 2 onward.
2
+ * The native harness's prompt: the system prompt `createDeepAgent` receives
3
+ * as `systemPrompt`, and the turn's user message.
4
+ *
5
+ * The system prompt is rebuilt on EVERY invocation (never checkpointed with
6
+ * the message history), so every standing fact is injected on every turn by
7
+ * design — a first-turn-only injection would vanish from turn 2 onward. It is
8
+ * a function of the session and of the execution's settings (its mode), never
9
+ * of the turn. The provider caches tools, system and messages as one prefix,
10
+ * so a system byte that follows the message re-writes the cached prompt and
11
+ * the whole conversation after it, on every turn, at the cache-write price.
12
+ * What belongs to one turn — its input files, the workspace paths it
13
+ * references, the conversation catchup — rides that turn's user message
14
+ * (`composeUserMessage`), which enters the checkpointer with the turn and
15
+ * stays in history. That is the Cursor harness's resumed-turn placement
16
+ * (`execute-cursor/prompt-builder.ts` `buildPrompt`) and the runner's rule
17
+ * that user content goes in user messages, never the system prompt.
6
18
  *
7
19
  * Pure functions: no side effects, no I/O. `turn-setup.ts` gathers the
8
20
  * inputs from the runtime's resolved record and this module renders them.
9
21
  *
10
22
  * What is this harness's and what is shared (since #1096):
11
23
  * - Shared through `shared/prompt-sections.ts`: WHICH standing sections
12
- * render and in WHAT order (`standingContextSections`), the input-files
13
- * bullet and disclosure lines (`inputFileLines`), which skills a prompt
14
- * highlights (`selectSkillsForPrompt`, called from `turn-setup.ts`) and
15
- * the also-available sentence. Their WORDS come from each fact's own
16
- * module; this builder only frames them.
24
+ * render and in WHAT order (`standingContextSections`) and the
25
+ * input-files bullet and disclosure lines (`inputFileLines`). Their WORDS
26
+ * come from each fact's own module; this builder only frames them. Every
27
+ * mounted skill is described on every turn, as the Cursor harness does:
28
+ * choosing skills by the message made the system prompt follow the
29
+ * message.
17
30
  * - This harness's: the framing — `## Heading` markdown sections, the house
18
31
  * style for a system prompt — and every text that quotes this engine's
19
32
  * tools: the `## Skills` activation protocol, the response rules, the
@@ -24,7 +37,8 @@
24
37
  *
25
38
  * The rendered bytes are load-bearing for the hermetic tests: `ScriptedModel`
26
39
  * tells its scripted roles apart by the system prompt's text, so this
27
- * module's whole output is pinned by `__tests__/prompt-goldens.test.ts`.
40
+ * module's whole output — the system prompt and the turn's message — is
41
+ * pinned by `__tests__/prompt-goldens.test.ts`.
28
42
  */
29
43
  import { relative } from "node:path";
30
44
  import { InteractionMode } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
@@ -32,7 +46,7 @@ import { formatConversationCatchupText } from "../../shared/conversation-catchup
32
46
  import { inputFileLines, standingContextSections, } from "../../shared/prompt-sections.js";
33
47
  import { effectiveInstructions } from "../../shared/builtin-assistant-prompt.js";
34
48
  import { PLAN_MODE_DIRECTIVE } from "../../shared/plan-mode-prompt.js";
35
- import { buildImplementPlanDirective, findApprovedPlanPath, } from "../../shared/implement-plan-prompt.js";
49
+ import { buildImplementPlanDirective } from "../../shared/implement-plan-prompt.js";
36
50
  import { STIGMER_LOCAL_STATE_DIR } from "../../shared/workspace/stigmer-link.js";
37
51
  import { DEFAULT_MAX_CONCURRENT } from "../../shared/subagent-gate.js";
38
52
  import { ENGINE_TOOL } from "./engine-tools.js";
@@ -127,15 +141,6 @@ export function buildEnhancedSystemPrompt(input) {
127
141
  if (input.channelTemplatesPromptSection) {
128
142
  prompt += "\n\n" + input.channelTemplatesPromptSection;
129
143
  }
130
- if (input.workspaceFileRefs.length > 0) {
131
- const refSection = buildReferencedFilesSection(input.workspaceFileRefs, input.workspaceRoot);
132
- if (refSection) {
133
- prompt += refSection;
134
- }
135
- }
136
- if (input.inputFiles.length > 0) {
137
- prompt += buildInputFilesSection(input.inputFiles, input.vision, input.downloadUrlKind);
138
- }
139
144
  // The standing context, in the shared order (the doctrine is stated once,
140
145
  // on `standingContextSections`); this harness only frames each section.
141
146
  for (const section of standingContextSections(input)) {
@@ -161,27 +166,41 @@ export function buildEnhancedSystemPrompt(input) {
161
166
  "`.stigmer/` directory); paths outside it are refused.";
162
167
  }
163
168
  if (input.buildFromPlan) {
164
- const planPath = findApprovedPlanPath(input.inputFiles.map((f) => f.relativePath));
165
169
  prompt +=
166
170
  "\n\n## Implement the approved plan\n\n" +
167
- buildImplementPlanDirective(planPath);
171
+ buildImplementPlanDirective(input.approvedPlanPath);
168
172
  }
169
173
  return prompt;
170
174
  }
171
175
  /**
172
- * Compose the turn's USER MESSAGE for the graph invocation: the framed
173
- * conversation catchup (cloud DD-006), when present, prepended to the
174
- * customer's message. In the user message and never the system prompt (A27):
175
- * the system prompt is rebuilt per invocation and would forget the digest one
176
- * turn later, while a message enters the checkpointer with the turn and
177
- * persists in history — the same durability the cursor harness gets from its
178
- * prompt prefix. The caller's `spec.message` is never mutated; the prepend
179
- * exists only in the graph input.
176
+ * Compose the turn's USER MESSAGE for the graph invocation: this turn's
177
+ * payload (its input files, then the workspace paths it references), then the
178
+ * framed conversation catchup (cloud DD-006), then what the user typed, each
179
+ * set off by a horizontal rule. Payload first and context closest to the task
180
+ * is the Cursor harness's resumed-turn order.
181
+ *
182
+ * In the user message and never the system prompt (A27, and the module
183
+ * header): the system prompt is rebuilt per invocation, so a turn's content
184
+ * there would vanish one turn later and, while it lasted, change the cached
185
+ * prefix; a message enters the checkpointer with the turn and persists in
186
+ * history, so a later turn still knows which files an earlier one carried.
187
+ * An approval resume sends no new message and needs none: the payload is
188
+ * already in the checkpointed one. The caller's `spec.message` is never
189
+ * mutated; the composition exists only in the graph input.
180
190
  */
181
- export function composeUserMessage(message, conversationCatchup) {
182
- return conversationCatchup
183
- ? `${formatConversationCatchupText(conversationCatchup)}\n\n---\n\n${message}`
184
- : message;
191
+ export function composeUserMessage(input) {
192
+ const parts = [];
193
+ if (input.inputFiles.length > 0) {
194
+ parts.push(buildInputFilesSection(input.inputFiles, input.vision, input.downloadUrlKind));
195
+ }
196
+ if (input.workspaceFileRefs.length > 0) {
197
+ parts.push(buildReferencedFilesSection(input.workspaceFileRefs));
198
+ }
199
+ if (input.conversationCatchup) {
200
+ parts.push(formatConversationCatchupText(input.conversationCatchup));
201
+ }
202
+ parts.push(input.message);
203
+ return parts.join("\n\n---\n\n");
185
204
  }
186
205
  /**
187
206
  * The `## Skills` section of this harness's system prompt, rendered from the
@@ -292,13 +311,13 @@ function formatEntryDescription(result) {
292
311
  "You are operating directly on the user's files — changes are " +
293
312
  "immediate and persistent. Use git to track and verify your changes.");
294
313
  }
314
+ // No commit: the clone's HEAD moves with every write-back commit, and a
315
+ // system prompt that names it would change on every such turn
316
+ // (`shared/workspace/sources/git.ts` says the same for one entry).
295
317
  if (result.sourceType === "git_repo" && result.gitMetadata) {
296
318
  const meta = result.gitMetadata;
297
- const shortSha = meta.baseCommit.length >= 7
298
- ? meta.baseCommit.slice(0, 7)
299
- : meta.baseCommit;
300
- return (`Workspace entry **${name}** was initialized from ` +
301
- `${meta.repoUrl} (branch: ${meta.branch}, commit: ${shortSha}).\n` +
319
+ const branch = meta.branch ? ` (branch: ${meta.branch})` : "";
320
+ return (`Workspace entry **${name}** was initialized from ${meta.repoUrl}${branch}.\n` +
302
321
  "Changes you make will be captured as artifacts when execution completes.");
303
322
  }
304
323
  if (result.sourceType === "empty") {
@@ -307,25 +326,22 @@ function formatEntryDescription(result) {
307
326
  }
308
327
  return result.workspaceDescription;
309
328
  }
310
- function buildReferencedFilesSection(workspaceFileRefs, _workspaceRoot) {
311
- if (workspaceFileRefs.length === 0)
312
- return "";
313
- let section = "\n\n## Referenced Files\n\n" +
329
+ /** The `## Referenced Files` part of the turn's message: the paths the user highlighted, one bullet each. */
330
+ function buildReferencedFilesSection(workspaceFileRefs) {
331
+ return ("## Referenced Files\n\n" +
314
332
  "The user has highlighted the following workspace paths for your " +
315
- `attention. Use \`${ENGINE_TOOL.readFile}\` to access file contents.\n\n`;
316
- for (const refPath of workspaceFileRefs) {
317
- section += `- \`${refPath}\`\n`;
318
- }
319
- return section;
333
+ `attention. Use \`${ENGINE_TOOL.readFile}\` to access file contents.\n\n` +
334
+ workspaceFileRefs.map((refPath) => `- \`${refPath}\``).join("\n"));
320
335
  }
321
336
  /**
322
- * The `## Input Files` section: this harness's intro (it names this engine's
323
- * file-reading tool) around the shared lines (`prompt-sections.ts` `inputFileLines`
324
- * says what each bullet and disclosure carries and why). Each disclosure
325
- * group is set off by a blank line, the markdown idiom.
337
+ * The `## Input Files` part of the turn's message: this harness's intro (it
338
+ * names this engine's file-reading tool) around the shared lines
339
+ * (`prompt-sections.ts` `inputFileLines` says what each bullet and disclosure
340
+ * carries and why). Each disclosure group is set off by a blank line, the
341
+ * markdown idiom.
326
342
  */
327
343
  function buildInputFilesSection(files, vision, downloadUrlKind) {
328
- let section = "\n\n## Input Files\n\n";
344
+ let section = "## Input Files\n\n";
329
345
  section +=
330
346
  "The following files have been provided as read-only reference " +
331
347
  "material for your task. They live under `.stigmer/inputs/` and " +
@@ -344,8 +360,7 @@ function buildInputFilesSection(files, vision, downloadUrlKind) {
344
360
  if (lines.vision.length > 0) {
345
361
  section += "\n" + lines.vision.join("\n") + "\n";
346
362
  }
347
- // Every section opens with its own blank line ("\n\n## ..."), so this one
348
- // ends on its last line rather than adding a second blank (#1127).
363
+ // The part ends on its last line; the message's rule sets it off (#1127).
349
364
  return section.replace(/\n+$/, "");
350
365
  }
351
366
  //# sourceMappingURL=prompt-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/prompt-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/prompt-builder.ts"],"names":[],"mappings":"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"}
@@ -16,17 +16,34 @@
16
16
  * Until #1096 the same correlation also fed the write-back
17
17
  * coordinator's per-file commit (`onFileModified`); write-back is
18
18
  * finalize-only now, the turn runtime's, so publishing is this trigger's one
19
- * effect. The loop (`turn-stream.ts`) drains {@link pendingPublishPromises}
20
- * in the settle.
19
+ * effect.
20
+ *
21
+ * One instance per turn, owned by the turn's transcript
22
+ * (`turn-stream.ts` `createDeepAgentTranscript`) and not by the stream loop,
23
+ * so the in-flight publishes outlive a stream that throws: the settle
24
+ * drains them before its safety net, and the turn's `finally`
25
+ * (`turn.ts`) drains them on every exit, a thrown turn included, before the
26
+ * runtime writes the terminal status (stigmer#1116). Until then the loop
27
+ * built this and handed the list out only on its return values, so a turn
28
+ * that threw left its uploads to land on a status already persisted for the
29
+ * last time.
21
30
  */
22
31
  import type { TranscriptEvent } from "../../harness/transcript/events.js";
23
32
  import type { InlinePublisher } from "./inline-publisher.js";
24
33
  export declare class StreamingSideEffects {
25
34
  private readonly inputCache;
26
35
  private readonly inlinePublisher;
27
- readonly pendingPublishPromises: Promise<void>[];
36
+ private readonly pending;
28
37
  constructor(opts: {
29
38
  inlinePublisher?: InlinePublisher;
30
39
  });
40
+ /** The publishes fired so far, in order; each resolves (a publish logs and swallows its own failure). */
41
+ get pendingPublishPromises(): readonly Promise<void>[];
42
+ /**
43
+ * Wait for every publish fired so far to land on the status. Idempotent:
44
+ * a second call over settled publishes returns at once. Bounded by the
45
+ * artifact storage's own per-call timeouts, as every drain has been.
46
+ */
47
+ drainPublishes(): Promise<void>;
31
48
  onEvent(event: TranscriptEvent): void;
32
49
  }