@tangle-network/agent-app 0.45.53 → 0.45.55

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 (480) hide show
  1. package/README.md +1 -1
  2. package/dist/alerting/index.d.ts +5 -175
  3. package/dist/alerting/slack.d.ts +176 -0
  4. package/dist/app-auth/index.d.ts +14 -17
  5. package/dist/assets/index.d.ts +2 -504
  6. package/dist/assets/schema.d.ts +264 -0
  7. package/dist/assets/types.d.ts +237 -0
  8. package/dist/assistant/AssistantDock.d.ts +56 -0
  9. package/dist/assistant/AssistantHistory.d.ts +41 -0
  10. package/dist/assistant/AssistantPanel.d.ts +84 -0
  11. package/dist/assistant/ProposalCard.d.ts +41 -0
  12. package/dist/assistant/ResizeHandle.d.ts +19 -0
  13. package/dist/assistant/client-context.d.ts +20 -0
  14. package/dist/assistant/client.d.ts +117 -0
  15. package/dist/assistant/index.d.ts +19 -848
  16. package/dist/assistant/launcher.d.ts +23 -0
  17. package/dist/assistant/persistence.d.ts +26 -0
  18. package/dist/assistant/presentation.d.ts +99 -0
  19. package/dist/assistant/provider-label.d.ts +7 -0
  20. package/dist/assistant/reducer.d.ts +130 -0
  21. package/dist/assistant/sse.d.ts +24 -0
  22. package/dist/assistant/time-ago.d.ts +6 -0
  23. package/dist/assistant/transcript.d.ts +97 -0
  24. package/dist/assistant/types.d.ts +291 -0
  25. package/dist/assistant/use-stick-to-bottom.d.ts +28 -0
  26. package/dist/assistant/useAssistantChat.d.ts +63 -0
  27. package/dist/assistant/useAssistantModels.d.ts +22 -0
  28. package/dist/assistant/useAssistantThreads.d.ts +47 -0
  29. package/dist/assistant/usePanelPrefs.d.ts +55 -0
  30. package/dist/billing/index.d.ts +19 -21
  31. package/dist/brand/index.d.ts +16 -10
  32. package/dist/brand-extraction/extract.d.ts +34 -0
  33. package/dist/brand-extraction/index.d.ts +12 -214
  34. package/dist/brand-extraction/map.d.ts +58 -0
  35. package/dist/brand-extraction/types.d.ts +119 -0
  36. package/dist/catalog/index.d.ts +11 -101
  37. package/dist/chat-react/composer-mode-controls.d.ts +14 -0
  38. package/dist/chat-react/entry-composer.d.ts +92 -0
  39. package/dist/chat-react/index.d.ts +22 -118
  40. package/dist/chat-react/types.d.ts +11 -0
  41. package/dist/chat-routes/attachment-store.d.ts +84 -0
  42. package/dist/chat-routes/attachment-upload.d.ts +84 -0
  43. package/dist/chat-routes/attachment-validation.d.ts +95 -0
  44. package/dist/chat-routes/binary-sniff.d.ts +45 -0
  45. package/dist/chat-routes/completed-sandbox-turn.d.ts +25 -0
  46. package/dist/chat-routes/detached-turn.d.ts +197 -0
  47. package/dist/chat-routes/dispatch-parts.d.ts +101 -0
  48. package/dist/chat-routes/draft-persistence.d.ts +189 -0
  49. package/dist/chat-routes/durable-projection.d.ts +18 -0
  50. package/dist/chat-routes/file-index.d.ts +115 -0
  51. package/dist/chat-routes/index.d.ts +25 -1840
  52. package/dist/chat-routes/model-failover-stream.d.ts +206 -0
  53. package/dist/chat-routes/promote-file-part.d.ts +84 -0
  54. package/dist/chat-routes/resolve-attachments.d.ts +72 -0
  55. package/dist/chat-routes/sandbox-producer.d.ts +146 -0
  56. package/dist/chat-routes/sandbox-turn-usage.d.ts +4 -0
  57. package/dist/{stale-turn-lock-DucQzvXu.d.ts → chat-routes/stale-turn-lock.d.ts} +7 -9
  58. package/dist/chat-routes/turn-routes.d.ts +540 -0
  59. package/dist/chat-routes/upload.d.ts +84 -0
  60. package/dist/{wire-DOZ-O6hD.d.ts → chat-routes/wire.d.ts} +41 -44
  61. package/dist/chat-store/core.d.ts +19 -0
  62. package/dist/chat-store/index.d.ts +22 -322
  63. package/dist/{parts-BqIHMdyu.d.ts → chat-store/parts.d.ts} +49 -47
  64. package/dist/chat-store/schema.d.ts +157 -0
  65. package/dist/chat-store/store.d.ts +177 -0
  66. package/dist/config/index.d.ts +13 -18
  67. package/dist/crypto/index.d.ts +10 -12
  68. package/dist/crypto/web-token.d.ts +22 -0
  69. package/dist/design-canvas/apply.d.ts +70 -0
  70. package/dist/design-canvas/drizzle-store.d.ts +29 -0
  71. package/dist/design-canvas/drizzle.d.ts +7 -575
  72. package/dist/{export-presets-mgVulRaV.d.ts → design-canvas/export-presets.d.ts} +18 -22
  73. package/dist/design-canvas/index.d.ts +22 -268
  74. package/dist/design-canvas/mcp-entry.d.ts +15 -0
  75. package/dist/design-canvas/mcp-handler.d.ts +34 -0
  76. package/dist/design-canvas/mcp-tools.d.ts +30 -0
  77. package/dist/{model-DnfO_PdJ.d.ts → design-canvas/model.d.ts} +33 -35
  78. package/dist/{operations-ByJ6yXOW.d.ts → design-canvas/operations.d.ts} +21 -25
  79. package/dist/design-canvas/schema.d.ts +558 -0
  80. package/dist/{store-CqfDtnPQ.d.ts → design-canvas/store.d.ts} +8 -12
  81. package/dist/design-canvas/templates.d.ts +72 -0
  82. package/dist/design-canvas/validate.d.ts +32 -0
  83. package/dist/design-canvas-react/components/BleedTrimOverlay.d.ts +22 -0
  84. package/dist/design-canvas-react/components/BrandKnot.d.ts +11 -0
  85. package/dist/design-canvas-react/components/CanvasEmptyState.d.ts +32 -0
  86. package/dist/design-canvas-react/components/CanvasInsertPanel.d.ts +53 -0
  87. package/dist/{lazy-DrkVyDpe.d.ts → design-canvas-react/components/DesignCanvas.d.ts} +27 -20
  88. package/dist/design-canvas-react/components/DesignCanvasEditor.d.ts +23 -0
  89. package/dist/design-canvas-react/components/ElementNode.d.ts +51 -0
  90. package/dist/design-canvas-react/components/ExportControl.d.ts +21 -0
  91. package/dist/design-canvas-react/components/GridLayer.d.ts +47 -0
  92. package/dist/design-canvas-react/components/InlineTextEditor.d.ts +25 -0
  93. package/dist/design-canvas-react/components/LayersPanel.d.ts +20 -0
  94. package/dist/design-canvas-react/components/PagesStrip.d.ts +34 -0
  95. package/dist/design-canvas-react/components/Rulers.d.ts +31 -0
  96. package/dist/design-canvas-react/components/SelectionLayer.d.ts +51 -0
  97. package/dist/design-canvas-react/components/SnapGuidesOverlay.d.ts +25 -0
  98. package/dist/design-canvas-react/components/Toolbar.d.ts +64 -0
  99. package/dist/design-canvas-react/components/Workspace.d.ts +92 -0
  100. package/dist/design-canvas-react/components/ZoomControls.d.ts +14 -0
  101. package/dist/design-canvas-react/components/glyphs.d.ts +46 -0
  102. package/dist/design-canvas-react/components/icon-button.d.ts +22 -0
  103. package/dist/design-canvas-react/components/index.d.ts +27 -0
  104. package/dist/design-canvas-react/components/layer-tree.d.ts +34 -0
  105. package/dist/design-canvas-react/components/ruler-math.d.ts +78 -0
  106. package/dist/design-canvas-react/components/transform-math.d.ts +168 -0
  107. package/dist/{command-stack-TNPWJCzW.d.ts → design-canvas-react/contracts.d.ts} +16 -63
  108. package/dist/design-canvas-react/engine/command-stack.d.ts +43 -0
  109. package/dist/design-canvas-react/engine/commands.d.ts +154 -0
  110. package/dist/design-canvas-react/engine/selection.d.ts +48 -0
  111. package/dist/design-canvas-react/engine/snap.d.ts +24 -0
  112. package/dist/design-canvas-react/engine/zoom-pan.d.ts +18 -0
  113. package/dist/design-canvas-react/engine.d.ts +21 -399
  114. package/dist/design-canvas-react/export-math.d.ts +104 -0
  115. package/dist/design-canvas-react/export.d.ts +89 -0
  116. package/dist/design-canvas-react/index.d.ts +16 -586
  117. package/dist/design-canvas-react/insert-builders.d.ts +61 -0
  118. package/dist/design-canvas-react/lazy.d.ts +21 -6
  119. package/dist/documents/docx.d.ts +50 -0
  120. package/dist/documents/extract.d.ts +87 -0
  121. package/dist/documents/index.d.ts +26 -232
  122. package/dist/documents/media-type.d.ts +33 -0
  123. package/dist/documents/pdf-inspector.d.ts +5 -9
  124. package/dist/{types-DrBidf3O.d.ts → documents/types.d.ts} +13 -15
  125. package/dist/documents/zip.d.ts +56 -0
  126. package/dist/eval/calibration.d.ts +106 -0
  127. package/dist/eval/index.d.ts +8 -116
  128. package/dist/eval-campaign/index.d.ts +11 -12
  129. package/dist/{trust-gate-Dcm5xSva.d.ts → eval-campaign/trust-gate.d.ts} +5 -9
  130. package/dist/forms/blank.d.ts +48 -0
  131. package/dist/forms/fill.d.ts +105 -0
  132. package/dist/forms/index.d.ts +58 -332
  133. package/dist/forms/registry.d.ts +115 -0
  134. package/dist/forms/verify.d.ts +58 -0
  135. package/dist/harness/index.d.ts +21 -19
  136. package/dist/intakes/api.d.ts +5 -11
  137. package/dist/{completion-CvcNUz07.d.ts → intakes/completion.d.ts} +7 -11
  138. package/dist/intakes/context-sufficiency.d.ts +113 -0
  139. package/dist/intakes/drizzle/schema.d.ts +338 -0
  140. package/dist/intakes/drizzle/store.d.ts +75 -0
  141. package/dist/intakes/drizzle.d.ts +12 -391
  142. package/dist/intakes/index.d.ts +23 -113
  143. package/dist/{model-C8U0HZxL.d.ts → intakes/model.d.ts} +15 -17
  144. package/dist/intakes-react/components/BrandMark.d.ts +10 -0
  145. package/dist/intakes-react/components/IntakeInterview.d.ts +15 -0
  146. package/dist/intakes-react/components/index.d.ts +1 -0
  147. package/dist/intakes-react/contracts.d.ts +42 -0
  148. package/dist/intakes-react/index.d.ts +12 -47
  149. package/dist/intakes-react/lazy.d.ts +9 -8
  150. package/dist/integrations/index.d.ts +10 -12
  151. package/dist/{contract-OxG_jVMx.d.ts → interactions/contract.d.ts} +40 -42
  152. package/dist/interactions/index.d.ts +16 -256
  153. package/dist/interactions/route.d.ts +151 -0
  154. package/dist/interactions/sidecar.d.ts +100 -0
  155. package/dist/knowledge/index.d.ts +7 -11
  156. package/dist/knowledge-loop/index.d.ts +13 -20
  157. package/dist/legibility/checks/empty-state.d.ts +59 -0
  158. package/dist/legibility/checks/reachability.d.ts +103 -0
  159. package/dist/legibility/checks/silent-failure.d.ts +57 -0
  160. package/dist/legibility/checks/success.d.ts +38 -0
  161. package/dist/legibility/checks/vocabulary.d.ts +65 -0
  162. package/dist/legibility/cli-args.d.ts +30 -0
  163. package/dist/legibility/cli.d.ts +25 -0
  164. package/dist/legibility/index.d.ts +10 -530
  165. package/dist/legibility/report.d.ts +22 -0
  166. package/dist/legibility/scan.d.ts +29 -0
  167. package/dist/legibility/source.d.ts +132 -0
  168. package/dist/legibility/suppress.d.ts +36 -0
  169. package/dist/legibility/types.d.ts +168 -0
  170. package/dist/legibility/walk-sources.d.ts +21 -0
  171. package/dist/{agent-activity-C8ZG0F0M.d.ts → missions/agent-activity.d.ts} +3 -5
  172. package/dist/missions/engine.d.ts +251 -0
  173. package/dist/missions/events.d.ts +195 -0
  174. package/dist/missions/index.d.ts +12 -765
  175. package/dist/missions/plan-parse.d.ts +50 -0
  176. package/dist/missions/service.d.ts +265 -0
  177. package/dist/{failover-D-3UXXTb.d.ts → model-resolution/failover.d.ts} +10 -12
  178. package/dist/model-resolution/index.d.ts +15 -18
  179. package/dist/object-store/index.d.ts +15 -17
  180. package/dist/openui/action.d.ts +54 -0
  181. package/dist/openui/authoring.d.ts +25 -0
  182. package/dist/openui/index.d.ts +24 -206
  183. package/dist/openui/route.d.ts +124 -0
  184. package/dist/openui/segments.d.ts +71 -0
  185. package/dist/openui/values.d.ts +82 -0
  186. package/dist/openui-react/index.d.ts +9 -13
  187. package/dist/peer-floors/check.d.ts +9 -190
  188. package/dist/peer-floors/cli.d.ts +2 -3
  189. package/dist/peer-floors/dependency-source.d.ts +178 -0
  190. package/dist/plans/index.d.ts +13 -14
  191. package/dist/{billing-BuNlaKlE.d.ts → platform/billing.d.ts} +28 -32
  192. package/dist/platform/guards.d.ts +79 -0
  193. package/dist/platform/hub.d.ts +107 -0
  194. package/dist/platform/index.d.ts +7 -112
  195. package/dist/{sso-Cm00S61u.d.ts → platform/sso.d.ts} +15 -97
  196. package/dist/preflight/cli.d.ts +3 -6
  197. package/dist/preflight/index.d.ts +16 -18
  198. package/dist/preset-cloudflare/headers.d.ts +12 -0
  199. package/dist/preset-cloudflare/index.d.ts +22 -74
  200. package/dist/preset-cloudflare/workflow-instance.d.ts +35 -0
  201. package/dist/profile/budget.d.ts +72 -0
  202. package/dist/profile/fingerprint.d.ts +65 -0
  203. package/dist/profile/index.d.ts +27 -19
  204. package/dist/prompt/index.d.ts +3 -5
  205. package/dist/record/drizzle/schema.d.ts +488 -0
  206. package/dist/record/drizzle/store.d.ts +224 -0
  207. package/dist/record/drizzle.d.ts +10 -679
  208. package/dist/record/fold.d.ts +99 -0
  209. package/dist/record/index.d.ts +13 -13
  210. package/dist/{fold-DACU7gtf.d.ts → record/model.d.ts} +22 -124
  211. package/dist/record/ulid.d.ts +12 -0
  212. package/dist/redact/index.d.ts +14 -16
  213. package/dist/run/index.d.ts +11 -16
  214. package/dist/runtime/agent.d.ts +23 -0
  215. package/dist/runtime/certified-delivery.d.ts +57 -0
  216. package/dist/runtime/index.d.ts +17 -367
  217. package/dist/runtime/loop.d.ts +58 -0
  218. package/dist/runtime/model-catalog.d.ts +103 -0
  219. package/dist/{model-CdCDfBA9.d.ts → runtime/model.d.ts} +25 -27
  220. package/dist/runtime/openai-stream.d.ts +126 -0
  221. package/dist/runtime/surface-profile.d.ts +115 -0
  222. package/dist/sandbox/binary-read.d.ts +63 -0
  223. package/dist/sandbox/diagnostics.d.ts +69 -0
  224. package/dist/sandbox/index.d.ts +103 -1085
  225. package/dist/sandbox/model.d.ts +179 -0
  226. package/dist/sandbox/outcome.d.ts +10 -0
  227. package/dist/sandbox/prewarm-claim-d1.d.ts +80 -0
  228. package/dist/sandbox/prewarm.d.ts +193 -0
  229. package/dist/sandbox/recovery.d.ts +216 -0
  230. package/dist/sandbox/terminal-connection.d.ts +145 -0
  231. package/dist/sandbox/workspace-sandbox-manager.d.ts +44 -0
  232. package/dist/sequences/apply.d.ts +54 -0
  233. package/dist/sequences/captions.d.ts +91 -0
  234. package/dist/sequences/drizzle-store.d.ts +36 -0
  235. package/dist/sequences/drizzle.d.ts +7 -1252
  236. package/dist/sequences/exports.d.ts +138 -0
  237. package/dist/sequences/index.d.ts +19 -340
  238. package/dist/sequences/mcp-entry.d.ts +15 -0
  239. package/dist/sequences/mcp-handler.d.ts +39 -0
  240. package/dist/sequences/mcp-tools.d.ts +47 -0
  241. package/dist/{store-B7LLlk9p.d.ts → sequences/model.d.ts} +26 -110
  242. package/dist/sequences/operations.d.ts +126 -0
  243. package/dist/sequences/schema.d.ts +1231 -0
  244. package/dist/sequences/store.d.ts +81 -0
  245. package/dist/sequences/validate.d.ts +98 -0
  246. package/dist/sequences-react/components/BrandMark.d.ts +10 -0
  247. package/dist/sequences-react/components/PreviewCanvas.d.ts +26 -0
  248. package/dist/sequences-react/components/SnapIndicatorLine.d.ts +11 -0
  249. package/dist/sequences-react/components/TimelineClipChip.d.ts +80 -0
  250. package/dist/sequences-react/components/TimelineEditor.d.ts +44 -0
  251. package/dist/sequences-react/components/TimelineEmptyState.d.ts +21 -0
  252. package/dist/sequences-react/components/TimelineGhostLanes.d.ts +14 -0
  253. package/dist/sequences-react/components/TimelinePlayhead.d.ts +11 -0
  254. package/dist/sequences-react/components/TimelineRuler.d.ts +16 -0
  255. package/dist/sequences-react/components/TimelineSmallScreenGate.d.ts +12 -0
  256. package/dist/sequences-react/components/TimelineTrackRow.d.ts +51 -0
  257. package/dist/sequences-react/components/ZoomControl.d.ts +15 -0
  258. package/dist/sequences-react/components/composite-command.d.ts +8 -0
  259. package/dist/sequences-react/components/glyphs.d.ts +26 -0
  260. package/dist/sequences-react/components/index.d.ts +31 -0
  261. package/dist/sequences-react/components/interaction-math.d.ts +103 -0
  262. package/dist/sequences-react/contracts.d.ts +187 -0
  263. package/dist/sequences-react/engine/command-stack.d.ts +18 -0
  264. package/dist/sequences-react/engine/commands.d.ts +146 -0
  265. package/dist/sequences-react/engine/playback.d.ts +18 -0
  266. package/dist/sequences-react/engine/snap.d.ts +29 -0
  267. package/dist/sequences-react/engine/zoom.d.ts +29 -0
  268. package/dist/sequences-react/index.d.ts +20 -880
  269. package/dist/sequences-react/lazy.d.ts +8 -0
  270. package/dist/sequences-react/media/frame-provider.d.ts +70 -0
  271. package/dist/sequences-react/media/transcription.d.ts +33 -0
  272. package/dist/sequences-react/media/waveform.d.ts +34 -0
  273. package/dist/session-shell/index.d.ts +31 -204
  274. package/dist/session-shell/nav-guard.d.ts +170 -0
  275. package/dist/session-shell/path.d.ts +19 -0
  276. package/dist/signoff/cli.d.ts +4 -7
  277. package/dist/signoff/config.d.ts +12 -0
  278. package/dist/signoff/exec.d.ts +44 -0
  279. package/dist/signoff/index.d.ts +56 -14
  280. package/dist/signoff/invoked-as-script.d.ts +25 -0
  281. package/dist/signoff/node-version.d.ts +50 -0
  282. package/dist/signoff/proof-attach.d.ts +88 -0
  283. package/dist/signoff/proof-cli.d.ts +1 -0
  284. package/dist/signoff/proof-fixture.d.ts +13 -0
  285. package/dist/signoff/proof-from-report.d.ts +22 -0
  286. package/dist/signoff/proof-git.d.ts +57 -0
  287. package/dist/signoff/proof-record.d.ts +202 -0
  288. package/dist/signoff/proof-verify.d.ts +103 -0
  289. package/dist/signoff/proof.d.ts +35 -310
  290. package/dist/signoff/report.d.ts +7 -0
  291. package/dist/{run-D80hoLKh.d.ts → signoff/run.d.ts} +3 -6
  292. package/dist/signoff/schedule.d.ts +55 -0
  293. package/dist/signoff/seeds.d.ts +50 -0
  294. package/dist/signoff/store.d.ts +22 -0
  295. package/dist/{types-Bd6uW9vQ.d.ts → signoff/types.d.ts} +15 -17
  296. package/dist/signoff/workflow-pin.d.ts +56 -0
  297. package/dist/signoff/workspace.d.ts +40 -0
  298. package/dist/skills/index.d.ts +28 -32
  299. package/dist/skills-placement/index.d.ts +7 -11
  300. package/dist/spend/budget.d.ts +123 -0
  301. package/dist/spend/ceiling.d.ts +51 -0
  302. package/dist/spend/cli-args.d.ts +20 -0
  303. package/dist/spend/cli.d.ts +1 -0
  304. package/dist/spend/fixtures/incident-parked-time.d.ts +55 -0
  305. package/dist/spend/index.d.ts +38 -1144
  306. package/dist/spend/liveness.d.ts +131 -0
  307. package/dist/spend/ownership.d.ts +87 -0
  308. package/dist/spend/reconcile.d.ts +109 -0
  309. package/dist/spend/reference.d.ts +42 -0
  310. package/dist/spend/report.d.ts +12 -0
  311. package/dist/spend/store.d.ts +123 -0
  312. package/dist/spend/types.d.ts +466 -0
  313. package/dist/store/index.d.ts +10 -12
  314. package/dist/stories/app-shell/fixtures.d.ts +43 -0
  315. package/dist/stories/app-shell/shell.d.ts +81 -0
  316. package/dist/stories/assistant/fixtures.d.ts +73 -0
  317. package/dist/stories/chat/fixtures.d.ts +70 -0
  318. package/dist/stories/chat/markdown.d.ts +11 -0
  319. package/dist/stories/chat/run-drill-in.d.ts +19 -0
  320. package/dist/stories/chat-controls/fixtures.d.ts +116 -0
  321. package/dist/stories/design-canvas/fixtures.d.ts +57 -0
  322. package/dist/stories/fixtures/canvas.d.ts +10 -0
  323. package/dist/stories/fixtures/catalog.d.ts +7 -0
  324. package/dist/stories/fixtures/chat.d.ts +39 -0
  325. package/dist/stories/fixtures/index.d.ts +4 -0
  326. package/dist/stories/fixtures/sequences.d.ts +17 -0
  327. package/dist/stories/panels/fixtures.d.ts +63 -0
  328. package/dist/stories/sequences/fixtures.d.ts +30 -0
  329. package/dist/stories/studio/fixtures.d.ts +22 -0
  330. package/dist/stream/index.d.ts +10 -56
  331. package/dist/{stream-normalizer-DKRxyVlZ.d.ts → stream/stream-normalizer.d.ts} +23 -26
  332. package/dist/{turn-buffer-COMQUwO2.d.ts → stream/turn-buffer.d.ts} +21 -23
  333. package/dist/stream/turn-identity.d.ts +49 -0
  334. package/dist/studio/generation.d.ts +179 -0
  335. package/dist/studio/index.d.ts +12 -181
  336. package/dist/studio-react/avatar-composer.d.ts +8 -0
  337. package/dist/studio-react/composer-hero.d.ts +12 -0
  338. package/dist/studio-react/composer-shell.d.ts +18 -0
  339. package/dist/studio-react/generation-card.d.ts +9 -0
  340. package/dist/studio-react/generation-detail-modal.d.ts +11 -0
  341. package/dist/studio-react/generation-detail.d.ts +6 -0
  342. package/dist/studio-react/generation-grid.d.ts +15 -0
  343. package/dist/studio-react/image-composer.d.ts +8 -0
  344. package/dist/studio-react/index.d.ts +32 -245
  345. package/dist/studio-react/library-drawer.d.ts +12 -0
  346. package/dist/studio-react/library-panel.d.ts +15 -0
  347. package/dist/studio-react/publish-package-composer.d.ts +18 -0
  348. package/dist/studio-react/result-canvas.d.ts +6 -0
  349. package/dist/studio-react/speech-composer.d.ts +4 -0
  350. package/dist/studio-react/studio-header.d.ts +5 -0
  351. package/dist/studio-react/studio-sheet.d.ts +12 -0
  352. package/dist/studio-react/studio-workspace.d.ts +23 -0
  353. package/dist/studio-react/transcription-composer.d.ts +12 -0
  354. package/dist/studio-react/type-config.d.ts +11 -0
  355. package/dist/studio-react/use-studio-generations.d.ts +20 -0
  356. package/dist/studio-react/video-composer.d.ts +10 -0
  357. package/dist/tangle/index.d.ts +7 -9
  358. package/dist/teams/drizzle/access.d.ts +82 -0
  359. package/dist/{invitations-schema-_fI7HkJP.d.ts → teams/drizzle/invitations-schema.d.ts} +39 -27
  360. package/dist/teams/drizzle/personal-organization.d.ts +41 -0
  361. package/dist/{access-490O6aOU.d.ts → teams/drizzle/schema.d.ts} +57 -122
  362. package/dist/teams/drizzle.d.ts +12 -44
  363. package/dist/teams/index.d.ts +20 -44
  364. package/dist/teams/invitations-api.d.ts +17 -21
  365. package/dist/{invitations-DoYMvXea.d.ts → teams/invitations.d.ts} +14 -18
  366. package/dist/teams/invite.d.ts +42 -0
  367. package/dist/teams/members-api.d.ts +12 -16
  368. package/dist/teams/resend.d.ts +3 -13
  369. package/dist/{roles-B4nU3jDi.d.ts → teams/roles.d.ts} +18 -20
  370. package/dist/teams-react/components/BrandMark.d.ts +10 -0
  371. package/dist/teams-react/components/InvitationsPanel.d.ts +13 -0
  372. package/dist/teams-react/components/InviteAcceptPage.d.ts +10 -0
  373. package/dist/teams-react/components/MembersPanel.d.ts +14 -0
  374. package/dist/teams-react/components/RoleSelect.d.ts +17 -0
  375. package/dist/teams-react/components/index.d.ts +3 -0
  376. package/dist/teams-react/contracts.d.ts +134 -0
  377. package/dist/teams-react/index.d.ts +12 -143
  378. package/dist/teams-react/lazy.d.ts +11 -11
  379. package/dist/test-setup.d.ts +1 -0
  380. package/dist/theme/index.d.ts +6 -104
  381. package/dist/theme/tailwind-preset.d.ts +1 -2
  382. package/dist/theme/theme.d.ts +106 -0
  383. package/dist/theme-contract/cli.d.ts +21 -0
  384. package/dist/theme-contract/index.d.ts +4 -6
  385. package/dist/{auth-BYtiazA4.d.ts → tools/auth.d.ts} +8 -11
  386. package/dist/tools/capability.d.ts +54 -0
  387. package/dist/tools/dispatch.d.ts +37 -0
  388. package/dist/tools/errors.d.ts +8 -0
  389. package/dist/tools/gating.d.ts +62 -0
  390. package/dist/tools/http.d.ts +27 -0
  391. package/dist/tools/index.d.ts +12 -217
  392. package/dist/{mcp-rpc-DYwPlYbZ.d.ts → tools/mcp-rpc.d.ts} +7 -9
  393. package/dist/{mcp-xxoZZfor.d.ts → tools/mcp.d.ts} +14 -16
  394. package/dist/tools/openai.d.ts +28 -0
  395. package/dist/tools/registry.d.ts +39 -0
  396. package/dist/tools/runtime.d.ts +22 -0
  397. package/dist/{types-B25Mib1r.d.ts → tools/types.d.ts} +15 -83
  398. package/dist/{flow-types-CJxEmaRy.d.ts → trace/flow-types.d.ts} +2 -4
  399. package/dist/trace/index.d.ts +11 -148
  400. package/dist/trace/mission-flow.d.ts +82 -0
  401. package/dist/trace/mission-trace.d.ts +52 -0
  402. package/dist/turn-health/classify.d.ts +207 -0
  403. package/dist/turn-health/index.d.ts +29 -637
  404. package/dist/turn-health/lifecycle.d.ts +75 -0
  405. package/dist/turn-health/sink.d.ts +122 -0
  406. package/dist/turn-health/sweep.d.ts +245 -0
  407. package/dist/turn-stream/adapters.d.ts +257 -0
  408. package/dist/turn-stream/core.d.ts +293 -0
  409. package/dist/turn-stream/do.d.ts +144 -0
  410. package/dist/turn-stream/index.d.ts +62 -738
  411. package/dist/turn-stream/memory.d.ts +41 -0
  412. package/dist/vault/ConfirmDialog.d.ts +22 -0
  413. package/dist/vault/VaultPane.d.ts +15 -0
  414. package/dist/{VaultPane-BDP6SB_K.d.ts → vault/contracts.d.ts} +15 -22
  415. package/dist/vault/index.d.ts +15 -22
  416. package/dist/vault/lazy.d.ts +9 -7
  417. package/dist/vault/server.d.ts +8 -10
  418. package/dist/web/free-route-limit.d.ts +187 -0
  419. package/dist/web/index.d.ts +15 -207
  420. package/dist/{rate-limit-BOVmJRXZ.d.ts → web/rate-limit.d.ts} +3 -5
  421. package/dist/web-react/agent-session-controls.d.ts +105 -0
  422. package/dist/web-react/async/async-view.d.ts +69 -0
  423. package/dist/web-react/async/index.d.ts +13 -305
  424. package/dist/web-react/async/state.d.ts +107 -0
  425. package/dist/web-react/async/use-async-resource.d.ts +41 -0
  426. package/dist/web-react/async/use-confirmed-mutation.d.ts +90 -0
  427. package/dist/web-react/brand-mark.d.ts +11 -0
  428. package/dist/web-react/chat-attachments.d.ts +21 -0
  429. package/dist/web-react/chat-composer.d.ts +174 -0
  430. package/dist/web-react/chat-interactions.d.ts +1 -0
  431. package/dist/web-react/chat-mentions.d.ts +48 -0
  432. package/dist/web-react/chat-stream.d.ts +106 -0
  433. package/dist/web-react/class-names.d.ts +10 -0
  434. package/dist/web-react/controls.d.ts +265 -0
  435. package/dist/web-react/durable-chat-cards.d.ts +40 -0
  436. package/dist/web-react/durable-interaction-submit.d.ts +22 -0
  437. package/dist/web-react/durable-plan-card.d.ts +13 -0
  438. package/dist/web-react/durable-plan-flow.d.ts +77 -0
  439. package/dist/web-react/harness-glyphs.d.ts +28 -0
  440. package/dist/web-react/index.d.ts +80 -2347
  441. package/dist/web-react/inert.d.ts +39 -0
  442. package/dist/web-react/insight-card.d.ts +203 -0
  443. package/dist/web-react/interaction-card-support.d.ts +115 -0
  444. package/dist/web-react/interaction-plan-card.d.ts +39 -0
  445. package/dist/web-react/interaction-question-card.d.ts +100 -0
  446. package/dist/web-react/message-attachments.d.ts +56 -0
  447. package/dist/web-react/mission-activity.d.ts +96 -0
  448. package/dist/web-react/motion.d.ts +43 -0
  449. package/dist/web-react/provenance-model.d.ts +195 -0
  450. package/dist/web-react/provenance.d.ts +82 -0
  451. package/dist/web-react/provider-logo.d.ts +14 -0
  452. package/dist/web-react/record-grid-model.d.ts +257 -0
  453. package/dist/web-react/record-grid.d.ts +108 -0
  454. package/dist/web-react/sandbox-terminal.d.ts +90 -0
  455. package/dist/web-react/seat-paywall.d.ts +47 -0
  456. package/dist/web-react/session-history.d.ts +196 -0
  457. package/dist/web-react/smooth-text.d.ts +29 -0
  458. package/dist/web-react/sparkline.d.ts +150 -0
  459. package/dist/web-react/terminal.d.ts +1 -92
  460. package/dist/web-react/use-chat-interactions.d.ts +78 -0
  461. package/dist/web-react/use-composer-attachments.d.ts +111 -0
  462. package/dist/web-react/use-file-mentions.d.ts +94 -0
  463. package/dist/web-react/work-product.d.ts +105 -0
  464. package/dist/work-product/claim-support.d.ts +288 -0
  465. package/dist/work-product/index.d.ts +16 -849
  466. package/dist/work-product/provenance.d.ts +61 -0
  467. package/dist/{queue-VTBA5ONX.d.ts → work-product/queue.d.ts} +10 -12
  468. package/dist/work-product/quote.d.ts +139 -0
  469. package/dist/work-product/route.d.ts +88 -0
  470. package/dist/work-product/service.d.ts +123 -0
  471. package/dist/work-product/tools.d.ts +144 -0
  472. package/dist/{types-CCeYywdS.d.ts → work-product/types.d.ts} +29 -31
  473. package/dist/work-product-react/index.d.ts +19 -8
  474. package/dist/workspace-react/index.d.ts +8 -11
  475. package/package.json +5 -4
  476. package/dist/agent-session-controls-CmlXwp_H.d.ts +0 -384
  477. package/dist/apply-6wlMOLf8.d.ts +0 -280
  478. package/dist/attachment-validation-BfJDBU1g.d.ts +0 -261
  479. package/dist/budget-BOucfcb_.d.ts +0 -142
  480. package/dist/values-C7RidJuI.d.ts +0 -156
@@ -0,0 +1,179 @@
1
+ /** Define configuration options for resolving a provider and its model with optional API keys and routing details */
2
+ export interface ProviderResolutionConfig {
3
+ routerBaseUrl?: string;
4
+ apiKey?: string;
5
+ providerName?: string;
6
+ modelName?: string;
7
+ defaultModel?: string;
8
+ openaiApiKey?: string;
9
+ allowKeylessModel?: boolean;
10
+ }
11
+ /** Represent a fully configured model with optional API key and base URL for sandbox platform integration */
12
+ export interface ResolvedModel {
13
+ model: string;
14
+ provider: string;
15
+ apiKey?: string;
16
+ baseUrl?: string;
17
+ }
18
+ /**
19
+ * Why a model failed to resolve into something transportable to the sandbox
20
+ * platform. `no_provider` — a model id exists but no provider name could be
21
+ * derived (no explicit `providerName`, and no key present to infer one from).
22
+ * `no_api_key` — a provider AND model both resolved, but no credential is
23
+ * configured and the caller did not opt into `allowKeylessModel`.
24
+ */
25
+ export type ModelSelectionError = 'no_provider' | 'no_api_key';
26
+ /**
27
+ * Which precedence slot supplied the failed/succeeded model id:
28
+ * `override` — the caller's per-turn `{ model }` argument.
29
+ * `config` — `provider.modelName`.
30
+ * `default` — `provider.defaultModel` (only ever consulted for an
31
+ * openai/openai-compat provider shape).
32
+ */
33
+ export type ModelSelectionSource = 'override' | 'config' | 'default';
34
+ /**
35
+ * A model id was named (by override, config, or default) but is not
36
+ * transportable to the sandbox platform. Carries enough to explain WHY
37
+ * without the caller re-deriving the override/config/default precedence
38
+ * chain itself (that re-derivation is how gtm-agent#665 happened — a caller
39
+ * guessed loudness from the wrong slot and dropped a user-selected model).
40
+ */
41
+ export type ModelSelectionFailure = {
42
+ succeeded: false;
43
+ error: 'no_provider';
44
+ model: string;
45
+ source: ModelSelectionSource;
46
+ } | {
47
+ succeeded: false;
48
+ error: 'no_api_key';
49
+ model: string;
50
+ provider: string;
51
+ source: ModelSelectionSource;
52
+ };
53
+ /**
54
+ * The three-state outcome of resolving a model: `{ succeeded: true, value:
55
+ * undefined }` means NOTHING was requested (the legitimate box-default
56
+ * configuration — not an error); `{ succeeded: true, value: ResolvedModel }`
57
+ * means a fully transportable model resolved; anything else is a
58
+ * {@link ModelSelectionFailure} — a model WAS named but can't be sent.
59
+ */
60
+ export type ModelSelection = {
61
+ succeeded: true;
62
+ value: ResolvedModel | undefined;
63
+ } | ModelSelectionFailure;
64
+ /**
65
+ * Resolve a provider + model configuration into a typed three-state outcome
66
+ * that separates "nothing requested" from "something requested but
67
+ * untransportable" — the distinction {@link resolveModel} collapses and the
68
+ * one that caused gtm-agent#665 (a validated user-selected model silently
69
+ * dropped, box default substituted, durable row still recording the user's
70
+ * choice).
71
+ *
72
+ * Precedence (identical to the legacy `resolveModel`, byte-for-byte):
73
+ * provider is computed first (`providerName`, else inferred `openai-compat`
74
+ * from a present key, else inferred `openai` from a present
75
+ * `openaiApiKey`, else unresolved); the model id is `override.model` else
76
+ * `config.modelName` else — ONLY when the provider is `openai` or
77
+ * `openai-compat` — `config.defaultModel`; the api key is
78
+ * `override.modelApiKey` else `config.apiKey` else — only for provider
79
+ * `openai` — `config.openaiApiKey`.
80
+ *
81
+ * Two behavioral deltas from the legacy function:
82
+ * 1. Every string field (`routerBaseUrl`, `apiKey`, `providerName`,
83
+ * `modelName`, `defaultModel`, `openaiApiKey`, `override.model`,
84
+ * `override.modelApiKey`) is normalized through {@link trimOrNull} first,
85
+ * so `''` (and whitespace-only strings) are treated as absent instead of
86
+ * poisoning the `??` precedence chain — the issue's second stated defect.
87
+ * This also means a value is trimmed (`' gpt-5 '` resolves to `'gpt-5'`).
88
+ * 2. The outcome is three-state instead of collapsing to `undefined`: no
89
+ * model derivable from any slot → `{ succeeded: true, value: undefined }`
90
+ * (still the legitimate "let the box pick its own default" case, NOT an
91
+ * error); a model id resolved but no provider could be derived → a
92
+ * `no_provider` failure; a model + provider resolved but no api key (and
93
+ * `allowKeylessModel` was not set) → a `no_api_key` failure. Both failure
94
+ * arms carry `source` so a caller can apply a loudness policy without
95
+ * re-deriving which precedence slot supplied the model.
96
+ */
97
+ export declare function resolveModelSelection(config: ProviderResolutionConfig | undefined, override?: {
98
+ model?: string;
99
+ modelApiKey?: string;
100
+ }): ModelSelection;
101
+ /**
102
+ * Resolve and return the appropriate model configuration based on provider
103
+ * settings and optional overrides.
104
+ *
105
+ * Migration note (intentionally NOT tagged `@deprecated`): this is a thin,
106
+ * source-compatible wrapper over {@link resolveModelSelection} that collapses
107
+ * its three-state outcome back down to `ResolvedModel | undefined`, exactly
108
+ * as before. It stays correct for the common case (no explicit model requested, or a
109
+ * fully-transportable one), but it CANNOT distinguish "nothing was
110
+ * requested" from "a named model could not be transported" — the ambiguity
111
+ * that caused gtm-agent#665. Prefer {@link resolveModelSelection} directly,
112
+ * or {@link requireTransportableModel} for the fail-loud-on-explicit-model
113
+ * policy the internal sandbox callers use. Not tagged `@deprecated`: it
114
+ * remains the correct call for a caller that never sets an explicit
115
+ * override and only wants "the box's default is fine" semantics; a hard
116
+ * deprecation is a later-major decision, not this fix's.
117
+ *
118
+ * The only behavior change on this entry point versus before is the
119
+ * empty-string bugfix that comes free through delegation (issue #302's
120
+ * second defect) — every signature and the `undefined` return semantics are
121
+ * unchanged.
122
+ */
123
+ export declare function resolveModel(config: ProviderResolutionConfig | undefined, override?: {
124
+ model?: string;
125
+ modelApiKey?: string;
126
+ }): ResolvedModel | undefined;
127
+ /**
128
+ * Thrown by {@link requireTransportableModel} when a model that was
129
+ * EXPLICITLY requested via a per-turn `{ model }` override cannot be
130
+ * transported to the sandbox platform. The message names the model, which
131
+ * precedence slot supplied it, what's missing, and the fix, and states
132
+ * plainly that the requested model was NOT sent to the box (the failure mode
133
+ * this error exists to make impossible to miss — gtm-agent#665 silently
134
+ * substituted the box default instead of a user-selected model).
135
+ *
136
+ * The error class itself carries no opinion about *when* it should be
137
+ * thrown — it is constructed from any {@link ModelSelectionFailure},
138
+ * regardless of `source`. A caller wanting a stricter policy (e.g. also
139
+ * fail-loud on an untransportable configured `provider.modelName`) can call
140
+ * {@link resolveModelSelection} directly and throw this itself.
141
+ */
142
+ export declare class SandboxModelResolutionError extends Error {
143
+ readonly code: ModelSelectionError;
144
+ readonly model: string;
145
+ readonly provider?: string;
146
+ readonly source: ModelSelectionSource;
147
+ constructor(failure: ModelSelectionFailure, context: string);
148
+ }
149
+ /**
150
+ * Shared fail-loud policy for the sandbox platform's three internal model
151
+ * callers (`ensureWorkspaceSandbox`'s `backendModelAtCreate`,
152
+ * `streamSandboxPrompt`, `driveSandboxTurn`): a `ModelSelection` in, a plain
153
+ * `ResolvedModel | undefined` out, so downstream code is unchanged from
154
+ * before this fix.
155
+ *
156
+ * The policy: success delegates straight through. A failure whose `source`
157
+ * is `'override'` means a PER-TURN model was explicitly selected THIS turn
158
+ * (a live, user-driven choice — passed as `{ model }`) and could not be
159
+ * sent; substituting the box default there is exactly the gtm-agent#665
160
+ * defect, so it throws {@link SandboxModelResolutionError} rather than
161
+ * silently falling back.
162
+ *
163
+ * A failure whose `source` is `'config'` or `'default'` means a
164
+ * *configured* `provider.modelName` / `provider.defaultModel` couldn't
165
+ * resolve — nobody made a choice this turn; the value came from board
166
+ * config that may simply describe "the platform supplies the credential."
167
+ * Shipped consumers rely on exactly that: tax-agent ships a shell with
168
+ * `provider: { providerName: 'openai-compat', modelName, routerBaseUrl }`
169
+ * and no `apiKey`/`allowKeylessModel`, with a contract test asserting
170
+ * `ensureWorkspaceSandbox` creation SUCCEEDS with the model silently
171
+ * dropped so the sandbox platform mints its own in-container credential
172
+ * (`apps/web/tests/sandbox-service-contract.test.ts`). A config-loud policy
173
+ * here would break every fresh tax sandbox provisioning and every tax turn.
174
+ * So both `'config'` and `'default'` keep the pre-#302 logged-skip
175
+ * behavior: `console.error` and drop, letting the box use its own default.
176
+ * A product wanting strict enforcement of a configured `provider.modelName`
177
+ * can call {@link resolveModelSelection} directly and apply its own policy.
178
+ */
179
+ export declare function requireTransportableModel(selection: ModelSelection, context: string): ResolvedModel | undefined;
@@ -0,0 +1,10 @@
1
+ /** Represent success or failure of an operation with corresponding value or error information */
2
+ export type Outcome<T> = {
3
+ succeeded: true;
4
+ value: T;
5
+ } | {
6
+ succeeded: false;
7
+ error: Error;
8
+ };
9
+ export declare const ok: <T>(value: T) => Outcome<T>;
10
+ export declare const fail: (error: unknown) => Outcome<never>;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * `createD1PrewarmClaimStore` — the cross-isolate half of
3
+ * `createSandboxPrewarmer`'s single-flight, implemented once.
4
+ *
5
+ * WHY THIS SHIPS HERE. `SandboxPrewarmerOptions.claim` is REQUIRED and has no
6
+ * default, which is correct — the unsafe behaviour must be said out loud. But
7
+ * "required with no implementation" is how five products end up hand-rolling
8
+ * five subtly different atomic leases, and a lease that is subtly wrong is
9
+ * indistinguishable from one that works until two tabs leak a box. Every
10
+ * agent-app product deploys to Cloudflare Workers with a D1 binding, so the
11
+ * store is the same code in all of them: it is mechanism, not domain, and it
12
+ * belongs beside the prewarmer.
13
+ *
14
+ * The measured stake (staging-sandbox, 2026-07-28): two concurrent
15
+ * `POST /v1/sandboxes` with an identical name BOTH returned HTTP 201 and left
16
+ * two running boxes. The platform does not dedupe by name, so nothing below
17
+ * this line is defensive programming — an unclaimed race genuinely doubles
18
+ * spend.
19
+ *
20
+ * ── ATOMICITY IS THE WHOLE POINT ───────────────────────────────────────────
21
+ * `acquire` is ONE statement. A `SELECT` followed by an `INSERT` is exactly the
22
+ * race this exists to close: both isolates read "free", both write, both warm.
23
+ * The upsert's `DO UPDATE ... WHERE expires_at <= now` means an unexpired claim
24
+ * makes the conflict path a no-op, and `RETURNING` then yields no row — so the
25
+ * loser learns it lost from the same statement that would have made it the
26
+ * winner. `RETURNING` is used rather than `meta.changes` because a no-op upsert
27
+ * reporting `changes: 0` is a SQLite detail, whereas "no row came back" is the
28
+ * statement telling you directly.
29
+ *
30
+ * ── STRUCTURAL, NOT A DEPENDENCY ───────────────────────────────────────────
31
+ * The binding is taken as the narrow shape actually used (`prepare().bind()`,
32
+ * `.first()`, `.run()`), per the package's structural-over-hard-dep rule. No
33
+ * `@cloudflare/workers-types` import, so `/sandbox` stays importable in a plain
34
+ * node test. A real `D1Database` satisfies it.
35
+ *
36
+ * ── THE TABLE IS THE PRODUCT'S MIGRATION, NOT A LAZY CREATE ────────────────
37
+ * The store never runs DDL. A `CREATE TABLE IF NOT EXISTS` on every project
38
+ * open costs a round trip on the exact path this feature exists to keep fast,
39
+ * and it hides schema drift instead of failing on it. `PREWARM_CLAIM_TABLE_DDL`
40
+ * is exported so a product pastes it into a real migration. If the table is
41
+ * missing, `acquire` throws — and the prewarmer treats a throwing claim as a
42
+ * failed warm: it records the failure, emits `onEvent({type:'failed'})`, and
43
+ * degrades to the lazy path. Fail-closed and loud, never a silent double-warm.
44
+ */
45
+ /** The columns and statements this store uses, and nothing else. A real
46
+ * `D1Database` structurally satisfies it. */
47
+ export interface PrewarmClaimD1Like {
48
+ prepare(query: string): {
49
+ bind(...values: unknown[]): {
50
+ first<T = Record<string, unknown>>(): Promise<T | null>;
51
+ run(): Promise<unknown>;
52
+ };
53
+ };
54
+ }
55
+ export interface D1PrewarmClaimStoreOptions {
56
+ /** Defaults to `sandbox_prewarm_claims`. Must be a bare SQL identifier — it
57
+ * is interpolated, because a table name cannot be a bound parameter. */
58
+ table?: string;
59
+ /** Clock seam for tests. */
60
+ now?(): number;
61
+ }
62
+ export declare const DEFAULT_PREWARM_CLAIM_TABLE = "sandbox_prewarm_claims";
63
+ /** Paste into a migration. `expires_at` is epoch MILLISECONDS, matching
64
+ * `Date.now()`, so no unit conversion sits between the lease and its clock. */
65
+ export declare const PREWARM_CLAIM_TABLE_DDL = "CREATE TABLE IF NOT EXISTS sandbox_prewarm_claims (\n key TEXT PRIMARY KEY,\n expires_at INTEGER NOT NULL\n)";
66
+ /**
67
+ * A `PrewarmClaimStore` backed by one D1 table.
68
+ *
69
+ * ```ts
70
+ * const prewarmer = createSandboxPrewarmer(shell, {
71
+ * claim: createD1PrewarmClaimStore(env.DB),
72
+ * mode: 'create-or-resume',
73
+ * })
74
+ * ```
75
+ */
76
+ export declare function createD1PrewarmClaimStore(db: PrewarmClaimD1Like, options?: D1PrewarmClaimStoreOptions): {
77
+ acquire(key: string, ttlSeconds: number): Promise<boolean>;
78
+ release(key: string): Promise<void>;
79
+ isHeld(key: string): Promise<boolean>;
80
+ };
@@ -0,0 +1,193 @@
1
+ /**
2
+ * `createSandboxPrewarmer` — "this user just opened this project; start warming
3
+ * their box" as a shell primitive, so every agent-app product gets the same
4
+ * answer instead of forking one.
5
+ *
6
+ * WHY THIS IS SHELL, NOT ENGINE. The engine rule asks whether the capability
7
+ * makes sense without a specific app's side channel. "Warm a box" does — but
8
+ * `@tangle-network/sandbox` has no notion of a WORKSPACE. It keys boxes by an
9
+ * opaque sandbox id; the workspace→box mapping, the harness match, and the
10
+ * profile materialisation all live in `ensureWorkspaceSandbox` here. A
11
+ * prewarmer is that mapping plus a scheduling policy, so it belongs beside it.
12
+ * It is deliberately NOT a new subpath: it composes `peekWorkspaceSandbox` and
13
+ * `ensureWorkspaceSandbox` directly and needs exactly the peers `/sandbox`
14
+ * already needs, so a separate entry would add a second place to look for "how
15
+ * do I get a box" and buy no peer isolation (the reason `/work-product-react`
16
+ * is split out).
17
+ *
18
+ * WHAT IT IS NOT. It does not make cold starts fast — they already are.
19
+ * Measured on the real platform (staging-sandbox, n=5, 2026-07-28): a box goes
20
+ * from nothing to terminal-ready in 2.34–3.19 s (median 2.73 s), and an
21
+ * already-running box answers in 1.16–2.29 s (median 1.35 s). Prewarming buys
22
+ * ~1.4 s. The reason it matters is not latency: it is that a product which
23
+ * only ever provisions lazily, on a path whose guard never passes, never
24
+ * provisions AT ALL — and the UI then shows a spinner over a box that does not
25
+ * exist and is not being created. That is the failure this primitive removes.
26
+ *
27
+ * ── COST POSTURE (read before adopting) ────────────────────────────────────
28
+ * A warmed box is a REAL charge. It bills from creation until the platform's
29
+ * idle timeout reclaims it — `SandboxRuntimeConfig`'s create-time
30
+ * `idleTimeoutSeconds`, not anything this module sets. A product warming on
31
+ * every project open pays that timeout for every user who opens and bounces.
32
+ * With a 3600 s idle timeout against a ~131 s mean session life, a bounce
33
+ * costs an hour of box time to save ~1.4 s. THAT TRADE IS USUALLY WRONG.
34
+ *
35
+ * So the levers are explicit and the defaults are the cheap ones:
36
+ * - `mode: 'resume-only'` (DEFAULT) never creates a box that does not exist.
37
+ * It only revives one the user already has, so the spend is bounded by
38
+ * boxes the user already caused. This is the safe fleet default.
39
+ * - `mode: 'create-or-resume'` is the owner-requested behaviour — warm on
40
+ * open even for a first-time user. Opt in per product, and lower the
41
+ * shell's `idleTimeoutSeconds` when you do.
42
+ * - `shouldPrewarm(scope)` is the product's own policy hook (paid tier only,
43
+ * returning user only, has-documents only …). Returning false costs nothing.
44
+ * - `failureCooldownMs` stops a hard-failing workspace from retry-storming;
45
+ * every retry is another create attempt, which is more spend.
46
+ * Warm with the SAME harness the next turn will use. `ensureWorkspaceSandbox`
47
+ * DELETES and recreates a name-matched box whose harness differs, so warming
48
+ * `opencode` and then turning `claude-code` pays for two boxes and is slower
49
+ * than not warming at all. The prewarm key includes the harness so the two are
50
+ * never deduped into one.
51
+ *
52
+ * ── SINGLE-FLIGHT (measured, not assumed) ──────────────────────────────────
53
+ * The sandbox platform does NOT dedupe by box name. Two concurrent
54
+ * `POST /v1/sandboxes` with an identical name both returned HTTP 201 and left
55
+ * two running boxes (verified against staging-sandbox, 2026-07-28). So two
56
+ * tabs, or two isolates, racing a warm genuinely leak a box — a prewarm that
57
+ * races is worse than no prewarm. Hence two layers:
58
+ * 1. an in-process map, which is free and catches same-isolate races
59
+ * (double-mount, two requests on one isolate);
60
+ * 2. a `claim` store the product supplies, which is the only thing that can
61
+ * make this correct ACROSS isolates — the usual deployment target here is
62
+ * Cloudflare Workers, where "same isolate" guarantees nothing.
63
+ * `claim` is REQUIRED, with `'single-isolate-only'` as the explicit opt-out,
64
+ * so nobody gets the unsafe behaviour by forgetting a field. Say it out loud
65
+ * or supply a store.
66
+ *
67
+ * ── FAILURE IS LOUD, NEVER FATAL ───────────────────────────────────────────
68
+ * A failed warm degrades to exactly today's lazy path: the next real request
69
+ * calls `ensureWorkspaceSandbox` itself. It never throws into the caller's
70
+ * render path — `completion` RESOLVES with `{ ok: false }` rather than
71
+ * rejecting, because an unhandled rejection handed to `waitUntil` can fail the
72
+ * request it rode in on. But it is never silent: every failure fires
73
+ * `onEvent({ type: 'failed' })` and is readable afterwards through
74
+ * `readiness()` as `{ status: 'failed' }`. The bug class this whole module
75
+ * exists to kill is a soft failure that surfaces as an unusable panel ten
76
+ * minutes later, so a warm that dies must leave a trace a product can render.
77
+ */
78
+ import type { Harness } from '../harness/index';
79
+ import { type SandboxRuntimeConfig } from './index';
80
+ /** The workspace a warm targets. Mirrors `EnsureWorkspaceSandboxOptions`'
81
+ * identity fields — the prewarmer forwards them verbatim so a warmed box is
82
+ * byte-identical to the one the lazy path would have built. */
83
+ export interface SandboxPrewarmScope {
84
+ workspaceId: string;
85
+ userId?: string;
86
+ /** Must match the harness the next turn will use — see the cost note above. */
87
+ harness: Harness;
88
+ billingOwnerId?: string;
89
+ }
90
+ /**
91
+ * Cross-isolate claim. `acquire` must be atomic (a D1 conditional insert, a DO,
92
+ * a KV `put` with `onlyIf`) — a read-then-write is exactly the race this exists
93
+ * to close. `ttlSeconds` bounds a claim leaked by an isolate that died
94
+ * mid-warm; without expiry a single crash wedges a workspace forever.
95
+ */
96
+ export interface PrewarmClaimStore {
97
+ /** True when THIS caller now owns the right to warm `key`. */
98
+ acquire(key: string, ttlSeconds: number): Promise<boolean>;
99
+ /** Best-effort release. A throw here is swallowed — the TTL is the backstop. */
100
+ release(key: string): Promise<void>;
101
+ /** Optional: lets `readiness()` report `warming` for a warm running in
102
+ * ANOTHER isolate. Without it, `warming` is only visible in the isolate
103
+ * that started it, and every other one reports `absent`. */
104
+ isHeld?(key: string): Promise<boolean>;
105
+ }
106
+ /** What `prewarm()` decided. Every value except `started` means no box was
107
+ * created and nothing was spent on this call. */
108
+ export type PrewarmOutcome = 'started' | 'already-running' | 'already-warming' | 'warming-elsewhere' | 'declined-by-policy' | 'cooling-down' | 'absent-and-resume-only';
109
+ /** Terminal result of a warm this caller owns. Never a rejection. */
110
+ export interface PrewarmResult {
111
+ ok: boolean;
112
+ boxId?: string;
113
+ error?: string;
114
+ /** Wall time of the warm itself, for the product's own timing trace. */
115
+ ms: number;
116
+ }
117
+ export interface PrewarmDecision {
118
+ outcome: PrewarmOutcome;
119
+ /** Present ONLY when `outcome === 'started'`. Hand it to `ctx.waitUntil` so a
120
+ * client disconnect cannot kill the warm. Never rejects. */
121
+ completion?: Promise<PrewarmResult>;
122
+ }
123
+ /** Readiness for the UI. `ready`/`warming` reuse the vocabulary
124
+ * `createSandboxFileIndexRoute` (`/chat-routes`) and `useFileMentions`
125
+ * (`/web-react`) already speak, so a product renders ONE warming state rather
126
+ * than inventing a second spinner for boxes. */
127
+ export type SandboxReadiness = {
128
+ status: 'ready';
129
+ boxId: string;
130
+ } | {
131
+ status: 'warming';
132
+ } | {
133
+ status: 'absent';
134
+ } | {
135
+ status: 'failed';
136
+ error: string;
137
+ retryAfterMs: number;
138
+ };
139
+ export type PrewarmEvent = {
140
+ type: 'started';
141
+ key: string;
142
+ workspaceId: string;
143
+ } | {
144
+ type: 'succeeded';
145
+ key: string;
146
+ workspaceId: string;
147
+ boxId: string;
148
+ ms: number;
149
+ } | {
150
+ type: 'failed';
151
+ key: string;
152
+ workspaceId: string;
153
+ error: string;
154
+ ms: number;
155
+ } | {
156
+ type: 'skipped';
157
+ key: string;
158
+ workspaceId: string;
159
+ outcome: PrewarmOutcome;
160
+ };
161
+ export interface SandboxPrewarmerOptions {
162
+ /** Cross-isolate single-flight, or the explicit acknowledgement that you are
163
+ * accepting per-isolate dedupe only. No default — see the header. */
164
+ claim: PrewarmClaimStore | 'single-isolate-only';
165
+ /** `'resume-only'` (default) never creates a box that does not exist.
166
+ * `'create-or-resume'` warms from nothing — the expensive one. */
167
+ mode?: 'resume-only' | 'create-or-resume';
168
+ /** Product policy gate. Not called when a box is already running. */
169
+ shouldPrewarm?(scope: SandboxPrewarmScope): boolean | Promise<boolean>;
170
+ /** Observability seam. A failed warm MUST be visible somewhere. */
171
+ onEvent?(event: PrewarmEvent): void;
172
+ /** Claim lifetime. Default 180 s — comfortably over a cold create. */
173
+ claimTtlSeconds?: number;
174
+ /** Suppress re-warming a workspace that just failed. Default 60_000 ms. */
175
+ failureCooldownMs?: number;
176
+ /** Clock seam for tests. */
177
+ now?(): number;
178
+ }
179
+ export interface SandboxPrewarmer {
180
+ /**
181
+ * Non-blocking warm. The returned promise settles as soon as the DECISION is
182
+ * known (at most one `list()` against the platform, plus a claim `acquire`);
183
+ * the provisioning itself rides on `completion`. On a render path either
184
+ * ignore the returned promise or run the whole call inside `waitUntil` — do
185
+ * not await `completion` before responding.
186
+ */
187
+ prewarm(scope: SandboxPrewarmScope): Promise<PrewarmDecision>;
188
+ /** Zero-provisioning status read for a UI. Never creates or resumes. */
189
+ readiness(scope: SandboxPrewarmScope): Promise<SandboxReadiness>;
190
+ /** Clear a recorded failure so the next `prewarm` retries immediately. */
191
+ clearFailure(scope: SandboxPrewarmScope): void;
192
+ }
193
+ export declare function createSandboxPrewarmer(shell: SandboxRuntimeConfig, options: SandboxPrewarmerOptions): SandboxPrewarmer;