vellum 0.2.13 → 0.3.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/bin/vellum.js +2 -0
- package/package.json +6 -65
- package/.dockerignore +0 -27
- package/.env.example +0 -22
- package/Dockerfile +0 -99
- package/Dockerfile.sandbox +0 -5
- package/README.md +0 -169
- package/bun.lock +0 -1743
- package/bunfig.toml +0 -2
- package/docs/skills.md +0 -158
- package/drizzle/0000_dizzy_maggott.sql +0 -301
- package/drizzle/meta/0000_snapshot.json +0 -1999
- package/drizzle/meta/_journal.json +0 -13
- package/drizzle.config.ts +0 -7
- package/eslint.config.mjs +0 -17
- package/hook-templates/debug-prompt-logger/hook.json +0 -7
- package/hook-templates/debug-prompt-logger/run.sh +0 -68
- package/knip.json +0 -9
- package/scripts/capture-x-graphql.ts +0 -545
- package/scripts/ipc/check-contract-inventory.ts +0 -104
- package/scripts/ipc/check-swift-decoder-drift.ts +0 -164
- package/scripts/ipc/generate-swift.ts +0 -492
- package/scripts/test-filesystem-tools.sh +0 -48
- package/scripts/test.sh +0 -127
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -2316
- package/src/__tests__/account-registry.test.ts +0 -245
- package/src/__tests__/active-skill-tools.test.ts +0 -378
- package/src/__tests__/agent-heartbeat-service.test.ts +0 -250
- package/src/__tests__/agent-loop-thinking.test.ts +0 -81
- package/src/__tests__/agent-loop.test.ts +0 -1135
- package/src/__tests__/anthropic-provider.test.ts +0 -778
- package/src/__tests__/app-builder-tool-scripts.test.ts +0 -290
- package/src/__tests__/app-bundler.test.ts +0 -292
- package/src/__tests__/app-executors.test.ts +0 -613
- package/src/__tests__/app-open-proxy.test.ts +0 -62
- package/src/__tests__/asset-materialize-tool.test.ts +0 -452
- package/src/__tests__/asset-search-tool.test.ts +0 -477
- package/src/__tests__/assistant-attachment-directive.test.ts +0 -401
- package/src/__tests__/assistant-attachments.test.ts +0 -437
- package/src/__tests__/assistant-event-hub.test.ts +0 -226
- package/src/__tests__/assistant-event.test.ts +0 -123
- package/src/__tests__/attachments-store.test.ts +0 -476
- package/src/__tests__/attachments.test.ts +0 -134
- package/src/__tests__/audit-log-rotation.test.ts +0 -154
- package/src/__tests__/browser-fill-credential.test.ts +0 -309
- package/src/__tests__/browser-manager.test.ts +0 -203
- package/src/__tests__/browser-runtime-check.test.ts +0 -55
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +0 -68
- package/src/__tests__/browser-skill-endstate.test.ts +0 -195
- package/src/__tests__/bundle-scanner.test.ts +0 -313
- package/src/__tests__/call-bridge.test.ts +0 -425
- package/src/__tests__/call-constants.test.ts +0 -40
- package/src/__tests__/call-orchestrator.test.ts +0 -512
- package/src/__tests__/call-recovery.test.ts +0 -518
- package/src/__tests__/call-routes-http.test.ts +0 -459
- package/src/__tests__/call-state-machine.test.ts +0 -143
- package/src/__tests__/call-state.test.ts +0 -174
- package/src/__tests__/call-store.test.ts +0 -691
- package/src/__tests__/checker.test.ts +0 -3960
- package/src/__tests__/clarification-resolver.test.ts +0 -159
- package/src/__tests__/classifier.test.ts +0 -67
- package/src/__tests__/claude-code-skill-regression.test.ts +0 -127
- package/src/__tests__/claude-code-tool-profiles.test.ts +0 -88
- package/src/__tests__/cli-discover.test.ts +0 -85
- package/src/__tests__/cli.test.ts +0 -81
- package/src/__tests__/clipboard.test.ts +0 -80
- package/src/__tests__/commit-guarantee.test.ts +0 -335
- package/src/__tests__/commit-message-enrichment-service.test.ts +0 -550
- package/src/__tests__/compaction.benchmark.test.ts +0 -176
- package/src/__tests__/computer-use-session-compaction.test.ts +0 -132
- package/src/__tests__/computer-use-session-lifecycle.test.ts +0 -293
- package/src/__tests__/computer-use-session-working-dir.test.ts +0 -117
- package/src/__tests__/computer-use-skill-baseline.test.ts +0 -74
- package/src/__tests__/computer-use-skill-endstate.test.ts +0 -89
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +0 -217
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +0 -107
- package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +0 -54
- package/src/__tests__/computer-use-tools.test.ts +0 -250
- package/src/__tests__/config-schema.test.ts +0 -1343
- package/src/__tests__/conflict-store.test.ts +0 -330
- package/src/__tests__/connection-policy.test.ts +0 -102
- package/src/__tests__/contacts-tools.test.ts +0 -331
- package/src/__tests__/context-memory-e2e.test.ts +0 -434
- package/src/__tests__/context-token-estimator.test.ts +0 -135
- package/src/__tests__/context-window-manager.test.ts +0 -376
- package/src/__tests__/contradiction-checker.test.ts +0 -216
- package/src/__tests__/conversation-store.test.ts +0 -612
- package/src/__tests__/credential-broker-browser-fill.test.ts +0 -517
- package/src/__tests__/credential-broker-server-use.test.ts +0 -554
- package/src/__tests__/credential-broker.test.ts +0 -167
- package/src/__tests__/credential-host-pattern-match.test.ts +0 -104
- package/src/__tests__/credential-metadata-store.test.ts +0 -779
- package/src/__tests__/credential-policy-validate.test.ts +0 -121
- package/src/__tests__/credential-resolve.test.ts +0 -328
- package/src/__tests__/credential-security-e2e.test.ts +0 -352
- package/src/__tests__/credential-security-invariants.test.ts +0 -567
- package/src/__tests__/credential-selection.test.ts +0 -354
- package/src/__tests__/credential-vault.test.ts +0 -852
- package/src/__tests__/daemon-assistant-events.test.ts +0 -164
- package/src/__tests__/daemon-server-session-init.test.ts +0 -522
- package/src/__tests__/date-context.test.ts +0 -373
- package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -129
- package/src/__tests__/delete-managed-skill-tool.test.ts +0 -97
- package/src/__tests__/diff.test.ts +0 -121
- package/src/__tests__/domain-normalize.test.ts +0 -112
- package/src/__tests__/domain-policy.test.ts +0 -124
- package/src/__tests__/doordash-client.test.ts +0 -186
- package/src/__tests__/doordash-session.test.ts +0 -152
- package/src/__tests__/dynamic-page-surface.test.ts +0 -91
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -132
- package/src/__tests__/edit-engine.test.ts +0 -180
- package/src/__tests__/elevenlabs-client.test.ts +0 -209
- package/src/__tests__/email-cli.test.ts +0 -283
- package/src/__tests__/encrypted-store.test.ts +0 -332
- package/src/__tests__/entity-extractor.test.ts +0 -190
- package/src/__tests__/ephemeral-permissions.test.ts +0 -312
- package/src/__tests__/evaluate-typescript-tool.test.ts +0 -286
- package/src/__tests__/event-bus.test.ts +0 -222
- package/src/__tests__/file-edit-tool.test.ts +0 -122
- package/src/__tests__/file-ops-service.test.ts +0 -330
- package/src/__tests__/file-read-tool.test.ts +0 -75
- package/src/__tests__/file-write-tool.test.ts +0 -113
- package/src/__tests__/fixtures/credential-security-fixtures.ts +0 -181
- package/src/__tests__/fixtures/media-reuse-fixtures.ts +0 -126
- package/src/__tests__/fixtures/mock-signup-server.ts +0 -387
- package/src/__tests__/fixtures/proxy-fixtures.ts +0 -147
- package/src/__tests__/followup-tools.test.ts +0 -303
- package/src/__tests__/forbidden-legacy-symbols.test.ts +0 -71
- package/src/__tests__/fuzzy-match-property.test.ts +0 -216
- package/src/__tests__/fuzzy-match.test.ts +0 -138
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -436
- package/src/__tests__/gemini-image-service.test.ts +0 -261
- package/src/__tests__/gemini-provider.test.ts +0 -651
- package/src/__tests__/get-weather.test.ts +0 -318
- package/src/__tests__/gmail-integration.test.ts +0 -73
- package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -351
- package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -190
- package/src/__tests__/handlers-slack-config.test.ts +0 -199
- package/src/__tests__/handlers-task-submit-slash.test.ts +0 -38
- package/src/__tests__/handlers-twitter-config.test.ts +0 -718
- package/src/__tests__/headless-browser-interactions.test.ts +0 -536
- package/src/__tests__/headless-browser-navigate.test.ts +0 -211
- package/src/__tests__/headless-browser-read-tools.test.ts +0 -261
- package/src/__tests__/headless-browser-snapshot.test.ts +0 -185
- package/src/__tests__/history-repair-observability.test.ts +0 -56
- package/src/__tests__/history-repair.test.ts +0 -510
- package/src/__tests__/home-base-bootstrap.test.ts +0 -82
- package/src/__tests__/hooks-blocking.test.ts +0 -128
- package/src/__tests__/hooks-cli.test.ts +0 -144
- package/src/__tests__/hooks-config.test.ts +0 -93
- package/src/__tests__/hooks-discovery.test.ts +0 -199
- package/src/__tests__/hooks-integration.test.ts +0 -189
- package/src/__tests__/hooks-manager.test.ts +0 -187
- package/src/__tests__/hooks-runner.test.ts +0 -178
- package/src/__tests__/hooks-settings.test.ts +0 -154
- package/src/__tests__/hooks-templates.test.ts +0 -137
- package/src/__tests__/hooks-ts-runner.test.ts +0 -125
- package/src/__tests__/hooks-watch.test.ts +0 -100
- package/src/__tests__/host-file-edit-tool.test.ts +0 -104
- package/src/__tests__/host-file-read-tool.test.ts +0 -61
- package/src/__tests__/host-file-write-tool.test.ts +0 -77
- package/src/__tests__/host-shell-tool.test.ts +0 -311
- package/src/__tests__/ingress-url-consistency.test.ts +0 -214
- package/src/__tests__/intent-routing.test.ts +0 -259
- package/src/__tests__/ipc-blob-store.test.ts +0 -315
- package/src/__tests__/ipc-contract-inventory.test.ts +0 -54
- package/src/__tests__/ipc-contract.test.ts +0 -74
- package/src/__tests__/ipc-protocol.test.ts +0 -113
- package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -237
- package/src/__tests__/ipc-snapshot.test.ts +0 -1698
- package/src/__tests__/ipc-validate.test.ts +0 -357
- package/src/__tests__/key-migration.test.ts +0 -183
- package/src/__tests__/keychain.test.ts +0 -258
- package/src/__tests__/llm-usage-store.test.ts +0 -221
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -257
- package/src/__tests__/managed-store.test.ts +0 -608
- package/src/__tests__/media-generate-image.test.ts +0 -238
- package/src/__tests__/media-reuse-story.e2e.test.ts +0 -676
- package/src/__tests__/media-visibility-policy.test.ts +0 -141
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +0 -235
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -481
- package/src/__tests__/memory-query-builder.test.ts +0 -59
- package/src/__tests__/memory-recall-quality.test.ts +0 -846
- package/src/__tests__/memory-regressions.experimental.test.ts +0 -538
- package/src/__tests__/memory-regressions.test.ts +0 -4336
- package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -430
- package/src/__tests__/migration-cli-flows.test.ts +0 -169
- package/src/__tests__/migration-ordering.test.ts +0 -249
- package/src/__tests__/mock-signup-server.test.ts +0 -528
- package/src/__tests__/oauth-callback-registry.test.ts +0 -85
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -285
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -176
- package/src/__tests__/onboarding-template-contract.test.ts +0 -58
- package/src/__tests__/openai-provider.test.ts +0 -753
- package/src/__tests__/parallel-tool.benchmark.test.ts +0 -294
- package/src/__tests__/parser.test.ts +0 -472
- package/src/__tests__/path-classifier.test.ts +0 -73
- package/src/__tests__/path-policy.test.ts +0 -435
- package/src/__tests__/platform-move-helper.test.ts +0 -99
- package/src/__tests__/platform-socket-path.test.ts +0 -52
- package/src/__tests__/platform-workspace-migration.test.ts +0 -1000
- package/src/__tests__/platform.test.ts +0 -131
- package/src/__tests__/playbook-tools.test.ts +0 -342
- package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -75
- package/src/__tests__/pricing.test.ts +0 -256
- package/src/__tests__/profile-compiler.test.ts +0 -374
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -342
- package/src/__tests__/provider-registry-ollama.test.ts +0 -16
- package/src/__tests__/provider-streaming.benchmark.test.ts +0 -773
- package/src/__tests__/proxy-approval-callback.test.ts +0 -601
- package/src/__tests__/public-ingress-urls.test.ts +0 -222
- package/src/__tests__/ratelimit.test.ts +0 -297
- package/src/__tests__/recurrence-engine-rruleset.test.ts +0 -78
- package/src/__tests__/recurrence-engine.test.ts +0 -69
- package/src/__tests__/recurrence-types.test.ts +0 -71
- package/src/__tests__/registry.test.ts +0 -494
- package/src/__tests__/relay-server.test.ts +0 -688
- package/src/__tests__/reminder-store.test.ts +0 -223
- package/src/__tests__/reminder.test.ts +0 -229
- package/src/__tests__/request-file-tool.test.ts +0 -158
- package/src/__tests__/run-orchestrator-assistant-events.test.ts +0 -222
- package/src/__tests__/run-orchestrator.test.ts +0 -200
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -189
- package/src/__tests__/runtime-events-sse-parity.test.ts +0 -343
- package/src/__tests__/runtime-events-sse.test.ts +0 -162
- package/src/__tests__/runtime-runs-http.test.ts +0 -433
- package/src/__tests__/runtime-runs.test.ts +0 -273
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -408
- package/src/__tests__/sandbox-host-parity.test.ts +0 -950
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -253
- package/src/__tests__/schedule-store.test.ts +0 -482
- package/src/__tests__/schedule-tools.test.ts +0 -700
- package/src/__tests__/scheduler-recurrence.test.ts +0 -329
- package/src/__tests__/script-proxy-certs.test.ts +0 -90
- package/src/__tests__/script-proxy-connect-tunnel.test.ts +0 -177
- package/src/__tests__/script-proxy-decision-trace.test.ts +0 -156
- package/src/__tests__/script-proxy-http-forwarder.test.ts +0 -281
- package/src/__tests__/script-proxy-injection-runtime.test.ts +0 -401
- package/src/__tests__/script-proxy-mitm-handler.test.ts +0 -407
- package/src/__tests__/script-proxy-policy-runtime.test.ts +0 -287
- package/src/__tests__/script-proxy-policy.test.ts +0 -310
- package/src/__tests__/script-proxy-rewrite-specificity.test.ts +0 -135
- package/src/__tests__/script-proxy-router.test.ts +0 -180
- package/src/__tests__/script-proxy-session-manager.test.ts +0 -382
- package/src/__tests__/script-proxy-session-runtime.test.ts +0 -113
- package/src/__tests__/secret-allowlist.test.ts +0 -229
- package/src/__tests__/secret-ingress-handler.test.ts +0 -99
- package/src/__tests__/secret-onetime-send.test.ts +0 -130
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +0 -106
- package/src/__tests__/secret-response-routing.test.ts +0 -93
- package/src/__tests__/secret-scanner-executor.test.ts +0 -348
- package/src/__tests__/secret-scanner.test.ts +0 -857
- package/src/__tests__/secure-keys.test.ts +0 -323
- package/src/__tests__/server-history-render.test.ts +0 -431
- package/src/__tests__/session-abort-tool-results.test.ts +0 -240
- package/src/__tests__/session-conflict-gate.test.ts +0 -700
- package/src/__tests__/session-error.test.ts +0 -369
- package/src/__tests__/session-evictor.test.ts +0 -188
- package/src/__tests__/session-init.benchmark.test.ts +0 -462
- package/src/__tests__/session-load-history-repair.test.ts +0 -222
- package/src/__tests__/session-pre-run-repair.test.ts +0 -213
- package/src/__tests__/session-profile-injection.test.ts +0 -444
- package/src/__tests__/session-provider-retry-repair.test.ts +0 -306
- package/src/__tests__/session-queue.test.ts +0 -1535
- package/src/__tests__/session-runtime-assembly.test.ts +0 -476
- package/src/__tests__/session-runtime-workspace.test.ts +0 -183
- package/src/__tests__/session-skill-tools.test.ts +0 -2431
- package/src/__tests__/session-slash-known.test.ts +0 -368
- package/src/__tests__/session-slash-queue.test.ts +0 -288
- package/src/__tests__/session-slash-unknown.test.ts +0 -271
- package/src/__tests__/session-surfaces-task-progress.test.ts +0 -104
- package/src/__tests__/session-tool-setup-app-refresh.test.ts +0 -473
- package/src/__tests__/session-tool-setup-memory-scope.test.ts +0 -140
- package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +0 -140
- package/src/__tests__/session-undo.test.ts +0 -75
- package/src/__tests__/session-workspace-cache-state.test.ts +0 -246
- package/src/__tests__/session-workspace-injection.test.ts +0 -327
- package/src/__tests__/session-workspace-tool-tracking.test.ts +0 -240
- package/src/__tests__/shared-filesystem-errors.test.ts +0 -78
- package/src/__tests__/shell-credential-ref.test.ts +0 -187
- package/src/__tests__/shell-parser-fuzz.test.ts +0 -544
- package/src/__tests__/shell-parser-property.test.ts +0 -433
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -272
- package/src/__tests__/signup-e2e.test.ts +0 -353
- package/src/__tests__/size-guard.test.ts +0 -117
- package/src/__tests__/skill-include-graph.test.ts +0 -303
- package/src/__tests__/skill-load-tool.test.ts +0 -409
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -328
- package/src/__tests__/skill-script-runner-host.test.ts +0 -489
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -349
- package/src/__tests__/skill-script-runner.test.ts +0 -159
- package/src/__tests__/skill-tool-factory.test.ts +0 -252
- package/src/__tests__/skill-tool-manifest.test.ts +0 -658
- package/src/__tests__/skill-version-hash.test.ts +0 -182
- package/src/__tests__/skills.test.ts +0 -680
- package/src/__tests__/slash-commands-catalog.test.ts +0 -86
- package/src/__tests__/slash-commands-parser.test.ts +0 -119
- package/src/__tests__/slash-commands-resolver.test.ts +0 -193
- package/src/__tests__/slash-commands-rewrite.test.ts +0 -39
- package/src/__tests__/speaker-identification.test.ts +0 -52
- package/src/__tests__/starter-bundle.test.ts +0 -136
- package/src/__tests__/starter-task-flow.test.ts +0 -143
- package/src/__tests__/subagent-manager-notify.test.ts +0 -404
- package/src/__tests__/subagent-tools.test.ts +0 -218
- package/src/__tests__/subagent-types.test.ts +0 -78
- package/src/__tests__/swarm-orchestrator.test.ts +0 -428
- package/src/__tests__/swarm-plan-validator.test.ts +0 -330
- package/src/__tests__/swarm-recursion.test.ts +0 -165
- package/src/__tests__/swarm-router-planner.test.ts +0 -208
- package/src/__tests__/swarm-session-integration.test.ts +0 -274
- package/src/__tests__/swarm-tool.test.ts +0 -145
- package/src/__tests__/swarm-worker-backend.test.ts +0 -129
- package/src/__tests__/swarm-worker-runner.test.ts +0 -272
- package/src/__tests__/system-prompt.test.ts +0 -439
- package/src/__tests__/task-compiler.test.ts +0 -284
- package/src/__tests__/task-runner.test.ts +0 -216
- package/src/__tests__/task-scheduler.test.ts +0 -217
- package/src/__tests__/task-tools.test.ts +0 -595
- package/src/__tests__/terminal-sandbox-docker.test.ts +0 -1064
- package/src/__tests__/terminal-sandbox.integration.test.ts +0 -178
- package/src/__tests__/terminal-sandbox.test.ts +0 -202
- package/src/__tests__/test-support/browser-skill-harness.ts +0 -90
- package/src/__tests__/test-support/computer-use-skill-harness.ts +0 -45
- package/src/__tests__/tool-audit-listener.test.ts +0 -113
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -253
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -500
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -516
- package/src/__tests__/tool-executor-redaction.test.ts +0 -289
- package/src/__tests__/tool-executor.test.ts +0 -2055
- package/src/__tests__/tool-metrics-listener.test.ts +0 -225
- package/src/__tests__/tool-notification-listener.test.ts +0 -49
- package/src/__tests__/tool-policy.test.ts +0 -54
- package/src/__tests__/tool-profiling-listener.test.ts +0 -268
- package/src/__tests__/tool-result-truncation.test.ts +0 -217
- package/src/__tests__/tool-trace-listener.test.ts +0 -226
- package/src/__tests__/top-level-renderer.test.ts +0 -121
- package/src/__tests__/top-level-scanner.test.ts +0 -141
- package/src/__tests__/trace-emitter.test.ts +0 -173
- package/src/__tests__/trust-store.test.ts +0 -2031
- package/src/__tests__/turn-commit.test.ts +0 -554
- package/src/__tests__/twilio-provider.test.ts +0 -179
- package/src/__tests__/twilio-routes-twiml.test.ts +0 -127
- package/src/__tests__/twilio-routes.test.ts +0 -822
- package/src/__tests__/twitter-auth-handler.test.ts +0 -666
- package/src/__tests__/url-safety.test.ts +0 -418
- package/src/__tests__/view-image-tool.test.ts +0 -217
- package/src/__tests__/weather-skill-regression.test.ts +0 -225
- package/src/__tests__/web-fetch.test.ts +0 -869
- package/src/__tests__/web-search.test.ts +0 -584
- package/src/__tests__/workspace-git-service.test.ts +0 -1153
- package/src/__tests__/workspace-heartbeat-service.test.ts +0 -486
- package/src/__tests__/workspace-lifecycle.test.ts +0 -292
- package/src/agent/attachments.ts +0 -35
- package/src/agent/loop.ts +0 -500
- package/src/agent/message-types.ts +0 -17
- package/src/agent-heartbeat/agent-heartbeat-service.ts +0 -155
- package/src/autonomy/autonomy-resolver.ts +0 -60
- package/src/autonomy/autonomy-store.ts +0 -122
- package/src/autonomy/disposition-mapper.ts +0 -31
- package/src/autonomy/index.ts +0 -11
- package/src/autonomy/types.ts +0 -39
- package/src/bundler/app-bundler.ts +0 -295
- package/src/bundler/bundle-scanner.ts +0 -535
- package/src/bundler/bundle-signer.ts +0 -124
- package/src/bundler/manifest.ts +0 -21
- package/src/bundler/signature-verifier.ts +0 -184
- package/src/calls/call-bridge.ts +0 -95
- package/src/calls/call-constants.ts +0 -48
- package/src/calls/call-domain.ts +0 -278
- package/src/calls/call-orchestrator.ts +0 -412
- package/src/calls/call-recovery.ts +0 -207
- package/src/calls/call-state-machine.ts +0 -68
- package/src/calls/call-state.ts +0 -87
- package/src/calls/call-store.ts +0 -416
- package/src/calls/elevenlabs-client.ts +0 -89
- package/src/calls/elevenlabs-config.ts +0 -29
- package/src/calls/relay-server.ts +0 -390
- package/src/calls/speaker-identification.ts +0 -213
- package/src/calls/twilio-config.ts +0 -45
- package/src/calls/twilio-provider.ts +0 -178
- package/src/calls/twilio-routes.ts +0 -316
- package/src/calls/types.ts +0 -37
- package/src/calls/voice-provider.ts +0 -14
- package/src/calls/voice-quality.ts +0 -92
- package/src/cli/autonomy.ts +0 -188
- package/src/cli/config-commands.ts +0 -334
- package/src/cli/contacts.ts +0 -149
- package/src/cli/core-commands.ts +0 -784
- package/src/cli/doordash.ts +0 -1055
- package/src/cli/email-guardrails.ts +0 -200
- package/src/cli/email.ts +0 -405
- package/src/cli/ipc-client.ts +0 -82
- package/src/cli/main-screen.tsx +0 -53
- package/src/cli/map.ts +0 -270
- package/src/cli/twitter.ts +0 -575
- package/src/cli.ts +0 -937
- package/src/commands/__tests__/cc-command-registry.test.ts +0 -319
- package/src/commands/cc-command-registry.ts +0 -209
- package/src/config/bundled-skills/.gitkeep +0 -0
- package/src/config/bundled-skills/agentmail/SKILL.md +0 -128
- package/src/config/bundled-skills/agentmail/icon.svg +0 -21
- package/src/config/bundled-skills/app-builder/SKILL.md +0 -1404
- package/src/config/bundled-skills/app-builder/TOOLS.json +0 -279
- package/src/config/bundled-skills/app-builder/icon.svg +0 -9
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +0 -15
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +0 -10
- package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +0 -11
- package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +0 -10
- package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +0 -18
- package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +0 -11
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +0 -10
- package/src/config/bundled-skills/app-builder/tools/app-query.ts +0 -10
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +0 -20
- package/src/config/bundled-skills/browser/SKILL.md +0 -28
- package/src/config/bundled-skills/browser/TOOLS.json +0 -234
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -9
- package/src/config/bundled-skills/claude-code/SKILL.md +0 -50
- package/src/config/bundled-skills/claude-code/TOOLS.json +0 -40
- package/src/config/bundled-skills/claude-code/tools/claude-code.ts +0 -9
- package/src/config/bundled-skills/computer-use/SKILL.md +0 -17
- package/src/config/bundled-skills/computer-use/TOOLS.json +0 -326
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +0 -9
- package/src/config/bundled-skills/contacts/SKILL.md +0 -39
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -122
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +0 -9
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +0 -9
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -9
- package/src/config/bundled-skills/document/SKILL.md +0 -26
- package/src/config/bundled-skills/document/TOOLS.json +0 -53
- package/src/config/bundled-skills/document/tools/document-create.ts +0 -9
- package/src/config/bundled-skills/document/tools/document-update.ts +0 -9
- package/src/config/bundled-skills/doordash/SKILL.md +0 -163
- package/src/config/bundled-skills/followups/SKILL.md +0 -32
- package/src/config/bundled-skills/followups/TOOLS.json +0 -100
- package/src/config/bundled-skills/followups/icon.svg +0 -24
- package/src/config/bundled-skills/followups/tools/followup-create.ts +0 -9
- package/src/config/bundled-skills/followups/tools/followup-list.ts +0 -9
- package/src/config/bundled-skills/followups/tools/followup-resolve.ts +0 -9
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -108
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -165
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -21
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -42
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -13
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -30
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -41
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -18
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/image-studio/SKILL.md +0 -32
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -42
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +0 -115
- package/src/config/bundled-skills/macos-automation/SKILL.md +0 -66
- package/src/config/bundled-skills/messaging/SKILL.md +0 -130
- package/src/config/bundled-skills/messaging/TOOLS.json +0 -357
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -23
- package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -23
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -25
- package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +0 -26
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -25
- package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +0 -23
- package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +0 -84
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -18
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +0 -125
- package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +0 -16
- package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +0 -49
- package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +0 -21
- package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +0 -25
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +0 -28
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -29
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +0 -22
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/shared.ts +0 -71
- package/src/config/bundled-skills/messaging/tools/slack-add-reaction.ts +0 -25
- package/src/config/bundled-skills/messaging/tools/slack-leave-channel.ts +0 -23
- package/src/config/bundled-skills/phone-calls/SKILL.md +0 -414
- package/src/config/bundled-skills/playbooks/SKILL.md +0 -31
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -126
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +0 -9
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +0 -9
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +0 -9
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +0 -9
- package/src/config/bundled-skills/public-ingress/SKILL.md +0 -183
- package/src/config/bundled-skills/reminder/SKILL.md +0 -20
- package/src/config/bundled-skills/reminder/TOOLS.json +0 -67
- package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +0 -9
- package/src/config/bundled-skills/reminder/tools/reminder-create.ts +0 -9
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -9
- package/src/config/bundled-skills/schedule/SKILL.md +0 -74
- package/src/config/bundled-skills/schedule/TOOLS.json +0 -135
- package/src/config/bundled-skills/schedule/tools/schedule-create.ts +0 -9
- package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +0 -9
- package/src/config/bundled-skills/schedule/tools/schedule-list.ts +0 -9
- package/src/config/bundled-skills/schedule/tools/schedule-update.ts +0 -9
- package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -68
- package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
- package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
- package/src/config/bundled-skills/subagent/SKILL.md +0 -25
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -107
- package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +0 -9
- package/src/config/bundled-skills/subagent/tools/subagent-message.ts +0 -9
- package/src/config/bundled-skills/subagent/tools/subagent-read.ts +0 -9
- package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +0 -9
- package/src/config/bundled-skills/subagent/tools/subagent-status.ts +0 -9
- package/src/config/bundled-skills/tasks/SKILL.md +0 -28
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -281
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -9
- package/src/config/bundled-skills/transcribe/SKILL.md +0 -25
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -32
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +0 -370
- package/src/config/bundled-skills/twitter/SKILL.md +0 -134
- package/src/config/bundled-skills/watcher/SKILL.md +0 -27
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -147
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -9
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -9
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -9
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -9
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -9
- package/src/config/bundled-skills/weather/SKILL.md +0 -37
- package/src/config/bundled-skills/weather/TOOLS.json +0 -32
- package/src/config/bundled-skills/weather/icon.svg +0 -24
- package/src/config/bundled-skills/weather/tools/get-weather.ts +0 -9
- package/src/config/computer-use-prompt.ts +0 -97
- package/src/config/defaults.ts +0 -252
- package/src/config/loader.ts +0 -339
- package/src/config/schema.ts +0 -1356
- package/src/config/skill-state.ts +0 -95
- package/src/config/skills.ts +0 -972
- package/src/config/system-prompt.ts +0 -675
- package/src/config/templates/BOOTSTRAP.md +0 -70
- package/src/config/templates/IDENTITY.md +0 -25
- package/src/config/templates/LOOKS.md +0 -25
- package/src/config/templates/SOUL.md +0 -37
- package/src/config/templates/USER.md +0 -19
- package/src/config/types.ts +0 -40
- package/src/config/vellum-skills/deploy-fullstack-vercel/SKILL.md +0 -179
- package/src/config/vellum-skills/document-writer/SKILL.md +0 -195
- package/src/config/vellum-skills/google-oauth-setup/SKILL.md +0 -199
- package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +0 -153
- package/src/config/vellum-skills/telegram-setup/SKILL.md +0 -102
- package/src/contacts/contact-store.ts +0 -410
- package/src/contacts/index.ts +0 -11
- package/src/contacts/types.ts +0 -28
- package/src/context/token-estimator.ts +0 -108
- package/src/context/tool-result-truncation.ts +0 -128
- package/src/context/window-manager.ts +0 -531
- package/src/daemon/assistant-attachments.ts +0 -689
- package/src/daemon/classifier.ts +0 -110
- package/src/daemon/computer-use-session.ts +0 -903
- package/src/daemon/connection-policy.ts +0 -41
- package/src/daemon/date-context.ts +0 -136
- package/src/daemon/handlers/apps.ts +0 -461
- package/src/daemon/handlers/browser.ts +0 -54
- package/src/daemon/handlers/computer-use.ts +0 -187
- package/src/daemon/handlers/config.ts +0 -707
- package/src/daemon/handlers/diagnostics.ts +0 -338
- package/src/daemon/handlers/documents.ts +0 -173
- package/src/daemon/handlers/home-base.ts +0 -78
- package/src/daemon/handlers/identity.ts +0 -127
- package/src/daemon/handlers/index.ts +0 -128
- package/src/daemon/handlers/misc.ts +0 -331
- package/src/daemon/handlers/open-bundle-handler.ts +0 -80
- package/src/daemon/handlers/publish.ts +0 -187
- package/src/daemon/handlers/sessions.ts +0 -539
- package/src/daemon/handlers/shared.ts +0 -569
- package/src/daemon/handlers/signing.ts +0 -37
- package/src/daemon/handlers/skills.ts +0 -501
- package/src/daemon/handlers/subagents.ts +0 -210
- package/src/daemon/handlers/twitter-auth.ts +0 -198
- package/src/daemon/handlers/work-items.ts +0 -632
- package/src/daemon/handlers/workspace-files.ts +0 -75
- package/src/daemon/handlers.ts +0 -17
- package/src/daemon/history-repair.ts +0 -214
- package/src/daemon/ipc-blob-store.ts +0 -231
- package/src/daemon/ipc-contract-inventory.json +0 -463
- package/src/daemon/ipc-contract-inventory.ts +0 -126
- package/src/daemon/ipc-contract.ts +0 -2352
- package/src/daemon/ipc-protocol.ts +0 -75
- package/src/daemon/ipc-validate.ts +0 -171
- package/src/daemon/lifecycle.ts +0 -580
- package/src/daemon/main.ts +0 -21
- package/src/daemon/media-visibility-policy.ts +0 -57
- package/src/daemon/ride-shotgun-handler.ts +0 -309
- package/src/daemon/server.ts +0 -1207
- package/src/daemon/session-agent-loop.ts +0 -922
- package/src/daemon/session-attachments.ts +0 -196
- package/src/daemon/session-conflict-gate.ts +0 -128
- package/src/daemon/session-dynamic-profile.ts +0 -63
- package/src/daemon/session-error.ts +0 -290
- package/src/daemon/session-evictor.ts +0 -196
- package/src/daemon/session-history.ts +0 -437
- package/src/daemon/session-lifecycle.ts +0 -147
- package/src/daemon/session-media-retry.ts +0 -147
- package/src/daemon/session-memory.ts +0 -212
- package/src/daemon/session-messaging.ts +0 -145
- package/src/daemon/session-notifiers.ts +0 -193
- package/src/daemon/session-process.ts +0 -264
- package/src/daemon/session-queue-manager.ts +0 -82
- package/src/daemon/session-runtime-assembly.ts +0 -447
- package/src/daemon/session-skill-tools.ts +0 -356
- package/src/daemon/session-slash.ts +0 -305
- package/src/daemon/session-surfaces.ts +0 -702
- package/src/daemon/session-tool-setup.ts +0 -524
- package/src/daemon/session-usage.ts +0 -72
- package/src/daemon/session-workspace.ts +0 -19
- package/src/daemon/session.ts +0 -400
- package/src/daemon/trace-emitter.ts +0 -82
- package/src/daemon/video-thumbnail.ts +0 -60
- package/src/daemon/watch-handler.ts +0 -274
- package/src/doordash/client.ts +0 -999
- package/src/doordash/queries.ts +0 -1311
- package/src/doordash/query-extractor.ts +0 -93
- package/src/doordash/session.ts +0 -82
- package/src/email/provider.ts +0 -117
- package/src/email/providers/agentmail.ts +0 -317
- package/src/email/providers/index.ts +0 -58
- package/src/email/service.ts +0 -303
- package/src/email/types.ts +0 -126
- package/src/events/bus.ts +0 -157
- package/src/events/domain-events.ts +0 -83
- package/src/events/index.ts +0 -18
- package/src/events/tool-audit-listener.ts +0 -80
- package/src/events/tool-domain-event-publisher.ts +0 -111
- package/src/events/tool-metrics-listener.ts +0 -159
- package/src/events/tool-notification-listener.ts +0 -17
- package/src/events/tool-profiling-listener.ts +0 -158
- package/src/events/tool-trace-listener.ts +0 -75
- package/src/export/formatter.ts +0 -98
- package/src/followups/followup-store.ts +0 -168
- package/src/followups/index.ts +0 -10
- package/src/followups/types.ts +0 -29
- package/src/gallery/default-gallery.ts +0 -795
- package/src/gallery/gallery-manifest.ts +0 -24
- package/src/home-base/app-link-store.ts +0 -82
- package/src/home-base/bootstrap.ts +0 -68
- package/src/home-base/prebuilt/index.html +0 -662
- package/src/home-base/prebuilt/seed-metadata.json +0 -21
- package/src/home-base/prebuilt/seed.ts +0 -112
- package/src/home-base/prebuilt-home-base-updater.ts +0 -30
- package/src/hooks/cli.ts +0 -163
- package/src/hooks/config.ts +0 -88
- package/src/hooks/discovery.ts +0 -110
- package/src/hooks/manager.ts +0 -128
- package/src/hooks/runner.ts +0 -123
- package/src/hooks/templates.ts +0 -52
- package/src/hooks/types.ts +0 -72
- package/src/inbound/public-ingress-urls.ts +0 -123
- package/src/index.ts +0 -75
- package/src/instrument.ts +0 -60
- package/src/logfire.ts +0 -99
- package/src/media/gemini-image-service.ts +0 -136
- package/src/memory/account-store.ts +0 -108
- package/src/memory/admin.ts +0 -211
- package/src/memory/app-store.ts +0 -556
- package/src/memory/attachments-store.ts +0 -397
- package/src/memory/channel-delivery-store.ts +0 -353
- package/src/memory/checkpoints.ts +0 -52
- package/src/memory/clarification-resolver.ts +0 -298
- package/src/memory/conflict-intent.ts +0 -114
- package/src/memory/conflict-store.ts +0 -342
- package/src/memory/contradiction-checker.ts +0 -330
- package/src/memory/conversation-key-store.ts +0 -107
- package/src/memory/conversation-store.ts +0 -470
- package/src/memory/db.ts +0 -1825
- package/src/memory/embedding-backend.ts +0 -229
- package/src/memory/embedding-gemini.ts +0 -52
- package/src/memory/embedding-local.ts +0 -75
- package/src/memory/embedding-ollama.ts +0 -55
- package/src/memory/embedding-openai.ts +0 -25
- package/src/memory/entity-extractor.ts +0 -474
- package/src/memory/fingerprint.ts +0 -20
- package/src/memory/indexer.ts +0 -156
- package/src/memory/items-extractor.ts +0 -461
- package/src/memory/job-handlers/backfill.ts +0 -139
- package/src/memory/job-handlers/cleanup.ts +0 -58
- package/src/memory/job-handlers/conflict.ts +0 -121
- package/src/memory/job-handlers/embedding.ts +0 -61
- package/src/memory/job-handlers/extraction.ts +0 -123
- package/src/memory/job-handlers/index-maintenance.ts +0 -54
- package/src/memory/job-handlers/summarization.ts +0 -286
- package/src/memory/job-utils.ts +0 -170
- package/src/memory/jobs-store.ts +0 -401
- package/src/memory/jobs-worker.ts +0 -274
- package/src/memory/llm-request-log-store.ts +0 -45
- package/src/memory/llm-usage-store.ts +0 -60
- package/src/memory/message-content.ts +0 -54
- package/src/memory/profile-compiler.ts +0 -160
- package/src/memory/published-pages-store.ts +0 -137
- package/src/memory/qdrant-client.ts +0 -366
- package/src/memory/qdrant-manager.ts +0 -242
- package/src/memory/query-builder.ts +0 -45
- package/src/memory/retrieval-budget.ts +0 -30
- package/src/memory/retriever.ts +0 -653
- package/src/memory/runs-store.ts +0 -255
- package/src/memory/schema.ts +0 -588
- package/src/memory/search/entity.ts +0 -298
- package/src/memory/search/formatting.ts +0 -207
- package/src/memory/search/lexical.ts +0 -227
- package/src/memory/search/ranking.ts +0 -401
- package/src/memory/search/semantic.ts +0 -121
- package/src/memory/search/types.ts +0 -137
- package/src/memory/segmenter.ts +0 -68
- package/src/memory/shared-app-links-store.ts +0 -138
- package/src/memory/tool-usage-store.ts +0 -62
- package/src/messaging/activity-analyzer.ts +0 -76
- package/src/messaging/draft-store.ts +0 -88
- package/src/messaging/index.ts +0 -3
- package/src/messaging/provider-types.ts +0 -80
- package/src/messaging/provider.ts +0 -43
- package/src/messaging/providers/gmail/adapter.ts +0 -193
- package/src/messaging/providers/gmail/client.ts +0 -204
- package/src/messaging/providers/gmail/types.ts +0 -90
- package/src/messaging/providers/slack/adapter.ts +0 -202
- package/src/messaging/providers/slack/client.ts +0 -198
- package/src/messaging/providers/slack/types.ts +0 -119
- package/src/messaging/registry.ts +0 -34
- package/src/messaging/style-analyzer.ts +0 -159
- package/src/messaging/thread-summarizer.ts +0 -306
- package/src/messaging/triage-engine.ts +0 -323
- package/src/messaging/types.ts +0 -55
- package/src/permissions/checker.ts +0 -636
- package/src/permissions/defaults.ts +0 -254
- package/src/permissions/prompter.ts +0 -102
- package/src/permissions/secret-prompter.ts +0 -114
- package/src/permissions/trust-store.ts +0 -584
- package/src/permissions/types.ts +0 -62
- package/src/playbooks/index.ts +0 -2
- package/src/playbooks/playbook-compiler.ts +0 -90
- package/src/playbooks/types.ts +0 -55
- package/src/providers/anthropic/client.ts +0 -751
- package/src/providers/failover.ts +0 -129
- package/src/providers/fireworks/client.ts +0 -20
- package/src/providers/gemini/client.ts +0 -285
- package/src/providers/ollama/client.ts +0 -30
- package/src/providers/openai/client.ts +0 -337
- package/src/providers/openrouter/client.ts +0 -20
- package/src/providers/ratelimit.ts +0 -93
- package/src/providers/registry.ts +0 -146
- package/src/providers/retry.ts +0 -106
- package/src/providers/stream-timeout.ts +0 -38
- package/src/providers/types.ts +0 -109
- package/src/runtime/assistant-event-hub.ts +0 -120
- package/src/runtime/assistant-event.ts +0 -82
- package/src/runtime/gateway-client.ts +0 -42
- package/src/runtime/http-server.ts +0 -1056
- package/src/runtime/http-types.ts +0 -66
- package/src/runtime/routes/app-routes.ts +0 -174
- package/src/runtime/routes/attachment-routes.ts +0 -133
- package/src/runtime/routes/call-routes.ts +0 -140
- package/src/runtime/routes/channel-routes.ts +0 -382
- package/src/runtime/routes/conversation-routes.ts +0 -352
- package/src/runtime/routes/events-routes.ts +0 -79
- package/src/runtime/routes/run-routes.ts +0 -262
- package/src/runtime/routes/secret-routes.ts +0 -76
- package/src/runtime/run-orchestrator.ts +0 -296
- package/src/schedule/recurrence-engine.ts +0 -138
- package/src/schedule/recurrence-types.ts +0 -67
- package/src/schedule/schedule-store.ts +0 -497
- package/src/schedule/scheduler.ts +0 -171
- package/src/security/encrypted-store.ts +0 -238
- package/src/security/keychain.ts +0 -252
- package/src/security/oauth-callback-registry.ts +0 -66
- package/src/security/oauth2.ts +0 -274
- package/src/security/redaction.ts +0 -89
- package/src/security/secret-allowlist.ts +0 -164
- package/src/security/secret-ingress.ts +0 -57
- package/src/security/secret-scanner.ts +0 -543
- package/src/security/secure-keys.ts +0 -180
- package/src/security/token-manager.ts +0 -141
- package/src/services/published-app-updater.ts +0 -69
- package/src/services/vercel-deploy.ts +0 -73
- package/src/skills/active-skill-tools.ts +0 -81
- package/src/skills/clawhub.ts +0 -414
- package/src/skills/include-graph.ts +0 -146
- package/src/skills/managed-store.ts +0 -233
- package/src/skills/path-classifier.ts +0 -128
- package/src/skills/slash-commands.ts +0 -174
- package/src/skills/tool-manifest.ts +0 -165
- package/src/skills/version-hash.ts +0 -110
- package/src/slack/slack-webhook.ts +0 -61
- package/src/subagent/index.ts +0 -19
- package/src/subagent/manager.ts +0 -511
- package/src/subagent/types.ts +0 -69
- package/src/swarm/backend-claude-code.ts +0 -145
- package/src/swarm/index.ts +0 -44
- package/src/swarm/limits.ts +0 -37
- package/src/swarm/orchestrator.ts +0 -279
- package/src/swarm/plan-validator.ts +0 -151
- package/src/swarm/router-planner.ts +0 -100
- package/src/swarm/router-prompts.ts +0 -36
- package/src/swarm/synthesizer.ts +0 -62
- package/src/swarm/types.ts +0 -62
- package/src/swarm/worker-backend.ts +0 -121
- package/src/swarm/worker-prompts.ts +0 -79
- package/src/swarm/worker-runner.ts +0 -164
- package/src/tasks/SPEC.md +0 -139
- package/src/tasks/candidate-store.ts +0 -86
- package/src/tasks/ephemeral-permissions.ts +0 -50
- package/src/tasks/task-compiler.ts +0 -199
- package/src/tasks/task-runner.ts +0 -90
- package/src/tasks/task-scheduler.ts +0 -20
- package/src/tasks/task-store.ts +0 -127
- package/src/tasks/tool-sanitizer.ts +0 -36
- package/src/tools/apps/definitions.ts +0 -59
- package/src/tools/apps/executors.ts +0 -313
- package/src/tools/apps/open-proxy.ts +0 -43
- package/src/tools/apps/registry.ts +0 -16
- package/src/tools/assets/materialize.ts +0 -218
- package/src/tools/assets/search.ts +0 -361
- package/src/tools/browser/__tests__/auth-cache.test.ts +0 -219
- package/src/tools/browser/__tests__/auth-detector.test.ts +0 -362
- package/src/tools/browser/__tests__/jit-auth.test.ts +0 -189
- package/src/tools/browser/api-map.ts +0 -293
- package/src/tools/browser/auth-cache.ts +0 -149
- package/src/tools/browser/auth-detector.ts +0 -347
- package/src/tools/browser/auto-navigate.ts +0 -270
- package/src/tools/browser/browser-execution.ts +0 -980
- package/src/tools/browser/browser-handoff.ts +0 -79
- package/src/tools/browser/browser-manager.ts +0 -715
- package/src/tools/browser/browser-screencast.ts +0 -217
- package/src/tools/browser/headless-browser.ts +0 -450
- package/src/tools/browser/jit-auth.ts +0 -51
- package/src/tools/browser/network-recorder.ts +0 -349
- package/src/tools/browser/network-recording-types.ts +0 -49
- package/src/tools/browser/recording-store.ts +0 -49
- package/src/tools/browser/runtime-check.ts +0 -43
- package/src/tools/browser/x-auto-navigate.ts +0 -207
- package/src/tools/calls/call-end.ts +0 -67
- package/src/tools/calls/call-start.ts +0 -73
- package/src/tools/calls/call-status.ts +0 -81
- package/src/tools/claude-code/claude-code.ts +0 -428
- package/src/tools/computer-use/definitions.ts +0 -443
- package/src/tools/computer-use/registry.ts +0 -22
- package/src/tools/computer-use/request-computer-control.ts +0 -53
- package/src/tools/computer-use/skill-proxy-bridge.ts +0 -28
- package/src/tools/contacts/contact-merge.ts +0 -55
- package/src/tools/contacts/contact-search.ts +0 -58
- package/src/tools/contacts/contact-upsert.ts +0 -64
- package/src/tools/credentials/account-registry.ts +0 -127
- package/src/tools/credentials/broker-types.ts +0 -107
- package/src/tools/credentials/broker.ts +0 -372
- package/src/tools/credentials/domain-policy.ts +0 -51
- package/src/tools/credentials/host-pattern-match.ts +0 -60
- package/src/tools/credentials/metadata-store.ts +0 -335
- package/src/tools/credentials/policy-types.ts +0 -52
- package/src/tools/credentials/policy-validate.ts +0 -80
- package/src/tools/credentials/resolve.ts +0 -122
- package/src/tools/credentials/selection.ts +0 -159
- package/src/tools/credentials/tool-policy.ts +0 -25
- package/src/tools/credentials/vault.ts +0 -657
- package/src/tools/document/document-tool.ts +0 -92
- package/src/tools/document/editor-template.ts +0 -237
- package/src/tools/executor.ts +0 -944
- package/src/tools/filesystem/edit.ts +0 -127
- package/src/tools/filesystem/fuzzy-match.ts +0 -202
- package/src/tools/filesystem/read.ts +0 -71
- package/src/tools/filesystem/view-image.ts +0 -199
- package/src/tools/filesystem/write.ts +0 -79
- package/src/tools/followups/followup_create.ts +0 -76
- package/src/tools/followups/followup_list.ts +0 -60
- package/src/tools/followups/followup_resolve.ts +0 -56
- package/src/tools/host-filesystem/edit.ts +0 -125
- package/src/tools/host-filesystem/read.ts +0 -80
- package/src/tools/host-filesystem/write.ts +0 -76
- package/src/tools/host-terminal/cli-discover.ts +0 -180
- package/src/tools/host-terminal/host-shell.ts +0 -191
- package/src/tools/memory/definitions.ts +0 -69
- package/src/tools/memory/handlers.ts +0 -246
- package/src/tools/memory/register.ts +0 -66
- package/src/tools/network/__tests__/web-search.test.ts +0 -427
- package/src/tools/network/domain-normalize.ts +0 -85
- package/src/tools/network/script-proxy/__tests__/logging.test.ts +0 -248
- package/src/tools/network/script-proxy/__tests__/policy.test.ts +0 -234
- package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -76
- package/src/tools/network/script-proxy/certs.ts +0 -237
- package/src/tools/network/script-proxy/connect-tunnel.ts +0 -82
- package/src/tools/network/script-proxy/http-forwarder.ts +0 -151
- package/src/tools/network/script-proxy/index.ts +0 -28
- package/src/tools/network/script-proxy/logging.ts +0 -196
- package/src/tools/network/script-proxy/mitm-handler.ts +0 -269
- package/src/tools/network/script-proxy/policy.ts +0 -152
- package/src/tools/network/script-proxy/router.ts +0 -60
- package/src/tools/network/script-proxy/server.ts +0 -136
- package/src/tools/network/script-proxy/session-manager.ts +0 -534
- package/src/tools/network/script-proxy/types.ts +0 -125
- package/src/tools/network/url-safety.ts +0 -227
- package/src/tools/network/web-fetch.ts +0 -713
- package/src/tools/network/web-search.ts +0 -319
- package/src/tools/playbooks/index.ts +0 -4
- package/src/tools/playbooks/playbook-create.ts +0 -96
- package/src/tools/playbooks/playbook-delete.ts +0 -52
- package/src/tools/playbooks/playbook-list.ts +0 -74
- package/src/tools/playbooks/playbook-update.ts +0 -111
- package/src/tools/registry.ts +0 -295
- package/src/tools/reminder/reminder-store.ts +0 -148
- package/src/tools/reminder/reminder.ts +0 -80
- package/src/tools/schedule/create.ts +0 -81
- package/src/tools/schedule/delete.ts +0 -28
- package/src/tools/schedule/list.ts +0 -69
- package/src/tools/schedule/update.ts +0 -90
- package/src/tools/shared/filesystem/edit-engine.ts +0 -56
- package/src/tools/shared/filesystem/errors.ts +0 -85
- package/src/tools/shared/filesystem/file-ops-service.ts +0 -215
- package/src/tools/shared/filesystem/format-diff.ts +0 -35
- package/src/tools/shared/filesystem/path-policy.ts +0 -125
- package/src/tools/shared/filesystem/size-guard.ts +0 -41
- package/src/tools/shared/filesystem/types.ts +0 -80
- package/src/tools/shared/shell-output.ts +0 -52
- package/src/tools/skills/delete-managed.ts +0 -60
- package/src/tools/skills/load.ts +0 -139
- package/src/tools/skills/sandbox-runner.ts +0 -279
- package/src/tools/skills/scaffold-managed.ts +0 -150
- package/src/tools/skills/script-contract.ts +0 -6
- package/src/tools/skills/skill-script-runner.ts +0 -86
- package/src/tools/skills/skill-tool-factory.ts +0 -64
- package/src/tools/skills/vellum-catalog.ts +0 -217
- package/src/tools/subagent/abort.ts +0 -33
- package/src/tools/subagent/message.ts +0 -39
- package/src/tools/subagent/read.ts +0 -67
- package/src/tools/subagent/spawn.ts +0 -46
- package/src/tools/subagent/status.ts +0 -45
- package/src/tools/swarm/delegate.ts +0 -183
- package/src/tools/system/request-permission.ts +0 -98
- package/src/tools/system/version.ts +0 -43
- package/src/tools/tasks/index.ts +0 -27
- package/src/tools/tasks/task-delete.ts +0 -82
- package/src/tools/tasks/task-list.ts +0 -44
- package/src/tools/tasks/task-run.ts +0 -97
- package/src/tools/tasks/task-save.ts +0 -47
- package/src/tools/tasks/work-item-enqueue.ts +0 -234
- package/src/tools/tasks/work-item-list.ts +0 -55
- package/src/tools/tasks/work-item-remove.ts +0 -60
- package/src/tools/tasks/work-item-run.ts +0 -78
- package/src/tools/tasks/work-item-update.ts +0 -114
- package/src/tools/terminal/backends/docker.ts +0 -372
- package/src/tools/terminal/backends/native.ts +0 -190
- package/src/tools/terminal/backends/types.ts +0 -26
- package/src/tools/terminal/evaluate-typescript.ts +0 -275
- package/src/tools/terminal/parser.ts +0 -415
- package/src/tools/terminal/safe-env.ts +0 -37
- package/src/tools/terminal/sandbox-diagnostics.ts +0 -149
- package/src/tools/terminal/sandbox.ts +0 -44
- package/src/tools/terminal/shell.ts +0 -257
- package/src/tools/tool-manifest.ts +0 -198
- package/src/tools/types.ts +0 -183
- package/src/tools/ui-surface/definitions.ts +0 -244
- package/src/tools/ui-surface/registry.ts +0 -14
- package/src/tools/watch/screen-watch.ts +0 -130
- package/src/tools/watch/watch-state.ts +0 -119
- package/src/tools/watcher/create.ts +0 -64
- package/src/tools/watcher/delete.ts +0 -27
- package/src/tools/watcher/digest.ts +0 -50
- package/src/tools/watcher/list.ts +0 -60
- package/src/tools/watcher/update.ts +0 -56
- package/src/tools/weather/service.ts +0 -551
- package/src/twitter/client.ts +0 -690
- package/src/twitter/session.ts +0 -91
- package/src/usage/actors.ts +0 -24
- package/src/usage/types.ts +0 -37
- package/src/util/clipboard.ts +0 -33
- package/src/util/content-id.ts +0 -16
- package/src/util/diff.ts +0 -181
- package/src/util/errors.ts +0 -129
- package/src/util/logger.ts +0 -243
- package/src/util/platform.ts +0 -607
- package/src/util/pricing.ts +0 -150
- package/src/util/spinner.ts +0 -51
- package/src/util/time.ts +0 -16
- package/src/util/truncate.ts +0 -6
- package/src/util/xml.ts +0 -4
- package/src/version.ts +0 -3
- package/src/watcher/constants.ts +0 -11
- package/src/watcher/engine.ts +0 -199
- package/src/watcher/provider-registry.ts +0 -15
- package/src/watcher/provider-types.ts +0 -48
- package/src/watcher/providers/gmail.ts +0 -198
- package/src/watcher/providers/google-calendar.ts +0 -228
- package/src/watcher/providers/slack.ts +0 -129
- package/src/watcher/watcher-store.ts +0 -419
- package/src/work-items/work-item-runner.ts +0 -171
- package/src/work-items/work-item-store.ts +0 -325
- package/src/workspace/commit-message-enrichment-service.ts +0 -284
- package/src/workspace/commit-message-provider.ts +0 -95
- package/src/workspace/git-service.ts +0 -840
- package/src/workspace/heartbeat-service.ts +0 -345
- package/src/workspace/provider-commit-message-generator.ts +0 -285
- package/src/workspace/top-level-renderer.ts +0 -19
- package/src/workspace/top-level-scanner.ts +0 -41
- package/src/workspace/turn-commit.ts +0 -175
- package/tsconfig.json +0 -21
|
@@ -1,412 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LLM-driven call orchestrator.
|
|
3
|
-
*
|
|
4
|
-
* Manages the conversation loop for an active phone call: receives caller
|
|
5
|
-
* utterances, sends them to Claude via the Anthropic streaming API, and
|
|
6
|
-
* streams text tokens back through the RelayConnection for real-time TTS.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
10
|
-
import { getConfig } from '../config/loader.js';
|
|
11
|
-
import { getLogger } from '../util/logger.js';
|
|
12
|
-
import {
|
|
13
|
-
getCallSession,
|
|
14
|
-
updateCallSession,
|
|
15
|
-
recordCallEvent,
|
|
16
|
-
createPendingQuestion,
|
|
17
|
-
expirePendingQuestions,
|
|
18
|
-
} from './call-store.js';
|
|
19
|
-
import { getMaxCallDurationMs, getUserConsultationTimeoutMs, SILENCE_TIMEOUT_MS } from './call-constants.js';
|
|
20
|
-
import type { RelayConnection } from './relay-server.js';
|
|
21
|
-
import { registerCallOrchestrator, unregisterCallOrchestrator, fireCallQuestionNotifier, fireCallCompletionNotifier, fireCallTranscriptNotifier } from './call-state.js';
|
|
22
|
-
import type { PromptSpeakerContext } from './speaker-identification.js';
|
|
23
|
-
|
|
24
|
-
const log = getLogger('call-orchestrator');
|
|
25
|
-
|
|
26
|
-
type OrchestratorState = 'idle' | 'processing' | 'waiting_on_user' | 'speaking';
|
|
27
|
-
|
|
28
|
-
const ASK_USER_REGEX = /\[ASK_USER:\s*(.+?)\]/;
|
|
29
|
-
const END_CALL_MARKER = '[END_CALL]';
|
|
30
|
-
|
|
31
|
-
export class CallOrchestrator {
|
|
32
|
-
private callSessionId: string;
|
|
33
|
-
private relay: RelayConnection;
|
|
34
|
-
private state: OrchestratorState = 'idle';
|
|
35
|
-
private conversationHistory: Array<{ role: 'user' | 'assistant'; content: string }> = [];
|
|
36
|
-
private abortController: AbortController = new AbortController();
|
|
37
|
-
private callStartTime: number = Date.now();
|
|
38
|
-
private silenceTimer: ReturnType<typeof setTimeout> | null = null;
|
|
39
|
-
private durationTimer: ReturnType<typeof setTimeout> | null = null;
|
|
40
|
-
private durationWarningTimer: ReturnType<typeof setTimeout> | null = null;
|
|
41
|
-
private consultationTimer: ReturnType<typeof setTimeout> | null = null;
|
|
42
|
-
private durationEndTimer: ReturnType<typeof setTimeout> | null = null;
|
|
43
|
-
private task: string | null;
|
|
44
|
-
|
|
45
|
-
constructor(callSessionId: string, relay: RelayConnection, task: string | null) {
|
|
46
|
-
this.callSessionId = callSessionId;
|
|
47
|
-
this.relay = relay;
|
|
48
|
-
this.task = task;
|
|
49
|
-
this.startDurationTimer();
|
|
50
|
-
this.resetSilenceTimer();
|
|
51
|
-
registerCallOrchestrator(callSessionId, this);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Returns the current orchestrator state.
|
|
56
|
-
*/
|
|
57
|
-
getState(): OrchestratorState {
|
|
58
|
-
return this.state;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Handle a final caller utterance from the ConversationRelay.
|
|
63
|
-
*/
|
|
64
|
-
async handleCallerUtterance(transcript: string, speaker?: PromptSpeakerContext): Promise<void> {
|
|
65
|
-
// If we're already processing or speaking, abort the in-flight generation
|
|
66
|
-
if (this.state === 'processing' || this.state === 'speaking') {
|
|
67
|
-
this.abortController.abort();
|
|
68
|
-
this.abortController = new AbortController();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
this.state = 'processing';
|
|
72
|
-
this.resetSilenceTimer();
|
|
73
|
-
|
|
74
|
-
// Append caller utterance
|
|
75
|
-
this.conversationHistory.push({
|
|
76
|
-
role: 'user',
|
|
77
|
-
content: this.formatCallerUtterance(transcript, speaker),
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
await this.runLlm();
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Called when the user (in the chat UI) answers a pending question.
|
|
85
|
-
*/
|
|
86
|
-
async handleUserAnswer(answerText: string): Promise<boolean> {
|
|
87
|
-
if (this.state !== 'waiting_on_user') {
|
|
88
|
-
log.warn(
|
|
89
|
-
{ callSessionId: this.callSessionId, state: this.state },
|
|
90
|
-
'handleUserAnswer called but orchestrator is not in waiting_on_user state',
|
|
91
|
-
);
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Clear the consultation timeout
|
|
96
|
-
if (this.consultationTimer) {
|
|
97
|
-
clearTimeout(this.consultationTimer);
|
|
98
|
-
this.consultationTimer = null;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
this.state = 'processing';
|
|
102
|
-
updateCallSession(this.callSessionId, { status: 'in_progress' });
|
|
103
|
-
|
|
104
|
-
// Append the user's answer as a special message the model recognizes
|
|
105
|
-
this.conversationHistory.push({ role: 'user', content: `[USER_ANSWERED: ${answerText}]` });
|
|
106
|
-
|
|
107
|
-
// Fire-and-forget: unblock the caller so the HTTP response and answer
|
|
108
|
-
// persistence happen immediately, before LLM streaming begins.
|
|
109
|
-
this.runLlm().catch((err) =>
|
|
110
|
-
log.error({ err, callSessionId: this.callSessionId }, 'runLlm failed after user answer'),
|
|
111
|
-
);
|
|
112
|
-
return true;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Handle caller interrupting the assistant's speech.
|
|
117
|
-
*/
|
|
118
|
-
handleInterrupt(): void {
|
|
119
|
-
this.abortController.abort();
|
|
120
|
-
this.abortController = new AbortController();
|
|
121
|
-
this.state = 'idle';
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Tear down all timers and abort any in-flight work.
|
|
126
|
-
*/
|
|
127
|
-
destroy(): void {
|
|
128
|
-
if (this.silenceTimer) clearTimeout(this.silenceTimer);
|
|
129
|
-
if (this.durationTimer) clearTimeout(this.durationTimer);
|
|
130
|
-
if (this.durationWarningTimer) clearTimeout(this.durationWarningTimer);
|
|
131
|
-
if (this.consultationTimer) clearTimeout(this.consultationTimer);
|
|
132
|
-
if (this.durationEndTimer) { clearTimeout(this.durationEndTimer); this.durationEndTimer = null; }
|
|
133
|
-
this.abortController.abort();
|
|
134
|
-
unregisterCallOrchestrator(this.callSessionId);
|
|
135
|
-
log.info({ callSessionId: this.callSessionId }, 'CallOrchestrator destroyed');
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// ── Private ──────────────────────────────────────────────────────
|
|
139
|
-
|
|
140
|
-
private buildSystemPrompt(): string {
|
|
141
|
-
const config = getConfig();
|
|
142
|
-
const disclosureRule = config.calls.disclosure.enabled
|
|
143
|
-
? `1. ${config.calls.disclosure.text}`
|
|
144
|
-
: '1. Begin the conversation naturally.';
|
|
145
|
-
|
|
146
|
-
return [
|
|
147
|
-
'You are on a live phone call on behalf of your user.',
|
|
148
|
-
this.task ? `Task: ${this.task}` : '',
|
|
149
|
-
'',
|
|
150
|
-
'You are speaking directly to the person who answered the phone.',
|
|
151
|
-
'Respond naturally and conversationally — speak as you would in a real phone conversation.',
|
|
152
|
-
'',
|
|
153
|
-
'IMPORTANT RULES:',
|
|
154
|
-
disclosureRule,
|
|
155
|
-
'2. Be concise — phone conversations should be brief and natural.',
|
|
156
|
-
'3. If the callee asks something you don\'t know, include [ASK_USER: your question here] in your response along with a hold message like "Let me check on that for you."',
|
|
157
|
-
'4. If the callee provides information preceded by [USER_ANSWERED: ...], use that answer naturally in the conversation.',
|
|
158
|
-
'5. When the call\'s purpose is fulfilled, include [END_CALL] in your response along with a polite goodbye.',
|
|
159
|
-
'6. Do not make up information — ask the user if unsure.',
|
|
160
|
-
'7. Keep responses short — 1-3 sentences is ideal for phone conversation.',
|
|
161
|
-
'8. When caller text includes [SPEAKER id="..." label="..."], treat each speaker as a distinct person and personalize responses using that speaker\'s prior context in this call.',
|
|
162
|
-
]
|
|
163
|
-
.filter(Boolean)
|
|
164
|
-
.join('\n');
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
private formatCallerUtterance(transcript: string, speaker?: PromptSpeakerContext): string {
|
|
168
|
-
if (!speaker) return transcript;
|
|
169
|
-
const safeId = speaker.speakerId.replaceAll('"', '\'');
|
|
170
|
-
const safeLabel = speaker.speakerLabel.replaceAll('"', '\'');
|
|
171
|
-
const confidencePart = speaker.speakerConfidence !== null ? ` confidence="${speaker.speakerConfidence.toFixed(2)}"` : '';
|
|
172
|
-
return `[SPEAKER id="${safeId}" label="${safeLabel}" source="${speaker.source}"${confidencePart}] ${transcript}`;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Run the LLM with the current conversation history and stream
|
|
177
|
-
* the response back through the relay.
|
|
178
|
-
*/
|
|
179
|
-
private async runLlm(): Promise<void> {
|
|
180
|
-
const apiKey = getConfig().apiKeys.anthropic ?? process.env.ANTHROPIC_API_KEY;
|
|
181
|
-
if (!apiKey) {
|
|
182
|
-
log.error({ callSessionId: this.callSessionId }, 'No Anthropic API key available');
|
|
183
|
-
this.relay.sendTextToken('I\'m sorry, I\'m having a technical issue. Please try again later.', true);
|
|
184
|
-
this.state = 'idle';
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const client = new Anthropic({ apiKey });
|
|
189
|
-
|
|
190
|
-
try {
|
|
191
|
-
this.state = 'speaking';
|
|
192
|
-
|
|
193
|
-
const callModel = getConfig().calls.model?.trim() || 'claude-sonnet-4-20250514';
|
|
194
|
-
|
|
195
|
-
const stream = client.messages.stream(
|
|
196
|
-
{
|
|
197
|
-
model: callModel,
|
|
198
|
-
max_tokens: 512,
|
|
199
|
-
system: this.buildSystemPrompt(),
|
|
200
|
-
messages: this.conversationHistory.map((m) => ({
|
|
201
|
-
role: m.role,
|
|
202
|
-
content: m.content,
|
|
203
|
-
})),
|
|
204
|
-
},
|
|
205
|
-
{ signal: this.abortController.signal },
|
|
206
|
-
);
|
|
207
|
-
|
|
208
|
-
// Buffer incoming tokens so we can strip control markers ([ASK_USER:...], [END_CALL])
|
|
209
|
-
// before they reach TTS. We hold text whenever an unmatched '[' appears, since it
|
|
210
|
-
// could be the start of a control marker.
|
|
211
|
-
let ttsBuffer = '';
|
|
212
|
-
|
|
213
|
-
const flushSafeText = (_force: boolean): void => {
|
|
214
|
-
if (ttsBuffer.length === 0) return;
|
|
215
|
-
const bracketIdx = ttsBuffer.indexOf('[');
|
|
216
|
-
if (bracketIdx === -1) {
|
|
217
|
-
// No bracket at all — safe to flush everything
|
|
218
|
-
this.relay.sendTextToken(ttsBuffer, false);
|
|
219
|
-
ttsBuffer = '';
|
|
220
|
-
} else {
|
|
221
|
-
// Flush everything before the bracket
|
|
222
|
-
if (bracketIdx > 0) {
|
|
223
|
-
this.relay.sendTextToken(ttsBuffer.slice(0, bracketIdx), false);
|
|
224
|
-
ttsBuffer = ttsBuffer.slice(bracketIdx);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Only hold the buffer if the bracket text could be the start of a
|
|
228
|
-
// known control marker. Otherwise flush immediately so ordinary
|
|
229
|
-
// bracketed text (e.g. "[A]", "[note]") doesn't stall TTS.
|
|
230
|
-
//
|
|
231
|
-
// The check must be bidirectional:
|
|
232
|
-
// - When the buffer is shorter than the prefix (e.g. "[ASK"), the
|
|
233
|
-
// buffer is a prefix of the control tag → hold it.
|
|
234
|
-
// - When the buffer is longer than the prefix (e.g. "[ASK_USER: what"),
|
|
235
|
-
// the buffer starts with the control tag prefix → hold it (the
|
|
236
|
-
// variable-length payload hasn't been closed yet).
|
|
237
|
-
const afterBracket = ttsBuffer;
|
|
238
|
-
const couldBeControl =
|
|
239
|
-
'[ASK_USER:'.startsWith(afterBracket) ||
|
|
240
|
-
'[END_CALL]'.startsWith(afterBracket) ||
|
|
241
|
-
afterBracket.startsWith('[ASK_USER:') ||
|
|
242
|
-
afterBracket === '[END_CALL' ||
|
|
243
|
-
afterBracket.startsWith('[END_CALL]');
|
|
244
|
-
|
|
245
|
-
if (!couldBeControl) {
|
|
246
|
-
// Not a control marker prefix — flush up to the next '[' (if any)
|
|
247
|
-
// so we don't accidentally flush a later partial control marker.
|
|
248
|
-
const nextBracket = ttsBuffer.indexOf('[', 1);
|
|
249
|
-
if (nextBracket === -1) {
|
|
250
|
-
this.relay.sendTextToken(ttsBuffer, false);
|
|
251
|
-
ttsBuffer = '';
|
|
252
|
-
} else {
|
|
253
|
-
this.relay.sendTextToken(ttsBuffer.slice(0, nextBracket), false);
|
|
254
|
-
ttsBuffer = ttsBuffer.slice(nextBracket);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
// Otherwise hold it — might be a control marker still being streamed
|
|
258
|
-
}
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
stream.on('text', (text) => {
|
|
262
|
-
ttsBuffer += text;
|
|
263
|
-
|
|
264
|
-
// If the buffer contains a complete control marker, strip it
|
|
265
|
-
if (ASK_USER_REGEX.test(ttsBuffer)) {
|
|
266
|
-
ttsBuffer = ttsBuffer.replace(ASK_USER_REGEX, '');
|
|
267
|
-
}
|
|
268
|
-
if (ttsBuffer.includes(END_CALL_MARKER)) {
|
|
269
|
-
ttsBuffer = ttsBuffer.replace(END_CALL_MARKER, '');
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
flushSafeText(false);
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
const finalMessage = await stream.finalMessage();
|
|
276
|
-
|
|
277
|
-
// Final sweep: strip any remaining control markers from the buffer
|
|
278
|
-
ttsBuffer = ttsBuffer.replace(ASK_USER_REGEX, '').replace(END_CALL_MARKER, '');
|
|
279
|
-
if (ttsBuffer.length > 0) {
|
|
280
|
-
this.relay.sendTextToken(ttsBuffer, false);
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// Signal end of this turn's speech
|
|
284
|
-
this.relay.sendTextToken('', true);
|
|
285
|
-
|
|
286
|
-
const responseText =
|
|
287
|
-
finalMessage.content
|
|
288
|
-
.filter((b): b is Anthropic.TextBlock => b.type === 'text')
|
|
289
|
-
.map((b) => b.text)
|
|
290
|
-
.join('') || '';
|
|
291
|
-
|
|
292
|
-
// Record the assistant response
|
|
293
|
-
this.conversationHistory.push({ role: 'assistant', content: responseText });
|
|
294
|
-
recordCallEvent(this.callSessionId, 'assistant_spoke', { text: responseText });
|
|
295
|
-
const spokenText = responseText.replace(ASK_USER_REGEX, '').replace(END_CALL_MARKER, '').trim();
|
|
296
|
-
if (spokenText.length > 0) {
|
|
297
|
-
const session = getCallSession(this.callSessionId);
|
|
298
|
-
if (session) {
|
|
299
|
-
fireCallTranscriptNotifier(session.conversationId, this.callSessionId, 'assistant', spokenText);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// Check for ASK_USER pattern
|
|
304
|
-
const askMatch = responseText.match(ASK_USER_REGEX);
|
|
305
|
-
if (askMatch) {
|
|
306
|
-
const questionText = askMatch[1];
|
|
307
|
-
createPendingQuestion(this.callSessionId, questionText);
|
|
308
|
-
this.state = 'waiting_on_user';
|
|
309
|
-
updateCallSession(this.callSessionId, { status: 'waiting_on_user' });
|
|
310
|
-
recordCallEvent(this.callSessionId, 'user_question_asked', { question: questionText });
|
|
311
|
-
|
|
312
|
-
// Notify the conversation that a question was asked
|
|
313
|
-
const session = getCallSession(this.callSessionId);
|
|
314
|
-
if (session) {
|
|
315
|
-
fireCallQuestionNotifier(session.conversationId, this.callSessionId, questionText);
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// Set a consultation timeout
|
|
319
|
-
this.consultationTimer = setTimeout(() => {
|
|
320
|
-
if (this.state === 'waiting_on_user') {
|
|
321
|
-
log.info({ callSessionId: this.callSessionId }, 'User consultation timed out');
|
|
322
|
-
this.relay.sendTextToken(
|
|
323
|
-
'I\'m sorry, I wasn\'t able to get that information in time. Let me move on.',
|
|
324
|
-
true,
|
|
325
|
-
);
|
|
326
|
-
this.state = 'idle';
|
|
327
|
-
updateCallSession(this.callSessionId, { status: 'in_progress' });
|
|
328
|
-
expirePendingQuestions(this.callSessionId);
|
|
329
|
-
}
|
|
330
|
-
}, getUserConsultationTimeoutMs());
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// Check for END_CALL marker
|
|
335
|
-
if (responseText.includes(END_CALL_MARKER)) {
|
|
336
|
-
const currentSession = getCallSession(this.callSessionId);
|
|
337
|
-
const shouldNotifyCompletion = currentSession
|
|
338
|
-
? currentSession.status !== 'completed' && currentSession.status !== 'failed' && currentSession.status !== 'cancelled'
|
|
339
|
-
: false;
|
|
340
|
-
|
|
341
|
-
this.relay.endSession('Call completed');
|
|
342
|
-
updateCallSession(this.callSessionId, { status: 'completed', endedAt: Date.now() });
|
|
343
|
-
recordCallEvent(this.callSessionId, 'call_ended', { reason: 'completed' });
|
|
344
|
-
|
|
345
|
-
// Notify the conversation when this is the first transition
|
|
346
|
-
// into a terminal call state.
|
|
347
|
-
if (shouldNotifyCompletion && currentSession) {
|
|
348
|
-
fireCallCompletionNotifier(currentSession.conversationId, this.callSessionId);
|
|
349
|
-
}
|
|
350
|
-
this.state = 'idle';
|
|
351
|
-
return;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
// Normal turn complete
|
|
355
|
-
this.state = 'idle';
|
|
356
|
-
} catch (err: unknown) {
|
|
357
|
-
// Aborted requests are expected (interruptions, rapid utterances)
|
|
358
|
-
if (err instanceof Error && err.name === 'AbortError') {
|
|
359
|
-
log.debug({ callSessionId: this.callSessionId }, 'LLM request aborted');
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
|
-
log.error({ err, callSessionId: this.callSessionId }, 'LLM streaming error');
|
|
363
|
-
this.relay.sendTextToken('I\'m sorry, I encountered a technical issue. Could you repeat that?', true);
|
|
364
|
-
this.state = 'idle';
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
private startDurationTimer(): void {
|
|
369
|
-
const maxDurationMs = getMaxCallDurationMs();
|
|
370
|
-
const warningMs = maxDurationMs - 2 * 60 * 1000; // 2 minutes before max
|
|
371
|
-
|
|
372
|
-
if (warningMs > 0) {
|
|
373
|
-
this.durationWarningTimer = setTimeout(() => {
|
|
374
|
-
log.info({ callSessionId: this.callSessionId }, 'Call duration warning');
|
|
375
|
-
this.relay.sendTextToken(
|
|
376
|
-
'Just to let you know, we\'re running low on time for this call.',
|
|
377
|
-
true,
|
|
378
|
-
);
|
|
379
|
-
}, warningMs);
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
this.durationTimer = setTimeout(() => {
|
|
383
|
-
log.info({ callSessionId: this.callSessionId }, 'Call duration limit reached');
|
|
384
|
-
this.relay.sendTextToken(
|
|
385
|
-
'I\'m sorry, but we\'ve reached the maximum time for this call. Thank you for your time. Goodbye!',
|
|
386
|
-
true,
|
|
387
|
-
);
|
|
388
|
-
// Give TTS a moment to play, then end
|
|
389
|
-
this.durationEndTimer = setTimeout(() => {
|
|
390
|
-
const currentSession = getCallSession(this.callSessionId);
|
|
391
|
-
const shouldNotifyCompletion = currentSession
|
|
392
|
-
? currentSession.status !== 'completed' && currentSession.status !== 'failed' && currentSession.status !== 'cancelled'
|
|
393
|
-
: false;
|
|
394
|
-
|
|
395
|
-
this.relay.endSession('Maximum call duration reached');
|
|
396
|
-
updateCallSession(this.callSessionId, { status: 'completed', endedAt: Date.now() });
|
|
397
|
-
recordCallEvent(this.callSessionId, 'call_ended', { reason: 'max_duration' });
|
|
398
|
-
if (shouldNotifyCompletion && currentSession) {
|
|
399
|
-
fireCallCompletionNotifier(currentSession.conversationId, this.callSessionId);
|
|
400
|
-
}
|
|
401
|
-
}, 3000);
|
|
402
|
-
}, maxDurationMs);
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
private resetSilenceTimer(): void {
|
|
406
|
-
if (this.silenceTimer) clearTimeout(this.silenceTimer);
|
|
407
|
-
this.silenceTimer = setTimeout(() => {
|
|
408
|
-
log.info({ callSessionId: this.callSessionId }, 'Silence timeout triggered');
|
|
409
|
-
this.relay.sendTextToken('Are you still there?', true);
|
|
410
|
-
}, SILENCE_TIMEOUT_MS);
|
|
411
|
-
}
|
|
412
|
-
}
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Call recovery — reconciles in-flight calls on daemon restart.
|
|
3
|
-
*
|
|
4
|
-
* When the daemon restarts, any calls left in non-terminal states may be stale
|
|
5
|
-
* (the daemon crashed mid-call) or still active on the provider side. This
|
|
6
|
-
* module fetches the actual provider status and transitions each call
|
|
7
|
-
* accordingly.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { getLogger } from '../util/logger.js';
|
|
11
|
-
import { listRecoverableCalls, updateCallSession, expirePendingQuestions } from './call-store.js';
|
|
12
|
-
import type { VoiceProvider } from './voice-provider.js';
|
|
13
|
-
import type { CallStatus } from './types.js';
|
|
14
|
-
|
|
15
|
-
type Logger = ReturnType<typeof getLogger>;
|
|
16
|
-
|
|
17
|
-
const defaultLog = getLogger('call-recovery');
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Grace period (in ms) for no-SID sessions during startup recovery.
|
|
21
|
-
*
|
|
22
|
-
* A daemon crash can leave a live Twilio call without a persisted SID
|
|
23
|
-
* (crash after `initiateCall` succeeds but before the SID is written).
|
|
24
|
-
* Webhooks carrying the SID may still arrive after restart.
|
|
25
|
-
*
|
|
26
|
-
* Sessions younger than this threshold are annotated but left in their
|
|
27
|
-
* current non-terminal state so incoming webhooks can still deliver the
|
|
28
|
-
* SID and resume the call normally.
|
|
29
|
-
*
|
|
30
|
-
* Sessions older than this threshold are transitioned to `failed` to
|
|
31
|
-
* prevent orphan sessions from creating false "active call" state
|
|
32
|
-
* indefinitely. 5 minutes is long enough for any legitimate webhook
|
|
33
|
-
* to arrive; after that the session is considered abandoned.
|
|
34
|
-
*/
|
|
35
|
-
export const NO_SID_GRACE_PERIOD_MS = 5 * 60_000;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Map a Twilio provider status string to our internal CallStatus.
|
|
39
|
-
* Returns the mapped status or null if the status is unrecognised.
|
|
40
|
-
*/
|
|
41
|
-
function mapProviderStatus(providerStatus: string): CallStatus | null {
|
|
42
|
-
switch (providerStatus) {
|
|
43
|
-
case 'queued':
|
|
44
|
-
case 'ringing':
|
|
45
|
-
return 'ringing';
|
|
46
|
-
case 'in-progress':
|
|
47
|
-
return 'in_progress';
|
|
48
|
-
case 'completed':
|
|
49
|
-
return 'completed';
|
|
50
|
-
case 'failed':
|
|
51
|
-
case 'busy':
|
|
52
|
-
case 'no-answer':
|
|
53
|
-
case 'canceled':
|
|
54
|
-
return 'failed';
|
|
55
|
-
default:
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Check whether a CallStatus is terminal (no further transitions allowed).
|
|
62
|
-
*/
|
|
63
|
-
function isTerminal(status: CallStatus): boolean {
|
|
64
|
-
return status === 'completed' || status === 'failed' || status === 'cancelled';
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Reconcile all non-terminal call sessions at daemon startup.
|
|
69
|
-
*
|
|
70
|
-
* For each recoverable call:
|
|
71
|
-
* - If it has a provider SID, fetch the current status from the provider
|
|
72
|
-
* and transition the call to match.
|
|
73
|
-
* - If no provider SID exists and the session is older than the grace
|
|
74
|
-
* period, transition it to `failed` to prevent orphan sessions from
|
|
75
|
-
* creating false "active call" state indefinitely.
|
|
76
|
-
* - If no provider SID exists but the session is within the grace period,
|
|
77
|
-
* leave it non-terminal so webhooks can still deliver the SID.
|
|
78
|
-
* - If the call transitions to a terminal state, expire any pending questions.
|
|
79
|
-
*/
|
|
80
|
-
export async function reconcileCallsOnStartup(
|
|
81
|
-
provider: VoiceProvider,
|
|
82
|
-
log: Logger = defaultLog,
|
|
83
|
-
): Promise<void> {
|
|
84
|
-
const recoverableCalls = listRecoverableCalls();
|
|
85
|
-
|
|
86
|
-
if (recoverableCalls.length === 0) {
|
|
87
|
-
log.info('No recoverable calls found at startup');
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
log.info({ count: recoverableCalls.length }, 'Reconciling non-terminal calls at startup');
|
|
92
|
-
|
|
93
|
-
for (const session of recoverableCalls) {
|
|
94
|
-
try {
|
|
95
|
-
if (!session.providerCallSid) {
|
|
96
|
-
const sessionAgeMs = Date.now() - session.createdAt;
|
|
97
|
-
const isStale = sessionAgeMs >= NO_SID_GRACE_PERIOD_MS;
|
|
98
|
-
|
|
99
|
-
if (isStale) {
|
|
100
|
-
// Session is old enough that any legitimate webhook should
|
|
101
|
-
// have arrived by now. Transition to `failed` so it no
|
|
102
|
-
// longer appears as an active call.
|
|
103
|
-
log.info(
|
|
104
|
-
{ callSessionId: session.id, previousStatus: session.status, sessionAgeMs },
|
|
105
|
-
'No-SID session past grace period — failing orphan session',
|
|
106
|
-
);
|
|
107
|
-
updateCallSession(session.id, {
|
|
108
|
-
status: 'failed',
|
|
109
|
-
endedAt: Date.now(),
|
|
110
|
-
lastError: 'Daemon restarted before provider SID persisted; grace period expired — orphan session failed',
|
|
111
|
-
});
|
|
112
|
-
expirePendingQuestions(session.id);
|
|
113
|
-
} else {
|
|
114
|
-
// Recent session — webhooks carrying the SID may still arrive.
|
|
115
|
-
// Leave in its current non-terminal state.
|
|
116
|
-
log.info(
|
|
117
|
-
{ callSessionId: session.id, previousStatus: session.status, sessionAgeMs },
|
|
118
|
-
'Skipping recent no-SID session (within grace period, webhooks may still arrive)',
|
|
119
|
-
);
|
|
120
|
-
updateCallSession(session.id, {
|
|
121
|
-
lastError: 'Daemon restarted before provider SID persisted; awaiting webhook',
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
continue;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Fetch actual status from provider
|
|
128
|
-
let providerStatus: string;
|
|
129
|
-
try {
|
|
130
|
-
providerStatus = await provider.getCallStatus(session.providerCallSid);
|
|
131
|
-
} catch (err) {
|
|
132
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
133
|
-
log.warn(
|
|
134
|
-
{ callSessionId: session.id, callSid: session.providerCallSid, err },
|
|
135
|
-
'Failed to fetch provider status during recovery — failing call',
|
|
136
|
-
);
|
|
137
|
-
updateCallSession(session.id, {
|
|
138
|
-
status: 'failed',
|
|
139
|
-
endedAt: Date.now(),
|
|
140
|
-
lastError: `Recovery: failed to fetch provider status: ${msg}`,
|
|
141
|
-
});
|
|
142
|
-
expirePendingQuestions(session.id);
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const mappedStatus = mapProviderStatus(providerStatus);
|
|
147
|
-
|
|
148
|
-
if (!mappedStatus) {
|
|
149
|
-
log.warn(
|
|
150
|
-
{ callSessionId: session.id, providerStatus },
|
|
151
|
-
'Unrecognised provider status during recovery — failing call',
|
|
152
|
-
);
|
|
153
|
-
updateCallSession(session.id, {
|
|
154
|
-
status: 'failed',
|
|
155
|
-
endedAt: Date.now(),
|
|
156
|
-
lastError: `Recovery: unrecognised provider status '${providerStatus}'`,
|
|
157
|
-
});
|
|
158
|
-
expirePendingQuestions(session.id);
|
|
159
|
-
continue;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (isTerminal(mappedStatus)) {
|
|
163
|
-
// Provider says the call has ended
|
|
164
|
-
log.info(
|
|
165
|
-
{ callSessionId: session.id, providerStatus, mappedStatus },
|
|
166
|
-
'Provider reports call ended — transitioning to terminal state',
|
|
167
|
-
);
|
|
168
|
-
updateCallSession(session.id, {
|
|
169
|
-
status: mappedStatus,
|
|
170
|
-
endedAt: Date.now(),
|
|
171
|
-
});
|
|
172
|
-
expirePendingQuestions(session.id);
|
|
173
|
-
} else {
|
|
174
|
-
// Provider says call is still active — leave it for webhooks to handle
|
|
175
|
-
log.info(
|
|
176
|
-
{ callSessionId: session.id, providerStatus, mappedStatus },
|
|
177
|
-
'Provider reports call still active — leaving for webhook handling',
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
} catch (err) {
|
|
181
|
-
log.error(
|
|
182
|
-
{ callSessionId: session.id, err },
|
|
183
|
-
'Unexpected error during call recovery',
|
|
184
|
-
);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
log.info('Call recovery reconciliation complete');
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Log a dead-letter provider event — a provider callback payload that
|
|
193
|
-
* could not be processed (malformed, unknown format, etc.).
|
|
194
|
-
*
|
|
195
|
-
* Rather than silently dropping these events, we log the full payload
|
|
196
|
-
* so operators can investigate later.
|
|
197
|
-
*/
|
|
198
|
-
export function logDeadLetterEvent(
|
|
199
|
-
reason: string,
|
|
200
|
-
payload: unknown,
|
|
201
|
-
log: Logger = defaultLog,
|
|
202
|
-
): void {
|
|
203
|
-
log.error(
|
|
204
|
-
{ reason, payload },
|
|
205
|
-
'Dead-letter provider event: callback could not be processed',
|
|
206
|
-
);
|
|
207
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Call state machine — defines allowed status transitions and validates
|
|
3
|
-
* all state changes in a single place.
|
|
4
|
-
*
|
|
5
|
-
* Terminal states (completed, failed, cancelled) are immutable: no further
|
|
6
|
-
* transitions are permitted once a call reaches one of these states.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { CallStatus } from './types.js';
|
|
10
|
-
|
|
11
|
-
// ── Transition table ─────────────────────────────────────────────────
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Maps each call status to the set of statuses it may transition to.
|
|
15
|
-
* Terminal states map to an empty set.
|
|
16
|
-
*/
|
|
17
|
-
const ALLOWED_TRANSITIONS: Record<CallStatus, Set<CallStatus>> = {
|
|
18
|
-
initiated: new Set<CallStatus>(['ringing', 'in_progress', 'waiting_on_user', 'completed', 'failed', 'cancelled']),
|
|
19
|
-
ringing: new Set<CallStatus>(['in_progress', 'waiting_on_user', 'completed', 'failed', 'cancelled']),
|
|
20
|
-
in_progress: new Set<CallStatus>(['waiting_on_user', 'completed', 'failed', 'cancelled']),
|
|
21
|
-
waiting_on_user: new Set<CallStatus>(['in_progress', 'completed', 'failed', 'cancelled']),
|
|
22
|
-
// Terminal states — no further transitions allowed
|
|
23
|
-
completed: new Set<CallStatus>(),
|
|
24
|
-
failed: new Set<CallStatus>(),
|
|
25
|
-
cancelled: new Set<CallStatus>(),
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const TERMINAL_STATES: Set<CallStatus> = new Set(['completed', 'failed', 'cancelled']);
|
|
29
|
-
|
|
30
|
-
// ── Public API ───────────────────────────────────────────────────────
|
|
31
|
-
|
|
32
|
-
export interface TransitionResult {
|
|
33
|
-
valid: boolean;
|
|
34
|
-
reason?: string;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Check whether a transition from `current` to `next` is allowed.
|
|
39
|
-
*/
|
|
40
|
-
export function validateTransition(current: CallStatus, next: CallStatus): TransitionResult {
|
|
41
|
-
if (current === next) {
|
|
42
|
-
return { valid: true };
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (isTerminalState(current)) {
|
|
46
|
-
return {
|
|
47
|
-
valid: false,
|
|
48
|
-
reason: `Cannot transition from terminal state '${current}'`,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const allowed = ALLOWED_TRANSITIONS[current];
|
|
53
|
-
if (!allowed || !allowed.has(next)) {
|
|
54
|
-
return {
|
|
55
|
-
valid: false,
|
|
56
|
-
reason: `Invalid transition from '${current}' to '${next}'`,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return { valid: true };
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Returns true if the given status is a terminal (immutable) state.
|
|
65
|
-
*/
|
|
66
|
-
export function isTerminalState(status: CallStatus): boolean {
|
|
67
|
-
return TERMINAL_STATES.has(status);
|
|
68
|
-
}
|