@quantiya/codevibe-core 2.0.1 → 2.0.2

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 (282) hide show
  1. package/dist/__tests__/prompt-parser.test.d.ts +1 -0
  2. package/dist/adapter/registry.d.ts +69 -2
  3. package/dist/appsync/__tests__/appsync-client-event-source-filter.test.d.ts +1 -0
  4. package/dist/appsync/__tests__/appsync-client-task-group.test.d.ts +1 -0
  5. package/dist/appsync/__tests__/cleanup-subscription.test.d.ts +1 -0
  6. package/dist/appsync/__tests__/coerce-awsjson-and-review-summary.test.d.ts +1 -0
  7. package/dist/appsync/__tests__/cp1f-quorum-sdk.test.d.ts +1 -0
  8. package/dist/appsync/__tests__/event-throttle.test.d.ts +1 -0
  9. package/dist/appsync/appsync-client.d.ts +621 -10
  10. package/dist/appsync/event-throttle.d.ts +28 -0
  11. package/dist/appsync/index.d.ts +3 -0
  12. package/dist/appsync/queries.d.ts +19 -0
  13. package/dist/audit-keys/index.d.ts +32 -0
  14. package/dist/auth/auth-service.d.ts +32 -2
  15. package/dist/auth/auth-telemetry.d.ts +19 -1
  16. package/dist/auth/index.d.ts +1 -0
  17. package/dist/companion-mode/persist-preference.d.ts +1 -1
  18. package/dist/config/config.d.ts +8 -1
  19. package/dist/continuation/__tests__/dirty-state-collector.test.d.ts +1 -0
  20. package/dist/continuation/__tests__/integration.test.d.ts +1 -0
  21. package/dist/continuation/__tests__/packet-reader.test.d.ts +1 -0
  22. package/dist/continuation/__tests__/packet-writer.test.d.ts +1 -0
  23. package/dist/continuation/__tests__/parity.test.d.ts +1 -0
  24. package/dist/continuation/__tests__/status-cli.test.d.ts +1 -0
  25. package/dist/continuation/dirty-state-collector.d.ts +46 -0
  26. package/dist/continuation/index.d.ts +8 -0
  27. package/dist/continuation/packet-reader.d.ts +33 -0
  28. package/dist/continuation/packet-writer.d.ts +86 -0
  29. package/dist/continuation/types.d.ts +239 -0
  30. package/dist/credential-broker/__tests__/broker.test.d.ts +1 -0
  31. package/dist/credential-broker/__tests__/canonical.test.d.ts +1 -0
  32. package/dist/credential-broker/__tests__/scrubber.test.d.ts +1 -0
  33. package/dist/credential-broker/__tests__/upstream-client.test.d.ts +1 -0
  34. package/dist/credential-broker/__tests__/vendor-key-store.test.d.ts +1 -0
  35. package/dist/credential-broker/audit-sink.d.ts +69 -0
  36. package/dist/credential-broker/broker-config.d.ts +39 -0
  37. package/dist/credential-broker/broker-token.d.ts +123 -0
  38. package/dist/credential-broker/broker.d.ts +165 -0
  39. package/dist/credential-broker/canonical.d.ts +119 -0
  40. package/dist/credential-broker/index.d.ts +15 -0
  41. package/dist/credential-broker/scrubber.d.ts +45 -0
  42. package/dist/credential-broker/types.d.ts +141 -0
  43. package/dist/credential-broker/upstream-client.d.ts +20 -0
  44. package/dist/credential-broker/vendor-key-store.d.ts +54 -0
  45. package/dist/index.d.ts +6 -1
  46. package/dist/index.js +427 -124
  47. package/dist/keychain/__tests__/keychain-backend.test.d.ts +1 -0
  48. package/dist/keychain/keychain-backend.d.ts +82 -0
  49. package/dist/local-executor/__tests__/agentic-disposable-repo.test.d.ts +1 -0
  50. package/dist/local-executor/__tests__/agentic-resolve.test.d.ts +1 -0
  51. package/dist/local-executor/__tests__/agentic-resolver-flag.test.d.ts +1 -0
  52. package/dist/local-executor/__tests__/class-a-sign.test.d.ts +1 -0
  53. package/dist/local-executor/__tests__/class1-reconcilers.test.d.ts +1 -0
  54. package/dist/local-executor/__tests__/class2-resolver.test.d.ts +1 -0
  55. package/dist/local-executor/__tests__/confined-model-caller.test.d.ts +1 -0
  56. package/dist/local-executor/__tests__/conflict-classifier.test.d.ts +1 -0
  57. package/dist/local-executor/__tests__/conflict-resolution-durable-store.test.d.ts +1 -0
  58. package/dist/local-executor/__tests__/conflict-resolution-store.test.d.ts +1 -0
  59. package/dist/local-executor/__tests__/cp1f-quorum-consumer.test.d.ts +1 -0
  60. package/dist/local-executor/__tests__/cp7-audit-writer.test.d.ts +1 -0
  61. package/dist/local-executor/__tests__/durable-store.test.d.ts +1 -0
  62. package/dist/local-executor/__tests__/git-lock-retry.test.d.ts +1 -0
  63. package/dist/local-executor/__tests__/implementor-argv.test.d.ts +1 -0
  64. package/dist/local-executor/__tests__/local-executor-teams.test.d.ts +1 -0
  65. package/dist/local-executor/__tests__/merge-conflict-extract.test.d.ts +1 -0
  66. package/dist/local-executor/__tests__/merge-conflict-git.integration.test.d.ts +1 -0
  67. package/dist/local-executor/__tests__/merge-conflict-resolve-agentic.integration.test.d.ts +1 -0
  68. package/dist/local-executor/__tests__/merge-conflict-resolve.integration.test.d.ts +1 -0
  69. package/dist/local-executor/__tests__/merge-journal-store.test.d.ts +1 -0
  70. package/dist/local-executor/__tests__/merge-train-agentic-recovery.integration.test.d.ts +1 -0
  71. package/dist/local-executor/__tests__/merge-train-w3.integration.test.d.ts +1 -0
  72. package/dist/local-executor/__tests__/merge-train-waveb.integration.test.d.ts +1 -0
  73. package/dist/local-executor/__tests__/merge-train.test.d.ts +1 -0
  74. package/dist/local-executor/__tests__/promote-wal-store.test.d.ts +1 -0
  75. package/dist/local-executor/__tests__/revert-reconcile.test.d.ts +1 -0
  76. package/dist/local-executor/__tests__/revert-runner.test.d.ts +1 -0
  77. package/dist/local-executor/__tests__/shared-contract-detector.test.d.ts +1 -0
  78. package/dist/local-executor/__tests__/substrate-engage.test.d.ts +1 -0
  79. package/dist/local-executor/__tests__/team-execution-flag.test.d.ts +1 -0
  80. package/dist/local-executor/__tests__/track-registry.test.d.ts +1 -0
  81. package/dist/local-executor/__tests__/wb2-review-bundle.test.d.ts +1 -0
  82. package/dist/local-executor/__tests__/wb2-substrate-spawn.live.test.d.ts +1 -0
  83. package/dist/local-executor/__tests__/workspace-shadow.test.d.ts +1 -0
  84. package/dist/local-executor/__tests__/worktree-merge.test.d.ts +1 -0
  85. package/dist/local-executor/agentic-disposable-repo.d.ts +52 -0
  86. package/dist/local-executor/agentic-resolve.d.ts +54 -0
  87. package/dist/local-executor/agentic-resolver-flag.d.ts +9 -0
  88. package/dist/local-executor/authority.d.ts +33 -1
  89. package/dist/local-executor/class-a-emit.d.ts +3 -1
  90. package/dist/local-executor/class-a-sign.d.ts +57 -0
  91. package/dist/local-executor/class-b-consumer.d.ts +159 -4
  92. package/dist/local-executor/class-b-verify.d.ts +30 -0
  93. package/dist/local-executor/class1-reconcilers.d.ts +58 -0
  94. package/dist/local-executor/class2-resolver.d.ts +74 -0
  95. package/dist/local-executor/confined-model-caller.d.ts +39 -0
  96. package/dist/local-executor/conflict-classifier.d.ts +21 -0
  97. package/dist/local-executor/conflict-resolution-durable-store.d.ts +61 -0
  98. package/dist/local-executor/conflict-resolution-store.d.ts +210 -0
  99. package/dist/local-executor/conflict-types.d.ts +86 -0
  100. package/dist/local-executor/cp7-audit-writer.d.ts +152 -0
  101. package/dist/local-executor/durable-store.d.ts +334 -0
  102. package/dist/local-executor/git-lock-retry.d.ts +40 -0
  103. package/dist/local-executor/hook-bridge.d.ts +1 -1
  104. package/dist/local-executor/implementor-argv.d.ts +183 -0
  105. package/dist/local-executor/index.d.ts +44 -3
  106. package/dist/local-executor/local-executor-impl.d.ts +645 -4
  107. package/dist/local-executor/merge-conflict-extract.d.ts +34 -0
  108. package/dist/local-executor/merge-conflict-resolve.d.ts +101 -0
  109. package/dist/local-executor/merge-journal-store.d.ts +311 -0
  110. package/dist/local-executor/merge-train.d.ts +713 -0
  111. package/dist/local-executor/promote-wal-store.d.ts +301 -0
  112. package/dist/local-executor/resolution-set-index.d.ts +51 -0
  113. package/dist/local-executor/revert-reconcile.d.ts +89 -0
  114. package/dist/local-executor/revert-runner.d.ts +17 -0
  115. package/dist/local-executor/shared-contract-detector.d.ts +57 -0
  116. package/dist/local-executor/spawn.d.ts +29 -1
  117. package/dist/local-executor/task-group-types.d.ts +346 -0
  118. package/dist/local-executor/team-execution-flag.d.ts +21 -0
  119. package/dist/local-executor/track-registry.d.ts +50 -0
  120. package/dist/local-executor/types.d.ts +238 -4
  121. package/dist/local-executor/wb2-review-bundle.d.ts +59 -0
  122. package/dist/local-executor/workspace-shadow.d.ts +290 -0
  123. package/dist/local-executor/worktree-merge.d.ts +601 -0
  124. package/dist/local-model/__tests__/installer.test.d.ts +1 -0
  125. package/dist/local-model/__tests__/manager.test.d.ts +1 -0
  126. package/dist/local-model/__tests__/ollama.test.d.ts +1 -0
  127. package/dist/local-model/__tests__/runtime.test.d.ts +1 -0
  128. package/dist/local-model/__tests__/state.test.d.ts +1 -0
  129. package/dist/local-model/manager.d.ts +119 -0
  130. package/dist/local-model/ollama.d.ts +27 -0
  131. package/dist/local-model/runtime.d.ts +27 -0
  132. package/dist/local-model/state.d.ts +32 -0
  133. package/dist/orchestration/detect-agents.d.ts +15 -2
  134. package/dist/orchestration/setup-types.d.ts +2 -1
  135. package/dist/orchestration-shell/__tests__/attachments.test.d.ts +1 -0
  136. package/dist/orchestration-shell/__tests__/audit-browser.test.d.ts +1 -0
  137. package/dist/orchestration-shell/__tests__/audited-path-fixes.test.d.ts +1 -0
  138. package/dist/orchestration-shell/__tests__/bracketed-paste.test.d.ts +1 -0
  139. package/dist/orchestration-shell/__tests__/cli-group-halt-wiring.test.d.ts +1 -0
  140. package/dist/orchestration-shell/__tests__/cli-orchestration-session-bootstrap.test.d.ts +1 -0
  141. package/dist/orchestration-shell/__tests__/cli-probe-group-status.test.d.ts +1 -0
  142. package/dist/orchestration-shell/__tests__/cli-quorum-loop-tier.test.d.ts +1 -0
  143. package/dist/orchestration-shell/__tests__/cli-verdict-classifier-wiring.test.d.ts +1 -0
  144. package/dist/orchestration-shell/__tests__/context-store.test.d.ts +1 -0
  145. package/dist/orchestration-shell/__tests__/cp10-585-accept-echo-target.test.d.ts +1 -0
  146. package/dist/orchestration-shell/__tests__/cp10-585-loop.test.d.ts +1 -0
  147. package/dist/orchestration-shell/__tests__/cp10-585-prompts.test.d.ts +1 -0
  148. package/dist/orchestration-shell/__tests__/cp12-w2b-team-loop.test.d.ts +1 -0
  149. package/dist/orchestration-shell/__tests__/cp12-w4-team-recovery.test.d.ts +1 -0
  150. package/dist/orchestration-shell/__tests__/cp1f-quorum-loop.test.d.ts +1 -0
  151. package/dist/orchestration-shell/__tests__/cp606-team-track-user-resolved.test.d.ts +1 -0
  152. package/dist/orchestration-shell/__tests__/cp7-reviewer-substrate.test.d.ts +1 -0
  153. package/dist/orchestration-shell/__tests__/declared-test-runner.test.d.ts +1 -0
  154. package/dist/orchestration-shell/__tests__/familiarize-routing.test.d.ts +1 -0
  155. package/dist/orchestration-shell/__tests__/gate-decision-submit.test.d.ts +1 -0
  156. package/dist/orchestration-shell/__tests__/gate-details-panel.test.d.ts +1 -0
  157. package/dist/orchestration-shell/__tests__/gate-verdict-details-dispatch.test.d.ts +1 -0
  158. package/dist/orchestration-shell/__tests__/group-decision-submit.test.d.ts +1 -0
  159. package/dist/orchestration-shell/__tests__/image-attach-e2e.test.d.ts +1 -0
  160. package/dist/orchestration-shell/__tests__/input-bar-autocomplete.test.d.ts +1 -0
  161. package/dist/orchestration-shell/__tests__/live-region-cap.test.d.ts +1 -0
  162. package/dist/orchestration-shell/__tests__/live-static-order.test.d.ts +1 -0
  163. package/dist/orchestration-shell/__tests__/model-cli.test.d.ts +1 -0
  164. package/dist/orchestration-shell/__tests__/non-gate-prompt-routing.test.d.ts +1 -0
  165. package/dist/orchestration-shell/__tests__/orchestration-app-group-decision-transport.test.d.ts +1 -0
  166. package/dist/orchestration-shell/__tests__/orchestration-app-layout.test.d.ts +1 -0
  167. package/dist/orchestration-shell/__tests__/reissue-team-retained-spec.test.d.ts +1 -0
  168. package/dist/orchestration-shell/__tests__/review-summary-render.test.d.ts +1 -0
  169. package/dist/orchestration-shell/__tests__/reviewer-wizard.test.d.ts +1 -0
  170. package/dist/orchestration-shell/__tests__/reviewers-format.test.d.ts +1 -0
  171. package/dist/orchestration-shell/__tests__/root-discovery.test.d.ts +1 -0
  172. package/dist/orchestration-shell/__tests__/serialize-submissions.test.d.ts +1 -0
  173. package/dist/orchestration-shell/__tests__/slash-suggest.test.d.ts +1 -0
  174. package/dist/orchestration-shell/__tests__/status-format.test.d.ts +1 -0
  175. package/dist/orchestration-shell/__tests__/task-progress.test.d.ts +1 -0
  176. package/dist/orchestration-shell/__tests__/team-decompose-routing.test.d.ts +1 -0
  177. package/dist/orchestration-shell/__tests__/team-decompose-types.test.d.ts +1 -0
  178. package/dist/orchestration-shell/__tests__/team-decompose.test.d.ts +1 -0
  179. package/dist/orchestration-shell/__tests__/team-e2e-smoke.test.d.ts +1 -0
  180. package/dist/orchestration-shell/__tests__/tier2-reviewer-selection.test.d.ts +1 -0
  181. package/dist/orchestration-shell/__tests__/web-browsing.test.d.ts +1 -0
  182. package/dist/orchestration-shell/attachments.d.ts +152 -0
  183. package/dist/orchestration-shell/audit-browser.d.ts +115 -0
  184. package/dist/orchestration-shell/audit-runner.d.ts +59 -0
  185. package/dist/orchestration-shell/bracketed-paste.d.ts +26 -0
  186. package/dist/orchestration-shell/cli.d.ts +336 -1
  187. package/dist/orchestration-shell/cli.js +39318 -3436
  188. package/dist/orchestration-shell/components/AuditLogPanel.d.ts +11 -0
  189. package/dist/orchestration-shell/components/ConversationPane.d.ts +7 -1
  190. package/dist/orchestration-shell/components/GateDetailsPanel.d.ts +57 -0
  191. package/dist/orchestration-shell/components/GatePanelEntry.d.ts +9 -0
  192. package/dist/orchestration-shell/components/GatePromptEntry.d.ts +7 -0
  193. package/dist/orchestration-shell/components/InputBar.d.ts +17 -3
  194. package/dist/orchestration-shell/components/LiveProgressLine.d.ts +8 -0
  195. package/dist/orchestration-shell/components/MultiTrackStatusNode.d.ts +8 -0
  196. package/dist/orchestration-shell/components/OrchestrationApp.d.ts +81 -15
  197. package/dist/orchestration-shell/components/ReviewerSetupWizard.d.ts +24 -0
  198. package/dist/orchestration-shell/components/StatusBar.d.ts +15 -2
  199. package/dist/orchestration-shell/context-store.d.ts +389 -0
  200. package/dist/orchestration-shell/declared-test-runner.d.ts +84 -0
  201. package/dist/orchestration-shell/emit-shell-event.d.ts +1 -1
  202. package/dist/orchestration-shell/gate-decision-submit.d.ts +245 -0
  203. package/dist/orchestration-shell/gate-prompts.d.ts +361 -3
  204. package/dist/orchestration-shell/index.d.ts +613 -1
  205. package/dist/orchestration-shell/ink-runtime.d.ts +21 -1
  206. package/dist/orchestration-shell/live-region-cap.d.ts +70 -0
  207. package/dist/orchestration-shell/live-static-order.d.ts +22 -0
  208. package/dist/orchestration-shell/non-tty-fallback.d.ts +21 -0
  209. package/dist/orchestration-shell/quorum-loop.d.ts +1900 -0
  210. package/dist/orchestration-shell/root-discovery.d.ts +25 -0
  211. package/dist/orchestration-shell/route-browse.d.ts +20 -0
  212. package/dist/orchestration-shell/slash-router.d.ts +20 -1
  213. package/dist/orchestration-shell/slash-routes/continuation.d.ts +71 -0
  214. package/dist/orchestration-shell/slash-routes/reviewers.d.ts +41 -0
  215. package/dist/orchestration-shell/slash-suggest.d.ts +29 -0
  216. package/dist/orchestration-shell/status-format.d.ts +59 -0
  217. package/dist/orchestration-shell/task-progress.d.ts +122 -0
  218. package/dist/orchestration-shell/team-decompose.d.ts +196 -0
  219. package/dist/orchestration-shell/types.d.ts +363 -3
  220. package/dist/orchestration-shell/vendor/ink-parse-keypress.d.ts +42 -0
  221. package/dist/orchestration-shell/web/extract.d.ts +11 -0
  222. package/dist/orchestration-shell/web/fetch.d.ts +15 -0
  223. package/dist/orchestration-shell/web/ip.d.ts +26 -0
  224. package/dist/orchestration-shell/web/sanitize.d.ts +14 -0
  225. package/dist/orchestration-shell/web/search.d.ts +16 -0
  226. package/dist/planner/__tests__/local-gemma.test.d.ts +1 -0
  227. package/dist/planner/index.d.ts +2 -0
  228. package/dist/planner/local-advisory.d.ts +84 -0
  229. package/dist/planner/local-gemma.d.ts +23 -0
  230. package/dist/planner/types.d.ts +16 -6
  231. package/dist/reviewer/__tests__/antigravity-provider.test.d.ts +1 -0
  232. package/dist/reviewer/__tests__/claude-provider-json.test.d.ts +1 -0
  233. package/dist/reviewer/__tests__/cp7-reviewer-sandbox.test.d.ts +1 -0
  234. package/dist/reviewer/__tests__/output-parser-classifier-helpers.test.d.ts +1 -0
  235. package/dist/reviewer/__tests__/verdict-classifier.test.d.ts +1 -0
  236. package/dist/reviewer/index.d.ts +2 -0
  237. package/dist/reviewer/output-parser.d.ts +48 -12
  238. package/dist/reviewer/provider.d.ts +107 -3
  239. package/dist/reviewer/providers/__tests__/failure-classifier.test.d.ts +1 -0
  240. package/dist/reviewer/providers/antigravity.d.ts +49 -0
  241. package/dist/reviewer/providers/claude.d.ts +19 -4
  242. package/dist/reviewer/providers/codex.d.ts +47 -5
  243. package/dist/reviewer/providers/failure-classifier.d.ts +26 -0
  244. package/dist/reviewer/providers/gemini.d.ts +5 -4
  245. package/dist/reviewer/registry.d.ts +5 -5
  246. package/dist/reviewer/subprocess.d.ts +37 -0
  247. package/dist/reviewer/token-usage.d.ts +32 -0
  248. package/dist/reviewer/types.d.ts +5 -5
  249. package/dist/reviewer/verdict-classifier.d.ts +62 -0
  250. package/dist/session/__tests__/prepare-event-timestamp.test.d.ts +1 -0
  251. package/dist/session/index.d.ts +1 -0
  252. package/dist/session/prepare-event-timestamp.d.ts +30 -0
  253. package/dist/substrate/__tests__/docker.test.d.ts +1 -0
  254. package/dist/substrate/__tests__/forwarder.test.d.ts +1 -0
  255. package/dist/substrate/__tests__/git-proxy.test.d.ts +1 -0
  256. package/dist/substrate/__tests__/sandbox-exec.test.d.ts +1 -0
  257. package/dist/substrate/__tests__/substrate-e2e.integration.test.d.ts +1 -0
  258. package/dist/substrate/command-runner.d.ts +19 -0
  259. package/dist/substrate/docker.d.ts +134 -0
  260. package/dist/substrate/errors.d.ts +33 -0
  261. package/dist/substrate/forwarder.d.ts +67 -0
  262. package/dist/substrate/git-proxy.d.ts +35 -0
  263. package/dist/substrate/index.d.ts +12 -0
  264. package/dist/substrate/relay-script.d.ts +27 -0
  265. package/dist/substrate/sandbox-exec.d.ts +116 -0
  266. package/dist/substrate/types.d.ts +218 -0
  267. package/dist/substrate-launch/__tests__/apikey-bootstrap.test.d.ts +1 -0
  268. package/dist/substrate-launch/__tests__/creditless-loop.integration.test.d.ts +1 -0
  269. package/dist/substrate-launch/__tests__/engage-substrate.test.d.ts +1 -0
  270. package/dist/substrate-launch/__tests__/fallback-ladder.test.d.ts +1 -0
  271. package/dist/substrate-launch/__tests__/le-env-scrub.test.d.ts +1 -0
  272. package/dist/substrate-launch/__tests__/sanitized-env.test.d.ts +1 -0
  273. package/dist/substrate-launch/apikey-bootstrap.d.ts +84 -0
  274. package/dist/substrate-launch/engage-substrate.d.ts +102 -0
  275. package/dist/substrate-launch/fallback-ladder.d.ts +49 -0
  276. package/dist/substrate-launch/index.d.ts +12 -0
  277. package/dist/substrate-launch/le-env-scrub.d.ts +77 -0
  278. package/dist/substrate-launch/sanitized-env.d.ts +73 -0
  279. package/dist/types/auth.d.ts +6 -1
  280. package/dist/types/events.d.ts +3 -1
  281. package/dist/types/reviewer.d.ts +6 -6
  282. package/package.json +7 -3
@@ -1,7 +1,8 @@
1
1
  import type { ChildProcess } from 'node:child_process';
2
+ import type { SubstrateHandle, SubstrateProc } from '../substrate/types';
2
3
  import type { AuthorityRefusal, AuthorityScope } from './authority';
3
4
  export type ProcessRole = 'implementor' | 'reviewer' | 'health_probe' | 'auth_probe' | 'model_probe';
4
- export type AgentKind = 'CLAUDE' | 'GEMINI' | 'CODEX';
5
+ export type AgentKind = 'CLAUDE' | 'GEMINI' | 'CODEX' | 'ANTIGRAVITY';
5
6
  export type FailureClass = null | 'quota_exhausted' | 'auth_failed' | 'timeout' | 'unavailable' | 'user_aborted';
6
7
  export interface SpawnArgs {
7
8
  argv: string[];
@@ -13,8 +14,11 @@ export interface SpawnArgs {
13
14
  stdinTty?: boolean;
14
15
  stdinPayload?: string;
15
16
  signal?: AbortSignal;
17
+ taskId?: string;
16
18
  onProcessSpawned?: ProcessSpawnedHook;
17
19
  onProcessExited?: ProcessExitedHook;
20
+ substrate?: SubstrateHandle;
21
+ requireConfined?: boolean;
18
22
  }
19
23
  export interface ProcessSpawnedInfo {
20
24
  pid: number;
@@ -58,6 +62,10 @@ export declare class SpawnArgsInvalid extends Error {
58
62
  readonly offendingKey?: string | undefined;
59
63
  constructor(reason: string, offendingKey?: string | undefined);
60
64
  }
65
+ export declare class SpawnConfinementUnavailable extends Error {
66
+ readonly reason: string;
67
+ constructor(reason: string);
68
+ }
61
69
  export declare const MARKER_ENV_KEYS: {
62
70
  readonly CHILD: "CODEVIBE_CHILD_PROCESS";
63
71
  readonly ROLE: "CODEVIBE_PROCESS_ROLE";
@@ -78,6 +86,32 @@ export type AuthorityAction = {
78
86
  command: string;
79
87
  argv: string[];
80
88
  };
89
+ export interface GateDispatchPayload {
90
+ /** The DETERMINISTIC gate_id of this gate-run (the round-0 proposal gate id at START). */
91
+ gateRunId: string;
92
+ /** `"verification" | "reviewer_quorum" | "final_approval"` (snake_case wire form). */
93
+ gateType: string;
94
+ /** Present ONLY for `verification` gates (CP-3 — out of scope for CP-1.f single-task). */
95
+ verificationChecks?: string[];
96
+ /**
97
+ * Present ONLY once the per-seat reviewer panel is resolved. ABSENT at START
98
+ * (the proposal hasn't arrived) — `start_ports.rs:296` sets `reviewer_seats:
99
+ * None`. Each row is the camelCase `ReviewerSeatRow`
100
+ * (`{seatId, agentKind, role, reviewerPacketRef}`).
101
+ */
102
+ reviewerSeats?: GateDispatchReviewerSeat[];
103
+ /** Present ONLY for `final_approval` gates. */
104
+ finalApprovalSurface?: string;
105
+ }
106
+ /** One reviewer-seat row inside `GateDispatchPayload.reviewerSeats` (camelCase). */
107
+ export interface GateDispatchReviewerSeat {
108
+ seatId: number;
109
+ /** UPPERCASE agent kind: `"CLAUDE" | "CODEX" | "GEMINI"`. */
110
+ agentKind: string;
111
+ /** UPPERCASE lens: `"ARCHITECTURE" | "CORRECTNESS" | ...`. */
112
+ role: string;
113
+ reviewerPacketRef: string;
114
+ }
81
115
  export interface SignedEnvelope {
82
116
  algorithm: 'ed25519' | 'p384-ecdsa';
83
117
  publicKeyId: string;
@@ -85,6 +119,168 @@ export interface SignedEnvelope {
85
119
  issuedAt: string;
86
120
  nonceUlid: string;
87
121
  }
122
+ /**
123
+ * Cross-track-conflict dispute context (§2.2, #C12-19). Present ONLY on a
124
+ * dispute re-dispatch; ABSENT (undefined) on a fresh `TrackAssigned`. The
125
+ * re-dispatched implementor/reviewers use it to know what to reconcile.
126
+ */
127
+ export interface TrackConflictContext {
128
+ conflict_id: string;
129
+ shared_contract_ref: string;
130
+ peer_track_findings: unknown;
131
+ }
132
+ /**
133
+ * §2.2 `TrackAssigned` payload — launch track N. The LE spawns the implementor
134
+ * for this track in `state_dir`, idempotent by
135
+ * `(task_group_id, track_index, dispatch_generation)` (#C12-14/#C12-17).
136
+ */
137
+ export interface TrackAssignedPayload {
138
+ task_group_id: string;
139
+ track_index: number;
140
+ task_id: string;
141
+ /** UPPERCASE adapter discriminator (CLAUDE | GEMINI | CODEX). */
142
+ implementor_agent: AgentKind;
143
+ /** snake_case OwnershipScope (advanced to the per-track authority scope). */
144
+ ownership_scope: {
145
+ write_paths: string[];
146
+ shared_contracts: {
147
+ path: string;
148
+ access: 'write' | 'read';
149
+ }[];
150
+ test_surfaces: string[];
151
+ auto_modified_files: string[];
152
+ };
153
+ is_shared_test_owner: boolean;
154
+ /** `<repo>/.codevibe/state/<task_group_id>/<track_index>/`. */
155
+ state_dir: string;
156
+ dispatch_id: string;
157
+ dispatch_generation: number;
158
+ /** Option — present on a dispute re-dispatch (#C12-19), absent on fresh. */
159
+ conflict_context?: TrackConflictContext;
160
+ }
161
+ /**
162
+ * §2.2 `MergeGateDispatch` payload — run the shared integration verification.
163
+ * The `owner_track_index` track runs the integration check named by
164
+ * `integration_check_spec` (§12 Q1 — CP-3 verification-gate kinds, NOT a
165
+ * free-form shell), classifies + signs the result (#C12-8), and reports
166
+ * `submitMergeGateVerdict`.
167
+ */
168
+ export interface MergeGateDispatchPayload {
169
+ task_group_id: string;
170
+ merge_gate_id: string;
171
+ /**
172
+ * §12 Q1 — names CP-3 verification-runner wrapper(s). On the wire this is the
173
+ * `VerificationGateKind` list the owner track named at `createTaskGroup`. A
174
+ * single string is accepted for forward-compat and coerced to a 1-element
175
+ * list by the runner.
176
+ */
177
+ integration_check_spec: string | string[];
178
+ owner_track_index: number;
179
+ dispatch_id: string;
180
+ dispatch_generation: number;
181
+ }
182
+ /**
183
+ * §2.2 `TaskGroupHalted` payload — group halted/escalated (expanded escalation
184
+ * fields per the Stage-2 §11.3 fix). The LE surfaces the choices to the UI
185
+ * (NOTIFICATION) + signals the in-flight track processes to stop. The deep
186
+ * auto-resolution decision tree is server-side (#C12-3) — the LE only consumes,
187
+ * surfaces, and stops. [DEFERRED — GA/CP-12 Wave 3+] for choice-driven
188
+ * auto-actions.
189
+ */
190
+ export interface TaskGroupHaltedPayload {
191
+ task_group_id: string;
192
+ halt_reason: string;
193
+ per_track_status: {
194
+ track_index: number;
195
+ state: string;
196
+ agent?: string;
197
+ }[];
198
+ gates_passed_failed?: unknown;
199
+ /**
200
+ * #584 r2 — internally-tagged union pinned to core-rs `HaltFixOwner`
201
+ * (`class_b_envelope.rs`, `rename_all = "snake_case"` tags +
202
+ * `rename_all_fields = "camelCase"`): wire `{kind: "track", trackIndex}` |
203
+ * `{kind: "serial_owner"}`. `normalizeTaskGroupHaltedWire` maps the field to
204
+ * the internal snake_case `track_index`.
205
+ */
206
+ recommended_fix_owner?: {
207
+ kind: string;
208
+ track_index?: number;
209
+ };
210
+ remaining_budget?: {
211
+ auto_revise_used?: number;
212
+ auto_revise_cap?: number;
213
+ wallclock_elapsed_ms?: number;
214
+ wallclock_cap_ms?: number;
215
+ };
216
+ /**
217
+ * #584 r2 — pinned to core-rs `HaltChoice` (same serde shape as
218
+ * `HaltFixOwner`): wire `{kind: "retry_serial_owner" | "retry_track" |
219
+ * "continue_manually" | "accept_partial" | "abort", trackIndex?}` — NOT a
220
+ * string list (the pre-#584 annotation was a wrong pin). Display-only.
221
+ */
222
+ choices: {
223
+ kind: string;
224
+ track_index?: number;
225
+ }[];
226
+ }
227
+ import type { AgentKind as ReviewerAgentKind, ReviewerRole } from '../reviewer/types';
228
+ /**
229
+ * CP-1.f §3.C.21 — `REVIEWER_DISPATCH` Class B payload (engine → desktop).
230
+ * Tells the desktop to spawn one reviewer subprocess for the named seat; the
231
+ * rendered prompt is FETCHED out-of-band via `getReviewerPrompt` (the dispatch
232
+ * carries no inline prompt). Pinned to `class_b_envelope.rs::ReviewerDispatchPayload`.
233
+ */
234
+ export interface ReviewerDispatchPayload {
235
+ /** Gate this dispatch belongs to (UUID string). */
236
+ gateId: string;
237
+ /**
238
+ * RESOLVED seat-id STRING (post-promotion), e.g. `"1::codex"` or bare `"1"`.
239
+ * The numeric seat for `getReviewerPrompt` is the substring before `"::"`.
240
+ */
241
+ seatId: string;
242
+ /** Lowercase agent kind (`"claude" | "gemini" | "codex"`) — chosen from the resolved plan. */
243
+ agentKind: ReviewerAgentKind;
244
+ /** snake_case reviewer lens for the seat (e.g. `"correctness"`). */
245
+ role: ReviewerRole;
246
+ /** Deterministic dispatch ULID (LOCK #C3F-6). */
247
+ dispatchUlid: string;
248
+ /** Attempt number (0-indexed) used as the ULID seed. */
249
+ attemptNumber: number;
250
+ /** Producer process-id (no-same-process self-review check, LOCK #C3F-7). */
251
+ producerProcessId: string;
252
+ /** Producer session-id (paired with `producerProcessId`). */
253
+ producerSessionId: string;
254
+ }
255
+ /** One reviewer's REVISE finding inside `ReviseFeedbackPayload.seatFindings`. */
256
+ export interface ReviseSeatFinding {
257
+ /** Resolved seat-id string (post-promotion if applicable). */
258
+ seatId: string;
259
+ /** snake_case reviewer lens. */
260
+ role: ReviewerRole;
261
+ /** Free-form findings narrative. */
262
+ findings: string;
263
+ }
264
+ /**
265
+ * CP-1.f §3.C.23 — `REVISE_FEEDBACK` Class B payload (engine → desktop). The
266
+ * desktop re-runs the implementor for round N+1 with the aggregated findings,
267
+ * then `submitImplementorOutput(nextGateId, nextRound)`. Pinned to
268
+ * `class_b_envelope.rs::ReviseFeedbackPayload`.
269
+ */
270
+ export interface ReviseFeedbackPayload {
271
+ /** The OLD (parent) gate id that produced the REVISE. */
272
+ gateId: string;
273
+ /** Per-seat REVISE findings (ordered by ascending seat_id). */
274
+ seatFindings: ReviseSeatFinding[];
275
+ /** Round number (0-indexed) the REVISE landed at. */
276
+ roundNumber: number;
277
+ /** The DETERMINISTIC round-N+1 gate id the desktop targets with `submitImplementorOutput`. */
278
+ nextGateId: string;
279
+ /** The round number of the next round (`roundNumber + 1`). */
280
+ nextRound: number;
281
+ /** DETERMINISTIC dedup key keyed `(parentGateId, nextGateId, nextRound)` — the double-spawn guard. */
282
+ reviseFeedbackId: string;
283
+ }
88
284
  export type ClassBInbound = {
89
285
  kind: 'PlannerDecisionApproved';
90
286
  signedEnvelope: SignedEnvelope;
@@ -105,6 +301,26 @@ export type ClassBInbound = {
105
301
  kind: 'PolicyRejection';
106
302
  signedEnvelope: SignedEnvelope;
107
303
  payload: unknown;
304
+ } | {
305
+ kind: 'TrackAssigned';
306
+ signedEnvelope: SignedEnvelope;
307
+ payload: unknown;
308
+ } | {
309
+ kind: 'MergeGateDispatch';
310
+ signedEnvelope: SignedEnvelope;
311
+ payload: unknown;
312
+ } | {
313
+ kind: 'TaskGroupHalted';
314
+ signedEnvelope: SignedEnvelope;
315
+ payload: unknown;
316
+ } | {
317
+ kind: 'ReviewerDispatch';
318
+ signedEnvelope: SignedEnvelope;
319
+ payload: unknown;
320
+ } | {
321
+ kind: 'ReviseFeedback';
322
+ signedEnvelope: SignedEnvelope;
323
+ payload: unknown;
108
324
  };
109
325
  export type ExecutorError = {
110
326
  kind: 'AuthorityRefusal';
@@ -170,11 +386,29 @@ export interface LocalExecutor {
170
386
  ingestHookEvent(event: HookEvent): Promise<void>;
171
387
  /** Read-only view of the current TASK_AUTHORIZED.authorityScope. */
172
388
  authorityScope(): Readonly<AuthorityScope>;
173
- /** CP-1.c STUB; CP-1.e wires real AppSync subscription + signature verification. */
174
- consumeClassB(packet: ClassBInbound): Promise<void>;
389
+ /**
390
+ * CP-1.c STUB; CP-1.e wires real AppSync subscription + signature verification.
391
+ * `envelopeTaskId` (Audited-path fix B) — the outer Class B envelope's taskId,
392
+ * forwarded so a PolicyRejection (payload carries no taskId) discards exactly
393
+ * the rejected task's shadow. Optional for non-WS callers / tests.
394
+ */
395
+ consumeClassB(packet: ClassBInbound, envelopeTaskId?: string): Promise<void>;
396
+ /**
397
+ * CP-12 W4 (#593) — team-dispatch recovery. Re-launch a track whose round-0
398
+ * `TrackAssigned` was dropped by the emit-before-subscribe race (the engine
399
+ * emits the per-track dispatch ~0.5s before the desktop's Class B subscription
400
+ * is established → live AppSync does not replay it). Exposes the private
401
+ * `launchTrack` body (register + brief bridge) and returns the explicit result
402
+ * the QuorumLoop `recoverTeamTracks` discriminates (`duplicate` returned BEFORE
403
+ * the bridge → recovery repairs the brief; `rejected` did not launch → skip).
404
+ * The single-track LE / non-team path never calls this (recovery is gated on a
405
+ * team session). Optional on the interface for non-team `LocalExecutor`
406
+ * implementations / tests.
407
+ */
408
+ recoverLaunchTrack?(payload: TrackAssignedPayload): Promise<'registered' | 'duplicate' | 'rejected'>;
175
409
  }
176
410
  export interface SpawnedProcess {
177
- child: ChildProcess;
411
+ child: ChildProcess | SubstrateProc;
178
412
  pid: number;
179
413
  role: ProcessRole;
180
414
  agentKind: AgentKind | undefined;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * §2.6 — a single conflicted path rendered to concrete 3-way CONTENT for the
3
+ * reviewer prompt. Each side is either decoded text, a per-side snippet (head+tail
4
+ * with a truncation marker), or a placeholder line (`[absent…]`/`[binary…]`/
5
+ * `[non-UTF-8…]`). Additive — absent ⇒ today's bare base→tip diff.
6
+ */
7
+ export interface RenderedConflict {
8
+ path: string;
9
+ /** Rendered content OR a placeholder. base = the merge-base side. */
10
+ base: string;
11
+ /** integration-tip side (`ours`). */
12
+ ours: string;
13
+ /** incoming-track side (`theirs`). */
14
+ theirs: string;
15
+ }
16
+ /** §2.6 — one track's intent diff (base → trackTip), already byte-bounded. */
17
+ export interface TrackIntentDiff {
18
+ trackIndex: number;
19
+ implementorAgent?: string;
20
+ /** unified base→trackTip diff (byte-bounded by `readDiffHermetic`). */
21
+ diff: string;
22
+ }
23
+ /** §2.6 — the rendered intent bundle handed to the dispatcher (additive callback fields). */
24
+ export interface RenderedTier2Bundle {
25
+ conflictBundle: readonly RenderedConflict[];
26
+ trackIntentDiffs: readonly TrackIntentDiff[];
27
+ }
28
+ /** §2.6 (locked) byte budgets. The aggregate ceiling must clear the 512 KiB diff with headroom. */
29
+ export declare const WAVE_B_TIER2_MAX_BUNDLE_BYTES: number;
30
+ export declare const WB2_BUNDLE_PER_SIDE_MAX_BYTES: number;
31
+ export declare const WB2_INTENT_DIFF_MAX_BYTES: number;
32
+ /**
33
+ * Render ONE side of a conflict (already-fetched bytes) to prompt-safe text under
34
+ * the per-side cap. NEVER emits raw bytes for a binary / non-UTF-8 / absent side —
35
+ * a placeholder line instead (Q-BINARY locked). A side over the per-side cap is
36
+ * snippet-trimmed head+tail with an explicit `[…truncated N bytes…]` marker
37
+ * (Q-OVERFLOW locked — the ONLY truncate-with-marker affordance).
38
+ *
39
+ * @param bytes the side's raw blob bytes, or `null` when the path is absent on this side.
40
+ * @param oid the side's blob OID (for the binary/non-UTF-8 placeholder), if known.
41
+ */
42
+ export declare function renderConflictSide(bytes: Buffer | null, oid: string | undefined, perSideMaxBytes?: number): string;
43
+ /**
44
+ * Render the §2.6 bundle into prompt sections, appended AFTER the base→tip diff
45
+ * block. Returns `''` when the bundle is empty/absent (graceful degrade → today's
46
+ * behavior). Pure string assembly — no overflow decision here (the dispatcher owns
47
+ * the aggregate-ceiling fail-closed check, see {@link bundleSectionsOverBudget}).
48
+ */
49
+ export declare function renderTier2BundleSections(bundle: {
50
+ conflictBundle?: readonly RenderedConflict[];
51
+ trackIntentDiffs?: readonly TrackIntentDiff[];
52
+ }): string;
53
+ /**
54
+ * The LOCK fail-closed aggregate check: TRUE iff the rendered diff + bundle sections
55
+ * exceed the aggregate ceiling. The dispatcher fails closed (NO-PROMOTE) when true —
56
+ * the per-side snippet trim keeps individual sides under the per-side cap, but the
57
+ * AGGREGATE never silently drops a whole conflict or intent diff to fit (§2.6 line 108).
58
+ */
59
+ export declare function bundleSectionsOverBudget(diff: string, bundleSections: string, maxBundleBytes?: number): boolean;
@@ -0,0 +1,290 @@
1
+ import type { PromoteManifestInput } from './durable-store';
2
+ /** Default TTL after which an orphaned shadow is GC-eligible (#GC-1). */
3
+ export declare const DEFAULT_SHADOW_TTL_MS: number;
4
+ /** `change_kind` values mirroring the pinned engine `ExecuteFirstFile` contract. */
5
+ export type ShadowChangeKind = 'created' | 'modified' | 'deleted';
6
+ /** One captured changed file in the shadow-vs-real diff (§D3). */
7
+ export interface ShadowDiffFile {
8
+ /** Path RELATIVE to the workspace root (matches the engine contract). */
9
+ path: string;
10
+ change_kind: ShadowChangeKind;
11
+ /** The captured content (created/modified) or empty for deleted. */
12
+ content: string;
13
+ }
14
+ /** Persisted promote-state marker (#PR-4). */
15
+ type ShadowPromoteState = 'pending' | 'promoted';
16
+ /** Injected for deterministic tests; production uses the real fs/git. */
17
+ export interface ShadowEnv {
18
+ /** Sleep between git-op retries. */
19
+ sleep?: (ms: number) => Promise<void>;
20
+ /** Override the per-task state dir root (default `~/.codevibe/shadow-state`). */
21
+ stateRootDir?: string;
22
+ /** Override the shadow temp-dir root (default `os.tmpdir()`). */
23
+ shadowRootDir?: string;
24
+ /** TTL for the GC reaper. */
25
+ ttlMs?: number;
26
+ /** Hook to terminate task-spawned children rooted in the shadow before teardown. */
27
+ killChildrenInShadow?: (shadowDir: string) => Promise<void>;
28
+ }
29
+ /**
30
+ * CP-14 Wave A (`team.execution=worktree_merge`) — make the shadow worktree a
31
+ * PERSISTENT track branch instead of a detached HEAD, so the merge-train can
32
+ * merge the track's committed tip. `baseSha` is the ONE group base pinned BEFORE
33
+ * the first track shadow is created (so every track roots at the same base — a
34
+ * deterministic merge-train input). Git-only: a non-git workspace is ineligible.
35
+ */
36
+ export interface TrackBranchSpec {
37
+ /** The persistent branch name, e.g. `codevibe/track/<groupId>/<trackIndex>`. */
38
+ name: string;
39
+ /** The pinned group base commit the branch is created at. */
40
+ baseSha: string;
41
+ }
42
+ /**
43
+ * The desktop's per-task shadow workspace. ONE instance per active task; the
44
+ * QuorumLoop creates it before the round-0 spawn, points the implementor cwd at
45
+ * `shadowDir`, captures the diff after the implementor exits, and the class-B
46
+ * consumer promotes (TaskAuthorized) or discards (every other terminal).
47
+ */
48
+ export declare class WorkspaceShadow {
49
+ readonly taskId: string;
50
+ /** The real workspace root (canonical). */
51
+ readonly workingDir: string;
52
+ /** The shadow dir the implementor spawns in (its cwd). */
53
+ readonly shadowDir: string;
54
+ /** True when the shadow is a `git worktree` (vs a non-git file copy). */
55
+ readonly isGit: boolean;
56
+ /**
57
+ * CP-14 Wave A — the persistent track branch this shadow worktree sits on
58
+ * (`worktree_merge` only); undefined on the legacy detached-HEAD path. When
59
+ * set, the seam commits to this branch (see {@link commitTrack}) instead of
60
+ * the in-place promote.
61
+ */
62
+ readonly trackBranch?: string;
63
+ /** Paths (RELATIVE to workingDir) materialized into the shadow — the TRACKED SET. */
64
+ private trackedSet;
65
+ /** Pre-task content hash per tracked path (null = absent at create), #PR-2. */
66
+ private preTaskHashes;
67
+ /** The per-task durable state dir (under the app-data dir), survives restarts. */
68
+ private readonly stateDir;
69
+ private readonly env;
70
+ private readonly sleep;
71
+ private constructor();
72
+ /** @internal — test introspection of the tracked set. */
73
+ get trackedSetForTests(): ReadonlySet<string>;
74
+ /**
75
+ * Create the shadow BEFORE the round-0 spawn + record the TRACKED SET.
76
+ *
77
+ * - git repo → `git worktree add` (PRIMARY: cheap, shared object store, real
78
+ * `.git` so the agent's own `npm test`/`git diff` work).
79
+ * - non-git → file-copy of `workingDir` excluding `.git`/secrets/gitignored
80
+ * + symlink the real `node_modules` (read-through, never a promote target).
81
+ *
82
+ * Fail-closed (#SR-2): a create failure throws — the caller surfaces it and
83
+ * does NOT spawn against a half-built shadow.
84
+ */
85
+ static create(taskId: string, workingDir: string, env?: ShadowEnv, opts?: {
86
+ trackBranch?: TrackBranchSpec;
87
+ }): Promise<WorkspaceShadow>;
88
+ /**
89
+ * Capture the shadow-vs-real diff AFTER `await handle.done`, bounded STRICTLY
90
+ * to the tracked set (#PM-2 / agy H2):
91
+ * - created — in shadow, NOT in the tracked baseline.
92
+ * - modified — tracked path whose shadow content differs from the baseline.
93
+ * - deleted — was in the tracked baseline AND the agent removed it from the
94
+ * shadow (NOT merely "absent from shadow", which would falsely
95
+ * flag every excluded path → catastrophic-delete).
96
+ *
97
+ * git → `git diff` (already tracked-scoped); non-git → tree-compare bounded to
98
+ * the tracked set. Across revise rounds the diff is CUMULATIVE shadow-vs-real.
99
+ */
100
+ captureDiff(): Promise<ShadowDiffFile[]>;
101
+ private captureGitDiff;
102
+ private captureCopyDiff;
103
+ /**
104
+ * CP-14 Wave A (`worktree_merge`) — commit the shadow worktree's full content
105
+ * (the dirty-replay baseline + the implementor's edits + any new untracked
106
+ * files) onto the persistent track branch, and return the committed tip SHA
107
+ * (the merge-train input). This REPLACES the legacy in-place {@link promote}
108
+ * for track shadows: the user tree is NOT touched here — the change lands only
109
+ * when the merge gate promotes the integration tip.
110
+ *
111
+ * Deterministic for recovery-replay stability: pinned bot identity + a pinned
112
+ * `@0` author/committer date + hooks/gpg disabled, so a re-run over identical
113
+ * content yields an identical SHA. `--allow-empty` so a no-op track still
114
+ * produces a real base-rooted tip (no `#EF-1`-style born-halt; the merge-train
115
+ * fast-forwards it).
116
+ *
117
+ * Requires a git track-branch shadow (created with `opts.trackBranch`); throws
118
+ * otherwise — a missing tip must FAIL CLOSED upstream, never be silently empty.
119
+ *
120
+ * REVIEW-INTEGRITY (#598-11 parity, Stage-1 HIGH): the commit is built from the
121
+ * REVIEWED, drift-checked `diff` content (the in-memory `ShadowDiffFile[]` the
122
+ * caller already validated against the reviewed snapshot) via a THROWAWAY index
123
+ * + `git hash-object`/`commit-tree` — the live worktree is NEVER re-read. This
124
+ * matches the legacy `promote(diff)`, which applies the captured `diff[].content`
125
+ * (not a re-read), so a detached writer that mutates the worktree after the
126
+ * drift-check cannot inject UNREVIEWED bytes into the track tip. The branch sits
127
+ * at the pinned base (its only commit-to-be) and the diff is "everything vs
128
+ * base", so `read-tree base` + apply-diff reconstructs exactly the reviewed tree.
129
+ */
130
+ commitTrack(diff: readonly ShadowDiffFile[], opts?: {
131
+ message?: string;
132
+ }): Promise<string>;
133
+ /**
134
+ * Materialize the changed-file SET over the TRACKED SET ONLY (#PM-1/#PM-2):
135
+ * copy the shadow's changed files onto the real tree (create/overwrite) +
136
+ * delete the real files that were in the tracked baseline AND the agent
137
+ * removed. NEVER touches a real-tree path outside the tracked set.
138
+ *
139
+ * Idempotent (#PR-4): a `promoted` marker short-circuits — a packet +
140
+ * recovery double-fire is a safe no-op.
141
+ *
142
+ * Per-file TOCTOU guard (#PR-2): before overwrite/delete, the real file's
143
+ * current hash is compared to the pre-task hash (null = absent). A mismatch
144
+ * (concurrent edit/create/delete) is ESCALATED via the returned conflicts —
145
+ * never blind-clobbered.
146
+ *
147
+ * Fail-closed (#SR-2): on any conflict OR fs error the caller surfaces
148
+ * "could not promote — N files at <paths>". Returns the conflicts/errors so
149
+ * the caller renders them; throws only on a marker-write failure.
150
+ */
151
+ promote(diff: ShadowDiffFile[], opts?: {
152
+ /**
153
+ * PHASE-589/469 W3.1 (C1) — capture a durable revert manifest for a TEAM
154
+ * track. For each in-scope, hash-matched file the promote is about to
155
+ * apply, read its PRE-IMAGE content + hash BEFORE the tree mutates and
156
+ * emit a {@link PromoteManifestInput} entry. `trackIndex` / the starting
157
+ * `promoteOrder` are caller-supplied (the group-wide monotonic order); the
158
+ * captured entries carry `promoteOrder = base + i` in capture order.
159
+ * Single-impl promotes pass no opts → byte-identical to the legacy path.
160
+ *
161
+ * `persist` (REQUIRED when `captureManifest` is set) is awaited with the
162
+ * captured entries BEFORE the FIRST file is mutated (LOCK #589-I: the
163
+ * manifest is durable before the tree changes, so a mid-promote crash
164
+ * still leaves a recoverable undo record). The entries are captured in a
165
+ * read-only PRE-PASS (no mutation), persisted, THEN applied.
166
+ */
167
+ captureManifest?: {
168
+ trackIndex: number;
169
+ promoteOrderBase: number;
170
+ persist: (entries: PromoteManifestInput[]) => Promise<void>;
171
+ };
172
+ }): Promise<{
173
+ /**
174
+ * Whether this call actually MATERIALIZED files onto the real tree. `false`
175
+ * means it was an idempotent no-op (a prior promote already landed via the
176
+ * durable `promoted` marker — a packet + recovery double-fire). The caller
177
+ * uses this to suppress duplicate `promoting`/`promoted` progress + the
178
+ * "Applied N files" milestone on a re-delivered TaskAuthorized packet.
179
+ */
180
+ materialized: boolean;
181
+ promoted: string[];
182
+ conflicts: string[];
183
+ errors: Array<{
184
+ path: string;
185
+ error: string;
186
+ }>;
187
+ /**
188
+ * PHASE-589/469 W3.1 (C1) — the captured pre-image manifest entries (only
189
+ * populated when `opts.captureManifest` was passed). The caller persists
190
+ * these via `RevertManifestStore.appendPromote` BEFORE relying on the
191
+ * applied tree (the capture itself already ran before the mutation). One
192
+ * entry per file that the promote actually applied.
193
+ */
194
+ manifestEntries: PromoteManifestInput[];
195
+ }>;
196
+ /**
197
+ * Tear down the shadow on every non-`TaskAuthorized` terminal (reject/abort,
198
+ * each Halted reason, parser-empty, session-end, crash). Leaves the real tree
199
+ * byte-identical to its pre-task state (a discard never touched it).
200
+ *
201
+ * git-worktree → `git worktree remove --force` (+ `git worktree prune`),
202
+ * NEVER raw `rm -rf` (leaks `.git/worktrees/`, #GC-2). Non-git copy → `rm -rf`
203
+ * (the symlinked `node_modules` is unlinked, never follow-delete).
204
+ *
205
+ * Before teardown, terminate task-spawned children rooted in the shadow; if
206
+ * removal still fails (stray watcher), the durable marker is left in place so
207
+ * the next-startup GC retries (#GC-2 lazy cleanup).
208
+ *
209
+ * `preserveStateDir` (the ORPHAN-teardown mode, restart-race fix 2026-06-11):
210
+ * tear down ONLY this instance's uuid-suffixed `shadowDir` and NEVER the
211
+ * per-task SHARED `stateDir`. A restart reuses the SAME taskId, so a fresh
212
+ * shadow B's durable `pending` marker lives in the same `stateDir`; tearing
213
+ * down the orphaned old instance A with a full `discard()` would `fs.rm` that
214
+ * SHARED dir and delete B's authorized-but-pending #PR-4 marker (B becomes
215
+ * unrecoverable after a crash — a sealed-LOCK violation). The orphan branch in
216
+ * QuorumLoop.discardShadow passes `{ preserveStateDir: true }` because the
217
+ * shared `stateDir` belongs to the LIVE mapped shadow B, not the orphan.
218
+ */
219
+ discard(opts?: {
220
+ preserveStateDir?: boolean;
221
+ }): Promise<void>;
222
+ /**
223
+ * Orphan-teardown shorthand (restart-race fix 2026-06-11): tear down ONLY this
224
+ * instance's `shadowDir` (worktree-aware per #GC-2) and PRESERVE the SHARED
225
+ * per-task `stateDir` — used by `QuorumLoop.discardShadow`'s instance-mismatch
226
+ * branch when a newer shadow (same taskId) has replaced this one in the map.
227
+ */
228
+ discardOrphan(): Promise<void>;
229
+ private removeGitWorktree;
230
+ private writeStateMarker;
231
+ private readStateMarker;
232
+ /**
233
+ * Read the durable promote-state marker WITHOUT mutating the tree (#PR-4). The
234
+ * QuorumLoop checks this BEFORE `captureDiff` so a re-delivered TaskAuthorized
235
+ * packet (the promote already landed) short-circuits to a silent no-op without
236
+ * a wasteful diff re-capture + without re-emitting the `promoting`/`promoted`
237
+ * progress + the "Applied N files" milestone. `null` = no marker (a fresh /
238
+ * torn-down shadow) → caller treats it as not-yet-promoted (the promote()
239
+ * idempotency guard is still the authority).
240
+ */
241
+ readPromoteState(): Promise<ShadowPromoteState | null>;
242
+ /**
243
+ * Reconstruct a `WorkspaceShadow` from a durable marker (a crash lost the
244
+ * in-memory tracked set + pre-task hashes). The tracked set is re-derived
245
+ * from the live shadow + real tree; promote then re-captures the diff. Used
246
+ * ONLY by the recovery/GC paths (`reopenShadow` / `reapOrphanShadows`).
247
+ */
248
+ static fromRecovered(recovered: RecoveredShadow, env?: ShadowEnv): Promise<WorkspaceShadow>;
249
+ }
250
+ /** A recovered shadow state (read from the durable per-task marker). */
251
+ export interface RecoveredShadow {
252
+ taskId: string;
253
+ shadowDir: string;
254
+ workingDir: string;
255
+ isGit: boolean;
256
+ promoteState: ShadowPromoteState;
257
+ createdAtMs: number;
258
+ /** The durable state dir for this task (for cleanup). */
259
+ stateDir: string;
260
+ }
261
+ /**
262
+ * Read every durable per-task shadow marker under the state root. The reconnect/
263
+ * startup recovery (#PR-4) reads these to find an authorized-but-pending shadow
264
+ * to promote; the GC reaper (#GC-1) reads them to delete orphaned shadows.
265
+ */
266
+ export declare function listRecoverableShadows(env?: ShadowEnv): Promise<RecoveredShadow[]>;
267
+ /**
268
+ * Reconstruct a `WorkspaceShadow` from a durable marker so the recovery path
269
+ * can re-run promote/discard against an already-created shadow. The tracked set
270
+ * + pre-task hashes are re-derived from the live shadow vs the real tree (a
271
+ * crash lost the in-memory state). For a git worktree this is `git status`; for
272
+ * a copy shadow it is a tree-compare. The promote then re-captures the diff.
273
+ */
274
+ export declare function reopenShadow(recovered: RecoveredShadow, env?: ShadowEnv): Promise<WorkspaceShadow | null>;
275
+ /**
276
+ * GC orphaned shadows (#GC-1): on session-start/WS-resync, discard any shadow
277
+ * whose task is NOT in `activeTaskIds` AND whose promote-state is NOT `promoted`
278
+ * pending an authorized-but-not-yet-promoted recovery, PLUS a TTL on shadow age.
279
+ * NEVER deletes an authorized-but-pending shadow (that is the recovery path's job).
280
+ *
281
+ * `keepTaskIds` are the tasks the desktop still considers active/recoverable
282
+ * (the caller passes the active task id + any authorized-but-pending tasks it
283
+ * intends to recover). A `promoted` shadow whose code already landed is GC'd
284
+ * (its real tree is done) regardless of TTL.
285
+ */
286
+ export declare function reapOrphanShadows(keepTaskIds: ReadonlySet<string>, env?: ShadowEnv): Promise<{
287
+ reaped: string[];
288
+ retained: string[];
289
+ }>;
290
+ export {};