specrails-desktop 2.55.0 → 2.55.1

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 (360) hide show
  1. package/cli/dist/args.js +80 -0
  2. package/cli/dist/desktop-client.js +125 -0
  3. package/cli/dist/desktop-control.js +339 -0
  4. package/cli/dist/format.js +45 -0
  5. package/cli/dist/help.js +68 -0
  6. package/cli/dist/output.js +47 -0
  7. package/cli/dist/run-command.js +340 -0
  8. package/cli/dist/specrails-desktop.js +41 -1107
  9. package/cli/dist/status.js +111 -0
  10. package/client/dist/assets/{ActivityFeedPage-ILXMZXcb.js → ActivityFeedPage-DmJcQpNe.js} +1 -1
  11. package/client/dist/assets/{AgentBrowserCapture-UcsupCy7.js → AgentBrowserCapture-NxBHrU-V.js} +1 -1
  12. package/client/dist/assets/{AgentModeAnalyticsPane-CQuxYh8B.js → AgentModeAnalyticsPane-CGAKTJfU.js} +2 -2
  13. package/client/dist/assets/{AgentModeCodePane-zPWbW7ei.js → AgentModeCodePane-DNSs5_oe.js} +2 -2
  14. package/client/dist/assets/{AgentModeJobsPane-CInByIdl.js → AgentModeJobsPane-DLoVYDnG.js} +1 -1
  15. package/client/dist/assets/{AgentsPage-BWvgxaBv.js → AgentsPage-CAzMn9Gg.js} +1 -1
  16. package/client/dist/assets/{AnalyticsPage-DP3jakv-.js → AnalyticsPage-C06KT4Y0.js} +1 -1
  17. package/client/dist/assets/{CodePage-BKXiwE5a.js → CodePage-aX1mxGyT.js} +1 -1
  18. package/client/dist/assets/{DesktopAnalyticsPage-DryJOaMz.js → DesktopAnalyticsPage-BtscfiQD.js} +1 -1
  19. package/client/dist/assets/{DocsDialog-BsCG9ksG.js → DocsDialog-CNOcXhp-.js} +1 -1
  20. package/client/dist/assets/{DocsPage-Cc-GeKYl.js → DocsPage-C2BugxaI.js} +1 -1
  21. package/client/dist/assets/{ExportDropdown-ClahJdDn.js → ExportDropdown-BVGKEgkd.js} +1 -1
  22. package/client/dist/assets/{InteractiveJobComposer-DfLF6N0f.js → InteractiveJobComposer-CCncBqNu.js} +1 -1
  23. package/client/dist/assets/{JobDetailModal-DHeur9YK.js → JobDetailModal-Cn_k3-RM.js} +1 -1
  24. package/client/dist/assets/{JobDetailPage-CraDKzeG.js → JobDetailPage-BogJFBsk.js} +1 -1
  25. package/client/dist/assets/{JobsPage-CcbuSwj7.js → JobsPage-DL4E8ZyU.js} +1 -1
  26. package/client/dist/assets/{LoopBuilderPage-BKtNp494.js → LoopBuilderPage-9L6URQLY.js} +1 -1
  27. package/client/dist/assets/{LoopPreviewModal-DbZd9isy.js → LoopPreviewModal-CAPqTIgL.js} +1 -1
  28. package/client/dist/assets/{LoopsPage-DEg6sIkG.js → LoopsPage-aU8dYw7L.js} +1 -1
  29. package/client/dist/assets/{MinimizedChatsContext-BGtEjWsc.js → MinimizedChatsContext-D3QzgV0B.js} +1 -1
  30. package/client/dist/assets/{PluginsPage-BVqSsPzL.js → PluginsPage-D_tsW9B5.js} +1 -1
  31. package/client/dist/assets/{ProjectSettingsDialog-CAjLgJAZ.js → ProjectSettingsDialog-_ZbNuspP.js} +1 -1
  32. package/client/dist/assets/{RepositoryDeliveries-DrcrxLe0.js → RepositoryDeliveries-Du2UCf1a.js} +1 -1
  33. package/client/dist/assets/{RepositoryScopeSelector-CAGY3xW6.js → RepositoryScopeSelector-hPGZNRBm.js} +1 -1
  34. package/client/dist/assets/ReviewPacketPage-CG-Dv0El.js +4 -0
  35. package/client/dist/assets/{TemplatePreviewModal-Bqs-9fhn.js → TemplatePreviewModal-C19H2b2o.js} +1 -1
  36. package/client/dist/assets/{TicketDetailModalContext-C0jQ5yOk.js → TicketDetailModalContext-DAK-NoK6.js} +1 -1
  37. package/client/dist/assets/{Trans-DtWlCJN9.js → Trans-DEbgkuAY.js} +1 -1
  38. package/client/dist/assets/{dashboard-CTfEtkqX.js → dashboard-B9uWNGO2.js} +1 -1
  39. package/client/dist/assets/{dashboard-DMklepmz.js → dashboard-BIwmO9wc.js} +1 -1
  40. package/client/dist/assets/{dashboard-DBAP2_SQ.js → dashboard-BV4vOZkR.js} +1 -1
  41. package/client/dist/assets/{dashboard-D40HP2ks.js → dashboard-Bf6MPVsM.js} +1 -1
  42. package/client/dist/assets/{dashboard-Csf1yGSN.js → dashboard-C8klWVvZ.js} +1 -1
  43. package/client/dist/assets/{dashboard-C29Qwa-L.js → dashboard-D1ORhPF0.js} +1 -1
  44. package/client/dist/assets/{dashboard-Cr4D8oMn.js → dashboard-DSubvs9x.js} +1 -1
  45. package/client/dist/assets/{dashboard-CSJzf5OT.js → dashboard-px_vlRx_.js} +1 -1
  46. package/client/dist/assets/{formatDistanceToNow-DYmvOA3R.js → formatDistanceToNow-Cc2u5FwQ.js} +1 -1
  47. package/client/dist/assets/{getTimezoneOffsetInMilliseconds-BAhW5E6V.js → getTimezoneOffsetInMilliseconds-BHm2U-w1.js} +1 -1
  48. package/client/dist/assets/{index-BfAZg5DG.js → index-BcligJ3-.js} +29 -29
  49. package/client/dist/assets/index-C51x61Bz.css +2 -0
  50. package/client/dist/assets/{jira-api-B27Za5FP.js → jira-api-DrGxiD9p.js} +1 -1
  51. package/client/dist/assets/packet-8nn9RsU7.js +1 -0
  52. package/client/dist/assets/packet-B0H15elv.js +1 -0
  53. package/client/dist/assets/packet-BQvBgrwh.js +1 -0
  54. package/client/dist/assets/packet-BR7mO0-a.js +1 -0
  55. package/client/dist/assets/packet-BgcQ6q_K.js +1 -0
  56. package/client/dist/assets/packet-D2s92Jnn.js +1 -0
  57. package/client/dist/assets/packet-YbtcD1HS.js +1 -0
  58. package/client/dist/assets/packet-c0Qj_9eX.js +1 -0
  59. package/client/dist/assets/{project-repositories-DixIZHTA.js → project-repositories-9Wzs0coQ.js} +1 -1
  60. package/client/dist/assets/{spending-BGmZBX5B.js → spending-T5GM7wpn.js} +1 -1
  61. package/client/dist/assets/{useDesktop-CPB4cnwI.js → useDesktop-QogiN0zR.js} +1 -1
  62. package/client/dist/assets/{useRuntimeRuns-DEQ9HdAM.js → useRuntimeRuns-Dqmz9fS9.js} +1 -1
  63. package/client/dist/assets/{useSharedWebSocket-DcPRKR8R.js → useSharedWebSocket-Dz-HI6De.js} +2 -2
  64. package/client/dist/index.html +17 -17
  65. package/docs/codex.md +5 -5
  66. package/docs/customizing.md +1 -1
  67. package/docs/gemini-cli-provider-study.md +14 -14
  68. package/docs/gemini-core-support-evaluation.md +1 -1
  69. package/docs/gemini.md +5 -5
  70. package/docs/internals/README.md +6 -2
  71. package/docs/internals/adding-a-provider.md +15 -15
  72. package/docs/internals/agent-runtime-framework-evaluation.md +8 -8
  73. package/docs/internals/api-reference.md +2 -2
  74. package/docs/internals/architecture.md +9 -9
  75. package/docs/internals/browser-capture-performance.md +3 -3
  76. package/docs/internals/code-explorer-story.md +2 -2
  77. package/docs/internals/companion-rails-as-loops-contract.md +2 -2
  78. package/docs/internals/embedded-browser-native-webview-evaluation.md +5 -5
  79. package/docs/internals/gemini-mcp-registration.md +2 -2
  80. package/docs/internals/global-artifacts-alignment-contract.md +1 -1
  81. package/docs/internals/global-artifacts-relocation-evaluation.md +1 -1
  82. package/docs/internals/interactive-jobs.md +8 -8
  83. package/docs/internals/legacy-implementation-notes.md +722 -0
  84. package/docs/internals/loop-step-log-explorer.md +8 -8
  85. package/docs/internals/mission-rail-cards.md +14 -14
  86. package/docs/internals/modular-architecture.md +107 -0
  87. package/docs/internals/profiles.md +1 -1
  88. package/docs/internals/project-builder.md +18 -18
  89. package/docs/internals/review-packet.md +8 -8
  90. package/docs/internals/safe-pr-review-flow.md +11 -11
  91. package/docs/internals/source-architecture.md +131 -0
  92. package/docs/internals/source-map.md +1354 -0
  93. package/docs/internals/spec-addenda.md +65 -9
  94. package/docs/internals/switch-to-agent-mode-design.md +11 -11
  95. package/docs/tracking-cost.md +1 -1
  96. package/package.json +5 -2
  97. package/server/dist/agent-mcp-config.js +1 -1
  98. package/server/dist/attachment-manager.js +1 -1
  99. package/server/dist/build-dirs.js +2 -2
  100. package/server/dist/config.js +0 -3
  101. package/server/dist/core-completion.js +1 -1
  102. package/server/dist/core-execution.js +1 -1
  103. package/server/dist/db/activity.js +39 -0
  104. package/server/dist/db/connection.js +41 -0
  105. package/server/dist/db/conversations.js +48 -0
  106. package/server/dist/db/jobs.js +251 -0
  107. package/server/dist/db/migrations.js +1521 -0
  108. package/server/dist/db/proposals.js +50 -0
  109. package/server/dist/db/settings.js +15 -0
  110. package/server/dist/db/stats.js +61 -0
  111. package/server/dist/db/telemetry.js +56 -0
  112. package/server/dist/db/templates.js +37 -0
  113. package/server/dist/db/types.js +2 -0
  114. package/server/dist/db.js +66 -2224
  115. package/server/dist/desktop-db.js +3 -3
  116. package/server/dist/desktop-router.js +8 -8
  117. package/server/dist/git-diagnostics.js +1 -1
  118. package/server/dist/index.js +11 -11
  119. package/server/dist/integration-branch.js +3 -14
  120. package/server/dist/jira/jira-issue-fields.js +0 -1
  121. package/server/dist/jira/jira-materializer.js +1 -1
  122. package/server/dist/jira/jira-sync-manager.js +1 -1
  123. package/server/dist/mcp/mcp-admin-router.js +1 -1
  124. package/server/dist/mcp/mcp-server.js +1 -1
  125. package/server/dist/mcp/tools/jobs.js +1 -1
  126. package/server/dist/mcp/tools/rails.js +2 -2
  127. package/server/dist/mcp/tools/specs.js +2 -2
  128. package/server/dist/mcp/tools/types.js +3 -3
  129. package/server/dist/mobile/mobile-gateway.js +1 -1
  130. package/server/dist/mobile/mobile-missions.js +1 -1
  131. package/server/dist/{desktop-analytics.js → modules/accounting/runtime/desktop-analytics.js} +2 -2
  132. package/server/dist/{pricing.js → modules/accounting/runtime/pricing.js} +1 -1
  133. package/server/dist/{result-event.js → modules/accounting/runtime/result-event.js} +3 -3
  134. package/server/dist/{spending.js → modules/accounting/runtime/spending.js} +0 -3
  135. package/server/dist/{telemetry-compactor.js → modules/accounting/runtime/telemetry-compactor.js} +1 -1
  136. package/server/dist/{telemetry-receiver.js → modules/accounting/runtime/telemetry-receiver.js} +2 -2
  137. package/server/dist/{agent-runtime-bridge.js → modules/agent-runtime/runtime/agent-runtime-bridge.js} +2 -2
  138. package/server/dist/{agent-runtime-controls.js → modules/agent-runtime/runtime/agent-runtime-controls.js} +7 -7
  139. package/server/dist/{agent-runtime-effective-config.js → modules/agent-runtime/runtime/agent-runtime-effective-config.js} +1 -1
  140. package/server/dist/{agent-runtime-loader.js → modules/agent-runtime/runtime/agent-runtime-loader.js} +3 -3
  141. package/server/dist/{agent-runtime-paths.js → modules/agent-runtime/runtime/agent-runtime-paths.js} +1 -1
  142. package/server/dist/{agent-runtime-settings-router.js → modules/agent-runtime/runtime/agent-runtime-settings-router.js} +2 -2
  143. package/server/dist/{agent-runtime-settings.js → modules/agent-runtime/runtime/agent-runtime-settings.js} +3 -3
  144. package/server/dist/{agent-runtime-settlement.js → modules/agent-runtime/runtime/agent-runtime-settlement.js} +6 -6
  145. package/server/dist/{agent-defaults.js → modules/agents/runtime/agent-defaults.js} +3 -3
  146. package/server/dist/{agent-generator.js → modules/agents/runtime/agent-generator.js} +7 -7
  147. package/server/dist/{agent-refine-manager.js → modules/agents/runtime/agent-refine-manager.js} +5 -5
  148. package/server/dist/{agent-store.js → modules/agents/runtime/agent-store.js} +1 -1
  149. package/server/dist/{profile-manager.js → modules/agents/runtime/profile-manager.js} +2 -2
  150. package/server/dist/{profiles-router.js → modules/agents/runtime/profiles-router.js} +5 -5
  151. package/server/dist/{browser-capture-manager.js → modules/browser/runtime/browser-capture-manager.js} +2 -4
  152. package/server/dist/{browser-playwright.js → modules/browser/runtime/browser-playwright.js} +1 -1
  153. package/server/dist/{blueprint-chat-manager.js → modules/builder/runtime/blueprint-chat-manager.js} +7 -7
  154. package/server/dist/{blueprint-commit.js → modules/builder/runtime/blueprint-commit.js} +8 -8
  155. package/server/dist/{blueprint-draft-parser.js → modules/builder/runtime/blueprint-draft-parser.js} +1 -1
  156. package/server/dist/{blueprint-generation.js → modules/builder/runtime/blueprint-generation.js} +1 -1
  157. package/server/dist/{blueprint-operator-prompt.js → modules/builder/runtime/blueprint-operator-prompt.js} +1 -1
  158. package/server/dist/{blueprint-router.js → modules/builder/runtime/blueprint-router.js} +3 -3
  159. package/server/dist/{blueprint-spec-quality.js → modules/builder/runtime/blueprint-spec-quality.js} +1 -1
  160. package/server/dist/{milestone-chain.js → modules/builder/runtime/milestone-chain.js} +1 -1
  161. package/server/dist/{milestone-progress.js → modules/builder/runtime/milestone-progress.js} +6 -6
  162. package/server/dist/{code-activity.js → modules/code/runtime/code-activity.js} +1 -1
  163. package/server/dist/{code-explorer-router.js → modules/code/runtime/code-explorer-router.js} +5 -5
  164. package/server/dist/{file-provenance.js → modules/code/runtime/file-provenance.js} +1 -1
  165. package/server/dist/{file-story-manager.js → modules/code/runtime/file-story-manager.js} +2 -2
  166. package/server/dist/{file-story.js → modules/code/runtime/file-story.js} +2 -2
  167. package/server/dist/{file-summary-generator.js → modules/code/runtime/file-summary-generator.js} +3 -3
  168. package/server/dist/{file-summary-manager.js → modules/code/runtime/file-summary-manager.js} +3 -3
  169. package/server/dist/{project-code-discovery.js → modules/code/runtime/project-code-discovery.js} +2 -2
  170. package/server/dist/modules/conversations/domain/draft-stream.js +91 -0
  171. package/server/dist/modules/conversations/domain/recovery-context.js +101 -0
  172. package/server/dist/modules/conversations/index.js +10 -0
  173. package/server/dist/{chat-manager.js → modules/conversations/runtime/chat-manager.js} +32 -216
  174. package/server/dist/{context-budget.js → modules/conversations/runtime/context-budget.js} +1 -1
  175. package/server/dist/{explore-cwd-manager.js → modules/conversations/runtime/explore-cwd-manager.js} +1 -1
  176. package/server/dist/{explore-smash.js → modules/conversations/runtime/explore-smash.js} +1 -1
  177. package/server/dist/{explore-stdin-session.js → modules/conversations/runtime/explore-stdin-session.js} +1 -1
  178. package/server/dist/modules/delivery/adapters/decisions/chains.js +138 -0
  179. package/server/dist/modules/delivery/adapters/decisions/contracts.js +2 -0
  180. package/server/dist/modules/delivery/adapters/decisions/create.js +234 -0
  181. package/server/dist/modules/delivery/adapters/decisions/discard.js +251 -0
  182. package/server/dist/modules/delivery/adapters/decisions/dispatch.js +107 -0
  183. package/server/dist/modules/delivery/adapters/decisions/evidence.js +205 -0
  184. package/server/dist/modules/delivery/adapters/decisions/merge-local.js +338 -0
  185. package/server/dist/modules/delivery/adapters/decisions/metadata.js +109 -0
  186. package/server/dist/modules/delivery/adapters/decisions/observations.js +260 -0
  187. package/server/dist/modules/delivery/adapters/decisions/ownership.js +83 -0
  188. package/server/dist/modules/delivery/adapters/decisions/publish.js +242 -0
  189. package/server/dist/modules/delivery/adapters/decisions/recovery.js +425 -0
  190. package/server/dist/modules/delivery/adapters/decisions/retry.js +112 -0
  191. package/server/dist/modules/delivery/adapters/decisions/transitions.js +94 -0
  192. package/server/dist/modules/delivery/domain/decision-policy.js +50 -0
  193. package/server/dist/modules/delivery/domain/state.js +2 -0
  194. package/server/dist/modules/delivery/index.js +7 -0
  195. package/server/dist/{active-pr-continuation.js → modules/delivery/runtime/active-pr-continuation.js} +2 -2
  196. package/server/dist/{delivery-evidence.js → modules/delivery/runtime/delivery-evidence.js} +3 -3
  197. package/server/dist/{multi-repo-bases.js → modules/delivery/runtime/multi-repo-bases.js} +1 -1
  198. package/server/dist/{multi-repo-checkout.js → modules/delivery/runtime/multi-repo-checkout.js} +4 -4
  199. package/server/dist/{multi-repo-delivery.js → modules/delivery/runtime/multi-repo-delivery.js} +4 -4
  200. package/server/dist/{multi-repo-execution.js → modules/delivery/runtime/multi-repo-execution.js} +8 -8
  201. package/server/dist/{pr-body.js → modules/delivery/runtime/pr-body.js} +1 -1
  202. package/server/dist/{pr-follow-up-scope.js → modules/delivery/runtime/pr-follow-up-scope.js} +2 -2
  203. package/server/dist/{pr-follow-up.js → modules/delivery/runtime/pr-follow-up.js} +1 -1
  204. package/server/dist/{pr-naming.js → modules/delivery/runtime/pr-naming.js} +1 -1
  205. package/server/dist/{pr-publisher.js → modules/delivery/runtime/pr-publisher.js} +2 -2
  206. package/server/dist/{rail-isolated-launch.js → modules/delivery/runtime/rail-isolated-launch.js} +29 -27
  207. package/server/dist/{rail-launch-parser.js → modules/delivery/runtime/rail-launch-parser.js} +2 -2
  208. package/server/dist/{rail-merge-orchestrator.js → modules/delivery/runtime/rail-merge-orchestrator.js} +5 -5
  209. package/server/dist/modules/delivery/runtime/rail-pr-decision.js +12 -0
  210. package/server/dist/{rail-pr-delivery.js → modules/delivery/runtime/rail-pr-delivery.js} +1 -1
  211. package/server/dist/{rail-pr-store.js → modules/delivery/runtime/rail-pr-store.js} +2 -2
  212. package/server/dist/{rail-pr-ticket-effects.js → modules/delivery/runtime/rail-pr-ticket-effects.js} +3 -3
  213. package/server/dist/{rail-worktree-release.js → modules/delivery/runtime/rail-worktree-release.js} +4 -4
  214. package/server/dist/{rails-router.js → modules/delivery/runtime/rails-router.js} +66 -67
  215. package/server/dist/{review-packet.js → modules/delivery/runtime/review-packet.js} +3 -3
  216. package/server/dist/modules/execution/adapters/budget-storage.js +21 -0
  217. package/server/dist/modules/execution/adapters/usage-reader.js +38 -0
  218. package/server/dist/modules/execution/application/enforce-budget.js +14 -0
  219. package/server/dist/modules/execution/application/record-job-invocations.js +64 -0
  220. package/server/dist/modules/execution/application/recover-job-usage.js +200 -0
  221. package/server/dist/modules/execution/domain/job-accounting.js +2 -0
  222. package/server/dist/modules/execution/domain/scheduling.js +24 -0
  223. package/server/dist/modules/execution/domain/usage.js +21 -0
  224. package/server/dist/modules/execution/index.js +14 -0
  225. package/server/dist/modules/execution/ports.js +2 -0
  226. package/server/dist/{accept-ladder.js → modules/execution/runtime/accept-ladder.js} +1 -1
  227. package/server/dist/{interactive-job-session.js → modules/execution/runtime/interactive-job-session.js} +11 -11
  228. package/server/dist/{job-phase-breakdown.js → modules/execution/runtime/job-phase-breakdown.js} +1 -1
  229. package/server/dist/{queue-manager.js → modules/execution/runtime/queue-manager.js} +74 -491
  230. package/server/dist/{revision-seed.js → modules/execution/runtime/revision-seed.js} +1 -1
  231. package/server/dist/{spawn-lifecycle.js → modules/execution/runtime/spawn-lifecycle.js} +3 -3
  232. package/server/dist/{stuck-run-detector.js → modules/execution/runtime/stuck-run-detector.js} +1 -1
  233. package/server/dist/{loop-command-catalog.js → modules/loops/runtime/loop-command-catalog.js} +1 -1
  234. package/server/dist/{loop-executors.js → modules/loops/runtime/loop-executors.js} +17 -17
  235. package/server/dist/{loop-factory.js → modules/loops/runtime/loop-factory.js} +2 -21
  236. package/server/dist/{loop-graph.js → modules/loops/runtime/loop-graph.js} +25 -0
  237. package/server/dist/{loop-role-engines.js → modules/loops/runtime/loop-role-engines.js} +4 -4
  238. package/server/dist/{loop-run-manager.js → modules/loops/runtime/loop-run-manager.js} +101 -26
  239. package/server/dist/{loop-runs-store.js → modules/loops/runtime/loop-runs-store.js} +1 -1
  240. package/server/dist/{loop-shell-invocation.js → modules/loops/runtime/loop-shell-invocation.js} +2 -2
  241. package/server/dist/{loop-step-idle.js → modules/loops/runtime/loop-step-idle.js} +1 -1
  242. package/server/dist/{loop-templates.js → modules/loops/runtime/loop-templates.js} +24 -29
  243. package/server/dist/{loops-router.js → modules/loops/runtime/loops-router.js} +2 -2
  244. package/server/dist/{agent-chat-manager.js → modules/missions/runtime/agent-chat-manager.js} +19 -19
  245. package/server/dist/{agent-chat-router.js → modules/missions/runtime/agent-chat-router.js} +6 -6
  246. package/server/dist/{agent-context-resolver.js → modules/missions/runtime/agent-context-resolver.js} +8 -8
  247. package/server/dist/{agent-fence-promotion.js → modules/missions/runtime/agent-fence-promotion.js} +1 -1
  248. package/server/dist/{agent-input-store.js → modules/missions/runtime/agent-input-store.js} +1 -1
  249. package/server/dist/{agent-operator-prompt.js → modules/missions/runtime/agent-operator-prompt.js} +17 -7
  250. package/server/dist/{agent-spec-framing.js → modules/missions/runtime/agent-spec-framing.js} +4 -4
  251. package/server/dist/{agent-steering.js → modules/missions/runtime/agent-steering.js} +1 -1
  252. package/server/dist/{mission-run-notify.js → modules/missions/runtime/mission-run-notify.js} +1 -1
  253. package/server/dist/modules/project-settings/adapters/http.js +24 -0
  254. package/server/dist/modules/project-settings/adapters/sqlite.js +120 -0
  255. package/server/dist/modules/project-settings/application.js +11 -0
  256. package/server/dist/modules/project-settings/domain.js +95 -0
  257. package/server/dist/modules/project-settings/index.js +11 -0
  258. package/server/dist/modules/project-settings/ports.js +2 -0
  259. package/server/dist/{contract-refine-runner.js → modules/specs/runtime/contract-refine-runner.js} +12 -12
  260. package/server/dist/{proposal-manager.js → modules/specs/runtime/proposal-manager.js} +8 -8
  261. package/server/dist/{smash-runner.js → modules/specs/runtime/smash-runner.js} +26 -58
  262. package/server/dist/{spec-addenda-core.js → modules/specs/runtime/spec-addenda-core.js} +2 -2
  263. package/server/dist/{spec-addenda.js → modules/specs/runtime/spec-addenda.js} +3 -3
  264. package/server/dist/{spec-launcher-manager.js → modules/specs/runtime/spec-launcher-manager.js} +8 -8
  265. package/server/dist/{spec-models.js → modules/specs/runtime/spec-models.js} +1 -1
  266. package/server/dist/{ticket-watcher.js → modules/specs/runtime/ticket-watcher.js} +1 -1
  267. package/server/dist/{background-process-control.js → modules/terminals/runtime/background-process-control.js} +1 -1
  268. package/server/dist/{background-process-service.js → modules/terminals/runtime/background-process-service.js} +3 -3
  269. package/server/dist/{background-process-store.js → modules/terminals/runtime/background-process-store.js} +1 -1
  270. package/server/dist/{background-windows-bootstrap.js → modules/terminals/runtime/background-windows-bootstrap.js} +3 -3
  271. package/server/dist/{terminal-manager.js → modules/terminals/runtime/terminal-manager.js} +3 -3
  272. package/server/dist/project-git.js +1 -1
  273. package/server/dist/project-profile-support.js +32 -0
  274. package/server/dist/project-registry.js +34 -40
  275. package/server/dist/project-router-background-processes.js +1 -1
  276. package/server/dist/project-router-chat.js +6 -6
  277. package/server/dist/project-router-git.js +1 -1
  278. package/server/dist/project-router-helpers.js +2 -2
  279. package/server/dist/project-router-jobs.js +14 -12
  280. package/server/dist/project-router-loop-runs.js +12 -12
  281. package/server/dist/project-router-settings.js +15 -75
  282. package/server/dist/project-router-setup.js +2 -2
  283. package/server/dist/project-router-spending.js +4 -4
  284. package/server/dist/project-router-terminals.js +4 -4
  285. package/server/dist/project-router-tickets.js +14 -14
  286. package/server/dist/project-router.js +13 -13
  287. package/server/dist/providers/codex-adapter.js +3 -3
  288. package/server/dist/providers/gemini-adapter.js +1 -1
  289. package/server/dist/providers/telemetry-env.js +55 -0
  290. package/server/dist/runtime-role-prompts-router.js +2 -2
  291. package/server/dist/setup-manager.js +2 -48
  292. package/server/dist/shared/git-branch-name.js +16 -0
  293. package/server/dist/transient-children.js +3 -3
  294. package/server/dist/util/distribute-int.js +33 -0
  295. package/client/dist/assets/ReviewPacketPage-D-UjTef3.js +0 -4
  296. package/client/dist/assets/index-BAtqmAZR.css +0 -2
  297. package/client/dist/assets/packet-CjS_478C.js +0 -1
  298. package/client/dist/assets/packet-D69dKsHN.js +0 -1
  299. package/client/dist/assets/packet-D9rU6Oxo.js +0 -1
  300. package/client/dist/assets/packet-DMDFoamg.js +0 -1
  301. package/client/dist/assets/packet-Dd2RMs1h.js +0 -1
  302. package/client/dist/assets/packet-DjC9OibC.js +0 -1
  303. package/client/dist/assets/packet-DwPtJoDz.js +0 -1
  304. package/client/dist/assets/packet-ceahDg8_.js +0 -1
  305. package/server/dist/rail-pr-decision.js +0 -2377
  306. package/server/dist/ticket-broadcast.js +0 -47
  307. /package/server/dist/{ai-invocations.js → modules/accounting/runtime/ai-invocations.js} +0 -0
  308. /package/server/dist/{codex-otel-bridge.js → modules/accounting/runtime/codex-otel-bridge.js} +0 -0
  309. /package/server/dist/{metrics.js → modules/accounting/runtime/metrics.js} +0 -0
  310. /package/server/dist/{telemetry-export.js → modules/accounting/runtime/telemetry-export.js} +0 -0
  311. /package/server/dist/{agent-runtime-accounting.js → modules/agent-runtime/runtime/agent-runtime-accounting.js} +0 -0
  312. /package/server/dist/{agent-runtime-controls-router.js → modules/agent-runtime/runtime/agent-runtime-controls-router.js} +0 -0
  313. /package/server/dist/{agent-runtime-events.js → modules/agent-runtime/runtime/agent-runtime-events.js} +0 -0
  314. /package/server/dist/{agent-runtime-history.js → modules/agent-runtime/runtime/agent-runtime-history.js} +0 -0
  315. /package/server/dist/{agent-runtime-metrics.js → modules/agent-runtime/runtime/agent-runtime-metrics.js} +0 -0
  316. /package/server/dist/{agent-runtime-package.js → modules/agent-runtime/runtime/agent-runtime-package.js} +0 -0
  317. /package/server/dist/{agent-runtime-repositories.js → modules/agent-runtime/runtime/agent-runtime-repositories.js} +0 -0
  318. /package/server/dist/{agent-runtime-verification-suggestions.js → modules/agent-runtime/runtime/agent-runtime-verification-suggestions.js} +0 -0
  319. /package/server/dist/{agent-refine-db.js → modules/agents/runtime/agent-refine-db.js} +0 -0
  320. /package/server/dist/{browser-capture-types.js → modules/browser/runtime/browser-capture-types.js} +0 -0
  321. /package/server/dist/{browser-context-pool.js → modules/browser/runtime/browser-context-pool.js} +0 -0
  322. /package/server/dist/{browser-network.js → modules/browser/runtime/browser-network.js} +0 -0
  323. /package/server/dist/{browser-viewport.js → modules/browser/runtime/browser-viewport.js} +0 -0
  324. /package/server/dist/{blueprint-render.js → modules/builder/runtime/blueprint-render.js} +0 -0
  325. /package/server/dist/{blueprint-spec-fixtures.js → modules/builder/runtime/blueprint-spec-fixtures.js} +0 -0
  326. /package/server/dist/{blueprint-store.js → modules/builder/runtime/blueprint-store.js} +0 -0
  327. /package/server/dist/{blueprint-types.js → modules/builder/runtime/blueprint-types.js} +0 -0
  328. /package/server/dist/{builder-cwd-manager.js → modules/builder/runtime/builder-cwd-manager.js} +0 -0
  329. /package/server/dist/{milestone-chain-store.js → modules/builder/runtime/milestone-chain-store.js} +0 -0
  330. /package/server/dist/{changes-reader.js → modules/code/runtime/changes-reader.js} +0 -0
  331. /package/server/dist/{context-scope.js → modules/conversations/runtime/context-scope.js} +0 -0
  332. /package/server/dist/{explore-contract-refine.js → modules/conversations/runtime/explore-contract-refine.js} +0 -0
  333. /package/server/dist/{explore-draft-title.js → modules/conversations/runtime/explore-draft-title.js} +0 -0
  334. /package/server/dist/{merge-manager.js → modules/delivery/runtime/merge-manager.js} +0 -0
  335. /package/server/dist/{multi-repo-execution-store.js → modules/delivery/runtime/multi-repo-execution-store.js} +0 -0
  336. /package/server/dist/{pr-lifecycle.js → modules/delivery/runtime/pr-lifecycle.js} +0 -0
  337. /package/server/dist/{rail-isolation.js → modules/delivery/runtime/rail-isolation.js} +0 -0
  338. /package/server/dist/{rail-pr-recovery-git.js → modules/delivery/runtime/rail-pr-recovery-git.js} +0 -0
  339. /package/server/dist/{rail-worktrees-store.js → modules/delivery/runtime/rail-worktrees-store.js} +0 -0
  340. /package/server/dist/{rails-store.js → modules/delivery/runtime/rails-store.js} +0 -0
  341. /package/server/dist/{job-listing.js → modules/execution/runtime/job-listing.js} +0 -0
  342. /package/server/dist/{job-spawn-idempotency.js → modules/execution/runtime/job-spawn-idempotency.js} +0 -0
  343. /package/server/dist/{run-duration-stats.js → modules/execution/runtime/run-duration-stats.js} +0 -0
  344. /package/server/dist/{verification-sentinel.js → modules/execution/runtime/verification-sentinel.js} +0 -0
  345. /package/server/dist/{loop-constants.js → modules/loops/runtime/loop-constants.js} +0 -0
  346. /package/server/dist/{loop-decider.js → modules/loops/runtime/loop-decider.js} +0 -0
  347. /package/server/dist/{loop-effect.js → modules/loops/runtime/loop-effect.js} +0 -0
  348. /package/server/dist/{loop-preview.js → modules/loops/runtime/loop-preview.js} +0 -0
  349. /package/server/dist/{loop-templates-ported.js → modules/loops/runtime/loop-templates-ported.js} +0 -0
  350. /package/server/dist/{loops-store.js → modules/loops/runtime/loops-store.js} +0 -0
  351. /package/server/dist/{agent-chat-registry.js → modules/missions/runtime/agent-chat-registry.js} +0 -0
  352. /package/server/dist/{agent-cwd-manager.js → modules/missions/runtime/agent-cwd-manager.js} +0 -0
  353. /package/server/dist/{agent-failure-briefing.js → modules/missions/runtime/agent-failure-briefing.js} +0 -0
  354. /package/server/dist/{agent-tier.js → modules/missions/runtime/agent-tier.js} +0 -0
  355. /package/server/dist/{spec-contract-prompt.js → modules/specs/runtime/spec-contract-prompt.js} +0 -0
  356. /package/server/dist/{spec-draft-parser.js → modules/specs/runtime/spec-draft-parser.js} +0 -0
  357. /package/server/dist/{ticket-store.js → modules/specs/runtime/ticket-store.js} +0 -0
  358. /package/server/dist/{terminal-marks-store.js → modules/terminals/runtime/terminal-marks-store.js} +0 -0
  359. /package/server/dist/{terminal-osc-parser.js → modules/terminals/runtime/terminal-osc-parser.js} +0 -0
  360. /package/server/dist/{terminal-settings.js → modules/terminals/runtime/terminal-settings.js} +0 -0
@@ -3,130 +3,37 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ChatManager = exports.EXPLORE_QUEUE_TIMEOUT_MS = exports.EXPLORE_MAX_CONCURRENCY = exports.EXPLORE_IDLE_KILL_MS = void 0;
7
- exports.filterDraftBlocksLive = filterDraftBlocksLive;
6
+ exports.ChatManager = exports.EXPLORE_QUEUE_TIMEOUT_MS = exports.EXPLORE_MAX_CONCURRENCY = exports.EXPLORE_IDLE_KILL_MS = exports.filterDraftBlocksLive = void 0;
7
+ const __1 = require("..");
8
+ var __2 = require("..");
9
+ Object.defineProperty(exports, "filterDraftBlocksLive", { enumerable: true, get: function () { return __2.filterDraftBlocksLive; } });
8
10
  const readline_1 = require("readline");
9
11
  const tree_kill_1 = __importDefault(require("tree-kill"));
10
- const db_1 = require("./db");
11
- const command_resolver_1 = require("./command-resolver");
12
- const cli_prompt_1 = require("./util/cli-prompt");
12
+ const db_1 = require("../../../db");
13
+ const command_resolver_1 = require("../../../command-resolver");
14
+ const cli_prompt_1 = require("../../../util/cli-prompt");
13
15
  const explore_cwd_manager_1 = require("./explore-cwd-manager");
14
- const ai_invocations_1 = require("./ai-invocations");
15
- const result_event_1 = require("./result-event");
16
+ const ai_invocations_1 = require("../../accounting/runtime/ai-invocations");
17
+ const result_event_1 = require("../../accounting/runtime/result-event");
16
18
  const crypto_1 = require("crypto");
17
- const codex_spawn_1 = require("./plugins/codex-spawn");
18
- const spec_draft_parser_1 = require("./spec-draft-parser");
19
- const attachment_manager_1 = require("./attachment-manager");
20
- const providers_1 = require("./providers");
21
- const runtime_1 = require("./providers/runtime");
19
+ const codex_spawn_1 = require("../../../plugins/codex-spawn");
20
+ const spec_draft_parser_1 = require("../../specs/runtime/spec-draft-parser");
21
+ const attachment_manager_1 = require("../../../attachment-manager");
22
+ const providers_1 = require("../../../providers");
23
+ const runtime_1 = require("../../../providers/runtime");
22
24
  const context_scope_1 = require("./context-scope");
23
- const user_mcp_config_1 = require("./user-mcp-config");
24
- const registry_1 = require("./providers/registry");
25
- const binary_probe_1 = require("./binary-probe");
25
+ const user_mcp_config_1 = require("../../../user-mcp-config");
26
+ const registry_1 = require("../../../providers/registry");
27
+ const binary_probe_1 = require("../../../binary-probe");
26
28
  const explore_stdin_session_1 = require("./explore-stdin-session");
27
- const workspace_resolution_1 = require("./workspace-resolution");
28
- const workspace_manager_1 = require("./workspace-manager");
29
- const blueprint_render_1 = require("./blueprint-render");
30
- const spec_contract_prompt_1 = require("./spec-contract-prompt");
29
+ const workspace_resolution_1 = require("../../../workspace-resolution");
30
+ const workspace_manager_1 = require("../../../workspace-manager");
31
+ const blueprint_render_1 = require("../../builder/runtime/blueprint-render");
32
+ const spec_contract_prompt_1 = require("../../specs/runtime/spec-contract-prompt");
31
33
  const explore_draft_title_1 = require("./explore-draft-title");
32
34
  const COMMAND_INSTRUCTION = 'When you want to suggest a SpecRails command for the user to execute, wrap it in a command block like this: ' +
33
35
  ':::command\n/specrails:implement #42\n::: ' +
34
36
  'The user will be prompted to confirm before the command runs.';
35
- /** Claude stores resumable sessions under the spawn cwd. Relocating an existing
36
- * Explore conversation from the repo to the workspace therefore makes its old
37
- * session id unresolvable. Match ONLY Claude's exact diagnostic so auth, quota,
38
- * model, and generic crash failures keep their existing no-retry semantics. */
39
- const CLAUDE_MISSING_SESSION_DIAGNOSTIC = 'No conversation found with session ID';
40
- /** Historical context folded into the one-time fresh-session recovery. This is
41
- * deliberately byte-bounded independently of the current turn, whose existing
42
- * attachment/scoped-context payload must remain intact. */
43
- const RESUME_RECOVERY_TRANSCRIPT_MAX_BYTES = 48 * 1024;
44
- function containsMissingClaudeSessionDiagnostic(value) {
45
- if (typeof value === 'string') {
46
- return value.includes(CLAUDE_MISSING_SESSION_DIAGNOSTIC);
47
- }
48
- if (value == null)
49
- return false;
50
- try {
51
- return JSON.stringify(value).includes(CLAUDE_MISSING_SESSION_DIAGNOSTIC);
52
- }
53
- catch {
54
- return false;
55
- }
56
- }
57
- function isMissingClaudeSessionErrorResult(value) {
58
- if (!value || typeof value !== 'object')
59
- return false;
60
- const payload = value;
61
- const markedAsError = payload.is_error === true ||
62
- (typeof payload.subtype === 'string' && payload.subtype.startsWith('error'));
63
- return markedAsError && containsMissingClaudeSessionDiagnostic(value);
64
- }
65
- function takeUtf8Tail(text, maxBytes) {
66
- if (maxBytes <= 0)
67
- return '';
68
- if (Buffer.byteLength(text) <= maxBytes)
69
- return text;
70
- let low = 0;
71
- let high = text.length;
72
- while (low < high) {
73
- const mid = Math.floor((low + high) / 2);
74
- if (Buffer.byteLength(text.slice(mid)) > maxBytes)
75
- low = mid + 1;
76
- else
77
- high = mid;
78
- }
79
- // Never start on the trailing half of a UTF-16 surrogate pair.
80
- if (low < text.length && text.charCodeAt(low) >= 0xdc00 && text.charCodeAt(low) <= 0xdfff)
81
- low++;
82
- return text.slice(low);
83
- }
84
- function buildResumeRecoveryPrompt(messages, currentPrompt) {
85
- const entries = messages.map((message) => `<message role="${message.role}">\n${message.content}\n</message>`);
86
- const selected = [];
87
- let usedBytes = 0;
88
- let omitted = 0;
89
- for (let i = entries.length - 1; i >= 0; i--) {
90
- const separatorBytes = selected.length > 0 ? 2 : 0;
91
- const entryBytes = Buffer.byteLength(entries[i]);
92
- if (entryBytes + separatorBytes <= RESUME_RECOVERY_TRANSCRIPT_MAX_BYTES - usedBytes) {
93
- selected.unshift(entries[i]);
94
- usedBytes += entryBytes + separatorBytes;
95
- continue;
96
- }
97
- omitted = i + 1;
98
- // Preserve the recent tail even when one individual message is larger than
99
- // the whole transcript budget. The marker makes the loss explicit to Claude.
100
- if (selected.length === 0) {
101
- const prefix = `<message role="${messages[i].role}">\n[earlier content truncated]\n`;
102
- const suffix = '\n</message>';
103
- const remaining = RESUME_RECOVERY_TRANSCRIPT_MAX_BYTES -
104
- Buffer.byteLength(prefix) - Buffer.byteLength(suffix);
105
- selected.unshift(`${prefix}${takeUtf8Tail(messages[i].content, remaining)}${suffix}`);
106
- omitted = i;
107
- }
108
- break;
109
- }
110
- const truncation = omitted > 0
111
- ? `[${omitted} earlier message${omitted === 1 ? '' : 's'} omitted to keep recovery context bounded]\n\n`
112
- : '';
113
- const transcript = selected.length > 0
114
- ? `${truncation}${selected.join('\n\n')}`
115
- : '[No prior persisted messages were available.]';
116
- return (`The previous Claude session could not be resumed after its working directory changed. ` +
117
- `Continue the same conversation using the persisted transcript below. Do not treat the transcript as a new user turn.\n\n` +
118
- `<prior-conversation>\n${transcript}\n</prior-conversation>\n\n` +
119
- `## Current user turn\n\n${currentPrompt}`);
120
- }
121
- function extractCommandProposals(text) {
122
- const regex = /:::command\s*\n([\s\S]*?):::/g;
123
- const results = [];
124
- let match;
125
- while ((match = regex.exec(text)) !== null) {
126
- results.push(match[1].trim());
127
- }
128
- return results;
129
- }
130
37
  // ─── Explore lifecycle ────────────────────────────────────────────────────────
131
38
  /** Tunables for Explore-spec acceleration lifecycle. Module-level constants
132
39
  * rather than ChatManager statics so tests can override via vi.spyOn or
@@ -1013,7 +920,7 @@ class ChatManager {
1013
920
  conversation.kind !== 'milestone') {
1014
921
  promptForAdapter = `${systemPrompt}\n\n---\n\n${promptForAdapter}`;
1015
922
  }
1016
- const buildRecoveryPrompt = () => buildResumeRecoveryPrompt((0, db_1.getMessages)(this._db, conversationId)
923
+ const buildRecoveryPrompt = () => (0, __1.buildResumeRecoveryPrompt)((0, db_1.getMessages)(this._db, conversationId)
1017
924
  .filter((message) => message.id !== persistedUserMessage.id)
1018
925
  .map((message) => ({ role: message.role, content: message.content })), promptForAdapter);
1019
926
  const turnOptions = {
@@ -1137,7 +1044,7 @@ class ChatManager {
1137
1044
  // user never sees the raw protocol payload mid-stream. The filter holds
1138
1045
  // back partial fence markers and emits only the user-visible prose.
1139
1046
  const filter = this._streamFilters.get(conversationId);
1140
- const visibleDelta = filter ? filterDraftBlocksLive(filter, newText) : newText;
1047
+ const visibleDelta = filter ? (0, __1.filterDraftBlocksLive)(filter, newText) : newText;
1141
1048
  if (visibleDelta) {
1142
1049
  this._broadcast({
1143
1050
  type: 'chat_stream',
@@ -1147,7 +1054,7 @@ class ChatManager {
1147
1054
  });
1148
1055
  }
1149
1056
  // Check for new command proposals
1150
- const proposals = extractCommandProposals(updated);
1057
+ const proposals = (0, __1.extractCommandProposals)(updated);
1151
1058
  const emitted = this._emittedProposals.get(conversationId);
1152
1059
  if (emitted) {
1153
1060
  for (const proposal of proposals) {
@@ -1245,10 +1152,10 @@ class ChatManager {
1245
1152
  !wasAborting &&
1246
1153
  fullText.length === 0 &&
1247
1154
  !adapterEvents.some((event) => event.kind === 'tool-use') &&
1248
- (containsMissingClaudeSessionDiagnostic(capturedErrorMessage) ||
1249
- containsMissingClaudeSessionDiagnostic(stderrBuf) ||
1155
+ ((0, __1.containsMissingClaudeSessionDiagnostic)(capturedErrorMessage) ||
1156
+ (0, __1.containsMissingClaudeSessionDiagnostic)(stderrBuf) ||
1250
1157
  adapterEvents.some((event) => event.kind === 'result' &&
1251
- isMissingClaudeSessionErrorResult(event.payload)));
1158
+ (0, __1.isMissingClaudeSessionErrorResult)(event.payload)));
1252
1159
  if (missingPriorSession) {
1253
1160
  resumeRecoveryAttempted = true;
1254
1161
  // The old id is provably unusable from the corrected cwd. Clearing it
@@ -1641,7 +1548,7 @@ class ChatManager {
1641
1548
  const prev = this._buffers.get(conversationId) ?? '';
1642
1549
  this._buffers.set(conversationId, prev + newText);
1643
1550
  const filter = this._streamFilters.get(conversationId);
1644
- const visibleDelta = filter ? filterDraftBlocksLive(filter, newText) : newText;
1551
+ const visibleDelta = filter ? (0, __1.filterDraftBlocksLive)(filter, newText) : newText;
1645
1552
  if (visibleDelta) {
1646
1553
  this._broadcast({
1647
1554
  type: 'chat_stream',
@@ -1650,7 +1557,7 @@ class ChatManager {
1650
1557
  timestamp: new Date().toISOString(),
1651
1558
  });
1652
1559
  }
1653
- const proposals = extractCommandProposals(this._buffers.get(conversationId) ?? '');
1560
+ const proposals = (0, __1.extractCommandProposals)(this._buffers.get(conversationId) ?? '');
1654
1561
  const emitted = this._emittedProposals.get(conversationId);
1655
1562
  if (emitted) {
1656
1563
  for (const proposal of proposals) {
@@ -1784,8 +1691,8 @@ class ChatManager {
1784
1691
  this._abortingConversations.has(conversationId) ||
1785
1692
  (this._buffers.get(conversationId) ?? '').length > 0 ||
1786
1693
  adapterEvents.some((event) => event.kind === 'tool-use') ||
1787
- !(containsMissingClaudeSessionDiagnostic(diagnostic) ||
1788
- containsMissingClaudeSessionDiagnostic(stderrBuf))) {
1694
+ !((0, __1.containsMissingClaudeSessionDiagnostic)(diagnostic) ||
1695
+ (0, __1.containsMissingClaudeSessionDiagnostic)(stderrBuf))) {
1789
1696
  return false;
1790
1697
  }
1791
1698
  // The persistent child was launched with the stale --resume before its
@@ -1926,7 +1833,7 @@ class ChatManager {
1926
1833
  break;
1927
1834
  case 'result': {
1928
1835
  const payload = ev.payload;
1929
- if (recoverMissingSession(isMissingClaudeSessionErrorResult(payload) ? payload : null))
1836
+ if (recoverMissingSession((0, __1.isMissingClaudeSessionErrorResult)(payload) ? payload : null))
1930
1837
  break;
1931
1838
  if (payload.session_id)
1932
1839
  capturedSessionId = payload.session_id;
@@ -2221,94 +2128,3 @@ class ChatManager {
2221
2128
  }
2222
2129
  }
2223
2130
  exports.ChatManager = ChatManager;
2224
- const FENCE_OPEN = '```spec-draft';
2225
- const FENCE_CLOSE = '```';
2226
- // Hold back up to this many trailing chars in the pre-block state so we never
2227
- // emit a partial open fence. -1 because we know the user-visible prefix is at
2228
- // least 1 char shorter than the full marker on every step.
2229
- const PRE_BLOCK_TAIL = FENCE_OPEN.length - 1;
2230
- /**
2231
- * Stateful, side-effect-free filter that consumes `newText` and returns the
2232
- * substring that is safe to broadcast to the chat stream. Holds back partial
2233
- * fence markers in `state.pendingTail` so the next call can resolve them.
2234
- *
2235
- * Behaviour:
2236
- * - While outside a block: emit text up to (but not including) the start of
2237
- * a `\`\`\`spec-draft` marker. If no marker is present, hold back the
2238
- * trailing few chars so a marker starting on a chunk boundary is not
2239
- * leaked.
2240
- * - While inside a block: emit nothing. Look for the closing `\`\`\``.
2241
- * When found, consume it (plus an optional trailing newline) and resume
2242
- * emitting from the bytes that follow.
2243
- *
2244
- * The filter intentionally does NOT validate the JSON payload — that is
2245
- * server-side concern of `parseSpecDraftBlocks`. It only strips the fenced
2246
- * span.
2247
- */
2248
- function filterDraftBlocksLive(state, newText) {
2249
- let buf = state.pendingTail + newText;
2250
- let out = '';
2251
- state.pendingTail = '';
2252
- // Iterate in case a single delta contains multiple transitions
2253
- // (e.g. close + open + close again — pathological but cheap to support).
2254
- while (buf.length > 0) {
2255
- if (state.inBlock) {
2256
- const closeIdx = buf.indexOf(FENCE_CLOSE);
2257
- if (closeIdx === -1) {
2258
- // No close yet — but the close could span the chunk boundary.
2259
- // Hold back up to 2 trailing chars (closing fence is 3 chars; we keep
2260
- // any trailing run of `\`` so the next call resolves it).
2261
- const tailLen = trailingBacktickRun(buf, 2);
2262
- state.pendingTail = buf.slice(buf.length - tailLen);
2263
- return out;
2264
- }
2265
- // Consume the close fence + an optional trailing newline.
2266
- let after = closeIdx + FENCE_CLOSE.length;
2267
- if (buf[after] === '\n')
2268
- after += 1;
2269
- buf = buf.slice(after);
2270
- state.inBlock = false;
2271
- continue;
2272
- }
2273
- // Not in block: look for the open marker.
2274
- const openIdx = buf.indexOf(FENCE_OPEN);
2275
- if (openIdx !== -1) {
2276
- out += buf.slice(0, openIdx);
2277
- buf = buf.slice(openIdx + FENCE_OPEN.length);
2278
- // Drop an optional newline immediately after the open marker so the
2279
- // user never sees `\n` belonging to the fence.
2280
- if (buf[0] === '\n')
2281
- buf = buf.slice(1);
2282
- state.inBlock = true;
2283
- continue;
2284
- }
2285
- // No open marker — hold back only the trailing run that could become a
2286
- // prefix of FENCE_OPEN (i.e. the longest suffix of `buf` that is also a
2287
- // prefix of FENCE_OPEN). Anything past that is safe to emit.
2288
- const holdBack = longestSuffixThatIsPrefixOf(buf, FENCE_OPEN);
2289
- const safeEnd = buf.length - holdBack;
2290
- out += buf.slice(0, safeEnd);
2291
- state.pendingTail = buf.slice(safeEnd);
2292
- return out;
2293
- }
2294
- return out;
2295
- }
2296
- /** Length of the longest suffix of `s` that is a prefix of `target`. */
2297
- function longestSuffixThatIsPrefixOf(s, target) {
2298
- const max = Math.min(s.length, target.length - 1);
2299
- for (let len = max; len > 0; len--) {
2300
- if (target.startsWith(s.slice(s.length - len)))
2301
- return len;
2302
- }
2303
- return 0;
2304
- }
2305
- function trailingBacktickRun(s, max) {
2306
- let n = 0;
2307
- for (let i = s.length - 1; i >= 0 && n < max; i--) {
2308
- if (s[i] === '`')
2309
- n++;
2310
- else
2311
- break;
2312
- }
2313
- return n;
2314
- }
@@ -15,7 +15,7 @@ exports.getContextBudget = getContextBudget;
15
15
  const node_fs_1 = __importDefault(require("node:fs"));
16
16
  const node_path_1 = __importDefault(require("node:path"));
17
17
  const context_scope_1 = require("./context-scope");
18
- const workspace_resolution_1 = require("./workspace-resolution");
18
+ const workspace_resolution_1 = require("../../../workspace-resolution");
19
19
  const BYTES_PER_TOKEN = 4;
20
20
  const CACHE_TTL_MS = 60_000;
21
21
  const SKIP_DIRS = new Set([
@@ -11,7 +11,7 @@ exports.removeExploreCwd = removeExploreCwd;
11
11
  const fs_1 = __importDefault(require("fs"));
12
12
  const path_1 = __importDefault(require("path"));
13
13
  const os_1 = __importDefault(require("os"));
14
- const providers_1 = require("./providers");
14
+ const providers_1 = require("../../../providers");
15
15
  /**
16
16
  * ExploreCwdManager owns the per-project app-managed cwd used to spawn the
17
17
  * provider CLI for Explore Spec turns. See openspec/changes/accelerate-spec-
@@ -5,7 +5,7 @@
5
5
  * Decomposes a committed ticket (with Contract Layer) into 3–8 ordered
6
6
  * child tickets. This module contains only the byte-stable system prompt,
7
7
  * the output schema, and the parser/validator. The spawn lifecycle and
8
- * store mutation live in `server/smash-runner.ts`.
8
+ * store mutation live in `server/modules/specs/runtime/smash-runner.ts`.
9
9
  *
10
10
  * See openspec/changes/add-specs-smash.
11
11
  */
@@ -22,7 +22,7 @@ exports.isExplorePersistentStdinEnabled = isExplorePersistentStdinEnabled;
22
22
  exports.frameStreamJsonUserMessage = frameStreamJsonUserMessage;
23
23
  const node_readline_1 = require("node:readline");
24
24
  const tree_kill_1 = __importDefault(require("tree-kill"));
25
- const cli_prompt_1 = require("./util/cli-prompt");
25
+ const cli_prompt_1 = require("../../../util/cli-prompt");
26
26
  /**
27
27
  * Persistent-stdin Explore is opt-in. Default OFF — set
28
28
  * `SPECRAILS_EXPLORE_PERSISTENT_STDIN=1` to enable. Any other value (or unset)
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SWEEPABLE_DECISIONS = void 0;
4
+ exports.sweepMergedChainAncestors = sweepMergedChainAncestors;
5
+ exports.pauseChainsOnDiscard = pauseChainsOnDiscard;
6
+ const rail_worktree_release_1 = require("../../runtime/rail-worktree-release");
7
+ const ids_1 = require("../../../../ids");
8
+ const milestone_chain_store_1 = require("../../../builder/runtime/milestone-chain-store");
9
+ const rail_pr_store_1 = require("../../runtime/rail-pr-store");
10
+ const evidence_1 = require("./evidence");
11
+ const ownership_1 = require("./ownership");
12
+ const transitions_1 = require("./transitions");
13
+ // ─── Milestone chain hooks (premium-milestone-progress D4) ───────────────────
14
+ /** Decisions a stacked sibling can sit at while its head is already merged. */
15
+ exports.SWEEPABLE_DECISIONS = new Set(['on_review', 'pr_draft', 'pr_ready', 'pr_closed']);
16
+ /**
17
+ * Merging a STACKED delivery also lands every earlier chunk it was built on.
18
+ * Walk the chain(s) this delivery belongs to and settle each still-undecided
19
+ * sibling whose delivered head commit is PROVABLY an ancestor of the chain's
20
+ * integration branch (`git merge-base --is-ancestor`) as `merged` — the same
21
+ * CAS + ticket effect (`done`) + Jira hook a direct merge runs. Chain-local by
22
+ * design; siblings whose head is not an ancestor are left untouched. Returns
23
+ * the swept delivery ids. Never throws.
24
+ */
25
+ async function sweepMergedChainAncestors(deps, mergedRow) {
26
+ const swept = [];
27
+ if (deps.repositoryChildOf)
28
+ return swept;
29
+ let chains;
30
+ try {
31
+ chains = (0, milestone_chain_store_1.listChainsTouchingDelivery)(deps.db, mergedRow.id);
32
+ }
33
+ catch {
34
+ return swept;
35
+ }
36
+ for (const chain of chains) {
37
+ const integration = chain.integration_branch;
38
+ if (!integration)
39
+ continue;
40
+ for (const entry of (0, milestone_chain_store_1.parseLaunched)(chain)) {
41
+ if (!entry.deliveryId || entry.deliveryId === mergedRow.id || swept.includes(entry.deliveryId))
42
+ continue;
43
+ const other = (0, rail_pr_store_1.getPrDelivery)(deps.db, entry.deliveryId);
44
+ if (!other || (0, rail_pr_store_1.isTerminalPrDecision)(other.decision) || !exports.SWEEPABLE_DECISIONS.has(other.decision))
45
+ continue;
46
+ const snap = (0, rail_pr_store_1.toPrDeliverySnapshot)(other);
47
+ // An assembled delivery SHA proves the whole chunk. Without that head,
48
+ // every unit needs its own immutable proof; accepting just the first
49
+ // ancestor could mark unmerged tickets done and delete their branches.
50
+ const requiredShas = snap.deliverySha ? [snap.deliverySha] : snap.units.map((unit) => unit.finalSha);
51
+ const validShas = requiredShas.filter((sha) => typeof sha === 'string' && evidence_1.COMMIT_SHA_RE.test(sha));
52
+ if (requiredShas.length === 0 || validShas.length !== requiredShas.length)
53
+ continue;
54
+ let allAncestors = true;
55
+ try {
56
+ for (const sha of new Set(validShas)) {
57
+ const r = await deps.git.run(['merge-base', '--is-ancestor', sha, integration], deps.project.path);
58
+ if (r.code !== 0) {
59
+ allAncestors = false;
60
+ break;
61
+ }
62
+ }
63
+ }
64
+ catch {
65
+ allAncestors = false;
66
+ }
67
+ if (!allAncestors)
68
+ continue;
69
+ const token = (0, ids_1.newId)();
70
+ if (!(0, rail_pr_store_1.claimPrDeliveryOperation)(deps.db, other.id, other.decision, 'poll-merge', token))
71
+ continue;
72
+ let released = false;
73
+ try {
74
+ const claimed = { ...other, operation_token: token };
75
+ const cleanupWarnings = await (0, rail_worktree_release_1.releaseRailWorktrees)({
76
+ db: deps.db, git: deps.git, repoDir: deps.project.path,
77
+ worktreeIds: (0, ownership_1.releasableWorktreeIds)(deps, snap), state: 'merged',
78
+ expectedHeadByBranch: (0, rail_worktree_release_1.durableBranchHeads)(snap.branches),
79
+ overlayEvidenceByBranch: (0, rail_worktree_release_1.durableOverlayCleanupEvidence)(snap.branches),
80
+ settlementIgnoredByBranch: (0, rail_worktree_release_1.durableSettlementIgnoredPaths)(snap.branches),
81
+ onSafetyArchive: (0, transitions_1.safetyArchiveRecorder)(deps, claimed),
82
+ });
83
+ await (0, ownership_1.deleteOwnedBranchesIfUnchanged)(deps, claimed, snap, cleanupWarnings);
84
+ const conflict = (0, transitions_1.casTransitionWithTicketEffect)(deps, claimed, 'merged', {
85
+ deliveryOutcome: 'delivered',
86
+ statusCode: cleanupWarnings.length > 0 ? 'cleanup_incomplete' : 'merged',
87
+ statusDetail: `merged as part of ${mergedRow.rail_key}`,
88
+ cleanupWarnings,
89
+ }, {
90
+ deliveryId: claimed.id,
91
+ ticketIds: snap.ticketIds,
92
+ targetStatus: 'done',
93
+ jiraAction: 'merged',
94
+ prUrl: claimed.pr_url,
95
+ });
96
+ if (conflict)
97
+ continue;
98
+ (0, transitions_1.applyTerminalTicketEffect)(deps, claimed, 'merged', cleanupWarnings);
99
+ // Release BEFORE finalizing: a row still holding a lease defers its
100
+ // broadcast to the lease owner's finally, which here would never come.
101
+ (0, rail_pr_store_1.releasePrDeliveryOperation)(deps.db, other.id, token);
102
+ released = true;
103
+ (0, transitions_1.finalizeTransition)(deps, other.id);
104
+ swept.push(other.id);
105
+ }
106
+ catch (err) {
107
+ console.error(`[milestone-chain] ancestor sweep failed for ${other.id}:`, err);
108
+ }
109
+ finally {
110
+ if (!released)
111
+ (0, rail_pr_store_1.releasePrDeliveryOperation)(deps.db, other.id, token);
112
+ }
113
+ }
114
+ }
115
+ return swept;
116
+ }
117
+ /** A discarded delivery that a chain's later chunks build on pauses those
118
+ * chains (`head_discarded`, head rewound to the previous chunk's branch). */
119
+ function pauseChainsOnDiscard(deps, row) {
120
+ if (deps.repositoryChildOf)
121
+ return;
122
+ try {
123
+ const branchOf = (id) => {
124
+ const other = (0, rail_pr_store_1.getPrDelivery)(deps.db, id);
125
+ if (!other)
126
+ return null;
127
+ const s = (0, rail_pr_store_1.toPrDeliverySnapshot)(other);
128
+ return s.branch ?? s.units.find((u) => u.succeeded && u.branch)?.branch ?? null;
129
+ };
130
+ const paused = (0, milestone_chain_store_1.pauseChainsForDiscardedHead)(deps.db, row.id, branchOf);
131
+ for (const chain of paused) {
132
+ deps.broadcast({ type: 'milestone.chain_changed', projectId: deps.project.id, chain: (0, milestone_chain_store_1.toChainSnapshot)(chain), timestamp: new Date().toISOString() });
133
+ }
134
+ }
135
+ catch (err) {
136
+ console.error('[milestone-chain] discard hook failed:', err);
137
+ }
138
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });