@vellumai/assistant 0.4.41 → 0.4.43
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/.env.example +1 -6
- package/.prettierignore +3 -0
- package/ARCHITECTURE.md +131 -393
- package/Dockerfile +0 -1
- package/README.md +73 -83
- package/bun.lock +8 -2
- package/docs/architecture/integrations.md +16 -21
- package/docs/architecture/memory.md +1 -1
- package/docs/architecture/scheduling.md +63 -63
- package/docs/architecture/security.md +3 -3
- package/docs/runbook-trusted-contacts.md +11 -12
- package/docs/trusted-contact-access.md +39 -39
- package/package.json +5 -8
- package/src/__tests__/access-request-decision.test.ts +4 -4
- package/src/__tests__/active-skill-tools.test.ts +49 -34
- package/src/__tests__/actor-token-service.test.ts +55 -85
- package/src/__tests__/amazon-cdp-integration.test.ts +14 -26
- package/src/__tests__/app-bundler.test.ts +14 -368
- package/src/__tests__/app-compiler.test.ts +0 -1
- package/src/__tests__/app-executors.test.ts +10 -1
- package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
- package/src/__tests__/approval-primitive.test.ts +2 -4
- package/src/__tests__/approval-routes-http.test.ts +1 -1
- package/src/__tests__/asset-materialize-tool.test.ts +1 -4
- package/src/__tests__/asset-search-tool.test.ts +1 -4
- package/src/__tests__/assistant-attachments.test.ts +23 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +4 -8
- package/src/__tests__/assistant-id-boundary-guard.test.ts +5 -5
- package/src/__tests__/attachments-store.test.ts +1 -4
- package/src/__tests__/avatar-e2e.test.ts +43 -23
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +2 -9
- package/src/__tests__/call-controller.test.ts +4 -8
- package/src/__tests__/call-conversation-messages.test.ts +1 -1
- package/src/__tests__/call-domain.test.ts +250 -8
- package/src/__tests__/call-pointer-message-composer.test.ts +14 -14
- package/src/__tests__/call-pointer-messages.test.ts +7 -11
- package/src/__tests__/call-recovery.test.ts +47 -0
- package/src/__tests__/call-routes-http.test.ts +13 -0
- package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
- package/src/__tests__/callback-handoff-copy.test.ts +5 -5
- package/src/__tests__/canonical-guardian-store.test.ts +3 -3
- package/src/__tests__/channel-approval-routes.test.ts +101 -134
- package/src/__tests__/channel-approval.test.ts +0 -201
- package/src/__tests__/channel-approvals.test.ts +2 -2
- package/src/__tests__/channel-delivery-store.test.ts +16 -24
- package/src/__tests__/channel-guardian.test.ts +641 -740
- package/src/__tests__/channel-invite-transport.test.ts +1 -2
- package/src/__tests__/channel-policy.test.ts +9 -12
- package/src/__tests__/channel-readiness-service.test.ts +156 -45
- package/src/__tests__/channel-reply-delivery.test.ts +3 -3
- package/src/__tests__/channel-retry-sweep.test.ts +7 -7
- package/src/__tests__/checker.test.ts +10 -7
- package/src/__tests__/chrome-cdp.test.ts +57 -17
- package/src/__tests__/cli-help-reference-sync.test.ts +26 -0
- package/src/__tests__/compaction.benchmark.test.ts +25 -5
- package/src/__tests__/computer-use-session-lifecycle.test.ts +1 -1
- package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +1 -1
- package/src/__tests__/config-loader-backfill.test.ts +310 -0
- package/src/__tests__/config-watcher.test.ts +1 -5
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +3 -5
- package/src/__tests__/connection-policy.test.ts +3 -62
- package/src/__tests__/contacts-tools.test.ts +0 -2
- package/src/__tests__/context-memory-e2e.test.ts +11 -7
- package/src/__tests__/context-overflow-policy.test.ts +2 -2
- package/src/__tests__/context-window-manager.test.ts +220 -61
- package/src/__tests__/conversation-attention-store.test.ts +178 -2
- package/src/__tests__/conversation-attention-telegram.test.ts +8 -11
- package/src/__tests__/conversation-pairing.test.ts +14 -14
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +2 -2
- package/src/__tests__/conversation-unread-route.test.ts +155 -0
- package/src/__tests__/credential-metadata-store.test.ts +0 -2
- package/src/__tests__/credential-security-invariants.test.ts +9 -16
- package/src/__tests__/credentials-cli.test.ts +49 -5
- package/src/__tests__/daemon-assistant-events.test.ts +4 -22
- package/src/__tests__/db-migration-rollback.test.ts +2 -2
- package/src/__tests__/deterministic-verification-control-plane.test.ts +19 -19
- package/src/__tests__/dictation-mode-detection.test.ts +1 -1
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -6
- package/src/__tests__/email-cli.test.ts +12 -12
- package/src/__tests__/email-service-config-fallback.test.ts +1 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -18
- package/src/__tests__/event-bus.test.ts +0 -1
- package/src/__tests__/followup-tools.test.ts +0 -2
- package/src/__tests__/gateway-client-managed-outbound.test.ts +6 -6
- package/src/__tests__/gateway-only-enforcement.test.ts +13 -77
- package/src/__tests__/gateway-only-guard.test.ts +5 -0
- package/src/__tests__/guardian-action-conversation-turn.test.ts +3 -3
- package/src/__tests__/guardian-action-followup-executor.test.ts +29 -94
- package/src/__tests__/guardian-action-followup-store.test.ts +2 -12
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +48 -194
- package/src/__tests__/guardian-action-late-reply.test.ts +12 -12
- package/src/__tests__/guardian-action-store.test.ts +2 -2
- package/src/__tests__/guardian-action-sweep.test.ts +5 -5
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -3
- package/src/__tests__/guardian-dispatch.test.ts +5 -46
- package/src/__tests__/guardian-grant-minting.test.ts +5 -44
- package/src/__tests__/guardian-outbound-http.test.ts +95 -114
- package/src/__tests__/guardian-question-mode.test.ts +1 -4
- package/src/__tests__/guardian-routing-invariants.test.ts +5 -13
- package/src/__tests__/guardian-routing-state.test.ts +3 -3
- package/src/__tests__/guardian-verification-voice-binding.test.ts +64 -7
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
- package/src/__tests__/handle-user-message-secret-resume.test.ts +3 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +16 -34
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/headless-browser-navigate.test.ts +1 -1
- package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
- package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +1 -1
- package/src/__tests__/home-base-bootstrap.test.ts +0 -2
- package/src/__tests__/host-shell-tool.test.ts +3 -12
- package/src/__tests__/inbound-invite-redemption.test.ts +2 -2
- package/src/__tests__/ingress-url-consistency.test.ts +0 -64
- package/src/__tests__/integration-status.test.ts +8 -8
- package/src/__tests__/intent-routing.test.ts +9 -13
- package/src/__tests__/invite-redemption-service.test.ts +4 -4
- package/src/__tests__/invite-routes-http.test.ts +10 -10
- package/src/__tests__/llm-usage-store.test.ts +45 -9
- package/src/__tests__/local-gateway-health.test.ts +209 -0
- package/src/__tests__/managed-avatar-client.test.ts +23 -12
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -2
- package/src/__tests__/managed-store.test.ts +29 -12
- package/src/__tests__/managed-twitter-guardrails.test.ts +353 -0
- package/src/__tests__/mcp-cli.test.ts +1 -1
- package/src/__tests__/mcp-health-check.test.ts +1 -1
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/media-reuse-story.e2e.test.ts +1 -4
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +9 -6
- package/src/__tests__/memory-regressions.test.ts +1 -166
- package/src/__tests__/messaging-send-tool.test.ts +8 -4
- package/src/__tests__/migration-export-http.test.ts +2 -2
- package/src/__tests__/migration-transport.test.ts +44 -0
- package/src/__tests__/non-member-access-request.test.ts +49 -36
- package/src/__tests__/notification-broadcaster.test.ts +15 -15
- package/src/__tests__/notification-decision-fallback.test.ts +2 -2
- package/src/__tests__/notification-decision-strategy.test.ts +4 -4
- package/src/__tests__/notification-deep-link.test.ts +3 -3
- package/src/__tests__/notification-guardian-path.test.ts +6 -44
- package/src/__tests__/notification-routing-intent.test.ts +11 -7
- package/src/__tests__/oauth-cli.test.ts +1 -1
- package/src/__tests__/onboarding-starter-tasks.test.ts +2 -6
- package/src/__tests__/onboarding-template-contract.test.ts +2 -2
- package/src/__tests__/platform.test.ts +168 -5
- package/src/__tests__/playbook-execution.test.ts +0 -2
- package/src/__tests__/playbook-tools.test.ts +0 -2
- package/src/__tests__/pricing.test.ts +125 -0
- package/src/__tests__/provider-error-scenarios.test.ts +9 -3
- package/src/__tests__/recording-handler.test.ts +46 -80
- package/src/__tests__/recording-state-machine.test.ts +112 -183
- package/src/__tests__/registry.test.ts +1 -1
- package/src/__tests__/relay-server.test.ts +69 -71
- package/src/__tests__/reminder-store.test.ts +3 -3
- package/src/__tests__/request-file-tool.test.ts +2 -2
- package/src/__tests__/ride-shotgun-handler.test.ts +2 -33
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -3
- package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +4 -4
- package/src/__tests__/schedule-store.test.ts +13 -4
- package/src/__tests__/schedule-tools.test.ts +0 -2
- package/src/__tests__/scheduler-recurrence.test.ts +3 -4
- package/src/__tests__/scoped-approval-grants.test.ts +3 -5
- package/src/__tests__/scoped-grant-security-matrix.test.ts +6 -8
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +1 -1
- package/src/__tests__/secret-response-routing.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +1 -1
- package/src/__tests__/sequence-store.test.ts +0 -2
- package/src/__tests__/server-history-render.test.ts +2 -199
- package/src/__tests__/session-abort-tool-results.test.ts +9 -3
- package/src/__tests__/session-agent-loop.test.ts +107 -3
- package/src/__tests__/session-confirmation-signals.test.ts +10 -4
- package/src/__tests__/session-conflict-gate.test.ts +9 -3
- package/src/__tests__/session-init.benchmark.test.ts +22 -13
- package/src/__tests__/session-load-history-repair.test.ts +6 -3
- package/src/__tests__/session-pre-run-repair.test.ts +9 -3
- package/src/__tests__/session-profile-injection.test.ts +9 -3
- package/src/__tests__/session-provider-retry-repair.test.ts +10 -4
- package/src/__tests__/session-queue.test.ts +10 -4
- package/src/__tests__/session-runtime-assembly.test.ts +28 -18
- package/src/__tests__/session-skill-tools.test.ts +2 -3
- package/src/__tests__/session-slash-known.test.ts +11 -4
- package/src/__tests__/session-slash-queue.test.ts +11 -4
- package/src/__tests__/session-slash-unknown.test.ts +12 -4
- package/src/__tests__/session-surfaces-deselection.test.ts +2 -2
- package/src/__tests__/session-surfaces-task-progress.test.ts +3 -3
- package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -1
- package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -1
- package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -1
- package/src/__tests__/session-usage.test.ts +180 -0
- package/src/__tests__/session-workspace-cache-state.test.ts +8 -2
- package/src/__tests__/session-workspace-injection.test.ts +8 -2
- package/src/__tests__/session-workspace-tool-tracking.test.ts +8 -2
- package/src/__tests__/skill-feature-flags-integration.test.ts +5 -11
- package/src/__tests__/skill-feature-flags.test.ts +1 -0
- package/src/__tests__/skill-include-graph.test.ts +1 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +3 -9
- package/src/__tests__/skill-load-tool.test.ts +90 -12
- package/src/__tests__/skill-projection-feature-flag.test.ts +14 -15
- package/src/__tests__/skills-uninstall.test.ts +131 -0
- package/src/__tests__/skills.test.ts +32 -16
- package/src/__tests__/slack-block-formatting.test.ts +1 -1
- package/src/__tests__/slack-channel-config.test.ts +71 -12
- package/src/__tests__/slack-inbound-verification.test.ts +7 -7
- package/src/__tests__/slack-share-routes.test.ts +1 -1
- package/src/__tests__/slack-skill.test.ts +2 -2
- package/src/__tests__/slash-commands-catalog.test.ts +1 -0
- package/src/__tests__/slash-commands-resolver.test.ts +1 -0
- package/src/__tests__/starter-task-flow.test.ts +1 -1
- package/src/__tests__/subagent-manager-notify.test.ts +1 -1
- package/src/__tests__/subagent-tools.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +4 -8
- package/src/__tests__/task-compiler.test.ts +0 -2
- package/src/__tests__/task-management-tools.test.ts +0 -2
- package/src/__tests__/task-runner.test.ts +0 -2
- package/src/__tests__/task-scheduler.test.ts +2 -2
- package/src/__tests__/telegram-bot-username-resolution.test.ts +46 -44
- package/src/__tests__/terminal-tools.test.ts +1 -11
- package/src/__tests__/thread-seed-composer.test.ts +3 -1
- package/src/__tests__/tool-approval-handler.test.ts +5 -7
- package/src/__tests__/tool-executor.test.ts +2 -2
- package/src/__tests__/tool-grant-request-escalation.test.ts +3 -5
- package/src/__tests__/tool-notification-listener.test.ts +1 -1
- package/src/__tests__/tool-profiling-listener.test.ts +1 -1
- package/src/__tests__/tool-trace-listener.test.ts +1 -2
- package/src/__tests__/trace-emitter.test.ts +1 -1
- package/src/__tests__/trust-context-guards.test.ts +1 -1
- package/src/__tests__/trust-store.test.ts +44 -395
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +6 -8
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -7
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +6 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +54 -47
- package/src/__tests__/trusted-contact-verification.test.ts +12 -12
- package/src/__tests__/twilio-config.test.ts +11 -2
- package/src/__tests__/twilio-provider.test.ts +6 -4
- package/src/__tests__/twilio-routes.test.ts +408 -86
- package/src/__tests__/twitter-platform-proxy-client.test.ts +450 -0
- package/src/__tests__/update-bulletin-format.test.ts +1 -1
- package/src/__tests__/update-bulletin-state.test.ts +1 -1
- package/src/__tests__/update-bulletin.test.ts +4 -8
- package/src/__tests__/update-template-contract.test.ts +1 -1
- package/src/__tests__/usage-cache-backfill-migration.test.ts +406 -0
- package/src/__tests__/usage-routes.test.ts +23 -5
- package/src/__tests__/user-reference.test.ts +1 -1
- package/src/__tests__/{guardian-control-plane-policy.test.ts → verification-control-plane-policy.test.ts} +142 -170
- package/src/__tests__/{guardian-verification-intent-routing.test.ts → verification-session-intent-routing.test.ts} +16 -16
- package/src/__tests__/view-image-tool.test.ts +0 -2
- package/src/__tests__/voice-ingress-preflight.test.ts +36 -0
- package/src/__tests__/voice-invite-redemption.test.ts +18 -18
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -7
- package/src/__tests__/voice-session-bridge.test.ts +14 -16
- package/src/__tests__/workspace-policy.test.ts +1 -1
- package/src/approvals/AGENTS.md +4 -4
- package/src/approvals/approval-primitive.ts +2 -2
- package/src/approvals/guardian-decision-primitive.ts +1 -1
- package/src/approvals/guardian-request-resolvers.ts +3 -4
- package/src/bundler/app-bundler.ts +29 -217
- package/src/bundler/app-compiler.ts +131 -103
- package/src/bundler/compiler-tools.ts +248 -0
- package/src/calls/active-call-lease.ts +207 -0
- package/src/calls/call-constants.ts +0 -7
- package/src/calls/call-controller.ts +1 -1
- package/src/calls/call-conversation-messages.ts +6 -6
- package/src/calls/call-domain.ts +73 -38
- package/src/calls/call-pointer-message-composer.ts +6 -6
- package/src/calls/call-pointer-messages.ts +14 -13
- package/src/calls/call-recovery.ts +2 -0
- package/src/calls/call-store.ts +21 -28
- package/src/calls/guardian-action-sweep.ts +6 -8
- package/src/calls/guardian-dispatch.ts +2 -6
- package/src/calls/relay-access-wait.ts +4 -4
- package/src/calls/relay-server.ts +69 -80
- package/src/calls/relay-setup-router.ts +16 -21
- package/src/calls/relay-verification.ts +27 -28
- package/src/calls/twilio-config.ts +28 -3
- package/src/calls/twilio-provider.ts +5 -5
- package/src/calls/twilio-rest.ts +26 -27
- package/src/calls/twilio-routes.ts +67 -54
- package/src/calls/types.ts +8 -8
- package/src/calls/voice-ingress-preflight.ts +110 -0
- package/src/calls/voice-session-bridge.ts +7 -7
- package/src/channels/config.ts +1 -10
- package/src/{config/channel-permission-profiles.ts → channels/permission-profiles.ts} +1 -1
- package/src/channels/types.ts +2 -13
- package/src/cli/__tests__/notifications.test.ts +1 -1
- package/src/{amazon → cli/commands/amazon}/client.ts +99 -42
- package/src/cli/{amazon.ts → commands/amazon/index.ts} +12 -17
- package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
- package/src/cli/commands/amazon/session.ts +116 -0
- package/src/cli/{audit.ts → commands/audit.ts} +2 -4
- package/src/cli/{autonomy.ts → commands/autonomy.ts} +1 -3
- package/src/cli/commands/browser-relay.ts +520 -0
- package/src/cli/commands/channel-verification-sessions.ts +442 -0
- package/src/cli/{completions.ts → commands/completions.ts} +1 -3
- package/src/cli/{config.ts → commands/config.ts} +3 -5
- package/src/cli/{contacts.ts → commands/contacts.ts} +263 -16
- package/src/cli/{credentials.ts → commands/credentials.ts} +9 -10
- package/src/cli/{default-action.ts → commands/default-action.ts} +3 -3
- package/src/cli/{dev.ts → commands/dev.ts} +4 -6
- package/src/cli/{doctor.ts → commands/doctor.ts} +36 -60
- package/src/cli/{email.ts → commands/email.ts} +2 -2
- package/src/cli/{keys.ts → commands/keys.ts} +6 -6
- package/src/cli/{map.ts → commands/map.ts} +85 -93
- package/src/cli/{mcp.ts → commands/mcp.ts} +5 -7
- package/src/cli/{memory.ts → commands/memory.ts} +6 -7
- package/src/cli/{notifications.ts → commands/notifications.ts} +8 -10
- package/src/cli/{oauth.ts → commands/oauth.ts} +2 -2
- package/src/cli/commands/platform.ts +176 -0
- package/src/cli/{sequence.ts → commands/sequence.ts} +3 -3
- package/src/cli/{sessions.ts → commands/sessions.ts} +32 -52
- package/src/cli/commands/skills.ts +498 -0
- package/src/cli/{trust.ts → commands/trust.ts} +2 -4
- package/src/{__tests__/twitter-cli-error-shaping.test.ts → cli/commands/twitter/__tests__/cli-error-shaping.test.ts} +43 -2
- package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +483 -0
- package/src/{__tests__/twitter-cli-routing.test.ts → cli/commands/twitter/__tests__/cli-routing.test.ts} +130 -4
- package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -2
- package/src/{twitter → cli/commands/twitter}/client.ts +17 -7
- package/src/cli/{twitter.ts → commands/twitter/index.ts} +322 -273
- package/src/cli/commands/twitter/router.ts +396 -0
- package/src/cli/commands/twitter/session.ts +121 -0
- package/src/cli/db.ts +1 -0
- package/src/cli/http-client.ts +87 -0
- package/src/cli/logger.ts +6 -0
- package/src/cli/main-screen.tsx +4 -3
- package/src/cli/output.ts +19 -0
- package/src/cli/program.ts +29 -27
- package/src/cli/reference.ts +27 -37
- package/src/cli.ts +452 -240
- package/src/config/assistant-feature-flags.ts +3 -15
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
- package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
- package/src/config/bundled-skills/amazon/SKILL.md +15 -5
- package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +21 -6
- package/src/config/bundled-skills/browser/SKILL.md +4 -5
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +4 -4
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
- package/src/config/bundled-skills/claude-code/SKILL.md +4 -4
- package/src/config/bundled-skills/cli-discover/SKILL.md +4 -4
- package/src/config/bundled-skills/computer-use/SKILL.md +4 -4
- package/src/config/bundled-skills/contacts/SKILL.md +87 -229
- package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +4 -4
- package/src/config/bundled-skills/document/SKILL.md +4 -3
- package/src/config/bundled-skills/document-writer/SKILL.md +4 -4
- package/src/config/bundled-skills/doordash/SKILL.md +4 -11
- package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +8 -16
- package/src/config/bundled-skills/doordash/doordash-cli.ts +120 -86
- package/src/config/bundled-skills/doordash/lib/session.ts +1 -2
- package/src/config/bundled-skills/doordash/lib/shared/platform.ts +26 -9
- package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +140 -0
- package/src/config/bundled-skills/email-setup/SKILL.md +4 -4
- package/src/config/bundled-skills/followups/SKILL.md +4 -3
- package/src/config/bundled-skills/frontend-design/SKILL.md +2 -0
- package/src/config/bundled-skills/google-calendar/SKILL.md +4 -4
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +4 -6
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +26 -41
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -5
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +1 -1
- package/src/config/bundled-skills/influencer/SKILL.md +19 -19
- package/src/{influencer → config/bundled-skills/influencer/scripts}/client.ts +73 -56
- package/src/config/bundled-skills/influencer/scripts/influencer.ts +267 -0
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -2
- package/src/config/bundled-skills/macos-automation/SKILL.md +4 -5
- package/src/config/bundled-skills/mcp-setup/SKILL.md +4 -4
- package/src/config/bundled-skills/media-processing/SKILL.md +3 -2
- package/src/config/bundled-skills/messaging/SKILL.md +6 -33
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -5
- package/src/config/bundled-skills/notifications/SKILL.md +4 -4
- package/src/config/bundled-skills/notion/SKILL.md +4 -4
- package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +4 -5
- package/src/config/bundled-skills/oauth-setup/SKILL.md +4 -5
- package/src/config/bundled-skills/phone-calls/SKILL.md +24 -458
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +83 -0
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +57 -0
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +67 -0
- package/src/config/bundled-skills/playbooks/SKILL.md +4 -3
- package/src/config/bundled-skills/public-ingress/SKILL.md +65 -14
- package/src/config/bundled-skills/reminder/SKILL.md +4 -3
- package/src/config/bundled-skills/restaurant-reservation/SKILL.md +4 -6
- package/src/config/bundled-skills/schedule/SKILL.md +4 -3
- package/src/config/bundled-skills/screen-recording/SKILL.md +4 -3
- package/src/config/bundled-skills/self-upgrade/SKILL.md +4 -4
- package/src/config/bundled-skills/skills-catalog/SKILL.md +4 -4
- package/src/config/bundled-skills/slack/SKILL.md +4 -8
- package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +1 -1
- package/src/config/bundled-skills/slack-app-setup/SKILL.md +66 -88
- package/src/config/bundled-skills/slack-digest-setup/SKILL.md +4 -5
- package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +4 -5
- package/src/config/bundled-skills/start-the-day/SKILL.md +4 -4
- package/src/config/bundled-skills/subagent/SKILL.md +4 -3
- package/src/config/bundled-skills/tasks/SKILL.md +4 -3
- package/src/config/bundled-skills/telegram-setup/SKILL.md +63 -112
- package/src/config/bundled-skills/time-based-actions/SKILL.md +4 -3
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -3
- package/src/config/bundled-skills/twilio-setup/SKILL.md +23 -50
- package/src/config/bundled-skills/twitter/SKILL.md +56 -14
- package/src/config/bundled-skills/typescript-eval/SKILL.md +4 -4
- package/src/config/bundled-skills/vercel-token-setup/SKILL.md +4 -5
- package/src/config/bundled-skills/voice-setup/SKILL.md +19 -45
- package/src/config/bundled-skills/watcher/SKILL.md +4 -3
- package/src/config/env-registry.ts +1 -10
- package/src/config/feature-flag-registry.json +0 -16
- package/src/config/loader.ts +78 -38
- package/src/config/schema.ts +143 -106
- package/src/config/schemas/channels.ts +80 -0
- package/src/config/schemas/heartbeat.ts +51 -0
- package/src/config/schemas/inference.ts +136 -0
- package/src/config/schemas/ingress.ts +81 -0
- package/src/config/schemas/logging.ts +21 -0
- package/src/config/schemas/memory-lifecycle.ts +67 -0
- package/src/config/schemas/memory-processing.ts +215 -0
- package/src/config/schemas/memory-retrieval.ts +222 -0
- package/src/config/schemas/memory-storage.ts +83 -0
- package/src/config/schemas/memory.ts +58 -0
- package/src/config/schemas/platform.ts +64 -0
- package/src/config/schemas/security.ts +54 -0
- package/src/config/schemas/swarm.ts +50 -0
- package/src/config/schemas/timeouts.ts +47 -0
- package/src/config/{agent-schema.ts → schemas/workspace-git.ts} +0 -97
- package/src/config/skill-state.ts +3 -13
- package/src/config/skills.ts +233 -75
- package/src/config/types.ts +1 -20
- package/src/contacts/contact-store.ts +12 -49
- package/src/contacts/contacts-write.ts +1 -5
- package/src/contacts/index.ts +0 -2
- package/src/contacts/types.ts +0 -8
- package/src/context/window-manager.ts +73 -14
- package/src/daemon/assistant-attachments.ts +9 -0
- package/src/daemon/computer-use-session.ts +3 -3
- package/src/daemon/connection-policy.ts +6 -21
- package/src/daemon/context-overflow-policy.ts +1 -1
- package/src/daemon/daemon-control.ts +46 -54
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/handlers/config-channels.ts +407 -71
- package/src/daemon/handlers/config-ingress.ts +17 -85
- package/src/daemon/handlers/config-model.ts +145 -123
- package/src/daemon/handlers/config-slack-channel.ts +43 -29
- package/src/daemon/handlers/config-telegram.ts +32 -27
- package/src/daemon/handlers/config-voice.ts +1 -4
- package/src/daemon/handlers/dictation.ts +11 -16
- package/src/daemon/handlers/identity.ts +5 -6
- package/src/daemon/handlers/pairing.ts +5 -13
- package/src/daemon/handlers/recording.ts +97 -199
- package/src/daemon/handlers/session-history.ts +110 -96
- package/src/daemon/handlers/session-user-message.ts +29 -57
- package/src/daemon/handlers/sessions.ts +240 -137
- package/src/daemon/handlers/shared.ts +62 -95
- package/src/daemon/handlers/skills.ts +492 -543
- package/src/daemon/lifecycle.ts +168 -55
- package/src/daemon/main.ts +1 -0
- package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
- package/src/daemon/{ipc-contract → message-types}/computer-use.ts +0 -3
- package/src/daemon/{ipc-contract → message-types}/diagnostics.ts +0 -16
- package/src/daemon/{ipc-contract → message-types}/integrations.ts +29 -13
- package/src/daemon/{ipc-contract → message-types}/memory.ts +8 -0
- package/src/daemon/{ipc-contract → message-types}/notifications.ts +15 -1
- package/src/daemon/{ipc-contract → message-types}/sessions.ts +1 -0
- package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
- package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
- package/src/daemon/providers-setup.ts +0 -5
- package/src/daemon/recording-executor.ts +0 -7
- package/src/daemon/ride-shotgun-handler.ts +9 -13
- package/src/daemon/server.ts +136 -510
- package/src/daemon/session-agent-loop-handlers.ts +22 -7
- package/src/daemon/session-agent-loop.ts +86 -24
- package/src/daemon/session-attachments.ts +1 -1
- package/src/daemon/session-error.ts +1 -1
- package/src/daemon/session-history.ts +20 -15
- package/src/daemon/session-lifecycle.ts +9 -7
- package/src/daemon/session-memory.ts +15 -1
- package/src/daemon/session-messaging.ts +10 -6
- package/src/daemon/session-notifiers.ts +10 -8
- package/src/daemon/session-process.ts +34 -25
- package/src/daemon/session-queue-manager.ts +1 -1
- package/src/daemon/session-runtime-assembly.ts +6 -25
- package/src/daemon/session-surfaces.ts +2 -2
- package/src/daemon/session-tool-setup.ts +1 -1
- package/src/daemon/session-usage.ts +119 -18
- package/src/daemon/session.ts +13 -9
- package/src/daemon/tool-side-effects.ts +6 -5
- package/src/daemon/trace-emitter.ts +1 -1
- package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
- package/src/daemon/watch-handler.ts +2 -5
- package/src/email/service.ts +8 -8
- package/src/events/domain-events.ts +0 -1
- package/src/events/tool-notification-listener.ts +1 -1
- package/src/followups/followup-store.ts +1 -2
- package/src/followups/types.ts +0 -6
- package/src/heartbeat/heartbeat-service.ts +1 -1
- package/src/inbound/platform-callback-registration.ts +1 -1
- package/src/inbound/public-ingress-urls.ts +0 -8
- package/src/index.ts +12 -0
- package/src/mcp/client.ts +1 -1
- package/src/mcp/manager.ts +1 -1
- package/src/memory/app-store.ts +1 -42
- package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
- package/src/memory/conversation-attention-store.ts +154 -0
- package/src/memory/conversation-bootstrap.ts +1 -1
- package/src/memory/conversation-crud.ts +53 -1
- package/src/memory/conversation-display-order-migration.ts +2 -3
- package/src/memory/conversation-queries.ts +1 -29
- package/src/memory/conversation-title-service.ts +26 -21
- package/src/memory/db-connection.ts +1 -8
- package/src/memory/db-init.ts +20 -0
- package/src/memory/delivery-crud.ts +4 -34
- package/src/memory/external-conversation-store.ts +1 -1
- package/src/memory/format-recall.ts +47 -0
- package/src/memory/guardian-action-store.ts +4 -5
- package/src/memory/guardian-rate-limits.ts +0 -3
- package/src/memory/invite-store.ts +1 -1
- package/src/memory/job-handlers/backfill.ts +9 -2
- package/src/memory/job-handlers/extraction.ts +2 -7
- package/src/memory/job-handlers/summarization.ts +1 -1
- package/src/memory/llm-usage-store.ts +11 -0
- package/src/memory/migrations/114-notifications.ts +12 -40
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
- package/src/memory/migrations/141-rename-verification-table.ts +55 -0
- package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
- package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
- package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
- package/src/memory/migrations/index.ts +5 -0
- package/src/memory/migrations/registry.ts +30 -0
- package/src/memory/qdrant-circuit-breaker.ts +5 -0
- package/src/memory/retriever.test.ts +707 -0
- package/src/memory/retriever.ts +120 -116
- package/src/memory/schema/calls.ts +3 -7
- package/src/memory/schema/guardian.ts +2 -2
- package/src/memory/search/lexical.ts +4 -1
- package/src/memory/search/query-expansion.test.ts +70 -0
- package/src/memory/search/query-expansion.ts +118 -0
- package/src/memory/search/types.ts +18 -17
- package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
- package/src/messaging/providers/whatsapp/adapter.ts +1 -4
- package/src/messaging/registry.ts +0 -1
- package/src/notifications/README.md +13 -22
- package/src/notifications/adapters/macos.ts +1 -1
- package/src/notifications/conversation-pairing.ts +2 -2
- package/src/notifications/copy-composer.ts +2 -2
- package/src/notifications/decision-engine.ts +1 -10
- package/src/notifications/destination-resolver.ts +2 -3
- package/src/notifications/emit-signal.ts +2 -8
- package/src/notifications/guardian-question-mode.ts +5 -8
- package/src/notifications/signal.ts +1 -2
- package/src/notifications/types.ts +1 -1
- package/src/oauth/token-persistence.ts +25 -1
- package/src/permissions/checker.ts +4 -29
- package/src/permissions/defaults.ts +6 -6
- package/src/permissions/prompter.ts +1 -1
- package/src/permissions/secret-prompter.ts +1 -1
- package/src/permissions/shell-identity.ts +1 -1
- package/src/permissions/trust-store.ts +13 -76
- package/src/permissions/workspace-policy.ts +1 -1
- package/src/{config → prompts}/computer-use-prompt.ts +1 -1
- package/src/{config → prompts}/system-prompt.ts +40 -21
- package/src/runtime/AGENTS.md +6 -8
- package/src/runtime/access-request-helper.ts +36 -55
- package/src/runtime/actor-trust-resolver.ts +1 -24
- package/src/runtime/approval-message-composer.ts +6 -2
- package/src/runtime/assistant-event.ts +1 -1
- package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
- package/src/runtime/auth/__tests__/subject.test.ts +32 -0
- package/src/runtime/auth/route-policy.ts +140 -24
- package/src/runtime/auth/subject.ts +9 -0
- package/src/runtime/auth/token-service.ts +11 -0
- package/src/runtime/auth/types.ts +1 -1
- package/src/runtime/channel-approval-types.ts +1 -1
- package/src/runtime/channel-approvals.ts +1 -1
- package/src/runtime/channel-invite-transport.ts +0 -2
- package/src/runtime/channel-invite-transports/slack.ts +5 -19
- package/src/runtime/channel-invite-transports/telegram.ts +17 -34
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-readiness-service.ts +24 -159
- package/src/runtime/channel-readiness-types.ts +5 -1
- package/src/runtime/channel-reply-delivery.ts +43 -3
- package/src/runtime/channel-retry-sweep.ts +14 -22
- package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
- package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
- package/src/runtime/gateway-client.ts +12 -15
- package/src/runtime/guardian-action-followup-executor.ts +8 -73
- package/src/runtime/guardian-action-grant-minter.ts +45 -61
- package/src/runtime/guardian-action-message-composer.ts +4 -4
- package/src/runtime/guardian-reply-router.ts +3 -3
- package/src/runtime/http-server.ts +133 -24
- package/src/runtime/http-types.ts +34 -1
- package/src/runtime/invite-instruction-generator.ts +1 -3
- package/src/runtime/invite-redemption-service.ts +5 -5
- package/src/runtime/invite-service.ts +7 -7
- package/src/runtime/local-actor-identity.ts +28 -2
- package/src/runtime/local-gateway-health.ts +275 -0
- package/src/runtime/middleware/twilio-validation.ts +3 -3
- package/src/runtime/migrations/migration-transport.ts +18 -3
- package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
- package/src/runtime/nl-approval-parser.ts +2 -3
- package/src/runtime/routes/access-request-decision.ts +2 -2
- package/src/runtime/routes/app-management-routes.ts +921 -0
- package/src/runtime/routes/approval-routes.ts +76 -7
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
- package/src/runtime/routes/channel-delivery-routes.ts +5 -4
- package/src/runtime/routes/channel-route-shared.ts +1 -3
- package/src/runtime/routes/channel-routes.ts +1 -4
- package/src/runtime/routes/channel-verification-routes.ts +257 -0
- package/src/runtime/routes/computer-use-routes.ts +595 -0
- package/src/runtime/routes/contact-routes.ts +1 -317
- package/src/runtime/routes/conversation-attention-routes.ts +6 -5
- package/src/runtime/routes/conversation-routes.ts +11 -18
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +813 -0
- package/src/runtime/routes/documents-routes.ts +227 -0
- package/src/runtime/routes/guardian-approval-interception.ts +25 -48
- package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
- package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
- package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
- package/src/runtime/routes/inbound-conversation.ts +3 -10
- package/src/runtime/routes/inbound-message-handler.ts +7 -6
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
- package/src/runtime/routes/integrations/slack/channel.ts +72 -0
- package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
- package/src/runtime/routes/integrations/telegram.ts +111 -0
- package/src/runtime/routes/integrations/twilio.ts +451 -0
- package/src/runtime/routes/invite-routes.ts +2 -2
- package/src/runtime/routes/pairing-routes.ts +1 -1
- package/src/runtime/routes/recording-routes.ts +332 -0
- package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
- package/src/runtime/routes/session-management-routes.ts +167 -0
- package/src/runtime/routes/session-query-routes.ts +204 -0
- package/src/runtime/routes/settings-routes.ts +977 -0
- package/src/runtime/routes/skills-routes.ts +266 -0
- package/src/runtime/routes/subagents-routes.ts +246 -0
- package/src/runtime/routes/surface-action-routes.ts +100 -10
- package/src/runtime/routes/surface-content-routes.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +809 -0
- package/src/runtime/routes/workspace-routes.test.ts +778 -0
- package/src/runtime/routes/workspace-routes.ts +410 -0
- package/src/runtime/routes/workspace-utils.ts +88 -0
- package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
- package/src/runtime/telegram-streaming-delivery.ts +380 -0
- package/src/runtime/tool-grant-request-helper.ts +1 -2
- package/src/runtime/trust-context-resolver.ts +0 -1
- package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
- package/src/runtime/verification-rate-limiter.ts +2 -2
- package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
- package/src/schedule/integration-status.ts +2 -2
- package/src/schedule/schedule-store.ts +7 -9
- package/src/sequence/engine.ts +1 -1
- package/src/skills/active-skill-tools.ts +0 -8
- package/src/skills/clawhub.ts +1 -10
- package/src/skills/managed-store.ts +14 -4
- package/src/skills/slash-commands.ts +1 -1
- package/src/subagent/manager.ts +1 -1
- package/src/subagent/types.ts +1 -1
- package/src/tasks/SPEC.md +10 -10
- package/src/tasks/task-scheduler.ts +1 -1
- package/src/telegram/bot-username.ts +13 -0
- package/src/tools/assets/materialize.ts +1 -1
- package/src/tools/assets/search.ts +1 -1
- package/src/tools/browser/browser-execution.ts +2 -2
- package/src/tools/browser/browser-manager.ts +88 -11
- package/src/tools/browser/browser-screencast.ts +1 -1
- package/src/tools/browser/headless-browser.ts +0 -17
- package/src/tools/browser/jit-auth.ts +1 -1
- package/src/tools/browser/recording-store.ts +19 -1
- package/src/tools/browser/runtime-check.ts +4 -2
- package/src/tools/calls/call-start.ts +3 -3
- package/src/tools/credentials/metadata-store.ts +0 -13
- package/src/tools/credentials/vault.ts +7 -31
- package/src/tools/followups/followup_create.ts +0 -8
- package/src/tools/mcp/mcp-tool-factory.ts +1 -1
- package/src/tools/memory/definitions.ts +32 -10
- package/src/tools/memory/handlers.test.ts +573 -0
- package/src/tools/memory/handlers.ts +222 -65
- package/src/tools/memory/register.ts +53 -24
- package/src/tools/network/script-proxy/session-manager.ts +1 -12
- package/src/tools/schedule/update.ts +0 -8
- package/src/tools/skills/load.ts +3 -3
- package/src/tools/subagent/read.ts +1 -1
- package/src/tools/system/voice-config.ts +2 -14
- package/src/tools/terminal/safe-env.ts +5 -18
- package/src/tools/tool-approval-handler.ts +4 -4
- package/src/tools/tool-manifest.ts +4 -2
- package/src/tools/types.ts +1 -1
- package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
- package/src/twitter/platform-proxy-client.ts +405 -0
- package/src/usage/types.ts +21 -0
- package/src/util/canonicalize-identity.ts +2 -6
- package/src/util/cookie-session.ts +35 -51
- package/src/util/platform.ts +93 -86
- package/src/util/pricing.ts +180 -43
- package/src/work-items/work-item-runner.ts +1 -1
- package/scripts/ipc/check-contract-inventory.ts +0 -107
- package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
- package/scripts/ipc/generate-swift.ts +0 -528
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
- package/src/__tests__/app-migration.test.ts +0 -148
- package/src/__tests__/config-loader-migration.test.ts +0 -85
- package/src/__tests__/daemon-lifecycle.test.ts +0 -715
- package/src/__tests__/daemon-server-session-init.test.ts +0 -864
- package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
- package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
- package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
- package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
- package/src/__tests__/handlers-slack-config.test.ts +0 -140
- package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
- package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
- package/src/__tests__/ingress-reconcile.test.ts +0 -606
- package/src/__tests__/integrations-cli.test.ts +0 -232
- package/src/__tests__/ipc-blob-store.test.ts +0 -329
- package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
- package/src/__tests__/ipc-contract.test.ts +0 -76
- package/src/__tests__/ipc-protocol.test.ts +0 -120
- package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
- package/src/__tests__/ipc-snapshot.test.ts +0 -2197
- package/src/__tests__/ipc-validate.test.ts +0 -471
- package/src/__tests__/migration-cli-flows.test.ts +0 -186
- package/src/__tests__/migration-ordering.test.ts +0 -267
- package/src/__tests__/oauth-connect-handler.test.ts +0 -361
- package/src/__tests__/platform-move-helper.test.ts +0 -108
- package/src/__tests__/platform-socket-path.test.ts +0 -52
- package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
- package/src/__tests__/recording-intent-handler.test.ts +0 -1155
- package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
- package/src/__tests__/sms-messaging-provider.test.ts +0 -156
- package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
- package/src/__tests__/twitter-auth-handler.test.ts +0 -561
- package/src/__tests__/work-item-output.test.ts +0 -150
- package/src/amazon/session.ts +0 -58
- package/src/cli/channels.ts +0 -51
- package/src/cli/influencer.ts +0 -319
- package/src/cli/integrations.ts +0 -372
- package/src/cli/ipc-client.ts +0 -88
- package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
- package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
- package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
- package/src/config/core-schema.ts +0 -434
- package/src/config/memory-schema.ts +0 -617
- package/src/daemon/auth-manager.ts +0 -106
- package/src/daemon/handlers/apps.ts +0 -758
- package/src/daemon/handlers/avatar.ts +0 -73
- package/src/daemon/handlers/browser.ts +0 -3
- package/src/daemon/handlers/computer-use.ts +0 -231
- package/src/daemon/handlers/config-dispatch.ts +0 -29
- package/src/daemon/handlers/config-heartbeat.ts +0 -299
- package/src/daemon/handlers/config-inbox.ts +0 -457
- package/src/daemon/handlers/config-integrations.ts +0 -409
- package/src/daemon/handlers/config-platform.ts +0 -77
- package/src/daemon/handlers/config-slack.ts +0 -41
- package/src/daemon/handlers/config-tools.ts +0 -226
- package/src/daemon/handlers/config-trust.ts +0 -135
- package/src/daemon/handlers/config.ts +0 -64
- package/src/daemon/handlers/contacts.ts +0 -193
- package/src/daemon/handlers/diagnostics.ts +0 -382
- package/src/daemon/handlers/documents.ts +0 -188
- package/src/daemon/handlers/guardian-actions.ts +0 -82
- package/src/daemon/handlers/home-base.ts +0 -82
- package/src/daemon/handlers/index.ts +0 -222
- package/src/daemon/handlers/misc.ts +0 -1139
- package/src/daemon/handlers/navigate-settings.ts +0 -29
- package/src/daemon/handlers/oauth-connect.ts +0 -202
- package/src/daemon/handlers/open-bundle-handler.ts +0 -88
- package/src/daemon/handlers/publish.ts +0 -176
- package/src/daemon/handlers/signing.ts +0 -56
- package/src/daemon/handlers/subagents.ts +0 -286
- package/src/daemon/handlers/twitter-auth.ts +0 -220
- package/src/daemon/handlers/work-items.ts +0 -796
- package/src/daemon/handlers/workspace-files.ts +0 -84
- package/src/daemon/handlers.ts +0 -16
- package/src/daemon/ipc-blob-store.ts +0 -246
- package/src/daemon/ipc-contract-inventory.json +0 -348
- package/src/daemon/ipc-contract-inventory.ts +0 -202
- package/src/daemon/ipc-handler.ts +0 -120
- package/src/daemon/ipc-protocol.ts +0 -85
- package/src/daemon/ipc-validate.ts +0 -254
- package/src/memory/app-migration.ts +0 -114
- package/src/memory/channel-delivery-store.ts +0 -40
- package/src/memory/channel-guardian-store.ts +0 -83
- package/src/memory/conversation-store.ts +0 -102
- package/src/memory/schema-migration.ts +0 -38
- package/src/messaging/providers/sms/adapter.ts +0 -232
- package/src/messaging/providers/sms/client.ts +0 -93
- package/src/messaging/providers/sms/types.ts +0 -7
- package/src/migrations/config-merge.ts +0 -62
- package/src/migrations/data-layout.ts +0 -89
- package/src/migrations/data-merge.ts +0 -44
- package/src/migrations/hooks-merge.ts +0 -118
- package/src/migrations/index.ts +0 -6
- package/src/migrations/log.ts +0 -28
- package/src/migrations/skills-merge.ts +0 -44
- package/src/migrations/workspace-layout.ts +0 -94
- package/src/notifications/adapters/sms.ts +0 -94
- package/src/runtime/channel-approval-parser.ts +0 -123
- package/src/runtime/channel-invite-transports/sms.ts +0 -53
- package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
- package/src/runtime/routes/integration-routes.ts +0 -381
- package/src/runtime/routes/twilio-routes.ts +0 -1251
- package/src/twitter/router.ts +0 -131
- package/src/twitter/session.ts +0 -54
- package/src/watcher/providers/slack.ts +0 -282
- /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
- /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
- /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
- /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
- /package/src/{twitter → cli/commands/twitter}/oauth-client.ts +0 -0
- /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
- /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
- /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
- /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
- /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
- /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
- /package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/surfaces.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
- /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
- /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
- /package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -0
- /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
- /package/src/{config → prompts}/templates/SOUL.md +0 -0
- /package/src/{config → prompts}/templates/UPDATES.md +0 -0
- /package/src/{config → prompts}/templates/USER.md +0 -0
- /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
- /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
- /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
- /package/src/{config → prompts}/update-bulletin.ts +0 -0
- /package/src/{config → prompts}/user-reference.ts +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { existsSync, realpathSync, statSync } from "node:fs";
|
|
2
|
-
import * as net from "node:net";
|
|
3
2
|
import * as path from "node:path";
|
|
4
3
|
|
|
5
4
|
import { v4 as uuid } from "uuid";
|
|
@@ -8,11 +7,10 @@ import {
|
|
|
8
7
|
linkAttachmentToMessage,
|
|
9
8
|
uploadFileBackedAttachment,
|
|
10
9
|
} from "../../memory/attachments-store.js";
|
|
11
|
-
import
|
|
12
|
-
import type { RecordingOptions, RecordingStatus } from "../
|
|
10
|
+
import { addMessage } from "../../memory/conversation-crud.js";
|
|
11
|
+
import type { RecordingOptions, RecordingStatus } from "../message-protocol.js";
|
|
13
12
|
import {
|
|
14
13
|
defineHandlers,
|
|
15
|
-
findSocketForSession,
|
|
16
14
|
type HandlerContext,
|
|
17
15
|
log,
|
|
18
16
|
} from "./shared.js";
|
|
@@ -76,8 +74,8 @@ const deferredRestartByConversation = new Map<string, DeferredRestartParams>();
|
|
|
76
74
|
|
|
77
75
|
/**
|
|
78
76
|
* Initiate a standalone recording for a conversation.
|
|
79
|
-
* Generates a unique recording ID, stores deterministic mappings, and
|
|
80
|
-
* a `recording_start`
|
|
77
|
+
* Generates a unique recording ID, stores deterministic mappings, and
|
|
78
|
+
* broadcasts a `recording_start` event to connected clients.
|
|
81
79
|
*
|
|
82
80
|
* When `operationToken` is provided (restart flow), it is threaded through
|
|
83
81
|
* to the client so that status callbacks can be validated against the token.
|
|
@@ -85,7 +83,6 @@ const deferredRestartByConversation = new Map<string, DeferredRestartParams>();
|
|
|
85
83
|
export function handleRecordingStart(
|
|
86
84
|
conversationId: string,
|
|
87
85
|
options: RecordingOptions | undefined,
|
|
88
|
-
socket: net.Socket,
|
|
89
86
|
ctx: HandlerContext,
|
|
90
87
|
operationToken?: string,
|
|
91
88
|
): string | null {
|
|
@@ -119,7 +116,7 @@ export function handleRecordingStart(
|
|
|
119
116
|
standaloneRecordingConversationId.set(recordingId, conversationId);
|
|
120
117
|
recordingOwnerByConversation.set(conversationId, recordingId);
|
|
121
118
|
|
|
122
|
-
ctx.
|
|
119
|
+
ctx.broadcast({
|
|
123
120
|
type: "recording_start",
|
|
124
121
|
recordingId,
|
|
125
122
|
attachToConversationId: conversationId,
|
|
@@ -172,23 +169,7 @@ export function handleRecordingStop(
|
|
|
172
169
|
return undefined;
|
|
173
170
|
}
|
|
174
171
|
|
|
175
|
-
|
|
176
|
-
// send the stop command to the correct client connection.
|
|
177
|
-
const socket =
|
|
178
|
-
findSocketForSession(ownerConversationId, ctx) ??
|
|
179
|
-
findSocketForSession(conversationId, ctx);
|
|
180
|
-
if (!socket) {
|
|
181
|
-
// Keep maps intact so the recording can be stopped later when a socket
|
|
182
|
-
// reconnects. Cleaning up here would orphan the client-side recording
|
|
183
|
-
// (still running) while the daemon thinks no recording is active.
|
|
184
|
-
log.warn(
|
|
185
|
-
{ conversationId, ownerConversationId, recordingId },
|
|
186
|
-
"Cannot send recording_stop: no socket bound to conversation — keeping state for retry",
|
|
187
|
-
);
|
|
188
|
-
return undefined;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
ctx.send(socket, {
|
|
172
|
+
ctx.broadcast({
|
|
192
173
|
type: "recording_stop",
|
|
193
174
|
recordingId,
|
|
194
175
|
});
|
|
@@ -261,7 +242,6 @@ export interface RecordingRestartResult {
|
|
|
261
242
|
*/
|
|
262
243
|
export function handleRecordingRestart(
|
|
263
244
|
conversationId: string,
|
|
264
|
-
socket: net.Socket,
|
|
265
245
|
ctx: HandlerContext,
|
|
266
246
|
): RecordingRestartResult {
|
|
267
247
|
// Generate a restart operation token for race hardening
|
|
@@ -342,7 +322,7 @@ export function handleRecordingRestart(
|
|
|
342
322
|
|
|
343
323
|
/**
|
|
344
324
|
* Pause the active recording for a conversation.
|
|
345
|
-
*
|
|
325
|
+
* Broadcasts a `recording_pause` event to connected clients.
|
|
346
326
|
*
|
|
347
327
|
* Returns the recording ID if pause was sent, or `undefined` if no active
|
|
348
328
|
* recording exists.
|
|
@@ -352,15 +332,13 @@ export function handleRecordingPause(
|
|
|
352
332
|
ctx: HandlerContext,
|
|
353
333
|
): string | undefined {
|
|
354
334
|
let recordingId = recordingOwnerByConversation.get(conversationId);
|
|
355
|
-
let ownerConversationId = conversationId;
|
|
356
335
|
|
|
357
336
|
// Global fallback
|
|
358
337
|
if (!recordingId && recordingOwnerByConversation.size > 0) {
|
|
359
|
-
const [
|
|
338
|
+
const [_activeConv, activeRec] = [
|
|
360
339
|
...recordingOwnerByConversation.entries(),
|
|
361
340
|
][0];
|
|
362
341
|
recordingId = activeRec;
|
|
363
|
-
ownerConversationId = activeConv;
|
|
364
342
|
}
|
|
365
343
|
|
|
366
344
|
if (!recordingId) {
|
|
@@ -368,18 +346,7 @@ export function handleRecordingPause(
|
|
|
368
346
|
return undefined;
|
|
369
347
|
}
|
|
370
348
|
|
|
371
|
-
|
|
372
|
-
findSocketForSession(ownerConversationId, ctx) ??
|
|
373
|
-
findSocketForSession(conversationId, ctx);
|
|
374
|
-
if (!socket) {
|
|
375
|
-
log.warn(
|
|
376
|
-
{ conversationId, recordingId },
|
|
377
|
-
"Cannot send recording_pause: no socket bound",
|
|
378
|
-
);
|
|
379
|
-
return undefined;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
ctx.send(socket, {
|
|
349
|
+
ctx.broadcast({
|
|
383
350
|
type: "recording_pause",
|
|
384
351
|
recordingId,
|
|
385
352
|
});
|
|
@@ -392,7 +359,7 @@ export function handleRecordingPause(
|
|
|
392
359
|
|
|
393
360
|
/**
|
|
394
361
|
* Resume a paused recording for a conversation.
|
|
395
|
-
*
|
|
362
|
+
* Broadcasts a `recording_resume` event to connected clients.
|
|
396
363
|
*
|
|
397
364
|
* Returns the recording ID if resume was sent, or `undefined` if no active
|
|
398
365
|
* recording exists.
|
|
@@ -402,15 +369,13 @@ export function handleRecordingResume(
|
|
|
402
369
|
ctx: HandlerContext,
|
|
403
370
|
): string | undefined {
|
|
404
371
|
let recordingId = recordingOwnerByConversation.get(conversationId);
|
|
405
|
-
let ownerConversationId = conversationId;
|
|
406
372
|
|
|
407
373
|
// Global fallback
|
|
408
374
|
if (!recordingId && recordingOwnerByConversation.size > 0) {
|
|
409
|
-
const [
|
|
375
|
+
const [_activeConv, activeRec] = [
|
|
410
376
|
...recordingOwnerByConversation.entries(),
|
|
411
377
|
][0];
|
|
412
378
|
recordingId = activeRec;
|
|
413
|
-
ownerConversationId = activeConv;
|
|
414
379
|
}
|
|
415
380
|
|
|
416
381
|
if (!recordingId) {
|
|
@@ -418,18 +383,7 @@ export function handleRecordingResume(
|
|
|
418
383
|
return undefined;
|
|
419
384
|
}
|
|
420
385
|
|
|
421
|
-
|
|
422
|
-
findSocketForSession(ownerConversationId, ctx) ??
|
|
423
|
-
findSocketForSession(conversationId, ctx);
|
|
424
|
-
if (!socket) {
|
|
425
|
-
log.warn(
|
|
426
|
-
{ conversationId, recordingId },
|
|
427
|
-
"Cannot send recording_resume: no socket bound",
|
|
428
|
-
);
|
|
429
|
-
return undefined;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
ctx.send(socket, {
|
|
386
|
+
ctx.broadcast({
|
|
433
387
|
type: "recording_resume",
|
|
434
388
|
recordingId,
|
|
435
389
|
});
|
|
@@ -498,10 +452,9 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
498
452
|
conversationId: string;
|
|
499
453
|
filePath?: string;
|
|
500
454
|
durationMs?: number;
|
|
501
|
-
notifySocket: net.Socket;
|
|
502
455
|
ctx: HandlerContext;
|
|
503
456
|
}): Promise<{ success: boolean; messageId?: string }> {
|
|
504
|
-
const { recordingId, conversationId, filePath,
|
|
457
|
+
const { recordingId, conversationId, filePath, ctx } = params;
|
|
505
458
|
|
|
506
459
|
// Idempotency guard: prevent double-finalization.
|
|
507
460
|
// Mark as finalized eagerly (before any async work) so concurrent calls
|
|
@@ -524,7 +477,7 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
524
477
|
);
|
|
525
478
|
const errorText = "Recording stopped but no file was produced.";
|
|
526
479
|
try {
|
|
527
|
-
await
|
|
480
|
+
await addMessage(
|
|
528
481
|
conversationId,
|
|
529
482
|
"assistant",
|
|
530
483
|
JSON.stringify([{ type: "text", text: errorText }]),
|
|
@@ -535,12 +488,12 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
535
488
|
"Failed to persist recording error message",
|
|
536
489
|
);
|
|
537
490
|
}
|
|
538
|
-
ctx.
|
|
491
|
+
ctx.broadcast({
|
|
539
492
|
type: "assistant_text_delta",
|
|
540
493
|
text: errorText,
|
|
541
494
|
sessionId: conversationId,
|
|
542
495
|
});
|
|
543
|
-
ctx.
|
|
496
|
+
ctx.broadcast({
|
|
544
497
|
type: "message_complete",
|
|
545
498
|
sessionId: conversationId,
|
|
546
499
|
});
|
|
@@ -577,7 +530,7 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
577
530
|
);
|
|
578
531
|
const errorText = "Recording file is unavailable or expired.";
|
|
579
532
|
try {
|
|
580
|
-
await
|
|
533
|
+
await addMessage(
|
|
581
534
|
conversationId,
|
|
582
535
|
"assistant",
|
|
583
536
|
JSON.stringify([{ type: "text", text: errorText }]),
|
|
@@ -588,12 +541,12 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
588
541
|
"Failed to persist recording error message",
|
|
589
542
|
);
|
|
590
543
|
}
|
|
591
|
-
ctx.
|
|
544
|
+
ctx.broadcast({
|
|
592
545
|
type: "assistant_text_delta",
|
|
593
546
|
text: errorText,
|
|
594
547
|
sessionId: conversationId,
|
|
595
548
|
});
|
|
596
|
-
ctx.
|
|
549
|
+
ctx.broadcast({
|
|
597
550
|
type: "message_complete",
|
|
598
551
|
sessionId: conversationId,
|
|
599
552
|
});
|
|
@@ -605,7 +558,7 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
605
558
|
log.error({ recordingId, filePath }, "Recording file does not exist");
|
|
606
559
|
const errorText = "Recording failed to save.";
|
|
607
560
|
try {
|
|
608
|
-
await
|
|
561
|
+
await addMessage(
|
|
609
562
|
conversationId,
|
|
610
563
|
"assistant",
|
|
611
564
|
JSON.stringify([{ type: "text", text: errorText }]),
|
|
@@ -616,12 +569,12 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
616
569
|
"Failed to persist recording error message",
|
|
617
570
|
);
|
|
618
571
|
}
|
|
619
|
-
ctx.
|
|
572
|
+
ctx.broadcast({
|
|
620
573
|
type: "assistant_text_delta",
|
|
621
574
|
text: errorText,
|
|
622
575
|
sessionId: conversationId,
|
|
623
576
|
});
|
|
624
|
-
ctx.
|
|
577
|
+
ctx.broadcast({
|
|
625
578
|
type: "message_complete",
|
|
626
579
|
sessionId: conversationId,
|
|
627
580
|
});
|
|
@@ -638,7 +591,7 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
638
591
|
);
|
|
639
592
|
const errorText = "Recording failed to save.";
|
|
640
593
|
try {
|
|
641
|
-
await
|
|
594
|
+
await addMessage(
|
|
642
595
|
conversationId,
|
|
643
596
|
"assistant",
|
|
644
597
|
JSON.stringify([{ type: "text", text: errorText }]),
|
|
@@ -649,12 +602,12 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
649
602
|
"Failed to persist recording error message",
|
|
650
603
|
);
|
|
651
604
|
}
|
|
652
|
-
ctx.
|
|
605
|
+
ctx.broadcast({
|
|
653
606
|
type: "assistant_text_delta",
|
|
654
607
|
text: errorText,
|
|
655
608
|
sessionId: conversationId,
|
|
656
609
|
});
|
|
657
|
-
ctx.
|
|
610
|
+
ctx.broadcast({
|
|
658
611
|
type: "message_complete",
|
|
659
612
|
sessionId: conversationId,
|
|
660
613
|
});
|
|
@@ -688,7 +641,7 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
688
641
|
// Reusing the last assistant message would attach the recording to an
|
|
689
642
|
// unrelated older message after reload.
|
|
690
643
|
const msgText = "Screen recording complete. Your recording has been saved.";
|
|
691
|
-
const newMsg = await
|
|
644
|
+
const newMsg = await addMessage(
|
|
692
645
|
conversationId,
|
|
693
646
|
"assistant",
|
|
694
647
|
JSON.stringify([{ type: "text", text: msgText }]),
|
|
@@ -710,13 +663,13 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
710
663
|
// AVAssetImageGenerator, which is faster and doesn't depend on ffmpeg.
|
|
711
664
|
const thumbnailData: string | undefined = undefined;
|
|
712
665
|
|
|
713
|
-
// Notify the client via
|
|
714
|
-
ctx.
|
|
666
|
+
// Notify the client via broadcast
|
|
667
|
+
ctx.broadcast({
|
|
715
668
|
type: "assistant_text_delta",
|
|
716
669
|
text: msgText,
|
|
717
670
|
sessionId: conversationId,
|
|
718
671
|
});
|
|
719
|
-
ctx.
|
|
672
|
+
ctx.broadcast({
|
|
720
673
|
type: "message_complete",
|
|
721
674
|
sessionId: conversationId,
|
|
722
675
|
attachments: [
|
|
@@ -740,7 +693,7 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
740
693
|
);
|
|
741
694
|
const errorText = "Recording saved but failed to attach to conversation.";
|
|
742
695
|
try {
|
|
743
|
-
await
|
|
696
|
+
await addMessage(
|
|
744
697
|
conversationId,
|
|
745
698
|
"assistant",
|
|
746
699
|
JSON.stringify([{ type: "text", text: errorText }]),
|
|
@@ -751,12 +704,12 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
751
704
|
"Failed to persist recording error message",
|
|
752
705
|
);
|
|
753
706
|
}
|
|
754
|
-
ctx.
|
|
707
|
+
ctx.broadcast({
|
|
755
708
|
type: "assistant_text_delta",
|
|
756
709
|
text: errorText,
|
|
757
710
|
sessionId: conversationId,
|
|
758
711
|
});
|
|
759
|
-
ctx.
|
|
712
|
+
ctx.broadcast({
|
|
760
713
|
type: "message_complete",
|
|
761
714
|
sessionId: conversationId,
|
|
762
715
|
});
|
|
@@ -766,9 +719,16 @@ export async function finalizeAndPublishRecording(params: {
|
|
|
766
719
|
|
|
767
720
|
// ─── Status (client → server lifecycle updates) ─────────────────────────────
|
|
768
721
|
|
|
769
|
-
|
|
722
|
+
/**
|
|
723
|
+
* Core recording-status business logic. Handles conversation ID resolution,
|
|
724
|
+
* operation token validation for restart race hardening, file attachment
|
|
725
|
+
* after recording stops, broadcasting recording lifecycle events, and
|
|
726
|
+
* triggering deferred recording restarts.
|
|
727
|
+
*
|
|
728
|
+
* Shared by both the IPC handler and the HTTP POST route.
|
|
729
|
+
*/
|
|
730
|
+
export async function handleRecordingStatusCore(
|
|
770
731
|
msg: RecordingStatus,
|
|
771
|
-
reportingSocket: net.Socket,
|
|
772
732
|
ctx: HandlerContext,
|
|
773
733
|
): Promise<void> {
|
|
774
734
|
const recordingId = msg.sessionId;
|
|
@@ -832,11 +792,6 @@ async function handleRecordingStatus(
|
|
|
832
792
|
cancelStopTimeout(recordingId);
|
|
833
793
|
}
|
|
834
794
|
|
|
835
|
-
// Use the reporting socket (which delivered this message) as the primary
|
|
836
|
-
// recipient. Fall back to session-based lookup if the user switched sessions.
|
|
837
|
-
const notifySocket =
|
|
838
|
-
reportingSocket ?? findSocketForSession(conversationId, ctx);
|
|
839
|
-
|
|
840
795
|
switch (msg.status) {
|
|
841
796
|
case "started": {
|
|
842
797
|
log.info(
|
|
@@ -874,17 +829,15 @@ async function handleRecordingStatus(
|
|
|
874
829
|
activeRestartToken = null;
|
|
875
830
|
}
|
|
876
831
|
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
});
|
|
887
|
-
}
|
|
832
|
+
ctx.broadcast({
|
|
833
|
+
type: "assistant_text_delta",
|
|
834
|
+
text: "Recording restart cancelled.",
|
|
835
|
+
sessionId: conversationId,
|
|
836
|
+
});
|
|
837
|
+
ctx.broadcast({
|
|
838
|
+
type: "message_complete",
|
|
839
|
+
sessionId: conversationId,
|
|
840
|
+
});
|
|
888
841
|
break;
|
|
889
842
|
}
|
|
890
843
|
|
|
@@ -918,22 +871,6 @@ async function handleRecordingStatus(
|
|
|
918
871
|
if (deferred) {
|
|
919
872
|
deferredRestartByConversation.delete(conversationId);
|
|
920
873
|
|
|
921
|
-
// Resolve a fresh socket at stop-ack time instead of using the one
|
|
922
|
-
// captured at restart-request time, which may be stale (disconnected
|
|
923
|
-
// or replaced) by the time the async stop completes.
|
|
924
|
-
const freshSocket =
|
|
925
|
-
findSocketForSession(deferred.conversationId, ctx) ?? reportingSocket;
|
|
926
|
-
|
|
927
|
-
if (!freshSocket) {
|
|
928
|
-
log.warn(
|
|
929
|
-
{ conversationId, requesterId: deferred.conversationId },
|
|
930
|
-
"Deferred restart aborted — no socket available at stop-ack time",
|
|
931
|
-
);
|
|
932
|
-
activeRestartToken = null;
|
|
933
|
-
pendingRestartByConversation.delete(conversationId);
|
|
934
|
-
break;
|
|
935
|
-
}
|
|
936
|
-
|
|
937
874
|
log.info(
|
|
938
875
|
{
|
|
939
876
|
recordingId,
|
|
@@ -946,7 +883,6 @@ async function handleRecordingStatus(
|
|
|
946
883
|
const newRecordingId = handleRecordingStart(
|
|
947
884
|
deferred.conversationId,
|
|
948
885
|
{ promptForSource: true },
|
|
949
|
-
freshSocket,
|
|
950
886
|
ctx,
|
|
951
887
|
deferred.operationToken,
|
|
952
888
|
);
|
|
@@ -1013,35 +949,27 @@ async function handleRecordingStatus(
|
|
|
1013
949
|
// and notify the client. The deferred start fires first so the user
|
|
1014
950
|
// sees immediate activity (new recording starting) before the old
|
|
1015
951
|
// recording's completion message appears.
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
ctx,
|
|
1024
|
-
});
|
|
952
|
+
const finResult = await finalizeAndPublishRecording({
|
|
953
|
+
recordingId,
|
|
954
|
+
conversationId,
|
|
955
|
+
filePath: msg.filePath,
|
|
956
|
+
durationMs: msg.durationMs,
|
|
957
|
+
ctx,
|
|
958
|
+
});
|
|
1025
959
|
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
}
|
|
1040
|
-
// Other failure combos:
|
|
1041
|
-
// - new-start-failure + old-finalize-failure: finalizeAndPublishRecording
|
|
1042
|
-
// already sent error messages, restart state already cleaned up above.
|
|
1043
|
-
// - new-start-success + old-finalize-failure: finalization already sent
|
|
1044
|
-
// error messages, new recording is running — no extra message needed.
|
|
960
|
+
// Handle old-success + new-start-failure: the old recording saved
|
|
961
|
+
// but the new one couldn't start. Send explicit follow-up text so
|
|
962
|
+
// the user knows the state.
|
|
963
|
+
if (!newRecordingId && finResult.success) {
|
|
964
|
+
ctx.broadcast({
|
|
965
|
+
type: "assistant_text_delta",
|
|
966
|
+
text: "Previous recording saved. New recording failed to start.",
|
|
967
|
+
sessionId: deferred.conversationId,
|
|
968
|
+
});
|
|
969
|
+
ctx.broadcast({
|
|
970
|
+
type: "message_complete",
|
|
971
|
+
sessionId: deferred.conversationId,
|
|
972
|
+
});
|
|
1045
973
|
}
|
|
1046
974
|
|
|
1047
975
|
// Prevent fall-through to the normal finalization path below since
|
|
@@ -1050,16 +978,13 @@ async function handleRecordingStatus(
|
|
|
1050
978
|
}
|
|
1051
979
|
|
|
1052
980
|
// Finalize: attach the recording file to the conversation
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
ctx,
|
|
1061
|
-
});
|
|
1062
|
-
}
|
|
981
|
+
await finalizeAndPublishRecording({
|
|
982
|
+
recordingId,
|
|
983
|
+
conversationId,
|
|
984
|
+
filePath: msg.filePath,
|
|
985
|
+
durationMs: msg.durationMs,
|
|
986
|
+
ctx,
|
|
987
|
+
});
|
|
1063
988
|
|
|
1064
989
|
break;
|
|
1065
990
|
}
|
|
@@ -1070,17 +995,15 @@ async function handleRecordingStatus(
|
|
|
1070
995
|
"Standalone recording failed",
|
|
1071
996
|
);
|
|
1072
997
|
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
});
|
|
1083
|
-
}
|
|
998
|
+
ctx.broadcast({
|
|
999
|
+
type: "assistant_text_delta",
|
|
1000
|
+
text: `Recording failed: ${msg.error ?? "unknown error"}`,
|
|
1001
|
+
sessionId: conversationId,
|
|
1002
|
+
});
|
|
1003
|
+
ctx.broadcast({
|
|
1004
|
+
type: "message_complete",
|
|
1005
|
+
sessionId: conversationId,
|
|
1006
|
+
});
|
|
1084
1007
|
|
|
1085
1008
|
cleanupMaps(recordingId, conversationId);
|
|
1086
1009
|
|
|
@@ -1099,41 +1022,6 @@ async function handleRecordingStatus(
|
|
|
1099
1022
|
}
|
|
1100
1023
|
}
|
|
1101
1024
|
|
|
1102
|
-
// ─── Socket disconnect cleanup ───────────────────────────────────────────────
|
|
1103
|
-
|
|
1104
|
-
/**
|
|
1105
|
-
* Clean up recording state for recordings whose owning conversation is bound
|
|
1106
|
-
* to the disconnecting socket. Accepts a lookup function that resolves a
|
|
1107
|
-
* conversation ID to its current socket, so we only clean up recordings
|
|
1108
|
-
* affected by this specific socket disconnect — not unrelated sessions.
|
|
1109
|
-
*/
|
|
1110
|
-
export function cleanupRecordingsOnDisconnect(
|
|
1111
|
-
disconnectedSocket: net.Socket,
|
|
1112
|
-
findSocketForConversation: (conversationId: string) => net.Socket | undefined,
|
|
1113
|
-
): void {
|
|
1114
|
-
if (recordingOwnerByConversation.size === 0) return;
|
|
1115
|
-
for (const [convId, recId] of [...recordingOwnerByConversation.entries()]) {
|
|
1116
|
-
const ownerSocket = findSocketForConversation(convId);
|
|
1117
|
-
// Clean up if the owner conversation's socket is the one disconnecting,
|
|
1118
|
-
// or if the owner conversation has no socket bound at all.
|
|
1119
|
-
if (!ownerSocket || ownerSocket === disconnectedSocket) {
|
|
1120
|
-
log.warn(
|
|
1121
|
-
{ conversationId: convId, recordingId: recId },
|
|
1122
|
-
"Cleaning up recording state for disconnected socket",
|
|
1123
|
-
);
|
|
1124
|
-
cancelStopTimeout(recId);
|
|
1125
|
-
standaloneRecordingConversationId.delete(recId);
|
|
1126
|
-
recordingOwnerByConversation.delete(convId);
|
|
1127
|
-
pendingRestartByConversation.delete(convId);
|
|
1128
|
-
deferredRestartByConversation.delete(convId);
|
|
1129
|
-
}
|
|
1130
|
-
}
|
|
1131
|
-
// Clear restart token if all pending restarts were cleaned up
|
|
1132
|
-
if (pendingRestartByConversation.size === 0) {
|
|
1133
|
-
activeRestartToken = null;
|
|
1134
|
-
}
|
|
1135
|
-
}
|
|
1136
|
-
|
|
1137
1025
|
// ─── Test helpers ────────────────────────────────────────────────────────────
|
|
1138
1026
|
|
|
1139
1027
|
/**
|
|
@@ -1162,8 +1050,18 @@ export function __resetRecordingState(): void {
|
|
|
1162
1050
|
activeRestartToken = null;
|
|
1163
1051
|
}
|
|
1164
1052
|
|
|
1053
|
+
// ─── IPC handler wrapper ─────────────────────────────────────────────────────
|
|
1054
|
+
|
|
1055
|
+
/** IPC-compatible wrapper: ignores the socket (unused) and delegates to core. */
|
|
1056
|
+
async function handleRecordingStatusIpc(
|
|
1057
|
+
msg: RecordingStatus,
|
|
1058
|
+
ctx: HandlerContext,
|
|
1059
|
+
): Promise<void> {
|
|
1060
|
+
return handleRecordingStatusCore(msg, ctx);
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1165
1063
|
// ─── Export handler group ────────────────────────────────────────────────────
|
|
1166
1064
|
|
|
1167
1065
|
export const recordingHandlers = defineHandlers({
|
|
1168
|
-
recording_status:
|
|
1066
|
+
recording_status: handleRecordingStatusIpc,
|
|
1169
1067
|
});
|