@vellumai/assistant 0.3.5 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/eslint.config.mjs +31 -0
- package/package.json +1 -1
- package/scripts/ipc/check-swift-decoder-drift.ts +4 -1
- package/scripts/ipc/generate-swift.ts +18 -2
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +338 -1
- package/src/__tests__/approval-conversation-turn.test.ts +214 -0
- package/src/__tests__/browser-manager.test.ts +1 -0
- package/src/__tests__/call-conversation-messages.test.ts +130 -0
- package/src/__tests__/call-orchestrator.test.ts +752 -271
- package/src/__tests__/call-pointer-messages.test.ts +148 -0
- package/src/__tests__/call-recovery.test.ts +3 -0
- package/src/__tests__/call-routes-http.test.ts +5 -0
- package/src/__tests__/call-store.test.ts +3 -0
- package/src/__tests__/channel-approval-routes.test.ts +1260 -85
- package/src/__tests__/channel-approval.test.ts +37 -0
- package/src/__tests__/channel-approvals.test.ts +4 -65
- package/src/__tests__/channel-guardian.test.ts +556 -0
- package/src/__tests__/channel-readiness-service.test.ts +74 -7
- package/src/__tests__/checker.test.ts +14 -7
- package/src/__tests__/clarification-resolver.test.ts +44 -24
- package/src/__tests__/commit-message-enrichment-service.test.ts +9 -4
- package/src/__tests__/computer-use-session-working-dir.test.ts +8 -0
- package/src/__tests__/config-schema.test.ts +12 -7
- package/src/__tests__/context-window-manager.test.ts +30 -2
- package/src/__tests__/contradiction-checker.test.ts +20 -5
- package/src/__tests__/credential-security-invariants.test.ts +6 -2
- package/src/__tests__/db-migration-rollback.test.ts +752 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -0
- package/src/__tests__/fuzzy-match-property.test.ts +5 -5
- package/src/__tests__/guardian-action-store.test.ts +123 -0
- package/src/__tests__/guardian-action-sweep.test.ts +277 -0
- package/src/__tests__/guardian-dispatch.test.ts +389 -0
- package/src/__tests__/guardian-question-copy.test.ts +47 -0
- package/src/__tests__/handlers-telegram-config.test.ts +4 -2
- package/src/__tests__/handlers-twilio-config.test.ts +126 -0
- package/src/__tests__/intent-routing.test.ts +2 -0
- package/src/__tests__/ipc-snapshot.test.ts +228 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +828 -0
- package/src/__tests__/model-intents.test.ts +96 -0
- package/src/__tests__/no-direct-anthropic-sdk-imports.test.ts +42 -0
- package/src/__tests__/oauth2-gateway-transport.test.ts +130 -0
- package/src/__tests__/onboarding-starter-tasks.test.ts +2 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +89 -13
- package/src/__tests__/provider-error-scenarios.test.ts +621 -0
- package/src/__tests__/provider-fail-open-selection.test.ts +119 -0
- package/src/__tests__/qdrant-manager.test.ts +27 -20
- package/src/__tests__/relay-server.test.ts +779 -40
- package/src/__tests__/run-orchestrator-assistant-events.test.ts +2 -0
- package/src/__tests__/run-orchestrator.test.ts +20 -4
- package/src/__tests__/runtime-runs-http.test.ts +17 -1
- package/src/__tests__/runtime-runs.test.ts +16 -0
- package/src/__tests__/schedule-store.test.ts +18 -4
- package/src/__tests__/scheduler-recurrence.test.ts +13 -4
- package/src/__tests__/session-abort-tool-results.test.ts +6 -0
- package/src/__tests__/session-agent-loop.test.ts +857 -0
- package/src/__tests__/session-conflict-gate.test.ts +6 -0
- package/src/__tests__/session-pre-run-repair.test.ts +6 -0
- package/src/__tests__/session-profile-injection.test.ts +6 -0
- package/src/__tests__/session-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/session-queue.test.ts +6 -0
- package/src/__tests__/session-runtime-assembly.test.ts +237 -13
- package/src/__tests__/session-slash-known.test.ts +6 -0
- package/src/__tests__/session-slash-queue.test.ts +6 -0
- package/src/__tests__/session-slash-unknown.test.ts +6 -0
- package/src/__tests__/session-surfaces-task-progress.test.ts +2 -0
- package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -0
- package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -0
- package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -0
- package/src/__tests__/session-workspace-injection.test.ts +6 -0
- package/src/__tests__/session-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/skills.test.ts +2 -0
- package/src/__tests__/sms-messaging-provider.test.ts +2 -1
- package/src/__tests__/starter-task-flow.test.ts +2 -0
- package/src/__tests__/swarm-dag-pathological.test.ts +535 -0
- package/src/__tests__/system-prompt.test.ts +2 -0
- package/src/__tests__/task-management-tools.test.ts +2 -2
- package/src/__tests__/task-runner.test.ts +14 -4
- package/src/__tests__/terminal-tools.test.ts +25 -19
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +545 -0
- package/src/__tests__/tool-executor-shell-integration.test.ts +11 -11
- package/src/__tests__/tool-executor.test.ts +23 -24
- package/src/__tests__/trust-store.test.ts +3 -3
- package/src/__tests__/twilio-rest.test.ts +29 -0
- package/src/__tests__/twilio-routes-elevenlabs.test.ts +3 -0
- package/src/__tests__/twilio-routes-twiml.test.ts +11 -0
- package/src/__tests__/twilio-routes.test.ts +141 -21
- package/src/__tests__/user-reference.test.ts +2 -0
- package/src/__tests__/voice-quality.test.ts +222 -0
- package/src/__tests__/web-search.test.ts +45 -29
- package/src/agent/loop.ts +1 -1
- package/src/agent-heartbeat/agent-heartbeat-service.ts +2 -10
- package/src/amazon/client.ts +1418 -0
- package/src/amazon/request-extractor.ts +135 -0
- package/src/amazon/session.ts +109 -0
- package/src/autonomy/autonomy-store.ts +5 -5
- package/src/browser-extension-relay/client.ts +124 -0
- package/src/browser-extension-relay/protocol.ts +63 -0
- package/src/browser-extension-relay/server.ts +177 -0
- package/src/bundler/app-bundler.ts +3 -3
- package/src/bundler/bundle-signer.ts +1 -1
- package/src/bundler/signature-verifier.ts +1 -1
- package/src/calls/call-conversation-messages.ts +33 -0
- package/src/calls/call-domain.ts +106 -5
- package/src/calls/call-orchestrator.ts +252 -54
- package/src/calls/call-pointer-messages.ts +53 -0
- package/src/calls/call-recovery.ts +3 -8
- package/src/calls/call-store.ts +69 -87
- package/src/calls/elevenlabs-config.ts +3 -2
- package/src/calls/guardian-action-sweep.ts +105 -0
- package/src/calls/guardian-dispatch.ts +203 -0
- package/src/calls/guardian-question-copy.ts +133 -0
- package/src/calls/relay-server.ts +466 -8
- package/src/calls/speaker-identification.ts +1 -1
- package/src/calls/twilio-config.ts +7 -5
- package/src/calls/twilio-provider.ts +6 -4
- package/src/calls/twilio-rest.ts +40 -15
- package/src/calls/twilio-routes.ts +60 -45
- package/src/calls/types.ts +3 -1
- package/src/channels/types.ts +25 -0
- package/src/cli/amazon.ts +815 -0
- package/src/cli/config-commands.ts +2 -2
- package/src/cli/core-commands.ts +4 -3
- package/src/cli/influencer.ts +244 -0
- package/src/cli/map.ts +89 -6
- package/src/cli.ts +1 -1
- package/src/config/agent-schema.ts +171 -0
- package/src/config/bundled-skills/amazon/SKILL.md +127 -0
- package/src/config/bundled-skills/amazon/icon.svg +13 -0
- package/src/config/bundled-skills/api-mapping/SKILL.md +78 -0
- package/src/config/bundled-skills/browser/SKILL.md +1 -0
- package/src/config/bundled-skills/browser/TOOLS.json +17 -0
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +25 -0
- package/src/config/bundled-skills/doordash/SKILL.md +51 -51
- package/src/config/bundled-skills/email-setup/SKILL.md +14 -5
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +183 -0
- package/src/config/bundled-skills/influencer/SKILL.md +144 -0
- package/src/config/bundled-skills/macos-automation/icon.svg +12 -0
- package/src/config/bundled-skills/media-processing/SKILL.md +72 -95
- package/src/config/bundled-skills/media-processing/TOOLS.json +57 -147
- package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +77 -0
- package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +69 -0
- package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +303 -0
- package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +55 -0
- package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +86 -0
- package/src/config/bundled-skills/media-processing/services/gemini-map.ts +339 -0
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +551 -0
- package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +7 -9
- package/src/config/bundled-skills/media-processing/services/reduce.ts +197 -0
- package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +88 -253
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +22 -153
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +28 -51
- package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +35 -270
- package/src/config/bundled-skills/messaging/SKILL.md +12 -2
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -7
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +2 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +86 -21
- package/src/config/bundled-skills/twitter/icon.svg +14 -0
- package/src/config/bundled-tool-registry.ts +310 -0
- package/src/config/calls-schema.ts +181 -0
- package/src/config/core-schema.ts +309 -0
- package/src/config/defaults.ts +27 -3
- package/src/config/env-registry.ts +169 -0
- package/src/config/env.ts +175 -0
- package/src/config/loader.ts +6 -6
- package/src/config/memory-schema.ts +528 -0
- package/src/config/sandbox-schema.ts +55 -0
- package/src/config/schema.ts +157 -1138
- package/src/config/skill-state.ts +1 -1
- package/src/config/skills-schema.ts +32 -0
- package/src/config/skills.ts +35 -24
- package/src/config/system-prompt.ts +107 -56
- package/src/config/templates/SOUL.md +1 -1
- package/src/config/types.ts +1 -0
- package/src/config/user-reference.ts +4 -9
- package/src/config/vellum-skills/catalog.json +0 -7
- package/src/config/vellum-skills/chatgpt-import/tools/chatgpt-import.ts +5 -1
- package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +1 -0
- package/src/config/vellum-skills/sms-setup/SKILL.md +112 -14
- package/src/context/window-manager.ts +27 -7
- package/src/daemon/approval-generators.ts +186 -0
- package/src/daemon/approved-devices-store.ts +140 -0
- package/src/daemon/assistant-attachments.ts +1 -1
- package/src/daemon/classifier.ts +35 -32
- package/src/daemon/config-watcher.ts +1 -1
- package/src/daemon/daemon-control.ts +254 -0
- package/src/daemon/handlers/apps.ts +2 -3
- package/src/daemon/handlers/config-channels.ts +158 -0
- package/src/daemon/handlers/config-inbox.ts +540 -0
- package/src/daemon/handlers/config-ingress.ts +231 -0
- package/src/daemon/handlers/config-integrations.ts +258 -0
- package/src/daemon/handlers/config-model.ts +143 -0
- package/src/daemon/handlers/config-parental.ts +163 -0
- package/src/daemon/handlers/config-scheduling.ts +172 -0
- package/src/daemon/handlers/config-slack.ts +92 -0
- package/src/daemon/handlers/config-telegram.ts +301 -0
- package/src/daemon/handlers/config-tools.ts +177 -0
- package/src/daemon/handlers/config-trust.ts +104 -0
- package/src/daemon/handlers/config-twilio.ts +1080 -0
- package/src/daemon/handlers/config.ts +53 -2463
- package/src/daemon/handlers/diagnostics.ts +1 -1
- package/src/daemon/handlers/dictation.ts +4 -6
- package/src/daemon/handlers/documents.ts +18 -32
- package/src/daemon/handlers/index.ts +9 -0
- package/src/daemon/handlers/misc.ts +3 -5
- package/src/daemon/handlers/pairing.ts +98 -0
- package/src/daemon/handlers/sessions.ts +74 -5
- package/src/daemon/handlers/shared.ts +3 -1
- package/src/daemon/handlers/skills.ts +1 -1
- package/src/daemon/handlers/twitter-auth.ts +2 -0
- package/src/daemon/handlers/work-items.ts +2 -2
- package/src/daemon/handlers/workspace-files.ts +4 -3
- package/src/daemon/install-cli-launchers.ts +113 -0
- package/src/daemon/ipc-contract/apps.ts +356 -0
- package/src/daemon/ipc-contract/browser.ts +74 -0
- package/src/daemon/ipc-contract/computer-use.ts +151 -0
- package/src/daemon/ipc-contract/diagnostics.ts +56 -0
- package/src/daemon/ipc-contract/documents.ts +74 -0
- package/src/daemon/ipc-contract/inbox.ts +209 -0
- package/src/daemon/ipc-contract/integrations.ts +284 -0
- package/src/daemon/ipc-contract/memory.ts +48 -0
- package/src/daemon/ipc-contract/messages.ts +211 -0
- package/src/daemon/ipc-contract/pairing.ts +45 -0
- package/src/daemon/ipc-contract/parental-control.ts +95 -0
- package/src/daemon/ipc-contract/schedules.ts +97 -0
- package/src/daemon/ipc-contract/sessions.ts +321 -0
- package/src/daemon/ipc-contract/shared.ts +42 -0
- package/src/daemon/ipc-contract/skills.ts +120 -0
- package/src/daemon/ipc-contract/subagents.ts +58 -0
- package/src/daemon/ipc-contract/surfaces.ts +250 -0
- package/src/daemon/ipc-contract/trust.ts +60 -0
- package/src/daemon/ipc-contract/work-items.ts +225 -0
- package/src/daemon/ipc-contract/workspace.ts +113 -0
- package/src/daemon/ipc-contract-inventory.json +62 -0
- package/src/daemon/ipc-contract-inventory.ts +55 -29
- package/src/daemon/ipc-contract.ts +227 -2527
- package/src/daemon/ipc-protocol.ts +1 -1
- package/src/daemon/ipc-validate.ts +7 -0
- package/src/daemon/lifecycle.ts +97 -379
- package/src/daemon/pairing-store.ts +177 -0
- package/src/daemon/providers-setup.ts +43 -0
- package/src/daemon/ride-shotgun-handler.ts +67 -2
- package/src/daemon/server.ts +60 -44
- package/src/daemon/session-agent-loop-handlers.ts +421 -0
- package/src/daemon/session-agent-loop.ts +113 -275
- package/src/daemon/session-dynamic-profile.ts +1 -1
- package/src/daemon/session-history.ts +1 -1
- package/src/daemon/session-media-retry.ts +1 -1
- package/src/daemon/session-messaging.ts +37 -2
- package/src/daemon/session-notifiers.ts +5 -25
- package/src/daemon/session-process.ts +99 -59
- package/src/daemon/session-queue-manager.ts +98 -4
- package/src/daemon/session-runtime-assembly.ts +149 -15
- package/src/daemon/session-surfaces.ts +26 -4
- package/src/daemon/session-tool-setup.ts +28 -30
- package/src/daemon/session-workspace.ts +1 -1
- package/src/daemon/session.ts +24 -1
- package/src/daemon/shutdown-handlers.ts +122 -0
- package/src/daemon/trace-emitter.ts +1 -1
- package/src/daemon/watch-handler.ts +36 -33
- package/src/doordash/cart-queries.ts +787 -0
- package/src/doordash/client.ts +144 -127
- package/src/doordash/order-queries.ts +85 -0
- package/src/doordash/queries.ts +10 -1308
- package/src/doordash/search-queries.ts +203 -0
- package/src/doordash/session.ts +3 -2
- package/src/doordash/store-queries.ts +246 -0
- package/src/doordash/types.ts +367 -0
- package/src/email/providers/agentmail.ts +2 -1
- package/src/email/providers/index.ts +3 -2
- package/src/email/service.ts +3 -2
- package/src/errors.ts +43 -0
- package/src/home-base/prebuilt/seed.ts +1 -1
- package/src/hooks/cli.ts +6 -5
- package/src/hooks/config.ts +6 -8
- package/src/hooks/discovery.ts +6 -5
- package/src/hooks/manager.ts +4 -3
- package/src/hooks/runner.ts +2 -2
- package/src/hooks/templates.ts +5 -5
- package/src/inbound/public-ingress-urls.ts +3 -1
- package/src/index.ts +4 -2
- package/src/influencer/client.ts +1104 -0
- package/src/instrument.ts +4 -3
- package/src/logfire.ts +4 -3
- package/src/memory/admin.ts +25 -35
- package/src/memory/attachments-store.ts +4 -7
- package/src/memory/channel-delivery-store.ts +30 -1
- package/src/memory/channel-guardian-store.ts +200 -1
- package/src/memory/clarification-resolver.ts +37 -33
- package/src/memory/conflict-store.ts +67 -61
- package/src/memory/contradiction-checker.ts +141 -117
- package/src/memory/conversation-store.ts +335 -51
- package/src/memory/db-connection.ts +27 -4
- package/src/memory/db-init.ts +121 -4
- package/src/memory/db.ts +14 -1
- package/src/memory/embedding-backend.ts +27 -5
- package/src/memory/embedding-ollama.ts +2 -1
- package/src/memory/entity-extractor.ts +38 -35
- package/src/memory/guardian-action-store.ts +430 -0
- package/src/memory/inbox-escalation-projection.ts +59 -0
- package/src/memory/inbox-thread-store.ts +218 -0
- package/src/memory/ingress-invite-store.ts +338 -0
- package/src/memory/ingress-member-store.ts +350 -0
- package/src/memory/items-extractor.ts +91 -97
- package/src/memory/job-handlers/index-maintenance.ts +3 -3
- package/src/memory/job-handlers/media-processing.ts +11 -42
- package/src/memory/job-handlers/summarization.ts +32 -26
- package/src/memory/job-utils.ts +3 -10
- package/src/memory/jobs-store.ts +6 -9
- package/src/memory/jobs-worker.ts +51 -36
- package/src/memory/migrations/001-job-deferrals.ts +45 -0
- package/src/memory/migrations/002-tool-invocations-fk.ts +43 -0
- package/src/memory/migrations/003-memory-fts-backfill.ts +24 -0
- package/src/memory/migrations/004-entity-relation-dedup.ts +87 -0
- package/src/memory/migrations/005-fingerprint-scope-unique.ts +80 -0
- package/src/memory/migrations/006-scope-salted-fingerprints.ts +62 -0
- package/src/memory/migrations/007-assistant-id-to-self.ts +254 -0
- package/src/memory/migrations/008-remove-assistant-id-columns.ts +208 -0
- package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +83 -0
- package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +56 -0
- package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +63 -0
- package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +19 -0
- package/src/memory/migrations/013-guardian-action-tables.ts +68 -0
- package/src/memory/migrations/014-backfill-inbox-thread-state.ts +76 -0
- package/src/memory/migrations/015-drop-active-search-index.ts +27 -0
- package/src/memory/migrations/016-memory-segments-indexes.ts +11 -0
- package/src/memory/migrations/017-memory-items-indexes.ts +12 -0
- package/src/memory/migrations/018-remaining-table-indexes.ts +13 -0
- package/src/memory/migrations/index.ts +24 -0
- package/src/memory/migrations/registry.ts +79 -0
- package/src/memory/migrations/validate-migration-state.ts +69 -0
- package/src/memory/qdrant-manager.ts +49 -8
- package/src/memory/query-builder.ts +1 -1
- package/src/memory/raw-query.ts +119 -0
- package/src/memory/recall-cache.ts +4 -1
- package/src/memory/retriever.ts +163 -47
- package/src/memory/schema-migration.ts +25 -984
- package/src/memory/schema.ts +130 -7
- package/src/memory/search/entity.ts +10 -19
- package/src/memory/search/lexical.ts +81 -52
- package/src/memory/search/ranking.ts +21 -22
- package/src/memory/search/semantic.ts +157 -19
- package/src/memory/shared-app-links-store.ts +4 -5
- package/src/memory/validation.ts +19 -0
- package/src/messaging/draft-store.ts +5 -6
- package/src/messaging/providers/sms/adapter.ts +3 -6
- package/src/messaging/providers/telegram-bot/adapter.ts +2 -5
- package/src/messaging/providers/whatsapp/adapter.ts +136 -0
- package/src/messaging/providers/whatsapp/client.ts +67 -0
- package/src/messaging/style-analyzer.ts +5 -4
- package/src/messaging/thread-summarizer.ts +61 -69
- package/src/messaging/triage-engine.ts +62 -71
- package/src/migrations/config-merge.ts +53 -0
- package/src/migrations/data-layout.ts +68 -0
- package/src/migrations/data-merge.ts +33 -0
- package/src/migrations/hooks-merge.ts +90 -0
- package/src/migrations/index.ts +6 -0
- package/src/migrations/log.ts +23 -0
- package/src/migrations/skills-merge.ts +33 -0
- package/src/migrations/workspace-layout.ts +79 -0
- package/src/permissions/checker.ts +126 -11
- package/src/permissions/prompter.ts +14 -0
- package/src/permissions/shell-identity.ts +31 -1
- package/src/permissions/trust-store.ts +21 -1
- package/src/providers/anthropic/client.ts +4 -4
- package/src/providers/failover.ts +2 -2
- package/src/providers/model-intents.ts +70 -0
- package/src/providers/ollama/client.ts +2 -1
- package/src/providers/provider-send-message.ts +176 -0
- package/src/providers/registry.ts +71 -30
- package/src/providers/retry.ts +35 -1
- package/src/providers/types.ts +12 -1
- package/src/runtime/approval-conversation-turn.ts +97 -0
- package/src/runtime/approval-message-composer.ts +115 -5
- package/src/runtime/assistant-event-hub.ts +3 -1
- package/src/runtime/channel-approval-parser.ts +36 -2
- package/src/runtime/channel-approvals.ts +0 -21
- package/src/runtime/channel-guardian-service.ts +48 -7
- package/src/runtime/channel-readiness-service.ts +160 -34
- package/src/runtime/channel-readiness-types.ts +10 -4
- package/src/runtime/channel-retry-sweep.ts +184 -0
- package/src/runtime/guardian-context-resolver.ts +108 -0
- package/src/runtime/http-server.ts +289 -745
- package/src/runtime/http-types.ts +56 -3
- package/src/runtime/middleware/auth.ts +116 -0
- package/src/runtime/middleware/error-handler.ts +33 -0
- package/src/runtime/middleware/twilio-validation.ts +127 -0
- package/src/runtime/routes/app-routes.ts +1 -1
- package/src/runtime/routes/call-routes.ts +49 -6
- package/src/runtime/routes/channel-delivery-routes.ts +170 -0
- package/src/runtime/routes/channel-guardian-routes.ts +1191 -0
- package/src/runtime/routes/channel-inbound-routes.ts +1152 -0
- package/src/runtime/routes/channel-route-shared.ts +144 -0
- package/src/runtime/routes/channel-routes.ts +32 -1634
- package/src/runtime/routes/conversation-routes.ts +50 -7
- package/src/runtime/routes/events-routes.ts +2 -2
- package/src/runtime/routes/identity-routes.ts +126 -0
- package/src/runtime/routes/pairing-routes.ts +144 -0
- package/src/runtime/routes/run-routes.ts +15 -1
- package/src/runtime/run-orchestrator.ts +52 -34
- package/src/schedule/schedule-store.ts +36 -32
- package/src/schedule/scheduler.ts +3 -3
- package/src/security/encrypted-store.ts +5 -7
- package/src/security/oauth2.ts +45 -15
- package/src/security/parental-control-store.ts +183 -0
- package/src/security/secret-allowlist.ts +4 -3
- package/src/security/secret-scanner.ts +5 -5
- package/src/security/secure-keys.ts +1 -1
- package/src/security/token-manager.ts +3 -2
- package/src/services/vercel-deploy.ts +6 -2
- package/src/skills/tool-manifest.ts +3 -3
- package/src/skills/vellum-catalog-remote.ts +75 -16
- package/src/slack/slack-webhook.ts +2 -1
- package/src/swarm/orchestrator.ts +92 -1
- package/src/swarm/router-planner.ts +6 -9
- package/src/swarm/worker-prompts.ts +9 -12
- package/src/tasks/task-compiler.ts +19 -28
- package/src/tasks/task-runner.ts +1 -1
- package/src/tools/assets/search.ts +15 -14
- package/src/tools/browser/__tests__/auth-detector.test.ts +1 -0
- package/src/tools/browser/auto-navigate.ts +1 -0
- package/src/tools/browser/browser-execution.ts +13 -1
- package/src/tools/browser/browser-manager.ts +119 -4
- package/src/tools/browser/network-recorder.ts +5 -0
- package/src/tools/credentials/broker.ts +11 -2
- package/src/tools/credentials/metadata-store.ts +18 -14
- package/src/tools/credentials/post-connect-hooks.ts +61 -0
- package/src/tools/credentials/vault.ts +49 -23
- package/src/tools/executor.ts +80 -18
- package/src/tools/host-terminal/cli-discover.ts +1 -1
- package/src/tools/network/script-proxy/http-forwarder.ts +1 -1
- package/src/tools/network/script-proxy/mitm-handler.ts +1 -1
- package/src/tools/network/script-proxy/server.ts +1 -1
- package/src/tools/network/script-proxy/session-manager.ts +6 -5
- package/src/tools/network/web-fetch.ts +18 -2
- package/src/tools/network/web-search.ts +7 -3
- package/src/tools/reminder/reminder-store.ts +14 -15
- package/src/tools/schedule/create.ts +1 -0
- package/src/tools/schedule/list.ts +2 -1
- package/src/tools/shared/filesystem/file-ops-service.ts +5 -7
- package/src/tools/skills/skill-script-runner.ts +24 -9
- package/src/tools/skills/skill-tool-factory.ts +1 -0
- package/src/tools/tasks/work-item-enqueue.ts +2 -2
- package/src/tools/terminal/evaluate-typescript.ts +21 -12
- package/src/tools/terminal/parser.ts +50 -0
- package/src/tools/watcher/delete.ts +6 -0
- package/src/tools/weather/service.ts +1 -1
- package/src/twitter/client.ts +190 -24
- package/src/twitter/session.ts +4 -3
- package/src/util/clipboard.ts +1 -1
- package/src/util/errors.ts +65 -8
- package/src/util/fs.ts +40 -0
- package/src/util/json.ts +10 -0
- package/src/util/log-redact.ts +189 -0
- package/src/util/logger.ts +25 -18
- package/src/util/object.ts +3 -0
- package/src/util/platform.ts +72 -365
- package/src/util/pricing.ts +1 -1
- package/src/util/promise-guard.ts +1 -1
- package/src/util/retry.ts +19 -0
- package/src/util/row-mapper.ts +79 -0
- package/src/util/silently.ts +21 -0
- package/src/watcher/engine.ts +5 -1
- package/src/watcher/provider-types.ts +20 -0
- package/src/watcher/providers/github.ts +156 -0
- package/src/watcher/providers/gmail.ts +1 -0
- package/src/watcher/providers/google-calendar.ts +1 -0
- package/src/watcher/providers/linear.ts +460 -0
- package/src/watcher/providers/slack.ts +1 -0
- package/src/work-items/work-item-runner.ts +1 -1
- package/src/workspace/git-service.ts +1 -1
- package/src/workspace/provider-commit-message-generator.ts +51 -22
- package/src/__tests__/call-bridge.test.ts +0 -517
- package/src/__tests__/session-process-bridge.test.ts +0 -244
- package/src/calls/call-bridge.ts +0 -168
- package/src/config/bundled-skills/media-processing/services/capability-registry.ts +0 -137
- package/src/config/bundled-skills/media-processing/services/event-detection-service.ts +0 -280
- package/src/config/bundled-skills/media-processing/services/feedback-aggregation.ts +0 -144
- package/src/config/bundled-skills/media-processing/services/feedback-store.ts +0 -136
- package/src/config/bundled-skills/media-processing/services/retrieval-service.ts +0 -95
- package/src/config/bundled-skills/media-processing/services/timeline-service.ts +0 -267
- package/src/config/bundled-skills/media-processing/tools/detect-events.ts +0 -110
- package/src/config/bundled-skills/media-processing/tools/recalibrate.ts +0 -235
- package/src/config/bundled-skills/media-processing/tools/select-tracking-profile.ts +0 -142
- package/src/config/bundled-skills/media-processing/tools/submit-feedback.ts +0 -150
- package/src/config/vellum-skills/google-oauth-setup/SKILL.md +0 -199
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// Smoke command (run all security test files together):
|
|
2
2
|
// bun test src/__tests__/checker.test.ts src/__tests__/trust-store.test.ts src/__tests__/session-skill-tools.test.ts src/__tests__/skill-script-runner-host.test.ts
|
|
3
3
|
|
|
4
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
4
|
import { describe, test, expect, beforeAll, beforeEach, afterEach, mock } from 'bun:test';
|
|
6
5
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, symlinkSync, realpathSync } from 'node:fs';
|
|
7
6
|
import { tmpdir, homedir } from 'node:os';
|
|
@@ -39,9 +38,16 @@ mock.module('../util/logger.js', () => ({
|
|
|
39
38
|
|
|
40
39
|
// Mutable config object so tests can switch permissions.mode between
|
|
41
40
|
// 'legacy', 'strict', and 'workspace' without re-registering the mock.
|
|
42
|
-
|
|
43
|
-
permissions: { mode: 'legacy'
|
|
44
|
-
skills: { load: { extraDirs:
|
|
41
|
+
interface TestConfig {
|
|
42
|
+
permissions: { mode: 'legacy' | 'strict' | 'workspace' };
|
|
43
|
+
skills: { load: { extraDirs: string[] } };
|
|
44
|
+
sandbox: { enabled: boolean };
|
|
45
|
+
[key: string]: unknown;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const testConfig: TestConfig = {
|
|
49
|
+
permissions: { mode: 'legacy' },
|
|
50
|
+
skills: { load: { extraDirs: [] } },
|
|
45
51
|
sandbox: { enabled: true },
|
|
46
52
|
};
|
|
47
53
|
|
|
@@ -58,6 +64,7 @@ mock.module('../config/loader.js', () => ({
|
|
|
58
64
|
|
|
59
65
|
import { classifyRisk, check, generateAllowlistOptions, generateScopeOptions, _resetLegacyDeprecationWarning } from '../permissions/checker.js';
|
|
60
66
|
import { RiskLevel } from '../permissions/types.js';
|
|
67
|
+
import type { TrustRule } from '../permissions/types.js';
|
|
61
68
|
import { addRule, clearCache, findHighestPriorityRule } from '../permissions/trust-store.js';
|
|
62
69
|
import { getDefaultRuleTemplates } from '../permissions/defaults.js';
|
|
63
70
|
import { registerTool, getTool } from '../tools/registry.js';
|
|
@@ -2353,13 +2360,13 @@ describe('Permission Checker', () => {
|
|
|
2353
2360
|
const trustDir = dirnameFn(trustPath);
|
|
2354
2361
|
if (!existsSync(trustDir)) mkdirSyncFs(trustDir, { recursive: true });
|
|
2355
2362
|
|
|
2356
|
-
let currentRules:
|
|
2363
|
+
let currentRules: TrustRule[] = [];
|
|
2357
2364
|
try {
|
|
2358
2365
|
const raw = readFileSync(trustPath, 'utf-8');
|
|
2359
2366
|
currentRules = JSON.parse(raw).rules ?? [];
|
|
2360
2367
|
} catch { /* first run */ }
|
|
2361
2368
|
|
|
2362
|
-
currentRules = currentRules.filter((r:
|
|
2369
|
+
currentRules = currentRules.filter((r: TrustRule) => r.id !== opts.id);
|
|
2363
2370
|
currentRules.push({
|
|
2364
2371
|
...opts,
|
|
2365
2372
|
createdAt: Date.now(),
|
|
@@ -2486,7 +2493,7 @@ describe('Permission Checker', () => {
|
|
|
2486
2493
|
// Write the executionTarget field directly (addVersionBoundRule doesn't support it)
|
|
2487
2494
|
const trustPath = join(checkerTestDir, 'protected', 'trust.json');
|
|
2488
2495
|
const raw = JSON.parse((await import('node:fs')).readFileSync(trustPath, 'utf-8'));
|
|
2489
|
-
const rule = raw.rules.find((r:
|
|
2496
|
+
const rule = raw.rules.find((r: TrustRule) => r.id === 'inv4-target-scoped');
|
|
2490
2497
|
rule.executionTarget = '/usr/local/bin/node';
|
|
2491
2498
|
(await import('node:fs')).writeFileSync(trustPath, JSON.stringify(raw, null, 2));
|
|
2492
2499
|
clearCache();
|
|
@@ -6,33 +6,53 @@ let llmResolution: 'keep_existing' | 'keep_candidate' | 'merge' | 'still_unclear
|
|
|
6
6
|
let llmResolvedStatement = '';
|
|
7
7
|
let llmExplanation = 'Unclear response from user.';
|
|
8
8
|
|
|
9
|
-
mock.module('
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
9
|
+
mock.module('../providers/provider-send-message.js', () => ({
|
|
10
|
+
getConfiguredProvider: () => ({
|
|
11
|
+
sendMessage: async (
|
|
12
|
+
_messages: unknown,
|
|
13
|
+
_tools: unknown,
|
|
14
|
+
_system: unknown,
|
|
15
|
+
opts?: { signal?: AbortSignal },
|
|
16
|
+
) => {
|
|
17
|
+
llmCallCount += 1;
|
|
18
|
+
if (llmDelayMs > 0) {
|
|
19
|
+
await new Promise((resolve, reject) => {
|
|
20
|
+
const timer = setTimeout(resolve, llmDelayMs);
|
|
21
|
+
opts?.signal?.addEventListener('abort', () => {
|
|
22
|
+
clearTimeout(timer);
|
|
23
|
+
reject(new Error('Request was aborted.'));
|
|
21
24
|
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
content: [{
|
|
29
|
+
type: 'tool_use' as const,
|
|
30
|
+
id: 'test-tool-use-id',
|
|
31
|
+
name: 'resolve_conflict',
|
|
32
|
+
input: {
|
|
33
|
+
resolution: llmResolution,
|
|
34
|
+
resolved_statement: llmResolvedStatement,
|
|
35
|
+
explanation: llmExplanation,
|
|
36
|
+
},
|
|
37
|
+
}],
|
|
38
|
+
model: 'claude-haiku-4-5-20251001',
|
|
39
|
+
stopReason: 'tool_use',
|
|
40
|
+
usage: { inputTokens: 0, outputTokens: 0 },
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
}),
|
|
44
|
+
createTimeout: (ms: number) => {
|
|
45
|
+
const controller = new AbortController();
|
|
46
|
+
const timer = setTimeout(() => controller.abort(), ms);
|
|
47
|
+
return {
|
|
48
|
+
signal: controller.signal,
|
|
49
|
+
cleanup: () => clearTimeout(timer),
|
|
34
50
|
};
|
|
35
51
|
},
|
|
52
|
+
extractToolUse: (response: { content: Array<{ type: string }> }) => {
|
|
53
|
+
return response.content.find((b: { type: string }) => b.type === 'tool_use');
|
|
54
|
+
},
|
|
55
|
+
userMessage: (text: string) => ({ role: 'user', content: [{ type: 'text', text }] }),
|
|
36
56
|
}));
|
|
37
57
|
|
|
38
58
|
mock.module('../config/loader.js', () => ({
|
|
@@ -308,25 +308,30 @@ describe('CommitEnrichmentService', () => {
|
|
|
308
308
|
});
|
|
309
309
|
|
|
310
310
|
test('job timeout triggers retry with backoff then fails after max retries', async () => {
|
|
311
|
-
// Use a very short timeout so the real git notes write times out
|
|
312
311
|
const service = new CommitEnrichmentService({
|
|
313
312
|
maxQueueSize: 10,
|
|
314
313
|
maxConcurrency: 1,
|
|
315
|
-
jobTimeoutMs:
|
|
314
|
+
jobTimeoutMs: 10, // short timeout
|
|
316
315
|
maxRetries: 2,
|
|
317
316
|
});
|
|
318
317
|
|
|
319
318
|
const commitHash = await createCommit();
|
|
319
|
+
|
|
320
|
+
// Use a slow gitService so the timeout always wins the race.
|
|
321
|
+
// A 1ms timeout against a real git write is flaky on fast CI runners.
|
|
322
|
+
const slowGitService = new WorkspaceGitService(testDir);
|
|
323
|
+
await slowGitService.ensureInitialized();
|
|
324
|
+
slowGitService.writeNote = () => new Promise<void>(() => {});
|
|
325
|
+
|
|
320
326
|
service.enqueue({
|
|
321
327
|
workspaceDir: testDir,
|
|
322
328
|
commitHash,
|
|
323
329
|
context: makeContext(),
|
|
324
|
-
gitService,
|
|
330
|
+
gitService: slowGitService,
|
|
325
331
|
});
|
|
326
332
|
|
|
327
333
|
// Wait for all retries to complete (initial + 2 retries, with backoff)
|
|
328
334
|
// Backoff: 1s after attempt 1, 2s after attempt 2 = ~3s total
|
|
329
|
-
// But since the job itself is very fast to time out, total time is dominated by backoff
|
|
330
335
|
await waitForDrain(service, 10000);
|
|
331
336
|
await service.shutdown();
|
|
332
337
|
|
|
@@ -8,6 +8,13 @@ mock.module('../util/logger.js', () => ({
|
|
|
8
8
|
getLogger: () => new Proxy({} as Record<string, unknown>, {
|
|
9
9
|
get: () => () => {},
|
|
10
10
|
}),
|
|
11
|
+
getCliLogger: () => new Proxy({} as Record<string, unknown>, {
|
|
12
|
+
get: () => () => {},
|
|
13
|
+
}),
|
|
14
|
+
isDebug: () => false,
|
|
15
|
+
truncateForLog: (value: string, maxLen = 500) => value.length > maxLen ? value.slice(0, maxLen) + '...' : value,
|
|
16
|
+
initLogger: () => {},
|
|
17
|
+
pruneOldLogFiles: () => 0,
|
|
11
18
|
}));
|
|
12
19
|
|
|
13
20
|
mock.module('../util/platform.js', () => ({
|
|
@@ -38,6 +45,7 @@ mock.module('../util/platform.js', () => ({
|
|
|
38
45
|
isMacOS: () => false,
|
|
39
46
|
isLinux: () => true,
|
|
40
47
|
isWindows: () => false,
|
|
48
|
+
readHttpToken: () => null,
|
|
41
49
|
}));
|
|
42
50
|
|
|
43
51
|
mock.module('../tools/executor.js', () => ({
|
|
@@ -74,9 +74,9 @@ describe('AssistantConfigSchema', () => {
|
|
|
74
74
|
const result = AssistantConfigSchema.parse({});
|
|
75
75
|
expect(result.provider).toBe('anthropic');
|
|
76
76
|
expect(result.model).toBe('claude-opus-4-6');
|
|
77
|
-
expect(result.maxTokens).toBe(
|
|
77
|
+
expect(result.maxTokens).toBe(16000);
|
|
78
78
|
expect(result.apiKeys).toEqual({});
|
|
79
|
-
expect(result.thinking).toEqual({ enabled: false, budgetTokens: 10000 });
|
|
79
|
+
expect(result.thinking).toEqual({ enabled: false, budgetTokens: 10000, streamThinking: false });
|
|
80
80
|
expect(result.contextWindow).toEqual({
|
|
81
81
|
enabled: true,
|
|
82
82
|
maxInputTokens: 180000,
|
|
@@ -707,6 +707,11 @@ describe('AssistantConfigSchema', () => {
|
|
|
707
707
|
callerIdentity: {
|
|
708
708
|
allowPerCallOverride: true,
|
|
709
709
|
},
|
|
710
|
+
verification: {
|
|
711
|
+
enabled: false,
|
|
712
|
+
maxAttempts: 3,
|
|
713
|
+
codeLength: 6,
|
|
714
|
+
},
|
|
710
715
|
});
|
|
711
716
|
});
|
|
712
717
|
|
|
@@ -1188,8 +1193,8 @@ describe('loadConfig with schema validation', () => {
|
|
|
1188
1193
|
const config = loadConfig();
|
|
1189
1194
|
expect(config.provider).toBe('anthropic');
|
|
1190
1195
|
expect(config.model).toBe('claude-opus-4-6');
|
|
1191
|
-
expect(config.maxTokens).toBe(
|
|
1192
|
-
expect(config.thinking).toEqual({ enabled: false, budgetTokens: 10000 });
|
|
1196
|
+
expect(config.maxTokens).toBe(16000);
|
|
1197
|
+
expect(config.thinking).toEqual({ enabled: false, budgetTokens: 10000, streamThinking: false });
|
|
1193
1198
|
expect(config.contextWindow).toEqual({
|
|
1194
1199
|
enabled: true,
|
|
1195
1200
|
maxInputTokens: 180000,
|
|
@@ -1210,7 +1215,7 @@ describe('loadConfig with schema validation', () => {
|
|
|
1210
1215
|
test('falls back to default for invalid maxTokens', () => {
|
|
1211
1216
|
writeConfig({ maxTokens: -100 });
|
|
1212
1217
|
const config = loadConfig();
|
|
1213
|
-
expect(config.maxTokens).toBe(
|
|
1218
|
+
expect(config.maxTokens).toBe(16000);
|
|
1214
1219
|
});
|
|
1215
1220
|
|
|
1216
1221
|
test('falls back to defaults for invalid nested values', () => {
|
|
@@ -1235,13 +1240,13 @@ describe('loadConfig with schema validation', () => {
|
|
|
1235
1240
|
expect(config.model).toBe('gpt-4');
|
|
1236
1241
|
expect(config.thinking.enabled).toBe(true);
|
|
1237
1242
|
expect(config.thinking.budgetTokens).toBe(5000);
|
|
1238
|
-
expect(config.maxTokens).toBe(
|
|
1243
|
+
expect(config.maxTokens).toBe(16000);
|
|
1239
1244
|
});
|
|
1240
1245
|
|
|
1241
1246
|
test('handles no config file', () => {
|
|
1242
1247
|
const config = loadConfig();
|
|
1243
1248
|
expect(config.provider).toBe('anthropic');
|
|
1244
|
-
expect(config.maxTokens).toBe(
|
|
1249
|
+
expect(config.maxTokens).toBe(16000);
|
|
1245
1250
|
});
|
|
1246
1251
|
|
|
1247
1252
|
test('partial nested objects get defaults for missing fields', () => {
|
|
@@ -287,7 +287,7 @@ describe('ContextWindowManager', () => {
|
|
|
287
287
|
expect(getSummaryFromContextMessage(userMessage)).toBeNull();
|
|
288
288
|
});
|
|
289
289
|
|
|
290
|
-
test('skips compaction during cooldown
|
|
290
|
+
test('skips compaction during cooldown', async () => {
|
|
291
291
|
const provider = createProvider(() => {
|
|
292
292
|
throw new Error('summarizer should not be called while cooldown skip is active');
|
|
293
293
|
});
|
|
@@ -307,7 +307,7 @@ describe('ContextWindowManager', () => {
|
|
|
307
307
|
lastCompactedAt: Date.now() - 30_000,
|
|
308
308
|
});
|
|
309
309
|
expect(result.compacted).toBe(false);
|
|
310
|
-
expect(result.reason).toBe('compaction cooldown active
|
|
310
|
+
expect(result.reason).toBe('compaction cooldown active');
|
|
311
311
|
});
|
|
312
312
|
|
|
313
313
|
test('ignores cooldown and compacts under severe token pressure', async () => {
|
|
@@ -338,6 +338,34 @@ describe('ContextWindowManager', () => {
|
|
|
338
338
|
expect(result.reason).toBeUndefined();
|
|
339
339
|
});
|
|
340
340
|
|
|
341
|
+
test('force=true bypasses cooldown for context-too-large recovery', async () => {
|
|
342
|
+
const provider = createProvider(() => ({
|
|
343
|
+
content: [{ type: 'text', text: '## Goals\n- forced compaction' }],
|
|
344
|
+
model: 'mock-model',
|
|
345
|
+
usage: { inputTokens: 60, outputTokens: 12 },
|
|
346
|
+
stopReason: 'end_turn',
|
|
347
|
+
}));
|
|
348
|
+
const manager = new ContextWindowManager(
|
|
349
|
+
provider,
|
|
350
|
+
'system prompt',
|
|
351
|
+
makeConfig({ maxInputTokens: 260, targetInputTokens: 180, preserveRecentUserTurns: 1 }),
|
|
352
|
+
);
|
|
353
|
+
const long = 'c'.repeat(220);
|
|
354
|
+
const history: Message[] = [
|
|
355
|
+
message('user', `u1 ${long}`),
|
|
356
|
+
message('assistant', `a1 ${long}`),
|
|
357
|
+
message('user', `u2 ${long}`),
|
|
358
|
+
];
|
|
359
|
+
|
|
360
|
+
// Same setup as the cooldown test, but with force=true — should compact.
|
|
361
|
+
const result = await manager.maybeCompact(history, undefined, {
|
|
362
|
+
lastCompactedAt: Date.now() - 30_000,
|
|
363
|
+
force: true,
|
|
364
|
+
});
|
|
365
|
+
expect(result.compacted).toBe(true);
|
|
366
|
+
expect(result.reason).toBeUndefined();
|
|
367
|
+
});
|
|
368
|
+
|
|
341
369
|
test('image-heavy payload is no longer underestimated as below-threshold', async () => {
|
|
342
370
|
const provider = createProvider(() => ({
|
|
343
371
|
content: [{ type: 'text', text: '## Goals\n- compacted image-heavy history' }],
|
|
@@ -15,22 +15,37 @@ const classifyRelationshipMock = mock(async () => {
|
|
|
15
15
|
return {
|
|
16
16
|
content: [
|
|
17
17
|
{
|
|
18
|
-
type: 'tool_use',
|
|
18
|
+
type: 'tool_use' as const,
|
|
19
|
+
id: 'test-tool-use-id',
|
|
20
|
+
name: 'classify_relationship',
|
|
19
21
|
input: {
|
|
20
22
|
relationship: nextRelationship,
|
|
21
23
|
explanation: nextExplanation,
|
|
22
24
|
},
|
|
23
25
|
},
|
|
24
26
|
],
|
|
27
|
+
model: 'claude-haiku-4-5-20251001',
|
|
28
|
+
stopReason: 'tool_use',
|
|
29
|
+
usage: { inputTokens: 0, outputTokens: 0 },
|
|
25
30
|
};
|
|
26
31
|
});
|
|
27
32
|
|
|
28
|
-
mock.module('
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
mock.module('../providers/provider-send-message.js', () => ({
|
|
34
|
+
getConfiguredProvider: () => ({
|
|
35
|
+
sendMessage: classifyRelationshipMock,
|
|
36
|
+
}),
|
|
37
|
+
createTimeout: (ms: number) => {
|
|
38
|
+
const controller = new AbortController();
|
|
39
|
+
const timer = setTimeout(() => controller.abort(), ms);
|
|
40
|
+
return {
|
|
41
|
+
signal: controller.signal,
|
|
42
|
+
cleanup: () => clearTimeout(timer),
|
|
32
43
|
};
|
|
33
44
|
},
|
|
45
|
+
extractToolUse: (response: { content: Array<{ type: string }> }) => {
|
|
46
|
+
return response.content.find((b: { type: string }) => b.type === 'tool_use');
|
|
47
|
+
},
|
|
48
|
+
userMessage: (text: string) => ({ role: 'user', content: [{ type: 'text', text }] }),
|
|
34
49
|
}));
|
|
35
50
|
|
|
36
51
|
mock.module('../util/platform.js', () => ({
|
|
@@ -180,7 +180,10 @@ describe('Invariant 2: no generic plaintext secret read API', () => {
|
|
|
180
180
|
'tools/credentials/broker.ts', // brokered credential access
|
|
181
181
|
'tools/network/web-search.ts', // web search API key lookup
|
|
182
182
|
'daemon/handlers.ts', // Vercel API token + integration OAuth
|
|
183
|
-
'daemon/handlers/config.ts',
|
|
183
|
+
'daemon/handlers/config-integrations.ts', // Vercel API token + Twitter integration OAuth
|
|
184
|
+
'daemon/handlers/config-telegram.ts', // Telegram bot token management
|
|
185
|
+
'daemon/handlers/config-twilio.ts', // Twilio credential management
|
|
186
|
+
'daemon/handlers/config-ingress.ts', // Ingress config (reads Twilio credentials for webhook sync)
|
|
184
187
|
'security/token-manager.ts', // OAuth token refresh flow
|
|
185
188
|
'email/providers/index.ts', // email provider API key lookup
|
|
186
189
|
'tools/network/script-proxy/session-manager.ts', // proxy credential injection at runtime
|
|
@@ -198,6 +201,7 @@ describe('Invariant 2: no generic plaintext secret read API', () => {
|
|
|
198
201
|
'cli/config-commands.ts', // CLI config management
|
|
199
202
|
'messaging/providers/telegram-bot/adapter.ts', // Telegram bot token lookup for connectivity check
|
|
200
203
|
'messaging/providers/sms/adapter.ts', // Twilio credential lookup for SMS connectivity check
|
|
204
|
+
'runtime/channel-readiness-service.ts', // channel readiness probes for SMS/Telegram connectivity
|
|
201
205
|
]);
|
|
202
206
|
|
|
203
207
|
const thisDir = dirname(fileURLToPath(import.meta.url));
|
|
@@ -313,7 +317,7 @@ describe('Invariant 3: secrets never logged in plaintext', () => {
|
|
|
313
317
|
const logCallPattern = /log\.\w+\(\{([^}]*)}/g;
|
|
314
318
|
const loggedFields: string[] = [];
|
|
315
319
|
let match;
|
|
316
|
-
while ((match = logCallPattern.exec(prompterSrc))
|
|
320
|
+
while ((match = logCallPattern.exec(prompterSrc)) != null) {
|
|
317
321
|
// Collect field names from the structured log object
|
|
318
322
|
const fields = match[1].split(',').map(f => f.trim().split(':')[0].trim());
|
|
319
323
|
loggedFields.push(...fields);
|