@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
@@ -0,0 +1,245 @@
1
+ import type { OrchestrationStore } from './store';
2
+ import type { ConversationEntry, PostDecisionAction } from './types';
3
+ /**
4
+ * Minimal SDK contract for the `applyUserDecision` wire. Structurally
5
+ * compatible with the full `AppSyncClient.applyUserDecision` signature — keeps
6
+ * the orchestration shell decoupled from the heavier AppSync surface (tests can
7
+ * inject a stub). Mirrors `ApplyUserDecisionClient` in `<OrchestrationApp>`.
8
+ */
9
+ export interface ApplyUserDecisionClient {
10
+ applyUserDecision(input: {
11
+ gateId: string;
12
+ taskId: string;
13
+ sessionId: string;
14
+ currentRound: number;
15
+ decision: string;
16
+ notes?: string;
17
+ }, sessionKeyBase64?: string): Promise<{
18
+ decision: string;
19
+ postAction: PostDecisionAction;
20
+ }>;
21
+ }
22
+ /** Dependencies common to both the TTY + non-TTY gate-resolution paths. */
23
+ export interface GateDecisionSubmitDeps {
24
+ store: OrchestrationStore;
25
+ /** The desktop AppSync transport (or a stub in tests). */
26
+ appsyncClient: ApplyUserDecisionClient;
27
+ /** Just-in-time session-key resolver (only consulted when notes are present). */
28
+ getSessionKey: (sessionId: string) => Promise<string | null>;
29
+ /**
30
+ * Optional — notified after a successful `applyUserDecision` with the engine's
31
+ * `postAction` (the QuorumLoop wires it to discard the shadow on a
32
+ * non-authorize terminal AND flip the resolved track's team render-terminal).
33
+ * ABSENT → no-op.
34
+ *
35
+ * #607 RESIDUAL #2 — the FIRST arg is the `taskId` of the GATE being resolved
36
+ * (`entry.envelope.taskId`), NOT the loop's global `activeTask`. For a
37
+ * multi-track team the resolved gate is NOT necessarily the loop's active
38
+ * task, so `reportTeamTrackUserResolved` MUST key on the resolved gate's
39
+ * taskId or it flips the WRONG track / no-ops (the user-Approved track stays
40
+ * `InFlight`). The shell closure threads this through to the loop.
41
+ *
42
+ * `expectedShadow` is the shadow INSTANCE captured at decision time (see
43
+ * `captureShadow`) so the discard is instance-pinned: a RESTART reuses the same
44
+ * taskId and the engine emits a fresh round-0 GATE_DISPATCH that can replace the
45
+ * task's mapped shadow before this fires. Pinning to the captured instance stops
46
+ * the discard from destroying the restart's NEW shadow (live dogfood race
47
+ * 2026-06-11, option-4 "Reject and restart"). `undefined` when no shadow was
48
+ * mapped at decision time (or no loop is wired).
49
+ */
50
+ onTerminalDecision?: (taskId: string, postAction: PostDecisionAction, expectedShadow?: unknown) => void;
51
+ /**
52
+ * Optional — resolves the live shadow INSTANCE for a task at decision time. Read
53
+ * ONCE at the TOP of `submitGateDecision` (BEFORE the `applyUserDecision` SDK
54
+ * await) so the captured instance is the OLD (rejected) shadow, not whatever a
55
+ * racing restart dispatch may have swapped into the map by the time
56
+ * `onTerminalDecision` fires. The QuorumLoop binds this to `shadowForTask`.
57
+ * Returns an opaque handle threaded straight back into `onTerminalDecision`.
58
+ */
59
+ captureShadow?: (taskId: string) => unknown;
60
+ /**
61
+ * PHASE-589/469 W3.2 — the two-phase group-escalation decision deps. Present
62
+ * ONLY for a TEAM session (built in `cli.ts` alongside the team LE). When a
63
+ * resolved gate-prompt entry carries the `groupEscalation` marker (a desktop-
64
+ * synthesized team halt prompt, NOT an engine per-track gate),
65
+ * `routeGatePromptInput` routes its resolution through `submitGroupDecision`
66
+ * (CLAIM→revert→COMMIT) using these deps instead of the per-track
67
+ * `applyUserDecision`. ABSENT (single-impl / tests) → a group prompt can never
68
+ * appear, so this is never consulted.
69
+ */
70
+ groupDecision?: GroupDecisionSubmitDeps;
71
+ }
72
+ /** The active unfinalized gate-prompt conversation entry. */
73
+ type GatePromptEntry = Extract<ConversationEntry, {
74
+ kind: 'gate-prompt';
75
+ }>;
76
+ /**
77
+ * §5.1 + #C8M-11 active-gate-prompt scan. Tail-to-head walk for the first
78
+ * `kind:'gate-prompt'` entry with `final === false`. Pure; safe to call from a
79
+ * render path. Returns the entry verbatim so callers can pattern-match the
80
+ * discriminated union directly. (Shared so the TTY component + non-TTY loop use
81
+ * the identical scan.)
82
+ */
83
+ export declare function findActiveGatePromptEntry(conversation: ReadonlyArray<ConversationEntry>): GatePromptEntry | null;
84
+ /**
85
+ * Submit a gate decision: dispatch SUBMIT_STARTED, fire the SDK, dispatch
86
+ * RESOLVED on success (and notify `onTerminalDecision`) or SUBMIT_FAILED on
87
+ * error. Verbatim port of the `<OrchestrationApp>` `submitDecision` useCallback
88
+ * so both surfaces share one implementation. NEVER throws (every failure becomes
89
+ * a SUBMIT_FAILED — or, for a terminal already-resolved error, a
90
+ * GATE_PROMPT_RESOLVED_EXTERNALLY — dispatch).
91
+ */
92
+ export declare function submitGateDecision(deps: GateDecisionSubmitDeps, promptEntryId: string, payload: {
93
+ gateId: string;
94
+ taskId: string;
95
+ sessionId: string;
96
+ currentRound: number;
97
+ decision: string;
98
+ notes?: string;
99
+ }): Promise<void>;
100
+ /** The closed 5-option group-escalation decision labels (mirror gate-prompts). */
101
+ export type GroupDecisionLabel = 'ACCEPT' | 'ACCEPT_WITH_NOTES' | 'REJECT_WITH_NOTES' | 'REJECT_RESTART' | 'ABORT_TASK';
102
+ /** Minimal SDK contract for the two-phase `claimGroupDecision` wire. */
103
+ export interface ClaimGroupDecisionClient {
104
+ claimGroupDecision(input: {
105
+ taskGroupId: string;
106
+ sessionId: string;
107
+ phase: 'claim' | 'commit';
108
+ decision: GroupDecisionLabel;
109
+ verdictIdempotencyKey: string;
110
+ claimToken?: string;
111
+ notes?: string;
112
+ }, sessionKeyBase64?: string): Promise<{
113
+ phase: 'claimed' | 'committed' | 'already_claimed' | 'already_committed';
114
+ decision: string;
115
+ claimToken: string;
116
+ groupStatus?: string;
117
+ }>;
118
+ }
119
+ /** The result the desktop surfaces after a group decision completes. */
120
+ export interface GroupDecisionResult {
121
+ /** The terminal phase the engine recorded. */
122
+ phase: 'committed' | 'already_committed';
123
+ decision: GroupDecisionLabel;
124
+ /** Reject-family only — the revert outcome (clean-where-safe + surface). */
125
+ revert?: {
126
+ reverted: string[];
127
+ alreadyReverted: string[];
128
+ conflicts: string[];
129
+ };
130
+ }
131
+ /** Dependencies for the two-phase group-escalation decision. */
132
+ export interface GroupDecisionSubmitDeps {
133
+ store: OrchestrationStore;
134
+ /** The two-phase group-decision transport (or a stub in tests). */
135
+ claimClient: ClaimGroupDecisionClient;
136
+ /** Session-key resolver (consulted only when notes are present). */
137
+ getSessionKey: (sessionId: string) => Promise<string | null>;
138
+ /**
139
+ * The reject-family workspace side-effect — revert the group's applied tracks
140
+ * (clean-where-safe + surface). The CLAIM→revert→COMMIT ordering pins the
141
+ * revert BETWEEN the CLAIM lock and the terminal COMMIT (LOCK #589-J): no
142
+ * terminal decision is recorded before the side-effect finishes. ABSENT (tests
143
+ * / accept-only) → no workspace effect.
144
+ */
145
+ revertGroup?: (taskGroupId: string) => Promise<{
146
+ reverted: string[];
147
+ alreadyReverted: string[];
148
+ conflicts: string[];
149
+ }>;
150
+ /**
151
+ * Mark the group's durable manifest ACCEPTED (the GC predicate flips). Called
152
+ * after an accept-family COMMIT. ABSENT → no-op (tests).
153
+ */
154
+ markAccepted?: (taskGroupId: string) => Promise<void>;
155
+ /**
156
+ * HIGH-1 / LOCK #589-J — persist the CLAIMED-but-not-COMMITted decision to the
157
+ * durable record, called IMMEDIATELY after the CLAIM phase mints `claimToken`
158
+ * and BEFORE the revert side-effect runs. This is the durable marker a startup
159
+ * reconcile uses to resume the revert + drive the COMMIT after a CLAIM-crash
160
+ * (the in-memory token is lost on crash; the persisted one is the recovery
161
+ * path). ABSENT → not persisted (tests that don't exercise crash recovery).
162
+ */
163
+ persistPendingDecision?: (taskGroupId: string, pending: {
164
+ decision: GroupDecisionLabel;
165
+ claimToken: string;
166
+ notes?: string;
167
+ }) => Promise<void>;
168
+ /**
169
+ * HIGH-1 — clear the persisted pending decision after the terminal COMMIT lands
170
+ * (so a later reconcile never re-drives it). ABSENT → no-op (tests).
171
+ */
172
+ clearPendingDecision?: (taskGroupId: string) => Promise<void>;
173
+ /**
174
+ * Drive the per-track render flip through the SAME `emitGroupConvergence`
175
+ * chokepoint (D2): accept-family → tracks stay/flip `Passed`; reject-family →
176
+ * tracks flip `Failed`/reverted + the group resolves. ABSENT → render-less
177
+ * (tests). This is what closes the "track stays InFlight after abort_task" gap.
178
+ */
179
+ driveGroupConvergence?: (taskGroupId: string, outcome: string) => Promise<void>;
180
+ /**
181
+ * REJECT_RESTART only — the desktop re-issues the WHOLE team from its OWN
182
+ * retained ORIGINAL `/team` launch spec (work-items + briefs; the engine retains
183
+ * nothing, §5 RISK 1 / RESIDUAL 1). The active orchestration `store` is passed in
184
+ * (this dep's heavy half is built in `cli.ts` BEFORE `runOrchestrationShell`
185
+ * creates the store, so the store is threaded at call time from THIS deps'
186
+ * `store`). ABSENT → the restart degrades to a plain terminal-reject (the user
187
+ * re-runs `/team`). A THROW surfaces the "re-run /team" advisory.
188
+ */
189
+ reissueTeam?: (taskGroupId: string, store: OrchestrationStore) => Promise<void>;
190
+ }
191
+ /**
192
+ * PHASE-589/469 W3.2 — resolve the group 5-option escalation via the two-phase
193
+ * CLAIM → (desktop side-effect) → COMMIT (LOCK #589-J). The desktop OWNS the
194
+ * workspace regardless of which surface initiated, so it runs the revert here.
195
+ *
196
+ * Ordering (closes the cross-surface race): (1) CLAIM atomically locks the gate;
197
+ * (2) for a reject-family decision RUN THE REVERT to completion-or-conflict-stop;
198
+ * (3) COMMIT (terminal). A competing mobile Accept mid-revert is rejected by the
199
+ * CLAIM lock. NEVER throws — every failure surfaces a `SHELL_ADVISORY` and
200
+ * returns; the in-flight group's manifest survives for startup reconcile.
201
+ */
202
+ export declare function submitGroupDecision(deps: GroupDecisionSubmitDeps, args: {
203
+ taskGroupId: string;
204
+ sessionId: string;
205
+ decision: GroupDecisionLabel;
206
+ notes?: string;
207
+ }): Promise<GroupDecisionResult | null>;
208
+ /**
209
+ * Outcome of routing a typed line against an active gate prompt. `handled`
210
+ * distinguishes "the line was consumed by gate resolution" (a digit / notes /
211
+ * the cancel sentinel) from "the line is not for this gate" (so the caller falls
212
+ * back to its normal text path — planner / slash). When `handled` is true the
213
+ * submit (if any) has already been kicked off via `submitGateDecision` and the
214
+ * returned promise resolves when it settles.
215
+ */
216
+ export interface GateInputRouteResult {
217
+ handled: boolean;
218
+ }
219
+ /**
220
+ * Route a typed line against the active gate-prompt entry's phase, mirroring the
221
+ * TTY `<OrchestrationApp>` `handleInputBarSubmit` gate branch EXACTLY:
222
+ *
223
+ * • awaiting-number: a valid EXACT single digit 1..N → either transition to
224
+ * notes-entry (`_WITH_NOTES`) or submit immediately. A digit-SHAPED but
225
+ * invalid input (a partial numeric parse like `"1abc"` / `"01"` /
226
+ * `"1 approve"`, OR an out-of-range single digit like `"6"`) is CONSUMED
227
+ * (`handled:true`) WITHOUT submitting — a `SHELL_ADVISORY` hint is dispatched
228
+ * and the prompt stays active, so a `parseInt`-style partial parse can NEVER
229
+ * silently resolve a destructive option (the v1-options rule: never
230
+ * accept/destroy work on a typo). NON-numeric free text (no leading digit) is
231
+ * reported `handled:false` so it falls through to the planner — matching the
232
+ * TTY where `<InputBar>` only intercepts digit input and lets free text chat.
233
+ * NOTE: the TTY InputBar pre-validates with the identical `/^[0-9]$/` exact-
234
+ * single-digit rule (`components/InputBar.tsx:102`); for the non-TTY loop THIS
235
+ * router is the PRIMARY validation (`non-tty-fallback.ts:169`).
236
+ * • awaiting-notes: the `/cancel` sentinel → NOTES_CANCELLED; otherwise the
237
+ * text is the notes plaintext → submit with notes.
238
+ * • submitting: input is disabled — consumed (handled) but a no-op.
239
+ *
240
+ * Returns `{ handled:false }` when there is no active gate (the caller routes the
241
+ * line to its normal text path). Awaits the submit so a non-TTY caller's
242
+ * sequential loop blocks until the decision settles.
243
+ */
244
+ export declare function routeGatePromptInput(deps: GateDecisionSubmitDeps, activeEntry: GatePromptEntry | null, text: string): Promise<GateInputRouteResult>;
245
+ export {};
@@ -13,6 +13,16 @@ export declare const ORCHESTRATION_ESCALATED_GATE_PROMPT_KIND: "orchestration_es
13
13
  * `appsync_emit.rs:297`.
14
14
  */
15
15
  export declare const ORCHESTRATION_FINAL_APPROVAL_PROMPT_KIND: "orchestration_final_approval";
16
+ /**
17
+ * `metadata.prompt_kind` value for the 4-option continuation-handoff gate
18
+ * prompt (3 target agents + CANCEL). Mirrors the Rust emitter const
19
+ * `METADATA_PROMPT_KIND_CONTINUATION_HANDOFF = "continuation_offer_handoff"`
20
+ * (`appsync_emit.rs`, P1). PHASE-CP-10-MIN (#585) LOCK #C10M-1/2.
21
+ *
22
+ * Cross-impl literal parity is a load-bearing invariant — see Test 23
23
+ * (`hostile-grep.test.ts`).
24
+ */
25
+ export declare const CONTINUATION_OFFER_HANDOFF_PROMPT_KIND: "continuation_offer_handoff";
16
26
  /**
17
27
  * Source-of-truth string literals for the hostile-grep cross-impl parity
18
28
  * test (`__tests__/hostile-grep.test.ts`, Test 23). Mirrors the Rust
@@ -42,13 +52,15 @@ export declare const SOURCE_OF_TRUTH_LITERALS: {
42
52
  readonly finalApprovalPromptKind: "orchestration_final_approval";
43
53
  readonly escalationOptionIds: readonly ["ACCEPT", "ACCEPT_WITH_NOTES", "REJECT_WITH_NOTES", "REJECT_RESTART", "ABORT_TASK"];
44
54
  readonly finalApprovalOptionIds: readonly ["APPROVE", "CANCEL"];
55
+ readonly continuationHandoffPromptKind: "continuation_offer_handoff";
56
+ readonly continuationHandoffOptionIds: readonly ["CONTINUE_WITH", "CANCEL"];
45
57
  };
46
58
  /**
47
59
  * Discriminated union over the two prompt kinds CP-8 min routes through
48
60
  * the gate-prompt path. Anything outside this union flows to the
49
61
  * existing `subagent-event` / `mobile-event-replay` path per #C8M-3.
50
62
  */
51
- export type GatePromptKind = typeof ORCHESTRATION_ESCALATED_GATE_PROMPT_KIND | typeof ORCHESTRATION_FINAL_APPROVAL_PROMPT_KIND;
63
+ export type GatePromptKind = typeof ORCHESTRATION_ESCALATED_GATE_PROMPT_KIND | typeof ORCHESTRATION_FINAL_APPROVAL_PROMPT_KIND | typeof CONTINUATION_OFFER_HANDOFF_PROMPT_KIND;
52
64
  /**
53
65
  * One option entry on the wire — matches the Rust struct projected by
54
66
  * `build_escalation_options()` / `build_final_approval_options()`.
@@ -57,6 +69,17 @@ export interface GatePromptOption {
57
69
  readonly id: string;
58
70
  readonly label: string;
59
71
  readonly description: string;
72
+ /**
73
+ * PHASE-CP-10-MIN (#585) — the per-option target agent for the
74
+ * `continuation_offer_handoff` prompt (CLAUDE/CODEX/GEMINI/ANTIGRAVITY).
75
+ * On the wire the 3-4 agent options all carry `id: "CONTINUE_WITH"` (a valid
76
+ * `UserDecisionKind`); the agent rides this NEW per-option `targetAgent`
77
+ * field (Rust `OptionPayload.target_agent` with
78
+ * `#[serde(rename="targetAgent", skip_serializing_if="Option::is_none")]`,
79
+ * P2/M-A/M3). Absent on every pre-CP-10 array (escalation / final-approval)
80
+ * because the Rust field is skipped when `None`. LOCK #C10M-1.
81
+ */
82
+ readonly targetAgent?: string;
60
83
  }
61
84
  /**
62
85
  * Locked design §4 #C8M-9. The plaintext-parsed envelope the
@@ -67,7 +90,7 @@ export interface GatePromptOption {
67
90
  * Field provenance (Rust `appsync_emit.rs::build_metadata_json` lines
68
91
  * 1459-1493):
69
92
  * - `promptKind` from `metadata.prompt_kind`
70
- * - `taskId` / `gateId` from `metadata.payload.outcome.{taskId,gateId}`
93
+ * - `taskId` / `gateId` from `metadata.payload.{taskId,gateId}` (ROOT, #572)
71
94
  * - `currentRound` from `metadata.payload.outcome.round`
72
95
  * - `options` from `metadata.payload.options` (5 or 2 entries)
73
96
  * - `reason` from `metadata.payload.outcome.reason` (Path B only)
@@ -83,7 +106,80 @@ export interface GatePromptEnvelope {
83
106
  readonly reason?: string;
84
107
  readonly summary?: string;
85
108
  readonly receivedAt: string;
109
+ /** Plaintext 3-entry timeline strip (gate_opened → verdicts_collected → gate_resolved). */
110
+ readonly timeline?: ReadonlyArray<GateTimelineEntry>;
111
+ /** Plaintext per-round cascade rows; #574 emits a single entry today (renders no cascade). */
112
+ readonly roundHistory?: ReadonlyArray<GateRoundHistoryEntry>;
113
+ /** Decrypted reviewer-disagreement panel (or an unavailable marker); set by the dispatcher. */
114
+ readonly verdictDetails?: GateVerdictDetails;
115
+ /** The continuation offer's desktop-minted ULID (`metadata.offerId`). */
116
+ readonly offerId?: string;
117
+ /** The agent that halted (closed enum CLAUDE/CODEX/GEMINI/ANTIGRAVITY; `metadata.sourceAgent`). */
118
+ readonly sourceAgent?: string;
119
+ /** The authoritative 64-hex SHA-256 packet hash (`metadata.packetHash`). */
120
+ readonly packetHash?: string;
121
+ readonly groupEscalation?: {
122
+ readonly taskGroupId: string;
123
+ };
124
+ }
125
+ /**
126
+ * One `metadata.timeline` entry [SRC `appsync_emit.rs:1623-1625`]:
127
+ * `{ at: <rfc3339>, kind: "gate_opened"|"verdicts_collected"|"gate_resolved" }`.
128
+ * `kind` is kept as the raw string (forward-compatible; unknown kinds
129
+ * still render their timestamp).
130
+ */
131
+ export interface GateTimelineEntry {
132
+ readonly at: string;
133
+ readonly kind: string;
86
134
  }
135
+ /**
136
+ * One `metadata.roundHistory` entry [SRC `appsync_emit.rs` ENG.5 emit]:
137
+ * `{ round: <int>, kind: <str>, reason: <str> }`. Plaintext closed-enum
138
+ * strings. The cascade renders ONLY when `roundHistory.length > 1`.
139
+ */
140
+ export interface GateRoundHistoryEntry {
141
+ readonly round: number;
142
+ readonly kind: string;
143
+ readonly reason: string;
144
+ }
145
+ /**
146
+ * One decrypted reviewer seat (per shared-contract §2 / `verdict_details.rs`
147
+ * `build_panel`): `{ seatId, role, reviewerAgent, decision, findings,
148
+ * findingsTruncated, truncatedFindingCount }`. `decision` is the 4-value
149
+ * UPPERCASE `VerdictKind`; map via `decisionCopy` (unknown → raw string).
150
+ */
151
+ export interface GateReviewerSeat {
152
+ readonly seatId: number;
153
+ readonly role: string;
154
+ readonly reviewerAgent: string;
155
+ readonly decision: string;
156
+ readonly findings: ReadonlyArray<string>;
157
+ readonly findingsTruncated: boolean;
158
+ readonly truncatedFindingCount: number;
159
+ }
160
+ /**
161
+ * The decrypted reviewer-disagreement panel attached to the envelope by the
162
+ * dispatcher. Either `available` (the decrypted `{ reviewers, ... }` object)
163
+ * OR `unavailable` (fail-closed: decrypt error, size cap, or encryption
164
+ * error). NEVER carries ciphertext.
165
+ */
166
+ export type GateVerdictDetails = {
167
+ readonly status: 'available';
168
+ readonly reviewers: ReadonlyArray<GateReviewerSeat>;
169
+ /** Root marker (#574 size-degrade): findings dropped → "audit browser" hint. */
170
+ readonly findingsOmittedForSize: boolean;
171
+ } | {
172
+ readonly status: 'unavailable';
173
+ /**
174
+ * Why the panel can't be shown:
175
+ * - 'size' → `verdictDetailsUnavailable: "size"` (adds the audit-browser hint)
176
+ * - 'encryption_error' → `verdictDetailsUnavailable: "encryption_error"`
177
+ * - 'unavailable_other' → ANY other present non-empty `verdictDetailsUnavailable`
178
+ * marker (unknown / future; neutral line only, no hint)
179
+ * - 'decrypt_failed' → client-side decrypt/parse failure (fail-closed)
180
+ */
181
+ readonly reason: 'size' | 'encryption_error' | 'unavailable_other' | 'decrypt_failed';
182
+ };
87
183
  /**
88
184
  * Defensive validator (per #C8M-1 + #C8M-2). Returns `null` on ANY of:
89
185
  * - event is not an INTERACTIVE_PROMPT
@@ -93,12 +189,50 @@ export interface GatePromptEnvelope {
93
189
  * (5 for escalation, 2 for final-approval)
94
190
  * - any entry missing `id` / `label` / `description` or with non-string
95
191
  * `id`
96
- * - `outcome.{taskId,gateId,round}` missing or wrong type
192
+ * - `payload.{taskId,gateId}` (ROOT) or `payload.outcome.round` missing
193
+ * or wrong type
194
+ *
195
+ * Wire-shape note (#572): `taskId`/`gateId`/`sessionId` live at the
196
+ * `payload` ROOT; `outcome` carries only `{kind, reason, round}` — per the
197
+ * authoritative engine emit (`codevibe-orchestration-lambda/src/appsync_emit.rs:1514-1523`).
198
+ * The mobile V1 bridge already reads them at root; this extractor matches.
97
199
  *
98
200
  * The caller (dispatcher in `index.ts`) is responsible for emitting the
99
201
  * `kind: 'advisory'` ConversationEntry on null-return per #C8M-1.
100
202
  */
101
203
  export declare function extractGatePromptEnvelope(event: Event): GatePromptEnvelope | null;
204
+ /**
205
+ * The canonical 5-option group-decision escalation set, position-bound to the
206
+ * `submitGroupDecision` / `claimGroupDecision` `GroupDecisionLabel` union AND
207
+ * verbatim with the engine's `escalationOptionIds` (so the rendered numbered
208
+ * list, the `_with_notes` notes-phase trigger, and the `mapTypedNumberToDecisionKind`
209
+ * uppercasing all behave EXACTLY like a per-track engine escalation). The labels
210
+ * + descriptions are desktop-authored (the group halt rides Class B, not the
211
+ * engine INTERACTIVE_PROMPT path, so there is no server-supplied copy) but the
212
+ * IDS are the load-bearing contract — they map 1:1 onto the two-phase submit.
213
+ */
214
+ export declare const GROUP_ESCALATION_OPTIONS: ReadonlyArray<GatePromptOption>;
215
+ /**
216
+ * PHASE-589/469 W3.2 — synthesize the desktop-side 5-option group escalation
217
+ * `GatePromptEnvelope` from a team `task_group_halted` payload. This is the
218
+ * ONLY envelope NOT extracted from an engine INTERACTIVE_PROMPT: it carries the
219
+ * `groupEscalation` marker so `routeGatePromptInput` routes resolution through
220
+ * the two-phase `submitGroupDecision` instead of the per-track `applyUserDecision`.
221
+ *
222
+ * `taskId`/`gateId` are synthetic sentinels derived from the group id (the group
223
+ * has no per-track gate). `gateId` MUST be STABLE per group so the reducer's
224
+ * gateId-keyed dedup collapses a duplicate halt packet onto the same prompt
225
+ * entry (a re-emitted halt must not stack two prompts). `currentRound` is 0
226
+ * (the group decision is round-agnostic).
227
+ *
228
+ * `haltReason` (a content-free engine reason label) becomes the `reason` the
229
+ * renderer surfaces via `formatHaltReason`; never any file content (#589-G).
230
+ */
231
+ export declare function buildGroupEscalationEnvelope(input: {
232
+ taskGroupId: string;
233
+ haltReason?: string;
234
+ receivedAt?: string;
235
+ }): GatePromptEnvelope;
102
236
  /**
103
237
  * Per #C8M-1: typed_number N (1-based) → `lowercase(envelope.options[N-1].id)`.
104
238
  * Result is the `decision` value the caller passes to
@@ -116,8 +250,232 @@ export declare function extractGatePromptEnvelope(event: Event): GatePromptEnvel
116
250
  * The caller MUST treat `null` as a typo / out-of-range and reject the
117
251
  * submit — silent fallback to a default kind would destroy or accept
118
252
  * the user's work without consent (matches the v1-options rule).
253
+ *
254
+ * PHASE-CP-10-MIN (#585) — for a `CONTINUE_WITH` option the resolved `kind`
255
+ * is `"continue_with"` and the result ALSO carries `targetAgent` (the
256
+ * per-option agent), so the submit handler can encrypt it as `notes`. The
257
+ * continuation accept is typed-digit-only — NO `_with_notes` editor phase
258
+ * (the agent name IS the payload), so `needsNotes` stays false (#C10M-5).
119
259
  */
120
260
  export declare function mapTypedNumberToDecisionKind(envelope: GatePromptEnvelope, n: number): {
121
261
  kind: string;
122
262
  needsNotes: boolean;
263
+ targetAgent?: string;
123
264
  } | null;
265
+ /**
266
+ * `haltReasonCopy` — `payload.outcome.reason` → `{ label, explanation }`.
267
+ * Shared-contract §3. Unknown reason → render the RAW snake_case string as
268
+ * the label with NO explanation (see `formatHaltReason` below).
269
+ */
270
+ export declare const haltReasonCopy: Readonly<Record<string, {
271
+ readonly label: string;
272
+ readonly explanation: string;
273
+ }>>;
274
+ /**
275
+ * `decisionCopy` — `VerdictKind` (UPPERCASE) → display label.
276
+ * Shared-contract §4. Unknown → raw string (see `formatDecision`).
277
+ */
278
+ export declare const decisionCopy: Readonly<Record<string, string>>;
279
+ /**
280
+ * Halt-reason → `{ label, explanation }` via `haltReasonCopy`. Unknown
281
+ * reason → `{ label: <raw>, explanation: null }` (never blank). Absent
282
+ * reason → `null`.
283
+ */
284
+ export declare function formatHaltReason(reason: string | undefined): {
285
+ label: string;
286
+ explanation: string | null;
287
+ } | null;
288
+ /** Decision → display label via `decisionCopy`. Unknown → raw string. */
289
+ export declare function formatDecision(decision: string): string;
290
+ /**
291
+ * The minimal decrypt primitive `decryptVerdictDetails` needs. Structurally
292
+ * compatible with `cryptoService.decryptMetadata(encryptedB64, sessionKeyB64)`
293
+ * — injected so the orchestration is unit-testable with a mock (NO live
294
+ * crypto in tests).
295
+ */
296
+ export type DecryptMetadataFn = (encryptedB64: string, sessionKeyBase64: string) => Record<string, unknown>;
297
+ /**
298
+ * Parse an ALREADY-DECRYPTED verdictDetails OBJECT (shared-contract §2 shape)
299
+ * into the structured `GateVerdictDetails`. PURE — no crypto, no I/O — so the
300
+ * parity test exercises it directly with the fixture's decrypted plaintext.
301
+ *
302
+ * Contract (shared-contract §2):
303
+ * - The decrypted payload MUST be a JSON OBJECT `{ reviewers: [...] }`
304
+ * (NOT a top-level array — iOS throws on an array; we treat a non-object
305
+ * or a missing/invalid `reviewers` as a decrypt failure → fail-closed).
306
+ * - Each reviewer: `{ seatId, role, reviewerAgent, decision, findings,
307
+ * findingsTruncated, truncatedFindingCount }`. A seat MISSING any required
308
+ * typed field (finite-integer `seatId`, non-empty string `role`, string
309
+ * `reviewerAgent`, string `decision`) is DROPPED — fail closed, never a
310
+ * synthesized `-1`/`''` junk row (parity with iOS/Android). `decision`
311
+ * keeps its raw string (mapped at render time via `decisionCopy`).
312
+ * - Root `findingsOmittedForSize: true` → panel rows present, findings
313
+ * dropped → audit-browser hint at panel level.
314
+ *
315
+ * Returns the `available` panel on success, or `{ status:'unavailable',
316
+ * reason:'decrypt_failed' }` when the object is structurally unusable OR when
317
+ * no usable reviewer rows remain (empty array OR all seats malformed) — the
318
+ * renderer shows the neutral unavailable line, never an empty "available" panel.
319
+ */
320
+ export declare function parseDecryptedVerdictDetails(decrypted: unknown): GateVerdictDetails;
321
+ /**
322
+ * FIELD-LEVEL decrypt orchestration (shared-contract §2 / B.4) for the
323
+ * nested `metadata.verdictDetails = { encrypted: <b64> }` blob. The
324
+ * `{encrypted:…}` wrapper is NOT auto-unwrapped (that only happens for
325
+ * TOP-LEVEL event metadata), so this explicitly:
326
+ * (1) reads `.encrypted` off `metadata.verdictDetails`;
327
+ * (2) decrypts it with the session key via the injected
328
+ * `decryptMetadata` primitive (the SAME AES-256-GCM inline-nonce
329
+ * envelope image/metadata decryption uses — `cryptoService.decryptMetadata`);
330
+ * (3) parses the result as an OBJECT and reads `reviewers`
331
+ * (via `parseDecryptedVerdictDetails`).
332
+ *
333
+ * Returns:
334
+ * - `undefined` when there is NO encrypted blob to decrypt (absent
335
+ * `verdictDetails`, or it isn't an `{encrypted:string}` wrapper) AND no
336
+ * plaintext `verdictDetailsUnavailable` marker is in play — the caller
337
+ * leaves the envelope's `verdictDetails` as whatever the extractor set
338
+ * (which may itself be an `unavailable` marker from the plaintext sibling).
339
+ * - `{ status:'available', ... }` on a successful decrypt+parse.
340
+ * - `{ status:'unavailable', reason:'decrypt_failed' }` when the decrypt
341
+ * throws OR the decrypted payload is structurally unusable. NEVER
342
+ * ciphertext, NEVER throws.
343
+ */
344
+ export declare function decryptVerdictDetails(metadata: Record<string, unknown>, sessionKeyBase64: string, decryptMetadata: DecryptMetadataFn): GateVerdictDetails | undefined;
345
+ /**
346
+ * `true` iff `metadata.verdictDetails` carries an `{ encrypted: <string> }`
347
+ * blob the dispatcher should attempt to decrypt. Lets the dispatcher skip
348
+ * the session-key resolve entirely for gate events with no encrypted panel.
349
+ */
350
+ export declare function hasEncryptedVerdictDetails(metadata: Record<string, unknown>): boolean;
351
+ /** A timeline row the panel renders: kind label + the raw `at` timestamp. */
352
+ export interface GatePanelTimelineRow {
353
+ readonly kind: string;
354
+ readonly at: string;
355
+ }
356
+ /** A reviewer row the panel renders: pre-formatted header + findings. */
357
+ export interface GatePanelReviewerRow {
358
+ readonly seatId: number;
359
+ readonly role: string;
360
+ readonly reviewerAgent: string;
361
+ /** "Reviewer {seatId} ({role}, {reviewerAgent}): {decisionCopy}". */
362
+ readonly header: string;
363
+ readonly findings: ReadonlyArray<string>;
364
+ /** Per-seat "(N more — full review in the audit browser)" hint, or null. */
365
+ readonly truncationHint: string | null;
366
+ }
367
+ /**
368
+ * The fully-extracted, render-ready GateDetailsPanel model. PURE function of
369
+ * the envelope — the `GateDetailsPanel` component computes this and renders
370
+ * it; the parity test asserts these exact extracted values (shared-contract
371
+ * §5). `null` panel pieces render nothing (graceful empty).
372
+ */
373
+ export interface GateDetailsPanelModel {
374
+ /** `summary` verbatim (headline), or null. */
375
+ readonly headline: string | null;
376
+ /** Halt-reason label + explanation (unknown → raw label, null explanation), or null. */
377
+ readonly reasonLabel: string | null;
378
+ readonly reasonExplanation: string | null;
379
+ /** "Round N". */
380
+ readonly roundLabel: string;
381
+ /** Timeline rows (empty → no strip). */
382
+ readonly timeline: ReadonlyArray<GatePanelTimelineRow>;
383
+ /** Elapsed seconds (gate_resolved − gate_opened), or null if not derivable. */
384
+ readonly elapsedSeconds: number | null;
385
+ /** Cascade rows — ONLY when roundHistory.length > 1; else empty (no cascade). */
386
+ readonly cascade: ReadonlyArray<{
387
+ readonly round: number;
388
+ readonly reasonLabel: string;
389
+ }>;
390
+ /** True when the prior-rounds cascade omitted earlier entries (`omittedEarlier`). */
391
+ readonly cascadeOmittedEarlier: boolean;
392
+ /** Reviewer rows (empty → no disagreement panel). */
393
+ readonly reviewers: ReadonlyArray<GatePanelReviewerRow>;
394
+ /** Panel-level "Full review in the audit browser" hint (size-degrade), or null. */
395
+ readonly panelTruncationHint: string | null;
396
+ /** Neutral "Reviewer details unavailable" line text when the panel can't render, or null. */
397
+ readonly reviewerUnavailableLine: string | null;
398
+ }
399
+ /**
400
+ * Build the render-ready `GateDetailsPanelModel` from an envelope. PURE — no
401
+ * crypto, no I/O (the `verdictDetails` decrypt already happened in the
402
+ * dispatcher and is attached to the envelope). The test exercises this with
403
+ * the shared parity fixture's envelope directly (shared-contract §5).
404
+ *
405
+ * Never throws; every absent/malformed field degrades to a safe empty value.
406
+ */
407
+ export declare function buildGateDetailsPanelModel(envelope: GatePromptEnvelope): GateDetailsPanelModel;
408
+ /** One reviewer seat row the panel renders (a round's verdict). */
409
+ export interface ReviewSummaryReviewerRow {
410
+ readonly seatId: number;
411
+ readonly role: string;
412
+ readonly agent: string;
413
+ /** "Reviewer {seatId} ({role}, {agent}): {decisionCopy}". */
414
+ readonly header: string;
415
+ /** Decision display label via `decisionCopy` (unknown → raw). */
416
+ readonly decisionLabel: string;
417
+ readonly reasoning: string;
418
+ readonly suggestedChanges: ReadonlyArray<string>;
419
+ }
420
+ /** One round the panel renders (proposal + per-seat verdicts + revise notes). */
421
+ export interface ReviewSummaryRoundModel {
422
+ readonly round: number;
423
+ /** "Round N". */
424
+ readonly roundLabel: string;
425
+ readonly proposal: string;
426
+ readonly reviewers: ReadonlyArray<ReviewSummaryReviewerRow>;
427
+ /** GateDecision serde value (proceed | auto_revise | escalate). */
428
+ readonly outcome: string;
429
+ /** Aggregated REVISE seat findings (the auto-revision driver), or null. */
430
+ readonly reviseNotes: string | null;
431
+ }
432
+ /**
433
+ * The fully-extracted, render-ready per-round review summary model. PURE
434
+ * function of the decrypted summary. `null`-attached (entry has no
435
+ * `reviewSummary`) → the panel renders nothing extra (fail-open base prompt).
436
+ */
437
+ export interface ReviewSummaryPanelModel {
438
+ readonly rounds: ReadonlyArray<ReviewSummaryRoundModel>;
439
+ /** finalOutcome display value (proceed | auto_revise | escalate). */
440
+ readonly finalOutcome: string;
441
+ /** Banner text when the size cap dropped/truncated content, or null. */
442
+ readonly truncationNotice: string | null;
443
+ }
444
+ /**
445
+ * The decrypted summary input shape `buildReviewSummaryPanelModel` accepts.
446
+ * Structurally identical to the SDK's `TaskReviewSummary` (kept local to avoid
447
+ * an import cycle). Every field is defensively read — a malformed/partial
448
+ * object degrades to an empty/safe model, never throws.
449
+ */
450
+ export interface DecryptedReviewSummaryInput {
451
+ readonly rounds?: ReadonlyArray<{
452
+ readonly round?: number;
453
+ readonly proposal?: string;
454
+ readonly reviewers?: ReadonlyArray<{
455
+ readonly seatId?: number;
456
+ readonly role?: string;
457
+ readonly agent?: string;
458
+ readonly decision?: string;
459
+ readonly reasoning?: string;
460
+ readonly suggestedChanges?: ReadonlyArray<string>;
461
+ }>;
462
+ readonly outcome?: string;
463
+ readonly reviseNotes?: string;
464
+ }>;
465
+ readonly finalOutcome?: string;
466
+ readonly truncatedForSize?: boolean;
467
+ readonly omittedRounds?: number;
468
+ }
469
+ /**
470
+ * Build the render-ready `ReviewSummaryPanelModel` from a decrypted summary.
471
+ * PURE — no crypto, no I/O. Defensive: every absent/malformed field degrades
472
+ * to a safe empty value (the panel renders what it can; the decision never
473
+ * blocks on this — §2.5 fail-open). Returns `null` when there are no usable
474
+ * rounds (the renderer then shows no per-round panel).
475
+ *
476
+ * Truncation markers (the `"…[truncated]"` suffixes + `truncatedForSize` /
477
+ * `omittedRounds`) ride verbatim from the engine — the engine already
478
+ * truncated the strings; the builder only surfaces a panel-level NOTICE so the
479
+ * user knows content was dropped.
480
+ */
481
+ export declare function buildReviewSummaryPanelModel(summary: DecryptedReviewSummaryInput | null | undefined): ReviewSummaryPanelModel | null;