@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
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
"name": "extract_keyframes",
|
|
58
|
-
"description": "
|
|
58
|
+
"description": "Preprocess a video asset: detect dead time, segment into windows, extract downscaled keyframes, build a subject registry, and write a pipeline manifest. Replaces the old simple keyframe extraction with a full Phase 0 preprocess pipeline.",
|
|
59
59
|
"category": "media",
|
|
60
60
|
"risk": "low",
|
|
61
61
|
"input_schema": {
|
|
@@ -68,6 +68,26 @@
|
|
|
68
68
|
"interval_seconds": {
|
|
69
69
|
"type": "number",
|
|
70
70
|
"description": "Interval between keyframes in seconds. Default: 3"
|
|
71
|
+
},
|
|
72
|
+
"segment_duration": {
|
|
73
|
+
"type": "number",
|
|
74
|
+
"description": "Duration of each segment window in seconds. Default: 20"
|
|
75
|
+
},
|
|
76
|
+
"dead_time_threshold": {
|
|
77
|
+
"type": "number",
|
|
78
|
+
"description": "Sensitivity threshold for mpdecimate dead-time detection. Default: 0.02"
|
|
79
|
+
},
|
|
80
|
+
"section_config": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"description": "Path to a JSON file with manual section boundary definitions"
|
|
83
|
+
},
|
|
84
|
+
"skip_dead_time": {
|
|
85
|
+
"type": "boolean",
|
|
86
|
+
"description": "Whether to detect and skip dead time. Default: true"
|
|
87
|
+
},
|
|
88
|
+
"short_edge": {
|
|
89
|
+
"type": "number",
|
|
90
|
+
"description": "Short edge resolution for downscaled frames in pixels. Default: 480"
|
|
71
91
|
}
|
|
72
92
|
},
|
|
73
93
|
"required": ["asset_id"]
|
|
@@ -77,7 +97,7 @@
|
|
|
77
97
|
},
|
|
78
98
|
{
|
|
79
99
|
"name": "analyze_keyframes",
|
|
80
|
-
"description": "
|
|
100
|
+
"description": "Map video segments through Gemini's structured output API for vision-based analysis. Reads frames from the preprocess manifest, sends each segment to Gemini with assistant-provided extraction instructions and a JSON Schema for guaranteed structured output. Supports concurrency pooling, cost tracking, resumability (skips segments with existing results), and automatic retries with exponential backoff.",
|
|
81
101
|
"category": "media",
|
|
82
102
|
"risk": "medium",
|
|
83
103
|
"input_schema": {
|
|
@@ -85,25 +105,43 @@
|
|
|
85
105
|
"properties": {
|
|
86
106
|
"asset_id": {
|
|
87
107
|
"type": "string",
|
|
88
|
-
"description": "ID of the media asset whose
|
|
108
|
+
"description": "ID of the media asset whose segments to analyze"
|
|
89
109
|
},
|
|
90
|
-
"
|
|
110
|
+
"system_prompt": {
|
|
91
111
|
"type": "string",
|
|
92
|
-
"description": "
|
|
112
|
+
"description": "Assistant-provided extraction instructions for Gemini (e.g., what to look for in the frames)"
|
|
93
113
|
},
|
|
94
|
-
"
|
|
114
|
+
"output_schema": {
|
|
115
|
+
"type": "object",
|
|
116
|
+
"description": "JSON Schema for structured output — Gemini will enforce this schema on the response"
|
|
117
|
+
},
|
|
118
|
+
"context": {
|
|
119
|
+
"type": "object",
|
|
120
|
+
"description": "Additional context to include in the prompt (e.g., subject registry, domain-specific info)"
|
|
121
|
+
},
|
|
122
|
+
"model": {
|
|
123
|
+
"type": "string",
|
|
124
|
+
"description": "Gemini model to use. Default: 'gemini-2.5-flash'"
|
|
125
|
+
},
|
|
126
|
+
"concurrency": {
|
|
95
127
|
"type": "number",
|
|
96
|
-
"
|
|
128
|
+
"minimum": 1,
|
|
129
|
+
"description": "Maximum concurrent Gemini API requests. Default: 10"
|
|
130
|
+
},
|
|
131
|
+
"max_retries": {
|
|
132
|
+
"type": "number",
|
|
133
|
+
"minimum": 0,
|
|
134
|
+
"description": "Maximum retry attempts per segment on failure. Default: 3"
|
|
97
135
|
}
|
|
98
136
|
},
|
|
99
|
-
"required": ["asset_id"]
|
|
137
|
+
"required": ["asset_id", "system_prompt", "output_schema"]
|
|
100
138
|
},
|
|
101
139
|
"executor": "tools/analyze-keyframes.ts",
|
|
102
140
|
"execution_target": "host"
|
|
103
141
|
},
|
|
104
142
|
{
|
|
105
|
-
"name": "
|
|
106
|
-
"description": "
|
|
143
|
+
"name": "query_media",
|
|
144
|
+
"description": "Query video analysis data using natural language. Sends map output (from analyze_keyframes) to Claude for intelligent analysis and Q&A. Supports arbitrary questions about video content — Claude reads the full structured analysis and answers based on the data.",
|
|
107
145
|
"category": "media",
|
|
108
146
|
"risk": "low",
|
|
109
147
|
"input_schema": {
|
|
@@ -111,85 +149,26 @@
|
|
|
111
149
|
"properties": {
|
|
112
150
|
"asset_id": {
|
|
113
151
|
"type": "string",
|
|
114
|
-
"description": "ID of the media asset to
|
|
152
|
+
"description": "ID of the media asset to query"
|
|
115
153
|
},
|
|
116
|
-
"
|
|
154
|
+
"query": {
|
|
117
155
|
"type": "string",
|
|
118
|
-
"description": "
|
|
156
|
+
"description": "Natural language query about the video data (e.g., 'What happens at the 5 minute mark?', 'Summarize the key events', 'Are there any scoring plays?')"
|
|
119
157
|
},
|
|
120
|
-
"
|
|
121
|
-
"type": "array",
|
|
122
|
-
"description": "Optional array of detection rule objects. Each rule has: ruleType (string: 'segment_transition', 'short_segment', or 'attribute_match'), params (object with rule-specific parameters), and weight (number: contribution to confidence score). If omitted, defaults are used based on event_type.",
|
|
123
|
-
"items": {
|
|
124
|
-
"type": "object",
|
|
125
|
-
"properties": {
|
|
126
|
-
"ruleType": {
|
|
127
|
-
"type": "string",
|
|
128
|
-
"description": "Rule type: 'segment_transition', 'short_segment', or 'attribute_match'"
|
|
129
|
-
},
|
|
130
|
-
"params": {
|
|
131
|
-
"type": "object",
|
|
132
|
-
"description": "Rule-specific parameters (e.g., { field: 'subjects' }, { maxDurationSeconds: 5 }, { field: 'actions', pattern: 'steal|turnover' })"
|
|
133
|
-
},
|
|
134
|
-
"weight": {
|
|
135
|
-
"type": "number",
|
|
136
|
-
"description": "Weight for this rule's contribution to the confidence score"
|
|
137
|
-
}
|
|
138
|
-
},
|
|
139
|
-
"required": ["ruleType", "params", "weight"]
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
"required": ["asset_id", "event_type"]
|
|
144
|
-
},
|
|
145
|
-
"executor": "tools/detect-events.ts",
|
|
146
|
-
"execution_target": "host"
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
"name": "query_media_events",
|
|
150
|
-
"description": "Query media events using natural language. Parses the query into structured filters (event type, count, confidence threshold, time range) and retrieves matching events ranked by confidence. Supports domain-specific keyword mapping (e.g., 'turnovers' → eventType='turnover').",
|
|
151
|
-
"category": "media",
|
|
152
|
-
"risk": "low",
|
|
153
|
-
"input_schema": {
|
|
154
|
-
"type": "object",
|
|
155
|
-
"properties": {
|
|
156
|
-
"query": {
|
|
158
|
+
"system_prompt": {
|
|
157
159
|
"type": "string",
|
|
158
|
-
"description": "
|
|
160
|
+
"description": "Optional system prompt for Claude to customize analysis behavior"
|
|
159
161
|
},
|
|
160
|
-
"
|
|
162
|
+
"model": {
|
|
161
163
|
"type": "string",
|
|
162
|
-
"description": "
|
|
164
|
+
"description": "LLM model to use for analysis. Default: 'claude-sonnet-4-6'"
|
|
163
165
|
}
|
|
164
166
|
},
|
|
165
|
-
"required": ["
|
|
167
|
+
"required": ["asset_id", "query"]
|
|
166
168
|
},
|
|
167
169
|
"executor": "tools/query-media-events.ts",
|
|
168
170
|
"execution_target": "host"
|
|
169
171
|
},
|
|
170
|
-
{
|
|
171
|
-
"name": "select_tracking_profile",
|
|
172
|
-
"description": "Select and persist a tracking profile for a media asset. When called without capabilities, returns available capabilities organized by tier (ready, beta, experimental). When called with capabilities, validates them against the registry and stores the profile. The capability tier system is generic and extensible across domains.",
|
|
173
|
-
"category": "media",
|
|
174
|
-
"risk": "low",
|
|
175
|
-
"input_schema": {
|
|
176
|
-
"type": "object",
|
|
177
|
-
"properties": {
|
|
178
|
-
"asset_id": {
|
|
179
|
-
"type": "string",
|
|
180
|
-
"description": "ID of the media asset to configure tracking for"
|
|
181
|
-
},
|
|
182
|
-
"capabilities": {
|
|
183
|
-
"type": "array",
|
|
184
|
-
"items": { "type": "string" },
|
|
185
|
-
"description": "Optional array of capability names to enable (e.g., ['turnover', 'field_goal']). If omitted, returns the available capabilities for selection."
|
|
186
|
-
}
|
|
187
|
-
},
|
|
188
|
-
"required": ["asset_id"]
|
|
189
|
-
},
|
|
190
|
-
"executor": "tools/select-tracking-profile.ts",
|
|
191
|
-
"execution_target": "host"
|
|
192
|
-
},
|
|
193
172
|
{
|
|
194
173
|
"name": "generate_clip",
|
|
195
174
|
"description": "Extract a video clip from a media asset using ffmpeg. Applies configurable pre/post-roll padding (clamped to file boundaries), outputs the clip as a temporary file, and registers it as an attachment for in-chat delivery.",
|
|
@@ -229,60 +208,9 @@
|
|
|
229
208
|
"executor": "tools/generate-clip.ts",
|
|
230
209
|
"execution_target": "host"
|
|
231
210
|
},
|
|
232
|
-
{
|
|
233
|
-
"name": "submit_feedback",
|
|
234
|
-
"description": "Submit feedback on a detected media event. Supports four feedback types: 'correct' (confirms accuracy), 'incorrect' (marks false positive), 'boundary_edit' (adjusts start/end times), and 'missed' (reports an event the system failed to detect, creating a new event). Works for any event type.",
|
|
235
|
-
"category": "media",
|
|
236
|
-
"risk": "low",
|
|
237
|
-
"input_schema": {
|
|
238
|
-
"type": "object",
|
|
239
|
-
"properties": {
|
|
240
|
-
"event_id": {
|
|
241
|
-
"type": "string",
|
|
242
|
-
"description": "ID of the event to provide feedback on. Required for all types except 'missed'."
|
|
243
|
-
},
|
|
244
|
-
"feedback_type": {
|
|
245
|
-
"type": "string",
|
|
246
|
-
"enum": ["correct", "incorrect", "boundary_edit", "missed"],
|
|
247
|
-
"description": "Type of feedback: correct, incorrect, boundary_edit, or missed"
|
|
248
|
-
},
|
|
249
|
-
"corrected_start_time": {
|
|
250
|
-
"type": "number",
|
|
251
|
-
"description": "Corrected start time in seconds (for boundary_edit feedback)"
|
|
252
|
-
},
|
|
253
|
-
"corrected_end_time": {
|
|
254
|
-
"type": "number",
|
|
255
|
-
"description": "Corrected end time in seconds (for boundary_edit feedback)"
|
|
256
|
-
},
|
|
257
|
-
"notes": {
|
|
258
|
-
"type": "string",
|
|
259
|
-
"description": "Optional free-text notes about the feedback"
|
|
260
|
-
},
|
|
261
|
-
"asset_id": {
|
|
262
|
-
"type": "string",
|
|
263
|
-
"description": "ID of the media asset (required for 'missed' type)"
|
|
264
|
-
},
|
|
265
|
-
"event_type": {
|
|
266
|
-
"type": "string",
|
|
267
|
-
"description": "Event type label for the missed event (required for 'missed' type)"
|
|
268
|
-
},
|
|
269
|
-
"start_time": {
|
|
270
|
-
"type": "number",
|
|
271
|
-
"description": "Start time in seconds for the missed event (required for 'missed' type)"
|
|
272
|
-
},
|
|
273
|
-
"end_time": {
|
|
274
|
-
"type": "number",
|
|
275
|
-
"description": "End time in seconds for the missed event (required for 'missed' type)"
|
|
276
|
-
}
|
|
277
|
-
},
|
|
278
|
-
"required": ["feedback_type"]
|
|
279
|
-
},
|
|
280
|
-
"executor": "tools/submit-feedback.ts",
|
|
281
|
-
"execution_target": "host"
|
|
282
|
-
},
|
|
283
211
|
{
|
|
284
212
|
"name": "media_diagnostics",
|
|
285
|
-
"description": "Get a diagnostic report for a media asset including processing stats, per-stage timing, failure reasons, cost estimation
|
|
213
|
+
"description": "Get a diagnostic report for a media asset including processing stats, per-stage timing (preprocess/map/reduce), failure reasons, and Gemini-based cost estimation.",
|
|
286
214
|
"category": "media",
|
|
287
215
|
"risk": "low",
|
|
288
216
|
"input_schema": {
|
|
@@ -297,24 +225,6 @@
|
|
|
297
225
|
},
|
|
298
226
|
"executor": "tools/media-diagnostics.ts",
|
|
299
227
|
"execution_target": "host"
|
|
300
|
-
},
|
|
301
|
-
{
|
|
302
|
-
"name": "recalibrate",
|
|
303
|
-
"description": "Recalibrate event detection for a media asset based on accumulated feedback. Analyzes correction patterns (false positive rates, missed events, boundary adjustments), re-ranks existing events by adjusting confidence scores, and returns a summary of adjustments made. Works for any event type.",
|
|
304
|
-
"category": "media",
|
|
305
|
-
"risk": "low",
|
|
306
|
-
"input_schema": {
|
|
307
|
-
"type": "object",
|
|
308
|
-
"properties": {
|
|
309
|
-
"asset_id": {
|
|
310
|
-
"type": "string",
|
|
311
|
-
"description": "ID of the media asset to recalibrate"
|
|
312
|
-
}
|
|
313
|
-
},
|
|
314
|
-
"required": ["asset_id"]
|
|
315
|
-
},
|
|
316
|
-
"executor": "tools/recalibrate.ts",
|
|
317
|
-
"execution_target": "host"
|
|
318
228
|
}
|
|
319
229
|
]
|
|
320
230
|
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { describe, expect, it } from 'bun:test';
|
|
2
|
+
import { ConcurrencyPool } from '../services/concurrency-pool.js';
|
|
3
|
+
|
|
4
|
+
describe('ConcurrencyPool', () => {
|
|
5
|
+
it('allows up to maxConcurrency tasks to run simultaneously', async () => {
|
|
6
|
+
const pool = new ConcurrencyPool(2);
|
|
7
|
+
|
|
8
|
+
await pool.acquire();
|
|
9
|
+
await pool.acquire();
|
|
10
|
+
|
|
11
|
+
expect(pool.activeCount).toBe(2);
|
|
12
|
+
expect(pool.waitingCount).toBe(0);
|
|
13
|
+
|
|
14
|
+
// Third acquire should not resolve immediately
|
|
15
|
+
let thirdResolved = false;
|
|
16
|
+
const thirdPromise = pool.acquire().then(() => {
|
|
17
|
+
thirdResolved = true;
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// Yield the microtask queue so the promise chain can settle if it were going to
|
|
21
|
+
await Promise.resolve();
|
|
22
|
+
expect(thirdResolved).toBe(false);
|
|
23
|
+
expect(pool.waitingCount).toBe(1);
|
|
24
|
+
|
|
25
|
+
// Release one slot — third should now resolve
|
|
26
|
+
pool.release();
|
|
27
|
+
await thirdPromise;
|
|
28
|
+
expect(thirdResolved).toBe(true);
|
|
29
|
+
expect(pool.activeCount).toBe(2);
|
|
30
|
+
expect(pool.waitingCount).toBe(0);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('releases slots on error so the pool does not leak', async () => {
|
|
34
|
+
const pool = new ConcurrencyPool(1);
|
|
35
|
+
|
|
36
|
+
const runTask = async () => {
|
|
37
|
+
await pool.acquire();
|
|
38
|
+
try {
|
|
39
|
+
throw new Error('simulated failure');
|
|
40
|
+
} finally {
|
|
41
|
+
pool.release();
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// First task errors and releases its slot
|
|
46
|
+
await expect(runTask()).rejects.toThrow('simulated failure');
|
|
47
|
+
expect(pool.activeCount).toBe(0);
|
|
48
|
+
|
|
49
|
+
// Pool should still be usable after the error
|
|
50
|
+
await pool.acquire();
|
|
51
|
+
expect(pool.activeCount).toBe(1);
|
|
52
|
+
pool.release();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('rejects maxConcurrency less than 1', () => {
|
|
56
|
+
expect(() => new ConcurrencyPool(0)).toThrow('maxConcurrency must be at least 1');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('defaults to maxConcurrency of 10', async () => {
|
|
60
|
+
const pool = new ConcurrencyPool();
|
|
61
|
+
|
|
62
|
+
// Acquire 10 slots — all should resolve immediately
|
|
63
|
+
for (let i = 0; i < 10; i++) {
|
|
64
|
+
await pool.acquire();
|
|
65
|
+
}
|
|
66
|
+
expect(pool.activeCount).toBe(10);
|
|
67
|
+
|
|
68
|
+
// 11th should queue
|
|
69
|
+
let eleventhResolved = false;
|
|
70
|
+
pool.acquire().then(() => {
|
|
71
|
+
eleventhResolved = true;
|
|
72
|
+
});
|
|
73
|
+
await Promise.resolve();
|
|
74
|
+
expect(eleventhResolved).toBe(false);
|
|
75
|
+
expect(pool.waitingCount).toBe(1);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { describe, expect, it } from 'bun:test';
|
|
2
|
+
import { CostTracker } from '../services/cost-tracker.js';
|
|
3
|
+
|
|
4
|
+
describe('CostTracker', () => {
|
|
5
|
+
it('accumulates costs across multiple segments', () => {
|
|
6
|
+
const tracker = new CostTracker();
|
|
7
|
+
|
|
8
|
+
tracker.record({
|
|
9
|
+
segmentId: 'seg-001',
|
|
10
|
+
model: 'gemini-2.5-flash',
|
|
11
|
+
inputTokens: 1_000_000,
|
|
12
|
+
outputTokens: 0,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
tracker.record({
|
|
16
|
+
segmentId: 'seg-002',
|
|
17
|
+
model: 'gemini-2.5-flash',
|
|
18
|
+
inputTokens: 0,
|
|
19
|
+
outputTokens: 1_000_000,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const summary = tracker.getSummary();
|
|
23
|
+
expect(summary.segmentCount).toBe(2);
|
|
24
|
+
expect(summary.totalInputTokens).toBe(1_000_000);
|
|
25
|
+
expect(summary.totalOutputTokens).toBe(1_000_000);
|
|
26
|
+
// $0.15 for 1M input + $0.60 for 1M output = $0.75
|
|
27
|
+
expect(summary.totalEstimatedUSD).toBeCloseTo(0.75, 6);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('computes per-entry costs using Gemini 2.5 Flash pricing', () => {
|
|
31
|
+
const tracker = new CostTracker();
|
|
32
|
+
|
|
33
|
+
const entry = tracker.record({
|
|
34
|
+
segmentId: 'seg-010',
|
|
35
|
+
model: 'gemini-2.5-flash',
|
|
36
|
+
inputTokens: 200_000,
|
|
37
|
+
outputTokens: 50_000,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Input: 200k * ($0.15 / 1M) = $0.03
|
|
41
|
+
// Output: 50k * ($0.60 / 1M) = $0.03
|
|
42
|
+
// Total: $0.06
|
|
43
|
+
expect(entry.estimatedUSD).toBeCloseTo(0.06, 6);
|
|
44
|
+
expect(entry.segmentId).toBe('seg-010');
|
|
45
|
+
expect(entry.model).toBe('gemini-2.5-flash');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('returns an empty summary when no entries have been recorded', () => {
|
|
49
|
+
const tracker = new CostTracker();
|
|
50
|
+
const summary = tracker.getSummary();
|
|
51
|
+
|
|
52
|
+
expect(summary.segmentCount).toBe(0);
|
|
53
|
+
expect(summary.totalInputTokens).toBe(0);
|
|
54
|
+
expect(summary.totalOutputTokens).toBe(0);
|
|
55
|
+
expect(summary.totalEstimatedUSD).toBe(0);
|
|
56
|
+
expect(summary.entries).toHaveLength(0);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('preserves entry order in summary', () => {
|
|
60
|
+
const tracker = new CostTracker();
|
|
61
|
+
|
|
62
|
+
tracker.record({ segmentId: 'a', model: 'm', inputTokens: 100, outputTokens: 200 });
|
|
63
|
+
tracker.record({ segmentId: 'b', model: 'm', inputTokens: 300, outputTokens: 400 });
|
|
64
|
+
tracker.record({ segmentId: 'c', model: 'm', inputTokens: 500, outputTokens: 600 });
|
|
65
|
+
|
|
66
|
+
const ids = tracker.getSummary().entries.map((e) => e.segmentId);
|
|
67
|
+
expect(ids).toEqual(['a', 'b', 'c']);
|
|
68
|
+
});
|
|
69
|
+
});
|