@vellumai/assistant 0.4.48 → 0.4.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +26 -35
- package/README.md +5 -26
- package/docs/architecture/integrations.md +45 -41
- package/docs/architecture/keychain-broker.md +3 -3
- package/docs/architecture/memory.md +180 -119
- package/docs/runbook-trusted-contacts.md +3 -8
- package/hook-templates/debug-prompt-logger/hook.json +1 -1
- package/hook-templates/debug-prompt-logger/run.sh +1 -3
- package/package.json +2 -2
- package/src/__tests__/actor-token-service.test.ts +0 -1
- package/src/__tests__/agent-loop.test.ts +3 -1
- package/src/__tests__/anthropic-provider.test.ts +249 -2
- package/src/__tests__/approval-cascade.test.ts +796 -0
- package/src/__tests__/approval-primitive.test.ts +0 -1
- package/src/__tests__/approval-routes-http.test.ts +4 -0
- package/src/__tests__/assistant-attachments.test.ts +12 -34
- package/src/__tests__/assistant-feature-flag-guard.test.ts +0 -23
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +76 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -1
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
- package/src/__tests__/canonical-guardian-store.test.ts +95 -0
- package/src/__tests__/channel-guardian.test.ts +0 -2
- package/src/__tests__/channel-readiness-routes.test.ts +15 -6
- package/src/__tests__/channel-readiness-service.test.ts +10 -9
- package/src/__tests__/checker.test.ts +13 -20
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +1 -1
- package/src/__tests__/computer-use-tools.test.ts +2 -19
- package/src/__tests__/config-schema.test.ts +1 -68
- package/src/__tests__/config-watcher.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/context-image-dimensions.test.ts +332 -0
- package/src/__tests__/context-memory-e2e.test.ts +11 -100
- package/src/__tests__/context-token-estimator.test.ts +196 -13
- package/src/__tests__/conversation-attention-store.test.ts +0 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +152 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -0
- package/src/__tests__/credential-metadata-store.test.ts +64 -73
- package/src/__tests__/credential-security-e2e.test.ts +1 -0
- package/src/__tests__/credential-security-invariants.test.ts +13 -7
- package/src/__tests__/credential-vault-unit.test.ts +284 -49
- package/src/__tests__/credential-vault.test.ts +150 -16
- package/src/__tests__/credentials-cli.test.ts +71 -0
- package/src/__tests__/cu-unified-flow.test.ts +532 -0
- package/src/__tests__/date-context.test.ts +93 -77
- package/src/__tests__/deterministic-verification-control-plane.test.ts +64 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/ephemeral-permissions.test.ts +3 -3
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +93 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -39
- package/src/__tests__/heartbeat-service.test.ts +0 -1
- package/src/__tests__/history-repair.test.ts +245 -0
- package/src/__tests__/host-cu-proxy.test.ts +791 -0
- package/src/__tests__/host-shell-tool.test.ts +27 -15
- package/src/__tests__/http-user-message-parity.test.ts +2 -0
- package/src/__tests__/ingress-url-consistency.test.ts +14 -21
- package/src/__tests__/integration-status.test.ts +32 -51
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/invite-redemption-service.test.ts +65 -1
- package/src/__tests__/invite-routes-http.test.ts +10 -9
- package/src/__tests__/keychain-broker-client.test.ts +14 -46
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +56 -18
- package/src/__tests__/memory-lifecycle-e2e.test.ts +244 -387
- package/src/__tests__/memory-recall-quality.test.ts +244 -407
- package/src/__tests__/memory-regressions.experimental.test.ts +126 -101
- package/src/__tests__/memory-regressions.test.ts +477 -2841
- package/src/__tests__/memory-retrieval.benchmark.test.ts +33 -150
- package/src/__tests__/memory-upsert-concurrency.test.ts +5 -244
- package/src/__tests__/mime-builder.test.ts +28 -0
- package/src/__tests__/native-web-search.test.ts +1 -0
- package/src/__tests__/notification-routing-intent.test.ts +0 -1
- package/src/__tests__/oauth-cli.test.ts +941 -15
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -9
- package/src/__tests__/oauth-scope-policy.test.ts +4 -6
- package/src/__tests__/oauth-store.test.ts +870 -0
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
- package/src/__tests__/provider-error-scenarios.test.ts +0 -1
- package/src/__tests__/provider-streaming.benchmark.test.ts +0 -1
- package/src/__tests__/public-ingress-urls.test.ts +15 -21
- package/src/__tests__/qdrant-collection-migration.test.ts +53 -8
- package/src/__tests__/recording-handler.test.ts +3 -4
- package/src/__tests__/registry.test.ts +2 -3
- package/src/__tests__/relay-server.test.ts +46 -1
- package/src/__tests__/runtime-events-sse.test.ts +55 -7
- package/src/__tests__/schedule-store.test.ts +0 -1
- package/src/__tests__/schedule-tools.test.ts +32 -0
- package/src/__tests__/scheduler-recurrence.test.ts +0 -1
- package/src/__tests__/scoped-approval-grants.test.ts +0 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
- package/src/__tests__/script-proxy-certs.test.ts +1 -1
- package/src/__tests__/secret-ingress-handler.test.ts +0 -1
- package/src/__tests__/secret-onetime-send.test.ts +1 -0
- package/src/__tests__/secure-keys.test.ts +7 -2
- package/src/__tests__/send-endpoint-busy.test.ts +24 -6
- package/src/__tests__/sequence-store.test.ts +0 -1
- package/src/__tests__/session-abort-tool-results.test.ts +1 -14
- package/src/__tests__/session-agent-loop-overflow.test.ts +1583 -0
- package/src/__tests__/session-agent-loop.test.ts +19 -15
- package/src/__tests__/session-confirmation-signals.test.ts +1 -15
- package/src/__tests__/session-error.test.ts +124 -2
- package/src/__tests__/session-history-web-search.test.ts +918 -0
- package/src/__tests__/session-init.benchmark.test.ts +4 -5
- package/src/__tests__/session-pre-run-repair.test.ts +1 -14
- package/src/__tests__/session-provider-retry-repair.test.ts +25 -28
- package/src/__tests__/session-queue.test.ts +37 -27
- package/src/__tests__/session-runtime-assembly.test.ts +54 -0
- package/src/__tests__/session-slash-known.test.ts +1 -15
- package/src/__tests__/session-slash-queue.test.ts +1 -15
- package/src/__tests__/session-slash-unknown.test.ts +1 -15
- package/src/__tests__/session-workspace-cache-state.test.ts +3 -33
- package/src/__tests__/session-workspace-injection.test.ts +3 -37
- package/src/__tests__/session-workspace-tool-tracking.test.ts +3 -37
- package/src/__tests__/skill-include-graph.test.ts +66 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +0 -1
- package/src/__tests__/skill-load-tool.test.ts +149 -1
- package/src/__tests__/skill-projection-feature-flag.test.ts +0 -1
- package/src/__tests__/skills-install-extract.test.ts +93 -0
- package/src/__tests__/skills-uninstall.test.ts +1 -1
- package/src/__tests__/skills.test.ts +3 -3
- package/src/__tests__/skillssh-registry.test.ts +451 -0
- package/src/__tests__/slack-channel-config.test.ts +67 -3
- package/src/__tests__/slack-share-routes.test.ts +17 -19
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/telegram-invite-adapter.test.ts +18 -22
- package/src/__tests__/terminal-tools.test.ts +4 -3
- package/src/__tests__/test-support/computer-use-skill-harness.ts +3 -2
- package/src/__tests__/tool-approval-handler.test.ts +0 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
- package/src/__tests__/tool-executor-shell-integration.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +0 -1
- package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
- package/src/__tests__/trust-store-pattern-matches.test.ts +29 -0
- package/src/__tests__/trust-store.test.ts +7 -13
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +0 -16
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -1
- package/src/__tests__/voice-invite-redemption.test.ts +32 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
- package/src/agent/ax-tree-compaction.test.ts +286 -0
- package/src/agent/loop.ts +104 -131
- package/src/approvals/AGENTS.md +1 -1
- package/src/approvals/guardian-request-resolvers.ts +14 -2
- package/src/bundler/compiler-tools.ts +66 -2
- package/src/calls/call-domain.ts +133 -6
- package/src/calls/call-store.ts +6 -0
- package/src/calls/relay-server.ts +52 -18
- package/src/calls/relay-setup-router.ts +17 -1
- package/src/calls/twilio-config.ts +3 -8
- package/src/calls/twilio-routes.ts +1 -2
- package/src/calls/types.ts +3 -1
- package/src/calls/voice-ingress-preflight.ts +1 -1
- package/src/cli/commands/browser-relay.ts +18 -12
- package/src/cli/commands/completions.ts +0 -3
- package/src/cli/commands/credentials.ts +101 -15
- package/src/cli/commands/doctor.ts +4 -3
- package/src/cli/commands/mcp.ts +46 -59
- package/src/cli/commands/memory.ts +16 -165
- package/src/cli/commands/oauth/apps.ts +284 -0
- package/src/cli/commands/oauth/connections.ts +633 -0
- package/src/cli/commands/oauth/index.ts +52 -0
- package/src/cli/commands/oauth/providers.ts +256 -0
- package/src/cli/commands/sessions.ts +5 -2
- package/src/cli/commands/skills.ts +177 -339
- package/src/cli/http-client.ts +0 -20
- package/src/cli/main-screen.tsx +2 -2
- package/src/cli/program.ts +6 -11
- package/src/cli/reference.ts +1 -3
- package/src/cli.ts +4 -10
- package/src/config/assistant-feature-flags.ts +0 -3
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +1 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +3 -6
- package/src/config/bundled-skills/computer-use/TOOLS.json +23 -5
- package/src/config/bundled-skills/computer-use/tools/{computer-use-request-control.ts → computer-use-observe.ts} +1 -5
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +21 -16
- package/src/config/bundled-skills/messaging/tools/shared.ts +1 -4
- package/src/config/bundled-skills/settings/SKILL.md +1 -1
- package/src/config/bundled-skills/settings/TOOLS.json +2 -8
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +5 -33
- package/src/config/bundled-tool-registry.ts +2 -5
- package/src/config/env-registry.ts +14 -83
- package/src/config/env.ts +11 -50
- package/src/config/feature-flag-registry.json +16 -16
- package/src/config/loader.ts +0 -6
- package/src/config/schema.ts +4 -13
- package/src/config/schemas/memory-lifecycle.ts +0 -9
- package/src/config/schemas/memory-processing.ts +0 -180
- package/src/config/schemas/memory-retrieval.ts +32 -104
- package/src/config/schemas/memory.ts +0 -10
- package/src/config/skills.ts +21 -2
- package/src/config/types.ts +0 -4
- package/src/context/image-dimensions.ts +229 -0
- package/src/context/token-estimator.ts +75 -12
- package/src/context/window-manager.ts +53 -11
- package/src/daemon/assistant-attachments.ts +1 -13
- package/src/daemon/config-watcher.ts +61 -3
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/date-context.ts +114 -31
- package/src/daemon/handlers/config-ingress.ts +8 -33
- package/src/daemon/handlers/config-slack-channel.ts +49 -46
- package/src/daemon/handlers/config-telegram.ts +32 -16
- package/src/daemon/handlers/sessions.ts +27 -36
- package/src/daemon/handlers/shared.ts +0 -130
- package/src/daemon/handlers/skills.ts +20 -1
- package/src/daemon/history-repair.ts +72 -8
- package/src/daemon/host-cu-proxy.ts +430 -0
- package/src/daemon/lifecycle.ts +67 -71
- package/src/daemon/mcp-reload-service.ts +2 -2
- package/src/daemon/message-protocol.ts +3 -0
- package/src/daemon/message-types/computer-use.ts +1 -129
- package/src/daemon/message-types/host-cu.ts +19 -0
- package/src/daemon/message-types/memory.ts +4 -16
- package/src/daemon/message-types/messages.ts +4 -0
- package/src/daemon/message-types/sessions.ts +4 -0
- package/src/daemon/server.ts +25 -21
- package/src/daemon/session-agent-loop-handlers.ts +40 -0
- package/src/daemon/session-agent-loop.ts +334 -48
- package/src/daemon/session-attachments.ts +1 -2
- package/src/daemon/session-error.ts +89 -6
- package/src/daemon/session-history.ts +17 -7
- package/src/daemon/session-media-retry.ts +6 -2
- package/src/daemon/session-memory.ts +69 -149
- package/src/daemon/session-process.ts +10 -1
- package/src/daemon/session-runtime-assembly.ts +49 -19
- package/src/daemon/session-slash.ts +1 -1
- package/src/daemon/session-surfaces.ts +43 -28
- package/src/daemon/session-tool-setup.ts +9 -10
- package/src/daemon/session.ts +150 -17
- package/src/daemon/tool-side-effects.ts +2 -8
- package/src/daemon/watch-handler.ts +2 -2
- package/src/events/tool-metrics-listener.ts +2 -2
- package/src/hooks/manager.ts +1 -4
- package/src/inbound/public-ingress-urls.ts +7 -7
- package/src/instrument.ts +61 -1
- package/src/logfire.ts +16 -5
- package/src/memory/admin.ts +2 -191
- package/src/memory/canonical-guardian-store.ts +38 -2
- package/src/memory/conversation-crud.ts +0 -33
- package/src/memory/conversation-key-store.ts +21 -0
- package/src/memory/conversation-queries.ts +22 -3
- package/src/memory/db-init.ts +32 -0
- package/src/memory/embedding-backend.ts +84 -8
- package/src/memory/embedding-types.ts +9 -1
- package/src/memory/indexer.ts +7 -46
- package/src/memory/items-extractor.ts +274 -76
- package/src/memory/job-handlers/backfill.ts +2 -127
- package/src/memory/job-handlers/cleanup.ts +2 -16
- package/src/memory/job-handlers/extraction.ts +2 -138
- package/src/memory/job-handlers/index-maintenance.ts +1 -6
- package/src/memory/job-handlers/summarization.ts +3 -148
- package/src/memory/job-utils.ts +21 -59
- package/src/memory/jobs-store.ts +1 -159
- package/src/memory/jobs-worker.ts +9 -52
- package/src/memory/migrations/104-core-indexes.ts +3 -3
- package/src/memory/migrations/149-oauth-tables.ts +62 -0
- package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +98 -0
- package/src/memory/migrations/151-oauth-providers-ping-url.ts +11 -0
- package/src/memory/migrations/152-memory-item-supersession.ts +44 -0
- package/src/memory/migrations/153-drop-entity-tables.ts +15 -0
- package/src/memory/migrations/154-drop-fts.ts +20 -0
- package/src/memory/migrations/155-drop-conflicts.ts +7 -0
- package/src/memory/migrations/156-call-session-invite-metadata.ts +24 -0
- package/src/memory/migrations/index.ts +8 -0
- package/src/memory/qdrant-client.ts +148 -51
- package/src/memory/raw-query.ts +1 -1
- package/src/memory/retriever.test.ts +294 -273
- package/src/memory/retriever.ts +421 -645
- package/src/memory/schema/calls.ts +2 -0
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/memory-core.ts +3 -48
- package/src/memory/schema/oauth.ts +67 -0
- package/src/memory/search/formatting.ts +263 -176
- package/src/memory/search/lexical.ts +1 -254
- package/src/memory/search/ranking.ts +0 -455
- package/src/memory/search/semantic.ts +100 -14
- package/src/memory/search/staleness.ts +47 -0
- package/src/memory/search/tier-classifier.ts +21 -0
- package/src/memory/search/types.ts +15 -77
- package/src/memory/task-memory-cleanup.ts +4 -6
- package/src/messaging/provider.ts +4 -4
- package/src/messaging/providers/gmail/client.ts +82 -2
- package/src/messaging/providers/gmail/mime-builder.ts +17 -7
- package/src/messaging/providers/gmail/people-client.ts +10 -10
- package/src/messaging/providers/telegram-bot/adapter.ts +17 -17
- package/src/messaging/providers/whatsapp/adapter.ts +11 -8
- package/src/messaging/registry.ts +2 -32
- package/src/notifications/copy-composer.ts +0 -5
- package/src/notifications/signal.ts +4 -5
- package/src/oauth/byo-connection.test.ts +133 -25
- package/src/oauth/byo-connection.ts +22 -6
- package/src/oauth/connect-orchestrator.ts +113 -57
- package/src/oauth/connect-types.ts +17 -23
- package/src/oauth/connection-resolver.ts +35 -11
- package/src/oauth/connection.ts +1 -1
- package/src/oauth/manual-token-connection.ts +104 -0
- package/src/oauth/oauth-store.ts +582 -0
- package/src/oauth/platform-connection.test.ts +29 -0
- package/src/oauth/platform-connection.ts +6 -5
- package/src/oauth/provider-behaviors.ts +124 -0
- package/src/oauth/scope-policy.ts +9 -2
- package/src/oauth/seed-providers.ts +167 -0
- package/src/oauth/token-persistence.ts +81 -77
- package/src/permissions/checker.ts +3 -3
- package/src/permissions/defaults.ts +1 -1
- package/src/permissions/prompter.ts +10 -1
- package/src/permissions/trust-store.ts +36 -1
- package/src/playbooks/playbook-compiler.ts +1 -1
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +3 -1
- package/src/prompts/system-prompt.ts +46 -42
- package/src/providers/anthropic/client.ts +59 -20
- package/src/providers/retry.ts +1 -27
- package/src/providers/types.ts +7 -1
- package/src/runtime/AGENTS.md +9 -0
- package/src/runtime/auth/route-policy.ts +6 -6
- package/src/runtime/channel-reply-delivery.ts +0 -40
- package/src/runtime/gateway-client.ts +0 -7
- package/src/runtime/guardian-reply-router.ts +24 -22
- package/src/runtime/http-server.ts +10 -8
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/invite-redemption-service.ts +19 -1
- package/src/runtime/invite-service.ts +25 -0
- package/src/runtime/middleware/twilio-validation.ts +1 -11
- package/src/runtime/pending-interactions.ts +14 -12
- package/src/runtime/routes/brain-graph-routes.ts +10 -90
- package/src/runtime/routes/channel-delivery-routes.ts +0 -1
- package/src/runtime/routes/conversation-routes.ts +81 -19
- package/src/runtime/routes/events-routes.ts +21 -11
- package/src/runtime/routes/host-cu-routes.ts +97 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +21 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +12 -111
- package/src/runtime/routes/integrations/slack/share.ts +6 -7
- package/src/runtime/routes/log-export-routes.ts +126 -8
- package/src/runtime/routes/memory-item-routes.test.ts +754 -0
- package/src/runtime/routes/memory-item-routes.ts +503 -0
- package/src/runtime/routes/session-management-routes.ts +3 -3
- package/src/runtime/routes/settings-routes.ts +55 -48
- package/src/runtime/routes/surface-action-routes.ts +1 -1
- package/src/runtime/routes/trust-rules-routes.ts +14 -0
- package/src/runtime/routes/watch-routes.ts +128 -0
- package/src/runtime/routes/workspace-routes.ts +2 -1
- package/src/schedule/integration-status.ts +10 -9
- package/src/security/credential-key.ts +0 -156
- package/src/security/keychain-broker-client.ts +22 -10
- package/src/security/oauth2.ts +1 -1
- package/src/security/secure-keys.ts +25 -3
- package/src/security/token-manager.ts +137 -64
- package/src/skills/catalog-install.ts +414 -0
- package/src/skills/include-graph.ts +32 -0
- package/src/skills/skillssh-registry.ts +503 -0
- package/src/telegram/bot-username.ts +2 -3
- package/src/tools/assets/search.ts +5 -1
- package/src/tools/browser/network-recorder.ts +1 -1
- package/src/tools/browser/network-recording-types.ts +1 -1
- package/src/tools/computer-use/definitions.ts +36 -11
- package/src/tools/computer-use/registry.ts +5 -6
- package/src/tools/credentials/broker.ts +1 -2
- package/src/tools/credentials/metadata-store.ts +17 -121
- package/src/tools/credentials/vault.ts +92 -167
- package/src/tools/memory/definitions.ts +4 -13
- package/src/tools/memory/handlers.test.ts +83 -103
- package/src/tools/memory/handlers.ts +50 -85
- package/src/tools/registry.ts +2 -7
- package/src/tools/schedule/create.ts +8 -1
- package/src/tools/schedule/update.ts +8 -1
- package/src/tools/skills/load.ts +85 -3
- package/src/tools/watch/watch-state.ts +0 -12
- package/src/util/logger.ts +7 -41
- package/src/util/platform.ts +9 -28
- package/src/watcher/providers/google-calendar.ts +2 -1
- package/src/__tests__/clarification-resolver.test.ts +0 -193
- package/src/__tests__/computer-use-session-compaction.test.ts +0 -143
- package/src/__tests__/computer-use-session-lifecycle.test.ts +0 -322
- package/src/__tests__/computer-use-session-working-dir.test.ts +0 -166
- package/src/__tests__/computer-use-skill-baseline.test.ts +0 -78
- package/src/__tests__/computer-use-skill-endstate.test.ts +0 -105
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +0 -249
- package/src/__tests__/conflict-intent-tokenization.test.ts +0 -160
- package/src/__tests__/conflict-policy.test.ts +0 -269
- package/src/__tests__/conflict-store.test.ts +0 -372
- package/src/__tests__/contradiction-checker.test.ts +0 -361
- package/src/__tests__/entity-extractor.test.ts +0 -211
- package/src/__tests__/entity-search.test.ts +0 -1117
- package/src/__tests__/profile-compiler.test.ts +0 -392
- package/src/__tests__/ride-shotgun-handler.test.ts +0 -452
- package/src/__tests__/session-conflict-gate.test.ts +0 -1228
- package/src/__tests__/session-profile-injection.test.ts +0 -557
- package/src/cli/commands/dev.ts +0 -129
- package/src/cli/commands/map.ts +0 -391
- package/src/cli/commands/oauth.ts +0 -77
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +0 -25
- package/src/config/bundled-skills/knowledge-graph/TOOLS.json +0 -66
- package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +0 -211
- package/src/daemon/computer-use-session.ts +0 -1026
- package/src/daemon/ride-shotgun-handler.ts +0 -569
- package/src/daemon/session-conflict-gate.ts +0 -167
- package/src/daemon/session-dynamic-profile.ts +0 -77
- package/src/memory/clarification-resolver.ts +0 -417
- package/src/memory/conflict-intent.ts +0 -205
- package/src/memory/conflict-policy.ts +0 -127
- package/src/memory/conflict-store.ts +0 -410
- package/src/memory/contradiction-checker.ts +0 -508
- package/src/memory/entity-extractor.ts +0 -535
- package/src/memory/format-recall.ts +0 -47
- package/src/memory/fts-reconciler.ts +0 -165
- package/src/memory/job-handlers/conflict.ts +0 -200
- package/src/memory/profile-compiler.ts +0 -195
- package/src/memory/recall-cache.ts +0 -117
- package/src/memory/search/entity.ts +0 -535
- package/src/memory/search/query-expansion.test.ts +0 -70
- package/src/memory/search/query-expansion.ts +0 -118
- package/src/oauth/provider-base-urls.ts +0 -21
- package/src/oauth/provider-profiles.ts +0 -192
- package/src/prompts/computer-use-prompt.ts +0 -98
- package/src/runtime/routes/computer-use-routes.ts +0 -641
- package/src/runtime/routes/mcp-routes.ts +0 -20
- package/src/runtime/telegram-streaming-delivery.test.ts +0 -729
- package/src/runtime/telegram-streaming-delivery.ts +0 -393
- package/src/tools/computer-use/request-computer-control.ts +0 -56
package/src/cli.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
|
|
|
3
3
|
import { dirname } from "node:path";
|
|
4
4
|
import * as readline from "node:readline";
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { httpSend } from "./cli/http-client.js";
|
|
7
7
|
import {
|
|
8
8
|
type MainScreenLayout,
|
|
9
9
|
renderMainScreen,
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
updateStatusText,
|
|
12
12
|
} from "./cli/main-screen.jsx";
|
|
13
13
|
import { shouldAutoStartDaemon } from "./daemon/connection-policy.js";
|
|
14
|
+
import { isHttpHealthy } from "./daemon/daemon-control.js";
|
|
14
15
|
import { ensureDaemonRunning } from "./daemon/lifecycle.js";
|
|
15
16
|
import type {
|
|
16
17
|
ConfirmationRequest,
|
|
@@ -637,7 +638,7 @@ export async function startCli(): Promise<void> {
|
|
|
637
638
|
case "memory_recalled":
|
|
638
639
|
spinner.stop();
|
|
639
640
|
process.stdout.write(
|
|
640
|
-
`\n\x1B[2m[Memory recalled: ${msg.injectedTokens} tokens |
|
|
641
|
+
`\n\x1B[2m[Memory recalled: ${msg.injectedTokens} tokens | t1 ${msg.tier1Count} t2 ${msg.tier2Count} | semantic ${msg.semanticHits} | recency ${msg.recencyHits} | merged ${msg.mergedCount} → selected ${msg.selectedCount}${msg.sparseVectorUsed ? " (sparse)" : ""} | hybrid ${msg.hybridSearchLatencyMs}ms | ${msg.provider}/${msg.model} | ${msg.latencyMs}ms]\x1B[0m\n`,
|
|
641
642
|
);
|
|
642
643
|
spinner.start("Thinking...");
|
|
643
644
|
break;
|
|
@@ -885,17 +886,10 @@ export async function startCli(): Promise<void> {
|
|
|
885
886
|
|
|
886
887
|
/** Connect the SSE event stream for the current conversation. */
|
|
887
888
|
async function connectSse(): Promise<void> {
|
|
888
|
-
const token = readHttpToken();
|
|
889
889
|
const controller = new AbortController();
|
|
890
890
|
sseAbortController = controller;
|
|
891
891
|
|
|
892
892
|
const url = `/v1/events?conversationKey=${encodeURIComponent(conversationKey)}`;
|
|
893
|
-
const headers: Record<string, string> = {
|
|
894
|
-
Accept: "text/event-stream",
|
|
895
|
-
};
|
|
896
|
-
if (token) {
|
|
897
|
-
headers["Authorization"] = `Bearer ${token}`;
|
|
898
|
-
}
|
|
899
893
|
|
|
900
894
|
try {
|
|
901
895
|
const response = await httpSend(url, {
|
|
@@ -1010,7 +1004,7 @@ export async function startCli(): Promise<void> {
|
|
|
1010
1004
|
try {
|
|
1011
1005
|
if (shouldAutoStartDaemon()) await ensureDaemonRunning();
|
|
1012
1006
|
// Verify the daemon is healthy before attempting SSE
|
|
1013
|
-
const healthy = await
|
|
1007
|
+
const healthy = await isHttpHealthy();
|
|
1014
1008
|
if (!healthy) throw new Error("Health check failed");
|
|
1015
1009
|
await connectSse();
|
|
1016
1010
|
reconnectDelay = RECONNECT_BASE_DELAY_MS;
|
|
@@ -42,10 +42,7 @@ function loadDefaultsRegistry(): FeatureFlagDefaultsRegistry {
|
|
|
42
42
|
if (cachedDefaults) return cachedDefaults;
|
|
43
43
|
|
|
44
44
|
const thisDir = import.meta.dirname ?? __dirname;
|
|
45
|
-
const envPath = process.env.FEATURE_FLAG_DEFAULTS_PATH?.trim();
|
|
46
45
|
const candidates = [
|
|
47
|
-
// Explicit override (primarily for tests / controlled environments)
|
|
48
|
-
...(envPath ? [envPath] : []),
|
|
49
46
|
// Bundled: co-located copy in the same directory as this source file.
|
|
50
47
|
// Works in Docker / packaged builds where the repo-root `meta/` dir
|
|
51
48
|
// is not available.
|
|
@@ -6,7 +6,7 @@ For account and auth workflows, prefer documented `assistant` CLI commands over
|
|
|
6
6
|
any generic account registry:
|
|
7
7
|
|
|
8
8
|
- `assistant credentials ...` for stored secrets and credential metadata
|
|
9
|
-
- `assistant oauth token <
|
|
9
|
+
- `assistant oauth connections token <provider-key>` for OAuth-backed integrations
|
|
10
10
|
- `assistant mcp auth <name>` when an MCP server needs browser login
|
|
11
11
|
- `assistant platform status` for platform-linked deployment/auth context
|
|
12
12
|
|
|
@@ -10,13 +10,10 @@ metadata:
|
|
|
10
10
|
disable-model-invocation: true
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
-
This skill provides the
|
|
14
|
-
the macOS desktop
|
|
13
|
+
This skill provides the computer_use_* action tools for controlling
|
|
14
|
+
the macOS desktop. CU tools run through the main agent loop via HostCuProxy.
|
|
15
15
|
|
|
16
|
-
The
|
|
17
|
-
registry (not this skill) so text_qa sessions can execute it directly.
|
|
18
|
-
|
|
19
|
-
The skill is internally preactivated for computer-use sessions.
|
|
16
|
+
The skill is internally preactivated for sessions with a connected desktop client.
|
|
20
17
|
|
|
21
18
|
Tools in this skill are proxy tools — execution is forwarded to the connected
|
|
22
19
|
macOS client, never handled locally by the assistant.
|
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 1,
|
|
3
3
|
"tools": [
|
|
4
|
+
{
|
|
5
|
+
"name": "computer_use_observe",
|
|
6
|
+
"description": "Capture the current screen state. Returns the accessibility tree with [ID] element references and optionally a screenshot.\n\nThe accessibility tree shows interactive elements like [3] AXButton 'Save' or [17] AXTextField 'Search'. Use element_id to target these elements in subsequent actions — this is much more reliable than pixel coordinates.\n\nCall this before your first computer use action, or to check screen state without acting.",
|
|
7
|
+
"category": "computer-use",
|
|
8
|
+
"risk": "low",
|
|
9
|
+
"input_schema": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"properties": {
|
|
12
|
+
"reason": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"required": ["reason"]
|
|
18
|
+
},
|
|
19
|
+
"executor": "tools/computer-use-observe.ts",
|
|
20
|
+
"execution_target": "host"
|
|
21
|
+
},
|
|
4
22
|
{
|
|
5
23
|
"name": "computer_use_click",
|
|
6
|
-
"description": "Click
|
|
24
|
+
"description": "Click an element on screen. Prefer element_id (from the accessibility tree) over x/y coordinates.",
|
|
7
25
|
"category": "computer-use",
|
|
8
26
|
"risk": "low",
|
|
9
27
|
"input_schema": {
|
|
@@ -42,7 +60,7 @@
|
|
|
42
60
|
},
|
|
43
61
|
{
|
|
44
62
|
"name": "computer_use_type_text",
|
|
45
|
-
"description": "Type text at the current cursor position.
|
|
63
|
+
"description": "Type text at the current cursor position. First click a text field (by element_id) to focus it, then call this tool. If a field shows 'FOCUSED', skip the click.",
|
|
46
64
|
"category": "computer-use",
|
|
47
65
|
"risk": "low",
|
|
48
66
|
"input_schema": {
|
|
@@ -235,7 +253,7 @@
|
|
|
235
253
|
},
|
|
236
254
|
{
|
|
237
255
|
"name": "computer_use_run_applescript",
|
|
238
|
-
"description": "
|
|
256
|
+
"description": "Run an AppleScript command. Prefer this over click/type when possible \u2014 it doesn't move the cursor or interrupt the user. Never use 'do shell script' inside AppleScript (blocked for security).",
|
|
239
257
|
"category": "computer-use",
|
|
240
258
|
"risk": "low",
|
|
241
259
|
"input_schema": {
|
|
@@ -261,7 +279,7 @@
|
|
|
261
279
|
},
|
|
262
280
|
{
|
|
263
281
|
"name": "computer_use_done",
|
|
264
|
-
"description": "
|
|
282
|
+
"description": "Signal that the computer use task is complete. Provide a summary of what was accomplished. This ends the computer use session.",
|
|
265
283
|
"category": "computer-use",
|
|
266
284
|
"risk": "low",
|
|
267
285
|
"input_schema": {
|
|
@@ -283,7 +301,7 @@
|
|
|
283
301
|
},
|
|
284
302
|
{
|
|
285
303
|
"name": "computer_use_respond",
|
|
286
|
-
"description": "Respond
|
|
304
|
+
"description": "Respond to the user with a text answer instead of performing computer actions. Use this when you can answer directly without interacting with the screen.",
|
|
287
305
|
"category": "computer-use",
|
|
288
306
|
"risk": "low",
|
|
289
307
|
"input_schema": {
|
|
@@ -8,9 +8,5 @@ export async function run(
|
|
|
8
8
|
input: Record<string, unknown>,
|
|
9
9
|
context: ToolContext,
|
|
10
10
|
): Promise<ToolExecutionResult> {
|
|
11
|
-
return forwardComputerUseProxyTool(
|
|
12
|
-
"computer_use_request_control",
|
|
13
|
-
input,
|
|
14
|
-
context,
|
|
15
|
-
);
|
|
11
|
+
return forwardComputerUseProxyTool("computer_use_observe", input, context);
|
|
16
12
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { OAuthConnection } from "../../../oauth/connection.js";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
const GOOGLE_CALENDAR_BASE_URL = "https://www.googleapis.com/calendar/v3";
|
|
3
4
|
import type {
|
|
4
5
|
CalendarEvent,
|
|
5
6
|
CalendarEventsListResponse,
|
|
@@ -23,6 +24,7 @@ async function request<T>(
|
|
|
23
24
|
connection: OAuthConnection,
|
|
24
25
|
path: string,
|
|
25
26
|
options?: RequestInit,
|
|
27
|
+
query?: Record<string, string | string[]>,
|
|
26
28
|
): Promise<T> {
|
|
27
29
|
const method = (options?.method ?? "GET").toUpperCase();
|
|
28
30
|
|
|
@@ -65,6 +67,7 @@ async function request<T>(
|
|
|
65
67
|
const resp = await connection.request({
|
|
66
68
|
method,
|
|
67
69
|
path,
|
|
70
|
+
query,
|
|
68
71
|
baseUrl: GOOGLE_CALENDAR_BASE_URL,
|
|
69
72
|
headers: {
|
|
70
73
|
"Content-Type": "application/json",
|
|
@@ -106,29 +109,31 @@ export async function listEvents(
|
|
|
106
109
|
syncToken?: string;
|
|
107
110
|
},
|
|
108
111
|
): Promise<CalendarEventsListResponse> {
|
|
109
|
-
const
|
|
112
|
+
const query: Record<string, string> = {};
|
|
110
113
|
|
|
111
|
-
if (options?.timeMin)
|
|
112
|
-
if (options?.timeMax)
|
|
113
|
-
|
|
114
|
-
if (options?.query)
|
|
114
|
+
if (options?.timeMin) query.timeMin = options.timeMin;
|
|
115
|
+
if (options?.timeMax) query.timeMax = options.timeMax;
|
|
116
|
+
query.maxResults = String(options?.maxResults ?? 25);
|
|
117
|
+
if (options?.query) query.q = options.query;
|
|
115
118
|
|
|
116
119
|
// Default to expanding recurring events into instances
|
|
117
120
|
const singleEvents = options?.singleEvents ?? true;
|
|
118
|
-
|
|
121
|
+
query.singleEvents = String(singleEvents);
|
|
119
122
|
|
|
120
123
|
if (singleEvents && options?.orderBy) {
|
|
121
|
-
|
|
124
|
+
query.orderBy = options.orderBy;
|
|
122
125
|
} else if (singleEvents) {
|
|
123
|
-
|
|
126
|
+
query.orderBy = "startTime";
|
|
124
127
|
}
|
|
125
128
|
|
|
126
|
-
if (options?.pageToken)
|
|
127
|
-
if (options?.syncToken)
|
|
129
|
+
if (options?.pageToken) query.pageToken = options.pageToken;
|
|
130
|
+
if (options?.syncToken) query.syncToken = options.syncToken;
|
|
128
131
|
|
|
129
132
|
return request<CalendarEventsListResponse>(
|
|
130
133
|
connection,
|
|
131
|
-
`/calendars/${encodeURIComponent(calendarId)}/events
|
|
134
|
+
`/calendars/${encodeURIComponent(calendarId)}/events`,
|
|
135
|
+
undefined,
|
|
136
|
+
query,
|
|
132
137
|
);
|
|
133
138
|
}
|
|
134
139
|
|
|
@@ -160,14 +165,14 @@ export async function createEvent(
|
|
|
160
165
|
calendarId = "primary",
|
|
161
166
|
sendUpdates: "all" | "externalOnly" | "none" = "all",
|
|
162
167
|
): Promise<CalendarEvent> {
|
|
163
|
-
const params = new URLSearchParams({ sendUpdates });
|
|
164
168
|
return request<CalendarEvent>(
|
|
165
169
|
connection,
|
|
166
|
-
`/calendars/${encodeURIComponent(calendarId)}/events
|
|
170
|
+
`/calendars/${encodeURIComponent(calendarId)}/events`,
|
|
167
171
|
{
|
|
168
172
|
method: "POST",
|
|
169
173
|
body: JSON.stringify(event),
|
|
170
174
|
},
|
|
175
|
+
{ sendUpdates },
|
|
171
176
|
);
|
|
172
177
|
}
|
|
173
178
|
|
|
@@ -186,16 +191,16 @@ export async function patchEvent(
|
|
|
186
191
|
calendarId = "primary",
|
|
187
192
|
sendUpdates: "all" | "externalOnly" | "none" = "all",
|
|
188
193
|
): Promise<CalendarEvent> {
|
|
189
|
-
const params = new URLSearchParams({ sendUpdates });
|
|
190
194
|
return request<CalendarEvent>(
|
|
191
195
|
connection,
|
|
192
196
|
`/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(
|
|
193
197
|
eventId,
|
|
194
|
-
)}
|
|
198
|
+
)}`,
|
|
195
199
|
{
|
|
196
200
|
method: "PATCH",
|
|
197
201
|
body: JSON.stringify(updates),
|
|
198
202
|
},
|
|
203
|
+
{ sendUpdates },
|
|
199
204
|
);
|
|
200
205
|
}
|
|
201
206
|
|
|
@@ -6,7 +6,6 @@ import type { MessagingProvider } from "../../../../messaging/provider.js";
|
|
|
6
6
|
import {
|
|
7
7
|
getConnectedProviders,
|
|
8
8
|
getMessagingProvider,
|
|
9
|
-
isPlatformEnabled,
|
|
10
9
|
} from "../../../../messaging/registry.js";
|
|
11
10
|
import type { OAuthConnection } from "../../../../oauth/connection.js";
|
|
12
11
|
import { resolveOAuthConnection } from "../../../../oauth/connection-resolver.js";
|
|
@@ -110,9 +109,7 @@ export function extractEmail(address: string): string {
|
|
|
110
109
|
export function resolveProvider(platformInput?: string): MessagingProvider {
|
|
111
110
|
if (platformInput) return getMessagingProvider(platformInput);
|
|
112
111
|
|
|
113
|
-
const connected = getConnectedProviders()
|
|
114
|
-
isPlatformEnabled(p.id),
|
|
115
|
-
);
|
|
112
|
+
const connected = getConnectedProviders();
|
|
116
113
|
if (connected.length === 1) return connected[0];
|
|
117
114
|
if (connected.length === 0) {
|
|
118
115
|
throw new Error(
|
|
@@ -9,4 +9,4 @@ metadata:
|
|
|
9
9
|
user-invocable: true
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
-
Tools for managing assistant settings: voice configuration (TTS voice, PTT activation key,
|
|
12
|
+
Tools for managing assistant settings: voice configuration (TTS voice, PTT activation key, conversation timeout), avatar generation, system settings navigation, and in-app settings tab navigation.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"tools": [
|
|
4
4
|
{
|
|
5
5
|
"name": "voice_config_update",
|
|
6
|
-
"description": "Update a voice configuration setting (TTS voice ID, PTT activation key,
|
|
6
|
+
"description": "Update a voice configuration setting (TTS voice ID, PTT activation key, conversation timeout). Changes take effect immediately.",
|
|
7
7
|
"category": "system",
|
|
8
8
|
"risk": "low",
|
|
9
9
|
"input_schema": {
|
|
@@ -11,13 +11,7 @@
|
|
|
11
11
|
"properties": {
|
|
12
12
|
"setting": {
|
|
13
13
|
"type": "string",
|
|
14
|
-
"enum": [
|
|
15
|
-
"activation_key",
|
|
16
|
-
"wake_word_enabled",
|
|
17
|
-
"wake_word_keyword",
|
|
18
|
-
"wake_word_timeout",
|
|
19
|
-
"tts_voice_id"
|
|
20
|
-
],
|
|
14
|
+
"enum": ["activation_key", "conversation_timeout", "tts_voice_id"],
|
|
21
15
|
"description": "The voice setting to change"
|
|
22
16
|
},
|
|
23
17
|
"value": {
|
|
@@ -18,16 +18,8 @@ const VOICE_SETTINGS = {
|
|
|
18
18
|
userDefaultsKey: "pttActivationKey",
|
|
19
19
|
type: "string" as const,
|
|
20
20
|
},
|
|
21
|
-
|
|
22
|
-
userDefaultsKey: "
|
|
23
|
-
type: "boolean" as const,
|
|
24
|
-
},
|
|
25
|
-
wake_word_keyword: {
|
|
26
|
-
userDefaultsKey: "wakeWordKeyword",
|
|
27
|
-
type: "string" as const,
|
|
28
|
-
},
|
|
29
|
-
wake_word_timeout: {
|
|
30
|
-
userDefaultsKey: "wakeWordTimeoutSeconds",
|
|
21
|
+
conversation_timeout: {
|
|
22
|
+
userDefaultsKey: "voiceConversationTimeoutSeconds",
|
|
31
23
|
type: "number" as const,
|
|
32
24
|
},
|
|
33
25
|
tts_voice_id: { userDefaultsKey: "ttsVoiceId", type: "string" as const },
|
|
@@ -41,9 +33,7 @@ const VALID_TIMEOUTS = [5, 10, 15, 30, 60];
|
|
|
41
33
|
|
|
42
34
|
const FRIENDLY_NAMES: Record<VoiceSettingName, string> = {
|
|
43
35
|
activation_key: "PTT activation key",
|
|
44
|
-
|
|
45
|
-
wake_word_keyword: "Wake word keyword",
|
|
46
|
-
wake_word_timeout: "Wake word timeout",
|
|
36
|
+
conversation_timeout: "Conversation timeout",
|
|
47
37
|
tts_voice_id: "ElevenLabs voice",
|
|
48
38
|
};
|
|
49
39
|
|
|
@@ -76,30 +66,12 @@ function validateSetting(
|
|
|
76
66
|
}
|
|
77
67
|
return { ok: true, coerced: result.value };
|
|
78
68
|
}
|
|
79
|
-
case "
|
|
80
|
-
if (typeof value === "boolean") return { ok: true, coerced: value };
|
|
81
|
-
if (value === "true") return { ok: true, coerced: true };
|
|
82
|
-
if (value === "false") return { ok: true, coerced: false };
|
|
83
|
-
return {
|
|
84
|
-
ok: false,
|
|
85
|
-
error: 'wake_word_enabled must be a boolean (or "true"/"false" string)',
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
case "wake_word_keyword": {
|
|
89
|
-
if (typeof value !== "string" || value.trim().length === 0) {
|
|
90
|
-
return {
|
|
91
|
-
ok: false,
|
|
92
|
-
error: "wake_word_keyword must be a non-empty string",
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
return { ok: true, coerced: value.trim() };
|
|
96
|
-
}
|
|
97
|
-
case "wake_word_timeout": {
|
|
69
|
+
case "conversation_timeout": {
|
|
98
70
|
const num = typeof value === "number" ? value : Number(value);
|
|
99
71
|
if (Number.isNaN(num) || !VALID_TIMEOUTS.includes(num)) {
|
|
100
72
|
return {
|
|
101
73
|
ok: false,
|
|
102
|
-
error: `
|
|
74
|
+
error: `conversation_timeout must be one of: ${VALID_TIMEOUTS.join(
|
|
103
75
|
", ",
|
|
104
76
|
)}`,
|
|
105
77
|
};
|
|
@@ -48,6 +48,7 @@ import * as computerUseClick from "./bundled-skills/computer-use/tools/computer-
|
|
|
48
48
|
import * as computerUseDone from "./bundled-skills/computer-use/tools/computer-use-done.js";
|
|
49
49
|
import * as computerUseDrag from "./bundled-skills/computer-use/tools/computer-use-drag.js";
|
|
50
50
|
import * as computerUseKey from "./bundled-skills/computer-use/tools/computer-use-key.js";
|
|
51
|
+
import * as computerUseObserve from "./bundled-skills/computer-use/tools/computer-use-observe.js";
|
|
51
52
|
import * as computerUseOpenApp from "./bundled-skills/computer-use/tools/computer-use-open-app.js";
|
|
52
53
|
import * as computerUseRespond from "./bundled-skills/computer-use/tools/computer-use-respond.js";
|
|
53
54
|
import * as computerUseRunApplescript from "./bundled-skills/computer-use/tools/computer-use-run-applescript.js";
|
|
@@ -88,8 +89,6 @@ import * as calendarListEvents from "./bundled-skills/google-calendar/tools/cale
|
|
|
88
89
|
import * as calendarRsvp from "./bundled-skills/google-calendar/tools/calendar-rsvp.js";
|
|
89
90
|
// ── image-studio ───────────────────────────────────────────────────────────────
|
|
90
91
|
import * as mediaGenerateImage from "./bundled-skills/image-studio/tools/media-generate-image.js";
|
|
91
|
-
// ── knowledge-graph ────────────────────────────────────────────────────────────
|
|
92
|
-
import * as graphQuery from "./bundled-skills/knowledge-graph/tools/graph-query.js";
|
|
93
92
|
// ── media-processing ───────────────────────────────────────────────────────────
|
|
94
93
|
import * as analyzeKeyframes from "./bundled-skills/media-processing/tools/analyze-keyframes.js";
|
|
95
94
|
import * as extractKeyframes from "./bundled-skills/media-processing/tools/extract-keyframes.js";
|
|
@@ -219,6 +218,7 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
|
|
|
219
218
|
["claude-code:tools/claude-code.ts", claudeCode],
|
|
220
219
|
|
|
221
220
|
// computer-use
|
|
221
|
+
["computer-use:tools/computer-use-observe.ts", computerUseObserve],
|
|
222
222
|
["computer-use:tools/computer-use-click.ts", computerUseClick],
|
|
223
223
|
["computer-use:tools/computer-use-type-text.ts", computerUseTypeText],
|
|
224
224
|
["computer-use:tools/computer-use-key.ts", computerUseKey],
|
|
@@ -276,9 +276,6 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
|
|
|
276
276
|
// image-studio
|
|
277
277
|
["image-studio:tools/media-generate-image.ts", mediaGenerateImage],
|
|
278
278
|
|
|
279
|
-
// knowledge-graph
|
|
280
|
-
["knowledge-graph:tools/graph-query.ts", graphQuery],
|
|
281
|
-
|
|
282
279
|
// media-processing
|
|
283
280
|
["media-processing:tools/ingest-media.ts", ingestMedia],
|
|
284
281
|
["media-processing:tools/media-status.ts", mediaStatus],
|
|
@@ -24,13 +24,6 @@ function flag(name: string): boolean {
|
|
|
24
24
|
return raw === "true" || raw === "1";
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
function flagTriState(name: string): boolean | undefined {
|
|
28
|
-
const raw = str(name);
|
|
29
|
-
if (raw === "true" || raw === "1") return true;
|
|
30
|
-
if (raw === "false" || raw === "0") return false;
|
|
31
|
-
return undefined;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
27
|
// ── Registry ─────────────────────────────────────────────────────────────────
|
|
35
28
|
// Each entry documents the env var name, type, default, and purpose.
|
|
36
29
|
|
|
@@ -43,62 +36,6 @@ export function getBaseDataDir(): string | undefined {
|
|
|
43
36
|
return str("BASE_DATA_DIR");
|
|
44
37
|
}
|
|
45
38
|
|
|
46
|
-
/**
|
|
47
|
-
* VELLUM_DAEMON_TCP_PORT — number, default: 8765
|
|
48
|
-
* TCP port for the daemon's TCP listener (used by iOS clients).
|
|
49
|
-
*/
|
|
50
|
-
export function getDaemonTcpPort(): number {
|
|
51
|
-
const raw = str("VELLUM_DAEMON_TCP_PORT");
|
|
52
|
-
if (raw) {
|
|
53
|
-
const port = parseInt(raw, 10);
|
|
54
|
-
if (!isNaN(port) && port > 0 && port <= 65535) return port;
|
|
55
|
-
}
|
|
56
|
-
return 8765;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* VELLUM_DAEMON_TCP_ENABLED — boolean tri-state, default: undefined (falls back to flag file)
|
|
61
|
-
* Whether the daemon TCP listener should be active.
|
|
62
|
-
* 'true'/'1' → on, 'false'/'0' → off, unset → check flag file.
|
|
63
|
-
*/
|
|
64
|
-
export function getDaemonTcpEnabled(): boolean | undefined {
|
|
65
|
-
return flagTriState("VELLUM_DAEMON_TCP_ENABLED");
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* VELLUM_DAEMON_TCP_HOST — string, default: context-dependent (127.0.0.1 or 0.0.0.0)
|
|
70
|
-
* Hostname/address for the TCP listener. When unset, platform.ts resolves
|
|
71
|
-
* based on whether iOS pairing is enabled.
|
|
72
|
-
*/
|
|
73
|
-
export function getDaemonTcpHost(): string | undefined {
|
|
74
|
-
return str("VELLUM_DAEMON_TCP_HOST");
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* VELLUM_DAEMON_IOS_PAIRING — boolean tri-state, default: undefined (falls back to flag file)
|
|
79
|
-
* Whether iOS pairing mode is enabled. When on, TCP binds to 0.0.0.0.
|
|
80
|
-
* 'true'/'1' → on, 'false'/'0' → off, unset → check flag file.
|
|
81
|
-
*/
|
|
82
|
-
export function getDaemonIosPairing(): boolean | undefined {
|
|
83
|
-
return flagTriState("VELLUM_DAEMON_IOS_PAIRING");
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* VELLUM_DEBUG — boolean, default: false
|
|
88
|
-
* Enables debug-level logging and verbose output.
|
|
89
|
-
*/
|
|
90
|
-
export function getDebugMode(): boolean {
|
|
91
|
-
return flag("VELLUM_DEBUG");
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* VELLUM_LOG_STDERR — boolean, default: false
|
|
96
|
-
* Forces logger output to stderr instead of log files.
|
|
97
|
-
*/
|
|
98
|
-
export function getLogStderr(): boolean {
|
|
99
|
-
return flag("VELLUM_LOG_STDERR");
|
|
100
|
-
}
|
|
101
|
-
|
|
102
39
|
/**
|
|
103
40
|
* DEBUG_STDOUT_LOGS — boolean, default: false
|
|
104
41
|
* Enables additional log output to stdout (alongside file logging).
|
|
@@ -107,14 +44,6 @@ export function getDebugStdoutLogs(): boolean {
|
|
|
107
44
|
return flag("DEBUG_STDOUT_LOGS");
|
|
108
45
|
}
|
|
109
46
|
|
|
110
|
-
/**
|
|
111
|
-
* VELLUM_ENABLE_MONITORING — boolean, default: false
|
|
112
|
-
* Enables monitoring/telemetry (Logfire, etc.).
|
|
113
|
-
*/
|
|
114
|
-
export function getEnableMonitoring(): boolean {
|
|
115
|
-
return flag("VELLUM_ENABLE_MONITORING");
|
|
116
|
-
}
|
|
117
|
-
|
|
118
47
|
/**
|
|
119
48
|
* IS_CONTAINERIZED — boolean, default: false
|
|
120
49
|
* When true, indicates the assistant is running inside a container (e.g. Docker).
|
|
@@ -132,24 +61,26 @@ export function getIsContainerized(): boolean {
|
|
|
132
61
|
* to warn about typos or unrecognized variables.
|
|
133
62
|
*/
|
|
134
63
|
const KNOWN_VELLUM_VARS = new Set([
|
|
135
|
-
"
|
|
136
|
-
"
|
|
137
|
-
"
|
|
138
|
-
"
|
|
139
|
-
"VELLUM_DAEMON_NOAUTH",
|
|
64
|
+
"VELLUM_ASSISTANT_NAME",
|
|
65
|
+
"VELLUM_AWS_ROLE_ARN",
|
|
66
|
+
"VELLUM_CLAUDE_CODE_DEPTH",
|
|
67
|
+
"VELLUM_CUSTOM_QR_CODE_PATH",
|
|
140
68
|
"VELLUM_DAEMON_AUTOSTART",
|
|
141
|
-
"
|
|
142
|
-
"
|
|
143
|
-
"
|
|
69
|
+
"VELLUM_DAEMON_NOAUTH",
|
|
70
|
+
"VELLUM_DATA_DIR",
|
|
71
|
+
"VELLUM_DESKTOP_APP",
|
|
72
|
+
"VELLUM_DEV",
|
|
73
|
+
"VELLUM_ENABLE_INSECURE_LAN_PAIRING",
|
|
74
|
+
"VELLUM_HATCHED_BY",
|
|
144
75
|
"VELLUM_HOOK_EVENT",
|
|
145
76
|
"VELLUM_HOOK_NAME",
|
|
146
77
|
"VELLUM_HOOK_SETTINGS",
|
|
78
|
+
"VELLUM_LOCKFILE_DIR",
|
|
79
|
+
"VELLUM_PLATFORM_URL",
|
|
147
80
|
"VELLUM_ROOT_DIR",
|
|
148
|
-
"
|
|
149
|
-
"VELLUM_CLAUDE_CODE_DEPTH",
|
|
150
|
-
"VELLUM_ASSISTANT_PLATFORM_URL",
|
|
81
|
+
"VELLUM_SSH_USER",
|
|
151
82
|
"VELLUM_UNSAFE_AUTH_BYPASS",
|
|
152
|
-
"
|
|
83
|
+
"VELLUM_WORKSPACE_DIR",
|
|
153
84
|
]);
|
|
154
85
|
|
|
155
86
|
/**
|
package/src/config/env.ts
CHANGED
|
@@ -8,17 +8,13 @@
|
|
|
8
8
|
* - Fail-fast validation via validateEnv() at startup
|
|
9
9
|
* - Shared derived values (e.g. gateway base URL) instead of duplicated logic
|
|
10
10
|
*
|
|
11
|
-
* Bootstrap-level env vars (BASE_DATA_DIR,
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* without circular imports.
|
|
11
|
+
* Bootstrap-level env vars (BASE_DATA_DIR, DEBUG_STDOUT_LOGS) are defined
|
|
12
|
+
* in config/env-registry.ts which has no internal dependencies and can be
|
|
13
|
+
* imported from platform/logger without circular imports.
|
|
15
14
|
*/
|
|
16
15
|
|
|
17
16
|
import { getLogger } from "../util/logger.js";
|
|
18
|
-
import {
|
|
19
|
-
checkUnrecognizedEnvVars,
|
|
20
|
-
getEnableMonitoring,
|
|
21
|
-
} from "./env-registry.js";
|
|
17
|
+
import { checkUnrecognizedEnvVars } from "./env-registry.js";
|
|
22
18
|
|
|
23
19
|
const log = getLogger("env");
|
|
24
20
|
|
|
@@ -55,33 +51,23 @@ export function getGatewayPort(): number {
|
|
|
55
51
|
return int("GATEWAY_PORT", DEFAULT_GATEWAY_PORT);
|
|
56
52
|
}
|
|
57
53
|
|
|
58
|
-
/**
|
|
59
|
-
* Resolve the gateway base URL for internal service-to-service calls.
|
|
60
|
-
* Prefers GATEWAY_INTERNAL_BASE_URL if set, then INTERNAL_GATEWAY_BASE_URL
|
|
61
|
-
* (used by skill subprocesses), otherwise derives from port.
|
|
62
|
-
*/
|
|
54
|
+
/** Resolve the gateway base URL for internal service-to-service calls. */
|
|
63
55
|
export function getGatewayInternalBaseUrl(): string {
|
|
64
|
-
const explicit = str("GATEWAY_INTERNAL_BASE_URL");
|
|
65
|
-
if (explicit) return explicit.replace(/\/+$/, "");
|
|
66
|
-
const skillInjected = str("INTERNAL_GATEWAY_BASE_URL");
|
|
67
|
-
if (skillInjected) return skillInjected.replace(/\/+$/, "");
|
|
68
56
|
return `http://127.0.0.1:${getGatewayPort()}`;
|
|
69
57
|
}
|
|
70
58
|
|
|
71
59
|
// ── Ingress ──────────────────────────────────────────────────────────────────
|
|
72
60
|
|
|
73
|
-
|
|
61
|
+
let _ingressPublicBaseUrl: string | undefined;
|
|
62
|
+
|
|
63
|
+
/** Read the ingress public base URL (module-level state, mutated at runtime by config handlers). */
|
|
74
64
|
export function getIngressPublicBaseUrl(): string | undefined {
|
|
75
|
-
return
|
|
65
|
+
return _ingressPublicBaseUrl;
|
|
76
66
|
}
|
|
77
67
|
|
|
78
|
-
/** Set or clear the
|
|
68
|
+
/** Set or clear the ingress public base URL (used by config handlers). */
|
|
79
69
|
export function setIngressPublicBaseUrl(value: string | undefined): void {
|
|
80
|
-
|
|
81
|
-
process.env.INGRESS_PUBLIC_BASE_URL = value;
|
|
82
|
-
} else {
|
|
83
|
-
delete process.env.INGRESS_PUBLIC_BASE_URL;
|
|
84
|
-
}
|
|
70
|
+
_ingressPublicBaseUrl = value;
|
|
85
71
|
}
|
|
86
72
|
|
|
87
73
|
// ── Runtime HTTP ─────────────────────────────────────────────────────────────
|
|
@@ -117,37 +103,12 @@ export function hasUngatedHttpAuthDisabled(): boolean {
|
|
|
117
103
|
return str("VELLUM_UNSAFE_AUTH_BYPASS")?.trim() !== "1";
|
|
118
104
|
}
|
|
119
105
|
|
|
120
|
-
// ── Twilio ───────────────────────────────────────────────────────────────────
|
|
121
|
-
|
|
122
|
-
export function getTwilioPhoneNumberEnv(): string | undefined {
|
|
123
|
-
return str("TWILIO_PHONE_NUMBER");
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export function getTwilioUserPhoneNumber(): string | undefined {
|
|
127
|
-
return str("TWILIO_USER_PHONE_NUMBER");
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export function isTwilioWebhookValidationDisabled(): boolean {
|
|
131
|
-
// Intentionally strict: only exact "true" disables validation (not "1").
|
|
132
|
-
// This is a security-sensitive bypass — we don't want environments that
|
|
133
|
-
// template booleans as "1" to silently skip webhook signature checks.
|
|
134
|
-
return process.env.TWILIO_WEBHOOK_VALIDATION_DISABLED === "true";
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export function getCallWelcomeGreeting(): string | undefined {
|
|
138
|
-
return str("CALL_WELCOME_GREETING");
|
|
139
|
-
}
|
|
140
|
-
|
|
141
106
|
// ── Monitoring ───────────────────────────────────────────────────────────────
|
|
142
107
|
|
|
143
108
|
export function getLogfireToken(): string | undefined {
|
|
144
109
|
return str("LOGFIRE_TOKEN");
|
|
145
110
|
}
|
|
146
111
|
|
|
147
|
-
export function isMonitoringEnabled(): boolean {
|
|
148
|
-
return getEnableMonitoring();
|
|
149
|
-
}
|
|
150
|
-
|
|
151
112
|
const DEFAULT_SENTRY_DSN =
|
|
152
113
|
"https://db2d38a082e4ee35eeaea08c44b376ec@o4504590528675840.ingest.us.sentry.io/4510874712276992";
|
|
153
114
|
|