@tangle-network/agent-app 0.45.54 → 0.45.56

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 (492) 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/index.js +3 -3
  17. package/dist/assistant/launcher.d.ts +23 -0
  18. package/dist/assistant/persistence.d.ts +26 -0
  19. package/dist/assistant/presentation.d.ts +99 -0
  20. package/dist/assistant/provider-label.d.ts +7 -0
  21. package/dist/assistant/reducer.d.ts +130 -0
  22. package/dist/assistant/sse.d.ts +24 -0
  23. package/dist/assistant/time-ago.d.ts +6 -0
  24. package/dist/assistant/transcript.d.ts +97 -0
  25. package/dist/assistant/types.d.ts +291 -0
  26. package/dist/assistant/use-stick-to-bottom.d.ts +28 -0
  27. package/dist/assistant/useAssistantChat.d.ts +63 -0
  28. package/dist/assistant/useAssistantModels.d.ts +22 -0
  29. package/dist/assistant/useAssistantThreads.d.ts +47 -0
  30. package/dist/assistant/usePanelPrefs.d.ts +55 -0
  31. package/dist/billing/index.d.ts +19 -21
  32. package/dist/brand/index.d.ts +16 -10
  33. package/dist/brand-extraction/extract.d.ts +34 -0
  34. package/dist/brand-extraction/index.d.ts +12 -214
  35. package/dist/brand-extraction/map.d.ts +58 -0
  36. package/dist/brand-extraction/types.d.ts +119 -0
  37. package/dist/catalog/index.d.ts +11 -101
  38. package/dist/chat-react/composer-mode-controls.d.ts +14 -0
  39. package/dist/chat-react/entry-composer.d.ts +92 -0
  40. package/dist/chat-react/index.d.ts +22 -118
  41. package/dist/chat-react/index.js +2 -2
  42. package/dist/chat-react/types.d.ts +11 -0
  43. package/dist/chat-routes/attachment-store.d.ts +84 -0
  44. package/dist/chat-routes/attachment-upload.d.ts +89 -0
  45. package/dist/chat-routes/attachment-validation.d.ts +95 -0
  46. package/dist/chat-routes/binary-sniff.d.ts +45 -0
  47. package/dist/chat-routes/completed-sandbox-turn.d.ts +25 -0
  48. package/dist/chat-routes/detached-turn.d.ts +197 -0
  49. package/dist/chat-routes/dispatch-parts.d.ts +101 -0
  50. package/dist/chat-routes/draft-persistence.d.ts +189 -0
  51. package/dist/chat-routes/durable-projection.d.ts +18 -0
  52. package/dist/chat-routes/file-index.d.ts +115 -0
  53. package/dist/chat-routes/index.d.ts +25 -1840
  54. package/dist/chat-routes/index.js +6 -2
  55. package/dist/chat-routes/index.js.map +1 -1
  56. package/dist/chat-routes/model-failover-stream.d.ts +206 -0
  57. package/dist/chat-routes/promote-file-part.d.ts +84 -0
  58. package/dist/chat-routes/resolve-attachments.d.ts +72 -0
  59. package/dist/chat-routes/sandbox-producer.d.ts +146 -0
  60. package/dist/chat-routes/sandbox-turn-usage.d.ts +4 -0
  61. package/dist/{stale-turn-lock-DucQzvXu.d.ts → chat-routes/stale-turn-lock.d.ts} +7 -9
  62. package/dist/chat-routes/turn-routes.d.ts +540 -0
  63. package/dist/chat-routes/upload.d.ts +84 -0
  64. package/dist/{wire-DOZ-O6hD.d.ts → chat-routes/wire.d.ts} +41 -44
  65. package/dist/chat-store/core.d.ts +19 -0
  66. package/dist/chat-store/index.d.ts +22 -322
  67. package/dist/{parts-BqIHMdyu.d.ts → chat-store/parts.d.ts} +49 -47
  68. package/dist/chat-store/schema.d.ts +157 -0
  69. package/dist/chat-store/store.d.ts +177 -0
  70. package/dist/{chunk-PVP57G3S.js → chunk-2IFGVBNI.js} +2 -2
  71. package/dist/{chunk-MQO5ML66.js → chunk-KJ2Q27U7.js} +2 -2
  72. package/dist/{chunk-CCVG2TL6.js → chunk-YNMPMW3G.js} +64 -2
  73. package/dist/chunk-YNMPMW3G.js.map +1 -0
  74. package/dist/config/index.d.ts +13 -18
  75. package/dist/crypto/index.d.ts +10 -12
  76. package/dist/crypto/web-token.d.ts +22 -0
  77. package/dist/design-canvas/apply.d.ts +70 -0
  78. package/dist/design-canvas/drizzle-store.d.ts +29 -0
  79. package/dist/design-canvas/drizzle.d.ts +7 -575
  80. package/dist/{export-presets-mgVulRaV.d.ts → design-canvas/export-presets.d.ts} +18 -22
  81. package/dist/design-canvas/index.d.ts +22 -268
  82. package/dist/design-canvas/mcp-entry.d.ts +15 -0
  83. package/dist/design-canvas/mcp-handler.d.ts +34 -0
  84. package/dist/design-canvas/mcp-tools.d.ts +30 -0
  85. package/dist/{model-DnfO_PdJ.d.ts → design-canvas/model.d.ts} +33 -35
  86. package/dist/{operations-ByJ6yXOW.d.ts → design-canvas/operations.d.ts} +21 -25
  87. package/dist/design-canvas/schema.d.ts +558 -0
  88. package/dist/{store-CqfDtnPQ.d.ts → design-canvas/store.d.ts} +8 -12
  89. package/dist/design-canvas/templates.d.ts +72 -0
  90. package/dist/design-canvas/validate.d.ts +32 -0
  91. package/dist/design-canvas-react/components/BleedTrimOverlay.d.ts +22 -0
  92. package/dist/design-canvas-react/components/BrandKnot.d.ts +11 -0
  93. package/dist/design-canvas-react/components/CanvasEmptyState.d.ts +32 -0
  94. package/dist/design-canvas-react/components/CanvasInsertPanel.d.ts +53 -0
  95. package/dist/{lazy-DrkVyDpe.d.ts → design-canvas-react/components/DesignCanvas.d.ts} +27 -20
  96. package/dist/design-canvas-react/components/DesignCanvasEditor.d.ts +23 -0
  97. package/dist/design-canvas-react/components/ElementNode.d.ts +51 -0
  98. package/dist/design-canvas-react/components/ExportControl.d.ts +21 -0
  99. package/dist/design-canvas-react/components/GridLayer.d.ts +47 -0
  100. package/dist/design-canvas-react/components/InlineTextEditor.d.ts +25 -0
  101. package/dist/design-canvas-react/components/LayersPanel.d.ts +20 -0
  102. package/dist/design-canvas-react/components/PagesStrip.d.ts +34 -0
  103. package/dist/design-canvas-react/components/Rulers.d.ts +31 -0
  104. package/dist/design-canvas-react/components/SelectionLayer.d.ts +51 -0
  105. package/dist/design-canvas-react/components/SnapGuidesOverlay.d.ts +25 -0
  106. package/dist/design-canvas-react/components/Toolbar.d.ts +64 -0
  107. package/dist/design-canvas-react/components/Workspace.d.ts +92 -0
  108. package/dist/design-canvas-react/components/ZoomControls.d.ts +14 -0
  109. package/dist/design-canvas-react/components/glyphs.d.ts +46 -0
  110. package/dist/design-canvas-react/components/icon-button.d.ts +22 -0
  111. package/dist/design-canvas-react/components/index.d.ts +27 -0
  112. package/dist/design-canvas-react/components/layer-tree.d.ts +34 -0
  113. package/dist/design-canvas-react/components/ruler-math.d.ts +78 -0
  114. package/dist/design-canvas-react/components/transform-math.d.ts +168 -0
  115. package/dist/{command-stack-TNPWJCzW.d.ts → design-canvas-react/contracts.d.ts} +16 -63
  116. package/dist/design-canvas-react/engine/command-stack.d.ts +43 -0
  117. package/dist/design-canvas-react/engine/commands.d.ts +154 -0
  118. package/dist/design-canvas-react/engine/selection.d.ts +48 -0
  119. package/dist/design-canvas-react/engine/snap.d.ts +24 -0
  120. package/dist/design-canvas-react/engine/zoom-pan.d.ts +18 -0
  121. package/dist/design-canvas-react/engine.d.ts +21 -399
  122. package/dist/design-canvas-react/export-math.d.ts +104 -0
  123. package/dist/design-canvas-react/export.d.ts +89 -0
  124. package/dist/design-canvas-react/index.d.ts +16 -586
  125. package/dist/design-canvas-react/insert-builders.d.ts +61 -0
  126. package/dist/design-canvas-react/lazy.d.ts +21 -6
  127. package/dist/documents/docx.d.ts +50 -0
  128. package/dist/documents/extract.d.ts +87 -0
  129. package/dist/documents/index.d.ts +26 -232
  130. package/dist/documents/media-type.d.ts +33 -0
  131. package/dist/documents/pdf-inspector.d.ts +5 -9
  132. package/dist/{types-DrBidf3O.d.ts → documents/types.d.ts} +13 -15
  133. package/dist/documents/zip.d.ts +56 -0
  134. package/dist/eval/calibration.d.ts +106 -0
  135. package/dist/eval/index.d.ts +8 -116
  136. package/dist/eval-campaign/index.d.ts +11 -12
  137. package/dist/{trust-gate-Dcm5xSva.d.ts → eval-campaign/trust-gate.d.ts} +5 -9
  138. package/dist/forms/blank.d.ts +48 -0
  139. package/dist/forms/fill.d.ts +105 -0
  140. package/dist/forms/index.d.ts +58 -332
  141. package/dist/forms/registry.d.ts +115 -0
  142. package/dist/forms/verify.d.ts +58 -0
  143. package/dist/harness/index.d.ts +21 -19
  144. package/dist/intakes/api.d.ts +5 -11
  145. package/dist/{completion-CvcNUz07.d.ts → intakes/completion.d.ts} +7 -11
  146. package/dist/intakes/context-sufficiency.d.ts +113 -0
  147. package/dist/intakes/drizzle/schema.d.ts +338 -0
  148. package/dist/intakes/drizzle/store.d.ts +75 -0
  149. package/dist/intakes/drizzle.d.ts +12 -391
  150. package/dist/intakes/index.d.ts +23 -113
  151. package/dist/{model-C8U0HZxL.d.ts → intakes/model.d.ts} +15 -17
  152. package/dist/intakes-react/components/BrandMark.d.ts +10 -0
  153. package/dist/intakes-react/components/IntakeInterview.d.ts +15 -0
  154. package/dist/intakes-react/components/index.d.ts +1 -0
  155. package/dist/intakes-react/contracts.d.ts +42 -0
  156. package/dist/intakes-react/index.d.ts +12 -47
  157. package/dist/intakes-react/lazy.d.ts +9 -8
  158. package/dist/integrations/index.d.ts +10 -12
  159. package/dist/{contract-OxG_jVMx.d.ts → interactions/contract.d.ts} +40 -42
  160. package/dist/interactions/index.d.ts +16 -256
  161. package/dist/interactions/route.d.ts +151 -0
  162. package/dist/interactions/sidecar.d.ts +100 -0
  163. package/dist/knowledge/index.d.ts +7 -11
  164. package/dist/knowledge-loop/index.d.ts +13 -20
  165. package/dist/legibility/checks/empty-state.d.ts +59 -0
  166. package/dist/legibility/checks/reachability.d.ts +103 -0
  167. package/dist/legibility/checks/silent-failure.d.ts +57 -0
  168. package/dist/legibility/checks/success.d.ts +38 -0
  169. package/dist/legibility/checks/vocabulary.d.ts +65 -0
  170. package/dist/legibility/cli-args.d.ts +30 -0
  171. package/dist/legibility/cli.d.ts +25 -0
  172. package/dist/legibility/index.d.ts +10 -530
  173. package/dist/legibility/report.d.ts +22 -0
  174. package/dist/legibility/scan.d.ts +29 -0
  175. package/dist/legibility/source.d.ts +132 -0
  176. package/dist/legibility/suppress.d.ts +36 -0
  177. package/dist/legibility/types.d.ts +168 -0
  178. package/dist/legibility/walk-sources.d.ts +21 -0
  179. package/dist/{agent-activity-C8ZG0F0M.d.ts → missions/agent-activity.d.ts} +3 -5
  180. package/dist/missions/engine.d.ts +251 -0
  181. package/dist/missions/events.d.ts +195 -0
  182. package/dist/missions/index.d.ts +12 -765
  183. package/dist/missions/plan-parse.d.ts +50 -0
  184. package/dist/missions/service.d.ts +265 -0
  185. package/dist/{failover-D-3UXXTb.d.ts → model-resolution/failover.d.ts} +10 -12
  186. package/dist/model-resolution/index.d.ts +15 -18
  187. package/dist/object-store/index.d.ts +15 -17
  188. package/dist/openui/action.d.ts +54 -0
  189. package/dist/openui/authoring.d.ts +25 -0
  190. package/dist/openui/index.d.ts +24 -206
  191. package/dist/openui/route.d.ts +124 -0
  192. package/dist/openui/segments.d.ts +71 -0
  193. package/dist/openui/values.d.ts +82 -0
  194. package/dist/openui-react/index.d.ts +9 -13
  195. package/dist/peer-floors/check.d.ts +9 -190
  196. package/dist/peer-floors/cli.d.ts +2 -3
  197. package/dist/peer-floors/dependency-source.d.ts +178 -0
  198. package/dist/plans/index.d.ts +13 -14
  199. package/dist/{billing-BuNlaKlE.d.ts → platform/billing.d.ts} +28 -32
  200. package/dist/platform/guards.d.ts +79 -0
  201. package/dist/platform/hub.d.ts +107 -0
  202. package/dist/platform/index.d.ts +7 -112
  203. package/dist/{sso-Cm00S61u.d.ts → platform/sso.d.ts} +15 -97
  204. package/dist/preflight/cli.d.ts +3 -6
  205. package/dist/preflight/index.d.ts +16 -18
  206. package/dist/preset-cloudflare/headers.d.ts +12 -0
  207. package/dist/preset-cloudflare/index.d.ts +22 -74
  208. package/dist/preset-cloudflare/workflow-instance.d.ts +35 -0
  209. package/dist/profile/budget.d.ts +72 -0
  210. package/dist/profile/fingerprint.d.ts +65 -0
  211. package/dist/profile/index.d.ts +27 -19
  212. package/dist/prompt/index.d.ts +3 -5
  213. package/dist/record/drizzle/schema.d.ts +488 -0
  214. package/dist/record/drizzle/store.d.ts +224 -0
  215. package/dist/record/drizzle.d.ts +10 -679
  216. package/dist/record/fold.d.ts +99 -0
  217. package/dist/record/index.d.ts +13 -13
  218. package/dist/{fold-DACU7gtf.d.ts → record/model.d.ts} +22 -124
  219. package/dist/record/ulid.d.ts +12 -0
  220. package/dist/redact/index.d.ts +14 -16
  221. package/dist/run/index.d.ts +11 -16
  222. package/dist/runtime/agent.d.ts +23 -0
  223. package/dist/runtime/certified-delivery.d.ts +57 -0
  224. package/dist/runtime/index.d.ts +17 -367
  225. package/dist/runtime/loop.d.ts +58 -0
  226. package/dist/runtime/model-catalog.d.ts +103 -0
  227. package/dist/{model-CdCDfBA9.d.ts → runtime/model.d.ts} +25 -27
  228. package/dist/runtime/openai-stream.d.ts +126 -0
  229. package/dist/runtime/surface-profile.d.ts +115 -0
  230. package/dist/sandbox/binary-read.d.ts +63 -0
  231. package/dist/sandbox/diagnostics.d.ts +69 -0
  232. package/dist/sandbox/index.d.ts +103 -1085
  233. package/dist/sandbox/model.d.ts +179 -0
  234. package/dist/sandbox/outcome.d.ts +10 -0
  235. package/dist/sandbox/prewarm-claim-d1.d.ts +80 -0
  236. package/dist/sandbox/prewarm.d.ts +193 -0
  237. package/dist/sandbox/recovery.d.ts +216 -0
  238. package/dist/sandbox/terminal-connection.d.ts +145 -0
  239. package/dist/sandbox/workspace-sandbox-manager.d.ts +44 -0
  240. package/dist/sequences/apply.d.ts +54 -0
  241. package/dist/sequences/captions.d.ts +91 -0
  242. package/dist/sequences/drizzle-store.d.ts +36 -0
  243. package/dist/sequences/drizzle.d.ts +7 -1252
  244. package/dist/sequences/exports.d.ts +138 -0
  245. package/dist/sequences/index.d.ts +19 -340
  246. package/dist/sequences/mcp-entry.d.ts +15 -0
  247. package/dist/sequences/mcp-handler.d.ts +39 -0
  248. package/dist/sequences/mcp-tools.d.ts +47 -0
  249. package/dist/{store-B7LLlk9p.d.ts → sequences/model.d.ts} +26 -110
  250. package/dist/sequences/operations.d.ts +126 -0
  251. package/dist/sequences/schema.d.ts +1231 -0
  252. package/dist/sequences/store.d.ts +81 -0
  253. package/dist/sequences/validate.d.ts +98 -0
  254. package/dist/sequences-react/components/BrandMark.d.ts +10 -0
  255. package/dist/sequences-react/components/PreviewCanvas.d.ts +26 -0
  256. package/dist/sequences-react/components/SnapIndicatorLine.d.ts +11 -0
  257. package/dist/sequences-react/components/TimelineClipChip.d.ts +80 -0
  258. package/dist/sequences-react/components/TimelineEditor.d.ts +44 -0
  259. package/dist/sequences-react/components/TimelineEmptyState.d.ts +21 -0
  260. package/dist/sequences-react/components/TimelineGhostLanes.d.ts +14 -0
  261. package/dist/sequences-react/components/TimelinePlayhead.d.ts +11 -0
  262. package/dist/sequences-react/components/TimelineRuler.d.ts +16 -0
  263. package/dist/sequences-react/components/TimelineSmallScreenGate.d.ts +12 -0
  264. package/dist/sequences-react/components/TimelineTrackRow.d.ts +51 -0
  265. package/dist/sequences-react/components/ZoomControl.d.ts +15 -0
  266. package/dist/sequences-react/components/composite-command.d.ts +8 -0
  267. package/dist/sequences-react/components/glyphs.d.ts +26 -0
  268. package/dist/sequences-react/components/index.d.ts +31 -0
  269. package/dist/sequences-react/components/interaction-math.d.ts +103 -0
  270. package/dist/sequences-react/contracts.d.ts +187 -0
  271. package/dist/sequences-react/engine/command-stack.d.ts +18 -0
  272. package/dist/sequences-react/engine/commands.d.ts +146 -0
  273. package/dist/sequences-react/engine/playback.d.ts +18 -0
  274. package/dist/sequences-react/engine/snap.d.ts +29 -0
  275. package/dist/sequences-react/engine/zoom.d.ts +29 -0
  276. package/dist/sequences-react/index.d.ts +20 -880
  277. package/dist/sequences-react/lazy.d.ts +8 -0
  278. package/dist/sequences-react/media/frame-provider.d.ts +70 -0
  279. package/dist/sequences-react/media/transcription.d.ts +33 -0
  280. package/dist/sequences-react/media/waveform.d.ts +34 -0
  281. package/dist/session-shell/index.d.ts +31 -204
  282. package/dist/session-shell/nav-guard.d.ts +170 -0
  283. package/dist/session-shell/path.d.ts +19 -0
  284. package/dist/signoff/cli.d.ts +4 -7
  285. package/dist/signoff/config.d.ts +12 -0
  286. package/dist/signoff/exec.d.ts +44 -0
  287. package/dist/signoff/index.d.ts +56 -14
  288. package/dist/signoff/invoked-as-script.d.ts +25 -0
  289. package/dist/signoff/node-version.d.ts +50 -0
  290. package/dist/signoff/proof-attach.d.ts +88 -0
  291. package/dist/signoff/proof-cli.d.ts +1 -0
  292. package/dist/signoff/proof-fixture.d.ts +13 -0
  293. package/dist/signoff/proof-from-report.d.ts +22 -0
  294. package/dist/signoff/proof-git.d.ts +57 -0
  295. package/dist/signoff/proof-record.d.ts +202 -0
  296. package/dist/signoff/proof-verify.d.ts +103 -0
  297. package/dist/signoff/proof.d.ts +35 -310
  298. package/dist/signoff/report.d.ts +7 -0
  299. package/dist/{run-D80hoLKh.d.ts → signoff/run.d.ts} +3 -6
  300. package/dist/signoff/schedule.d.ts +55 -0
  301. package/dist/signoff/seeds.d.ts +50 -0
  302. package/dist/signoff/store.d.ts +22 -0
  303. package/dist/{types-Bd6uW9vQ.d.ts → signoff/types.d.ts} +15 -17
  304. package/dist/signoff/workflow-pin.d.ts +56 -0
  305. package/dist/signoff/workspace.d.ts +40 -0
  306. package/dist/skills/index.d.ts +28 -32
  307. package/dist/skills-placement/index.d.ts +7 -11
  308. package/dist/spend/budget.d.ts +123 -0
  309. package/dist/spend/ceiling.d.ts +51 -0
  310. package/dist/spend/cli-args.d.ts +20 -0
  311. package/dist/spend/cli.d.ts +1 -0
  312. package/dist/spend/fixtures/incident-parked-time.d.ts +55 -0
  313. package/dist/spend/index.d.ts +38 -1144
  314. package/dist/spend/liveness.d.ts +131 -0
  315. package/dist/spend/ownership.d.ts +87 -0
  316. package/dist/spend/reconcile.d.ts +109 -0
  317. package/dist/spend/reference.d.ts +42 -0
  318. package/dist/spend/report.d.ts +12 -0
  319. package/dist/spend/store.d.ts +123 -0
  320. package/dist/spend/types.d.ts +466 -0
  321. package/dist/store/index.d.ts +10 -12
  322. package/dist/stories/app-shell/fixtures.d.ts +43 -0
  323. package/dist/stories/app-shell/shell.d.ts +81 -0
  324. package/dist/stories/assistant/fixtures.d.ts +73 -0
  325. package/dist/stories/chat/fixtures.d.ts +70 -0
  326. package/dist/stories/chat/markdown.d.ts +11 -0
  327. package/dist/stories/chat/run-drill-in.d.ts +19 -0
  328. package/dist/stories/chat-controls/fixtures.d.ts +116 -0
  329. package/dist/stories/design-canvas/fixtures.d.ts +57 -0
  330. package/dist/stories/fixtures/canvas.d.ts +10 -0
  331. package/dist/stories/fixtures/catalog.d.ts +7 -0
  332. package/dist/stories/fixtures/chat.d.ts +39 -0
  333. package/dist/stories/fixtures/index.d.ts +4 -0
  334. package/dist/stories/fixtures/sequences.d.ts +17 -0
  335. package/dist/stories/panels/fixtures.d.ts +63 -0
  336. package/dist/stories/sequences/fixtures.d.ts +30 -0
  337. package/dist/stories/studio/fixtures.d.ts +22 -0
  338. package/dist/stream/index.d.ts +10 -56
  339. package/dist/{stream-normalizer-DKRxyVlZ.d.ts → stream/stream-normalizer.d.ts} +23 -26
  340. package/dist/{turn-buffer-COMQUwO2.d.ts → stream/turn-buffer.d.ts} +21 -23
  341. package/dist/stream/turn-identity.d.ts +49 -0
  342. package/dist/studio/generation.d.ts +179 -0
  343. package/dist/studio/index.d.ts +12 -181
  344. package/dist/studio-react/avatar-composer.d.ts +8 -0
  345. package/dist/studio-react/composer-hero.d.ts +12 -0
  346. package/dist/studio-react/composer-shell.d.ts +18 -0
  347. package/dist/studio-react/generation-card.d.ts +9 -0
  348. package/dist/studio-react/generation-detail-modal.d.ts +11 -0
  349. package/dist/studio-react/generation-detail.d.ts +6 -0
  350. package/dist/studio-react/generation-grid.d.ts +15 -0
  351. package/dist/studio-react/image-composer.d.ts +8 -0
  352. package/dist/studio-react/index.d.ts +32 -245
  353. package/dist/studio-react/library-drawer.d.ts +12 -0
  354. package/dist/studio-react/library-panel.d.ts +15 -0
  355. package/dist/studio-react/publish-package-composer.d.ts +18 -0
  356. package/dist/studio-react/result-canvas.d.ts +6 -0
  357. package/dist/studio-react/speech-composer.d.ts +4 -0
  358. package/dist/studio-react/studio-header.d.ts +5 -0
  359. package/dist/studio-react/studio-sheet.d.ts +12 -0
  360. package/dist/studio-react/studio-workspace.d.ts +23 -0
  361. package/dist/studio-react/transcription-composer.d.ts +12 -0
  362. package/dist/studio-react/type-config.d.ts +11 -0
  363. package/dist/studio-react/use-studio-generations.d.ts +20 -0
  364. package/dist/studio-react/video-composer.d.ts +10 -0
  365. package/dist/tangle/index.d.ts +7 -9
  366. package/dist/teams/drizzle/access.d.ts +82 -0
  367. package/dist/{invitations-schema-_fI7HkJP.d.ts → teams/drizzle/invitations-schema.d.ts} +39 -27
  368. package/dist/teams/drizzle/personal-organization.d.ts +41 -0
  369. package/dist/{access-490O6aOU.d.ts → teams/drizzle/schema.d.ts} +57 -122
  370. package/dist/teams/drizzle.d.ts +12 -44
  371. package/dist/teams/index.d.ts +20 -44
  372. package/dist/teams/invitations-api.d.ts +17 -21
  373. package/dist/{invitations-DoYMvXea.d.ts → teams/invitations.d.ts} +14 -18
  374. package/dist/teams/invite.d.ts +42 -0
  375. package/dist/teams/members-api.d.ts +12 -16
  376. package/dist/teams/resend.d.ts +3 -13
  377. package/dist/{roles-B4nU3jDi.d.ts → teams/roles.d.ts} +18 -20
  378. package/dist/teams-react/components/BrandMark.d.ts +10 -0
  379. package/dist/teams-react/components/InvitationsPanel.d.ts +13 -0
  380. package/dist/teams-react/components/InviteAcceptPage.d.ts +10 -0
  381. package/dist/teams-react/components/MembersPanel.d.ts +14 -0
  382. package/dist/teams-react/components/RoleSelect.d.ts +17 -0
  383. package/dist/teams-react/components/index.d.ts +3 -0
  384. package/dist/teams-react/contracts.d.ts +134 -0
  385. package/dist/teams-react/index.d.ts +12 -143
  386. package/dist/teams-react/lazy.d.ts +11 -11
  387. package/dist/test-setup.d.ts +1 -0
  388. package/dist/theme/index.d.ts +6 -104
  389. package/dist/theme/tailwind-preset.d.ts +1 -2
  390. package/dist/theme/theme.d.ts +106 -0
  391. package/dist/theme-contract/cli.d.ts +21 -0
  392. package/dist/theme-contract/index.d.ts +4 -6
  393. package/dist/{auth-BYtiazA4.d.ts → tools/auth.d.ts} +8 -11
  394. package/dist/tools/capability.d.ts +54 -0
  395. package/dist/tools/dispatch.d.ts +37 -0
  396. package/dist/tools/errors.d.ts +8 -0
  397. package/dist/tools/gating.d.ts +62 -0
  398. package/dist/tools/http.d.ts +27 -0
  399. package/dist/tools/index.d.ts +12 -217
  400. package/dist/{mcp-rpc-DYwPlYbZ.d.ts → tools/mcp-rpc.d.ts} +7 -9
  401. package/dist/{mcp-xxoZZfor.d.ts → tools/mcp.d.ts} +14 -16
  402. package/dist/tools/openai.d.ts +28 -0
  403. package/dist/tools/registry.d.ts +39 -0
  404. package/dist/tools/runtime.d.ts +22 -0
  405. package/dist/{types-B25Mib1r.d.ts → tools/types.d.ts} +15 -83
  406. package/dist/{flow-types-CJxEmaRy.d.ts → trace/flow-types.d.ts} +2 -4
  407. package/dist/trace/index.d.ts +11 -148
  408. package/dist/trace/mission-flow.d.ts +82 -0
  409. package/dist/trace/mission-trace.d.ts +52 -0
  410. package/dist/turn-health/classify.d.ts +207 -0
  411. package/dist/turn-health/index.d.ts +29 -637
  412. package/dist/turn-health/lifecycle.d.ts +75 -0
  413. package/dist/turn-health/sink.d.ts +122 -0
  414. package/dist/turn-health/sweep.d.ts +245 -0
  415. package/dist/turn-stream/adapters.d.ts +257 -0
  416. package/dist/turn-stream/core.d.ts +293 -0
  417. package/dist/turn-stream/do.d.ts +144 -0
  418. package/dist/turn-stream/index.d.ts +62 -738
  419. package/dist/turn-stream/memory.d.ts +41 -0
  420. package/dist/vault/ConfirmDialog.d.ts +22 -0
  421. package/dist/vault/VaultPane.d.ts +15 -0
  422. package/dist/{VaultPane-BDP6SB_K.d.ts → vault/contracts.d.ts} +15 -22
  423. package/dist/vault/index.d.ts +15 -22
  424. package/dist/vault/lazy.d.ts +9 -7
  425. package/dist/vault/server.d.ts +8 -10
  426. package/dist/web/free-route-limit.d.ts +187 -0
  427. package/dist/web/index.d.ts +15 -207
  428. package/dist/{rate-limit-BOVmJRXZ.d.ts → web/rate-limit.d.ts} +3 -5
  429. package/dist/web-react/agent-session-controls.d.ts +105 -0
  430. package/dist/web-react/async/async-view.d.ts +69 -0
  431. package/dist/web-react/async/index.d.ts +13 -305
  432. package/dist/web-react/async/state.d.ts +107 -0
  433. package/dist/web-react/async/use-async-resource.d.ts +41 -0
  434. package/dist/web-react/async/use-confirmed-mutation.d.ts +90 -0
  435. package/dist/web-react/brand-mark.d.ts +11 -0
  436. package/dist/web-react/chat-attachments.d.ts +21 -0
  437. package/dist/web-react/chat-composer.d.ts +174 -0
  438. package/dist/web-react/chat-interactions.d.ts +1 -0
  439. package/dist/web-react/chat-mentions.d.ts +48 -0
  440. package/dist/web-react/chat-stream.d.ts +106 -0
  441. package/dist/web-react/class-names.d.ts +10 -0
  442. package/dist/web-react/controls.d.ts +265 -0
  443. package/dist/web-react/durable-chat-cards.d.ts +40 -0
  444. package/dist/web-react/durable-interaction-submit.d.ts +22 -0
  445. package/dist/web-react/durable-plan-card.d.ts +13 -0
  446. package/dist/web-react/durable-plan-flow.d.ts +77 -0
  447. package/dist/web-react/harness-glyphs.d.ts +28 -0
  448. package/dist/web-react/index.d.ts +80 -2347
  449. package/dist/web-react/index.js +3 -3
  450. package/dist/web-react/inert.d.ts +39 -0
  451. package/dist/web-react/insight-card.d.ts +203 -0
  452. package/dist/web-react/interaction-card-support.d.ts +115 -0
  453. package/dist/web-react/interaction-plan-card.d.ts +39 -0
  454. package/dist/web-react/interaction-question-card.d.ts +100 -0
  455. package/dist/web-react/message-attachments.d.ts +56 -0
  456. package/dist/web-react/mission-activity.d.ts +96 -0
  457. package/dist/web-react/motion.d.ts +43 -0
  458. package/dist/web-react/provenance-model.d.ts +195 -0
  459. package/dist/web-react/provenance.d.ts +82 -0
  460. package/dist/web-react/provider-logo.d.ts +14 -0
  461. package/dist/web-react/record-grid-model.d.ts +257 -0
  462. package/dist/web-react/record-grid.d.ts +108 -0
  463. package/dist/web-react/sandbox-terminal.d.ts +90 -0
  464. package/dist/web-react/seat-paywall.d.ts +47 -0
  465. package/dist/web-react/session-history.d.ts +196 -0
  466. package/dist/web-react/smooth-text.d.ts +29 -0
  467. package/dist/web-react/sparkline.d.ts +150 -0
  468. package/dist/web-react/terminal.d.ts +1 -92
  469. package/dist/web-react/use-chat-interactions.d.ts +78 -0
  470. package/dist/web-react/use-composer-attachments.d.ts +111 -0
  471. package/dist/web-react/use-file-mentions.d.ts +94 -0
  472. package/dist/web-react/work-product.d.ts +105 -0
  473. package/dist/work-product/claim-support.d.ts +288 -0
  474. package/dist/work-product/index.d.ts +16 -849
  475. package/dist/work-product/provenance.d.ts +61 -0
  476. package/dist/{queue-VTBA5ONX.d.ts → work-product/queue.d.ts} +10 -12
  477. package/dist/work-product/quote.d.ts +139 -0
  478. package/dist/work-product/route.d.ts +88 -0
  479. package/dist/work-product/service.d.ts +123 -0
  480. package/dist/work-product/tools.d.ts +144 -0
  481. package/dist/{types-CCeYywdS.d.ts → work-product/types.d.ts} +29 -31
  482. package/dist/work-product-react/index.d.ts +19 -8
  483. package/dist/workspace-react/index.d.ts +8 -11
  484. package/package.json +4 -3
  485. package/dist/agent-session-controls-CmlXwp_H.d.ts +0 -384
  486. package/dist/apply-6wlMOLf8.d.ts +0 -280
  487. package/dist/attachment-validation-BfJDBU1g.d.ts +0 -261
  488. package/dist/budget-BOucfcb_.d.ts +0 -142
  489. package/dist/chunk-CCVG2TL6.js.map +0 -1
  490. package/dist/values-C7RidJuI.d.ts +0 -156
  491. /package/dist/{chunk-PVP57G3S.js.map → chunk-2IFGVBNI.js.map} +0 -0
  492. /package/dist/{chunk-MQO5ML66.js.map → chunk-KJ2Q27U7.js.map} +0 -0
@@ -1,261 +0,0 @@
1
- import { F as FileMention } from './wire-DOZ-O6hD.js';
2
-
3
- /**
4
- * `createSandboxFileIndexRoute` — server side of `@`-file-mentions
5
- * (companion to sandbox-ui#184's composer mention primitive). Serves a flat,
6
- * ignore-filtered listing of the workspace sandbox so `useFileMentions`
7
- * (`/web-react`) can filter it client-side without a round trip per
8
- * keystroke.
9
- *
10
- * Same seam style as `createUploadRoute`: `authorize({ request })` resolves a
11
- * structural `{ tree(path, opts) }` handle (the shape of the sandbox SDK's
12
- * `box.fs.tree`) — no SDK import here. `authorize` also carries the
13
- * cold-box signal: a sandbox that isn't running yet answers `{ status:
14
- * 'warming' }` directly, never provisions-and-waits inside this route.
15
- *
16
- * A box can also be running with its workspace root not yet materialised, which
17
- * `authorize` cannot see; the route recognises that one signal off `fs.tree`
18
- * and answers `warming` too, so every consumer gets the retry-and-wait state
19
- * instead of a 500. Every other `tree()` failure propagates.
20
- */
21
-
22
- /** One entry from a structural `tree()` scan. Mirrors the sandbox SDK's
23
- * `FileTreeFile` (`path`, `size`, `mtime`) — `mtime` is unused here so it's
24
- * omitted from the structural match. */
25
- interface SandboxTreeFile {
26
- path: string;
27
- size: number;
28
- }
29
- /** Structural match of the sandbox SDK's `box.fs.tree` result shape
30
- * (`FileTreeResult`). `stats.truncated` is the only stat this route reads;
31
- * the rest ride through unread on the real SDK type. */
32
- interface SandboxTreeResult {
33
- root: string;
34
- files: SandboxTreeFile[];
35
- stats: {
36
- truncated: boolean;
37
- };
38
- }
39
- /** Structural match of the sandbox SDK's `box.fs` tree surface. */
40
- interface SandboxFileTreeSource {
41
- tree(path: string, options?: {
42
- maxDepth?: number;
43
- }): Promise<SandboxTreeResult>;
44
- }
45
- /** Describe a ready file index response with workspace-relative entries and truncation status */
46
- interface FileIndexReadyResponse {
47
- status: 'ready';
48
- /** Workspace-relative entries. Same shape as `FileMention` (`./wire`) so a
49
- * client can hand a response entry straight to `fileMentionsToParts` /
50
- * `buildMentionPromptBlock` without remapping. */
51
- files: FileMention[];
52
- /** True when either the underlying scan truncated (SDK-side cap) or this
53
- * route's own `maxEntries` cap trimmed the filtered list. The client
54
- * should show "showing first N files" rather than imply completeness. */
55
- truncated: boolean;
56
- generatedAt: string;
57
- }
58
- /** Cold-box answer: no provisioning happened, no files were scanned. The
59
- * client shows a warming state and retries — this route never blocks on a
60
- * box coming up. Two situations produce it: `authorize` reporting a box that
61
- * is not running, and a running box whose workspace root does not exist yet
62
- * (see `isMissingRootError`). */
63
- interface FileIndexWarmingResponse {
64
- status: 'warming';
65
- }
66
- /** Resolve a response indicating the file index is either ready or warming up */
67
- type FileIndexResponse = FileIndexReadyResponse | FileIndexWarmingResponse;
68
- /** Short-TTL cache seam so repeat popover opens in the same session don't
69
- * re-scan the workspace. Host-provided (e.g. a KV binding); `key` is
70
- * whatever `authorize` returns as `cacheKey` — this route treats it opaquely. */
71
- interface FileIndexCache {
72
- get(key: string): Promise<FileIndexReadyResponse | null> | FileIndexReadyResponse | null;
73
- put(key: string, value: FileIndexReadyResponse, options?: {
74
- ttlSeconds?: number;
75
- }): Promise<void> | void;
76
- }
77
- /** Define authorization details and parameters for indexing a file workspace with optional caching and ignore rules */
78
- type FileIndexAuthorization = {
79
- status: 'ready';
80
- /** Structural sandbox `fs` handle, usually `ensureWorkspaceSandbox(...)` → `box.fs`. */
81
- fs: SandboxFileTreeSource;
82
- /** Workspace root to index (e.g. `/home/agent`). */
83
- root: string;
84
- /** Extra ignore segments for this request, merged with the route's
85
- * defaults + `CreateSandboxFileIndexRouteOptions.ignore`. */
86
- ignore?: string[];
87
- /** Opaque cache key for the optional cache seam. Omit to skip caching
88
- * for this request (e.g. a workspace the host chooses not to cache). */
89
- cacheKey?: string;
90
- } | {
91
- status: 'warming';
92
- } | {
93
- status: 'denied';
94
- response: Response;
95
- };
96
- /** Define options to authorize and configure sandbox file index route behavior */
97
- interface CreateSandboxFileIndexRouteOptions {
98
- /** Authenticate the caller, resolve the sandbox `fs` handle, and signal a
99
- * cold box — never provisions or waits. */
100
- authorize(args: {
101
- request: Request;
102
- }): Promise<FileIndexAuthorization>;
103
- /** Extra ignore segments beyond the route's defaults (node_modules, .git,
104
- * dotfiles/dot-dirs, common build dirs). Matched as exact path-segment
105
- * names, same rule as the defaults. */
106
- ignore?: string[];
107
- /** Passed to `fs.tree` as `options.maxDepth`. Default 12. */
108
- maxDepth?: number;
109
- /** Hard cap on entries returned after filtering. Default 5000. */
110
- maxEntries?: number;
111
- /** Optional host-provided cache seam. */
112
- cache?: FileIndexCache;
113
- /** Cache TTL in seconds when `cache` is set. Default 20. */
114
- cacheTtlSeconds?: number;
115
- }
116
- /** Resolve a sandbox file index route with authorization, caching, and configurable depth and entries limits */
117
- declare function createSandboxFileIndexRoute(options: CreateSandboxFileIndexRouteOptions): (request: Request) => Promise<Response>;
118
-
119
- /**
120
- * Content-based binary/text classification, shared by the attachment upload
121
- * route (server) and the composer's client-side pre-validation (browser) —
122
- * both sides must agree on what counts as binary before a byte ever leaves
123
- * the client. Extension-based allowlists lie (a renamed `.docx`, a PNG saved
124
- * as `.txt`), so classification reads the actual bytes: a magic-byte table
125
- * for common binary formats first, then a UTF-8 decode attempt for
126
- * everything else. Two families need more than a fixed-offset signature and
127
- * get a reader of their own — ISO-BMFF brands (`sniffFtyp`) and OOXML Office
128
- * packages, whose PKZIP container is shared with every other `.zip`
129
- * (`sniffOoxml`).
130
- *
131
- * Lifted near-verbatim from gtm-agent's `src/lib/binary-sniff.ts` (the
132
- * source PRs hardened this against real corruption/gate bugs: gtm#584,
133
- * gtm#592). Import-free by design — `/web-react` re-exports `/chat-routes`
134
- * modules into browser bundles (`tests/browser-safe-subpaths.test.ts` walks
135
- * the graph), so nothing here may reach a Node builtin or an engine package.
136
- */
137
- interface SniffResult {
138
- binary: boolean;
139
- mime: string | null;
140
- }
141
- /** Sniffed mime for a Word OOXML package (`.docx`). */
142
- declare const OOXML_WORD_MIME = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
143
- /** Sniffed mime for an Excel OOXML package (`.xlsx`). */
144
- declare const OOXML_SPREADSHEET_MIME = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
145
- /** Sniffed mime for a PowerPoint OOXML package (`.pptx`). */
146
- declare const OOXML_PRESENTATION_MIME = "application/vnd.openxmlformats-officedocument.presentationml.presentation";
147
- /** Sniffed mime for a macro-enabled Word package (`.docm`). Reported
148
- * separately from {@link OOXML_WORD_MIME} so a package carrying a VBA project
149
- * can never be admitted under the plain-document mime: a route that wants
150
- * macro-enabled files opts in explicitly through its allowed-mime seam. */
151
- declare const OOXML_WORD_MACRO_ENABLED_MIME = "application/vnd.ms-word.document.macroEnabled.12";
152
- /** Sniffed mime for a macro-enabled Excel package (`.xlsm`). */
153
- declare const OOXML_SPREADSHEET_MACRO_ENABLED_MIME = "application/vnd.ms-excel.sheet.macroEnabled.12";
154
- /** Sniffed mime for a macro-enabled PowerPoint package (`.pptm`). */
155
- declare const OOXML_PRESENTATION_MACRO_ENABLED_MIME = "application/vnd.ms-powerpoint.presentation.macroEnabled.12";
156
- /** Decide whether uploaded bytes are binary or text, and identify the mime
157
- * type when it can be determined from content. Magic bytes are checked
158
- * first; anything unmatched falls back to a fatal UTF-8 decode. A NUL byte
159
- * or a decode failure means binary. Valid UTF-8 that is an SVG document is
160
- * binary (byte-identity matters for image tooling). Content that matches
161
- * nothing and does not decode as text is binary with an unknown mime —
162
- * extension-based guessing happens at the call site, not here. */
163
- declare function sniffBinary(bytes: Uint8Array): SniffResult;
164
-
165
- /**
166
- * Shared attachment validation core — constants, type-gate, and filename
167
- * sanitization used by BOTH the (server) attachment upload route and the
168
- * (browser) composer's client-side pre-validation, so a rejection never
169
- * differs depending on which side classified the bytes first.
170
- *
171
- * ≈ gtm-agent's `src/lib/attachment-limits.ts`, minus what agent-app already
172
- * has (`ATTACHMENT_MAX_COUNT`/`MAX_ATTACHMENT_TOTAL_BYTES`/
173
- * `attachmentTotalSizeErrorMessage` lived in `./resolve-attachments` and are
174
- * re-homed here so the whole validation vocabulary — count cap, size caps,
175
- * and type gate — has one address). Import-free besides `./wire`
176
- * (`formatBytes`) and `./binary-sniff` (`SniffResult`): `/web-react`
177
- * re-exports `/chat-routes` modules into browser bundles
178
- * (`tests/browser-safe-subpaths.test.ts` walks the graph), so nothing here
179
- * may reach a Node builtin or an engine package.
180
- */
181
-
182
- /** Ceiling on a binary attachment's raw (pre-encoding) byte size. */
183
- declare const MAX_BINARY_ATTACHMENT_BYTES: number;
184
- /** Ceiling on a text attachment's raw byte size. Text hydrates through
185
- * inline prompt parts, a separate path that remains proxy-capped (see
186
- * `INLINE_PARTS_MAX_BYTES` in `./wire`). */
187
- declare const MAX_TEXT_ATTACHMENT_BYTES: number;
188
- /** Most files a single request may carry: the composer staging cap, the
189
- * upload route's per-request cap, and the chat body's `attachments` cap. */
190
- declare const ATTACHMENT_MAX_COUNT = 10;
191
- /** Aggregate raw-byte ceiling across one message's attachments. */
192
- declare const MAX_ATTACHMENT_TOTAL_BYTES: number;
193
- /**
194
- * Accept list for the composer file picker + type validation, same grammar as
195
- * the native `<input accept>` attribute. Images plus the text/doc types a
196
- * product's store actually reads.
197
- *
198
- * Every extension here is one the default {@link ALLOWED_ATTACHMENT_SNIFFED_MIMES}
199
- * actually admits — a picker that offers a format the gate then rejects is a
200
- * defect, so `tests/chat-routes/attachment-validation.test.ts` walks this
201
- * string and proves each entry uploads.
202
- */
203
- declare const ATTACHMENT_ACCEPT = "image/*,.pdf,.docx,.xlsx,.pptx,.txt,.md,.csv,.json,.yaml,.yml,.html";
204
- /** The Office (OOXML) package mimes the default allow-list admits — the
205
- * formats professionals actually send: Word contracts, Excel workpapers,
206
- * PowerPoint decks. Admitting the format is a gate decision only; whether a
207
- * product can EXTRACT text from one is that product's concern. */
208
- declare const OOXML_SNIFFED_MIMES: ReadonlySet<string>;
209
- /** Macro-enabled Office package mimes (`.docm`/`.xlsm`/`.pptm`), reported by
210
- * `sniffBinary` but deliberately NOT in the default allow-list: a package
211
- * carrying a VBA project is a different risk decision than a plain document,
212
- * and it is the product's to make. Opt in by widening the allow-list at the
213
- * route's `allowedSniffedMimes` seam:
214
- * `new Set([...ALLOWED_ATTACHMENT_SNIFFED_MIMES, ...MACRO_ENABLED_OOXML_SNIFFED_MIMES])`. */
215
- declare const MACRO_ENABLED_OOXML_SNIFFED_MIMES: ReadonlySet<string>;
216
- /** Sniffed-mime counterpart of `ATTACHMENT_ACCEPT`: the binary formats
217
- * `sniffBinary` can identify from content among the accepted types.
218
- * Values must match `sniffBinary`'s output strings verbatim, or every
219
- * upload of that format fails the type gate — locked by the round-trip test
220
- * that sniffs real bytes of every mime listed here. */
221
- declare const ALLOWED_ATTACHMENT_SNIFFED_MIMES: ReadonlySet<string>;
222
- /** Represent the result of checking an attachment's type with success or specific failure details */
223
- type AttachmentTypeCheckResult = {
224
- succeeded: true;
225
- } | {
226
- succeeded: false;
227
- code: 'attachment_type_mismatch' | 'attachment_type_not_allowed';
228
- message: string;
229
- };
230
- /**
231
- * Cross-check a filename's extension against its sniffed content.
232
- *
233
- * Text content (`sniff.binary === false`) always passes here — it has no
234
- * magic bytes to compare, so it rides the existing UTF-8 gate instead. For
235
- * binary content: an extension with an unambiguous magic-byte family (e.g.
236
- * `.pdf`) must match the sniffed mime, or the upload is a mismatch (a
237
- * renamed file). Otherwise the sniffed mime must be one of `allowed`
238
- * (default {@link ALLOWED_ATTACHMENT_SNIFFED_MIMES}), or the upload is
239
- * rejected outright. The `allowed` param feeds a route's override seam (a
240
- * product accepting a narrower or wider set than the default).
241
- */
242
- declare function checkAttachmentType(fileName: string, sniff: SniffResult, allowed?: ReadonlySet<string>): AttachmentTypeCheckResult;
243
- /**
244
- * Rewrite a filename into the store-path charset (`A-Za-z0-9._-` per
245
- * segment) — attachment paths double as store keys, sandbox file paths, and
246
- * in-message path references, none of which tolerate spaces or punctuation.
247
- * Runs of unsupported characters collapse to one `-`; leading dots/dashes are
248
- * stripped so the name can't read as a hidden segment. The original name is
249
- * preserved separately (the returned `ChatAttachmentInput.name`), so
250
- * sanitization loses nothing.
251
- */
252
- declare function sanitizeAttachmentFileName(name: string): string;
253
- /** Human-readable error naming both the actual size and the limit that was
254
- * exceeded. Shared so the server route and the composer pre-check report
255
- * the same message shape. */
256
- declare function attachmentSizeErrorMessage(name: string, actualBytes: number, limitBytes: number): string;
257
- /** Human-readable error for a chat message whose combined attachments exceed
258
- * the aggregate raw-byte ceiling. */
259
- declare function attachmentTotalSizeErrorMessage(totalBytes: number, limitBytes: number): string;
260
-
261
- export { ALLOWED_ATTACHMENT_SNIFFED_MIMES as A, type CreateSandboxFileIndexRouteOptions as C, type FileIndexAuthorization as F, MACRO_ENABLED_OOXML_SNIFFED_MIMES as M, OOXML_PRESENTATION_MACRO_ENABLED_MIME as O, type SandboxFileTreeSource as S, ATTACHMENT_ACCEPT as a, ATTACHMENT_MAX_COUNT as b, type AttachmentTypeCheckResult as c, type FileIndexCache as d, type FileIndexReadyResponse as e, type FileIndexResponse as f, type FileIndexWarmingResponse as g, MAX_ATTACHMENT_TOTAL_BYTES as h, MAX_BINARY_ATTACHMENT_BYTES as i, MAX_TEXT_ATTACHMENT_BYTES as j, OOXML_PRESENTATION_MIME as k, OOXML_SNIFFED_MIMES as l, OOXML_SPREADSHEET_MACRO_ENABLED_MIME as m, OOXML_SPREADSHEET_MIME as n, OOXML_WORD_MACRO_ENABLED_MIME as o, OOXML_WORD_MIME as p, type SandboxTreeFile as q, type SandboxTreeResult as r, type SniffResult as s, attachmentSizeErrorMessage as t, attachmentTotalSizeErrorMessage as u, checkAttachmentType as v, createSandboxFileIndexRoute as w, sanitizeAttachmentFileName as x, sniffBinary as y };
@@ -1,142 +0,0 @@
1
- import { AgentProfile } from '@tangle-network/agent-interface';
2
-
3
- /**
4
- * Profile fingerprinting — prove WHICH profile a turn actually executed.
5
- *
6
- * The backtest invariant this exists to enforce: an eval's score is only worth
7
- * publishing if the benchmarked profile IS the shipped profile. The failure
8
- * mode is structural, not hypothetical — a product's eval composed the
9
- * production profile in one module, executed a hand-rolled stub in another,
10
- * and stamped the composed profile's identity onto the stub's scorecard.
11
- * Nothing compared the two, so nothing could notice.
12
- *
13
- * A `ProfileFingerprint` is a channelled identity of the profile handed to the
14
- * sandbox SDK: the system-prompt digest plus the names of every capability
15
- * surface (MCP servers, subagents, file mounts, hub connections) and the
16
- * model/harness the turn dispatched at. It is deliberately NOT a byte-exhaustive
17
- * serialization — channels are what drift in practice, and a channelled diff
18
- * names the surface that moved instead of reporting "bytes differ".
19
- *
20
- * The write half of the seam is `StreamSandboxPromptOptions.onProfileResolved`
21
- * (`/sandbox`): the one place the final profile exists is inside
22
- * `streamSandboxPrompt` after the system-prompt override, the MCP merge, and
23
- * reasoning-effort attachment, so that is where the fingerprint is taken. A
24
- * caller re-deriving a profile to fingerprint it would reintroduce the exact
25
- * gap this closes.
26
- */
27
-
28
- /** The dispatch context a profile cannot see but a turn's identity includes. */
29
- interface ProfileFingerprintContext {
30
- model?: string;
31
- harness?: string;
32
- }
33
- /** Channelled identity of one executed (or composed) profile. */
34
- interface ProfileFingerprint {
35
- /** sha256 over every channel below — one value to log/compare. */
36
- hash: string;
37
- /** sha256 of `prompt.systemPrompt` ('' when absent). */
38
- promptSha: string;
39
- /** UTF-8 byte length of `prompt.systemPrompt`. */
40
- promptBytes: number;
41
- /** Sorted MCP server keys. */
42
- mcpKeys: string[];
43
- /** Sorted subagent names. */
44
- subagentNames: string[];
45
- /** Sorted `resources.files[].path` mounts. */
46
- fileMountPaths: string[];
47
- /** Sorted hub connection ids (alias-qualified when present). */
48
- connectionIds: string[];
49
- model?: string;
50
- harness?: string;
51
- }
52
- /** Fingerprint a profile as the SDK would receive it. */
53
- declare function fingerprintAgentProfile(profile: AgentProfile, context?: ProfileFingerprintContext): Promise<ProfileFingerprint>;
54
- /** One drifted channel between two fingerprints, rendered as comparable strings. */
55
- interface ProfileDriftEntry {
56
- channel: 'promptSha' | 'promptBytes' | 'mcpKeys' | 'subagentNames' | 'fileMountPaths' | 'connectionIds' | 'model' | 'harness';
57
- a: string;
58
- b: string;
59
- }
60
- interface ProfileDrift {
61
- equal: boolean;
62
- drift: ProfileDriftEntry[];
63
- }
64
- /** Channel-by-channel comparison of two fingerprints. */
65
- declare function diffProfileFingerprints(a: ProfileFingerprint, b: ProfileFingerprint): ProfileDrift;
66
- /** Human-readable drift report; exactly 'profiles identical' when equal. */
67
- declare function formatProfileDrift(drift: ProfileDrift): string;
68
-
69
- /**
70
- * The composed-system-prompt byte budget, split out of `./index` so it imports
71
- * NOTHING.
72
- *
73
- * `./index` pulls `@tangle-network/agent-eval` (the evolvable-section seam), so
74
- * `/sandbox` — which has no agent-eval import and must not gain one — could not
75
- * enforce the budget from there. The gate is the same function either way; only
76
- * its module home moved. `./index` re-exports every symbol below, so the
77
- * published `/profile` surface is byte-identical.
78
- *
79
- * Why the gate belongs at more than one call site: `composeAgentProfile` is
80
- * OPT-IN. A product may hand-build its `AgentProfile`, and one does —
81
- * creative-agent's create-time profile is deliberately minimal and its full
82
- * system prompt rides the PER-TURN backend (`buildPromptBackend`), which never
83
- * touches the composer. `/sandbox` therefore runs this gate at the three points
84
- * where the profile that actually executes exists.
85
- */
86
- /** Byte budget on the FINAL composed `prompt.systemPrompt`. Past this the
87
- * model degrades sharply (a 122,659-byte prompt shipped once and the model
88
- * returned empty answers), so the default gate throws well before that. */
89
- declare const DEFAULT_MAX_SYSTEM_PROMPT_BYTES = 40000;
90
- /** Budget config for the composed system prompt. */
91
- interface ComposeProfileBudget {
92
- /** Byte cap on the composed `prompt.systemPrompt`.
93
- * Default {@link DEFAULT_MAX_SYSTEM_PROMPT_BYTES}. */
94
- maxSystemPromptBytes?: number;
95
- /** Downgrade the over-budget throw to a `console.warn` — the escape hatch
96
- * for a product with a known-big prompt that must still ship (it yells on
97
- * every compose instead of blocking). */
98
- warnOnly?: boolean;
99
- /** Required to raise {@link maxSystemPromptBytes} above
100
- * {@link DEFAULT_MAX_SYSTEM_PROMPT_BYTES} or to set {@link warnOnly}: a
101
- * written reason naming what stays inline and why it cannot be mounted.
102
- * Weakening the cap is a product decision that outlives the person making
103
- * it, and the usual cause is reference material concatenated into the prompt
104
- * that belongs in `resources.files`; demanding the sentence here keeps that
105
- * from happening by accident. */
106
- overBudgetReason?: string;
107
- }
108
- /** Largest markdown-heading-delimited sections of a prompt, by UTF-8 bytes.
109
- * Cheap heuristic: split on `#`-heading lines; the preamble before the first
110
- * heading reports as "(preamble)". */
111
- declare function largestPromptSections(prompt: string, top?: number): Array<{
112
- title: string;
113
- bytes: number;
114
- }>;
115
- /** Enforce {@link ComposeProfileBudget} on a composed system prompt: over
116
- * budget throws (or warns with `warnOnly`) with the actual size and the
117
- * top-3 largest sections. Exported so a product assembling its prompt
118
- * outside `composeAgentProfile` (e.g. via the `/prompt` assembler) can
119
- * run the same gate at its own final-composition point. */
120
- declare function assertSystemPromptWithinBudget(systemPrompt: string, budget?: ComposeProfileBudget,
121
- /** Prefixed to the message so a throw from a turn/provision choke point says
122
- * WHERE it fired — "composed systemPrompt" alone reads like a compose-time
123
- * error even when it fired on `driveSandboxTurn`. */
124
- origin?: string): void;
125
- /** Run {@link assertSystemPromptWithinBudget} over a profile-shaped object's
126
- * `prompt.systemPrompt`. Structural on purpose: `/sandbox` calls this on the
127
- * SDK's `AgentProfile` and on the product-supplied seam result without either
128
- * module importing the other's types. A profile with no string systemPrompt
129
- * is a no-op — there is nothing to measure.
130
- *
131
- * The `hint` exists because this gate can fire on a product that ALREADY made
132
- * a deliberate budget decision somewhere else. gtm-agent composes with
133
- * `{ maxSystemPromptBytes: 50_000 }`; without the hint, the shell's 40 KB
134
- * default reads as the gate contradicting a choice the product already made
135
- * rather than as "declare the same number here too". */
136
- declare function assertProfilePromptWithinBudget(profile: {
137
- prompt?: {
138
- systemPrompt?: unknown;
139
- };
140
- } | undefined, budget?: ComposeProfileBudget, origin?: string, hint?: string): void;
141
-
142
- export { type ComposeProfileBudget as C, DEFAULT_MAX_SYSTEM_PROMPT_BYTES as D, type ProfileDrift as P, type ProfileDriftEntry as a, type ProfileFingerprint as b, type ProfileFingerprintContext as c, assertProfilePromptWithinBudget as d, assertSystemPromptWithinBudget as e, diffProfileFingerprints as f, fingerprintAgentProfile as g, formatProfileDrift as h, largestPromptSections as l };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/chat-routes/binary-sniff.ts","../src/chat-routes/attachment-validation.ts"],"sourcesContent":["/**\n * Content-based binary/text classification, shared by the attachment upload\n * route (server) and the composer's client-side pre-validation (browser) —\n * both sides must agree on what counts as binary before a byte ever leaves\n * the client. Extension-based allowlists lie (a renamed `.docx`, a PNG saved\n * as `.txt`), so classification reads the actual bytes: a magic-byte table\n * for common binary formats first, then a UTF-8 decode attempt for\n * everything else. Two families need more than a fixed-offset signature and\n * get a reader of their own — ISO-BMFF brands (`sniffFtyp`) and OOXML Office\n * packages, whose PKZIP container is shared with every other `.zip`\n * (`sniffOoxml`).\n *\n * Lifted near-verbatim from gtm-agent's `src/lib/binary-sniff.ts` (the\n * source PRs hardened this against real corruption/gate bugs: gtm#584,\n * gtm#592). Import-free by design — `/web-react` re-exports `/chat-routes`\n * modules into browser bundles (`tests/browser-safe-subpaths.test.ts` walks\n * the graph), so nothing here may reach a Node builtin or an engine package.\n */\n\nexport interface SniffResult {\n binary: boolean\n mime: string | null\n}\n\n/** Sniffed mime for a Word OOXML package (`.docx`). */\nexport const OOXML_WORD_MIME = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n\n/** Sniffed mime for an Excel OOXML package (`.xlsx`). */\nexport const OOXML_SPREADSHEET_MIME = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n\n/** Sniffed mime for a PowerPoint OOXML package (`.pptx`). */\nexport const OOXML_PRESENTATION_MIME = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'\n\n/** Sniffed mime for a macro-enabled Word package (`.docm`). Reported\n * separately from {@link OOXML_WORD_MIME} so a package carrying a VBA project\n * can never be admitted under the plain-document mime: a route that wants\n * macro-enabled files opts in explicitly through its allowed-mime seam. */\nexport const OOXML_WORD_MACRO_ENABLED_MIME = 'application/vnd.ms-word.document.macroEnabled.12'\n\n/** Sniffed mime for a macro-enabled Excel package (`.xlsm`). */\nexport const OOXML_SPREADSHEET_MACRO_ENABLED_MIME = 'application/vnd.ms-excel.sheet.macroEnabled.12'\n\n/** Sniffed mime for a macro-enabled PowerPoint package (`.pptm`). */\nexport const OOXML_PRESENTATION_MACRO_ENABLED_MIME = 'application/vnd.ms-powerpoint.presentation.macroEnabled.12'\n\nfunction bytesStartWith(bytes: Uint8Array, offset: number, signature: number[]): boolean {\n if (bytes.length < offset + signature.length) return false\n for (let i = 0; i < signature.length; i++) {\n if (bytes[offset + i] !== signature[i]) return false\n }\n return true\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, text: string): boolean {\n if (bytes.length < offset + text.length) return false\n for (let i = 0; i < text.length; i++) {\n if (bytes[offset + i] !== text.charCodeAt(i)) return false\n }\n return true\n}\n\n/** RIFF containers (WebP, WAV) share the `RIFF....<TYPE>` header; the type\n * tag at byte offset 8 distinguishes them. */\nfunction sniffRiff(bytes: Uint8Array): string | null {\n if (!asciiAt(bytes, 0, 'RIFF')) return null\n if (asciiAt(bytes, 8, 'WEBP')) return 'image/webp'\n if (asciiAt(bytes, 8, 'WAVE')) return 'audio/wav'\n return null\n}\n\n/** MP4/MOV/AVIF/HEIC containers share an `ftyp` box at byte offset 4; the\n * major brand at offset 8 tells them apart within the shared ISO-BMFF\n * family. Brands outside this table (mp4, m4a, m4v, etc) fall back to\n * `video/mp4`, the family's most common member. */\nfunction sniffFtyp(bytes: Uint8Array): string | null {\n if (!asciiAt(bytes, 4, 'ftyp')) return null\n if (asciiAt(bytes, 8, 'qt ')) return 'video/quicktime'\n if (asciiAt(bytes, 8, 'avif') || asciiAt(bytes, 8, 'avis')) return 'image/avif'\n if (asciiAt(bytes, 8, 'heic') || asciiAt(bytes, 8, 'heix') || asciiAt(bytes, 8, 'hevc') || asciiAt(bytes, 8, 'hevx')) return 'image/heic'\n if (asciiAt(bytes, 8, 'mif1') || asciiAt(bytes, 8, 'msf1')) return 'image/heif'\n return 'video/mp4'\n}\n\n/** `BM` alone matches ordinary prose (\"BMW…\"), so require the BMP header's\n * reserved bytes (offsets 6-9), which the format mandates to be zero. */\nfunction sniffBmp(bytes: Uint8Array): boolean {\n return asciiAt(bytes, 0, 'BM')\n && bytes.length >= 10\n && bytes[6] === 0 && bytes[7] === 0 && bytes[8] === 0 && bytes[9] === 0\n}\n\n/** `ID3` alone matches ordinary prose (\"ID3 tags…\"), so require the ID3v2\n * header shape: a plausible version byte and sync-safe size bytes. */\nfunction sniffId3(bytes: Uint8Array): boolean {\n return asciiAt(bytes, 0, 'ID3')\n && bytes.length >= 10\n && bytes[3]! < 0x10\n && bytes[6]! < 0x80 && bytes[7]! < 0x80 && bytes[8]! < 0x80 && bytes[9]! < 0x80\n}\n\nconst ZIP_LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50\nconst ZIP_CENTRAL_FILE_HEADER_SIGNATURE = 0x02014b50\nconst ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06054b50\n/** Fixed part of an end-of-central-directory record, before its comment. */\nconst ZIP_END_OF_CENTRAL_DIRECTORY_BYTES = 22\n/** Fixed part of a central-directory file header, before name/extra/comment. */\nconst ZIP_CENTRAL_FILE_HEADER_BYTES = 46\n/** Fixed part of a local file header, before name/extra. */\nconst ZIP_LOCAL_FILE_HEADER_BYTES = 30\n/** A zip's trailing comment is a u16 length, so the end-of-central-directory\n * record sits within this distance of the last byte. */\nconst ZIP_MAX_COMMENT_BYTES = 0xffff\n/** ZIP64 stores sentinels in the 16/32-bit fields and the real values in a\n * separate record. Nothing that large rides an attachment cap, so a sentinel\n * leaves the archive unclassified instead of half-parsed. */\nconst ZIP64_SENTINEL_U16 = 0xffff\nconst ZIP64_SENTINEL_U32 = 0xffffffff\n/** Deflate is the usual method; only method 0 (stored) can be read without an\n * inflater, and this module has no decompression (it runs in the browser\n * bundle and on the upload path, on untrusted bytes). */\nconst ZIP_METHOD_STORED = 0\n\n/** The OPC content-types part every OOXML package carries. */\nconst OPC_CONTENT_TYPES_PART = '[Content_Types].xml'\n\n/** The OPC package-relationships part. ECMA-376 Part 2 requires it in every\n * conforming package, so an archive that borrowed the Office part NAMES\n * without also carrying this one is not a package. Structural, like the\n * content-types part: both are read from the zip's own uncompressed metadata,\n * which is the only evidence available without an inflater. */\nconst OPC_PACKAGE_RELATIONSHIPS_PART = '_rels/.rels'\n\n/** Namespace a genuine content-types part declares. Only checkable when that\n * part is STORED uncompressed — Word, Excel and PowerPoint all deflate it —\n * so this narrows the crafted-archive surface where it applies and is silent\n * where it does not. */\nconst OPC_CONTENT_TYPES_NAMESPACE = 'http://schemas.openxmlformats.org/package/2006/content-types'\n\n/** Ceiling on how much of the content-types part is read when it happens to\n * be stored uncompressed — the genuine part is a few hundred bytes, and a\n * crafted archive must not be able to dictate how much text is scanned. */\nconst OPC_CONTENT_TYPES_SCAN_BYTES = 64 * 1024\n\ninterface OoxmlDeclaredMainPartType {\n /** The content type as it appears in the content-types part. */\n readonly declaredType: string\n /** Reported mime when the package carries no VBA project. */\n readonly mime: string\n /** Reported mime for the same family once a VBA project is present. */\n readonly macroEnabledMime: string\n /** True when `declaredType` is itself one of the macro-enabled types. */\n readonly macroEnabled: boolean\n}\n\n/** Content types a package DECLARES for its main part, in the content-types\n * part itself — the authoritative signal when it is readable, because it\n * distinguishes a document from a template or a macro-enabled sibling that\n * share the same part layout. Each row carries its macro-enabled sibling\n * because a declared type is only half the answer: the VBA-project scan can\n * override it, and a package that carries one is macro-enabled whatever it\n * declares. */\nconst OOXML_DECLARED_MAIN_PART_TYPES: ReadonlyArray<OoxmlDeclaredMainPartType> = [\n {\n declaredType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml',\n mime: OOXML_WORD_MIME,\n macroEnabledMime: OOXML_WORD_MACRO_ENABLED_MIME,\n macroEnabled: false,\n },\n {\n declaredType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml',\n mime: OOXML_SPREADSHEET_MIME,\n macroEnabledMime: OOXML_SPREADSHEET_MACRO_ENABLED_MIME,\n macroEnabled: false,\n },\n {\n declaredType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml',\n mime: OOXML_PRESENTATION_MIME,\n macroEnabledMime: OOXML_PRESENTATION_MACRO_ENABLED_MIME,\n macroEnabled: false,\n },\n {\n declaredType: 'application/vnd.ms-word.document.macroEnabled.main+xml',\n mime: OOXML_WORD_MACRO_ENABLED_MIME,\n macroEnabledMime: OOXML_WORD_MACRO_ENABLED_MIME,\n macroEnabled: true,\n },\n {\n declaredType: 'application/vnd.ms-excel.sheet.macroEnabled.main+xml',\n mime: OOXML_SPREADSHEET_MACRO_ENABLED_MIME,\n macroEnabledMime: OOXML_SPREADSHEET_MACRO_ENABLED_MIME,\n macroEnabled: true,\n },\n {\n declaredType: 'application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml',\n mime: OOXML_PRESENTATION_MACRO_ENABLED_MIME,\n macroEnabledMime: OOXML_PRESENTATION_MACRO_ENABLED_MIME,\n macroEnabled: true,\n },\n]\n\n/** Main part of each Office format, as it appears in the package's entry\n * names — the structural signal used when the declared content types are\n * compressed (the common case: Word, Excel and PowerPoint all deflate the\n * content-types part). Entry names live in the zip's own uncompressed\n * metadata, so reading them needs no inflater.\n *\n * `directory` is the fallback for the packages that do not use the canonical\n * main-part name — a repaired or converted Word file declares\n * `word/document2.xml` — and it is only consulted for a package already\n * confirmed to carry the OPC content-types part, where a `word/` part means\n * a Word document and nothing else. The three directories never mix: an\n * embedded workbook inside a `.docx` lives under `word/embeddings/`. */\nconst OOXML_MAIN_PARTS: ReadonlyArray<{ part: string; directory: string; mime: string; macroEnabledMime: string }> = [\n { part: 'word/document.xml', directory: 'word/', mime: OOXML_WORD_MIME, macroEnabledMime: OOXML_WORD_MACRO_ENABLED_MIME },\n { part: 'xl/workbook.xml', directory: 'xl/', mime: OOXML_SPREADSHEET_MIME, macroEnabledMime: OOXML_SPREADSHEET_MACRO_ENABLED_MIME },\n { part: 'ppt/presentation.xml', directory: 'ppt/', mime: OOXML_PRESENTATION_MIME, macroEnabledMime: OOXML_PRESENTATION_MACRO_ENABLED_MIME },\n]\n\n/** A VBA project part means the package is macro-enabled whatever its\n * extension claims. Matched by suffix rather than by exact path: naming the\n * macro-enabled mime is the fail-closed answer (the default allow-list\n * refuses it), so a part this misses is the expensive direction. */\nconst OOXML_VBA_PROJECT_PART_SUFFIX = 'vbaProject.bin'\n\ninterface ZipEntry {\n name: string\n compressionMethod: number\n compressedBytes: number\n localHeaderOffset: number\n}\n\nfunction readU16Le(bytes: Uint8Array, offset: number): number {\n return bytes[offset]! | (bytes[offset + 1]! << 8)\n}\n\n/** Little-endian u32 as an unsigned JS number — the high byte is multiplied\n * rather than shifted, because `<< 24` would produce a negative value. */\nfunction readU32Le(bytes: Uint8Array, offset: number): number {\n return (bytes[offset]! | (bytes[offset + 1]! << 8) | (bytes[offset + 2]! << 16)) + bytes[offset + 3]! * 0x1000000\n}\n\n/** Entry names are raw bytes; only exact ASCII part names are compared here,\n * so a non-ASCII byte becomes a character that can never match one. */\nfunction asciiEntryName(bytes: Uint8Array, offset: number, length: number): string {\n let name = ''\n for (let i = 0; i < length; i++) {\n const byte = bytes[offset + i]!\n name += byte < 0x80 ? String.fromCharCode(byte) : '\\uFFFD'\n }\n return name\n}\n\n/** Scan back from the tail for the end-of-central-directory record. The\n * comment length must account for exactly the bytes that follow, or the\n * \"signature\" is compressed data that happens to spell `PK\\x05\\x06`. */\nfunction findZipEndOfCentralDirectory(bytes: Uint8Array): number | null {\n const lowest = Math.max(0, bytes.length - ZIP_END_OF_CENTRAL_DIRECTORY_BYTES - ZIP_MAX_COMMENT_BYTES)\n for (let offset = bytes.length - ZIP_END_OF_CENTRAL_DIRECTORY_BYTES; offset >= lowest; offset--) {\n if (readU32Le(bytes, offset) !== ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE) continue\n if (offset + ZIP_END_OF_CENTRAL_DIRECTORY_BYTES + readU16Le(bytes, offset + 20) === bytes.length) return offset\n }\n return null\n}\n\n/** Read the archive's central directory — the authoritative index a zip\n * reader uses. Returns `null` for anything that is not a complete, in-bounds,\n * non-ZIP64 directory: a truncated or crafted archive is left unclassified\n * rather than guessed at from its first local header. */\nfunction readZipCentralDirectory(bytes: Uint8Array): ZipEntry[] | null {\n const end = findZipEndOfCentralDirectory(bytes)\n if (end === null) return null\n\n const entryCount = readU16Le(bytes, end + 10)\n const directoryBytes = readU32Le(bytes, end + 12)\n const directoryOffset = readU32Le(bytes, end + 16)\n if (entryCount === ZIP64_SENTINEL_U16) return null\n if (directoryBytes === ZIP64_SENTINEL_U32 || directoryOffset === ZIP64_SENTINEL_U32) return null\n if (directoryOffset + directoryBytes > bytes.length) return null\n\n const entries: ZipEntry[] = []\n let cursor = directoryOffset\n for (let i = 0; i < entryCount; i++) {\n if (cursor + ZIP_CENTRAL_FILE_HEADER_BYTES > bytes.length) return null\n if (readU32Le(bytes, cursor) !== ZIP_CENTRAL_FILE_HEADER_SIGNATURE) return null\n const nameLength = readU16Le(bytes, cursor + 28)\n const extraLength = readU16Le(bytes, cursor + 30)\n const commentLength = readU16Le(bytes, cursor + 32)\n if (cursor + ZIP_CENTRAL_FILE_HEADER_BYTES + nameLength > bytes.length) return null\n entries.push({\n name: asciiEntryName(bytes, cursor + ZIP_CENTRAL_FILE_HEADER_BYTES, nameLength),\n compressionMethod: readU16Le(bytes, cursor + 10),\n compressedBytes: readU32Le(bytes, cursor + 20),\n localHeaderOffset: readU32Le(bytes, cursor + 42),\n })\n cursor += ZIP_CENTRAL_FILE_HEADER_BYTES + nameLength + extraLength + commentLength\n }\n return entries\n}\n\n/** Text of an entry stored WITHOUT compression, or `null` for anything else.\n * The data offset is computed from the local header (its extra field may be\n * a different length than the central directory's copy). */\nfunction storedZipEntryText(bytes: Uint8Array, entry: ZipEntry): string | null {\n if (entry.compressionMethod !== ZIP_METHOD_STORED) return null\n const header = entry.localHeaderOffset\n if (header + ZIP_LOCAL_FILE_HEADER_BYTES > bytes.length) return null\n if (readU32Le(bytes, header) !== ZIP_LOCAL_FILE_HEADER_SIGNATURE) return null\n const start = header + ZIP_LOCAL_FILE_HEADER_BYTES + readU16Le(bytes, header + 26) + readU16Le(bytes, header + 28)\n const length = Math.min(entry.compressedBytes, OPC_CONTENT_TYPES_SCAN_BYTES)\n if (length === 0 || start + length > bytes.length) return null\n return new TextDecoder('utf-8').decode(bytes.subarray(start, start + length))\n}\n\n/**\n * Identify an OOXML (Office Open XML) package inside a PKZIP container, or\n * `null` for an archive that is not one.\n *\n * Every `.docx`/`.xlsx`/`.pptx` is a zip, so the zip signature alone says\n * nothing — matching on it would admit every `.zip` a user can produce. What\n * this reads is the archive's own uncompressed metadata: the central\n * directory's entry names, plus the content-types part's text in the one case\n * where a producer stored it uncompressed. Everything below follows from that\n * one constraint — the module ships into browser bundles and runs on untrusted\n * bytes, so it has no inflater and cannot read a deflated part.\n *\n * Structural preconditions (both required): the OPC content-types part\n * `[Content_Types].xml` AND the OPC package-relationships part `_rels/.rels`.\n * Which Office format it is comes from the content types the first part\n * DECLARES when it is readable, and otherwise from which main part the package\n * contains (`word/document.xml`, `xl/workbook.xml`, `ppt/presentation.xml`).\n * A package carrying a VBA project reports the macro-enabled mime — computed\n * BEFORE the declared lookup and applied to its answer, so a package that\n * declares the plain type and ships `vbaProject.bin` reports macro-enabled,\n * and a decoy `Override` cannot select the plainer of two declared types.\n *\n * **What this does NOT prove, and no name-only reader can.** A deflated part's\n * CONTENT is unreadable here, so an archive that names its entries like a\n * package and fills them with arbitrary bytes reports the Office mime. That is\n * the same standing as every other magic-byte family this module reports —\n * `%PDF-` followed by arbitrary bytes reports `application/pdf` — because a\n * content sniffer answers \"what format does this claim to be\", not \"is this\n * safe\". The attachment gate is a FORMAT gate; a product that needs the bytes\n * to be a real, parseable document gets that from `/documents`' extractor,\n * which fails loud on a package it cannot read.\n */\nfunction sniffOoxml(bytes: Uint8Array): string | null {\n const entries = readZipCentralDirectory(bytes)\n if (!entries) return null\n\n const contentTypes = entries.find((entry) => entry.name === OPC_CONTENT_TYPES_PART)\n if (!contentTypes) return null\n const names = entries.map((entry) => entry.name)\n if (!names.includes(OPC_PACKAGE_RELATIONSHIPS_PART)) return null\n\n // Order is load-bearing: a VBA project part makes the package macro-enabled\n // whatever its content-types part declares, and the declared lookup below\n // RETURNS, so this has to be known before it runs.\n const macroEnabled = names.some((name) => name.endsWith(OOXML_VBA_PROJECT_PART_SUFFIX))\n\n const declared = storedZipEntryText(bytes, contentTypes)\n if (declared !== null) {\n if (!declared.includes(OPC_CONTENT_TYPES_NAMESPACE)) return null\n // Every match, not the first: `includes` over the whole part means a decoy\n // `Override` declaring a second main-part type is indistinguishable from\n // the real one, so the macro-enabled reading wins whenever one is present.\n const matches = OOXML_DECLARED_MAIN_PART_TYPES.filter((row) => declared.includes(row.declaredType))\n const row = matches.find((candidate) => candidate.macroEnabled) ?? matches[0]\n if (row) return macroEnabled || row.macroEnabled ? row.macroEnabledMime : row.mime\n }\n\n const canonical = OOXML_MAIN_PARTS.find((main) => names.includes(main.part))\n const format = canonical ?? OOXML_MAIN_PARTS.find((main) => names.some((name) => name.startsWith(main.directory)))\n if (!format) return null\n return macroEnabled ? format.macroEnabledMime : format.mime\n}\n\nfunction sniffMagicBytes(bytes: Uint8Array): string | null {\n if (bytesStartWith(bytes, 0, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) return 'image/png'\n if (bytesStartWith(bytes, 0, [0xff, 0xd8, 0xff])) return 'image/jpeg'\n if (asciiAt(bytes, 0, 'GIF87a') || asciiAt(bytes, 0, 'GIF89a')) return 'image/gif'\n if (sniffBmp(bytes)) return 'image/bmp'\n if (bytesStartWith(bytes, 0, [0x49, 0x49, 0x2a, 0x00])) return 'image/tiff' // little-endian\n if (bytesStartWith(bytes, 0, [0x4d, 0x4d, 0x00, 0x2a])) return 'image/tiff' // big-endian\n if (bytesStartWith(bytes, 0, [0x00, 0x00, 0x01, 0x00])) return 'image/x-icon'\n if (asciiAt(bytes, 0, '%PDF-')) return 'application/pdf'\n // OOXML (.docx/.xlsx/.pptx) is a PKZIP container, so the container is\n // inspected before an archive is reported as a generic one — see\n // `sniffOoxml`. An archive that is not an Office package stays\n // `application/zip`, which no default allow-list admits.\n if (bytesStartWith(bytes, 0, [0x50, 0x4b, 0x03, 0x04])) return sniffOoxml(bytes) ?? 'application/zip'\n if (bytesStartWith(bytes, 0, [0x1f, 0x8b])) return 'application/gzip'\n if (sniffId3(bytes) || bytesStartWith(bytes, 0, [0xff, 0xfb])) return 'audio/mpeg'\n if (asciiAt(bytes, 0, 'OggS')) return 'audio/ogg'\n\n const riff = sniffRiff(bytes)\n if (riff) return riff\n\n const ftyp = sniffFtyp(bytes)\n if (ftyp) return ftyp\n\n return null\n}\n\n/** SVG is valid UTF-8 but must round-trip byte-identical (image tools read\n * it from the box as a file), so it is classified binary. Conservative\n * match: the document's first element is `<svg`, or an `<?xml` prolog is\n * followed by an `<svg` element within the first ~1KB (comments/doctype may\n * sit between). Plain XML without an svg root, or prose that merely\n * mentions \"<svg\", stays text. */\nfunction sniffSvgText(decoded: string): boolean {\n let text = decoded\n if (text.charCodeAt(0) === 0xfeff) text = text.slice(1)\n text = text.trimStart()\n if (/^<svg[\\s>/]/.test(text)) return true\n if (!text.startsWith('<?xml')) return false\n return /<svg[\\s>/]/.test(text.slice(0, 1024))\n}\n\n/** Decide whether uploaded bytes are binary or text, and identify the mime\n * type when it can be determined from content. Magic bytes are checked\n * first; anything unmatched falls back to a fatal UTF-8 decode. A NUL byte\n * or a decode failure means binary. Valid UTF-8 that is an SVG document is\n * binary (byte-identity matters for image tooling). Content that matches\n * nothing and does not decode as text is binary with an unknown mime —\n * extension-based guessing happens at the call site, not here. */\nexport function sniffBinary(bytes: Uint8Array): SniffResult {\n const mime = sniffMagicBytes(bytes)\n if (mime) return { binary: true, mime }\n\n if (bytes.includes(0x00)) return { binary: true, mime: null }\n\n let decoded: string\n try {\n decoded = new TextDecoder('utf-8', { fatal: true }).decode(bytes)\n } catch {\n return { binary: true, mime: null }\n }\n if (sniffSvgText(decoded)) return { binary: true, mime: 'image/svg+xml' }\n return { binary: false, mime: null }\n}\n","/**\n * Shared attachment validation core — constants, type-gate, and filename\n * sanitization used by BOTH the (server) attachment upload route and the\n * (browser) composer's client-side pre-validation, so a rejection never\n * differs depending on which side classified the bytes first.\n *\n * ≈ gtm-agent's `src/lib/attachment-limits.ts`, minus what agent-app already\n * has (`ATTACHMENT_MAX_COUNT`/`MAX_ATTACHMENT_TOTAL_BYTES`/\n * `attachmentTotalSizeErrorMessage` lived in `./resolve-attachments` and are\n * re-homed here so the whole validation vocabulary — count cap, size caps,\n * and type gate — has one address). Import-free besides `./wire`\n * (`formatBytes`) and `./binary-sniff` (`SniffResult`): `/web-react`\n * re-exports `/chat-routes` modules into browser bundles\n * (`tests/browser-safe-subpaths.test.ts` walks the graph), so nothing here\n * may reach a Node builtin or an engine package.\n */\n\nimport { formatBytes } from './wire'\nimport {\n OOXML_PRESENTATION_MACRO_ENABLED_MIME,\n OOXML_PRESENTATION_MIME,\n OOXML_SPREADSHEET_MACRO_ENABLED_MIME,\n OOXML_SPREADSHEET_MIME,\n OOXML_WORD_MACRO_ENABLED_MIME,\n OOXML_WORD_MIME,\n} from './binary-sniff'\nimport type { SniffResult } from './binary-sniff'\n\n/** Ceiling on a binary attachment's raw (pre-encoding) byte size. */\nexport const MAX_BINARY_ATTACHMENT_BYTES = 10 * 1024 * 1024\n\n/** Ceiling on a text attachment's raw byte size. Text hydrates through\n * inline prompt parts, a separate path that remains proxy-capped (see\n * `INLINE_PARTS_MAX_BYTES` in `./wire`). */\nexport const MAX_TEXT_ATTACHMENT_BYTES = 950 * 1024\n\n/** Most files a single request may carry: the composer staging cap, the\n * upload route's per-request cap, and the chat body's `attachments` cap. */\nexport const ATTACHMENT_MAX_COUNT = 10\n\n/** Aggregate raw-byte ceiling across one message's attachments. */\nexport const MAX_ATTACHMENT_TOTAL_BYTES = 25 * 1024 * 1024\n\n/**\n * Accept list for the composer file picker + type validation, same grammar as\n * the native `<input accept>` attribute. Images plus the text/doc types a\n * product's store actually reads.\n *\n * Every extension here is one the default {@link ALLOWED_ATTACHMENT_SNIFFED_MIMES}\n * actually admits — a picker that offers a format the gate then rejects is a\n * defect, so `tests/chat-routes/attachment-validation.test.ts` walks this\n * string and proves each entry uploads.\n */\nexport const ATTACHMENT_ACCEPT =\n 'image/*,.pdf,.docx,.xlsx,.pptx,.txt,.md,.csv,.json,.yaml,.yml,.html'\n\n/** The Office (OOXML) package mimes the default allow-list admits — the\n * formats professionals actually send: Word contracts, Excel workpapers,\n * PowerPoint decks. Admitting the format is a gate decision only; whether a\n * product can EXTRACT text from one is that product's concern. */\nexport const OOXML_SNIFFED_MIMES: ReadonlySet<string> = new Set([\n OOXML_WORD_MIME,\n OOXML_SPREADSHEET_MIME,\n OOXML_PRESENTATION_MIME,\n])\n\n/** Macro-enabled Office package mimes (`.docm`/`.xlsm`/`.pptm`), reported by\n * `sniffBinary` but deliberately NOT in the default allow-list: a package\n * carrying a VBA project is a different risk decision than a plain document,\n * and it is the product's to make. Opt in by widening the allow-list at the\n * route's `allowedSniffedMimes` seam:\n * `new Set([...ALLOWED_ATTACHMENT_SNIFFED_MIMES, ...MACRO_ENABLED_OOXML_SNIFFED_MIMES])`. */\nexport const MACRO_ENABLED_OOXML_SNIFFED_MIMES: ReadonlySet<string> = new Set([\n OOXML_WORD_MACRO_ENABLED_MIME,\n OOXML_SPREADSHEET_MACRO_ENABLED_MIME,\n OOXML_PRESENTATION_MACRO_ENABLED_MIME,\n])\n\n/** Sniffed-mime counterpart of `ATTACHMENT_ACCEPT`: the binary formats\n * `sniffBinary` can identify from content among the accepted types.\n * Values must match `sniffBinary`'s output strings verbatim, or every\n * upload of that format fails the type gate — locked by the round-trip test\n * that sniffs real bytes of every mime listed here. */\nexport const ALLOWED_ATTACHMENT_SNIFFED_MIMES: ReadonlySet<string> = new Set([\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/bmp',\n 'image/tiff',\n 'image/x-icon',\n 'image/webp',\n 'image/svg+xml',\n 'image/avif',\n 'image/heic',\n 'image/heif',\n 'application/pdf',\n ...OOXML_SNIFFED_MIMES,\n])\n\n/** Extensions whose magic-byte family is unambiguous, mapped to the mime\n * `sniffBinary` emits for genuine content of that format. Keep in sync with\n * `ATTACHMENT_ACCEPT`: an extension only belongs here if its format has a\n * detectable magic-byte signature. Text extensions (.txt/.md/.csv/.json/\n * .yaml/.yml/.html) are deliberately absent — they have no magic bytes to\n * compare against, so they ride the plain UTF-8 gate instead. AVIF/HEIC/HEIF\n * extensions are also deliberately absent: the ISO-BMFF brand-to-extension\n * mapping in that family isn't one-to-one (a legitimate `.heic` can carry a\n * `mif1` brand), so an extension-implies-mime entry would reject genuine\n * files. They still ride the allowlist gate below, which is what catches an\n * mp4 renamed `.avif` (its content sniffs `video/mp4`, not an allowed mime).\n * The Office extensions ARE here: a `.zip` renamed `.docx` sniffs\n * `application/zip` (its container carries neither of the two OPC parts an\n * Office package must have), so the entry turns a generic 415 into a mismatch\n * that names what the file actually is. Sniffing answers what format the\n * bytes CLAIM to be, not whether they are a readable document — see\n * `sniffOoxml`'s note on what a reader with no inflater can and cannot prove.\n * The macro-enabled extensions are listed for the same reason\n * even though the default allow-list refuses them — a product that widens\n * the allow-list gets the renamed-file check with it. */\nconst EXTENSION_IMPLIES_SNIFFED_MIME: Readonly<Record<string, string>> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n bmp: 'image/bmp',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n ico: 'image/x-icon',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n pdf: 'application/pdf',\n docx: OOXML_WORD_MIME,\n xlsx: OOXML_SPREADSHEET_MIME,\n pptx: OOXML_PRESENTATION_MIME,\n docm: OOXML_WORD_MACRO_ENABLED_MIME,\n xlsm: OOXML_SPREADSHEET_MACRO_ENABLED_MIME,\n pptm: OOXML_PRESENTATION_MACRO_ENABLED_MIME,\n}\n\n/** Represent the result of checking an attachment's type with success or specific failure details */\nexport type AttachmentTypeCheckResult =\n | { succeeded: true }\n | { succeeded: false; code: 'attachment_type_mismatch' | 'attachment_type_not_allowed'; message: string }\n\n/**\n * Cross-check a filename's extension against its sniffed content.\n *\n * Text content (`sniff.binary === false`) always passes here — it has no\n * magic bytes to compare, so it rides the existing UTF-8 gate instead. For\n * binary content: an extension with an unambiguous magic-byte family (e.g.\n * `.pdf`) must match the sniffed mime, or the upload is a mismatch (a\n * renamed file). Otherwise the sniffed mime must be one of `allowed`\n * (default {@link ALLOWED_ATTACHMENT_SNIFFED_MIMES}), or the upload is\n * rejected outright. The `allowed` param feeds a route's override seam (a\n * product accepting a narrower or wider set than the default).\n */\nexport function checkAttachmentType(\n fileName: string,\n sniff: SniffResult,\n allowed: ReadonlySet<string> = ALLOWED_ATTACHMENT_SNIFFED_MIMES,\n): AttachmentTypeCheckResult {\n if (sniff.binary === false) return { succeeded: true }\n\n const extension = fileName.split('.').pop()?.toLowerCase() ?? ''\n const impliedMime = EXTENSION_IMPLIES_SNIFFED_MIME[extension]\n if (impliedMime && sniff.mime && sniff.mime !== impliedMime) {\n return {\n succeeded: false,\n code: 'attachment_type_mismatch',\n message: `${fileName} has a .${extension} extension, but its content is ${sniff.mime}`,\n }\n }\n\n if (!sniff.mime || !allowed.has(sniff.mime)) {\n return {\n succeeded: false,\n code: 'attachment_type_not_allowed',\n message: sniff.mime\n ? `${fileName}'s content (${sniff.mime}) is not an allowed attachment type`\n : `${fileName}'s content is not a recognized attachment type`,\n }\n }\n\n return { succeeded: true }\n}\n\n/**\n * Rewrite a filename into the store-path charset (`A-Za-z0-9._-` per\n * segment) — attachment paths double as store keys, sandbox file paths, and\n * in-message path references, none of which tolerate spaces or punctuation.\n * Runs of unsupported characters collapse to one `-`; leading dots/dashes are\n * stripped so the name can't read as a hidden segment. The original name is\n * preserved separately (the returned `ChatAttachmentInput.name`), so\n * sanitization loses nothing.\n */\nexport function sanitizeAttachmentFileName(name: string): string {\n const sanitized = name\n .trim()\n .replace(/[^A-Za-z0-9._-]+/g, '-')\n .replace(/^[.-]+/, '')\n return sanitized || 'file'\n}\n\n/** Human-readable error naming both the actual size and the limit that was\n * exceeded. Shared so the server route and the composer pre-check report\n * the same message shape. */\nexport function attachmentSizeErrorMessage(name: string, actualBytes: number, limitBytes: number): string {\n return `${name} is ${formatBytes(actualBytes)}; attachments are limited to ${formatBytes(limitBytes)}`\n}\n\n/** Human-readable error for a chat message whose combined attachments exceed\n * the aggregate raw-byte ceiling. */\nexport function attachmentTotalSizeErrorMessage(totalBytes: number, limitBytes: number): string {\n return `Attachments total ${formatBytes(totalBytes)}; each message is limited to ${formatBytes(limitBytes)}`\n}\n"],"mappings":"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","names":["row"]}