@tangle-network/agent-app 0.45.53 → 0.45.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +5 -4
- 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,179 @@
|
|
|
1
|
+
/** Define configuration options for resolving a provider and its model with optional API keys and routing details */
|
|
2
|
+
export interface ProviderResolutionConfig {
|
|
3
|
+
routerBaseUrl?: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
providerName?: string;
|
|
6
|
+
modelName?: string;
|
|
7
|
+
defaultModel?: string;
|
|
8
|
+
openaiApiKey?: string;
|
|
9
|
+
allowKeylessModel?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** Represent a fully configured model with optional API key and base URL for sandbox platform integration */
|
|
12
|
+
export interface ResolvedModel {
|
|
13
|
+
model: string;
|
|
14
|
+
provider: string;
|
|
15
|
+
apiKey?: string;
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Why a model failed to resolve into something transportable to the sandbox
|
|
20
|
+
* platform. `no_provider` — a model id exists but no provider name could be
|
|
21
|
+
* derived (no explicit `providerName`, and no key present to infer one from).
|
|
22
|
+
* `no_api_key` — a provider AND model both resolved, but no credential is
|
|
23
|
+
* configured and the caller did not opt into `allowKeylessModel`.
|
|
24
|
+
*/
|
|
25
|
+
export type ModelSelectionError = 'no_provider' | 'no_api_key';
|
|
26
|
+
/**
|
|
27
|
+
* Which precedence slot supplied the failed/succeeded model id:
|
|
28
|
+
* `override` — the caller's per-turn `{ model }` argument.
|
|
29
|
+
* `config` — `provider.modelName`.
|
|
30
|
+
* `default` — `provider.defaultModel` (only ever consulted for an
|
|
31
|
+
* openai/openai-compat provider shape).
|
|
32
|
+
*/
|
|
33
|
+
export type ModelSelectionSource = 'override' | 'config' | 'default';
|
|
34
|
+
/**
|
|
35
|
+
* A model id was named (by override, config, or default) but is not
|
|
36
|
+
* transportable to the sandbox platform. Carries enough to explain WHY
|
|
37
|
+
* without the caller re-deriving the override/config/default precedence
|
|
38
|
+
* chain itself (that re-derivation is how gtm-agent#665 happened — a caller
|
|
39
|
+
* guessed loudness from the wrong slot and dropped a user-selected model).
|
|
40
|
+
*/
|
|
41
|
+
export type ModelSelectionFailure = {
|
|
42
|
+
succeeded: false;
|
|
43
|
+
error: 'no_provider';
|
|
44
|
+
model: string;
|
|
45
|
+
source: ModelSelectionSource;
|
|
46
|
+
} | {
|
|
47
|
+
succeeded: false;
|
|
48
|
+
error: 'no_api_key';
|
|
49
|
+
model: string;
|
|
50
|
+
provider: string;
|
|
51
|
+
source: ModelSelectionSource;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* The three-state outcome of resolving a model: `{ succeeded: true, value:
|
|
55
|
+
* undefined }` means NOTHING was requested (the legitimate box-default
|
|
56
|
+
* configuration — not an error); `{ succeeded: true, value: ResolvedModel }`
|
|
57
|
+
* means a fully transportable model resolved; anything else is a
|
|
58
|
+
* {@link ModelSelectionFailure} — a model WAS named but can't be sent.
|
|
59
|
+
*/
|
|
60
|
+
export type ModelSelection = {
|
|
61
|
+
succeeded: true;
|
|
62
|
+
value: ResolvedModel | undefined;
|
|
63
|
+
} | ModelSelectionFailure;
|
|
64
|
+
/**
|
|
65
|
+
* Resolve a provider + model configuration into a typed three-state outcome
|
|
66
|
+
* that separates "nothing requested" from "something requested but
|
|
67
|
+
* untransportable" — the distinction {@link resolveModel} collapses and the
|
|
68
|
+
* one that caused gtm-agent#665 (a validated user-selected model silently
|
|
69
|
+
* dropped, box default substituted, durable row still recording the user's
|
|
70
|
+
* choice).
|
|
71
|
+
*
|
|
72
|
+
* Precedence (identical to the legacy `resolveModel`, byte-for-byte):
|
|
73
|
+
* provider is computed first (`providerName`, else inferred `openai-compat`
|
|
74
|
+
* from a present key, else inferred `openai` from a present
|
|
75
|
+
* `openaiApiKey`, else unresolved); the model id is `override.model` else
|
|
76
|
+
* `config.modelName` else — ONLY when the provider is `openai` or
|
|
77
|
+
* `openai-compat` — `config.defaultModel`; the api key is
|
|
78
|
+
* `override.modelApiKey` else `config.apiKey` else — only for provider
|
|
79
|
+
* `openai` — `config.openaiApiKey`.
|
|
80
|
+
*
|
|
81
|
+
* Two behavioral deltas from the legacy function:
|
|
82
|
+
* 1. Every string field (`routerBaseUrl`, `apiKey`, `providerName`,
|
|
83
|
+
* `modelName`, `defaultModel`, `openaiApiKey`, `override.model`,
|
|
84
|
+
* `override.modelApiKey`) is normalized through {@link trimOrNull} first,
|
|
85
|
+
* so `''` (and whitespace-only strings) are treated as absent instead of
|
|
86
|
+
* poisoning the `??` precedence chain — the issue's second stated defect.
|
|
87
|
+
* This also means a value is trimmed (`' gpt-5 '` resolves to `'gpt-5'`).
|
|
88
|
+
* 2. The outcome is three-state instead of collapsing to `undefined`: no
|
|
89
|
+
* model derivable from any slot → `{ succeeded: true, value: undefined }`
|
|
90
|
+
* (still the legitimate "let the box pick its own default" case, NOT an
|
|
91
|
+
* error); a model id resolved but no provider could be derived → a
|
|
92
|
+
* `no_provider` failure; a model + provider resolved but no api key (and
|
|
93
|
+
* `allowKeylessModel` was not set) → a `no_api_key` failure. Both failure
|
|
94
|
+
* arms carry `source` so a caller can apply a loudness policy without
|
|
95
|
+
* re-deriving which precedence slot supplied the model.
|
|
96
|
+
*/
|
|
97
|
+
export declare function resolveModelSelection(config: ProviderResolutionConfig | undefined, override?: {
|
|
98
|
+
model?: string;
|
|
99
|
+
modelApiKey?: string;
|
|
100
|
+
}): ModelSelection;
|
|
101
|
+
/**
|
|
102
|
+
* Resolve and return the appropriate model configuration based on provider
|
|
103
|
+
* settings and optional overrides.
|
|
104
|
+
*
|
|
105
|
+
* Migration note (intentionally NOT tagged `@deprecated`): this is a thin,
|
|
106
|
+
* source-compatible wrapper over {@link resolveModelSelection} that collapses
|
|
107
|
+
* its three-state outcome back down to `ResolvedModel | undefined`, exactly
|
|
108
|
+
* as before. It stays correct for the common case (no explicit model requested, or a
|
|
109
|
+
* fully-transportable one), but it CANNOT distinguish "nothing was
|
|
110
|
+
* requested" from "a named model could not be transported" — the ambiguity
|
|
111
|
+
* that caused gtm-agent#665. Prefer {@link resolveModelSelection} directly,
|
|
112
|
+
* or {@link requireTransportableModel} for the fail-loud-on-explicit-model
|
|
113
|
+
* policy the internal sandbox callers use. Not tagged `@deprecated`: it
|
|
114
|
+
* remains the correct call for a caller that never sets an explicit
|
|
115
|
+
* override and only wants "the box's default is fine" semantics; a hard
|
|
116
|
+
* deprecation is a later-major decision, not this fix's.
|
|
117
|
+
*
|
|
118
|
+
* The only behavior change on this entry point versus before is the
|
|
119
|
+
* empty-string bugfix that comes free through delegation (issue #302's
|
|
120
|
+
* second defect) — every signature and the `undefined` return semantics are
|
|
121
|
+
* unchanged.
|
|
122
|
+
*/
|
|
123
|
+
export declare function resolveModel(config: ProviderResolutionConfig | undefined, override?: {
|
|
124
|
+
model?: string;
|
|
125
|
+
modelApiKey?: string;
|
|
126
|
+
}): ResolvedModel | undefined;
|
|
127
|
+
/**
|
|
128
|
+
* Thrown by {@link requireTransportableModel} when a model that was
|
|
129
|
+
* EXPLICITLY requested via a per-turn `{ model }` override cannot be
|
|
130
|
+
* transported to the sandbox platform. The message names the model, which
|
|
131
|
+
* precedence slot supplied it, what's missing, and the fix, and states
|
|
132
|
+
* plainly that the requested model was NOT sent to the box (the failure mode
|
|
133
|
+
* this error exists to make impossible to miss — gtm-agent#665 silently
|
|
134
|
+
* substituted the box default instead of a user-selected model).
|
|
135
|
+
*
|
|
136
|
+
* The error class itself carries no opinion about *when* it should be
|
|
137
|
+
* thrown — it is constructed from any {@link ModelSelectionFailure},
|
|
138
|
+
* regardless of `source`. A caller wanting a stricter policy (e.g. also
|
|
139
|
+
* fail-loud on an untransportable configured `provider.modelName`) can call
|
|
140
|
+
* {@link resolveModelSelection} directly and throw this itself.
|
|
141
|
+
*/
|
|
142
|
+
export declare class SandboxModelResolutionError extends Error {
|
|
143
|
+
readonly code: ModelSelectionError;
|
|
144
|
+
readonly model: string;
|
|
145
|
+
readonly provider?: string;
|
|
146
|
+
readonly source: ModelSelectionSource;
|
|
147
|
+
constructor(failure: ModelSelectionFailure, context: string);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Shared fail-loud policy for the sandbox platform's three internal model
|
|
151
|
+
* callers (`ensureWorkspaceSandbox`'s `backendModelAtCreate`,
|
|
152
|
+
* `streamSandboxPrompt`, `driveSandboxTurn`): a `ModelSelection` in, a plain
|
|
153
|
+
* `ResolvedModel | undefined` out, so downstream code is unchanged from
|
|
154
|
+
* before this fix.
|
|
155
|
+
*
|
|
156
|
+
* The policy: success delegates straight through. A failure whose `source`
|
|
157
|
+
* is `'override'` means a PER-TURN model was explicitly selected THIS turn
|
|
158
|
+
* (a live, user-driven choice — passed as `{ model }`) and could not be
|
|
159
|
+
* sent; substituting the box default there is exactly the gtm-agent#665
|
|
160
|
+
* defect, so it throws {@link SandboxModelResolutionError} rather than
|
|
161
|
+
* silently falling back.
|
|
162
|
+
*
|
|
163
|
+
* A failure whose `source` is `'config'` or `'default'` means a
|
|
164
|
+
* *configured* `provider.modelName` / `provider.defaultModel` couldn't
|
|
165
|
+
* resolve — nobody made a choice this turn; the value came from board
|
|
166
|
+
* config that may simply describe "the platform supplies the credential."
|
|
167
|
+
* Shipped consumers rely on exactly that: tax-agent ships a shell with
|
|
168
|
+
* `provider: { providerName: 'openai-compat', modelName, routerBaseUrl }`
|
|
169
|
+
* and no `apiKey`/`allowKeylessModel`, with a contract test asserting
|
|
170
|
+
* `ensureWorkspaceSandbox` creation SUCCEEDS with the model silently
|
|
171
|
+
* dropped so the sandbox platform mints its own in-container credential
|
|
172
|
+
* (`apps/web/tests/sandbox-service-contract.test.ts`). A config-loud policy
|
|
173
|
+
* here would break every fresh tax sandbox provisioning and every tax turn.
|
|
174
|
+
* So both `'config'` and `'default'` keep the pre-#302 logged-skip
|
|
175
|
+
* behavior: `console.error` and drop, letting the box use its own default.
|
|
176
|
+
* A product wanting strict enforcement of a configured `provider.modelName`
|
|
177
|
+
* can call {@link resolveModelSelection} directly and apply its own policy.
|
|
178
|
+
*/
|
|
179
|
+
export declare function requireTransportableModel(selection: ModelSelection, context: string): ResolvedModel | undefined;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Represent success or failure of an operation with corresponding value or error information */
|
|
2
|
+
export type Outcome<T> = {
|
|
3
|
+
succeeded: true;
|
|
4
|
+
value: T;
|
|
5
|
+
} | {
|
|
6
|
+
succeeded: false;
|
|
7
|
+
error: Error;
|
|
8
|
+
};
|
|
9
|
+
export declare const ok: <T>(value: T) => Outcome<T>;
|
|
10
|
+
export declare const fail: (error: unknown) => Outcome<never>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createD1PrewarmClaimStore` — the cross-isolate half of
|
|
3
|
+
* `createSandboxPrewarmer`'s single-flight, implemented once.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS SHIPS HERE. `SandboxPrewarmerOptions.claim` is REQUIRED and has no
|
|
6
|
+
* default, which is correct — the unsafe behaviour must be said out loud. But
|
|
7
|
+
* "required with no implementation" is how five products end up hand-rolling
|
|
8
|
+
* five subtly different atomic leases, and a lease that is subtly wrong is
|
|
9
|
+
* indistinguishable from one that works until two tabs leak a box. Every
|
|
10
|
+
* agent-app product deploys to Cloudflare Workers with a D1 binding, so the
|
|
11
|
+
* store is the same code in all of them: it is mechanism, not domain, and it
|
|
12
|
+
* belongs beside the prewarmer.
|
|
13
|
+
*
|
|
14
|
+
* The measured stake (staging-sandbox, 2026-07-28): two concurrent
|
|
15
|
+
* `POST /v1/sandboxes` with an identical name BOTH returned HTTP 201 and left
|
|
16
|
+
* two running boxes. The platform does not dedupe by name, so nothing below
|
|
17
|
+
* this line is defensive programming — an unclaimed race genuinely doubles
|
|
18
|
+
* spend.
|
|
19
|
+
*
|
|
20
|
+
* ── ATOMICITY IS THE WHOLE POINT ───────────────────────────────────────────
|
|
21
|
+
* `acquire` is ONE statement. A `SELECT` followed by an `INSERT` is exactly the
|
|
22
|
+
* race this exists to close: both isolates read "free", both write, both warm.
|
|
23
|
+
* The upsert's `DO UPDATE ... WHERE expires_at <= now` means an unexpired claim
|
|
24
|
+
* makes the conflict path a no-op, and `RETURNING` then yields no row — so the
|
|
25
|
+
* loser learns it lost from the same statement that would have made it the
|
|
26
|
+
* winner. `RETURNING` is used rather than `meta.changes` because a no-op upsert
|
|
27
|
+
* reporting `changes: 0` is a SQLite detail, whereas "no row came back" is the
|
|
28
|
+
* statement telling you directly.
|
|
29
|
+
*
|
|
30
|
+
* ── STRUCTURAL, NOT A DEPENDENCY ───────────────────────────────────────────
|
|
31
|
+
* The binding is taken as the narrow shape actually used (`prepare().bind()`,
|
|
32
|
+
* `.first()`, `.run()`), per the package's structural-over-hard-dep rule. No
|
|
33
|
+
* `@cloudflare/workers-types` import, so `/sandbox` stays importable in a plain
|
|
34
|
+
* node test. A real `D1Database` satisfies it.
|
|
35
|
+
*
|
|
36
|
+
* ── THE TABLE IS THE PRODUCT'S MIGRATION, NOT A LAZY CREATE ────────────────
|
|
37
|
+
* The store never runs DDL. A `CREATE TABLE IF NOT EXISTS` on every project
|
|
38
|
+
* open costs a round trip on the exact path this feature exists to keep fast,
|
|
39
|
+
* and it hides schema drift instead of failing on it. `PREWARM_CLAIM_TABLE_DDL`
|
|
40
|
+
* is exported so a product pastes it into a real migration. If the table is
|
|
41
|
+
* missing, `acquire` throws — and the prewarmer treats a throwing claim as a
|
|
42
|
+
* failed warm: it records the failure, emits `onEvent({type:'failed'})`, and
|
|
43
|
+
* degrades to the lazy path. Fail-closed and loud, never a silent double-warm.
|
|
44
|
+
*/
|
|
45
|
+
/** The columns and statements this store uses, and nothing else. A real
|
|
46
|
+
* `D1Database` structurally satisfies it. */
|
|
47
|
+
export interface PrewarmClaimD1Like {
|
|
48
|
+
prepare(query: string): {
|
|
49
|
+
bind(...values: unknown[]): {
|
|
50
|
+
first<T = Record<string, unknown>>(): Promise<T | null>;
|
|
51
|
+
run(): Promise<unknown>;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export interface D1PrewarmClaimStoreOptions {
|
|
56
|
+
/** Defaults to `sandbox_prewarm_claims`. Must be a bare SQL identifier — it
|
|
57
|
+
* is interpolated, because a table name cannot be a bound parameter. */
|
|
58
|
+
table?: string;
|
|
59
|
+
/** Clock seam for tests. */
|
|
60
|
+
now?(): number;
|
|
61
|
+
}
|
|
62
|
+
export declare const DEFAULT_PREWARM_CLAIM_TABLE = "sandbox_prewarm_claims";
|
|
63
|
+
/** Paste into a migration. `expires_at` is epoch MILLISECONDS, matching
|
|
64
|
+
* `Date.now()`, so no unit conversion sits between the lease and its clock. */
|
|
65
|
+
export declare const PREWARM_CLAIM_TABLE_DDL = "CREATE TABLE IF NOT EXISTS sandbox_prewarm_claims (\n key TEXT PRIMARY KEY,\n expires_at INTEGER NOT NULL\n)";
|
|
66
|
+
/**
|
|
67
|
+
* A `PrewarmClaimStore` backed by one D1 table.
|
|
68
|
+
*
|
|
69
|
+
* ```ts
|
|
70
|
+
* const prewarmer = createSandboxPrewarmer(shell, {
|
|
71
|
+
* claim: createD1PrewarmClaimStore(env.DB),
|
|
72
|
+
* mode: 'create-or-resume',
|
|
73
|
+
* })
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare function createD1PrewarmClaimStore(db: PrewarmClaimD1Like, options?: D1PrewarmClaimStoreOptions): {
|
|
77
|
+
acquire(key: string, ttlSeconds: number): Promise<boolean>;
|
|
78
|
+
release(key: string): Promise<void>;
|
|
79
|
+
isHeld(key: string): Promise<boolean>;
|
|
80
|
+
};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createSandboxPrewarmer` — "this user just opened this project; start warming
|
|
3
|
+
* their box" as a shell primitive, so every agent-app product gets the same
|
|
4
|
+
* answer instead of forking one.
|
|
5
|
+
*
|
|
6
|
+
* WHY THIS IS SHELL, NOT ENGINE. The engine rule asks whether the capability
|
|
7
|
+
* makes sense without a specific app's side channel. "Warm a box" does — but
|
|
8
|
+
* `@tangle-network/sandbox` has no notion of a WORKSPACE. It keys boxes by an
|
|
9
|
+
* opaque sandbox id; the workspace→box mapping, the harness match, and the
|
|
10
|
+
* profile materialisation all live in `ensureWorkspaceSandbox` here. A
|
|
11
|
+
* prewarmer is that mapping plus a scheduling policy, so it belongs beside it.
|
|
12
|
+
* It is deliberately NOT a new subpath: it composes `peekWorkspaceSandbox` and
|
|
13
|
+
* `ensureWorkspaceSandbox` directly and needs exactly the peers `/sandbox`
|
|
14
|
+
* already needs, so a separate entry would add a second place to look for "how
|
|
15
|
+
* do I get a box" and buy no peer isolation (the reason `/work-product-react`
|
|
16
|
+
* is split out).
|
|
17
|
+
*
|
|
18
|
+
* WHAT IT IS NOT. It does not make cold starts fast — they already are.
|
|
19
|
+
* Measured on the real platform (staging-sandbox, n=5, 2026-07-28): a box goes
|
|
20
|
+
* from nothing to terminal-ready in 2.34–3.19 s (median 2.73 s), and an
|
|
21
|
+
* already-running box answers in 1.16–2.29 s (median 1.35 s). Prewarming buys
|
|
22
|
+
* ~1.4 s. The reason it matters is not latency: it is that a product which
|
|
23
|
+
* only ever provisions lazily, on a path whose guard never passes, never
|
|
24
|
+
* provisions AT ALL — and the UI then shows a spinner over a box that does not
|
|
25
|
+
* exist and is not being created. That is the failure this primitive removes.
|
|
26
|
+
*
|
|
27
|
+
* ── COST POSTURE (read before adopting) ────────────────────────────────────
|
|
28
|
+
* A warmed box is a REAL charge. It bills from creation until the platform's
|
|
29
|
+
* idle timeout reclaims it — `SandboxRuntimeConfig`'s create-time
|
|
30
|
+
* `idleTimeoutSeconds`, not anything this module sets. A product warming on
|
|
31
|
+
* every project open pays that timeout for every user who opens and bounces.
|
|
32
|
+
* With a 3600 s idle timeout against a ~131 s mean session life, a bounce
|
|
33
|
+
* costs an hour of box time to save ~1.4 s. THAT TRADE IS USUALLY WRONG.
|
|
34
|
+
*
|
|
35
|
+
* So the levers are explicit and the defaults are the cheap ones:
|
|
36
|
+
* - `mode: 'resume-only'` (DEFAULT) never creates a box that does not exist.
|
|
37
|
+
* It only revives one the user already has, so the spend is bounded by
|
|
38
|
+
* boxes the user already caused. This is the safe fleet default.
|
|
39
|
+
* - `mode: 'create-or-resume'` is the owner-requested behaviour — warm on
|
|
40
|
+
* open even for a first-time user. Opt in per product, and lower the
|
|
41
|
+
* shell's `idleTimeoutSeconds` when you do.
|
|
42
|
+
* - `shouldPrewarm(scope)` is the product's own policy hook (paid tier only,
|
|
43
|
+
* returning user only, has-documents only …). Returning false costs nothing.
|
|
44
|
+
* - `failureCooldownMs` stops a hard-failing workspace from retry-storming;
|
|
45
|
+
* every retry is another create attempt, which is more spend.
|
|
46
|
+
* Warm with the SAME harness the next turn will use. `ensureWorkspaceSandbox`
|
|
47
|
+
* DELETES and recreates a name-matched box whose harness differs, so warming
|
|
48
|
+
* `opencode` and then turning `claude-code` pays for two boxes and is slower
|
|
49
|
+
* than not warming at all. The prewarm key includes the harness so the two are
|
|
50
|
+
* never deduped into one.
|
|
51
|
+
*
|
|
52
|
+
* ── SINGLE-FLIGHT (measured, not assumed) ──────────────────────────────────
|
|
53
|
+
* The sandbox platform does NOT dedupe by box name. Two concurrent
|
|
54
|
+
* `POST /v1/sandboxes` with an identical name both returned HTTP 201 and left
|
|
55
|
+
* two running boxes (verified against staging-sandbox, 2026-07-28). So two
|
|
56
|
+
* tabs, or two isolates, racing a warm genuinely leak a box — a prewarm that
|
|
57
|
+
* races is worse than no prewarm. Hence two layers:
|
|
58
|
+
* 1. an in-process map, which is free and catches same-isolate races
|
|
59
|
+
* (double-mount, two requests on one isolate);
|
|
60
|
+
* 2. a `claim` store the product supplies, which is the only thing that can
|
|
61
|
+
* make this correct ACROSS isolates — the usual deployment target here is
|
|
62
|
+
* Cloudflare Workers, where "same isolate" guarantees nothing.
|
|
63
|
+
* `claim` is REQUIRED, with `'single-isolate-only'` as the explicit opt-out,
|
|
64
|
+
* so nobody gets the unsafe behaviour by forgetting a field. Say it out loud
|
|
65
|
+
* or supply a store.
|
|
66
|
+
*
|
|
67
|
+
* ── FAILURE IS LOUD, NEVER FATAL ───────────────────────────────────────────
|
|
68
|
+
* A failed warm degrades to exactly today's lazy path: the next real request
|
|
69
|
+
* calls `ensureWorkspaceSandbox` itself. It never throws into the caller's
|
|
70
|
+
* render path — `completion` RESOLVES with `{ ok: false }` rather than
|
|
71
|
+
* rejecting, because an unhandled rejection handed to `waitUntil` can fail the
|
|
72
|
+
* request it rode in on. But it is never silent: every failure fires
|
|
73
|
+
* `onEvent({ type: 'failed' })` and is readable afterwards through
|
|
74
|
+
* `readiness()` as `{ status: 'failed' }`. The bug class this whole module
|
|
75
|
+
* exists to kill is a soft failure that surfaces as an unusable panel ten
|
|
76
|
+
* minutes later, so a warm that dies must leave a trace a product can render.
|
|
77
|
+
*/
|
|
78
|
+
import type { Harness } from '../harness/index';
|
|
79
|
+
import { type SandboxRuntimeConfig } from './index';
|
|
80
|
+
/** The workspace a warm targets. Mirrors `EnsureWorkspaceSandboxOptions`'
|
|
81
|
+
* identity fields — the prewarmer forwards them verbatim so a warmed box is
|
|
82
|
+
* byte-identical to the one the lazy path would have built. */
|
|
83
|
+
export interface SandboxPrewarmScope {
|
|
84
|
+
workspaceId: string;
|
|
85
|
+
userId?: string;
|
|
86
|
+
/** Must match the harness the next turn will use — see the cost note above. */
|
|
87
|
+
harness: Harness;
|
|
88
|
+
billingOwnerId?: string;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Cross-isolate claim. `acquire` must be atomic (a D1 conditional insert, a DO,
|
|
92
|
+
* a KV `put` with `onlyIf`) — a read-then-write is exactly the race this exists
|
|
93
|
+
* to close. `ttlSeconds` bounds a claim leaked by an isolate that died
|
|
94
|
+
* mid-warm; without expiry a single crash wedges a workspace forever.
|
|
95
|
+
*/
|
|
96
|
+
export interface PrewarmClaimStore {
|
|
97
|
+
/** True when THIS caller now owns the right to warm `key`. */
|
|
98
|
+
acquire(key: string, ttlSeconds: number): Promise<boolean>;
|
|
99
|
+
/** Best-effort release. A throw here is swallowed — the TTL is the backstop. */
|
|
100
|
+
release(key: string): Promise<void>;
|
|
101
|
+
/** Optional: lets `readiness()` report `warming` for a warm running in
|
|
102
|
+
* ANOTHER isolate. Without it, `warming` is only visible in the isolate
|
|
103
|
+
* that started it, and every other one reports `absent`. */
|
|
104
|
+
isHeld?(key: string): Promise<boolean>;
|
|
105
|
+
}
|
|
106
|
+
/** What `prewarm()` decided. Every value except `started` means no box was
|
|
107
|
+
* created and nothing was spent on this call. */
|
|
108
|
+
export type PrewarmOutcome = 'started' | 'already-running' | 'already-warming' | 'warming-elsewhere' | 'declined-by-policy' | 'cooling-down' | 'absent-and-resume-only';
|
|
109
|
+
/** Terminal result of a warm this caller owns. Never a rejection. */
|
|
110
|
+
export interface PrewarmResult {
|
|
111
|
+
ok: boolean;
|
|
112
|
+
boxId?: string;
|
|
113
|
+
error?: string;
|
|
114
|
+
/** Wall time of the warm itself, for the product's own timing trace. */
|
|
115
|
+
ms: number;
|
|
116
|
+
}
|
|
117
|
+
export interface PrewarmDecision {
|
|
118
|
+
outcome: PrewarmOutcome;
|
|
119
|
+
/** Present ONLY when `outcome === 'started'`. Hand it to `ctx.waitUntil` so a
|
|
120
|
+
* client disconnect cannot kill the warm. Never rejects. */
|
|
121
|
+
completion?: Promise<PrewarmResult>;
|
|
122
|
+
}
|
|
123
|
+
/** Readiness for the UI. `ready`/`warming` reuse the vocabulary
|
|
124
|
+
* `createSandboxFileIndexRoute` (`/chat-routes`) and `useFileMentions`
|
|
125
|
+
* (`/web-react`) already speak, so a product renders ONE warming state rather
|
|
126
|
+
* than inventing a second spinner for boxes. */
|
|
127
|
+
export type SandboxReadiness = {
|
|
128
|
+
status: 'ready';
|
|
129
|
+
boxId: string;
|
|
130
|
+
} | {
|
|
131
|
+
status: 'warming';
|
|
132
|
+
} | {
|
|
133
|
+
status: 'absent';
|
|
134
|
+
} | {
|
|
135
|
+
status: 'failed';
|
|
136
|
+
error: string;
|
|
137
|
+
retryAfterMs: number;
|
|
138
|
+
};
|
|
139
|
+
export type PrewarmEvent = {
|
|
140
|
+
type: 'started';
|
|
141
|
+
key: string;
|
|
142
|
+
workspaceId: string;
|
|
143
|
+
} | {
|
|
144
|
+
type: 'succeeded';
|
|
145
|
+
key: string;
|
|
146
|
+
workspaceId: string;
|
|
147
|
+
boxId: string;
|
|
148
|
+
ms: number;
|
|
149
|
+
} | {
|
|
150
|
+
type: 'failed';
|
|
151
|
+
key: string;
|
|
152
|
+
workspaceId: string;
|
|
153
|
+
error: string;
|
|
154
|
+
ms: number;
|
|
155
|
+
} | {
|
|
156
|
+
type: 'skipped';
|
|
157
|
+
key: string;
|
|
158
|
+
workspaceId: string;
|
|
159
|
+
outcome: PrewarmOutcome;
|
|
160
|
+
};
|
|
161
|
+
export interface SandboxPrewarmerOptions {
|
|
162
|
+
/** Cross-isolate single-flight, or the explicit acknowledgement that you are
|
|
163
|
+
* accepting per-isolate dedupe only. No default — see the header. */
|
|
164
|
+
claim: PrewarmClaimStore | 'single-isolate-only';
|
|
165
|
+
/** `'resume-only'` (default) never creates a box that does not exist.
|
|
166
|
+
* `'create-or-resume'` warms from nothing — the expensive one. */
|
|
167
|
+
mode?: 'resume-only' | 'create-or-resume';
|
|
168
|
+
/** Product policy gate. Not called when a box is already running. */
|
|
169
|
+
shouldPrewarm?(scope: SandboxPrewarmScope): boolean | Promise<boolean>;
|
|
170
|
+
/** Observability seam. A failed warm MUST be visible somewhere. */
|
|
171
|
+
onEvent?(event: PrewarmEvent): void;
|
|
172
|
+
/** Claim lifetime. Default 180 s — comfortably over a cold create. */
|
|
173
|
+
claimTtlSeconds?: number;
|
|
174
|
+
/** Suppress re-warming a workspace that just failed. Default 60_000 ms. */
|
|
175
|
+
failureCooldownMs?: number;
|
|
176
|
+
/** Clock seam for tests. */
|
|
177
|
+
now?(): number;
|
|
178
|
+
}
|
|
179
|
+
export interface SandboxPrewarmer {
|
|
180
|
+
/**
|
|
181
|
+
* Non-blocking warm. The returned promise settles as soon as the DECISION is
|
|
182
|
+
* known (at most one `list()` against the platform, plus a claim `acquire`);
|
|
183
|
+
* the provisioning itself rides on `completion`. On a render path either
|
|
184
|
+
* ignore the returned promise or run the whole call inside `waitUntil` — do
|
|
185
|
+
* not await `completion` before responding.
|
|
186
|
+
*/
|
|
187
|
+
prewarm(scope: SandboxPrewarmScope): Promise<PrewarmDecision>;
|
|
188
|
+
/** Zero-provisioning status read for a UI. Never creates or resumes. */
|
|
189
|
+
readiness(scope: SandboxPrewarmScope): Promise<SandboxReadiness>;
|
|
190
|
+
/** Clear a recorded failure so the next `prewarm` retries immediately. */
|
|
191
|
+
clearFailure(scope: SandboxPrewarmScope): void;
|
|
192
|
+
}
|
|
193
|
+
export declare function createSandboxPrewarmer(shell: SandboxRuntimeConfig, options: SandboxPrewarmerOptions): SandboxPrewarmer;
|