@bastani/atomic 0.9.5-alpha.8 → 0.9.5

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 (530) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/README.md +2 -2
  3. package/dist/builtin/cursor/CHANGELOG.md +12 -0
  4. package/dist/builtin/cursor/package.json +3 -3
  5. package/dist/builtin/cursor/src/model-mapper.ts +6 -3
  6. package/dist/builtin/intercom/CHANGELOG.md +37 -0
  7. package/dist/builtin/intercom/README.md +4 -2
  8. package/dist/builtin/intercom/broker/broker.ts +6 -114
  9. package/dist/builtin/intercom/broker/client.ts +29 -54
  10. package/dist/builtin/intercom/broker/delivered-message-cache.ts +44 -0
  11. package/dist/builtin/intercom/broker/pending-send-registry.ts +142 -0
  12. package/dist/builtin/intercom/broker/send-handler.ts +106 -0
  13. package/dist/builtin/intercom/broker/send-signature.ts +37 -0
  14. package/dist/builtin/intercom/foreground-detach-handoff.ts +136 -0
  15. package/dist/builtin/intercom/index-heavy.ts +49 -53
  16. package/dist/builtin/intercom/index.ts +278 -262
  17. package/dist/builtin/intercom/lazy-heavy-proxy.ts +114 -0
  18. package/dist/builtin/intercom/lazy-subagent-ack.ts +20 -0
  19. package/dist/builtin/intercom/lazy-tool-execution.ts +39 -0
  20. package/dist/builtin/intercom/lifecycle-lease.ts +51 -0
  21. package/dist/builtin/intercom/lifecycle.ts +37 -20
  22. package/dist/builtin/intercom/package.json +3 -6
  23. package/dist/builtin/intercom/reply-routing.ts +17 -0
  24. package/dist/builtin/intercom/subagent-relay.ts +58 -12
  25. package/dist/builtin/intercom/types.ts +3 -3
  26. package/dist/builtin/mcp/CHANGELOG.md +38 -0
  27. package/dist/builtin/mcp/OAUTH.md +1 -0
  28. package/dist/builtin/mcp/README.md +10 -6
  29. package/dist/builtin/mcp/apps-cancellation.ts +32 -0
  30. package/dist/builtin/mcp/call-tool-result.ts +9 -0
  31. package/dist/builtin/mcp/caller-wait.ts +50 -0
  32. package/dist/builtin/mcp/command-registration.ts +82 -0
  33. package/dist/builtin/mcp/direct-tool-executor.ts +279 -0
  34. package/dist/builtin/mcp/direct-tools.ts +40 -255
  35. package/dist/builtin/mcp/host-html-template.ts +4 -2
  36. package/dist/builtin/mcp/index.ts +274 -239
  37. package/dist/builtin/mcp/init.ts +96 -126
  38. package/dist/builtin/mcp/mcp-auth-flow.ts +247 -237
  39. package/dist/builtin/mcp/mcp-callback-server.ts +89 -68
  40. package/dist/builtin/mcp/mcp-oauth-provider.ts +23 -1
  41. package/dist/builtin/mcp/metadata-hydration.ts +52 -0
  42. package/dist/builtin/mcp/package.json +3 -3
  43. package/dist/builtin/mcp/proxy-auth.ts +4 -4
  44. package/dist/builtin/mcp/proxy-call.ts +111 -40
  45. package/dist/builtin/mcp/proxy-connect.ts +35 -15
  46. package/dist/builtin/mcp/proxy-info-modes.ts +106 -23
  47. package/dist/builtin/mcp/proxy-modes.ts +3 -3
  48. package/dist/builtin/mcp/session-cleanup-barrier.ts +43 -0
  49. package/dist/builtin/mcp/startup-warmup.ts +98 -0
  50. package/dist/builtin/mcp/state-lease.ts +12 -0
  51. package/dist/builtin/mcp/tool-result-renderer.ts +3 -3
  52. package/dist/builtin/mcp/ui-server.ts +8 -8
  53. package/dist/builtin/mcp/ui-session.ts +9 -18
  54. package/dist/builtin/subagents/CHANGELOG.md +78 -0
  55. package/dist/builtin/subagents/README.md +30 -29
  56. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  57. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  58. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  59. package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
  60. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  61. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  62. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  63. package/dist/builtin/subagents/agents/debugger.md +2 -2
  64. package/dist/builtin/subagents/agents/worker.md +2 -2
  65. package/dist/builtin/subagents/package.json +5 -5
  66. package/dist/builtin/subagents/prompts/review-loop.md +1 -1
  67. package/dist/builtin/subagents/skills/subagent/SKILL.md +37 -36
  68. package/dist/builtin/subagents/src/extension/api-lifecycle.ts +64 -0
  69. package/dist/builtin/subagents/src/extension/fanout-child.ts +44 -51
  70. package/dist/builtin/subagents/src/extension/index.ts +289 -320
  71. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +7 -10
  72. package/dist/builtin/subagents/src/extension/schemas.ts +22 -5
  73. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +89 -0
  74. package/dist/builtin/subagents/src/extension/tool-description.ts +29 -0
  75. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +13 -2
  76. package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -4
  77. package/dist/builtin/subagents/src/runs/background/async-event-journal.ts +106 -0
  78. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +26 -20
  79. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +13 -2
  80. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +3 -0
  81. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +1 -1
  82. package/dist/builtin/subagents/src/runs/background/completion-claims.ts +189 -0
  83. package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +44 -7
  84. package/dist/builtin/subagents/src/runs/background/completion-notification.ts +34 -0
  85. package/dist/builtin/subagents/src/runs/background/notify.ts +72 -22
  86. package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +232 -0
  87. package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +151 -0
  88. package/dist/builtin/subagents/src/runs/background/result-quarantine.ts +72 -0
  89. package/dist/builtin/subagents/src/runs/background/result-retry-scheduler.ts +48 -0
  90. package/dist/builtin/subagents/src/runs/background/result-status.ts +81 -0
  91. package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +59 -0
  92. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +177 -233
  93. package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +3 -2
  94. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +73 -14
  95. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +29 -15
  96. package/dist/builtin/subagents/src/runs/background/top-level-async.ts +1 -2
  97. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +1 -0
  98. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +1 -0
  99. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +1 -0
  100. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +7 -9
  101. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +3 -13
  102. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +2 -15
  103. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +2 -2
  104. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +63 -46
  105. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +48 -0
  106. package/dist/builtin/subagents/src/runs/foreground/execution-detach-route.ts +17 -0
  107. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +39 -26
  108. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +3 -1
  109. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +3 -51
  110. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +6 -11
  111. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +11 -2
  112. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +2 -0
  113. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +5 -112
  114. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +2 -0
  115. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +68 -118
  116. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +79 -7
  117. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -2
  118. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +3 -0
  119. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -2
  120. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +55 -12
  121. package/dist/builtin/subagents/src/shared/artifacts.ts +22 -11
  122. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +294 -0
  123. package/dist/builtin/subagents/src/shared/exclusive-file-publication.ts +44 -0
  124. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -0
  125. package/dist/builtin/subagents/src/shared/model-info.ts +2 -2
  126. package/dist/builtin/subagents/src/shared/settings.ts +20 -10
  127. package/dist/builtin/subagents/src/shared/types-async.ts +3 -1
  128. package/dist/builtin/subagents/src/shared/types-config.ts +2 -0
  129. package/dist/builtin/subagents/src/shared/types-runtime.ts +3 -2
  130. package/dist/builtin/subagents/src/slash/slash-commands.ts +9 -12
  131. package/dist/builtin/subagents/src/slash/slash-live-state.ts +63 -32
  132. package/dist/builtin/subagents/src/tui/render-result.ts +7 -0
  133. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -0
  134. package/dist/builtin/subagents/src/tui/render-widget.ts +157 -89
  135. package/dist/builtin/web-access/CHANGELOG.md +28 -0
  136. package/dist/builtin/web-access/README.md +4 -0
  137. package/dist/builtin/web-access/content-tools.ts +8 -3
  138. package/dist/builtin/web-access/index-heavy.ts +1 -1
  139. package/dist/builtin/web-access/index.ts +190 -46
  140. package/dist/builtin/web-access/lifecycle-lease.ts +38 -0
  141. package/dist/builtin/web-access/package.json +2 -2
  142. package/dist/builtin/web-access/result-renderers.ts +1 -1
  143. package/dist/builtin/web-access/summary-review.ts +1 -1
  144. package/dist/builtin/web-access/web-search-activity.ts +1 -1
  145. package/dist/builtin/web-access/web-search-return.ts +7 -0
  146. package/dist/builtin/web-access/web-search-summary.ts +1 -1
  147. package/dist/builtin/web-access/web-search-tool.ts +4 -2
  148. package/dist/builtin/workflows/CHANGELOG.md +86 -0
  149. package/dist/builtin/workflows/README.md +5 -5
  150. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +27 -4
  151. package/dist/builtin/workflows/builtin/goal-runner.ts +86 -27
  152. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +10 -0
  153. package/dist/builtin/workflows/builtin/ralph-core.ts +9 -9
  154. package/dist/builtin/workflows/builtin/ralph-models.ts +71 -36
  155. package/dist/builtin/workflows/builtin/ralph-runner.ts +20 -31
  156. package/dist/builtin/workflows/package.json +2 -2
  157. package/dist/builtin/workflows/skills/impeccable/SKILL.md +16 -13
  158. package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +1 -0
  159. package/dist/builtin/workflows/skills/impeccable/reference/adapt.native.md +58 -0
  160. package/dist/builtin/workflows/skills/impeccable/reference/android.md +40 -0
  161. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +2 -0
  162. package/dist/builtin/workflows/skills/impeccable/reference/audit.md +2 -0
  163. package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +139 -0
  164. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +69 -62
  165. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +21 -7
  166. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  167. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +92 -0
  168. package/dist/builtin/workflows/skills/impeccable/reference/init.md +29 -7
  169. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +45 -0
  170. package/dist/builtin/workflows/skills/impeccable/reference/layout.md +25 -1
  171. package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +23 -1
  172. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +2 -1
  173. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +75 -14
  174. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +1 -1
  175. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +31 -0
  176. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +64 -0
  177. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +118 -11
  178. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +16 -11
  179. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +66 -0
  180. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +42 -10
  181. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
  182. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +4 -6
  183. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +660 -0
  184. package/dist/builtin/workflows/skills/impeccable/scripts/hook-before-edit.mjs +516 -0
  185. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +1764 -0
  186. package/dist/builtin/workflows/skills/impeccable/scripts/hook.mjs +61 -0
  187. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +4 -2
  188. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +2 -2
  189. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +13 -16
  190. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +17 -11
  191. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +104 -37
  192. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +9 -0
  193. package/dist/builtin/workflows/src/durable/backend.ts +12 -0
  194. package/dist/builtin/workflows/src/durable/dbos-backend.ts +17 -1
  195. package/dist/builtin/workflows/src/durable/resume-catalog.ts +12 -0
  196. package/dist/builtin/workflows/src/durable/resume-runtime.ts +5 -2
  197. package/dist/builtin/workflows/src/durable/stage-primitive.ts +2 -1
  198. package/dist/builtin/workflows/src/durable/types.ts +16 -0
  199. package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -1
  200. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +1 -2
  201. package/dist/builtin/workflows/src/engine/run-returned-status.ts +50 -16
  202. package/dist/builtin/workflows/src/engine/run.ts +20 -19
  203. package/dist/builtin/workflows/src/engine/runtime.ts +5 -0
  204. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  205. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +9 -2
  206. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +137 -27
  207. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +22 -6
  208. package/dist/builtin/workflows/src/extension/public-types.ts +1 -1
  209. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +13 -1
  210. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +19 -4
  211. package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +9 -0
  212. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +17 -22
  213. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +48 -23
  214. package/dist/builtin/workflows/src/extension/workflow-schema.ts +15 -2
  215. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +20 -8
  216. package/dist/builtin/workflows/src/extension/workflow-tool.ts +24 -8
  217. package/dist/builtin/workflows/src/runs/background/status.ts +4 -3
  218. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +29 -8
  219. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +1 -1
  220. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +3 -2
  221. package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +1 -1
  222. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +155 -20
  223. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +6 -0
  224. package/dist/builtin/workflows/src/runs/shared/worktree.ts +2 -1
  225. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +2 -2
  226. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +2 -2
  227. package/dist/builtin/workflows/src/shared/resume-continuation.ts +2 -0
  228. package/dist/builtin/workflows/src/shared/returned-run-status.ts +116 -0
  229. package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +2 -0
  230. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +21 -3
  231. package/dist/builtin/workflows/src/tui/graph-view-state.ts +3 -0
  232. package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -0
  233. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +1 -23
  234. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +54 -9
  235. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +5 -2
  236. package/dist/builtin/workflows/src/tui/status-list.ts +22 -15
  237. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +4 -4
  238. package/dist/cli/args.d.ts.map +1 -1
  239. package/dist/cli/args.js +2 -2
  240. package/dist/cli/args.js.map +1 -1
  241. package/dist/core/agent-session-auto-compaction.d.ts +23 -3
  242. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  243. package/dist/core/agent-session-auto-compaction.js +129 -17
  244. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  245. package/dist/core/agent-session-events.d.ts.map +1 -1
  246. package/dist/core/agent-session-events.js +9 -1
  247. package/dist/core/agent-session-events.js.map +1 -1
  248. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  249. package/dist/core/agent-session-message-queue.js +1 -1
  250. package/dist/core/agent-session-message-queue.js.map +1 -1
  251. package/dist/core/agent-session-methods.d.ts +6 -3
  252. package/dist/core/agent-session-methods.d.ts.map +1 -1
  253. package/dist/core/agent-session-methods.js.map +1 -1
  254. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  255. package/dist/core/agent-session-prompt.js +2 -2
  256. package/dist/core/agent-session-prompt.js.map +1 -1
  257. package/dist/core/agent-session-retry.d.ts.map +1 -1
  258. package/dist/core/agent-session-retry.js +1 -1
  259. package/dist/core/agent-session-retry.js.map +1 -1
  260. package/dist/core/agent-session-services.d.ts.map +1 -1
  261. package/dist/core/agent-session-services.js +3 -2
  262. package/dist/core/agent-session-services.js.map +1 -1
  263. package/dist/core/agent-session-types.d.ts.map +1 -1
  264. package/dist/core/agent-session-types.js +1 -1
  265. package/dist/core/agent-session-types.js.map +1 -1
  266. package/dist/core/agent-session.d.ts +4 -2
  267. package/dist/core/agent-session.d.ts.map +1 -1
  268. package/dist/core/agent-session.js +4 -2
  269. package/dist/core/agent-session.js.map +1 -1
  270. package/dist/core/anthropic-thinking-guard.d.ts +5 -5
  271. package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
  272. package/dist/core/anthropic-thinking-guard.js +42 -32
  273. package/dist/core/anthropic-thinking-guard.js.map +1 -1
  274. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  275. package/dist/core/atomic-guide-command.js +15 -15
  276. package/dist/core/atomic-guide-command.js.map +1 -1
  277. package/dist/core/auth-storage.d.ts.map +1 -1
  278. package/dist/core/auth-storage.js +14 -9
  279. package/dist/core/auth-storage.js.map +1 -1
  280. package/dist/core/compaction/compaction.d.ts +2 -0
  281. package/dist/core/compaction/compaction.d.ts.map +1 -1
  282. package/dist/core/compaction/compaction.js +79 -46
  283. package/dist/core/compaction/compaction.js.map +1 -1
  284. package/dist/core/compaction/context-assistant-turns.d.ts +42 -0
  285. package/dist/core/compaction/context-assistant-turns.d.ts.map +1 -0
  286. package/dist/core/compaction/context-assistant-turns.js +87 -0
  287. package/dist/core/compaction/context-assistant-turns.js.map +1 -0
  288. package/dist/core/compaction/context-compaction-critical.d.ts +1 -1
  289. package/dist/core/compaction/context-compaction-critical.d.ts.map +1 -1
  290. package/dist/core/compaction/context-compaction-critical.js +2 -2
  291. package/dist/core/compaction/context-compaction-critical.js.map +1 -1
  292. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts +18 -0
  293. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts.map +1 -0
  294. package/dist/core/compaction/context-compaction-eviction-alternates.js +186 -0
  295. package/dist/core/compaction/context-compaction-eviction-alternates.js.map +1 -0
  296. package/dist/core/compaction/context-compaction-eviction.d.ts +10 -2
  297. package/dist/core/compaction/context-compaction-eviction.d.ts.map +1 -1
  298. package/dist/core/compaction/context-compaction-eviction.js +196 -146
  299. package/dist/core/compaction/context-compaction-eviction.js.map +1 -1
  300. package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
  301. package/dist/core/compaction/context-compaction-prompt.js +1 -1
  302. package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
  303. package/dist/core/compaction/context-compaction-types.d.ts +2 -0
  304. package/dist/core/compaction/context-compaction-types.d.ts.map +1 -1
  305. package/dist/core/compaction/context-compaction-types.js.map +1 -1
  306. package/dist/core/compaction/context-deletion-application.d.ts +5 -4
  307. package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
  308. package/dist/core/compaction/context-deletion-application.js +17 -15
  309. package/dist/core/compaction/context-deletion-application.js.map +1 -1
  310. package/dist/core/compaction/context-deletion-store.d.ts.map +1 -1
  311. package/dist/core/compaction/context-deletion-store.js +1 -1
  312. package/dist/core/compaction/context-deletion-store.js.map +1 -1
  313. package/dist/core/compaction/context-deletion-targets.d.ts +2 -1
  314. package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
  315. package/dist/core/compaction/context-deletion-targets.js +36 -31
  316. package/dist/core/compaction/context-deletion-targets.js.map +1 -1
  317. package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -1
  318. package/dist/core/compaction/context-deletion-tool-helpers.js +116 -43
  319. package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -1
  320. package/dist/core/compaction/context-transcript-analysis.d.ts +1 -2
  321. package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
  322. package/dist/core/compaction/context-transcript-analysis.js +33 -37
  323. package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
  324. package/dist/core/copilot-model-synthesis.d.ts.map +1 -1
  325. package/dist/core/copilot-model-synthesis.js +3 -1
  326. package/dist/core/copilot-model-synthesis.js.map +1 -1
  327. package/dist/core/extensions/loader-virtual-modules.d.ts +8 -1
  328. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  329. package/dist/core/extensions/loader-virtual-modules.js +2 -1
  330. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  331. package/dist/core/extensions/provider-types.d.ts +2 -7
  332. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  333. package/dist/core/extensions/provider-types.js.map +1 -1
  334. package/dist/core/footer-data-provider.d.ts +6 -0
  335. package/dist/core/footer-data-provider.d.ts.map +1 -1
  336. package/dist/core/footer-data-provider.js +72 -29
  337. package/dist/core/footer-data-provider.js.map +1 -1
  338. package/dist/core/messages.d.ts +9 -0
  339. package/dist/core/messages.d.ts.map +1 -1
  340. package/dist/core/messages.js +100 -18
  341. package/dist/core/messages.js.map +1 -1
  342. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  343. package/dist/core/model-registry-builtins.js +5 -0
  344. package/dist/core/model-registry-builtins.js.map +1 -1
  345. package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
  346. package/dist/core/model-registry-custom-loader.js +49 -8
  347. package/dist/core/model-registry-custom-loader.js.map +1 -1
  348. package/dist/core/model-registry-dynamic.d.ts.map +1 -1
  349. package/dist/core/model-registry-dynamic.js +11 -5
  350. package/dist/core/model-registry-dynamic.js.map +1 -1
  351. package/dist/core/model-registry-loader.d.ts.map +1 -1
  352. package/dist/core/model-registry-loader.js +8 -0
  353. package/dist/core/model-registry-loader.js.map +1 -1
  354. package/dist/core/model-registry-schemas.d.ts +93 -8
  355. package/dist/core/model-registry-schemas.d.ts.map +1 -1
  356. package/dist/core/model-registry-schemas.js +24 -12
  357. package/dist/core/model-registry-schemas.js.map +1 -1
  358. package/dist/core/model-registry-types.d.ts +7 -6
  359. package/dist/core/model-registry-types.d.ts.map +1 -1
  360. package/dist/core/model-registry-types.js.map +1 -1
  361. package/dist/core/model-registry.d.ts +5 -0
  362. package/dist/core/model-registry.d.ts.map +1 -1
  363. package/dist/core/model-registry.js +23 -0
  364. package/dist/core/model-registry.js.map +1 -1
  365. package/dist/core/model-resolver-cli.d.ts.map +1 -1
  366. package/dist/core/model-resolver-cli.js +33 -5
  367. package/dist/core/model-resolver-cli.js.map +1 -1
  368. package/dist/core/model-resolver-initial.d.ts +6 -1
  369. package/dist/core/model-resolver-initial.d.ts.map +1 -1
  370. package/dist/core/model-resolver-initial.js +12 -7
  371. package/dist/core/model-resolver-initial.js.map +1 -1
  372. package/dist/core/model-resolver.d.ts +1 -1
  373. package/dist/core/model-resolver.d.ts.map +1 -1
  374. package/dist/core/model-resolver.js +1 -1
  375. package/dist/core/model-resolver.js.map +1 -1
  376. package/dist/core/openai-responses-payload-sanitizer.d.ts +1 -0
  377. package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -1
  378. package/dist/core/openai-responses-payload-sanitizer.js +24 -9
  379. package/dist/core/openai-responses-payload-sanitizer.js.map +1 -1
  380. package/dist/core/resource-loader-context-files.d.ts +1 -0
  381. package/dist/core/resource-loader-context-files.d.ts.map +1 -1
  382. package/dist/core/resource-loader-context-files.js +13 -10
  383. package/dist/core/resource-loader-context-files.js.map +1 -1
  384. package/dist/core/sdk.d.ts.map +1 -1
  385. package/dist/core/sdk.js +2 -2
  386. package/dist/core/sdk.js.map +1 -1
  387. package/dist/core/session-entry-normalization.d.ts +7 -0
  388. package/dist/core/session-entry-normalization.d.ts.map +1 -0
  389. package/dist/core/session-entry-normalization.js +14 -0
  390. package/dist/core/session-entry-normalization.js.map +1 -0
  391. package/dist/core/session-manager-core.d.ts.map +1 -1
  392. package/dist/core/session-manager-core.js +1 -0
  393. package/dist/core/session-manager-core.js.map +1 -1
  394. package/dist/core/session-manager-history.d.ts +2 -2
  395. package/dist/core/session-manager-history.d.ts.map +1 -1
  396. package/dist/core/session-manager-history.js +127 -108
  397. package/dist/core/session-manager-history.js.map +1 -1
  398. package/dist/core/settings-manager-basic-accessors.d.ts +2 -2
  399. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  400. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  401. package/dist/core/settings-types.d.ts +1 -1
  402. package/dist/core/settings-types.d.ts.map +1 -1
  403. package/dist/core/settings-types.js.map +1 -1
  404. package/dist/core/slash-commands.d.ts +2 -0
  405. package/dist/core/slash-commands.d.ts.map +1 -1
  406. package/dist/core/slash-commands.js +141 -0
  407. package/dist/core/slash-commands.js.map +1 -1
  408. package/dist/core/tools/bash.d.ts.map +1 -1
  409. package/dist/core/tools/bash.js +11 -8
  410. package/dist/core/tools/bash.js.map +1 -1
  411. package/dist/index.d.ts +1 -0
  412. package/dist/index.d.ts.map +1 -1
  413. package/dist/index.js +1 -0
  414. package/dist/index.js.map +1 -1
  415. package/dist/main-deferred-startup.d.ts.map +1 -1
  416. package/dist/main-deferred-startup.js +2 -2
  417. package/dist/main-deferred-startup.js.map +1 -1
  418. package/dist/main-early-input.d.ts.map +1 -1
  419. package/dist/main-early-input.js +7 -0
  420. package/dist/main-early-input.js.map +1 -1
  421. package/dist/main-session.d.ts.map +1 -1
  422. package/dist/main-session.js +1 -0
  423. package/dist/main-session.js.map +1 -1
  424. package/dist/main.d.ts.map +1 -1
  425. package/dist/main.js +1 -1
  426. package/dist/main.js.map +1 -1
  427. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  428. package/dist/modes/interactive/components/chat-session-host-actions.js +0 -1
  429. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  430. package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -1
  431. package/dist/modes/interactive/components/settings-selector-options.js +3 -1
  432. package/dist/modes/interactive/components/settings-selector-options.js.map +1 -1
  433. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  434. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  435. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  436. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
  437. package/dist/modes/interactive/interactive-agent-events.js +3 -1
  438. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  439. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  440. package/dist/modes/interactive/interactive-autocomplete.js +21 -9
  441. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  442. package/dist/modes/interactive/interactive-child-ordering.d.ts +7 -0
  443. package/dist/modes/interactive/interactive-child-ordering.d.ts.map +1 -0
  444. package/dist/modes/interactive/interactive-child-ordering.js +26 -0
  445. package/dist/modes/interactive/interactive-child-ordering.js.map +1 -0
  446. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  447. package/dist/modes/interactive/interactive-deferred-startup.js +43 -30
  448. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  449. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
  450. package/dist/modes/interactive/interactive-hotkeys-debug.js +1 -0
  451. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  452. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  453. package/dist/modes/interactive/interactive-input-handling.js +41 -6
  454. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  455. package/dist/modes/interactive/interactive-mode-base.d.ts +3 -0
  456. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  457. package/dist/modes/interactive/interactive-mode-base.js +3 -0
  458. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  459. package/dist/modes/interactive/interactive-mode-deps.d.ts +2 -2
  460. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  461. package/dist/modes/interactive/interactive-mode-deps.js +2 -2
  462. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  463. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -2
  464. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  465. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  466. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  467. package/dist/modes/interactive/interactive-model-routing.js +11 -4
  468. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  469. package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
  470. package/dist/modes/interactive/interactive-process-lifecycle.js +0 -3
  471. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  472. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
  473. package/dist/modes/interactive/interactive-render-chat.js +15 -1
  474. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  475. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
  476. package/dist/modes/interactive/interactive-session-routing.js +5 -1
  477. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  478. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  479. package/dist/modes/interactive/interactive-startup.js +20 -21
  480. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  481. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
  482. package/dist/modes/interactive/theme/global-theme.js +26 -2
  483. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  484. package/dist/modes/interactive/theme/theme-class.d.ts +1 -1
  485. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  486. package/dist/modes/interactive/theme/theme-class.js +2 -0
  487. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  488. package/dist/utils/clipboard-image.d.ts.map +1 -1
  489. package/dist/utils/clipboard-image.js +3 -0
  490. package/dist/utils/clipboard-image.js.map +1 -1
  491. package/dist/utils/fs-watch.d.ts +24 -1
  492. package/dist/utils/fs-watch.d.ts.map +1 -1
  493. package/dist/utils/fs-watch.js +60 -5
  494. package/dist/utils/fs-watch.js.map +1 -1
  495. package/docs/changelog.mdx +19 -0
  496. package/docs/compaction.md +60 -49
  497. package/docs/custom-provider.md +18 -5
  498. package/docs/development.md +4 -0
  499. package/docs/extensions.md +11 -2
  500. package/docs/json.md +1 -1
  501. package/docs/models.md +69 -10
  502. package/docs/providers.md +1 -1
  503. package/docs/quickstart.md +12 -8
  504. package/docs/rpc.md +2 -2
  505. package/docs/sdk.md +1 -1
  506. package/docs/settings.md +4 -4
  507. package/docs/subagents.md +40 -5
  508. package/docs/tools.md +1 -1
  509. package/docs/usage.md +4 -2
  510. package/docs/windows.md +4 -0
  511. package/docs/workflows.md +33 -48
  512. package/examples/extensions/preset.ts +2 -2
  513. package/examples/extensions/subagent/README.md +2 -2
  514. package/examples/extensions/subagent/index.ts +1 -2
  515. package/examples/extensions/subagent/schemas.ts +4 -1
  516. package/examples/sdk/12-full-control.ts +1 -1
  517. package/npm-shrinkwrap.json +48 -51
  518. package/package.json +7 -7
  519. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +0 -75
  520. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +0 -202
  521. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +0 -97
  522. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +0 -160
  523. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +0 -72
  524. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +0 -161
  525. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +0 -203
  526. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +0 -234
  527. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +0 -103
  528. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +0 -29
  529. package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +0 -9
  530. package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +0 -117
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Impeccable design hook — PostToolUse entry point.
4
+ *
5
+ * Reads the Claude Code / Codex / Cursor hook event from stdin, runs the design
6
+ * detector against the touched file, and emits a system reminder via
7
+ * `hookSpecificOutput.additionalContext` when findings exist.
8
+ *
9
+ * Contract: never break a turn. Always exit 0. Clean files emit a small ack
10
+ * unless quiet mode is enabled.
11
+ *
12
+ * Most logic lives in `hook-lib.mjs` so it is unit-testable without a
13
+ * subprocess. This file is the thin stdin/stdout adapter.
14
+ */
15
+
16
+ import { runHook, writeAuditLog } from './hook-lib.mjs';
17
+
18
+ async function readStdin() {
19
+ if (process.stdin.isTTY) return '';
20
+ const chunks = [];
21
+ for await (const chunk of process.stdin) chunks.push(chunk);
22
+ return Buffer.concat(chunks).toString('utf-8');
23
+ }
24
+
25
+ async function main() {
26
+ // Snapshot the inherited env FIRST so the re-entrancy guard checks the
27
+ // parent's value, not the value we are about to export for any child
28
+ // processes the hook might ever spawn.
29
+ const inheritedEnv = { ...process.env };
30
+ process.env.IMPECCABLE_HOOK_DEPTH = process.env.IMPECCABLE_HOOK_DEPTH || '1';
31
+
32
+ let stdinJson = '';
33
+ try { stdinJson = await readStdin(); } catch { /* fall through */ }
34
+
35
+ const result = await runHook({
36
+ stdinJson,
37
+ env: inheritedEnv,
38
+ cwd: process.cwd(),
39
+ });
40
+
41
+ writeAuditLog(process.env, result.audit, process.cwd());
42
+
43
+ if (result.stdout) process.stdout.write(result.stdout);
44
+ process.exit(result.exitCode || 0);
45
+ }
46
+
47
+ main().catch((err) => {
48
+ // Last-ditch: never break the agent's turn even if something we did not
49
+ // anticipate goes wrong. Audit-log the failure if logging is enabled.
50
+ try {
51
+ writeAuditLog(process.env, {
52
+ ts: new Date().toISOString(),
53
+ event: 'PostToolUse',
54
+ error: String(err && err.message ? err.message : err),
55
+ });
56
+ } catch { /* swallow */ }
57
+ if (process.env.IMPECCABLE_HOOK_DEBUG) {
58
+ process.stderr.write(`[impeccable-hook] ${err}\n`);
59
+ }
60
+ process.exit(0);
61
+ });
@@ -459,11 +459,13 @@ export function filterDetectionFindings(findings, config) {
459
459
  function isIgnoredFindingValue(finding, ignoreValues) {
460
460
  if (!Array.isArray(ignoreValues) || ignoreValues.length === 0) return false;
461
461
  const rule = normalizeIgnoreRule(finding.antipattern);
462
+ if (!rule) return false;
463
+ // File-scoped wildcards suppress rules with no extractable value, such as side-tab.
462
464
  const value = extractFindingIgnoreValue(finding);
463
- if (!rule || !value) return false;
464
465
  return ignoreValues.some((entry) => {
466
+ if (entry.rule !== rule) return false;
465
467
  const wildcardValue = entry.value === '*';
466
- if (entry.rule !== rule || (!wildcardValue && !ignoreValueMatches(rule, entry.value, value))) return false;
468
+ if (!wildcardValue && (!value || !ignoreValueMatches(rule, entry.value, value))) return false;
467
469
  if (!Array.isArray(entry.files) || entry.files.length === 0) return !wildcardValue;
468
470
  return findingMatchesScopedIgnoreFile(finding, entry.files);
469
471
  });
@@ -41,12 +41,12 @@ export function isGeneratedFile(filePath, options = {}) {
41
41
 
42
42
  function isGitIgnored(absPath, cwd) {
43
43
  try {
44
- execFileSync('git', ['check-ignore', '--quiet', absPath], {
44
+ execFileSync('git', ['check-ignore', '--quiet', '--', absPath], {
45
45
  cwd,
46
46
  stdio: 'ignore',
47
47
  });
48
48
  return true; // exit 0 = ignored
49
- } catch (err) {
49
+ } catch {
50
50
  // Exit code 1 = not ignored. Exit code 128 = not a git repo or other error.
51
51
  // In both cases, treat as "not known to be ignored."
52
52
  return false;
@@ -97,9 +97,9 @@ export function substitutePropsWithExprs(markup, contract) {
97
97
 
98
98
  export function parseSvelteComponentFile(content) {
99
99
  const text = String(content || '');
100
- const scriptMatch = text.match(/^([\s\S]*?)<script\b[^>]*>[\s\S]*?<\/script[^>]*>/i);
100
+ const scriptMatch = text.match(/^([\s\S]*?)<script\b[^>]*>[\s\S]*?<\/script\b[^>]*>/i);
101
101
  const withoutScript = scriptMatch ? text.slice(scriptMatch[0].length) : text;
102
- const styleMatch = withoutScript.match(/<style\b[^>]*>[\s\S]*?<\/style[^>]*>/i);
102
+ const styleMatch = withoutScript.match(/<style\b[^>]*>[\s\S]*?<\/style\b[^>]*>/i);
103
103
  const styleBlock = styleMatch ? styleMatch[0] : '';
104
104
  const markup = styleMatch
105
105
  ? withoutScript.slice(0, styleMatch.index).trim()
@@ -107,7 +107,7 @@ export function parseSvelteComponentFile(content) {
107
107
  const cssLines = styleBlock
108
108
  ? styleBlock
109
109
  .replace(/^<style\b[^>]*>/i, '')
110
- .replace(/<\/style\s*>$/i, '')
110
+ .replace(/<\/style\b[^>]*>$/i, '')
111
111
  .split('\n')
112
112
  .map((line) => line.trimEnd())
113
113
  : [];
@@ -290,7 +290,7 @@ function appendCssToSvelteStyle(lines, cssLines) {
290
290
 
291
291
  function findLastStyleCloseLine(lines) {
292
292
  for (let i = lines.length - 1; i >= 0; i--) {
293
- if (/<\/style\s*>/.test(lines[i])) return i;
293
+ if (/<\/style\b[^>]*>/.test(lines[i])) return i;
294
294
  }
295
295
  return -1;
296
296
  }
@@ -632,24 +632,21 @@ function inlineSvelteComponentInsertAccept({
632
632
  }
633
633
 
634
634
  function svelteMarkupHasVisibleContent(markup) {
635
- const raw = String(markup || '');
636
- // Strip script/style/comment blocks to a fixpoint so partially-overlapping
637
- // sequences cannot survive a single pass (CodeQL: complete sanitization).
638
- let text = raw;
639
- let prev;
635
+ let stripped = String(markup || '');
636
+ let previous;
640
637
  do {
641
- prev = text;
642
- text = text
643
- .replace(/<script\b[^>]*>[\s\S]*?<\/script[^>]*>/gi, '')
644
- .replace(/<style\b[^>]*>[\s\S]*?<\/style[^>]*>/gi, '')
638
+ previous = stripped;
639
+ stripped = stripped
640
+ .replace(/<script[\s\S]*?<\/script\b[^>]*>/gi, ' ')
641
+ .replace(/<style[\s\S]*?<\/style\b[^>]*>/gi, ' ')
645
642
  .replace(/<!--[\s\S]*?-->/g, '');
646
- } while (text !== prev);
647
- text = text
643
+ } while (stripped !== previous);
644
+ const text = stripped
648
645
  .replace(/<[^>]+>/g, ' ')
649
646
  .replace(/\s+/g, ' ')
650
647
  .trim();
651
648
  if (text.length > 0) return true;
652
- return /<(img|svg|canvas|video|audio|picture|input|button|select|textarea)\b/i.test(raw);
649
+ return /<(img|svg|canvas|video|audio|picture|input|button|select|textarea)\b/i.test(markup || '');
653
650
  }
654
651
 
655
652
  function mergeOriginalTopLevelAttrs(markup, originalMarkup) {
@@ -400,12 +400,18 @@ function readHtmlAttr(tag, name) {
400
400
  return decodeHtmlAttr(match[2]);
401
401
  }
402
402
 
403
+ const HTML_ATTR_ENTITIES = {
404
+ '&quot;': '"',
405
+ '&lt;': '<',
406
+ '&gt;': '>',
407
+ '&amp;': '&',
408
+ };
409
+
403
410
  function decodeHtmlAttr(value) {
404
- return String(value || '')
405
- .replace(/&quot;/g, '"')
406
- .replace(/&lt;/g, '<')
407
- .replace(/&gt;/g, '>')
408
- .replace(/&amp;/g, '&');
411
+ return String(value || '').replace(
412
+ /&(?:quot|lt|gt|amp);/g,
413
+ (entity) => HTML_ATTR_ENTITIES[entity] || entity,
414
+ );
409
415
  }
410
416
 
411
417
  // ---------------------------------------------------------------------------
@@ -531,8 +537,8 @@ function stripStyleAndJoin(lines, block) {
531
537
  // Strip any complete <style> elements on this line (self-closed or
532
538
  // same-line-closed), including their body content.
533
539
  line = line
534
- .replace(/<style\b[^>]*>[\s\S]*?<\/style[^>]*>/g, '')
535
- .replace(/<style\b[^>]*\/\s*>/g, '');
540
+ .replace(/<style\b[^>]*>[\s\S]*?<\/style\b[^>]*>/g, ' ')
541
+ .replace(/<style\b[^>]*\/\s*>/g, ' ');
536
542
 
537
543
  // If a <style> opener remains (multi-line body starts here), strip from
538
544
  // the opener to end-of-line and flip into skip mode.
@@ -544,10 +550,10 @@ function stripStyleAndJoin(lines, block) {
544
550
  out.push(line);
545
551
  } else {
546
552
  // In multi-line style body; drop everything until we see </style>.
547
- const closeIdx = line.search(/<\/style\s*>/);
553
+ const closeIdx = line.search(/<\/style\b[^>]*>/);
548
554
  if (closeIdx !== -1) {
549
555
  inStyle = false;
550
- out.push(line.slice(closeIdx).replace(/<\/style\s*>/, ''));
556
+ out.push(line.slice(closeIdx).replace(/<\/style\b[^>]*>/, ' '));
551
557
  }
552
558
  // else: skip line entirely
553
559
  }
@@ -637,7 +643,7 @@ function extractCss(lines, block, id) {
637
643
  // Self-closing: nothing to carbonize.
638
644
  if (/<style\b[^>]*\/\s*>/.test(line)) return null;
639
645
  // Same-line open + close: extract inner text.
640
- const sameLine = line.match(/<style\b[^>]*>([\s\S]*?)<\/style[^>]*>/);
646
+ const sameLine = line.match(/<style\b[^>]*>([\s\S]*?)<\/style\b[^>]*>/);
641
647
  if (sameLine) {
642
648
  const inner = stripJsxTemplateWrap(sameLine[1]);
643
649
  return inner.length > 0 ? inner.split('\n') : null;
@@ -650,7 +656,7 @@ function extractCss(lines, block, id) {
650
656
  // Detect </style> anywhere on the line — JSX template-literal closes
651
657
  // (`}</style>`) put the close mid-line, and we don't want to absorb the
652
658
  // template-literal punctuation as CSS content.
653
- const closeIdx = line.indexOf('</style>');
659
+ const closeIdx = line.search(/<\/style\b[^>]*>/);
654
660
  if (closeIdx !== -1) break;
655
661
  content.push(line);
656
662
  }
@@ -153,6 +153,7 @@
153
153
  let scrollLockRaf = null;
154
154
  let scrollLockAbort = null;
155
155
  const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
156
+ const VARIANT_STATE_STYLE_ID = 'impeccable-variant-state';
156
157
 
157
158
  // Dedicated key for scroll position - SEPARATE from LS_KEY so that
158
159
  // saveSession's state updates don't clobber a carefully-captured scrollY.
@@ -3035,16 +3036,26 @@
3035
3036
  function applyParamValue(variantEl, param, value) {
3036
3037
  if (!variantEl) return;
3037
3038
  const attr = 'data-p-' + param.id;
3038
- if (param.kind === 'range') {
3039
- variantEl.style.setProperty('--p-' + param.id, String(value));
3040
- } else if (param.kind === 'toggle') {
3039
+ if (param.kind === 'toggle') {
3041
3040
  const on = !!value;
3042
- variantEl.style.setProperty('--p-' + param.id, on ? '1' : '0');
3043
3041
  if (on) variantEl.setAttribute(attr, 'on');
3044
3042
  else variantEl.removeAttribute(attr);
3045
3043
  } else if (param.kind === 'steps') {
3046
3044
  variantEl.setAttribute(attr, String(value));
3047
3045
  }
3046
+ // Svelte component variants are client-mounted into
3047
+ // [data-impeccable-component-mount] with no [data-impeccable-variant="N"]
3048
+ // wrapper for the state stylesheet to target, and the element is not SSR'd,
3049
+ // so there is no React hydration to mismatch. Drive range/toggle --p-* inline
3050
+ // on the mounted element so scoped preview CSS resolves them.
3051
+ if (svelteComponentSession?.sessionId === currentSessionId) {
3052
+ if (param.kind === 'range') variantEl.style.setProperty('--p-' + param.id, String(value));
3053
+ else if (param.kind === 'toggle') variantEl.style.setProperty('--p-' + param.id, value ? '1' : '0');
3054
+ return;
3055
+ }
3056
+ // range/toggle --p-* custom properties are driven through the injected
3057
+ // variant-state stylesheet so we never mutate inline style on SSR'd divs.
3058
+ updateVariantStateStylesheet(currentSessionId, visibleVariant);
3048
3059
  }
3049
3060
 
3050
3061
  function applyParamDefaults(variantEl, params) {
@@ -4714,6 +4725,7 @@
4714
4725
  paramsCurrentValues = {};
4715
4726
  tuneOpen = false;
4716
4727
  hideParamsPanel();
4728
+ if (currentSessionId && visibleVariant) updateVariantStateStylesheet(currentSessionId, visibleVariant);
4717
4729
  return;
4718
4730
  }
4719
4731
  applyParamDefaults(variantEl, params);
@@ -4771,20 +4783,7 @@
4771
4783
 
4772
4784
  function isVariantShown(el) {
4773
4785
  if (!el) return false;
4774
- if (el.hidden) return false;
4775
- if (el.style?.display === 'none') return false;
4776
- return true;
4777
- }
4778
-
4779
- function setVariantShown(el, shown) {
4780
- if (!el) return;
4781
- if (shown) {
4782
- el.removeAttribute('hidden');
4783
- el.style.display = '';
4784
- } else {
4785
- el.setAttribute('hidden', '');
4786
- el.style.display = 'none';
4787
- }
4786
+ return getComputedStyle(el).display !== 'none';
4788
4787
  }
4789
4788
 
4790
4789
  function scheduleCyclingBarSync(sessionId, variantNum) {
@@ -4823,11 +4822,7 @@
4823
4822
  }
4824
4823
  const wrapper = document.querySelector('[data-impeccable-variants="' + sessionId + '"]');
4825
4824
  if (!wrapper) return false;
4826
- for (const child of wrapper.children) {
4827
- const v = child.dataset ? child.dataset.impeccableVariant : null;
4828
- if (!v) continue;
4829
- setVariantShown(child, v === String(num));
4830
- }
4825
+ updateVariantStateStylesheet(sessionId, num);
4831
4826
  // Unconditional refresh - covers first-reveal (no-op if state isn't
4832
4827
  // CYCLING yet, the subsequent CYCLING transition triggers its own
4833
4828
  // refresh) and every cycle step.
@@ -5081,7 +5076,7 @@
5081
5076
  }
5082
5077
 
5083
5078
  function extractSvelteComponentStyle(source) {
5084
- const match = String(source || '').match(/<style\b[^>]*>([\s\S]*?)<\/style\s*>/i);
5079
+ const match = String(source || '').match(/<style\b[^>]*>([\s\S]*?)<\/style\b[^>]*>/i);
5085
5080
  return match ? match[1].trim() : '';
5086
5081
  }
5087
5082
 
@@ -5109,7 +5104,8 @@
5109
5104
  }
5110
5105
 
5111
5106
  function scopeCssToSveltePreview(css, sessionId) {
5112
- const prefix = '[data-impeccable-variants="' + String(sessionId).replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"] ';
5107
+ const escapedSessionId = String(sessionId).replace(/\\/g, '\\\\').replace(/"/g, '\\"');
5108
+ const prefix = '[data-impeccable-variants="' + escapedSessionId + '"] ';
5113
5109
  return scopeCssBlock(String(css || ''), prefix).trim();
5114
5110
  }
5115
5111
 
@@ -5492,6 +5488,7 @@
5492
5488
  if (pendingSvelteComponentRetryObserver) { pendingSvelteComponentRetryObserver.disconnect(); pendingSvelteComponentRetryObserver = null; }
5493
5489
  if (pendingVariantAnchorRetryObserver) { pendingVariantAnchorRetryObserver.disconnect(); pendingVariantAnchorRetryObserver = null; }
5494
5490
  stopScrollLock();
5491
+ removeVariantStateStylesheet();
5495
5492
  clearSession();
5496
5493
  clearHandled();
5497
5494
  resetSessionFileMeta();
@@ -5609,7 +5606,7 @@
5609
5606
  if (!/\.[cm]?[jt]sx$/i.test(String(filePath || ''))) return block;
5610
5607
  return String(block)
5611
5608
  .replace(
5612
- /<style\b([^>]*)>\s*\{\s*`([\s\S]*?)`\s*\}\s*<\/style[^>]*>/g,
5609
+ /<style\b([^>]*)>\s*\{\s*`([\s\S]*?)`\s*\}\s*<\/style\b[^>]*>/g,
5613
5610
  (_match, attrs, css) => '<style' + attrs + '>' + css + '</style>',
5614
5611
  )
5615
5612
  .replace(/\bclassName\s*=\s*\{\s*`([^`]*?)`\s*\}/g, (_match, value) => {
@@ -5806,6 +5803,68 @@
5806
5803
  return variantDiv;
5807
5804
  }
5808
5805
 
5806
+ // Variant visibility and range/toggle params are expressed through ONE
5807
+ // injected stylesheet, never inline attributes on the variant divs. Those
5808
+ // divs are scaffolded into page source, so SSR frameworks (Next.js App
5809
+ // Router) server-render them; toggling their `hidden` / inline `style` /
5810
+ // `--p-*` client-side trips a React 19 hydration mismatch on the next
5811
+ // Fast-Refresh re-render — the same failure mode the scroll-anchor (#276)
5812
+ // and pick-cursor (#286) fixes address. A stylesheet rule has the same
5813
+ // computed effect without mutating any hydrated element's attributes.
5814
+ // (steps params keep driving `data-p-*` attributes, matching scoped CSS.)
5815
+ const VARIANT_HIDE_DECL = 'display: none !important;';
5816
+ const VARIANT_SHOW_DECL = 'display: block !important;';
5817
+
5818
+ // Build a direct-child variant selector for a session. With `num`, targets a
5819
+ // single variant (`… > [data-impeccable-variant="N"]`); without it, targets
5820
+ // every variant via the bare `[data-impeccable-variant]` attribute.
5821
+ function variantStateSelector(sessionId, num) {
5822
+ const wrapper = '[data-impeccable-variants="' + sessionId + '"]';
5823
+ const variant = num == null
5824
+ ? '[data-impeccable-variant]'
5825
+ : '[data-impeccable-variant="' + num + '"]';
5826
+ return wrapper + ' > ' + variant;
5827
+ }
5828
+
5829
+ // Serialize the visible variant's knob values into `--p-<id>` custom-property
5830
+ // declarations. Only range (number) and toggle (boolean) values become a
5831
+ // custom property; steps params drive `data-p-*` attributes instead.
5832
+ function variantParamDecls(values) {
5833
+ return Object.entries(values || {})
5834
+ .map(([id, val]) => {
5835
+ if (typeof val === 'number') return ' --p-' + id + ': ' + val + ';';
5836
+ if (typeof val === 'boolean') return ' --p-' + id + ': ' + (val ? '1' : '0') + ';';
5837
+ return '';
5838
+ })
5839
+ .join('');
5840
+ }
5841
+
5842
+ function updateVariantStateStylesheet(sessionId, num) {
5843
+ if (!sessionId || num == null || num < 1) return;
5844
+
5845
+ let styleEl = document.getElementById(VARIANT_STATE_STYLE_ID);
5846
+ if (!styleEl) {
5847
+ styleEl = document.createElement('style');
5848
+ styleEl.id = VARIANT_STATE_STYLE_ID;
5849
+ (document.head || document.documentElement).appendChild(styleEl);
5850
+ }
5851
+
5852
+ // Hide every variant except the visible one (incl. the SSR'd "original").
5853
+ const hideOthers = variantStateSelector(sessionId)
5854
+ + ':not([data-impeccable-variant="' + num + '"]) { ' + VARIANT_HIDE_DECL + ' }';
5855
+
5856
+ // Force-show the visible variant (beats the source inline display:none on
5857
+ // v2/v3) and apply its knob values as custom properties.
5858
+ const showVisible = variantStateSelector(sessionId, num)
5859
+ + ' { ' + VARIANT_SHOW_DECL + variantParamDecls(paramsCurrentValues) + ' }';
5860
+
5861
+ styleEl.textContent = hideOthers + '\n' + showVisible + '\n';
5862
+ }
5863
+
5864
+ function removeVariantStateStylesheet() {
5865
+ document.getElementById(VARIANT_STATE_STYLE_ID)?.remove();
5866
+ }
5867
+
5809
5868
  // Hold window.scrollY at a fixed value across DOM mutations inside the
5810
5869
  // session's wrapper (HMR patches, variant inserts, cycle swaps).
5811
5870
  function startScrollLock(sessionId, initialTargetY) {
@@ -7636,6 +7695,7 @@ void main() {
7636
7695
  stopScrollTracking();
7637
7696
  if (variantObserver) { variantObserver.disconnect(); variantObserver = null; }
7638
7697
  stopScrollLock();
7698
+ removeVariantStateStylesheet();
7639
7699
  clearScrollY();
7640
7700
  clearSession();
7641
7701
  resetSessionFileMeta();
@@ -7897,6 +7957,7 @@ void main() {
7897
7957
  if (variantObserver) { variantObserver.disconnect(); variantObserver = null; }
7898
7958
  if (pendingVariantAnchorRetryObserver) { pendingVariantAnchorRetryObserver.disconnect(); pendingVariantAnchorRetryObserver = null; }
7899
7959
  stopScrollLock();
7960
+ removeVariantStateStylesheet();
7900
7961
  clearScrollY();
7901
7962
  finalizeInsertSession();
7902
7963
  clearSession();
@@ -7928,7 +7989,7 @@ void main() {
7928
7989
  const barTopFromBottom = barRect && barRect.height > 0
7929
7990
  ? Math.max(16, window.innerHeight - barRect.top + 12)
7930
7991
  : 16;
7931
- toastEl = el('div', {
7992
+ const currentToast = el('div', {
7932
7993
  position: 'fixed', bottom: barTopFromBottom + 'px', left: '50%',
7933
7994
  transform: 'translateX(-50%) translateY(8px)',
7934
7995
  background: C.ink, color: C.white,
@@ -7938,19 +7999,24 @@ void main() {
7938
7999
  transition: 'opacity 0.25s ' + EASE + ', transform 0.25s ' + EASE,
7939
8000
  pointerEvents: 'none', maxWidth: '420px', textAlign: 'center',
7940
8001
  });
7941
- toastEl.id = PREFIX + '-toast';
7942
- toastEl.textContent = message;
7943
- uiAppend(toastEl);
8002
+ toastEl = currentToast;
8003
+ currentToast.id = PREFIX + '-toast';
8004
+ currentToast.textContent = message;
8005
+ uiAppend(currentToast);
7944
8006
  requestAnimationFrame(() => {
7945
- toastEl.style.opacity = '1';
7946
- toastEl.style.transform = 'translateX(-50%) translateY(0)';
8007
+ if (toastEl !== currentToast) return;
8008
+ currentToast.style.opacity = '1';
8009
+ currentToast.style.transform = 'translateX(-50%) translateY(0)';
7947
8010
  });
7948
8011
  setTimeout(() => {
7949
- if (toastEl) {
7950
- toastEl.style.opacity = '0';
7951
- toastEl.style.transform = 'translateX(-50%) translateY(8px)';
7952
- setTimeout(() => { if (toastEl) { toastEl.remove(); toastEl = null; } }, 250);
7953
- }
8012
+ if (toastEl !== currentToast) return;
8013
+ currentToast.style.opacity = '0';
8014
+ currentToast.style.transform = 'translateX(-50%) translateY(8px)';
8015
+ setTimeout(() => {
8016
+ if (toastEl !== currentToast) return;
8017
+ currentToast.remove();
8018
+ toastEl = null;
8019
+ }, 250);
7954
8020
  }, duration);
7955
8021
  }
7956
8022
 
@@ -9984,6 +10050,7 @@ void main() {
9984
10050
  window.postMessage({ source: 'impeccable-command', action: 'remove' }, '*');
9985
10051
  setLiveState('IDLE');
9986
10052
  document.getElementById(PICK_CURSOR_STYLE_ID)?.remove();
10053
+ removeVariantStateStylesheet();
9987
10054
  window.__IMPECCABLE_LIVE_INIT__ = false;
9988
10055
  console.log('[impeccable] Live mode exited.');
9989
10056
  }
@@ -310,6 +310,7 @@ The agent should insert variant HTML at insertLine.`);
310
310
  ];
311
311
 
312
312
  let outputFile = targetFile;
313
+ let outputLines;
313
314
  let outputStartLine = startLine + 1;
314
315
  let outputEndLine = startLine + wrapperLines.length + (originalLines.length - 1);
315
316
  let insertLine;
@@ -570,6 +571,14 @@ function splitClassList(classes) {
570
571
  return String(classes).split(/[,\s]+/).map(c => c.trim()).filter(Boolean);
571
572
  }
572
573
 
574
+ function attrEscapeDouble(str) {
575
+ return String(str)
576
+ .replace(/&/g, '&amp;')
577
+ .replace(/"/g, '&quot;')
578
+ .replace(/</g, '&lt;')
579
+ .replace(/>/g, '&gt;');
580
+ }
581
+
573
582
  function detectCommentSyntax(filePath) {
574
583
  const ext = path.extname(filePath).toLowerCase();
575
584
  if (ext === '.jsx' || ext === '.tsx') {
@@ -197,6 +197,10 @@ export class InMemoryDurableBackend implements DurableWorkflowBackend {
197
197
  inputs: handle.inputs,
198
198
  createdAt: handle.createdAt,
199
199
  status: handle.status,
200
+ ...(handle.invocationCwd !== undefined ? { invocationCwd: handle.invocationCwd } : existing?.handle.invocationCwd !== undefined ? { invocationCwd: existing.handle.invocationCwd } : {}),
201
+ ...(handle.workflowCwd !== undefined ? { workflowCwd: handle.workflowCwd } : existing?.handle.workflowCwd !== undefined ? { workflowCwd: existing.handle.workflowCwd } : {}),
202
+ ...(handle.repositoryRoot !== undefined ? { repositoryRoot: handle.repositoryRoot } : existing?.handle.repositoryRoot !== undefined ? { repositoryRoot: existing.handle.repositoryRoot } : {}),
203
+ ...(handle.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: handle.gitWorktreeRoot } : existing?.handle.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: existing.handle.gitWorktreeRoot } : {}),
200
204
  ...(handle.sessionFile !== undefined ? { sessionFile: handle.sessionFile } : {}),
201
205
  completedCheckpoints,
202
206
  pendingPrompts,
@@ -285,6 +289,10 @@ export class InMemoryDurableBackend implements DurableWorkflowBackend {
285
289
  ...(h.label !== undefined ? { label: h.label } : {}),
286
290
  ...(h.rootWorkflowId !== undefined ? { rootWorkflowId: h.rootWorkflowId } : {}),
287
291
  ...(h.resumable !== undefined ? { resumable: h.resumable } : {}),
292
+ ...(h.invocationCwd !== undefined ? { invocationCwd: h.invocationCwd } : {}),
293
+ ...(h.workflowCwd !== undefined ? { workflowCwd: h.workflowCwd } : {}),
294
+ ...(h.repositoryRoot !== undefined ? { repositoryRoot: h.repositoryRoot } : {}),
295
+ ...(h.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: h.gitWorktreeRoot } : {}),
288
296
  ts: h.updatedAt,
289
297
  };
290
298
  }
@@ -337,6 +345,10 @@ function toResumableEntry(handle: DurableWorkflowHandle): ResumableWorkflowEntry
337
345
  ...(handle.label !== undefined ? { label: handle.label } : {}),
338
346
  ...(handle.rootWorkflowId !== undefined ? { rootWorkflowId: handle.rootWorkflowId } : {}),
339
347
  ...(handle.resumable !== undefined ? { resumable: handle.resumable } : {}),
348
+ ...(handle.invocationCwd !== undefined ? { invocationCwd: handle.invocationCwd } : {}),
349
+ ...(handle.workflowCwd !== undefined ? { workflowCwd: handle.workflowCwd } : {}),
350
+ ...(handle.repositoryRoot !== undefined ? { repositoryRoot: handle.repositoryRoot } : {}),
351
+ ...(handle.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: handle.gitWorktreeRoot } : {}),
340
352
  createdAt: handle.createdAt,
341
353
  updatedAt: handle.updatedAt,
342
354
  };
@@ -359,6 +359,10 @@ export class DbosDurableBackend implements DurableWorkflowBackend {
359
359
  ...(entry.label !== undefined ? { label: entry.label } : {}),
360
360
  ...(entry.rootWorkflowId !== undefined ? { rootWorkflowId: entry.rootWorkflowId } : {}),
361
361
  ...(entry.resumable !== undefined ? { resumable: entry.resumable } : {}),
362
+ ...(entry.invocationCwd !== undefined ? { invocationCwd: entry.invocationCwd } : {}),
363
+ ...(entry.workflowCwd !== undefined ? { workflowCwd: entry.workflowCwd } : {}),
364
+ ...(entry.repositoryRoot !== undefined ? { repositoryRoot: entry.repositoryRoot } : {}),
365
+ ...(entry.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: entry.gitWorktreeRoot } : {}),
362
366
  });
363
367
  }
364
368
  }
@@ -395,6 +399,10 @@ function encodeMetadata(entry: DurableCheckpointEntry): WorkflowSerializableValu
395
399
  ...(entry.label !== undefined ? { label: entry.label } : {}),
396
400
  ...(entry.rootWorkflowId !== undefined ? { rootWorkflowId: entry.rootWorkflowId } : {}),
397
401
  ...(entry.resumable !== undefined ? { resumable: entry.resumable } : {}),
402
+ ...(entry.invocationCwd !== undefined ? { invocationCwd: entry.invocationCwd } : {}),
403
+ ...(entry.workflowCwd !== undefined ? { workflowCwd: entry.workflowCwd } : {}),
404
+ ...(entry.repositoryRoot !== undefined ? { repositoryRoot: entry.repositoryRoot } : {}),
405
+ ...(entry.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: entry.gitWorktreeRoot } : {}),
398
406
  ts: entry.ts,
399
407
  },
400
408
  };
@@ -425,7 +433,11 @@ function parseDurableCheckpointEntry(value: WorkflowSerializableValue): DurableC
425
433
  || typeof entry.ts !== "number"
426
434
  || (entry.label !== undefined && typeof entry.label !== "string")
427
435
  || (entry.rootWorkflowId !== undefined && typeof entry.rootWorkflowId !== "string")
428
- || (entry.resumable !== undefined && typeof entry.resumable !== "boolean")) {
436
+ || (entry.resumable !== undefined && typeof entry.resumable !== "boolean")
437
+ || (entry.invocationCwd !== undefined && typeof entry.invocationCwd !== "string")
438
+ || (entry.workflowCwd !== undefined && typeof entry.workflowCwd !== "string")
439
+ || (entry.repositoryRoot !== undefined && typeof entry.repositoryRoot !== "string")
440
+ || (entry.gitWorktreeRoot !== undefined && typeof entry.gitWorktreeRoot !== "string")) {
429
441
  return undefined;
430
442
  }
431
443
  return {
@@ -440,6 +452,10 @@ function parseDurableCheckpointEntry(value: WorkflowSerializableValue): DurableC
440
452
  ...(entry.label !== undefined ? { label: entry.label } : {}),
441
453
  ...(entry.rootWorkflowId !== undefined ? { rootWorkflowId: entry.rootWorkflowId } : {}),
442
454
  ...(entry.resumable !== undefined ? { resumable: entry.resumable } : {}),
455
+ ...(entry.invocationCwd !== undefined ? { invocationCwd: entry.invocationCwd } : {}),
456
+ ...(entry.workflowCwd !== undefined ? { workflowCwd: entry.workflowCwd } : {}),
457
+ ...(entry.repositoryRoot !== undefined ? { repositoryRoot: entry.repositoryRoot } : {}),
458
+ ...(entry.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: entry.gitWorktreeRoot } : {}),
443
459
  };
444
460
  }
445
461
 
@@ -107,6 +107,10 @@ function parseDurableEntry(raw: Record<string, unknown>): DurableCheckpointEntry
107
107
  ...(typeof raw["label"] === "string" ? { label: raw["label"] } : {}),
108
108
  ...(typeof raw["rootWorkflowId"] === "string" ? { rootWorkflowId: raw["rootWorkflowId"] } : {}),
109
109
  ...(typeof raw["resumable"] === "boolean" ? { resumable: raw["resumable"] } : {}),
110
+ ...(typeof raw["invocationCwd"] === "string" ? { invocationCwd: raw["invocationCwd"] } : {}),
111
+ ...(typeof raw["workflowCwd"] === "string" ? { workflowCwd: raw["workflowCwd"] } : {}),
112
+ ...(typeof raw["repositoryRoot"] === "string" ? { repositoryRoot: raw["repositoryRoot"] } : {}),
113
+ ...(typeof raw["gitWorktreeRoot"] === "string" ? { gitWorktreeRoot: raw["gitWorktreeRoot"] } : {}),
110
114
  ts,
111
115
  };
112
116
  }
@@ -142,6 +146,10 @@ function entryToResumable(entry: DurableCheckpointEntry, sessionFile: string): R
142
146
  ...(entry.label !== undefined ? { label: entry.label } : {}),
143
147
  ...(entry.rootWorkflowId !== undefined ? { rootWorkflowId: entry.rootWorkflowId } : {}),
144
148
  ...(entry.resumable !== undefined ? { resumable: entry.resumable } : {}),
149
+ ...(entry.invocationCwd !== undefined ? { invocationCwd: entry.invocationCwd } : {}),
150
+ ...(entry.workflowCwd !== undefined ? { workflowCwd: entry.workflowCwd } : {}),
151
+ ...(entry.repositoryRoot !== undefined ? { repositoryRoot: entry.repositoryRoot } : {}),
152
+ ...(entry.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: entry.gitWorktreeRoot } : {}),
145
153
  createdAt: entry.ts,
146
154
  updatedAt: entry.ts,
147
155
  };
@@ -197,6 +205,10 @@ export function persistDurableCacheEntry(
197
205
  ...(entry.label !== undefined ? { label: entry.label } : {}),
198
206
  ...(entry.rootWorkflowId !== undefined ? { rootWorkflowId: entry.rootWorkflowId } : {}),
199
207
  ...(entry.resumable !== undefined ? { resumable: entry.resumable } : {}),
208
+ ...(entry.invocationCwd !== undefined ? { invocationCwd: entry.invocationCwd } : {}),
209
+ ...(entry.workflowCwd !== undefined ? { workflowCwd: entry.workflowCwd } : {}),
210
+ ...(entry.repositoryRoot !== undefined ? { repositoryRoot: entry.repositoryRoot } : {}),
211
+ ...(entry.gitWorktreeRoot !== undefined ? { gitWorktreeRoot: entry.gitWorktreeRoot } : {}),
200
212
  ts: entry.ts,
201
213
  });
202
214
  }
@@ -167,11 +167,14 @@ export function resumeDurableWorkflow(
167
167
  // ORIGINAL workflow id as the run id so durable checkpoints replay.
168
168
  backend.setWorkflowStatus(resolved.workflowId, "running");
169
169
 
170
- const accepted: DetachedAccepted = runDetached(def, inputs, {
170
+ const resumeRunOpts: RunOpts = {
171
171
  ...deps.baseRunOpts,
172
+ ...(handle.invocationCwd !== undefined ? { cwd: handle.invocationCwd } : {}),
172
173
  runId: resolved.workflowId,
173
174
  durableBackend: backend,
174
- });
175
+ };
176
+
177
+ const accepted: DetachedAccepted = runDetached(def, inputs, resumeRunOpts);
175
178
 
176
179
  return {
177
180
  ok: true,
@@ -7,6 +7,7 @@ import type { DurableWorkflowBackend } from "./backend.js";
7
7
  import type { ParallelFailFastScope } from "../runs/foreground/executor-types.js";
8
8
  import { durableHash } from "./backend.js";
9
9
  import { recordCheckpointDurably } from "./tool-primitive.js";
10
+ import { RESUME_CONTINUATION_PROMPT } from "../shared/resume-continuation.js";
10
11
  import type { DurableStageCheckpoint } from "./types.js";
11
12
  export type DurableCompletedStageCheckpoint = DurableStageCheckpoint & { readonly output: WorkflowSerializableValue };
12
13
 
@@ -66,7 +67,7 @@ export async function recordStageSessionCheckpoint(deps: DurableStageDeps, stage
66
67
  return true;
67
68
  }
68
69
 
69
- const MID_SESSION_RESUME_PROMPT = "Continue";
70
+ const MID_SESSION_RESUME_PROMPT = RESUME_CONTINUATION_PROMPT;
70
71
 
71
72
  function withMidSessionResumePrompt<T extends StageContext>(stage: T, enabled: boolean): T {
72
73
  if (!enabled) return stage;