@tangle-network/agent-app 0.45.54 → 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.
- package/README.md +1 -1
- package/dist/alerting/index.d.ts +5 -175
- package/dist/alerting/slack.d.ts +176 -0
- package/dist/app-auth/index.d.ts +14 -17
- package/dist/assets/index.d.ts +2 -504
- package/dist/assets/schema.d.ts +264 -0
- package/dist/assets/types.d.ts +237 -0
- package/dist/assistant/AssistantDock.d.ts +56 -0
- package/dist/assistant/AssistantHistory.d.ts +41 -0
- package/dist/assistant/AssistantPanel.d.ts +84 -0
- package/dist/assistant/ProposalCard.d.ts +41 -0
- package/dist/assistant/ResizeHandle.d.ts +19 -0
- package/dist/assistant/client-context.d.ts +20 -0
- package/dist/assistant/client.d.ts +117 -0
- package/dist/assistant/index.d.ts +19 -848
- package/dist/assistant/launcher.d.ts +23 -0
- package/dist/assistant/persistence.d.ts +26 -0
- package/dist/assistant/presentation.d.ts +99 -0
- package/dist/assistant/provider-label.d.ts +7 -0
- package/dist/assistant/reducer.d.ts +130 -0
- package/dist/assistant/sse.d.ts +24 -0
- package/dist/assistant/time-ago.d.ts +6 -0
- package/dist/assistant/transcript.d.ts +97 -0
- package/dist/assistant/types.d.ts +291 -0
- package/dist/assistant/use-stick-to-bottom.d.ts +28 -0
- package/dist/assistant/useAssistantChat.d.ts +63 -0
- package/dist/assistant/useAssistantModels.d.ts +22 -0
- package/dist/assistant/useAssistantThreads.d.ts +47 -0
- package/dist/assistant/usePanelPrefs.d.ts +55 -0
- package/dist/billing/index.d.ts +19 -21
- package/dist/brand/index.d.ts +16 -10
- package/dist/brand-extraction/extract.d.ts +34 -0
- package/dist/brand-extraction/index.d.ts +12 -214
- package/dist/brand-extraction/map.d.ts +58 -0
- package/dist/brand-extraction/types.d.ts +119 -0
- package/dist/catalog/index.d.ts +11 -101
- package/dist/chat-react/composer-mode-controls.d.ts +14 -0
- package/dist/chat-react/entry-composer.d.ts +92 -0
- package/dist/chat-react/index.d.ts +22 -118
- package/dist/chat-react/types.d.ts +11 -0
- package/dist/chat-routes/attachment-store.d.ts +84 -0
- package/dist/chat-routes/attachment-upload.d.ts +84 -0
- package/dist/chat-routes/attachment-validation.d.ts +95 -0
- package/dist/chat-routes/binary-sniff.d.ts +45 -0
- package/dist/chat-routes/completed-sandbox-turn.d.ts +25 -0
- package/dist/chat-routes/detached-turn.d.ts +197 -0
- package/dist/chat-routes/dispatch-parts.d.ts +101 -0
- package/dist/chat-routes/draft-persistence.d.ts +189 -0
- package/dist/chat-routes/durable-projection.d.ts +18 -0
- package/dist/chat-routes/file-index.d.ts +115 -0
- package/dist/chat-routes/index.d.ts +25 -1840
- package/dist/chat-routes/model-failover-stream.d.ts +206 -0
- package/dist/chat-routes/promote-file-part.d.ts +84 -0
- package/dist/chat-routes/resolve-attachments.d.ts +72 -0
- package/dist/chat-routes/sandbox-producer.d.ts +146 -0
- package/dist/chat-routes/sandbox-turn-usage.d.ts +4 -0
- package/dist/{stale-turn-lock-DucQzvXu.d.ts → chat-routes/stale-turn-lock.d.ts} +7 -9
- package/dist/chat-routes/turn-routes.d.ts +540 -0
- package/dist/chat-routes/upload.d.ts +84 -0
- package/dist/{wire-DOZ-O6hD.d.ts → chat-routes/wire.d.ts} +41 -44
- package/dist/chat-store/core.d.ts +19 -0
- package/dist/chat-store/index.d.ts +22 -322
- package/dist/{parts-BqIHMdyu.d.ts → chat-store/parts.d.ts} +49 -47
- package/dist/chat-store/schema.d.ts +157 -0
- package/dist/chat-store/store.d.ts +177 -0
- package/dist/config/index.d.ts +13 -18
- package/dist/crypto/index.d.ts +10 -12
- package/dist/crypto/web-token.d.ts +22 -0
- package/dist/design-canvas/apply.d.ts +70 -0
- package/dist/design-canvas/drizzle-store.d.ts +29 -0
- package/dist/design-canvas/drizzle.d.ts +7 -575
- package/dist/{export-presets-mgVulRaV.d.ts → design-canvas/export-presets.d.ts} +18 -22
- package/dist/design-canvas/index.d.ts +22 -268
- package/dist/design-canvas/mcp-entry.d.ts +15 -0
- package/dist/design-canvas/mcp-handler.d.ts +34 -0
- package/dist/design-canvas/mcp-tools.d.ts +30 -0
- package/dist/{model-DnfO_PdJ.d.ts → design-canvas/model.d.ts} +33 -35
- package/dist/{operations-ByJ6yXOW.d.ts → design-canvas/operations.d.ts} +21 -25
- package/dist/design-canvas/schema.d.ts +558 -0
- package/dist/{store-CqfDtnPQ.d.ts → design-canvas/store.d.ts} +8 -12
- package/dist/design-canvas/templates.d.ts +72 -0
- package/dist/design-canvas/validate.d.ts +32 -0
- package/dist/design-canvas-react/components/BleedTrimOverlay.d.ts +22 -0
- package/dist/design-canvas-react/components/BrandKnot.d.ts +11 -0
- package/dist/design-canvas-react/components/CanvasEmptyState.d.ts +32 -0
- package/dist/design-canvas-react/components/CanvasInsertPanel.d.ts +53 -0
- package/dist/{lazy-DrkVyDpe.d.ts → design-canvas-react/components/DesignCanvas.d.ts} +27 -20
- package/dist/design-canvas-react/components/DesignCanvasEditor.d.ts +23 -0
- package/dist/design-canvas-react/components/ElementNode.d.ts +51 -0
- package/dist/design-canvas-react/components/ExportControl.d.ts +21 -0
- package/dist/design-canvas-react/components/GridLayer.d.ts +47 -0
- package/dist/design-canvas-react/components/InlineTextEditor.d.ts +25 -0
- package/dist/design-canvas-react/components/LayersPanel.d.ts +20 -0
- package/dist/design-canvas-react/components/PagesStrip.d.ts +34 -0
- package/dist/design-canvas-react/components/Rulers.d.ts +31 -0
- package/dist/design-canvas-react/components/SelectionLayer.d.ts +51 -0
- package/dist/design-canvas-react/components/SnapGuidesOverlay.d.ts +25 -0
- package/dist/design-canvas-react/components/Toolbar.d.ts +64 -0
- package/dist/design-canvas-react/components/Workspace.d.ts +92 -0
- package/dist/design-canvas-react/components/ZoomControls.d.ts +14 -0
- package/dist/design-canvas-react/components/glyphs.d.ts +46 -0
- package/dist/design-canvas-react/components/icon-button.d.ts +22 -0
- package/dist/design-canvas-react/components/index.d.ts +27 -0
- package/dist/design-canvas-react/components/layer-tree.d.ts +34 -0
- package/dist/design-canvas-react/components/ruler-math.d.ts +78 -0
- package/dist/design-canvas-react/components/transform-math.d.ts +168 -0
- package/dist/{command-stack-TNPWJCzW.d.ts → design-canvas-react/contracts.d.ts} +16 -63
- package/dist/design-canvas-react/engine/command-stack.d.ts +43 -0
- package/dist/design-canvas-react/engine/commands.d.ts +154 -0
- package/dist/design-canvas-react/engine/selection.d.ts +48 -0
- package/dist/design-canvas-react/engine/snap.d.ts +24 -0
- package/dist/design-canvas-react/engine/zoom-pan.d.ts +18 -0
- package/dist/design-canvas-react/engine.d.ts +21 -399
- package/dist/design-canvas-react/export-math.d.ts +104 -0
- package/dist/design-canvas-react/export.d.ts +89 -0
- package/dist/design-canvas-react/index.d.ts +16 -586
- package/dist/design-canvas-react/insert-builders.d.ts +61 -0
- package/dist/design-canvas-react/lazy.d.ts +21 -6
- package/dist/documents/docx.d.ts +50 -0
- package/dist/documents/extract.d.ts +87 -0
- package/dist/documents/index.d.ts +26 -232
- package/dist/documents/media-type.d.ts +33 -0
- package/dist/documents/pdf-inspector.d.ts +5 -9
- package/dist/{types-DrBidf3O.d.ts → documents/types.d.ts} +13 -15
- package/dist/documents/zip.d.ts +56 -0
- package/dist/eval/calibration.d.ts +106 -0
- package/dist/eval/index.d.ts +8 -116
- package/dist/eval-campaign/index.d.ts +11 -12
- package/dist/{trust-gate-Dcm5xSva.d.ts → eval-campaign/trust-gate.d.ts} +5 -9
- package/dist/forms/blank.d.ts +48 -0
- package/dist/forms/fill.d.ts +105 -0
- package/dist/forms/index.d.ts +58 -332
- package/dist/forms/registry.d.ts +115 -0
- package/dist/forms/verify.d.ts +58 -0
- package/dist/harness/index.d.ts +21 -19
- package/dist/intakes/api.d.ts +5 -11
- package/dist/{completion-CvcNUz07.d.ts → intakes/completion.d.ts} +7 -11
- package/dist/intakes/context-sufficiency.d.ts +113 -0
- package/dist/intakes/drizzle/schema.d.ts +338 -0
- package/dist/intakes/drizzle/store.d.ts +75 -0
- package/dist/intakes/drizzle.d.ts +12 -391
- package/dist/intakes/index.d.ts +23 -113
- package/dist/{model-C8U0HZxL.d.ts → intakes/model.d.ts} +15 -17
- package/dist/intakes-react/components/BrandMark.d.ts +10 -0
- package/dist/intakes-react/components/IntakeInterview.d.ts +15 -0
- package/dist/intakes-react/components/index.d.ts +1 -0
- package/dist/intakes-react/contracts.d.ts +42 -0
- package/dist/intakes-react/index.d.ts +12 -47
- package/dist/intakes-react/lazy.d.ts +9 -8
- package/dist/integrations/index.d.ts +10 -12
- package/dist/{contract-OxG_jVMx.d.ts → interactions/contract.d.ts} +40 -42
- package/dist/interactions/index.d.ts +16 -256
- package/dist/interactions/route.d.ts +151 -0
- package/dist/interactions/sidecar.d.ts +100 -0
- package/dist/knowledge/index.d.ts +7 -11
- package/dist/knowledge-loop/index.d.ts +13 -20
- package/dist/legibility/checks/empty-state.d.ts +59 -0
- package/dist/legibility/checks/reachability.d.ts +103 -0
- package/dist/legibility/checks/silent-failure.d.ts +57 -0
- package/dist/legibility/checks/success.d.ts +38 -0
- package/dist/legibility/checks/vocabulary.d.ts +65 -0
- package/dist/legibility/cli-args.d.ts +30 -0
- package/dist/legibility/cli.d.ts +25 -0
- package/dist/legibility/index.d.ts +10 -530
- package/dist/legibility/report.d.ts +22 -0
- package/dist/legibility/scan.d.ts +29 -0
- package/dist/legibility/source.d.ts +132 -0
- package/dist/legibility/suppress.d.ts +36 -0
- package/dist/legibility/types.d.ts +168 -0
- package/dist/legibility/walk-sources.d.ts +21 -0
- package/dist/{agent-activity-C8ZG0F0M.d.ts → missions/agent-activity.d.ts} +3 -5
- package/dist/missions/engine.d.ts +251 -0
- package/dist/missions/events.d.ts +195 -0
- package/dist/missions/index.d.ts +12 -765
- package/dist/missions/plan-parse.d.ts +50 -0
- package/dist/missions/service.d.ts +265 -0
- package/dist/{failover-D-3UXXTb.d.ts → model-resolution/failover.d.ts} +10 -12
- package/dist/model-resolution/index.d.ts +15 -18
- package/dist/object-store/index.d.ts +15 -17
- package/dist/openui/action.d.ts +54 -0
- package/dist/openui/authoring.d.ts +25 -0
- package/dist/openui/index.d.ts +24 -206
- package/dist/openui/route.d.ts +124 -0
- package/dist/openui/segments.d.ts +71 -0
- package/dist/openui/values.d.ts +82 -0
- package/dist/openui-react/index.d.ts +9 -13
- package/dist/peer-floors/check.d.ts +9 -190
- package/dist/peer-floors/cli.d.ts +2 -3
- package/dist/peer-floors/dependency-source.d.ts +178 -0
- package/dist/plans/index.d.ts +13 -14
- package/dist/{billing-BuNlaKlE.d.ts → platform/billing.d.ts} +28 -32
- package/dist/platform/guards.d.ts +79 -0
- package/dist/platform/hub.d.ts +107 -0
- package/dist/platform/index.d.ts +7 -112
- package/dist/{sso-Cm00S61u.d.ts → platform/sso.d.ts} +15 -97
- package/dist/preflight/cli.d.ts +3 -6
- package/dist/preflight/index.d.ts +16 -18
- package/dist/preset-cloudflare/headers.d.ts +12 -0
- package/dist/preset-cloudflare/index.d.ts +22 -74
- package/dist/preset-cloudflare/workflow-instance.d.ts +35 -0
- package/dist/profile/budget.d.ts +72 -0
- package/dist/profile/fingerprint.d.ts +65 -0
- package/dist/profile/index.d.ts +27 -19
- package/dist/prompt/index.d.ts +3 -5
- package/dist/record/drizzle/schema.d.ts +488 -0
- package/dist/record/drizzle/store.d.ts +224 -0
- package/dist/record/drizzle.d.ts +10 -679
- package/dist/record/fold.d.ts +99 -0
- package/dist/record/index.d.ts +13 -13
- package/dist/{fold-DACU7gtf.d.ts → record/model.d.ts} +22 -124
- package/dist/record/ulid.d.ts +12 -0
- package/dist/redact/index.d.ts +14 -16
- package/dist/run/index.d.ts +11 -16
- package/dist/runtime/agent.d.ts +23 -0
- package/dist/runtime/certified-delivery.d.ts +57 -0
- package/dist/runtime/index.d.ts +17 -367
- package/dist/runtime/loop.d.ts +58 -0
- package/dist/runtime/model-catalog.d.ts +103 -0
- package/dist/{model-CdCDfBA9.d.ts → runtime/model.d.ts} +25 -27
- package/dist/runtime/openai-stream.d.ts +126 -0
- package/dist/runtime/surface-profile.d.ts +115 -0
- package/dist/sandbox/binary-read.d.ts +63 -0
- package/dist/sandbox/diagnostics.d.ts +69 -0
- package/dist/sandbox/index.d.ts +103 -1085
- package/dist/sandbox/model.d.ts +179 -0
- package/dist/sandbox/outcome.d.ts +10 -0
- package/dist/sandbox/prewarm-claim-d1.d.ts +80 -0
- package/dist/sandbox/prewarm.d.ts +193 -0
- package/dist/sandbox/recovery.d.ts +216 -0
- package/dist/sandbox/terminal-connection.d.ts +145 -0
- package/dist/sandbox/workspace-sandbox-manager.d.ts +44 -0
- package/dist/sequences/apply.d.ts +54 -0
- package/dist/sequences/captions.d.ts +91 -0
- package/dist/sequences/drizzle-store.d.ts +36 -0
- package/dist/sequences/drizzle.d.ts +7 -1252
- package/dist/sequences/exports.d.ts +138 -0
- package/dist/sequences/index.d.ts +19 -340
- package/dist/sequences/mcp-entry.d.ts +15 -0
- package/dist/sequences/mcp-handler.d.ts +39 -0
- package/dist/sequences/mcp-tools.d.ts +47 -0
- package/dist/{store-B7LLlk9p.d.ts → sequences/model.d.ts} +26 -110
- package/dist/sequences/operations.d.ts +126 -0
- package/dist/sequences/schema.d.ts +1231 -0
- package/dist/sequences/store.d.ts +81 -0
- package/dist/sequences/validate.d.ts +98 -0
- package/dist/sequences-react/components/BrandMark.d.ts +10 -0
- package/dist/sequences-react/components/PreviewCanvas.d.ts +26 -0
- package/dist/sequences-react/components/SnapIndicatorLine.d.ts +11 -0
- package/dist/sequences-react/components/TimelineClipChip.d.ts +80 -0
- package/dist/sequences-react/components/TimelineEditor.d.ts +44 -0
- package/dist/sequences-react/components/TimelineEmptyState.d.ts +21 -0
- package/dist/sequences-react/components/TimelineGhostLanes.d.ts +14 -0
- package/dist/sequences-react/components/TimelinePlayhead.d.ts +11 -0
- package/dist/sequences-react/components/TimelineRuler.d.ts +16 -0
- package/dist/sequences-react/components/TimelineSmallScreenGate.d.ts +12 -0
- package/dist/sequences-react/components/TimelineTrackRow.d.ts +51 -0
- package/dist/sequences-react/components/ZoomControl.d.ts +15 -0
- package/dist/sequences-react/components/composite-command.d.ts +8 -0
- package/dist/sequences-react/components/glyphs.d.ts +26 -0
- package/dist/sequences-react/components/index.d.ts +31 -0
- package/dist/sequences-react/components/interaction-math.d.ts +103 -0
- package/dist/sequences-react/contracts.d.ts +187 -0
- package/dist/sequences-react/engine/command-stack.d.ts +18 -0
- package/dist/sequences-react/engine/commands.d.ts +146 -0
- package/dist/sequences-react/engine/playback.d.ts +18 -0
- package/dist/sequences-react/engine/snap.d.ts +29 -0
- package/dist/sequences-react/engine/zoom.d.ts +29 -0
- package/dist/sequences-react/index.d.ts +20 -880
- package/dist/sequences-react/lazy.d.ts +8 -0
- package/dist/sequences-react/media/frame-provider.d.ts +70 -0
- package/dist/sequences-react/media/transcription.d.ts +33 -0
- package/dist/sequences-react/media/waveform.d.ts +34 -0
- package/dist/session-shell/index.d.ts +31 -204
- package/dist/session-shell/nav-guard.d.ts +170 -0
- package/dist/session-shell/path.d.ts +19 -0
- package/dist/signoff/cli.d.ts +4 -7
- package/dist/signoff/config.d.ts +12 -0
- package/dist/signoff/exec.d.ts +44 -0
- package/dist/signoff/index.d.ts +56 -14
- package/dist/signoff/invoked-as-script.d.ts +25 -0
- package/dist/signoff/node-version.d.ts +50 -0
- package/dist/signoff/proof-attach.d.ts +88 -0
- package/dist/signoff/proof-cli.d.ts +1 -0
- package/dist/signoff/proof-fixture.d.ts +13 -0
- package/dist/signoff/proof-from-report.d.ts +22 -0
- package/dist/signoff/proof-git.d.ts +57 -0
- package/dist/signoff/proof-record.d.ts +202 -0
- package/dist/signoff/proof-verify.d.ts +103 -0
- package/dist/signoff/proof.d.ts +35 -310
- package/dist/signoff/report.d.ts +7 -0
- package/dist/{run-D80hoLKh.d.ts → signoff/run.d.ts} +3 -6
- package/dist/signoff/schedule.d.ts +55 -0
- package/dist/signoff/seeds.d.ts +50 -0
- package/dist/signoff/store.d.ts +22 -0
- package/dist/{types-Bd6uW9vQ.d.ts → signoff/types.d.ts} +15 -17
- package/dist/signoff/workflow-pin.d.ts +56 -0
- package/dist/signoff/workspace.d.ts +40 -0
- package/dist/skills/index.d.ts +28 -32
- package/dist/skills-placement/index.d.ts +7 -11
- package/dist/spend/budget.d.ts +123 -0
- package/dist/spend/ceiling.d.ts +51 -0
- package/dist/spend/cli-args.d.ts +20 -0
- package/dist/spend/cli.d.ts +1 -0
- package/dist/spend/fixtures/incident-parked-time.d.ts +55 -0
- package/dist/spend/index.d.ts +38 -1144
- package/dist/spend/liveness.d.ts +131 -0
- package/dist/spend/ownership.d.ts +87 -0
- package/dist/spend/reconcile.d.ts +109 -0
- package/dist/spend/reference.d.ts +42 -0
- package/dist/spend/report.d.ts +12 -0
- package/dist/spend/store.d.ts +123 -0
- package/dist/spend/types.d.ts +466 -0
- package/dist/store/index.d.ts +10 -12
- package/dist/stories/app-shell/fixtures.d.ts +43 -0
- package/dist/stories/app-shell/shell.d.ts +81 -0
- package/dist/stories/assistant/fixtures.d.ts +73 -0
- package/dist/stories/chat/fixtures.d.ts +70 -0
- package/dist/stories/chat/markdown.d.ts +11 -0
- package/dist/stories/chat/run-drill-in.d.ts +19 -0
- package/dist/stories/chat-controls/fixtures.d.ts +116 -0
- package/dist/stories/design-canvas/fixtures.d.ts +57 -0
- package/dist/stories/fixtures/canvas.d.ts +10 -0
- package/dist/stories/fixtures/catalog.d.ts +7 -0
- package/dist/stories/fixtures/chat.d.ts +39 -0
- package/dist/stories/fixtures/index.d.ts +4 -0
- package/dist/stories/fixtures/sequences.d.ts +17 -0
- package/dist/stories/panels/fixtures.d.ts +63 -0
- package/dist/stories/sequences/fixtures.d.ts +30 -0
- package/dist/stories/studio/fixtures.d.ts +22 -0
- package/dist/stream/index.d.ts +10 -56
- package/dist/{stream-normalizer-DKRxyVlZ.d.ts → stream/stream-normalizer.d.ts} +23 -26
- package/dist/{turn-buffer-COMQUwO2.d.ts → stream/turn-buffer.d.ts} +21 -23
- package/dist/stream/turn-identity.d.ts +49 -0
- package/dist/studio/generation.d.ts +179 -0
- package/dist/studio/index.d.ts +12 -181
- package/dist/studio-react/avatar-composer.d.ts +8 -0
- package/dist/studio-react/composer-hero.d.ts +12 -0
- package/dist/studio-react/composer-shell.d.ts +18 -0
- package/dist/studio-react/generation-card.d.ts +9 -0
- package/dist/studio-react/generation-detail-modal.d.ts +11 -0
- package/dist/studio-react/generation-detail.d.ts +6 -0
- package/dist/studio-react/generation-grid.d.ts +15 -0
- package/dist/studio-react/image-composer.d.ts +8 -0
- package/dist/studio-react/index.d.ts +32 -245
- package/dist/studio-react/library-drawer.d.ts +12 -0
- package/dist/studio-react/library-panel.d.ts +15 -0
- package/dist/studio-react/publish-package-composer.d.ts +18 -0
- package/dist/studio-react/result-canvas.d.ts +6 -0
- package/dist/studio-react/speech-composer.d.ts +4 -0
- package/dist/studio-react/studio-header.d.ts +5 -0
- package/dist/studio-react/studio-sheet.d.ts +12 -0
- package/dist/studio-react/studio-workspace.d.ts +23 -0
- package/dist/studio-react/transcription-composer.d.ts +12 -0
- package/dist/studio-react/type-config.d.ts +11 -0
- package/dist/studio-react/use-studio-generations.d.ts +20 -0
- package/dist/studio-react/video-composer.d.ts +10 -0
- package/dist/tangle/index.d.ts +7 -9
- package/dist/teams/drizzle/access.d.ts +82 -0
- package/dist/{invitations-schema-_fI7HkJP.d.ts → teams/drizzle/invitations-schema.d.ts} +39 -27
- package/dist/teams/drizzle/personal-organization.d.ts +41 -0
- package/dist/{access-490O6aOU.d.ts → teams/drizzle/schema.d.ts} +57 -122
- package/dist/teams/drizzle.d.ts +12 -44
- package/dist/teams/index.d.ts +20 -44
- package/dist/teams/invitations-api.d.ts +17 -21
- package/dist/{invitations-DoYMvXea.d.ts → teams/invitations.d.ts} +14 -18
- package/dist/teams/invite.d.ts +42 -0
- package/dist/teams/members-api.d.ts +12 -16
- package/dist/teams/resend.d.ts +3 -13
- package/dist/{roles-B4nU3jDi.d.ts → teams/roles.d.ts} +18 -20
- package/dist/teams-react/components/BrandMark.d.ts +10 -0
- package/dist/teams-react/components/InvitationsPanel.d.ts +13 -0
- package/dist/teams-react/components/InviteAcceptPage.d.ts +10 -0
- package/dist/teams-react/components/MembersPanel.d.ts +14 -0
- package/dist/teams-react/components/RoleSelect.d.ts +17 -0
- package/dist/teams-react/components/index.d.ts +3 -0
- package/dist/teams-react/contracts.d.ts +134 -0
- package/dist/teams-react/index.d.ts +12 -143
- package/dist/teams-react/lazy.d.ts +11 -11
- package/dist/test-setup.d.ts +1 -0
- package/dist/theme/index.d.ts +6 -104
- package/dist/theme/tailwind-preset.d.ts +1 -2
- package/dist/theme/theme.d.ts +106 -0
- package/dist/theme-contract/cli.d.ts +21 -0
- package/dist/theme-contract/index.d.ts +4 -6
- package/dist/{auth-BYtiazA4.d.ts → tools/auth.d.ts} +8 -11
- package/dist/tools/capability.d.ts +54 -0
- package/dist/tools/dispatch.d.ts +37 -0
- package/dist/tools/errors.d.ts +8 -0
- package/dist/tools/gating.d.ts +62 -0
- package/dist/tools/http.d.ts +27 -0
- package/dist/tools/index.d.ts +12 -217
- package/dist/{mcp-rpc-DYwPlYbZ.d.ts → tools/mcp-rpc.d.ts} +7 -9
- package/dist/{mcp-xxoZZfor.d.ts → tools/mcp.d.ts} +14 -16
- package/dist/tools/openai.d.ts +28 -0
- package/dist/tools/registry.d.ts +39 -0
- package/dist/tools/runtime.d.ts +22 -0
- package/dist/{types-B25Mib1r.d.ts → tools/types.d.ts} +15 -83
- package/dist/{flow-types-CJxEmaRy.d.ts → trace/flow-types.d.ts} +2 -4
- package/dist/trace/index.d.ts +11 -148
- package/dist/trace/mission-flow.d.ts +82 -0
- package/dist/trace/mission-trace.d.ts +52 -0
- package/dist/turn-health/classify.d.ts +207 -0
- package/dist/turn-health/index.d.ts +29 -637
- package/dist/turn-health/lifecycle.d.ts +75 -0
- package/dist/turn-health/sink.d.ts +122 -0
- package/dist/turn-health/sweep.d.ts +245 -0
- package/dist/turn-stream/adapters.d.ts +257 -0
- package/dist/turn-stream/core.d.ts +293 -0
- package/dist/turn-stream/do.d.ts +144 -0
- package/dist/turn-stream/index.d.ts +62 -738
- package/dist/turn-stream/memory.d.ts +41 -0
- package/dist/vault/ConfirmDialog.d.ts +22 -0
- package/dist/vault/VaultPane.d.ts +15 -0
- package/dist/{VaultPane-BDP6SB_K.d.ts → vault/contracts.d.ts} +15 -22
- package/dist/vault/index.d.ts +15 -22
- package/dist/vault/lazy.d.ts +9 -7
- package/dist/vault/server.d.ts +8 -10
- package/dist/web/free-route-limit.d.ts +187 -0
- package/dist/web/index.d.ts +15 -207
- package/dist/{rate-limit-BOVmJRXZ.d.ts → web/rate-limit.d.ts} +3 -5
- package/dist/web-react/agent-session-controls.d.ts +105 -0
- package/dist/web-react/async/async-view.d.ts +69 -0
- package/dist/web-react/async/index.d.ts +13 -305
- package/dist/web-react/async/state.d.ts +107 -0
- package/dist/web-react/async/use-async-resource.d.ts +41 -0
- package/dist/web-react/async/use-confirmed-mutation.d.ts +90 -0
- package/dist/web-react/brand-mark.d.ts +11 -0
- package/dist/web-react/chat-attachments.d.ts +21 -0
- package/dist/web-react/chat-composer.d.ts +174 -0
- package/dist/web-react/chat-interactions.d.ts +1 -0
- package/dist/web-react/chat-mentions.d.ts +48 -0
- package/dist/web-react/chat-stream.d.ts +106 -0
- package/dist/web-react/class-names.d.ts +10 -0
- package/dist/web-react/controls.d.ts +265 -0
- package/dist/web-react/durable-chat-cards.d.ts +40 -0
- package/dist/web-react/durable-interaction-submit.d.ts +22 -0
- package/dist/web-react/durable-plan-card.d.ts +13 -0
- package/dist/web-react/durable-plan-flow.d.ts +77 -0
- package/dist/web-react/harness-glyphs.d.ts +28 -0
- package/dist/web-react/index.d.ts +80 -2347
- package/dist/web-react/inert.d.ts +39 -0
- package/dist/web-react/insight-card.d.ts +203 -0
- package/dist/web-react/interaction-card-support.d.ts +115 -0
- package/dist/web-react/interaction-plan-card.d.ts +39 -0
- package/dist/web-react/interaction-question-card.d.ts +100 -0
- package/dist/web-react/message-attachments.d.ts +56 -0
- package/dist/web-react/mission-activity.d.ts +96 -0
- package/dist/web-react/motion.d.ts +43 -0
- package/dist/web-react/provenance-model.d.ts +195 -0
- package/dist/web-react/provenance.d.ts +82 -0
- package/dist/web-react/provider-logo.d.ts +14 -0
- package/dist/web-react/record-grid-model.d.ts +257 -0
- package/dist/web-react/record-grid.d.ts +108 -0
- package/dist/web-react/sandbox-terminal.d.ts +90 -0
- package/dist/web-react/seat-paywall.d.ts +47 -0
- package/dist/web-react/session-history.d.ts +196 -0
- package/dist/web-react/smooth-text.d.ts +29 -0
- package/dist/web-react/sparkline.d.ts +150 -0
- package/dist/web-react/terminal.d.ts +1 -92
- package/dist/web-react/use-chat-interactions.d.ts +78 -0
- package/dist/web-react/use-composer-attachments.d.ts +111 -0
- package/dist/web-react/use-file-mentions.d.ts +94 -0
- package/dist/web-react/work-product.d.ts +105 -0
- package/dist/work-product/claim-support.d.ts +288 -0
- package/dist/work-product/index.d.ts +16 -849
- package/dist/work-product/provenance.d.ts +61 -0
- package/dist/{queue-VTBA5ONX.d.ts → work-product/queue.d.ts} +10 -12
- package/dist/work-product/quote.d.ts +139 -0
- package/dist/work-product/route.d.ts +88 -0
- package/dist/work-product/service.d.ts +123 -0
- package/dist/work-product/tools.d.ts +144 -0
- package/dist/{types-CCeYywdS.d.ts → work-product/types.d.ts} +29 -31
- package/dist/work-product-react/index.d.ts +19 -8
- package/dist/workspace-react/index.d.ts +8 -11
- package/package.json +4 -3
- package/dist/agent-session-controls-CmlXwp_H.d.ts +0 -384
- package/dist/apply-6wlMOLf8.d.ts +0 -280
- package/dist/attachment-validation-BfJDBU1g.d.ts +0 -261
- package/dist/budget-BOucfcb_.d.ts +0 -142
- package/dist/values-C7RidJuI.d.ts +0 -156
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createChatTurnRoutes` — the assembled server chat vertical (issue #188
|
|
3
|
+
* Phase 1). One factory composing the pieces every product re-wired by hand:
|
|
4
|
+
*
|
|
5
|
+
* body parse/validate → `/web` `parseJsonObjectBody` + `./wire`
|
|
6
|
+
* turn identity → `/stream` `resolveChatTurn` + agent-runtime `/durable`
|
|
7
|
+
* `deriveExecutionId`
|
|
8
|
+
* producer → injected seam (sandbox lane via
|
|
9
|
+
* `createSandboxChatProducer`; router lane is the
|
|
10
|
+
* product's own `ChatTurnProducer`)
|
|
11
|
+
* turn engine → agent-runtime `/durable` `handleChatTurn` (verbatim)
|
|
12
|
+
* durability → `/stream` turn-buffer tap, wired BY DEFAULT
|
|
13
|
+
* (tee + drain keeps the turn running after a
|
|
14
|
+
* client drop; replay serves the buffered tail)
|
|
15
|
+
* persistence → injected `/chat-store`-shaped store
|
|
16
|
+
* (user row on send, assistant row on completion)
|
|
17
|
+
* interactions answer → `/interactions` `createInteractionAnswerRoute`
|
|
18
|
+
*
|
|
19
|
+
* Handlers are web-standard `Request → Response` (Workers, Node 18+, Deno) —
|
|
20
|
+
* no router import. Auth/access is one injected `authorize` seam, composable
|
|
21
|
+
* with `/app-auth` guards but not coupled to them.
|
|
22
|
+
*
|
|
23
|
+
* Optional product seams let a complex turn-orchestrator compose the vertical
|
|
24
|
+
* instead of hand-rolling a generator — each omittable to the exact behavior
|
|
25
|
+
* above: `turnLock` (single-flight acquire/release around the turn),
|
|
26
|
+
* `contextGate` (pre-producer domain-readiness short-circuit), `beforeTurn`
|
|
27
|
+
* (observe + augment the producer input), `lifecycle` (deterministic
|
|
28
|
+
* start/complete/error telemetry), `heartbeat` (keepalive during silent
|
|
29
|
+
* producer waits), and `onRawEvent` (the raw producer events, for telemetry) —
|
|
30
|
+
* plus the `authorize` result's `insertUserMessage` flag (suppress the user row
|
|
31
|
+
* for a product-dispatched turn). `handleChatTurn` stays the engine — the seams
|
|
32
|
+
* only wrap its input, its producer stream, and its settle.
|
|
33
|
+
*
|
|
34
|
+
* Seam stability: all of the above are STABLE and safe to depend on. They
|
|
35
|
+
* graduated in #227 against the bar this package holds itself to — a seam is
|
|
36
|
+
* provisional until two INDEPENDENT consumers exercise it, because one
|
|
37
|
+
* consumer's shape is indistinguishable from that consumer's assumptions.
|
|
38
|
+
* `turnLock` cleared it with `/turn-stream`'s shared DO adapter (#221);
|
|
39
|
+
* `contextGate`, `beforeTurn`, `onRawEvent` and `insertUserMessage` each
|
|
40
|
+
* cleared it with two product verticals reading them differently — and the
|
|
41
|
+
* review found no leaked assumptions to fix, only `ChatRouteEvent` to export.
|
|
42
|
+
*
|
|
43
|
+
* They stay FLAT top-level options (not grouped under a `hooks` object): that
|
|
44
|
+
* grouping would break every shipped consumer's call for no mechanism gain, and
|
|
45
|
+
* this package's exports are additive-only. For the same reason `onRawEvent`
|
|
46
|
+
* keeps its two-argument `(event, context)` signature rather than being
|
|
47
|
+
* normalized to the single-args shape the other seams take.
|
|
48
|
+
*/
|
|
49
|
+
import { type ChatTurnIdentity, type ChatTurnProducer } from '@tangle-network/agent-runtime/durable';
|
|
50
|
+
import { type ChatMessagePart } from '../chat-store/parts';
|
|
51
|
+
import { type DraftPersistenceTuning } from './draft-persistence';
|
|
52
|
+
import { type InteractionAnswerRoute, type InteractionAnswerRouteOptions } from '../interactions/route';
|
|
53
|
+
import { type PersistedChatMessageForTurn, type TurnEventStore } from '../stream/index';
|
|
54
|
+
import type { ModelFailoverAttempt } from '../model-resolution/failover';
|
|
55
|
+
import { type ChatTurnPartInput, type ChatTurnRequestPayload } from './wire';
|
|
56
|
+
/** Usage receipt persisted onto the assistant message (the flattened
|
|
57
|
+
* `step-finish` shape `/chat-store`'s columns mirror). */
|
|
58
|
+
export interface ChatTurnUsage {
|
|
59
|
+
inputTokens?: number;
|
|
60
|
+
outputTokens?: number;
|
|
61
|
+
reasoningTokens?: number;
|
|
62
|
+
cacheReadTokens?: number;
|
|
63
|
+
cacheWriteTokens?: number;
|
|
64
|
+
costUsd?: number;
|
|
65
|
+
}
|
|
66
|
+
/** What the route persists — a structural subset of `/chat-store`'s
|
|
67
|
+
* `ChatStore`, so `createChatStore(db, tables)` satisfies it directly and a
|
|
68
|
+
* product with its own persistence adapts without importing drizzle. */
|
|
69
|
+
export interface ChatTurnMessageStore {
|
|
70
|
+
listMessages(threadId: string): Promise<Array<{
|
|
71
|
+
id: string;
|
|
72
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
73
|
+
content: string;
|
|
74
|
+
parts?: ChatMessagePart[] | null;
|
|
75
|
+
}>>;
|
|
76
|
+
appendMessage(input: {
|
|
77
|
+
/** Caller-assigned row id. Honored by `/chat-store`'s `createChatStore`;
|
|
78
|
+
* a product store free to ignore it (the writer then adopts whatever id
|
|
79
|
+
* the insert returns). Set only by incremental persistence. */
|
|
80
|
+
id?: string;
|
|
81
|
+
threadId: string;
|
|
82
|
+
role: 'user' | 'assistant';
|
|
83
|
+
content: string;
|
|
84
|
+
parts?: ChatMessagePart[];
|
|
85
|
+
model?: string | null;
|
|
86
|
+
requestedModel?: string | null;
|
|
87
|
+
servedModel?: string | null;
|
|
88
|
+
servedProvider?: string | null;
|
|
89
|
+
servedSource?: string | null;
|
|
90
|
+
inputTokens?: number | null;
|
|
91
|
+
outputTokens?: number | null;
|
|
92
|
+
reasoningTokens?: number | null;
|
|
93
|
+
cacheReadTokens?: number | null;
|
|
94
|
+
cacheWriteTokens?: number | null;
|
|
95
|
+
costUsd?: number | null;
|
|
96
|
+
}): Promise<unknown>;
|
|
97
|
+
/** Patch an existing row. Its PRESENCE is what enables incremental assistant
|
|
98
|
+
* persistence — a store without it keeps today's exact single-write-on-
|
|
99
|
+
* completion behavior, which is what makes this additive. */
|
|
100
|
+
updateMessage?(id: string, patch: {
|
|
101
|
+
content?: string;
|
|
102
|
+
parts?: ChatMessagePart[];
|
|
103
|
+
model?: string | null;
|
|
104
|
+
requestedModel?: string | null;
|
|
105
|
+
servedModel?: string | null;
|
|
106
|
+
servedProvider?: string | null;
|
|
107
|
+
servedSource?: string | null;
|
|
108
|
+
inputTokens?: number | null;
|
|
109
|
+
outputTokens?: number | null;
|
|
110
|
+
reasoningTokens?: number | null;
|
|
111
|
+
cacheReadTokens?: number | null;
|
|
112
|
+
cacheWriteTokens?: number | null;
|
|
113
|
+
costUsd?: number | null;
|
|
114
|
+
}): Promise<unknown>;
|
|
115
|
+
/** Remove a row. Used to retract a draft assistant row for a turn that ended
|
|
116
|
+
* producing nothing, so the empty-turn case still leaves no row at all. */
|
|
117
|
+
deleteMessage?(id: string): Promise<unknown>;
|
|
118
|
+
}
|
|
119
|
+
/** `ChatTurnProducer` plus the persisted projection the assembly reads after
|
|
120
|
+
* drain. `createSandboxChatProducer` returns this; a router-lane producer
|
|
121
|
+
* may omit the optional members (finalText persists as a single text part). */
|
|
122
|
+
export interface ChatTurnRouteProducer extends ChatTurnProducer {
|
|
123
|
+
assistantParts?(): Array<Record<string, unknown>>;
|
|
124
|
+
/** MID-STREAM snapshot of the same projection, safe to call while the turn
|
|
125
|
+
* is running: no dangling-tool terminalization, no pending-ask settlement
|
|
126
|
+
* (see `/stream`'s `draftAssistantParts`). Read by incremental persistence.
|
|
127
|
+
* A producer that omits it still drafts — the scalar text — but persists no
|
|
128
|
+
* parts until the turn completes. */
|
|
129
|
+
draftParts?(): Array<Record<string, unknown>>;
|
|
130
|
+
usage?(): ChatTurnUsage;
|
|
131
|
+
/** The model that SERVED the turn. With failover wired this is the model that
|
|
132
|
+
* actually answered, which is not necessarily the one the caller preferred —
|
|
133
|
+
* read it after the stream drains, never before. */
|
|
134
|
+
model?: string;
|
|
135
|
+
/** Model-failover attribution, when the producer supports it. Reported onto
|
|
136
|
+
* the usage/billing receipt so a downgrade is never silent. */
|
|
137
|
+
modelFailover?(): ChatTurnModelFailover;
|
|
138
|
+
/** Requested-versus-served attribution reported by the sandbox sidecar.
|
|
139
|
+
* `echoReceived` distinguishes a missing echo from a partial echo. */
|
|
140
|
+
modelAttribution?(): ChatTurnModelAttribution;
|
|
141
|
+
}
|
|
142
|
+
/** Which model served, and what it took to get there. */
|
|
143
|
+
export interface ChatTurnModelFailover {
|
|
144
|
+
/** The model that served the turn. */
|
|
145
|
+
model?: string;
|
|
146
|
+
/** Every model tried, in order, with the reason each was abandoned. */
|
|
147
|
+
attempts: ModelFailoverAttempt[];
|
|
148
|
+
/** True when the preferred model did not serve. */
|
|
149
|
+
usedFallback: boolean;
|
|
150
|
+
}
|
|
151
|
+
/** Requested and effective model attribution for one sandbox turn. */
|
|
152
|
+
export interface ChatTurnModelAttribution {
|
|
153
|
+
/** The model explicitly requested by the caller, before shell failover. */
|
|
154
|
+
requestedModel?: string;
|
|
155
|
+
/** The model the downstream sandbox reports actually served the turn. */
|
|
156
|
+
servedModel?: string;
|
|
157
|
+
/** The provider that served the turn, when echoed by the sandbox. */
|
|
158
|
+
servedProvider?: string;
|
|
159
|
+
/** How the sandbox selected the served model. */
|
|
160
|
+
servedSource?: 'request' | 'environment' | 'profile';
|
|
161
|
+
/** True when a structurally valid effective-backend echo was observed. */
|
|
162
|
+
echoReceived: boolean;
|
|
163
|
+
}
|
|
164
|
+
/** Resolve authorization status and context for a chat turn including tenant and user identification */
|
|
165
|
+
export type ChatTurnAuthorization<TContext> = {
|
|
166
|
+
ok: true;
|
|
167
|
+
tenantId: string;
|
|
168
|
+
userId: string;
|
|
169
|
+
context: TContext;
|
|
170
|
+
/** When `false`, skip the `role:'user'` message insert for this turn — for
|
|
171
|
+
* a product-dispatched / synthetic turn (e.g. a follow-up the product
|
|
172
|
+
* raised itself) that must not surface a new user row. Composes with —
|
|
173
|
+
* never overrides — the engine's retry-dedup: `authorize` runs before
|
|
174
|
+
* turn identity is resolved, so it cannot tell a retry from a fresh turn;
|
|
175
|
+
* a turn already deduped stays deduped. Omit / `true` → today's behavior.
|
|
176
|
+
*
|
|
177
|
+
* Settled shape (#227). The validated case in both consumers is the same:
|
|
178
|
+
* a durable plan-approval follow-up re-entering an execution the decision
|
|
179
|
+
* route already enqueued — a decision, not a typed message, so it must
|
|
180
|
+
* not surface a user bubble. Suppressing the insert also propagates:
|
|
181
|
+
* `ChatTurnProduceArgs.userMessageId` is `null` for the rest of the turn
|
|
182
|
+
* when there is no row to reuse, so a seam anchoring to the user row must
|
|
183
|
+
* handle that arm rather than assume a string. */
|
|
184
|
+
insertUserMessage?: boolean;
|
|
185
|
+
} | {
|
|
186
|
+
ok: false;
|
|
187
|
+
response: Response;
|
|
188
|
+
};
|
|
189
|
+
/** Define arguments required to authorize a chat turn based on intent and request details */
|
|
190
|
+
export interface ChatTurnAuthorizeArgs {
|
|
191
|
+
request: Request;
|
|
192
|
+
intent: 'turn' | 'replay' | 'running';
|
|
193
|
+
/** Parsed, validated POST body (turn intent only). */
|
|
194
|
+
body?: ChatTurnRequestPayload;
|
|
195
|
+
/** The buffered turn id being replayed (replay intent only). */
|
|
196
|
+
turnId?: string;
|
|
197
|
+
/** The thread whose running turns are being discovered (running intent only). */
|
|
198
|
+
threadId?: string;
|
|
199
|
+
}
|
|
200
|
+
/** Define the arguments required to produce a chat turn with context and messaging details */
|
|
201
|
+
export interface ChatTurnProduceArgs<TContext> {
|
|
202
|
+
request: Request;
|
|
203
|
+
body: ChatTurnRequestPayload;
|
|
204
|
+
identity: ChatTurnIdentity;
|
|
205
|
+
context: TContext;
|
|
206
|
+
/** The message to send: plain text, or parts when the client attached
|
|
207
|
+
* files (a text part is prepended from `content` when present). */
|
|
208
|
+
prompt: string | ChatTurnPartInput[];
|
|
209
|
+
/** Stable id for cross-process reconnect (`deriveExecutionId`). */
|
|
210
|
+
executionId: string;
|
|
211
|
+
/** The turn-buffer id announced to the client for replay. */
|
|
212
|
+
turnStreamId: string;
|
|
213
|
+
priorMessages: PersistedChatMessageForTurn[];
|
|
214
|
+
/** The durable `role:'user'` row this turn is anchored to — the row the
|
|
215
|
+
* factory just inserted, or the one retry-dedup REUSED. Products anchor
|
|
216
|
+
* optimistic-bubble swaps, retry targeting, and stop-polling to it, and it
|
|
217
|
+
* is the only way to name a REUSED row (which `priorMessages` excludes).
|
|
218
|
+
*
|
|
219
|
+
* Three states, all meaningful:
|
|
220
|
+
* - `undefined` — not resolved yet. `turnLock.acquire` is the one seam that
|
|
221
|
+
* sees this: it runs before any side effect by contract, so the row does
|
|
222
|
+
* not exist when it reads the args.
|
|
223
|
+
* - `null` — resolved, no row: `authorize` returned `insertUserMessage:
|
|
224
|
+
* false` on a turn with nothing to reuse, or the store's `appendMessage`
|
|
225
|
+
* resolved without a usable id.
|
|
226
|
+
* - a string — the row id, for `contextGate`, `beforeTurn`, and `produce`. */
|
|
227
|
+
userMessageId?: string | null;
|
|
228
|
+
}
|
|
229
|
+
/** One event as it crosses the route: the producer's own vocabulary, or an
|
|
230
|
+
* injected keepalive. Same shape the engine forwards verbatim.
|
|
231
|
+
*
|
|
232
|
+
* Public because it IS the vocabulary of two seams — `onRawEvent`'s parameter
|
|
233
|
+
* and `heartbeat.event`'s return. Exported so a product can declare a
|
|
234
|
+
* standalone handler (`function onRawEvent(e: ChatRouteEvent, ctx: T)`) rather
|
|
235
|
+
* than depending on contextual typing from an inline object literal. */
|
|
236
|
+
export type ChatRouteEvent = {
|
|
237
|
+
type: string;
|
|
238
|
+
data?: Record<string, unknown>;
|
|
239
|
+
};
|
|
240
|
+
/** Keepalive emitted while the producer is quiet (long tool calls, first-token
|
|
241
|
+
* wait) so client watchdogs stay re-armed. One is emitted each time
|
|
242
|
+
* `intervalMs` elapses with no producer event; the window resets on every real
|
|
243
|
+
* event, so a chatty producer never triggers one. The product owns the event
|
|
244
|
+
* shape (`type` + `data`). Omit → no keepalives (today's behavior). */
|
|
245
|
+
export interface ChatTurnHeartbeat {
|
|
246
|
+
intervalMs: number;
|
|
247
|
+
event(info: {
|
|
248
|
+
elapsedMs: number;
|
|
249
|
+
tick: number;
|
|
250
|
+
}): ChatRouteEvent;
|
|
251
|
+
}
|
|
252
|
+
/** Patch a `beforeTurn` hook returns to augment the producer's input. Omitted
|
|
253
|
+
* fields keep the route-assembled value; the product's `produce` still owns
|
|
254
|
+
* the system prompt. */
|
|
255
|
+
export interface ChatTurnInputPatch {
|
|
256
|
+
prompt?: string | ChatTurnPartInput[];
|
|
257
|
+
priorMessages?: PersistedChatMessageForTurn[];
|
|
258
|
+
}
|
|
259
|
+
/** Pre-turn readiness verdict — proceed, or short-circuit with the product's
|
|
260
|
+
* own `Response` (e.g. a canned assistant reply asking for missing context).
|
|
261
|
+
* Distinct from `authorize`: this gates domain readiness, not access. */
|
|
262
|
+
export type ChatTurnGateResult = {
|
|
263
|
+
proceed: true;
|
|
264
|
+
} | {
|
|
265
|
+
proceed: false;
|
|
266
|
+
response: Response;
|
|
267
|
+
};
|
|
268
|
+
/** Single-flight lock verdict — acquired (with an opaque handle passed back to
|
|
269
|
+
* `release`), or already held (short-circuit with the product's 409-style
|
|
270
|
+
* `Response`). */
|
|
271
|
+
export type ChatTurnLockResult = {
|
|
272
|
+
acquired: true;
|
|
273
|
+
handle?: unknown;
|
|
274
|
+
} | {
|
|
275
|
+
acquired: false;
|
|
276
|
+
response: Response;
|
|
277
|
+
};
|
|
278
|
+
/** Async acquire/release wrapped around the turn. `acquire` runs before any
|
|
279
|
+
* side effect; `release` runs once when the turn settles — including on a
|
|
280
|
+
* short-circuit or a throw. */
|
|
281
|
+
export interface ChatTurnLock<TContext> {
|
|
282
|
+
acquire(args: ChatTurnProduceArgs<TContext>): ChatTurnLockResult | Promise<ChatTurnLockResult>;
|
|
283
|
+
release(handle: unknown): void | Promise<void>;
|
|
284
|
+
}
|
|
285
|
+
interface ChatTurnLifecycleBase<TContext> {
|
|
286
|
+
identity: ChatTurnIdentity;
|
|
287
|
+
executionId: string;
|
|
288
|
+
turnStreamId: string;
|
|
289
|
+
context: TContext;
|
|
290
|
+
}
|
|
291
|
+
/** Define lifecycle start event with context and timestamp for a chat turn */
|
|
292
|
+
export interface ChatTurnLifecycleStart<TContext> extends ChatTurnLifecycleBase<TContext> {
|
|
293
|
+
startedAt: number;
|
|
294
|
+
}
|
|
295
|
+
/** Define the structure representing the completion state of a chat turn lifecycle with usage data */
|
|
296
|
+
export interface ChatTurnLifecycleComplete<TContext> extends ChatTurnLifecycleBase<TContext> {
|
|
297
|
+
finalText: string;
|
|
298
|
+
usage: ChatTurnUsage;
|
|
299
|
+
durationMs: number;
|
|
300
|
+
/** The model that SERVED the turn — the fallback's id when failover moved it.
|
|
301
|
+
* `usage` is that model's, so telemetry that splits cost or quality by model
|
|
302
|
+
* must key on this and not on the requested one. */
|
|
303
|
+
model?: string;
|
|
304
|
+
/** Requested-versus-served attribution. A difference is detectable from
|
|
305
|
+
* this receipt and from the persisted assistant row independently. */
|
|
306
|
+
requestedModel?: string;
|
|
307
|
+
servedModel?: string;
|
|
308
|
+
servedProvider?: string;
|
|
309
|
+
servedSource?: 'request' | 'environment' | 'profile';
|
|
310
|
+
/** Attribution for a downgrade: which models were tried and why each failed.
|
|
311
|
+
* `undefined` when the producer reports no failover support. */
|
|
312
|
+
modelFailover?: ChatTurnModelFailover;
|
|
313
|
+
/** The durable `role:'assistant'` row this turn wrote, or `null` when it
|
|
314
|
+
* wrote none (an empty turn leaves no row — a draft started mid-stream is
|
|
315
|
+
* retracted). The detached lane surfaces the same id as
|
|
316
|
+
* `DetachedTurnResult.messageId`; one contract, two lanes. */
|
|
317
|
+
assistantMessageId: string | null;
|
|
318
|
+
/** Set when `contextGate` answered this turn and the producer never ran.
|
|
319
|
+
*
|
|
320
|
+
* Present so telemetry can tell "the model produced nothing" apart from "the
|
|
321
|
+
* model was never asked" — they look identical here (`finalText: ''`,
|
|
322
|
+
* empty `usage`) and mean opposite things. A gated turn writes no assistant
|
|
323
|
+
* row, so `assistantMessageId` is `null`, and the billing/persistence
|
|
324
|
+
* `onTurnComplete` is deliberately NOT fired for it. */
|
|
325
|
+
gated?: true;
|
|
326
|
+
}
|
|
327
|
+
/** Represent an error occurring during a chat turn lifecycle with context and duration information */
|
|
328
|
+
export interface ChatTurnLifecycleError<TContext> extends ChatTurnLifecycleBase<TContext> {
|
|
329
|
+
error: unknown;
|
|
330
|
+
durationMs: number;
|
|
331
|
+
}
|
|
332
|
+
/** Deterministic run telemetry: `onTurnStart` fires before the producer runs;
|
|
333
|
+
* exactly one of `onTurnComplete` / `onTurnError` fires after the turn
|
|
334
|
+
* settles, always after `onTurnStart`. Failure is derived from the turn's own
|
|
335
|
+
* `error` / `session.run.failed` events (or a drain throw), not the engine's
|
|
336
|
+
* lifecycle envelope. Hook errors are swallowed — telemetry never fails a
|
|
337
|
+
* turn. */
|
|
338
|
+
export interface ChatTurnLifecycle<TContext> {
|
|
339
|
+
onTurnStart?(info: ChatTurnLifecycleStart<TContext>): void | Promise<void>;
|
|
340
|
+
onTurnComplete?(info: ChatTurnLifecycleComplete<TContext>): void | Promise<void>;
|
|
341
|
+
onTurnError?(info: ChatTurnLifecycleError<TContext>): void | Promise<void>;
|
|
342
|
+
}
|
|
343
|
+
/** What a settled turn reports to `onTurnComplete` — the product's
|
|
344
|
+
* post-processing seam (billing, titles, audit). */
|
|
345
|
+
export interface ChatTurnCompleteInput<TContext> {
|
|
346
|
+
identity: ChatTurnIdentity;
|
|
347
|
+
finalText: string;
|
|
348
|
+
context: TContext;
|
|
349
|
+
failed: boolean;
|
|
350
|
+
failureReason?: string;
|
|
351
|
+
/** The model that SERVED this turn. With failover wired it may differ from
|
|
352
|
+
* the requested one, so a product that bills or scores per model MUST read
|
|
353
|
+
* it here rather than assuming the model it asked for. */
|
|
354
|
+
model?: string;
|
|
355
|
+
/** Requested-versus-served attribution. A difference is detectable from
|
|
356
|
+
* this receipt and from the persisted assistant row independently. */
|
|
357
|
+
requestedModel?: string;
|
|
358
|
+
servedModel?: string;
|
|
359
|
+
servedProvider?: string;
|
|
360
|
+
servedSource?: 'request' | 'environment' | 'profile';
|
|
361
|
+
/** Present when the producer supports failover: the full attempt trail, and
|
|
362
|
+
* `usedFallback` — the flag that makes a silent downgrade impossible. */
|
|
363
|
+
modelFailover?: ChatTurnModelFailover;
|
|
364
|
+
/** The durable `role:'assistant'` row this turn wrote, or `null` when it
|
|
365
|
+
* wrote none (an empty turn leaves no row).
|
|
366
|
+
*
|
|
367
|
+
* Populated even when `failed` is true — a terminal error event still
|
|
368
|
+
* persists whatever partial answer arrived, and that pairing is exactly
|
|
369
|
+
* what lets a product render an error row against a REAL message instead of
|
|
370
|
+
* hunting for the newest row in the thread. The detached lane surfaces the
|
|
371
|
+
* same id as `DetachedTurnResult.messageId`. */
|
|
372
|
+
assistantMessageId: string | null;
|
|
373
|
+
}
|
|
374
|
+
/** Define options to configure chat turn routes including authorization, storage, and event buffering */
|
|
375
|
+
export interface CreateChatTurnRoutesOptions<TContext = void> {
|
|
376
|
+
/** Names the product in `deriveExecutionId` so retries land on the same
|
|
377
|
+
* substrate execution. */
|
|
378
|
+
projectId: string;
|
|
379
|
+
/** Authenticate + authorize the caller for a turn or a replay. The only
|
|
380
|
+
* product-supplied access step: session auth, thread/workspace access,
|
|
381
|
+
* seat/balance gates, rate limits all live here. */
|
|
382
|
+
authorize(args: ChatTurnAuthorizeArgs): Promise<ChatTurnAuthorization<TContext>>;
|
|
383
|
+
/** Thread/message persistence (`/chat-store`'s store or a product adapter). */
|
|
384
|
+
store: ChatTurnMessageStore;
|
|
385
|
+
/** Turn-event buffer (`createD1TurnEventStore(env.DB)` or `/turn-stream`'s
|
|
386
|
+
* `createDurableObjectTurnEventStore(env.TURN_STREAM_DO)` in production,
|
|
387
|
+
* `createMemoryTurnEventStore()` in tests). Wired by default — every turn
|
|
388
|
+
* is buffered and replayable. */
|
|
389
|
+
turnStore: TurnEventStore;
|
|
390
|
+
/** Build the turn's event stream. Sandbox lane: `streamSandboxPrompt(...)`
|
|
391
|
+
* wrapped in `createSandboxChatProducer`. Router/openai-compat lane: the
|
|
392
|
+
* product's own producer. May be async (box resolution). */
|
|
393
|
+
produce(args: ChatTurnProduceArgs<TContext>): ChatTurnRouteProducer | Promise<ChatTurnRouteProducer>;
|
|
394
|
+
/** Single-flight lock acquired before any side effect and released once when
|
|
395
|
+
* the turn settles (including short-circuit/throw). `/turn-stream`'s
|
|
396
|
+
* `createDurableTurnLock` is the shared DO-backed implementation. Omit →
|
|
397
|
+
* no lock. */
|
|
398
|
+
turnLock?: ChatTurnLock<TContext>;
|
|
399
|
+
/** Pre-turn readiness gate that can short-circuit with a product `Response`
|
|
400
|
+
* before the producer runs (the user row is already persisted). Runs after
|
|
401
|
+
* `turnLock.acquire`, before `beforeTurn`. Omit → always proceed.
|
|
402
|
+
*
|
|
403
|
+
* Settled shape (#227). What a consumer may depend on:
|
|
404
|
+
* - `args.userMessageId` is RESOLVED here — a string, or `null` when the
|
|
405
|
+
* insert was suppressed with nothing to reuse. (`turnLock.acquire` is the
|
|
406
|
+
* only seam that sees it `undefined`.)
|
|
407
|
+
* - `{proceed:false}` releases the lock and returns the product's `Response`
|
|
408
|
+
* verbatim: `beforeTurn` and `produce` never run, no assistant row is
|
|
409
|
+
* written, and the user row already inserted is KEPT — a real user turn
|
|
410
|
+
* whose assistant side is the gate's own response.
|
|
411
|
+
* - Always returning `{proceed:true}` is supported, not a misuse: the seam
|
|
412
|
+
* doubles as the one place that runs after the user row exists and before
|
|
413
|
+
* the producer, which is where per-turn analytics and readiness
|
|
414
|
+
* precomputation belong. A gate that never gates is a valid consumer. */
|
|
415
|
+
contextGate?(args: ChatTurnProduceArgs<TContext>): ChatTurnGateResult | Promise<ChatTurnGateResult>;
|
|
416
|
+
/** Observe the assembled producer input and optionally augment it (rewrite
|
|
417
|
+
* the prompt / prior messages) before the producer runs. Omit → no change.
|
|
418
|
+
*
|
|
419
|
+
* Settled shape (#227). BOTH return arms are contract:
|
|
420
|
+
* - a `ChatTurnInputPatch` shallow-merges over the route-assembled args, so
|
|
421
|
+
* an omitted field keeps the route's value;
|
|
422
|
+
* - `void` means "no patch" — and mutating `args.context` in place is the
|
|
423
|
+
* supported way to thread request-scoped state forward to `produce` /
|
|
424
|
+
* `lifecycle` / `onTurnComplete`, which all receive the same object.
|
|
425
|
+
*
|
|
426
|
+
* A throw propagates (the turn fails with the lock released). It runs BEFORE
|
|
427
|
+
* `lifecycle.onTurnStart`, so a throw here fires no terminal lifecycle hook —
|
|
428
|
+
* the span never opened. Telemetry for a failure in this seam belongs in the
|
|
429
|
+
* seam, not in `lifecycle`. */
|
|
430
|
+
beforeTurn?(args: ChatTurnProduceArgs<TContext>): ChatTurnInputPatch | void | Promise<ChatTurnInputPatch | void>;
|
|
431
|
+
/** Deterministic run telemetry (start / complete / error) with identity and
|
|
432
|
+
* timing. Omit → no telemetry. */
|
|
433
|
+
lifecycle?: ChatTurnLifecycle<TContext>;
|
|
434
|
+
/** Keepalive injected while the producer is quiet. Omit → no keepalives. */
|
|
435
|
+
heartbeat?: ChatTurnHeartbeat;
|
|
436
|
+
/** Observe each event the producer emits, before the engine frames it and
|
|
437
|
+
* before any heartbeat injection (the raw sidecar-producer events, for
|
|
438
|
+
* telemetry). Never alters the stream; errors are swallowed. Distinct from
|
|
439
|
+
* `onEvent`, which sees the engine-framed stream incl. lifecycle envelopes.
|
|
440
|
+
*
|
|
441
|
+
* Settled shape (#227). What a consumer may depend on:
|
|
442
|
+
* - it sees EXACTLY the producer's own events — no engine lifecycle
|
|
443
|
+
* envelopes, and no injected keepalives (`heartbeat` wraps the stream
|
|
444
|
+
* downstream of this tap, so a synthetic event never reaches a trace);
|
|
445
|
+
* - a throw is caught and logged, never surfaced: a broken telemetry sink
|
|
446
|
+
* cannot fail a turn or truncate the client's stream;
|
|
447
|
+
* - it is an OBSERVER — the return value is ignored, and the event object
|
|
448
|
+
* continues downstream. Mutating it mutates the stream; don't.
|
|
449
|
+
*
|
|
450
|
+
* Takes `(event, context)` rather than one args object, matching both
|
|
451
|
+
* shipped consumers; see the module header on why it stays that way. */
|
|
452
|
+
onRawEvent?(event: ChatRouteEvent, context: TContext): void | Promise<void>;
|
|
453
|
+
/** Pre-persist transform of the final text (e.g. `/redact`'s `redactPII`).
|
|
454
|
+
* Live stream is never altered. */
|
|
455
|
+
transformFinalText?(text: string): string | Promise<string>;
|
|
456
|
+
/** Incremental persistence of the assistant row WHILE the turn streams
|
|
457
|
+
* (`./draft-persistence`), so a viewer arriving mid-run is served from
|
|
458
|
+
* durable storage instead of the streaming gateway's hot event buffer.
|
|
459
|
+
*
|
|
460
|
+
* This is what lets the gateway keep that hot buffer SHORT at scale: its
|
|
461
|
+
* Redis footprint is one sorted set per session refreshed on every push, so
|
|
462
|
+
* memory grows LINEARLY with `ttl x concurrent sessions`. Stretching the
|
|
463
|
+
* TTL to cover late viewers buys memory proportional to the increase and
|
|
464
|
+
* still serves nothing past the new horizon. The buffer stays a reconnect
|
|
465
|
+
* window; durable storage — kept at most one cadence interval stale by this
|
|
466
|
+
* option — is the history tier.
|
|
467
|
+
*
|
|
468
|
+
* Enabled by DEFAULT whenever `store.updateMessage` exists (every
|
|
469
|
+
* `/chat-store` consumer); a store without it keeps today's exact
|
|
470
|
+
* single-write behavior. Pass `false` to opt out, or an object to tune the
|
|
471
|
+
* cadence. Wiring it against a store that cannot patch rows throws at route
|
|
472
|
+
* construction rather than silently no-op'ing. */
|
|
473
|
+
incrementalPersistence?: false | DraftPersistenceTuning;
|
|
474
|
+
/** Deterministic durable row id for this turn's assistant message. Default
|
|
475
|
+
* `assistant:<executionId>` — already stable across retries because
|
|
476
|
+
* `deriveExecutionId` is. Override only if the product's message ids have a
|
|
477
|
+
* format constraint; it MUST stay deterministic per turn or a re-entered
|
|
478
|
+
* turn will duplicate its row instead of converging. */
|
|
479
|
+
draftMessageId?(args: {
|
|
480
|
+
identity: ChatTurnIdentity;
|
|
481
|
+
executionId: string;
|
|
482
|
+
threadId: string;
|
|
483
|
+
}): string;
|
|
484
|
+
/** Post-processing after a turn settles (billing, titles, audit). Fires with
|
|
485
|
+
* `failed:true` + `failureReason` when the turn carried a terminal error
|
|
486
|
+
* event (model 402 / rate-limit / server error) instead of a clean
|
|
487
|
+
* completion, so products skip the deduct and render an error row rather
|
|
488
|
+
* than billing an empty turn and marking it done. A turn that THROWS never
|
|
489
|
+
* reaches this hook (the engine skips it on a producer throw). Errors are
|
|
490
|
+
* swallowed by the engine — they never fail a streamed turn. */
|
|
491
|
+
onTurnComplete?(input: ChatTurnCompleteInput<TContext>): Promise<void>;
|
|
492
|
+
/** Per-event side channel (product broadcast). The turn-buffer tap is
|
|
493
|
+
* already wired; this runs in addition. */
|
|
494
|
+
onEvent?(event: {
|
|
495
|
+
type: string;
|
|
496
|
+
data?: Record<string, unknown>;
|
|
497
|
+
}, context: TContext): void | Promise<void>;
|
|
498
|
+
/** Trace flush handed to `waitUntil` (OTLP export). */
|
|
499
|
+
traceFlush?(context: TContext): Promise<void>;
|
|
500
|
+
/** Compose the interaction-answer endpoints (`/interactions`). Omit when the
|
|
501
|
+
* product has no sidecar ask channel. */
|
|
502
|
+
interactions?: InteractionAnswerRouteOptions;
|
|
503
|
+
/** Byte budget for inline prompt parts. Default `INLINE_PARTS_MAX_BYTES`. */
|
|
504
|
+
maxInlinePartBytes?: number;
|
|
505
|
+
/** Per-flush coalescer for the turn buffer. Default `coalesceDeltas` (this
|
|
506
|
+
* assembly streams the client vocabulary's `{type:'text'|'reasoning',
|
|
507
|
+
* text}` lines, which it merges). A producer streaming raw
|
|
508
|
+
* `message.part.updated` events passes `coalesceChatStreamEvents`. */
|
|
509
|
+
coalesceTurnEvents?: (events: unknown[]) => unknown[];
|
|
510
|
+
replay?: {
|
|
511
|
+
pollMs?: number;
|
|
512
|
+
timeoutMs?: number;
|
|
513
|
+
};
|
|
514
|
+
log?: (message: string, meta?: Record<string, unknown>) => void;
|
|
515
|
+
}
|
|
516
|
+
/** Define routes to run, replay, and list running chat turns with streaming and reconnect support */
|
|
517
|
+
export interface ChatTurnRoutes {
|
|
518
|
+
/** POST — run one turn, streaming NDJSON. First line is
|
|
519
|
+
* `{type:'turn', turnId}` (the replay handle); the rest is the engine's
|
|
520
|
+
* event protocol. Pass the platform's `waitUntil` so the turn keeps
|
|
521
|
+
* running (and buffering) after a client disconnect. */
|
|
522
|
+
turn(request: Request, ctx?: {
|
|
523
|
+
waitUntil?(p: Promise<unknown>): void;
|
|
524
|
+
}): Promise<Response>;
|
|
525
|
+
/** GET — replay a buffered turn from `?fromSeq=` (0 = everything), then
|
|
526
|
+
* follow it live until it completes. */
|
|
527
|
+
replay(request: Request, params: {
|
|
528
|
+
turnId: string;
|
|
529
|
+
}): Promise<Response>;
|
|
530
|
+
/** GET `?threadId=` — the reconnect-discovery endpoint: the turn ids still
|
|
531
|
+
* running on a thread, so a client that reloaded mid-turn can re-attach to
|
|
532
|
+
* the live stream via {@link replay} instead of losing it. Returns `[]` when
|
|
533
|
+
* the turn store cannot enumerate running turns (`listRunning` unimplemented). */
|
|
534
|
+
running(request: Request): Promise<Response>;
|
|
535
|
+
/** list/answer endpoints from `/interactions`; null when not configured. */
|
|
536
|
+
interactions: InteractionAnswerRoute | null;
|
|
537
|
+
}
|
|
538
|
+
/** Build chat turn routes to handle and validate incoming chat requests with optional logging */
|
|
539
|
+
export declare function createChatTurnRoutes<TContext = void>(options: CreateChatTurnRoutesOptions<TContext>): ChatTurnRoutes;
|
|
540
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createUploadRoute` — the multimodal middle. Accepts multipart file uploads
|
|
3
|
+
* and returns `PromptInputPart`-shaped descriptors the client echoes back on
|
|
4
|
+
* send (`ChatTurnRequestPayload.parts`):
|
|
5
|
+
*
|
|
6
|
+
* ≤ inlineMaxBytes (700 KiB default) → inline `data:` URI part — rides the
|
|
7
|
+
* turn body directly, no sandbox round trip.
|
|
8
|
+
* > inlineMaxBytes → written into the sandbox workspace (base64 through the
|
|
9
|
+
* structural `write` seam — `box.fs` satisfies it) and referenced by
|
|
10
|
+
* `path`. Mandatory two-step: the gateway caps request bodies at ~1 MiB,
|
|
11
|
+
* so a large file can never ride the prompt POST.
|
|
12
|
+
*
|
|
13
|
+
* The sink is structural (no sandbox-SDK import); products pass `box.fs`.
|
|
14
|
+
*
|
|
15
|
+
* @remarks Sole consumer today is the `--chat` scaffold (`create-agent-app
|
|
16
|
+
* --chat` → `template-chat/src/chat.ts`), the reference multimodal path — its
|
|
17
|
+
* inline-`data:`-or-ephemeral-sandbox-workspace split stays the scaffold's
|
|
18
|
+
* proven upload pattern, not a fleet primitive; keep that distinction in mind
|
|
19
|
+
* before widening its surface. Fleet apps with a durable store of their own
|
|
20
|
+
* (KV, or AES-GCM-encrypted R2) no longer need to hand-roll a vault upload
|
|
21
|
+
* route: `createAttachmentUploadRoute` (`./attachment-upload`, agent-app#234)
|
|
22
|
+
* is the shared hardened path for that persistence model — a content-sniffed
|
|
23
|
+
* type gate, two-phase atomic batch writes, and per-kind/aggregate size caps,
|
|
24
|
+
* all seamed through an injected `WriteAttachmentFn`. Point readers there
|
|
25
|
+
* instead of widening this route to cover both models.
|
|
26
|
+
*/
|
|
27
|
+
import type { ChatTurnFilePartInput } from './wire';
|
|
28
|
+
/** 700 KiB: base64 inflates ~4/3, so an inline part stays comfortably under
|
|
29
|
+
* the ~1 MiB gateway body cap alongside the JSON envelope. */
|
|
30
|
+
export declare const UPLOAD_INLINE_MAX_BYTES: number;
|
|
31
|
+
/** 8 MiB default ceiling per file — one base64 `write` call handles it. Raise
|
|
32
|
+
* it only with a sink that can take the bigger single write. */
|
|
33
|
+
export declare const UPLOAD_MAX_FILE_BYTES: number;
|
|
34
|
+
/** Structural match of the sandbox SDK's `box.fs` write surface (v0.10.5+:
|
|
35
|
+
* `encoding: 'base64'` is the worker-safe binary path). */
|
|
36
|
+
export interface SandboxUploadSink {
|
|
37
|
+
write(path: string, content: string, options?: {
|
|
38
|
+
encoding?: 'utf8' | 'base64';
|
|
39
|
+
}): Promise<unknown>;
|
|
40
|
+
}
|
|
41
|
+
/** Resolve upload authorization status and provide upload destination or error response */
|
|
42
|
+
export type UploadAuthorization = {
|
|
43
|
+
ok: true;
|
|
44
|
+
/** Where large files land. Absent/null: only inline uploads are
|
|
45
|
+
* accepted and an over-inline-cap file is rejected with 413. */
|
|
46
|
+
sink?: SandboxUploadSink | null;
|
|
47
|
+
/** Per-request override of the workspace directory large files go to. */
|
|
48
|
+
uploadDir?: string;
|
|
49
|
+
} | {
|
|
50
|
+
ok: false;
|
|
51
|
+
response: Response;
|
|
52
|
+
};
|
|
53
|
+
/** Define options to authorize uploads and configure file size limits and upload directory */
|
|
54
|
+
export interface CreateUploadRouteOptions {
|
|
55
|
+
/** Authenticate the caller and resolve the sandbox file sink (usually
|
|
56
|
+
* `ensureWorkspaceSandbox(...)` → `box.fs`). */
|
|
57
|
+
authorize(args: {
|
|
58
|
+
request: Request;
|
|
59
|
+
}): Promise<UploadAuthorization>;
|
|
60
|
+
/** Inline-vs-sandbox threshold. Default {@link UPLOAD_INLINE_MAX_BYTES}. */
|
|
61
|
+
inlineMaxBytes?: number;
|
|
62
|
+
/** Hard per-file cap. Default {@link UPLOAD_MAX_FILE_BYTES}. */
|
|
63
|
+
maxFileBytes?: number;
|
|
64
|
+
/** Absolute workspace directory for path-ref files.
|
|
65
|
+
* Default `'/workspace/uploads'`. */
|
|
66
|
+
uploadDir?: string;
|
|
67
|
+
}
|
|
68
|
+
/** One uploaded file, ready for the composer chip and the turn body. */
|
|
69
|
+
export interface UploadedChatFile {
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
size: number;
|
|
73
|
+
mediaType: string;
|
|
74
|
+
/** True when the part carries the bytes inline (`data:` URI). */
|
|
75
|
+
inline: boolean;
|
|
76
|
+
/** Echo this back verbatim in `ChatTurnRequestPayload.parts`. */
|
|
77
|
+
part: ChatTurnFilePartInput;
|
|
78
|
+
}
|
|
79
|
+
/** Path-safe file name: basename only, conservative charset, length-capped. */
|
|
80
|
+
export declare function sanitizeUploadFilename(name: string): string;
|
|
81
|
+
/** Convert a Uint8Array of bytes into a base64-encoded string */
|
|
82
|
+
export declare function bytesToBase64(bytes: Uint8Array): string;
|
|
83
|
+
/** Create an upload route handler that authorizes requests and processes file uploads with size limits */
|
|
84
|
+
export declare function createUploadRoute(options: CreateUploadRouteOptions): (request: Request) => Promise<Response>;
|