@vellumai/assistant 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +38 -56
- package/Dockerfile +2 -0
- package/README.md +3 -4
- package/__tests__/permissions/gateway-threshold-reader.test.ts +88 -142
- package/bun.lock +29 -26
- package/docs/architecture/security.md +38 -16
- package/docs/plugins.md +7 -9
- package/knip.json +2 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +39 -1
- package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
- package/node_modules/@vellumai/service-contracts/package.json +2 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +9 -5
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
- package/node_modules/@vellumai/slack-text/bun.lock +24 -0
- package/node_modules/@vellumai/slack-text/package.json +18 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
- package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
- package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
- package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
- package/node_modules/@vellumai/twilio-client/package.json +18 -0
- package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
- package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
- package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
- package/openapi.yaml +869 -129
- package/package.json +8 -3
- package/scripts/generate-openapi.ts +16 -111
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
- package/src/__tests__/anthropic-provider.test.ts +56 -13
- package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
- package/src/__tests__/app-bundler.test.ts +170 -1
- package/src/__tests__/app-control-flow.test.ts +374 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
- package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
- package/src/__tests__/app-conversation-ids.test.ts +151 -0
- package/src/__tests__/app-executors.test.ts +30 -43
- package/src/__tests__/approval-cascade.test.ts +0 -15
- package/src/__tests__/approval-routes-http.test.ts +29 -23
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
- package/src/__tests__/assistant-event-hub.test.ts +235 -79
- package/src/__tests__/assistant-event.test.ts +10 -5
- package/src/__tests__/assistant-events-sse-hardening.test.ts +44 -17
- package/src/__tests__/assistant-feature-flags-integration.test.ts +11 -36
- package/src/__tests__/background-shell-host-bash.test.ts +46 -56
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
- package/src/__tests__/btw-routes.test.ts +13 -4
- package/src/__tests__/call-controller.test.ts +50 -2
- package/src/__tests__/call-domain.test.ts +0 -2
- package/src/__tests__/call-routes-http.test.ts +0 -2
- package/src/__tests__/call-site-routing-provider.test.ts +193 -0
- package/src/__tests__/channel-approval-routes.test.ts +10 -296
- package/src/__tests__/channel-approvals.test.ts +25 -17
- package/src/__tests__/channel-guardian.test.ts +100 -146
- package/src/__tests__/channel-readiness-service.test.ts +59 -1
- package/src/__tests__/checker.test.ts +23 -38
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/config-loader-backfill.test.ts +90 -155
- package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-schema.test.ts +6 -48
- package/src/__tests__/config-set-platform-guard.test.ts +48 -4
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +2 -2
- package/src/__tests__/config-watcher.test.ts +14 -2
- package/src/__tests__/connection-policy.test.ts +1 -52
- package/src/__tests__/contacts-write.test.ts +2 -64
- package/src/__tests__/context-image-dimensions.test.ts +1 -1
- package/src/__tests__/context-search-memory-source.test.ts +120 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
- package/src/__tests__/context-search-pkb-source.test.ts +49 -0
- package/src/__tests__/context-search-workspace-source.test.ts +9 -22
- package/src/__tests__/context-window-manager.test.ts +46 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
- package/src/__tests__/conversation-agent-loop.test.ts +980 -13
- package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
- package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
- package/src/__tests__/conversation-history-web-search.test.ts +4 -3
- package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-lifecycle.test.ts +40 -4
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
- package/src/__tests__/conversation-process-callsite.test.ts +79 -2
- package/src/__tests__/conversation-queue.test.ts +3 -8
- package/src/__tests__/conversation-routes-disk-view.test.ts +7 -161
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -104
- package/src/__tests__/conversation-routes-slash-commands.test.ts +76 -66
- package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
- package/src/__tests__/conversation-slash-commands.test.ts +24 -8
- package/src/__tests__/conversation-slash-queue.test.ts +2 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-starter-routes.test.ts +79 -2
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +317 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
- package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
- package/src/__tests__/conversation-usage.test.ts +253 -3
- package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
- package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
- package/src/__tests__/credential-health-service.test.ts +68 -0
- package/src/__tests__/credential-security-e2e.test.ts +4 -3
- package/src/__tests__/credential-security-invariants.test.ts +1 -5
- package/src/__tests__/credential-token-resolver.test.ts +180 -0
- package/src/__tests__/credentials-cli.test.ts +5 -12
- package/src/__tests__/cu-unified-flow.test.ts +206 -27
- package/src/__tests__/daemon-assistant-events.test.ts +34 -21
- package/src/__tests__/daemon-credential-client.test.ts +102 -17
- package/src/__tests__/db-connection-isolation.test.ts +125 -0
- package/src/__tests__/db-migration-rollback.test.ts +101 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
- package/src/__tests__/document-conversations.test.ts +332 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
- package/src/__tests__/emit-event-signal.test.ts +4 -6
- package/src/__tests__/events-client-registration.test.ts +193 -49
- package/src/__tests__/filing-service.test.ts +58 -7
- package/src/__tests__/first-greeting.test.ts +156 -150
- package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -1
- package/src/__tests__/guardian-grant-minting.test.ts +7 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
- package/src/__tests__/guardian-routing-state.test.ts +1 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +30 -11
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -84
- package/src/__tests__/headless-browser-mode.test.ts +4 -9
- package/src/__tests__/headless-browser-navigate.test.ts +21 -20
- package/src/__tests__/heartbeat-service.test.ts +1007 -8
- package/src/__tests__/helpers/call-route-handler.ts +7 -1
- package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
- package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
- package/src/__tests__/host-app-control-proxy.test.ts +602 -0
- package/src/__tests__/host-app-control-routes.test.ts +263 -0
- package/src/__tests__/host-bash-proxy.test.ts +270 -147
- package/src/__tests__/host-bash-routes.test.ts +294 -0
- package/src/__tests__/host-browser-proxy.test.ts +126 -198
- package/src/__tests__/host-browser-routes.test.ts +50 -54
- package/src/__tests__/host-cu-proxy.test.ts +78 -144
- package/src/__tests__/host-cu-routes-targeted.test.ts +300 -0
- package/src/__tests__/host-file-edit-tool.test.ts +47 -1
- package/src/__tests__/host-file-proxy-targeted.test.ts +339 -0
- package/src/__tests__/host-file-proxy.test.ts +62 -122
- package/src/__tests__/host-file-read-tool.test.ts +59 -21
- package/src/__tests__/host-file-routes-targeted.test.ts +262 -0
- package/src/__tests__/host-file-write-tool.test.ts +42 -1
- package/src/__tests__/host-proxy-base.test.ts +312 -0
- package/src/__tests__/host-shell-tool.test.ts +53 -70
- package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +583 -0
- package/src/__tests__/host-transfer-proxy.test.ts +145 -56
- package/src/__tests__/host-transfer-routes-targeted.test.ts +447 -0
- package/src/__tests__/http-user-message-parity.test.ts +1 -6
- package/src/__tests__/identity-intro-cache.test.ts +29 -0
- package/src/__tests__/identity-routes.test.ts +103 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
- package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
- package/src/__tests__/injector-chain.test.ts +10 -5
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -67
- package/src/__tests__/inline-skill-load-permissions.test.ts +5 -13
- package/src/__tests__/install-skill-routing.test.ts +1 -13
- package/src/__tests__/integration-status.test.ts +85 -5
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
- package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
- package/src/__tests__/llm-catalog-parity.test.ts +90 -0
- package/src/__tests__/llm-context-resolution.test.ts +180 -0
- package/src/__tests__/llm-resolver.test.ts +80 -12
- package/src/__tests__/llm-usage-store.test.ts +269 -4
- package/src/__tests__/log-export-routes.test.ts +89 -0
- package/src/__tests__/managed-profile-guard.test.ts +225 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -11
- package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
- package/src/__tests__/mcp-auth-routes.test.ts +197 -0
- package/src/__tests__/mcp-cli.test.ts +338 -2
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
- package/src/__tests__/migration-export-http.test.ts +33 -26
- package/src/__tests__/migration-export-streaming.test.ts +18 -10
- package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
- package/src/__tests__/migration-import-commit-http.test.ts +172 -21
- package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
- package/src/__tests__/migration-import-from-url.test.ts +20 -6
- package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
- package/src/__tests__/migration-parity-persistence.test.ts +62 -25
- package/src/__tests__/migration-transport.test.ts +115 -23
- package/src/__tests__/migration-validate-http.test.ts +105 -80
- package/src/__tests__/migration-wizard.test.ts +133 -27
- package/src/__tests__/mock-gateway-ipc.ts +1 -0
- package/src/__tests__/non-member-access-request.test.ts +1 -1
- package/src/__tests__/notification-guardian-path.test.ts +1 -1
- package/src/__tests__/oauth-cli.test.ts +0 -2
- package/src/__tests__/oauth-store.test.ts +19 -0
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +26 -21
- package/src/__tests__/prechat-onboarding-contract.test.ts +34 -8
- package/src/__tests__/pricing.test.ts +68 -4
- package/src/__tests__/process-message-background-slack.test.ts +333 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
- package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
- package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
- package/src/__tests__/provider-usage-tracking.test.ts +208 -0
- package/src/__tests__/public-ingress-urls.test.ts +97 -0
- package/src/__tests__/reaction-persistence.test.ts +9 -6
- package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
- package/src/__tests__/recording-handler.test.ts +64 -81
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
- package/src/__tests__/relay-server.test.ts +18 -13
- package/src/__tests__/require-fresh-approval.test.ts +13 -23
- package/src/__tests__/retry-backoff.test.ts +87 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +13 -18
- package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
- package/src/__tests__/schedule-retry.test.ts +715 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
- package/src/__tests__/search-skills-unified.test.ts +9 -15
- package/src/__tests__/secret-ingress-cli.test.ts +2 -5
- package/src/__tests__/secret-ingress-http.test.ts +1 -4
- package/src/__tests__/secret-onetime-send.test.ts +4 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
- package/src/__tests__/secret-response-routing.test.ts +29 -15
- package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
- package/src/__tests__/secret-scanner.test.ts +2 -545
- package/src/__tests__/send-endpoint-busy.test.ts +12 -24
- package/src/__tests__/settings-routes.test.ts +1 -1
- package/src/__tests__/shell-credential-ref.test.ts +0 -8
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -57
- package/src/__tests__/skill-feature-flags.test.ts +43 -41
- package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
- package/src/__tests__/skill-load-inline-command.test.ts +0 -51
- package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -12
- package/src/__tests__/skill-tool-factory.test.ts +97 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
- package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
- package/src/__tests__/slack-channel-config.test.ts +9 -14
- package/src/__tests__/slack-inbound-verification.test.ts +1 -62
- package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
- package/src/__tests__/subagent-manager-notify.test.ts +70 -70
- package/src/__tests__/subagent-notify-parent.test.ts +80 -83
- package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
- package/src/__tests__/system-prompt.test.ts +115 -14
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +0 -89
- package/src/__tests__/test-preload.ts +8 -0
- package/src/__tests__/thread-backfill.test.ts +945 -31
- package/src/__tests__/tool-approval-handler.test.ts +3 -4
- package/src/__tests__/tool-audit-listener.test.ts +48 -0
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -7
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -17
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -8
- package/src/__tests__/tool-executor.test.ts +12 -20
- package/src/__tests__/tool-metrics-listener.test.ts +0 -35
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-trace-listener.test.ts +0 -17
- package/src/__tests__/transfer-progress-screen.test.ts +63 -26
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
- package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/tts-catalog-parity.test.ts +16 -5
- package/src/__tests__/twilio-config.test.ts +3 -16
- package/src/__tests__/twilio-routes.test.ts +3 -5
- package/src/__tests__/twilio-validation.test.ts +93 -0
- package/src/__tests__/usage-attribution.test.ts +247 -0
- package/src/__tests__/usage-cli.test.ts +143 -0
- package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
- package/src/__tests__/usage-routes.test.ts +150 -0
- package/src/__tests__/validation-results-screen.test.ts +39 -16
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +47 -138
- package/src/__tests__/verification-control-plane-policy.test.ts +6 -11
- package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
- package/src/__tests__/voice-session-bridge.test.ts +5 -5
- package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
- package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
- package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
- package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
- package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
- package/src/acp/index.ts +0 -15
- package/src/acp/session-manager.ts +37 -34
- package/src/agent/loop.ts +16 -1
- package/src/approvals/AGENTS.md +4 -0
- package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
- package/src/approvals/guardian-request-resolvers.ts +10 -2
- package/src/backup/__tests__/paths.test.ts +0 -22
- package/src/backup/__tests__/restore.test.ts +94 -177
- package/src/backup/paths.ts +2 -15
- package/src/backup/restore.ts +107 -231
- package/src/browser-session/events.ts +0 -9
- package/src/bundler/app-bundler.ts +51 -3
- package/src/calls/call-store.ts +1 -34
- package/src/calls/guardian-question-copy.ts +0 -108
- package/src/calls/relay-server.ts +4 -68
- package/src/calls/twilio-config.ts +2 -17
- package/src/calls/twilio-rest.ts +31 -141
- package/src/calls/twilio-routes.ts +12 -13
- package/src/calls/voice-session-bridge.ts +7 -38
- package/src/channels/types.ts +8 -42
- package/src/cli/commands/__tests__/backup.test.ts +6 -277
- package/src/cli/commands/__tests__/cache.test.ts +152 -5
- package/src/cli/commands/__tests__/gateway.test.ts +288 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +18 -28
- package/src/cli/commands/__tests__/trust.test.ts +21 -387
- package/src/cli/commands/__tests__/webhooks.test.ts +0 -1
- package/src/cli/commands/backup.ts +6 -331
- package/src/cli/commands/cache-fs.ts +8 -0
- package/src/cli/commands/cache.ts +153 -82
- package/src/cli/commands/clients.ts +64 -7
- package/src/cli/commands/completions.ts +3 -3
- package/src/cli/commands/contacts.ts +304 -76
- package/src/cli/commands/conversations.ts +2 -5
- package/src/cli/commands/credentials.ts +15 -7
- package/src/cli/commands/domain.ts +66 -15
- package/src/cli/commands/gateway.ts +183 -0
- package/src/cli/commands/keys.ts +13 -7
- package/src/cli/commands/mcp.ts +116 -156
- package/src/cli/commands/memory-v2.ts +320 -53
- package/src/cli/commands/oauth/shared.ts +2 -29
- package/src/cli/commands/pending.ts +102 -0
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -2
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -2
- package/src/cli/commands/platform/__tests__/status.test.ts +13 -15
- package/src/cli/commands/platform/disconnect.ts +5 -4
- package/src/cli/commands/platform/index.ts +0 -18
- package/src/cli/commands/skills.ts +77 -35
- package/src/cli/commands/trust.ts +70 -430
- package/src/cli/commands/usage.ts +25 -16
- package/src/cli/lib/daemon-credential-client.ts +115 -19
- package/src/cli/program.ts +4 -0
- package/src/cli.ts +0 -21
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +67 -10
- package/src/config/bundled-skills/acp/SKILL.md +6 -0
- package/src/config/bundled-skills/acp/TOOLS.json +1 -22
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
- package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
- package/src/config/bundled-skills/app-control/SKILL.md +75 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
- package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
- package/src/config/bundled-skills/document/TOOLS.json +0 -8
- package/src/config/bundled-skills/followups/TOOLS.json +0 -12
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
- package/src/config/bundled-skills/messaging/TOOLS.json +14 -44
- package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +19 -4
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
- package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
- package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
- package/src/config/bundled-skills/settings/SKILL.md +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +0 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
- package/src/config/bundled-skills/subagent/SKILL.md +6 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
- package/src/config/bundled-tool-registry.ts +21 -0
- package/src/config/env-registry.ts +12 -4
- package/src/config/env.ts +22 -26
- package/src/config/feature-flag-registry.json +40 -152
- package/src/config/llm-callsite-catalog.ts +12 -0
- package/src/config/llm-context-resolution.ts +80 -0
- package/src/config/llm-resolver.ts +58 -22
- package/src/config/loader.ts +76 -102
- package/src/config/sanitize-for-transfer.ts +2 -0
- package/src/config/schema.ts +2 -158
- package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +8 -4
- package/src/config/schemas/call-site-catalog.ts +271 -0
- package/src/config/schemas/calls.ts +5 -14
- package/src/config/schemas/heartbeat.ts +63 -0
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/ingress.ts +11 -7
- package/src/config/schemas/llm.ts +34 -11
- package/src/config/schemas/memory-lifecycle.ts +77 -24
- package/src/config/schemas/memory-retrieval.ts +2 -2
- package/src/config/schemas/memory-v2.ts +57 -4
- package/src/config/schemas/platform.ts +6 -0
- package/src/config/schemas/security.ts +1 -42
- package/src/config/schemas/services.ts +7 -21
- package/src/config/schemas/skills.ts +5 -11
- package/src/config/schemas/tts.ts +1 -1
- package/src/config/seed-inference-profiles.ts +117 -0
- package/src/config/skills.ts +0 -90
- package/src/config/types.ts +3 -6
- package/src/contacts/contact-store.ts +0 -47
- package/src/contacts/contacts-write.ts +1 -132
- package/src/context/window-manager.ts +43 -5
- package/src/credential-execution/feature-gates.ts +10 -10
- package/src/credential-execution/process-manager.ts +46 -51
- package/src/credential-health/credential-health-service.ts +21 -16
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +126 -5
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
- package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
- package/src/daemon/config-watcher.ts +4 -3
- package/src/daemon/connection-policy.ts +1 -26
- package/src/daemon/conversation-agent-loop-handlers.ts +74 -7
- package/src/daemon/conversation-agent-loop.ts +309 -64
- package/src/daemon/conversation-history.ts +8 -8
- package/src/daemon/conversation-launch.ts +20 -135
- package/src/daemon/conversation-lifecycle.ts +8 -1
- package/src/daemon/conversation-messaging.ts +1 -0
- package/src/daemon/conversation-process.ts +97 -172
- package/src/daemon/conversation-runtime-assembly.ts +219 -76
- package/src/daemon/conversation-slash.ts +47 -5
- package/src/daemon/conversation-store.ts +7 -31
- package/src/daemon/conversation-surfaces.ts +144 -29
- package/src/daemon/conversation-tool-setup.ts +18 -87
- package/src/daemon/conversation-usage.ts +36 -0
- package/src/daemon/conversation.ts +134 -231
- package/src/daemon/daemon-control.ts +3 -71
- package/src/daemon/daemon-skill-host.ts +8 -11
- package/src/daemon/dictation-profile-store.ts +2 -26
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/first-greeting.ts +44 -156
- package/src/daemon/handlers/config-channels.ts +12 -12
- package/src/daemon/handlers/config-ingress.ts +4 -165
- package/src/daemon/handlers/config-model.ts +1 -1
- package/src/daemon/handlers/config-voice.ts +0 -42
- package/src/daemon/handlers/conversations.ts +11 -190
- package/src/daemon/handlers/recording.ts +26 -158
- package/src/daemon/handlers/shared.ts +27 -72
- package/src/daemon/handlers/skills.ts +42 -93
- package/src/daemon/host-app-control-proxy.ts +293 -0
- package/src/daemon/host-bash-proxy.ts +124 -92
- package/src/daemon/host-browser-proxy.ts +111 -88
- package/src/daemon/host-cu-proxy.ts +100 -104
- package/src/daemon/host-file-proxy.ts +136 -91
- package/src/daemon/host-proxy-base.ts +294 -0
- package/src/daemon/host-proxy-preactivation.ts +82 -0
- package/src/daemon/host-transfer-proxy.ts +303 -147
- package/src/daemon/lifecycle.ts +164 -132
- package/src/daemon/message-protocol.ts +3 -8
- package/src/daemon/message-types/contacts.ts +23 -1
- package/src/daemon/message-types/conversations.ts +18 -8
- package/src/daemon/message-types/host-app-control.ts +150 -0
- package/src/daemon/message-types/host-bash.ts +5 -0
- package/src/daemon/message-types/host-cu.ts +3 -0
- package/src/daemon/message-types/host-file.ts +5 -0
- package/src/daemon/message-types/host-transfer.ts +4 -0
- package/src/daemon/message-types/messages.ts +10 -9
- package/src/daemon/message-types/schedules.ts +8 -3
- package/src/daemon/message-types/skills.ts +2 -2
- package/src/daemon/message-types/workspace.ts +1 -1
- package/src/daemon/process-message.ts +119 -239
- package/src/daemon/server.ts +13 -462
- package/src/daemon/shutdown-handlers.ts +2 -5
- package/src/daemon/tool-setup-types.ts +51 -0
- package/src/daemon/tool-side-effects.ts +126 -108
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +4 -9
- package/src/events/domain-events.ts +0 -8
- package/src/events/tool-audit-listener.ts +5 -2
- package/src/events/tool-domain-event-publisher.ts +0 -10
- package/src/events/tool-metrics-listener.ts +0 -17
- package/src/events/tool-trace-listener.ts +0 -14
- package/src/filing/filing-service.ts +13 -1
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +21 -9
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +216 -0
- package/src/heartbeat/heartbeat-run-store.ts +236 -0
- package/src/heartbeat/heartbeat-service.ts +303 -54
- package/src/home/__tests__/feed-writer.test.ts +0 -4
- package/src/home/__tests__/post-connect-feed.test.ts +99 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +41 -9
- package/src/home/__tests__/suggested-prompts.test.ts +89 -0
- package/src/home/feed-writer.ts +1 -2
- package/src/home/post-connect-feed.ts +68 -0
- package/src/home/relationship-state-writer.ts +33 -95
- package/src/home/suggested-prompts.ts +46 -10
- package/src/inbound/public-ingress-urls.ts +32 -34
- package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
- package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
- package/src/ipc/assistant-server.ts +17 -11
- package/src/ipc/cli-client.ts +32 -1
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
- package/src/ipc/routes/route-adapter.ts +1 -1
- package/src/ipc/routes/trust-rules.test.ts +0 -95
- package/src/ipc/skill-ipc-types.ts +41 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
- package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
- package/src/ipc/skill-routes/events.ts +12 -23
- package/src/ipc/skill-routes/identity.ts +4 -17
- package/src/ipc/skill-routes/index.ts +1 -1
- package/src/ipc/skill-server.ts +6 -39
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
- package/src/live-voice/live-voice-metrics.ts +10 -10
- package/src/live-voice/protocol.ts +4 -13
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
- package/src/mcp/manager.ts +0 -5
- package/src/mcp/mcp-auth-orchestrator.ts +213 -0
- package/src/mcp/mcp-auth-state.ts +133 -0
- package/src/mcp/mcp-oauth-provider.ts +19 -0
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
- package/src/memory/anisotropy.test.ts +247 -0
- package/src/memory/anisotropy.ts +443 -0
- package/src/memory/app-git-service.ts +0 -32
- package/src/memory/app-store.ts +154 -0
- package/src/memory/attachments-store.ts +6 -0
- package/src/memory/auto-analysis-constants.ts +17 -0
- package/src/memory/auto-analysis-guard.ts +5 -15
- package/src/memory/canonical-guardian-store.ts +7 -7
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
- package/src/memory/context-search/agent-protocol.ts +6 -6
- package/src/memory/context-search/agent-runner.ts +32 -7
- package/src/memory/context-search/sources/memory-v2.ts +590 -0
- package/src/memory/context-search/sources/memory.ts +5 -0
- package/src/memory/context-search/sources/pkb.ts +10 -1
- package/src/memory/context-search/sources/workspace.ts +3 -2
- package/src/memory/conversation-crud.ts +30 -5
- package/src/memory/conversation-disk-view.ts +1 -5
- package/src/memory/conversation-key-store.ts +2 -15
- package/src/memory/conversation-starter-checkpoints.ts +63 -0
- package/src/memory/db-connection.ts +62 -0
- package/src/memory/db-init.ts +18 -0
- package/src/memory/embedding-backend.ts +12 -42
- package/src/memory/embedding-gemini.ts +0 -2
- package/src/memory/embedding-local.ts +6 -6
- package/src/memory/embedding-ollama.ts +6 -6
- package/src/memory/embedding-openai.ts +6 -6
- package/src/memory/embedding-types.ts +21 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +49 -8
- package/src/memory/graph/conversation-graph-memory.ts +35 -36
- package/src/memory/graph/graph-search.ts +8 -0
- package/src/memory/graph/injection.test.ts +2 -2
- package/src/memory/graph/injection.ts +1 -1
- package/src/memory/graph/retriever.ts +28 -0
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/guardian-action-store.ts +0 -83
- package/src/memory/guardian-approvals.ts +0 -48
- package/src/memory/indexer.ts +1 -15
- package/src/memory/job-handlers/conversation-starters.ts +36 -53
- package/src/memory/job-utils.ts +0 -6
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
- package/src/memory/jobs/embed-concept-page.ts +28 -2
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
- package/src/memory/jobs-store.ts +66 -23
- package/src/memory/jobs-worker.ts +114 -79
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +129 -43
- package/src/memory/memory-v2-activation-log-store.ts +115 -0
- package/src/memory/migrations/233-document-conversations.ts +54 -0
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
- package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
- package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
- package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
- package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
- package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
- package/src/memory/migrations/index.ts +19 -0
- package/src/memory/migrations/registry.ts +32 -0
- package/src/memory/pkb/pkb-search.ts +7 -0
- package/src/memory/qdrant-client.ts +50 -20
- package/src/memory/raw-query.ts +2 -68
- package/src/memory/schema/conversations.ts +7 -0
- package/src/memory/schema/infrastructure.ts +40 -0
- package/src/memory/search/semantic.ts +12 -16
- package/src/memory/sparse-tokenize.ts +49 -0
- package/src/memory/tool-usage-store.ts +2 -0
- package/src/memory/usage-buckets.ts +40 -1
- package/src/memory/usage-grouped-buckets.ts +127 -0
- package/src/memory/v2/__tests__/activation.test.ts +361 -180
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
- package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
- package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
- package/src/memory/v2/__tests__/injection.test.ts +424 -33
- package/src/memory/v2/__tests__/migration.test.ts +64 -36
- package/src/memory/v2/__tests__/page-store.test.ts +191 -8
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
- package/src/memory/v2/__tests__/sim.test.ts +166 -6
- package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/memory/v2/__tests__/static-context.test.ts +152 -0
- package/src/memory/v2/activation.ts +215 -163
- package/src/memory/v2/backfill-jobs.ts +15 -100
- package/src/memory/v2/consolidation-job.ts +17 -17
- package/src/memory/v2/constants.ts +7 -0
- package/src/memory/v2/edge-index.ts +191 -0
- package/src/memory/v2/injection.ts +241 -84
- package/src/memory/v2/migration.ts +57 -64
- package/src/memory/v2/now-text.ts +2 -3
- package/src/memory/v2/page-store.ts +168 -31
- package/src/memory/v2/prompts/consolidation.ts +385 -88
- package/src/memory/v2/prompts/sweep.ts +3 -3
- package/src/memory/v2/qdrant.ts +99 -1
- package/src/memory/v2/sim.ts +126 -16
- package/src/memory/v2/skill-qdrant.ts +12 -3
- package/src/memory/v2/skill-store.ts +71 -8
- package/src/memory/v2/sparse-bm25.ts +245 -0
- package/src/memory/v2/static-context.ts +63 -0
- package/src/memory/v2/types.ts +10 -20
- package/src/memory/validation.ts +0 -11
- package/src/messaging/draft-store.ts +0 -6
- package/src/messaging/provider-types.ts +8 -0
- package/src/messaging/provider.ts +7 -0
- package/src/messaging/providers/gmail/client.ts +1 -121
- package/src/messaging/providers/gmail/types.ts +0 -49
- package/src/messaging/providers/outlook/client.ts +0 -73
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
- package/src/messaging/providers/slack/adapter.ts +123 -52
- package/src/messaging/providers/slack/backfill.test.ts +95 -6
- package/src/messaging/providers/slack/backfill.ts +89 -11
- package/src/messaging/providers/slack/client.ts +10 -124
- package/src/messaging/providers/slack/message-metadata.ts +12 -2
- package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
- package/src/messaging/providers/slack/render-transcript.ts +126 -25
- package/src/messaging/providers/slack/types.ts +1 -32
- package/src/notifications/README.md +10 -10
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/guardian-question-mode.ts +5 -5
- package/src/oauth/connect-orchestrator.ts +4 -0
- package/src/oauth/connection-resolver.test.ts +8 -0
- package/src/oauth/connection-resolver.ts +8 -16
- package/src/oauth/credential-token-resolver.ts +95 -0
- package/src/oauth/manual-token-connection.ts +26 -34
- package/src/oauth/oauth-store.ts +6 -4
- package/src/outbound-proxy/certs.ts +0 -7
- package/src/outbound-proxy/index.ts +1 -59
- package/src/outbound-proxy/logging.ts +1 -1
- package/src/outbound-proxy/policy.ts +6 -5
- package/src/outbound-proxy/router.ts +2 -1
- package/src/permissions/approval-policy.test.ts +6 -275
- package/src/permissions/approval-policy.ts +0 -51
- package/src/permissions/approval-provenance.test.ts +184 -0
- package/src/permissions/approval-provenance.ts +70 -0
- package/src/permissions/checker.test.ts +0 -1
- package/src/permissions/checker.ts +7 -18
- package/src/permissions/gateway-threshold-reader.ts +6 -1
- package/src/permissions/prompter.ts +43 -3
- package/src/permissions/secret-prompter.ts +25 -48
- package/src/permissions/types.ts +33 -0
- package/src/permissions/workspace-policy.ts +0 -5
- package/src/platform/sync-identity.ts +0 -8
- package/src/plugins/defaults/injectors.ts +69 -2
- package/src/plugins/defaults/overflow-reduce.ts +3 -2
- package/src/plugins/types.ts +8 -0
- package/src/prompts/bootstrap-cleanup.ts +27 -0
- package/src/prompts/system-prompt.ts +37 -88
- package/src/prompts/templates/BOOTSTRAP.md +52 -6
- package/src/prompts/templates/SOUL.md +13 -1
- package/src/prompts/update-bulletin-job.ts +2 -0
- package/src/providers/__tests__/retry-callsite.test.ts +138 -1
- package/src/providers/anthropic/client.ts +72 -33
- package/src/providers/call-site-routing.ts +42 -3
- package/src/providers/gemini/client.ts +18 -2
- package/src/providers/managed-proxy/context.ts +0 -5
- package/src/providers/model-catalog.ts +105 -19
- package/src/providers/openai/chat-completions-provider.ts +6 -0
- package/src/providers/openai/responses-provider.ts +7 -1
- package/src/providers/provider-send-message.ts +45 -2
- package/src/providers/ratelimit.ts +7 -2
- package/src/providers/registry.ts +14 -9
- package/src/providers/retry.ts +96 -8
- package/src/providers/speech-to-text/provider-catalog.ts +7 -8
- package/src/providers/types.ts +13 -0
- package/src/providers/usage-tracking.ts +96 -0
- package/src/runtime/AGENTS.md +10 -6
- package/src/runtime/__tests__/agent-wake.test.ts +89 -0
- package/src/runtime/agent-wake.ts +39 -2
- package/src/runtime/assistant-event-hub.ts +570 -52
- package/src/runtime/assistant-event.ts +2 -6
- package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
- package/src/runtime/auth/context.ts +0 -9
- package/src/runtime/auth/middleware.ts +1 -97
- package/src/runtime/auth/route-policy.ts +30 -9
- package/src/runtime/auth/token-service.ts +0 -11
- package/src/runtime/btw-sidechain.ts +2 -3
- package/src/runtime/channel-approvals.ts +6 -2
- package/src/runtime/channel-invite-transport.ts +2 -48
- package/src/runtime/channel-invite-transports/email.ts +1 -1
- package/src/runtime/channel-invite-transports/slack.ts +1 -1
- package/src/runtime/channel-invite-transports/telegram.ts +1 -1
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
- package/src/runtime/channel-invite-types.ts +54 -0
- package/src/runtime/channel-readiness-service.ts +32 -13
- package/src/runtime/channel-verification-service.ts +3 -5
- package/src/runtime/http-errors.ts +0 -34
- package/src/runtime/http-router.ts +6 -3
- package/src/runtime/http-server.ts +16 -402
- package/src/runtime/http-types.ts +5 -5
- package/src/runtime/interactive-ui.ts +0 -1
- package/src/runtime/middleware/auth.ts +0 -20
- package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
- package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
- package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +296 -80
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
- package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +421 -0
- package/src/runtime/migrations/migration-transport.ts +49 -16
- package/src/runtime/migrations/migration-wizard.ts +2 -2
- package/src/runtime/migrations/origin-mode.ts +40 -0
- package/src/runtime/migrations/vbundle-builder.ts +457 -136
- package/src/runtime/migrations/vbundle-import-analyzer.ts +13 -11
- package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
- package/src/runtime/migrations/vbundle-importer.ts +251 -74
- package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +329 -38
- package/src/runtime/migrations/vbundle-streaming-validator.ts +203 -28
- package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
- package/src/runtime/migrations/vbundle-validator.ts +328 -41
- package/src/runtime/pending-interactions.ts +48 -13
- package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
- package/src/runtime/routes/__tests__/backup-routes.test.ts +49 -168
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +333 -0
- package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
- package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
- package/src/runtime/routes/acp-routes.test.ts +0 -3
- package/src/runtime/routes/acp-routes.ts +3 -7
- package/src/runtime/routes/app-management-routes.ts +18 -9
- package/src/runtime/routes/approval-interception-types.ts +13 -0
- package/src/runtime/routes/approval-routes.ts +55 -14
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
- package/src/runtime/routes/avatar-routes.ts +3 -5
- package/src/runtime/routes/backup-routes.ts +15 -38
- package/src/runtime/routes/browser-routes.ts +1 -15
- package/src/runtime/routes/btw-routes.ts +14 -37
- package/src/runtime/routes/channel-guardian-routes.ts +1 -5
- package/src/runtime/routes/channel-readiness-routes.ts +3 -7
- package/src/runtime/routes/channel-route-shared.ts +2 -28
- package/src/runtime/routes/client-routes.ts +46 -12
- package/src/runtime/routes/consolidation-routes.ts +115 -0
- package/src/runtime/routes/contact-prompt-routes.ts +183 -0
- package/src/runtime/routes/conversation-list-routes.ts +12 -29
- package/src/runtime/routes/conversation-management-routes.ts +14 -51
- package/src/runtime/routes/conversation-query-routes.ts +156 -9
- package/src/runtime/routes/conversation-routes.ts +72 -539
- package/src/runtime/routes/conversation-starter-routes.ts +19 -40
- package/src/runtime/routes/document-pdf-renderer.ts +165 -0
- package/src/runtime/routes/documents-routes.ts +83 -18
- package/src/runtime/routes/errors.ts +19 -4
- package/src/runtime/routes/events-routes.ts +68 -94
- package/src/runtime/routes/filing-routes.ts +18 -1
- package/src/runtime/routes/gateway-log-routes.ts +79 -0
- package/src/runtime/routes/guardian-action-routes.ts +4 -9
- package/src/runtime/routes/guardian-approval-interception.ts +2 -8
- package/src/runtime/routes/heartbeat-routes.ts +103 -38
- package/src/runtime/routes/host-app-control-routes.ts +134 -0
- package/src/runtime/routes/host-bash-routes.ts +37 -6
- package/src/runtime/routes/host-browser-routes.ts +96 -25
- package/src/runtime/routes/host-cu-routes.ts +48 -13
- package/src/runtime/routes/host-file-routes.ts +35 -11
- package/src/runtime/routes/host-transfer-routes.ts +73 -37
- package/src/runtime/routes/http-adapter.ts +1 -0
- package/src/runtime/routes/identity-intro-cache.ts +30 -0
- package/src/runtime/routes/identity-routes.ts +93 -49
- package/src/runtime/routes/inbound-message-handler.ts +581 -146
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -95
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
- package/src/runtime/routes/index.ts +12 -0
- package/src/runtime/routes/integrations/slack/channel.ts +0 -24
- package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
- package/src/runtime/routes/mcp-auth-routes.ts +132 -0
- package/src/runtime/routes/memory-item-routes.ts +10 -12
- package/src/runtime/routes/memory-v2-routes.ts +451 -16
- package/src/runtime/routes/migration-routes.ts +284 -31
- package/src/runtime/routes/playground/guard.ts +1 -1
- package/src/runtime/routes/playground/index.ts +0 -2
- package/src/runtime/routes/recording-routes.ts +4 -24
- package/src/runtime/routes/rename-conversation-routes.ts +2 -6
- package/src/runtime/routes/schedule-routes.ts +10 -6
- package/src/runtime/routes/secret-routes.ts +87 -18
- package/src/runtime/routes/settings-routes.ts +29 -28
- package/src/runtime/routes/skills-routes.ts +12 -31
- package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
- package/src/runtime/routes/task-routes.ts +6 -6
- package/src/runtime/routes/trust-rules-routes.ts +3 -94
- package/src/runtime/routes/types.ts +4 -4
- package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
- package/src/runtime/routes/usage-routes.ts +87 -10
- package/src/runtime/routes/user-routes.ts +17 -31
- package/src/runtime/routes/work-items-routes.ts +1 -4
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
- package/src/runtime/services/analyze-conversation.ts +7 -17
- package/src/runtime/services/conversation-serializer.ts +2 -4
- package/src/runtime/verification-outbound-actions.ts +1 -1
- package/src/runtime/verification-rate-limiter.ts +1 -1
- package/src/runtime/verification-templates.ts +4 -7
- package/src/schedule/integration-status.ts +66 -2
- package/src/schedule/recurrence-engine.ts +4 -1
- package/src/schedule/retry-backoff.ts +18 -0
- package/src/schedule/retry-policy.ts +82 -0
- package/src/schedule/schedule-recovery.ts +64 -0
- package/src/schedule/schedule-store.ts +106 -18
- package/src/schedule/scheduler-types.ts +25 -0
- package/src/schedule/scheduler.ts +63 -38
- package/src/security/oauth-callback-registry.ts +8 -0
- package/src/security/secret-scanner.ts +14 -547
- package/src/security/secure-keys.ts +31 -11
- package/src/security/token-manager.ts +7 -3
- package/src/sequence/analytics.ts +5 -5
- package/src/sequence/engine.ts +1 -1
- package/src/signals/cancel.ts +16 -25
- package/src/signals/conversation-undo.ts +2 -27
- package/src/signals/emit-event.ts +1 -2
- package/src/signals/user-message.ts +108 -22
- package/src/skills/catalog-files.ts +2 -8
- package/src/skills/catalog-install.ts +1 -0
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/include-graph.ts +5 -5
- package/src/skills/inline-command-runner.ts +1 -7
- package/src/skills/remote-skill-policy.ts +5 -5
- package/src/skills/skill-file-provider.ts +1 -1
- package/src/skills/skill-file-types.ts +13 -0
- package/src/skills/skillssh-audit-types.ts +28 -0
- package/src/skills/skillssh-registry.ts +8 -21
- package/src/subagent/manager.ts +67 -84
- package/src/tasks/task-store.ts +1 -28
- package/src/telemetry/types.ts +8 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +59 -15
- package/src/telemetry/usage-telemetry-reporter.ts +4 -5
- package/src/tools/acp/spawn.test.ts +1 -2
- package/src/tools/acp/steer.test.ts +1 -2
- package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
- package/src/tools/apps/executors.ts +56 -69
- package/src/tools/browser/__tests__/browser-status.test.ts +55 -135
- package/src/tools/browser/browser-execution.ts +31 -147
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +145 -70
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
- package/src/tools/browser/cdp-client/factory.ts +62 -91
- package/src/tools/browser/cdp-client/index.ts +1 -27
- package/src/tools/computer-use/definitions.ts +42 -20
- package/src/tools/executor.ts +46 -31
- package/src/tools/host-filesystem/edit.ts +29 -2
- package/src/tools/host-filesystem/read.ts +29 -2
- package/src/tools/host-filesystem/transfer.test.ts +45 -42
- package/src/tools/host-filesystem/transfer.ts +35 -4
- package/src/tools/host-filesystem/write.ts +29 -2
- package/src/tools/host-terminal/host-shell.ts +62 -3
- package/src/tools/network/script-proxy/index.ts +1 -10
- package/src/tools/permission-checker.ts +66 -1
- package/src/tools/schedule/create.ts +6 -0
- package/src/tools/schedule/list.ts +2 -0
- package/src/tools/schedule/update.ts +10 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
- package/src/tools/shared/filesystem/path-policy.ts +25 -1
- package/src/tools/skills/load.ts +0 -32
- package/src/tools/skills/sandbox-runner.ts +1 -6
- package/src/tools/skills/skill-tool-factory.ts +32 -0
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/terminal/shell.ts +2 -78
- package/src/tools/tool-approval-handler.ts +1 -5
- package/src/tools/types.ts +16 -39
- package/src/tts/__tests__/provider-catalog.test.ts +2 -2
- package/src/tts/provider-catalog.ts +1 -1
- package/src/usage/actors.ts +2 -1
- package/src/usage/attribution.ts +185 -0
- package/src/usage/pricing.ts +166 -0
- package/src/usage/types.ts +14 -0
- package/src/util/json.ts +13 -0
- package/src/util/logger.ts +3 -3
- package/src/util/pricing.ts +50 -3
- package/src/work-items/work-item-runner.ts +15 -42
- package/src/workspace/hatched-date.ts +86 -0
- package/src/workspace/migrations/003-seed-device-id.ts +1 -1
- package/src/workspace/migrations/006-services-config.ts +8 -5
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +6 -4
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
- package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +54 -0
- package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
- package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
- package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/utils.ts +21 -0
- package/src/workspace/provider-commit-message-generator.ts +3 -3
- package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -904
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -296
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -431
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
- package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
- package/src/__tests__/secret-detection-handler.test.ts +0 -67
- package/src/__tests__/secret-scanner-executor.test.ts +0 -450
- package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
- package/src/__tests__/terminal-sandbox.test.ts +0 -374
- package/src/__tests__/tool-notification-listener.test.ts +0 -65
- package/src/__tests__/twilio-rest.test.ts +0 -34
- package/src/backup/__tests__/backup-key.test.ts +0 -152
- package/src/backup/__tests__/backup-worker.test.ts +0 -754
- package/src/backup/__tests__/offsite-writer.test.ts +0 -641
- package/src/backup/__tests__/stream-crypt.test.ts +0 -228
- package/src/backup/backup-key.ts +0 -137
- package/src/backup/backup-worker.ts +0 -438
- package/src/backup/offsite-writer.ts +0 -222
- package/src/backup/stream-crypt.ts +0 -263
- package/src/context/__tests__/microcompact.test.ts +0 -805
- package/src/context/microcompact.ts +0 -443
- package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
- package/src/daemon/message-types/pairing.ts +0 -58
- package/src/events/tool-notification-listener.ts +0 -17
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
- package/src/memory/v2/__tests__/edges.test.ts +0 -435
- package/src/memory/v2/edges.ts +0 -217
- package/src/outbound-proxy/config.ts +0 -94
- package/src/outbound-proxy/health.ts +0 -62
- package/src/outbound-proxy/types.ts +0 -150
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
- package/src/runtime/__tests__/client-registry.test.ts +0 -271
- package/src/runtime/capability-tokens.ts +0 -190
- package/src/runtime/chrome-extension-registry.ts +0 -368
- package/src/runtime/client-registry.ts +0 -254
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
- package/src/signals/mcp-reload.ts +0 -18
- package/src/tools/secret-detection-handler.ts +0 -269
- package/src/tools/terminal/backends/native.ts +0 -327
- package/src/tools/terminal/backends/types.ts +0 -37
- package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
- package/src/tools/terminal/sandbox.ts +0 -40
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* - manifest.json: metadata with schema_version, checksums, and bundle info
|
|
6
6
|
* - workspace/: the entire workspace directory tree (new format), OR
|
|
7
7
|
* data/db/assistant.db + config/settings.json (old format)
|
|
8
|
-
* - trust/trust.json: trust rules (optional)
|
|
9
8
|
*
|
|
10
9
|
* Validation steps:
|
|
11
10
|
* 1. Archive structure: valid gzip tar with required entries
|
|
@@ -14,32 +13,181 @@
|
|
|
14
13
|
* 4. Per-file content integrity: SHA-256 of each file matches manifest checksums
|
|
15
14
|
*/
|
|
16
15
|
|
|
17
|
-
import { createHash } from "node:crypto";
|
|
16
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
17
|
+
import { posix } from "node:path";
|
|
18
18
|
import { gunzipSync } from "node:zlib";
|
|
19
19
|
|
|
20
20
|
import { z } from "zod";
|
|
21
21
|
|
|
22
22
|
// ---------------------------------------------------------------------------
|
|
23
|
-
// Manifest schema
|
|
23
|
+
// Manifest schema (v1)
|
|
24
24
|
// ---------------------------------------------------------------------------
|
|
25
25
|
|
|
26
26
|
const ManifestFileEntry = z.object({
|
|
27
|
+
path: z.string().min(1),
|
|
28
|
+
sha256: z.string().regex(/^[0-9a-f]{64}$/),
|
|
29
|
+
size_bytes: z.number().int().nonnegative(),
|
|
30
|
+
link_target: z.string().min(1).optional(),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const AssistantInfo = z.object({
|
|
34
|
+
id: z.string().min(1),
|
|
35
|
+
name: z.string().min(1),
|
|
36
|
+
runtime_version: z.string().min(1),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const Origin = z.object({
|
|
40
|
+
mode: z.enum(["managed", "self-hosted-remote", "self-hosted-local"]),
|
|
41
|
+
platform_version: z.string().optional(),
|
|
42
|
+
hostname: z.string().optional(),
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const Compatibility = z.object({
|
|
46
|
+
min_runtime_version: z.string().min(1),
|
|
47
|
+
max_runtime_version: z.string().nullable(),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const ExportOptions = z.object({
|
|
51
|
+
include_logs: z.boolean(),
|
|
52
|
+
include_browser_state: z.boolean(),
|
|
53
|
+
include_memory_vectors: z.boolean(),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export const ManifestSchema = z
|
|
57
|
+
.object({
|
|
58
|
+
schema_version: z.literal(1),
|
|
59
|
+
bundle_id: z.string().uuid(),
|
|
60
|
+
created_at: z.string().datetime({ offset: true }),
|
|
61
|
+
assistant: AssistantInfo,
|
|
62
|
+
origin: Origin,
|
|
63
|
+
compatibility: Compatibility,
|
|
64
|
+
contents: z.array(ManifestFileEntry),
|
|
65
|
+
checksum: z.string().regex(/^[0-9a-f]{64}$/),
|
|
66
|
+
secrets_redacted: z.boolean(),
|
|
67
|
+
export_options: ExportOptions,
|
|
68
|
+
})
|
|
69
|
+
.refine((m) => m.origin.mode !== "managed" || m.secrets_redacted === true, {
|
|
70
|
+
message: "secrets_redacted must be true when origin.mode is 'managed'",
|
|
71
|
+
path: ["secrets_redacted"],
|
|
72
|
+
})
|
|
73
|
+
.refine(
|
|
74
|
+
(m) =>
|
|
75
|
+
m.contents.some(
|
|
76
|
+
(f) =>
|
|
77
|
+
f.path === "data/db/assistant.db" ||
|
|
78
|
+
f.path === "workspace/data/db/assistant.db",
|
|
79
|
+
),
|
|
80
|
+
{
|
|
81
|
+
message:
|
|
82
|
+
"contents must include an entry for data/db/assistant.db (legacy format) or workspace/data/db/assistant.db (current format)",
|
|
83
|
+
path: ["contents"],
|
|
84
|
+
},
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
export type ManifestFileEntryType = z.infer<typeof ManifestFileEntry>;
|
|
88
|
+
export type ManifestType = z.infer<typeof ManifestSchema>;
|
|
89
|
+
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// Legacy manifest schema (pre-v1, six-field shape)
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
//
|
|
94
|
+
// Older runtime versions wrote a six-field manifest with `schema_version: "1.0"`,
|
|
95
|
+
// `files`, `size` (per-entry), and a self-referencing `manifest_sha256` field.
|
|
96
|
+
// Existing on-disk artifacts produced by those versions — backup snapshots,
|
|
97
|
+
// cross-version migration bundles — must keep validating after upgrade,
|
|
98
|
+
// per AGENTS.md "no silent breaks of persisted state".
|
|
99
|
+
//
|
|
100
|
+
// We accept legacy bundles via a fallback parse + translator so the rest of
|
|
101
|
+
// the validation pipeline (per-file hash + size verification) only ever sees
|
|
102
|
+
// the v1 shape.
|
|
103
|
+
|
|
104
|
+
const LegacyManifestFileEntry = z.object({
|
|
27
105
|
path: z.string(),
|
|
28
106
|
sha256: z.string(),
|
|
29
107
|
size: z.number().int().nonnegative(),
|
|
30
108
|
});
|
|
31
109
|
|
|
32
|
-
export const
|
|
110
|
+
export const LegacyManifestSchema = z.object({
|
|
33
111
|
schema_version: z.string(),
|
|
34
112
|
created_at: z.string(),
|
|
35
113
|
source: z.string().optional(),
|
|
36
114
|
description: z.string().optional(),
|
|
37
|
-
files: z.array(
|
|
115
|
+
files: z.array(LegacyManifestFileEntry),
|
|
38
116
|
manifest_sha256: z.string(),
|
|
39
117
|
});
|
|
40
118
|
|
|
41
|
-
export type
|
|
42
|
-
|
|
119
|
+
export type LegacyManifestType = z.infer<typeof LegacyManifestSchema>;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Recompute the legacy `manifest_sha256` field — strips the field entirely
|
|
123
|
+
* (rather than emptying it) before canonicalizing, matching the pre-v1
|
|
124
|
+
* producer behavior. Required so legacy bundles whose checksum was computed
|
|
125
|
+
* the old way still verify after upgrade.
|
|
126
|
+
*/
|
|
127
|
+
export function computeLegacyManifestSha256(manifest: unknown): string {
|
|
128
|
+
const copy = { ...(manifest as Record<string, unknown>) };
|
|
129
|
+
delete copy.manifest_sha256;
|
|
130
|
+
return sha256Hex(canonicalizeJson(copy));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Coerce a legacy ISO-ish `created_at` into the v1 datetime regex shape.
|
|
135
|
+
* Pre-v1 producers always wrote `new Date().toISOString()`, which already
|
|
136
|
+
* has the `Z` suffix the v1 regex requires; this helper is defensive against
|
|
137
|
+
* any historical producer that omitted the offset/`Z`.
|
|
138
|
+
*/
|
|
139
|
+
function coerceLegacyCreatedAt(raw: string): string {
|
|
140
|
+
// If the string already parses as a Date, keep it as the canonical ISO form.
|
|
141
|
+
const parsed = new Date(raw);
|
|
142
|
+
if (!Number.isNaN(parsed.getTime())) {
|
|
143
|
+
// `toISOString()` always emits the `...Z` form the v1 regex accepts.
|
|
144
|
+
return parsed.toISOString();
|
|
145
|
+
}
|
|
146
|
+
return raw;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Translate a parsed legacy manifest into a v1 `ManifestType` so the rest of
|
|
151
|
+
* the validator pipeline can operate on a uniform shape.
|
|
152
|
+
*
|
|
153
|
+
* Legacy bundles never carried assistant identity, origin, compatibility, or
|
|
154
|
+
* export-option signals; we substitute conservative placeholders that satisfy
|
|
155
|
+
* the v1 schema's `.refine()` rules without misrepresenting the source bundle.
|
|
156
|
+
*/
|
|
157
|
+
export function translateLegacyManifest(
|
|
158
|
+
legacy: LegacyManifestType,
|
|
159
|
+
): ManifestType {
|
|
160
|
+
return {
|
|
161
|
+
schema_version: 1,
|
|
162
|
+
bundle_id: randomUUID(),
|
|
163
|
+
created_at: coerceLegacyCreatedAt(legacy.created_at),
|
|
164
|
+
assistant: {
|
|
165
|
+
id: "self",
|
|
166
|
+
name: "Assistant",
|
|
167
|
+
runtime_version: "0.0.0-legacy",
|
|
168
|
+
},
|
|
169
|
+
// Legacy bundles came from the local self-hosted exporter; the
|
|
170
|
+
// conservative default is "self-hosted-local" so the v1 managed/secrets
|
|
171
|
+
// refine never trips on a translated legacy bundle.
|
|
172
|
+
origin: { mode: "self-hosted-local" },
|
|
173
|
+
compatibility: {
|
|
174
|
+
min_runtime_version: "0.0.0-legacy",
|
|
175
|
+
max_runtime_version: null,
|
|
176
|
+
},
|
|
177
|
+
contents: legacy.files.map((f) => ({
|
|
178
|
+
path: f.path,
|
|
179
|
+
sha256: f.sha256,
|
|
180
|
+
size_bytes: f.size,
|
|
181
|
+
})),
|
|
182
|
+
checksum: legacy.manifest_sha256,
|
|
183
|
+
secrets_redacted: false,
|
|
184
|
+
export_options: {
|
|
185
|
+
include_logs: false,
|
|
186
|
+
include_browser_state: false,
|
|
187
|
+
include_memory_vectors: false,
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
}
|
|
43
191
|
|
|
44
192
|
// ---------------------------------------------------------------------------
|
|
45
193
|
// Validation result types
|
|
@@ -55,6 +203,9 @@ export interface VBundleTarEntry {
|
|
|
55
203
|
name: string;
|
|
56
204
|
data: Uint8Array;
|
|
57
205
|
size: number;
|
|
206
|
+
/** Set when the tar entry is typeflag-2 (symlink); carries the link target
|
|
207
|
+
* decoded from the ustar linkname field. */
|
|
208
|
+
linkname?: string;
|
|
58
209
|
}
|
|
59
210
|
|
|
60
211
|
export interface VBundleValidationResult {
|
|
@@ -74,6 +225,9 @@ interface TarEntry {
|
|
|
74
225
|
name: string;
|
|
75
226
|
data: Uint8Array;
|
|
76
227
|
size: number;
|
|
228
|
+
/** Set when the tar entry is typeflag-2 (symlink); carries the link target
|
|
229
|
+
* decoded from the ustar linkname field. */
|
|
230
|
+
linkname?: string;
|
|
77
231
|
}
|
|
78
232
|
|
|
79
233
|
/**
|
|
@@ -136,6 +290,25 @@ function parseTar(buffer: Uint8Array): TarEntry[] {
|
|
|
136
290
|
continue;
|
|
137
291
|
}
|
|
138
292
|
|
|
293
|
+
// Symlink (type '2') — empty body regardless of declared size; the link
|
|
294
|
+
// target lives in the ustar linkname field (157..256). We preserve the
|
|
295
|
+
// tar-declared `size` here (rather than forcing it to 0) so the
|
|
296
|
+
// downstream `archiveEntry.size !== 0` check can surface
|
|
297
|
+
// `FILE_SIZE_MISMATCH` on malformed symlink headers. The body itself is
|
|
298
|
+
// always an empty buffer — symlinks have no data body even if the
|
|
299
|
+
// header lies about it.
|
|
300
|
+
if (typeFlag === "2") {
|
|
301
|
+
const linkname = decodeNullTerminated(header, 157, 100);
|
|
302
|
+
entries.push({
|
|
303
|
+
name: normalizePath(name),
|
|
304
|
+
data: new Uint8Array(0),
|
|
305
|
+
size,
|
|
306
|
+
linkname,
|
|
307
|
+
});
|
|
308
|
+
offset = dataStart + dataBlocks * BLOCK_SIZE;
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
|
|
139
312
|
// Regular file or hard link
|
|
140
313
|
if (typeFlag === "0" || typeFlag === "\0" || typeFlag === "") {
|
|
141
314
|
entries.push({ name: normalizePath(name), data, size });
|
|
@@ -190,14 +363,16 @@ export function canonicalizeJson(obj: unknown): string {
|
|
|
190
363
|
}
|
|
191
364
|
|
|
192
365
|
/**
|
|
193
|
-
* Recompute the `
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
* the
|
|
366
|
+
* Recompute the `checksum` field for a manifest object.
|
|
367
|
+
*
|
|
368
|
+
* The v1 schema spec says the checksum is computed over the canonicalized
|
|
369
|
+
* manifest with the `checksum` field set to the empty string (not absent),
|
|
370
|
+
* so we replace it before canonicalizing — both producers and validators
|
|
371
|
+
* must agree on this exact wire shape. Centralized here so the streaming
|
|
372
|
+
* validator and the in-memory validator agree on the exact canonicalization.
|
|
197
373
|
*/
|
|
198
|
-
export function
|
|
199
|
-
const copy = { ...(manifest as Record<string, unknown>) };
|
|
200
|
-
delete copy.manifest_sha256;
|
|
374
|
+
export function computeManifestChecksum(manifest: unknown): string {
|
|
375
|
+
const copy = { ...(manifest as Record<string, unknown>), checksum: "" };
|
|
201
376
|
return sha256Hex(canonicalizeJson(copy));
|
|
202
377
|
}
|
|
203
378
|
|
|
@@ -218,7 +393,7 @@ const MAX_DECOMPRESSED_SIZE = 2 * 1024 * 1024 * 1024;
|
|
|
218
393
|
* Performs four validation passes:
|
|
219
394
|
* 1. Archive structure (gzip decompression, tar parsing, required entries)
|
|
220
395
|
* 2. Manifest schema (Zod validation of manifest.json)
|
|
221
|
-
* 3. Manifest checksum (SHA-256 of canonicalized JSON
|
|
396
|
+
* 3. Manifest checksum (SHA-256 of canonicalized JSON with the `checksum` field set to empty string)
|
|
222
397
|
* 4. Per-file content integrity (SHA-256 of each file vs manifest declaration)
|
|
223
398
|
*/
|
|
224
399
|
export function validateVBundle(data: Uint8Array): VBundleValidationResult {
|
|
@@ -293,39 +468,64 @@ export function validateVBundle(data: Uint8Array): VBundleValidationResult {
|
|
|
293
468
|
return { is_valid: false, errors };
|
|
294
469
|
}
|
|
295
470
|
|
|
471
|
+
// Try the v1 schema first. If that fails, fall back to the legacy six-field
|
|
472
|
+
// shape so existing on-disk bundles (backup snapshots, cross-version
|
|
473
|
+
// migrations) keep validating after upgrade. AGENTS.md prohibits silent
|
|
474
|
+
// breaks of persisted state.
|
|
296
475
|
const parseResult = ManifestSchema.safeParse(manifestRaw);
|
|
297
|
-
|
|
298
|
-
|
|
476
|
+
let manifest: ManifestType;
|
|
477
|
+
|
|
478
|
+
if (parseResult.success) {
|
|
479
|
+
manifest = parseResult.data;
|
|
480
|
+
|
|
481
|
+
// Step 5 (v1): Verify manifest checksum — SHA-256 of canonicalized JSON
|
|
482
|
+
// with the `checksum` field replaced by an empty string.
|
|
483
|
+
const computedChecksum = computeManifestChecksum(manifestRaw);
|
|
484
|
+
if (computedChecksum !== manifest.checksum) {
|
|
299
485
|
errors.push({
|
|
300
|
-
code: "
|
|
301
|
-
message: `Manifest
|
|
302
|
-
|
|
303
|
-
}`,
|
|
304
|
-
path: `manifest.json/${issue.path.join(".")}`,
|
|
486
|
+
code: "MANIFEST_CHECKSUM_MISMATCH",
|
|
487
|
+
message: `Manifest checksum mismatch: expected ${manifest.checksum}, computed ${computedChecksum}`,
|
|
488
|
+
path: "manifest.json",
|
|
305
489
|
});
|
|
306
490
|
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
491
|
+
} else {
|
|
492
|
+
const legacyParse = LegacyManifestSchema.safeParse(manifestRaw);
|
|
493
|
+
if (!legacyParse.success) {
|
|
494
|
+
// Truly malformed — surface the v1 error for the clearer error trail.
|
|
495
|
+
for (const issue of parseResult.error.issues) {
|
|
496
|
+
errors.push({
|
|
497
|
+
code: "MANIFEST_SCHEMA_ERROR",
|
|
498
|
+
message: `Manifest validation error at ${issue.path.join(".")}: ${
|
|
499
|
+
issue.message
|
|
500
|
+
}`,
|
|
501
|
+
path: `manifest.json/${issue.path.join(".")}`,
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
return { is_valid: false, errors };
|
|
505
|
+
}
|
|
311
506
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
507
|
+
// Step 5 (legacy): Verify the legacy `manifest_sha256` using the OLD
|
|
508
|
+
// canonicalization (strip the field entirely; do NOT replace with "").
|
|
509
|
+
const legacy = legacyParse.data;
|
|
510
|
+
const computedLegacyChecksum = computeLegacyManifestSha256(manifestRaw);
|
|
511
|
+
if (computedLegacyChecksum !== legacy.manifest_sha256) {
|
|
512
|
+
errors.push({
|
|
513
|
+
code: "MANIFEST_CHECKSUM_MISMATCH",
|
|
514
|
+
message: `Manifest checksum mismatch: expected ${legacy.manifest_sha256}, computed ${computedLegacyChecksum}`,
|
|
515
|
+
path: "manifest.json",
|
|
516
|
+
});
|
|
517
|
+
return { is_valid: false, errors };
|
|
518
|
+
}
|
|
316
519
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
message: `Manifest checksum mismatch: expected ${manifest.manifest_sha256}, computed ${computedManifestSha256}`,
|
|
321
|
-
path: "manifest.json",
|
|
322
|
-
});
|
|
520
|
+
// Translate to v1 so the rest of the pipeline (per-file hash + size
|
|
521
|
+
// verification, refine rules) sees a uniform shape.
|
|
522
|
+
manifest = translateLegacyManifest(legacy);
|
|
323
523
|
}
|
|
324
524
|
|
|
325
525
|
// Step 6: Verify per-file content integrity
|
|
326
|
-
const manifestFilePaths = new Set(manifest.
|
|
526
|
+
const manifestFilePaths = new Set(manifest.contents.map((f) => f.path));
|
|
327
527
|
|
|
328
|
-
for (const fileEntry of manifest.
|
|
528
|
+
for (const fileEntry of manifest.contents) {
|
|
329
529
|
const archiveEntry = entryMap.get(fileEntry.path);
|
|
330
530
|
if (!archiveEntry) {
|
|
331
531
|
errors.push({
|
|
@@ -336,11 +536,98 @@ export function validateVBundle(data: Uint8Array): VBundleValidationResult {
|
|
|
336
536
|
continue;
|
|
337
537
|
}
|
|
338
538
|
|
|
539
|
+
if (fileEntry.link_target !== undefined) {
|
|
540
|
+
// Symlink branch: typeflag agreement, linkname agreement, sha over the
|
|
541
|
+
// link target string, size==0 on both sides, and path-traversal rejection.
|
|
542
|
+
if (archiveEntry.linkname === undefined) {
|
|
543
|
+
errors.push({
|
|
544
|
+
code: "SYMLINK_TYPEFLAG_MISMATCH",
|
|
545
|
+
message: `Manifest declares symlink for ${fileEntry.path} but tar entry is not typeflag-2`,
|
|
546
|
+
path: fileEntry.path,
|
|
547
|
+
});
|
|
548
|
+
continue;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
if (archiveEntry.linkname !== fileEntry.link_target) {
|
|
552
|
+
errors.push({
|
|
553
|
+
code: "LINK_TARGET_MISMATCH",
|
|
554
|
+
message: `Symlink linkname mismatch for ${fileEntry.path}: manifest declares "${fileEntry.link_target}", tar carries "${archiveEntry.linkname}"`,
|
|
555
|
+
path: fileEntry.path,
|
|
556
|
+
});
|
|
557
|
+
continue;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
if (archiveEntry.size !== 0) {
|
|
561
|
+
errors.push({
|
|
562
|
+
code: "FILE_SIZE_MISMATCH",
|
|
563
|
+
message: `Size mismatch for ${fileEntry.path}: manifest declares ${fileEntry.size_bytes} bytes, archive has ${archiveEntry.size} bytes`,
|
|
564
|
+
path: fileEntry.path,
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
if (fileEntry.size_bytes !== 0) {
|
|
569
|
+
errors.push({
|
|
570
|
+
code: "FILE_SIZE_MISMATCH",
|
|
571
|
+
message: `Size mismatch for ${fileEntry.path}: manifest declares ${fileEntry.size_bytes} bytes, archive has ${archiveEntry.size} bytes`,
|
|
572
|
+
path: fileEntry.path,
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
const expected = sha256Hex(fileEntry.link_target);
|
|
577
|
+
if (expected !== fileEntry.sha256) {
|
|
578
|
+
errors.push({
|
|
579
|
+
code: "FILE_CHECKSUM_MISMATCH",
|
|
580
|
+
message: `Checksum mismatch for ${fileEntry.path}: expected ${fileEntry.sha256}, computed ${expected}`,
|
|
581
|
+
path: fileEntry.path,
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// Absolute POSIX targets are unconstrained by the bundle root — reject
|
|
586
|
+
// them up front. The `posix.normalize` guard below only catches
|
|
587
|
+
// `..`-based escapes; an absolute path like `/etc/passwd` survives
|
|
588
|
+
// normalization unchanged and would otherwise pass.
|
|
589
|
+
if (fileEntry.link_target.startsWith("/")) {
|
|
590
|
+
errors.push({
|
|
591
|
+
code: "SYMLINK_TARGET_ESCAPES_ARCHIVE",
|
|
592
|
+
message: `Symlink target is absolute, which escapes the archive root for ${fileEntry.path}: target=${fileEntry.link_target}`,
|
|
593
|
+
path: fileEntry.path,
|
|
594
|
+
});
|
|
595
|
+
} else {
|
|
596
|
+
const normalized = posix.normalize(
|
|
597
|
+
posix.join(posix.dirname(fileEntry.path), fileEntry.link_target),
|
|
598
|
+
);
|
|
599
|
+
// Defense-in-depth: also reject if the joined+normalized path is
|
|
600
|
+
// absolute, in case `dirname` ever resolves to an absolute root.
|
|
601
|
+
if (
|
|
602
|
+
normalized.startsWith("../") ||
|
|
603
|
+
normalized === ".." ||
|
|
604
|
+
normalized.startsWith("/")
|
|
605
|
+
) {
|
|
606
|
+
errors.push({
|
|
607
|
+
code: "SYMLINK_TARGET_ESCAPES_ARCHIVE",
|
|
608
|
+
message: `Symlink target escapes archive root for ${fileEntry.path}: target=${fileEntry.link_target}, normalized=${normalized}`,
|
|
609
|
+
path: fileEntry.path,
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
continue;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
if (archiveEntry.linkname !== undefined) {
|
|
617
|
+
// Tar carries a typeflag-2 entry but manifest declares a regular file.
|
|
618
|
+
errors.push({
|
|
619
|
+
code: "SYMLINK_NOT_DECLARED",
|
|
620
|
+
message: `Tar entry ${fileEntry.path} is typeflag-2 but manifest does not declare link_target`,
|
|
621
|
+
path: fileEntry.path,
|
|
622
|
+
});
|
|
623
|
+
continue;
|
|
624
|
+
}
|
|
625
|
+
|
|
339
626
|
// Verify size
|
|
340
|
-
if (archiveEntry.size !== fileEntry.
|
|
627
|
+
if (archiveEntry.size !== fileEntry.size_bytes) {
|
|
341
628
|
errors.push({
|
|
342
629
|
code: "FILE_SIZE_MISMATCH",
|
|
343
|
-
message: `Size mismatch for ${fileEntry.path}: manifest declares ${fileEntry.
|
|
630
|
+
message: `Size mismatch for ${fileEntry.path}: manifest declares ${fileEntry.size_bytes} bytes, archive has ${archiveEntry.size} bytes`,
|
|
344
631
|
path: fileEntry.path,
|
|
345
632
|
});
|
|
346
633
|
}
|
|
@@ -364,7 +651,7 @@ export function validateVBundle(data: Uint8Array): VBundleValidationResult {
|
|
|
364
651
|
if (!manifestFilePaths.has(required)) {
|
|
365
652
|
errors.push({
|
|
366
653
|
code: "REQUIRED_FILE_NOT_IN_MANIFEST",
|
|
367
|
-
message: `Required file ${required} exists in archive but has no checksum entry in manifest.
|
|
654
|
+
message: `Required file ${required} exists in archive but has no checksum entry in manifest.contents`,
|
|
368
655
|
path: required,
|
|
369
656
|
});
|
|
370
657
|
}
|
|
@@ -3,18 +3,22 @@
|
|
|
3
3
|
* confirmation, secret, host_bash, host_file, host_cu, host_browser, and
|
|
4
4
|
* host_transfer interactions.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* For confirmation_request and secret_request, the onEvent callback in
|
|
7
|
+
* assistant-event-hub registers the interaction here.
|
|
8
|
+
*
|
|
9
|
+
* For host proxy interactions (host_bash, host_file, host_cu, host_browser,
|
|
10
|
+
* host_transfer), the proxy itself registers with full RPC lifecycle state
|
|
11
|
+
* (resolve/reject callbacks, timer, abort detach). This eliminates the
|
|
12
|
+
* per-proxy `private pending` maps — all pending state lives here.
|
|
13
|
+
*
|
|
10
14
|
* Standalone HTTP endpoints (/v1/confirm, /v1/secret, /v1/trust-rules,
|
|
11
15
|
* /v1/host-bash-result, /v1/host-file-result, /v1/host-cu-result,
|
|
12
16
|
* /v1/host-browser-result) look up the conversation from this tracker to
|
|
13
17
|
* resolve the interaction.
|
|
14
18
|
*/
|
|
15
19
|
|
|
16
|
-
import type { Conversation } from "../daemon/conversation.js";
|
|
17
20
|
import type { UserDecision } from "../permissions/types.js";
|
|
21
|
+
import type { ToolExecutionResult } from "../tools/types.js";
|
|
18
22
|
|
|
19
23
|
export interface ConfirmationDetails {
|
|
20
24
|
toolName: string;
|
|
@@ -39,7 +43,6 @@ export interface ConfirmationDetails {
|
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
export interface PendingInteraction {
|
|
42
|
-
conversation: Conversation | null;
|
|
43
46
|
conversationId: string;
|
|
44
47
|
kind:
|
|
45
48
|
| "confirmation"
|
|
@@ -48,11 +51,27 @@ export interface PendingInteraction {
|
|
|
48
51
|
| "host_file"
|
|
49
52
|
| "host_cu"
|
|
50
53
|
| "host_browser"
|
|
54
|
+
| "host_app_control"
|
|
51
55
|
| "host_transfer"
|
|
52
56
|
| "acp_confirmation";
|
|
53
57
|
confirmationDetails?: ConfirmationDetails;
|
|
54
58
|
/** For ACP permissions: resolves directly without a Conversation object. */
|
|
55
59
|
directResolve?: (decision: UserDecision) => void;
|
|
60
|
+
/** When set, the host_bash request should be routed to this specific client. */
|
|
61
|
+
targetClientId?: string;
|
|
62
|
+
|
|
63
|
+
// -- RPC lifecycle (populated by host proxies) --
|
|
64
|
+
|
|
65
|
+
/** Resolve the caller's Promise with a tool execution result. */
|
|
66
|
+
rpcResolve?: (result: ToolExecutionResult) => void;
|
|
67
|
+
/** Reject the caller's Promise with an error. */
|
|
68
|
+
rpcReject?: (err: Error) => void;
|
|
69
|
+
/** Proxy-side timeout timer. Cleared on resolve/abort/dispose. */
|
|
70
|
+
timer?: ReturnType<typeof setTimeout>;
|
|
71
|
+
/** Detach the abort listener from the caller's signal. No-op when no signal was passed. */
|
|
72
|
+
detachAbort?: () => void;
|
|
73
|
+
/** Proxy-specific metadata (e.g. timeoutSec for bash, operation/path for file). */
|
|
74
|
+
metadata?: Record<string, unknown>;
|
|
56
75
|
}
|
|
57
76
|
|
|
58
77
|
const pending = new Map<string, PendingInteraction>();
|
|
@@ -66,12 +85,15 @@ export function register(
|
|
|
66
85
|
|
|
67
86
|
/**
|
|
68
87
|
* Remove and return the pending interaction for the given requestId.
|
|
88
|
+
* Auto-clears the proxy timer and detaches the abort listener if present.
|
|
69
89
|
* Returns undefined if no interaction is registered.
|
|
70
90
|
*/
|
|
71
91
|
export function resolve(requestId: string): PendingInteraction | undefined {
|
|
72
92
|
const interaction = pending.get(requestId);
|
|
73
93
|
if (interaction) {
|
|
74
94
|
pending.delete(requestId);
|
|
95
|
+
if (interaction.timer != null) clearTimeout(interaction.timer);
|
|
96
|
+
interaction.detachAbort?.();
|
|
75
97
|
}
|
|
76
98
|
return interaction;
|
|
77
99
|
}
|
|
@@ -104,22 +126,24 @@ export function getByConversation(
|
|
|
104
126
|
* Remove pending confirmation and secret interactions for a given conversation.
|
|
105
127
|
* Used when auto-denying all pending interactions (e.g. new user message).
|
|
106
128
|
*
|
|
107
|
-
* host_bash, host_file, host_cu, host_browser, and
|
|
108
|
-
* are intentionally skipped — they represent
|
|
109
|
-
* to the client, not confirmations to
|
|
110
|
-
* the request: the client would POST to
|
|
111
|
-
* /v1/host-
|
|
129
|
+
* host_bash, host_file, host_cu, host_browser, host_app_control, and
|
|
130
|
+
* host_transfer interactions are intentionally skipped — they represent
|
|
131
|
+
* in-flight tool executions proxied to the client, not confirmations to
|
|
132
|
+
* auto-deny. Removing them would orphan the request: the client would POST to
|
|
133
|
+
* /v1/host-bash-result, /v1/host-file-result, /v1/host-cu-result,
|
|
134
|
+
* /v1/host-browser-result, /v1/host-app-control-result, or
|
|
112
135
|
* /v1/host-transfer-result after completing the operation, get a 404, and the
|
|
113
136
|
* proxy timer would fire with a spurious timeout error.
|
|
114
137
|
*/
|
|
115
|
-
export function removeByConversation(
|
|
138
|
+
export function removeByConversation(conversationId: string): void {
|
|
116
139
|
for (const [requestId, interaction] of pending) {
|
|
117
140
|
if (
|
|
118
|
-
interaction.
|
|
141
|
+
interaction.conversationId === conversationId &&
|
|
119
142
|
interaction.kind !== "host_bash" &&
|
|
120
143
|
interaction.kind !== "host_file" &&
|
|
121
144
|
interaction.kind !== "host_cu" &&
|
|
122
145
|
interaction.kind !== "host_browser" &&
|
|
146
|
+
interaction.kind !== "host_app_control" &&
|
|
123
147
|
interaction.kind !== "host_transfer" &&
|
|
124
148
|
interaction.kind !== "acp_confirmation"
|
|
125
149
|
) {
|
|
@@ -143,6 +167,17 @@ export function getByKind(
|
|
|
143
167
|
return results;
|
|
144
168
|
}
|
|
145
169
|
|
|
170
|
+
/**
|
|
171
|
+
* Return all pending interactions across all conversations.
|
|
172
|
+
*/
|
|
173
|
+
export function getAll(): Array<{ requestId: string } & PendingInteraction> {
|
|
174
|
+
const results: Array<{ requestId: string } & PendingInteraction> = [];
|
|
175
|
+
for (const [requestId, interaction] of pending) {
|
|
176
|
+
results.push({ requestId, ...interaction });
|
|
177
|
+
}
|
|
178
|
+
return results;
|
|
179
|
+
}
|
|
180
|
+
|
|
146
181
|
/** Clear all pending interactions. Useful for testing. */
|
|
147
182
|
export function clear(): void {
|
|
148
183
|
pending.clear();
|