@vellumai/assistant 0.5.16 → 0.6.1
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/AGENTS.md +4 -0
- package/ARCHITECTURE.md +69 -16
- package/Dockerfile +2 -5
- package/bun.lock +6 -2
- package/docker-entrypoint.sh +32 -1
- package/docs/architecture/integrations.md +1 -1
- package/docs/architecture/memory.md +21 -24
- package/knip.json +2 -1
- package/openapi.yaml +1198 -83
- package/package.json +5 -1
- package/src/__tests__/actor-token-service.test.ts +68 -0
- package/src/__tests__/agent-loop.test.ts +0 -32
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
- package/src/__tests__/anthropic-provider.test.ts +217 -98
- package/src/__tests__/app-compiler.test.ts +120 -0
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +47 -1
- package/src/__tests__/app-source-watcher.test.ts +159 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
- package/src/__tests__/call-conversation-messages.test.ts +2 -6
- package/src/__tests__/call-domain.test.ts +2 -6
- package/src/__tests__/call-pointer-messages.test.ts +2 -14
- package/src/__tests__/call-recovery.test.ts +2 -6
- package/src/__tests__/call-routes-http.test.ts +2 -6
- package/src/__tests__/call-store.test.ts +2 -6
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +2 -6
- package/src/__tests__/canonical-guardian-store.test.ts +2 -6
- package/src/__tests__/channel-delivery-store.test.ts +2 -6
- package/src/__tests__/channel-retry-sweep.test.ts +2 -6
- package/src/__tests__/checker.test.ts +63 -9
- package/src/__tests__/clawhub.test.ts +54 -24
- package/src/__tests__/cli-command-risk-guard.test.ts +14 -0
- package/src/__tests__/config-schema.test.ts +6 -1
- package/src/__tests__/config-set-platform-guard.test.ts +302 -0
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +2 -6
- package/src/__tests__/contacts-tools.test.ts +31 -0
- package/src/__tests__/context-overflow-reducer.test.ts +86 -0
- package/src/__tests__/context-token-estimator.test.ts +175 -10
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +13 -6
- package/src/__tests__/conversation-agent-loop.test.ts +13 -51
- package/src/__tests__/conversation-attachments.test.ts +2 -6
- package/src/__tests__/conversation-attention-store.test.ts +2 -6
- package/src/__tests__/conversation-clear-safety.test.ts +2 -6
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +4 -10
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -6
- package/src/__tests__/conversation-disk-view.test.ts +2 -6
- package/src/__tests__/conversation-error.test.ts +33 -2
- package/src/__tests__/conversation-fork-crud.test.ts +2 -6
- package/src/__tests__/conversation-history-web-search.test.ts +6 -1
- package/src/__tests__/conversation-load-history-repair.test.ts +5 -1
- package/src/__tests__/conversation-media-retry.test.ts +91 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +653 -832
- package/src/__tests__/conversation-runtime-workspace.test.ts +1 -93
- package/src/__tests__/conversation-starter-routes.test.ts +20 -11
- package/src/__tests__/conversation-store.test.ts +2 -6
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +17 -4
- package/src/__tests__/conversation-usage.test.ts +2 -6
- package/src/__tests__/conversation-wipe.test.ts +13 -414
- package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -12
- package/src/__tests__/conversation-workspace-injection.test.ts +25 -26
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
- package/src/__tests__/copy-composer-tc-templates.test.ts +335 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +3 -3
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +2 -2
- package/src/__tests__/credential-security-e2e.test.ts +2 -0
- package/src/__tests__/date-context.test.ts +76 -210
- package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -1
- package/src/__tests__/file-list-tool.test.ts +219 -0
- package/src/__tests__/first-greeting.test.ts +1 -1
- package/src/__tests__/followup-tools.test.ts +2 -6
- package/src/__tests__/graph-extraction-event-date.test.ts +186 -0
- package/src/__tests__/guardian-action-conversation-turn.test.ts +2 -6
- package/src/__tests__/guardian-action-followup-executor.test.ts +2 -6
- package/src/__tests__/guardian-action-followup-store.test.ts +2 -6
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +2 -6
- package/src/__tests__/guardian-action-late-reply.test.ts +2 -6
- package/src/__tests__/guardian-action-store.test.ts +2 -6
- package/src/__tests__/guardian-binding-drift-heal.test.ts +2 -6
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +8 -8
- package/src/__tests__/guardian-dispatch.test.ts +2 -6
- package/src/__tests__/guardian-grant-minting.test.ts +2 -14
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +2 -6
- package/src/__tests__/guardian-routing-invariants.test.ts +192 -6
- package/src/__tests__/guardian-routing-state.test.ts +2 -6
- package/src/__tests__/guardian-verification-voice-binding.test.ts +2 -6
- package/src/__tests__/heartbeat-service.test.ts +180 -3
- package/src/__tests__/identity-routes.test.ts +328 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +2 -6
- package/src/__tests__/injection-block.test.ts +178 -0
- package/src/__tests__/install-meta.test.ts +506 -0
- package/src/__tests__/install-skill-routing.test.ts +293 -0
- package/src/__tests__/invite-redemption-service.test.ts +2 -6
- package/src/__tests__/invite-routes-http.test.ts +2 -6
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +17 -28
- package/src/__tests__/list-messages-attachments.test.ts +2 -6
- package/src/__tests__/list-messages-tool-merge.test.ts +300 -0
- package/src/__tests__/llm-context-normalization.test.ts +18 -18
- package/src/__tests__/llm-context-route-provider.test.ts +103 -6
- package/src/__tests__/llm-request-log-turn-query.test.ts +164 -6
- package/src/__tests__/llm-usage-store.test.ts +2 -6
- package/src/__tests__/log-export-workspace.test.ts +74 -111
- package/src/__tests__/managed-store.test.ts +38 -11
- package/src/__tests__/mcp-abort-signal.test.ts +5 -0
- package/src/__tests__/mcp-client-auth.test.ts +5 -0
- package/src/__tests__/memory-jobs-worker-backoff.test.ts +2 -8
- package/src/__tests__/memory-recall-log-store.test.ts +134 -6
- package/src/__tests__/memory-upsert-concurrency.test.ts +4 -112
- package/src/__tests__/migration-export-streaming.test.ts +304 -0
- package/src/__tests__/migration-import-commit-http.test.ts +11 -10
- package/src/__tests__/mock-fetch.ts +87 -0
- package/src/__tests__/non-member-access-request.test.ts +2 -6
- package/src/__tests__/notification-decision-recipient-context.test.ts +282 -0
- package/src/__tests__/notification-guardian-path.test.ts +2 -6
- package/src/__tests__/oauth-cli.test.ts +364 -2
- package/src/__tests__/oauth2-gateway-transport.test.ts +18 -3
- package/src/__tests__/onboarding-template-contract.test.ts +62 -14
- package/src/__tests__/outlook-attachments.test.ts +301 -0
- package/src/__tests__/outlook-automation-tools.test.ts +425 -0
- package/src/__tests__/outlook-categories.test.ts +212 -0
- package/src/__tests__/outlook-client-automation.test.ts +246 -0
- package/src/__tests__/outlook-compose-tools.test.ts +325 -0
- package/src/__tests__/outlook-declutter-tools.test.ts +585 -0
- package/src/__tests__/outlook-email-watcher.test.ts +322 -0
- package/src/__tests__/outlook-follow-up.test.ts +196 -0
- package/src/__tests__/outlook-messaging-provider.test.ts +498 -3
- package/src/__tests__/outlook-trash.test.ts +77 -0
- package/src/__tests__/outlook-unsubscribe.test.ts +250 -0
- package/src/__tests__/parser.test.ts +32 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +452 -0
- package/src/__tests__/permission-controls-v2-flag.test.ts +55 -0
- package/src/__tests__/permission-mode-sse.test.ts +418 -0
- package/src/__tests__/permission-mode-store.test.ts +277 -0
- package/src/__tests__/permission-mode.test.ts +101 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +359 -0
- package/src/__tests__/platform-callback-registration.test.ts +4 -4
- package/src/__tests__/playbook-execution.test.ts +76 -80
- package/src/__tests__/playbook-tools.test.ts +5 -7
- package/src/__tests__/profiler-routes.test.ts +502 -0
- package/src/__tests__/profiler-run-store.test.ts +441 -0
- package/src/__tests__/provider-error-scenarios.test.ts +21 -0
- package/src/__tests__/proxy-approval-callback.test.ts +4 -75
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +273 -0
- package/src/__tests__/registry.test.ts +3 -3
- package/src/__tests__/require-fresh-approval.test.ts +64 -2
- package/src/__tests__/runtime-events-sse-parity.test.ts +2 -6
- package/src/__tests__/runtime-events-sse.test.ts +2 -6
- package/src/__tests__/sandbox-host-parity.test.ts +5 -4
- package/src/__tests__/schedule-store.test.ts +2 -6
- package/src/__tests__/schedule-tools.test.ts +2 -6
- package/src/__tests__/scheduler-recurrence.test.ts +1 -5
- package/src/__tests__/scheduler-reuse-conversation.test.ts +368 -0
- package/src/__tests__/scoped-approval-grants.test.ts +2 -6
- package/src/__tests__/scoped-grant-security-matrix.test.ts +2 -6
- package/src/__tests__/scrub-corrupted-image-attachments.test.ts +278 -0
- package/src/__tests__/search-skills-unified.test.ts +422 -0
- package/src/__tests__/secret-onetime-send.test.ts +2 -0
- package/src/__tests__/send-endpoint-busy.test.ts +44 -9
- package/src/__tests__/sequence-store.test.ts +2 -6
- package/src/__tests__/server-history-render.test.ts +2 -6
- package/src/__tests__/set-permission-mode.test.ts +274 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +38 -31
- package/src/__tests__/skill-feature-flags.test.ts +6 -6
- package/src/__tests__/skill-load-feature-flag.test.ts +23 -11
- package/src/__tests__/skill-memory.test.ts +2 -741
- package/src/__tests__/skills-uninstall.test.ts +2 -2
- package/src/__tests__/skills.test.ts +1 -1
- package/src/__tests__/slack-inbound-verification.test.ts +2 -6
- package/src/__tests__/strip-memory-injections.test.ts +187 -0
- package/src/__tests__/subagent-detail.test.ts +84 -0
- package/src/__tests__/subagent-disposal.test.ts +308 -0
- package/src/__tests__/subagent-manager-notify.test.ts +19 -10
- package/src/__tests__/subagent-notify-parent.test.ts +390 -0
- package/src/__tests__/subagent-role-registry.test.ts +108 -0
- package/src/__tests__/subagent-tool-filtering.test.ts +71 -0
- package/src/__tests__/subagent-tools.test.ts +464 -4
- package/src/__tests__/system-prompt-ask-mode.test.ts +139 -0
- package/src/__tests__/task-compiler.test.ts +2 -6
- package/src/__tests__/task-management-tools.test.ts +2 -6
- package/src/__tests__/task-memory-cleanup.test.ts +185 -241
- package/src/__tests__/task-runner.test.ts +2 -6
- package/src/__tests__/task-scheduler.test.ts +2 -6
- package/src/__tests__/terminal-tools.test.ts +17 -27
- package/src/__tests__/test-preload.ts +7 -0
- package/src/__tests__/tool-approval-handler.test.ts +2 -6
- package/src/__tests__/tool-executor.test.ts +4 -26
- package/src/__tests__/tool-grant-request-escalation.test.ts +2 -6
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +277 -0
- package/src/__tests__/top-level-renderer.test.ts +10 -13
- package/src/__tests__/trust-store.test.ts +1 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +2 -6
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +118 -8
- package/src/__tests__/trusted-contact-multichannel.test.ts +2 -6
- package/src/__tests__/trusted-contact-verification.test.ts +2 -6
- package/src/__tests__/turn-boundary-resolution.test.ts +2 -6
- package/src/__tests__/usage-cache-backfill-migration.test.ts +1 -6
- package/src/__tests__/usage-routes.test.ts +2 -6
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
- package/src/__tests__/voice-invite-redemption.test.ts +2 -6
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -6
- package/src/__tests__/voice-session-bridge.test.ts +2 -6
- package/src/__tests__/volume-security-guard.test.ts +2 -0
- package/src/__tests__/workspace-lifecycle.test.ts +29 -1
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +2 -6
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +2 -6
- package/src/__tests__/workspace-migration-026-backfill-install-meta.test.ts +558 -0
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +387 -0
- package/src/__tests__/workspace-policy.test.ts +1 -1
- package/src/agent/attachments.ts +7 -2
- package/src/agent/image-optimize.ts +165 -0
- package/src/agent/loop.ts +7 -15
- package/src/approvals/guardian-request-resolvers.ts +24 -0
- package/src/avatar/traits-png-sync.ts +3 -3
- package/src/bundler/app-compiler.ts +179 -2
- package/src/bundler/package-resolver.ts +3 -5
- package/src/cli/__tests__/notifications.test.ts +1 -2
- package/src/cli/__tests__/run-assistant-command.ts +29 -0
- package/src/cli/commands/__tests__/email-download.test.ts +245 -0
- package/src/cli/commands/__tests__/email-list.test.ts +192 -0
- package/src/cli/commands/__tests__/email-register.test.ts +186 -0
- package/src/cli/commands/__tests__/email-send.test.ts +291 -0
- package/src/cli/commands/__tests__/email-status.test.ts +181 -0
- package/src/cli/commands/__tests__/email-unregister.test.ts +139 -0
- package/src/cli/commands/__tests__/routes.test.ts +562 -0
- package/src/cli/commands/avatar.ts +3 -3
- package/src/cli/commands/config.ts +26 -13
- package/src/cli/commands/conversations.ts +1 -8
- package/src/cli/commands/doctor.ts +2 -2
- package/src/cli/commands/email.ts +584 -835
- package/src/cli/commands/memory.ts +37 -84
- package/src/cli/commands/notifications.ts +7 -2
- package/src/cli/commands/oauth/__tests__/connect.test.ts +2 -2
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +2 -2
- package/src/cli/commands/oauth/__tests__/mode.test.ts +8 -1
- package/src/cli/commands/oauth/__tests__/status.test.ts +2 -2
- package/src/cli/commands/oauth/connect.ts +25 -11
- package/src/cli/commands/oauth/mode.ts +7 -0
- package/src/cli/commands/oauth/shared.ts +39 -3
- package/src/cli/commands/platform/__tests__/connect.test.ts +1 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +1 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +5 -5
- package/src/cli/commands/platform/index.ts +16 -16
- package/src/cli/commands/routes.ts +396 -0
- package/src/cli/commands/skills.ts +218 -36
- package/src/cli/commands/trust.ts +2 -2
- package/src/cli/lib/daemon-credential-client.ts +2 -3
- package/src/cli/program.ts +2 -0
- package/src/cli.ts +1 -120
- package/src/config/bundled-skills/acp/TOOLS.json +1 -1
- package/src/config/bundled-skills/app-builder/SKILL.md +4 -1
- package/src/config/bundled-skills/contacts/SKILL.md +0 -1
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -8
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -4
- package/src/config/bundled-skills/gmail/SKILL.md +4 -12
- package/src/config/bundled-skills/google-calendar/SKILL.md +1 -9
- package/src/config/bundled-skills/messaging/SKILL.md +17 -18
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +40 -33
- package/src/config/bundled-skills/outlook/SKILL.md +189 -0
- package/src/config/bundled-skills/outlook/TOOLS.json +530 -0
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +85 -0
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +77 -0
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +84 -0
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +94 -0
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +49 -0
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +237 -0
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +161 -0
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +32 -0
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +272 -0
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +29 -0
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +129 -0
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +87 -0
- package/src/config/bundled-skills/outlook/tools/shared.ts +20 -0
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +51 -0
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +221 -0
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +252 -0
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +53 -0
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +74 -0
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +18 -0
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +46 -0
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +36 -0
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +17 -0
- package/src/config/bundled-skills/outlook-calendar/types.ts +120 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +47 -40
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +16 -29
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +16 -18
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +39 -47
- package/src/config/bundled-skills/schedule/SKILL.md +22 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
- package/src/config/bundled-skills/settings/tools/avatar-get.ts +3 -13
- package/src/config/bundled-skills/settings/tools/avatar-remove.ts +2 -4
- package/src/config/bundled-skills/settings/tools/avatar-update.ts +5 -2
- package/src/config/bundled-skills/slack/SKILL.md +3 -7
- package/src/config/bundled-skills/subagent/SKILL.md +43 -3
- package/src/config/bundled-skills/subagent/TOOLS.json +29 -4
- package/src/config/bundled-tool-registry.ts +56 -4
- package/src/config/env-registry.ts +78 -8
- package/src/config/feature-flag-registry.json +38 -125
- package/src/config/schema.ts +8 -0
- package/src/config/schemas/filing.ts +51 -0
- package/src/config/schemas/heartbeat.ts +15 -12
- package/src/config/schemas/memory-lifecycle.ts +12 -0
- package/src/config/schemas/platform.ts +8 -0
- package/src/config/schemas/security.ts +14 -0
- package/src/config/schemas/timeouts.ts +1 -1
- package/src/config/skills.ts +18 -7
- package/src/context/token-estimator.ts +25 -18
- package/src/context/window-manager.ts +6 -2
- package/src/credential-execution/process-manager.ts +3 -1
- package/src/daemon/app-source-watcher.ts +93 -0
- package/src/daemon/config-watcher.ts +79 -1
- package/src/daemon/context-overflow-reducer.ts +46 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +143 -82
- package/src/daemon/conversation-agent-loop.ts +236 -108
- package/src/daemon/conversation-error.ts +31 -8
- package/src/daemon/conversation-history.ts +4 -19
- package/src/daemon/conversation-lifecycle.ts +36 -9
- package/src/daemon/conversation-media-retry.ts +85 -7
- package/src/daemon/conversation-notifiers.ts +4 -1
- package/src/daemon/conversation-process.ts +13 -7
- package/src/daemon/conversation-runtime-assembly.ts +305 -306
- package/src/daemon/conversation-tool-setup.ts +44 -14
- package/src/daemon/conversation-workspace.ts +1 -2
- package/src/daemon/conversation.ts +59 -2
- package/src/daemon/daemon-control.ts +8 -2
- package/src/daemon/date-context.ts +26 -53
- package/src/daemon/first-greeting.ts +1 -1
- package/src/daemon/handlers/conversations.ts +4 -7
- package/src/daemon/handlers/shared.test.ts +143 -0
- package/src/daemon/handlers/shared.ts +85 -17
- package/src/daemon/handlers/skills.ts +416 -209
- package/src/daemon/lifecycle.ts +212 -131
- package/src/daemon/main.ts +5 -1
- package/src/daemon/message-types/conversations.ts +29 -7
- package/src/daemon/message-types/messages.ts +12 -2
- package/src/daemon/message-types/schedules.ts +1 -0
- package/src/daemon/message-types/settings.ts +6 -0
- package/src/daemon/message-types/skills.ts +97 -36
- package/src/daemon/profiler-run-store.ts +557 -0
- package/src/daemon/providers-setup.ts +5 -0
- package/src/daemon/server.ts +100 -11
- package/src/daemon/shutdown-handlers.ts +5 -0
- package/src/daemon/tool-side-effects.ts +50 -8
- package/src/export/transcript-formatter.ts +148 -0
- package/src/filing/filing-service.ts +228 -0
- package/src/heartbeat/heartbeat-service.ts +97 -7
- package/src/hooks/cli.ts +2 -2
- package/src/hooks/runner.ts +15 -38
- package/src/inbound/platform-callback-registration.ts +14 -14
- package/src/mcp/client.ts +6 -0
- package/src/mcp/mcp-oauth-provider.ts +149 -27
- package/src/memory/admin.ts +42 -75
- package/src/memory/app-store.ts +69 -0
- package/src/memory/conversation-bootstrap.ts +3 -1
- package/src/memory/conversation-crud.ts +211 -288
- package/src/memory/conversation-group-migration.ts +157 -0
- package/src/memory/conversation-queries.ts +61 -13
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/db-init.ts +194 -361
- package/src/memory/embed.ts +73 -0
- package/src/memory/embedding-backend.ts +8 -14
- package/src/memory/embedding-runtime-manager.ts +12 -114
- package/src/memory/fingerprint.ts +2 -2
- package/src/memory/graph/bootstrap.ts +521 -0
- package/src/memory/graph/capability-seed.ts +449 -0
- package/src/memory/graph/consolidation.ts +725 -0
- package/src/memory/graph/conversation-graph-memory.ts +659 -0
- package/src/memory/graph/decay.test.ts +208 -0
- package/src/memory/graph/decay.ts +195 -0
- package/src/memory/graph/extraction-job.ts +74 -0
- package/src/memory/graph/extraction.test.ts +936 -0
- package/src/memory/graph/extraction.ts +1297 -0
- package/src/memory/graph/graph-memory-state-store.ts +37 -0
- package/src/memory/graph/graph-search.ts +280 -0
- package/src/memory/graph/image-ref-utils.ts +29 -0
- package/src/memory/graph/injection.test.ts +513 -0
- package/src/memory/graph/injection.ts +469 -0
- package/src/memory/graph/inspect.ts +543 -0
- package/src/memory/graph/narrative.ts +267 -0
- package/src/memory/graph/pattern-scan.ts +269 -0
- package/src/memory/graph/retriever.ts +1111 -0
- package/src/memory/graph/scoring.test.ts +548 -0
- package/src/memory/graph/scoring.ts +232 -0
- package/src/memory/graph/serendipity.ts +65 -0
- package/src/memory/graph/store.test.ts +1098 -0
- package/src/memory/graph/store.ts +838 -0
- package/src/memory/graph/tool-handlers.ts +301 -0
- package/src/memory/graph/tools.ts +97 -0
- package/src/memory/graph/triggers.test.ts +487 -0
- package/src/memory/graph/triggers.ts +223 -0
- package/src/memory/graph/types.ts +295 -0
- package/src/memory/group-crud.ts +191 -0
- package/src/memory/indexer.ts +37 -19
- package/src/memory/job-handlers/cleanup.ts +32 -42
- package/src/memory/job-handlers/conversation-starters.ts +91 -53
- package/src/memory/job-handlers/embedding.ts +5 -31
- package/src/memory/job-handlers/index-maintenance.ts +23 -11
- package/src/memory/job-handlers/summarization.ts +32 -17
- package/src/memory/job-utils.ts +1 -1
- package/src/memory/jobs-store.ts +21 -31
- package/src/memory/jobs-worker.ts +180 -129
- package/src/memory/llm-request-log-store.ts +96 -12
- package/src/memory/memory-recall-log-store.ts +49 -5
- package/src/memory/message-content.ts +1 -0
- package/src/memory/migrations/202-memory-graph-tables.ts +130 -0
- package/src/memory/migrations/203-drop-memory-items-tables.ts +55 -0
- package/src/memory/migrations/204-rename-memory-graph-type-values.ts +46 -0
- package/src/memory/migrations/205-memory-graph-image-refs.ts +11 -0
- package/src/memory/migrations/206-memory-graph-node-edits.ts +19 -0
- package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +131 -0
- package/src/memory/migrations/207-conversation-graph-memory-state.ts +20 -0
- package/src/memory/migrations/208-conversations-last-message-at.ts +35 -0
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +85 -0
- package/src/memory/migrations/210-schedule-reuse-conversation.ts +13 -0
- package/src/memory/migrations/211-memory-recall-logs-query-context.ts +21 -0
- package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +19 -0
- package/src/memory/migrations/index.ts +12 -0
- package/src/memory/migrations/registry.ts +16 -0
- package/src/memory/qdrant-client.ts +44 -17
- package/src/memory/schema/conversations.ts +14 -0
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/infrastructure.ts +8 -1
- package/src/memory/schema/memory-core.ts +0 -51
- package/src/memory/schema/memory-graph.ts +154 -0
- package/src/memory/search/semantic.ts +47 -91
- package/src/memory/task-memory-cleanup.ts +58 -61
- package/src/messaging/providers/outlook/adapter.ts +8 -1
- package/src/messaging/providers/outlook/client.ts +299 -0
- package/src/messaging/providers/outlook/types.ts +118 -0
- package/src/notifications/adapters/macos.ts +1 -0
- package/src/notifications/copy-composer.ts +95 -0
- package/src/notifications/decision-engine.ts +35 -0
- package/src/notifications/signal.ts +16 -0
- package/src/oauth/seed-providers.ts +2 -1
- package/src/permissions/checker.ts +36 -4
- package/src/permissions/defaults.ts +4 -4
- package/src/permissions/permission-mode-store.ts +180 -0
- package/src/permissions/permission-mode.ts +31 -0
- package/src/permissions/workspace-policy.ts +10 -1
- package/src/playbooks/playbook-compiler.ts +19 -18
- package/src/playbooks/types.ts +4 -3
- package/src/prompts/system-prompt.ts +62 -36
- package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +100 -0
- package/src/prompts/templates/BOOTSTRAP.md +70 -165
- package/src/prompts/templates/HEARTBEAT.md +3 -1
- package/src/prompts/templates/SOUL.md +25 -4
- package/src/prompts/templates/UPDATES.md +8 -0
- package/src/providers/anthropic/client.ts +136 -220
- package/src/providers/gemini/client.ts +1 -1
- package/src/providers/openai/client.ts +1 -1
- package/src/providers/registry.ts +1 -1
- package/src/providers/retry.ts +19 -3
- package/src/runtime/actor-trust-resolver.ts +5 -1
- package/src/runtime/auth/route-policy.ts +30 -0
- package/src/runtime/guardian-reply-router.ts +5 -1
- package/src/runtime/http-server.ts +55 -5
- package/src/runtime/http-types.ts +12 -1
- package/src/runtime/middleware/auth.ts +20 -0
- package/src/runtime/migrations/vbundle-builder.ts +389 -3
- package/src/runtime/migrations/vbundle-importer.ts +8 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +378 -0
- package/src/runtime/routes/app-management-routes.ts +1 -11
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +26 -0
- package/src/runtime/routes/archive-utils.ts +29 -0
- package/src/runtime/routes/attachment-routes.test.ts +106 -0
- package/src/runtime/routes/attachment-routes.ts +106 -16
- package/src/runtime/routes/avatar-routes.ts +2 -9
- package/src/runtime/routes/brain-graph-routes.ts +21 -22
- package/src/runtime/routes/btw-routes.ts +22 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +173 -0
- package/src/runtime/routes/conversation-management-routes.ts +3 -14
- package/src/runtime/routes/conversation-query-routes.ts +49 -3
- package/src/runtime/routes/conversation-routes.ts +264 -44
- package/src/runtime/routes/conversation-starter-routes.ts +2 -2
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/global-search-routes.ts +21 -19
- package/src/runtime/routes/group-routes.ts +207 -0
- package/src/runtime/routes/guardian-action-routes.ts +21 -10
- package/src/runtime/routes/guardian-bootstrap-routes.ts +23 -19
- package/src/runtime/routes/heartbeat-routes.ts +4 -10
- package/src/runtime/routes/identity-routes.ts +53 -18
- package/src/runtime/routes/inbound-message-handler.ts +19 -0
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +292 -0
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +207 -0
- package/src/runtime/routes/llm-context-normalization.ts +14 -10
- package/src/runtime/routes/log-export-routes.ts +23 -275
- package/src/runtime/routes/memory-item-routes.test.ts +170 -247
- package/src/runtime/routes/memory-item-routes.ts +341 -388
- package/src/runtime/routes/migration-routes.ts +18 -7
- package/src/runtime/routes/profiler-routes.ts +350 -0
- package/src/runtime/routes/schedule-routes.ts +28 -11
- package/src/runtime/routes/settings-routes.ts +95 -8
- package/src/runtime/routes/skills-routes.ts +103 -37
- package/src/runtime/routes/subagents-routes.ts +28 -7
- package/src/runtime/routes/user-route-dispatcher.ts +223 -0
- package/src/runtime/routes/user-routes.ts +41 -0
- package/src/runtime/routes/work-items-routes.test.ts +2 -6
- package/src/runtime/routes/workspace-routes.ts +0 -1
- package/src/schedule/schedule-store.ts +30 -0
- package/src/schedule/scheduler.ts +52 -18
- package/src/security/oauth2.ts +1 -1
- package/src/security/secure-keys.ts +4 -8
- package/src/shared/provider-env-vars.ts +19 -0
- package/src/skills/catalog-cache.ts +5 -0
- package/src/skills/catalog-install.ts +25 -16
- package/src/skills/clawhub.ts +134 -154
- package/src/skills/install-meta.ts +208 -0
- package/src/skills/managed-store.ts +29 -18
- package/src/skills/skill-memory.ts +12 -229
- package/src/skills/skillssh-registry.ts +19 -17
- package/src/subagent/index.ts +13 -3
- package/src/subagent/manager.ts +308 -29
- package/src/subagent/types.ts +68 -0
- package/src/tasks/task-runner.ts +7 -5
- package/src/telemetry/usage-telemetry-reporter.test.ts +3 -5
- package/src/tools/apps/executors.ts +29 -4
- package/src/tools/browser/runtime-check.ts +3 -1
- package/src/tools/filesystem/list.ts +93 -0
- package/src/tools/memory/register.ts +63 -46
- package/src/tools/permission-checker.ts +85 -1
- package/src/tools/registry.ts +4 -0
- package/src/tools/schedule/create.ts +3 -0
- package/src/tools/schedule/list.ts +1 -0
- package/src/tools/schedule/update.ts +6 -0
- package/src/tools/shared/filesystem/errors.ts +5 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +90 -2
- package/src/tools/shared/filesystem/image-read.ts +22 -85
- package/src/tools/shared/filesystem/types.ts +17 -0
- package/src/tools/shared/shell-output.ts +31 -2
- package/src/tools/subagent/abort.ts +12 -2
- package/src/tools/subagent/message.ts +9 -2
- package/src/tools/subagent/notify-parent.ts +79 -0
- package/src/tools/subagent/read.ts +29 -8
- package/src/tools/subagent/resolve.ts +21 -0
- package/src/tools/subagent/spawn.ts +2 -0
- package/src/tools/subagent/status.ts +11 -1
- package/src/tools/system/avatar-generator.ts +3 -3
- package/src/tools/system/register.ts +23 -0
- package/src/tools/system/set-permission-mode.ts +103 -0
- package/src/tools/terminal/parser.ts +30 -5
- package/src/tools/terminal/safe-env.ts +17 -1
- package/src/tools/tool-manifest.ts +9 -3
- package/src/tools/types.ts +2 -0
- package/src/util/browser.ts +25 -10
- package/src/util/bun-runtime.ts +172 -0
- package/src/util/logger.ts +1 -1
- package/src/util/platform.ts +50 -17
- package/src/watcher/providers/outlook-calendar.ts +343 -0
- package/src/watcher/providers/outlook.ts +198 -0
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +2 -2
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +2 -2
- package/src/workspace/migrations/025-remove-oauth-app-setup-skills.ts +76 -0
- package/src/workspace/migrations/026-backfill-install-meta.ts +325 -0
- package/src/workspace/migrations/027-remove-orphaned-optimized-images-cache.ts +42 -0
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +270 -0
- package/src/workspace/migrations/029-seed-pkb.ts +84 -0
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/workspace/top-level-renderer.ts +5 -9
- package/src/__tests__/cli-memory.test.ts +0 -372
- package/src/__tests__/clipboard.test.ts +0 -88
- package/src/__tests__/context-memory-e2e.test.ts +0 -415
- package/src/__tests__/journal-context.test.ts +0 -268
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +0 -297
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -459
- package/src/__tests__/memory-query-builder.test.ts +0 -59
- package/src/__tests__/memory-recall-quality.test.ts +0 -1046
- package/src/__tests__/memory-regressions.experimental.test.ts +0 -629
- package/src/__tests__/memory-regressions.test.ts +0 -3696
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -295
- package/src/cli/cli-memory.ts +0 -176
- package/src/daemon/conversation-memory.ts +0 -207
- package/src/memory/conversation-starters-cadence.ts +0 -74
- package/src/memory/items-extractor.ts +0 -860
- package/src/memory/job-handlers/batch-extraction.ts +0 -753
- package/src/memory/job-handlers/extraction.ts +0 -40
- package/src/memory/job-handlers/journal-carry-forward.test.ts +0 -355
- package/src/memory/job-handlers/journal-carry-forward.ts +0 -255
- package/src/memory/journal-memory.ts +0 -224
- package/src/memory/query-builder.ts +0 -47
- package/src/memory/query-expansion.ts +0 -83
- package/src/memory/retriever.test.ts +0 -1592
- package/src/memory/retriever.ts +0 -1331
- package/src/memory/search/formatting.test.ts +0 -140
- package/src/memory/search/formatting.ts +0 -262
- package/src/memory/search/mmr.ts +0 -139
- package/src/memory/search/ranking.ts +0 -15
- package/src/memory/search/staleness.ts +0 -40
- package/src/memory/search/tier-classifier.ts +0 -18
- package/src/memory/search/types.ts +0 -121
- package/src/prompts/journal-context.ts +0 -154
- package/src/tools/memory/definitions.ts +0 -69
- package/src/tools/memory/handlers.test.ts +0 -562
- package/src/tools/memory/handlers.ts +0 -434
- package/src/util/clipboard.ts +0 -34
|
@@ -49,9 +49,29 @@ const SCRIPT_INTERPRETERS = new Set([
|
|
|
49
49
|
"deno",
|
|
50
50
|
"bun",
|
|
51
51
|
]);
|
|
52
|
-
// Flags that make an interpreter
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
// Flags that make an interpreter read code from stdin rather than from a file.
|
|
53
|
+
const STDIN_EXEC_FLAGS = new Set(["-"]);
|
|
54
|
+
// Per-interpreter flags that provide code inline as an argument (e.g.
|
|
55
|
+
// `python -c 'code'`, `node -e 'code'`). When these are present the
|
|
56
|
+
// interpreter is NOT reading code from stdin — stdin is just data, so piping
|
|
57
|
+
// into the interpreter is no more dangerous than piping into grep or jq.
|
|
58
|
+
//
|
|
59
|
+
// This must be interpreter-specific because the same flag can mean different
|
|
60
|
+
// things across interpreters. For example, `perl -c` is syntax-check mode
|
|
61
|
+
// (still reads code from stdin and executes BEGIN blocks), while
|
|
62
|
+
// `python -c` provides inline code. Similarly, `ruby -c` is syntax-check.
|
|
63
|
+
const INTERPRETER_INLINE_CODE_FLAGS: ReadonlyMap<
|
|
64
|
+
string,
|
|
65
|
+
ReadonlySet<string>
|
|
66
|
+
> = new Map([
|
|
67
|
+
["python", new Set(["-c"])],
|
|
68
|
+
["python3", new Set(["-c"])],
|
|
69
|
+
["ruby", new Set(["-e"])],
|
|
70
|
+
["perl", new Set(["-e"])],
|
|
71
|
+
["node", new Set(["-e"])],
|
|
72
|
+
["deno", new Set(["-e"])],
|
|
73
|
+
["bun", new Set(["-e"])],
|
|
74
|
+
]);
|
|
55
75
|
// Per-interpreter flags that consume the next argument as a value (not a filename).
|
|
56
76
|
// Mapped by interpreter name since flags differ across interpreters
|
|
57
77
|
// (e.g. -I is standalone in Python but takes a value in Ruby).
|
|
@@ -353,18 +373,23 @@ function extractSegments(node: TSNode): CommandSegment[] {
|
|
|
353
373
|
|
|
354
374
|
/**
|
|
355
375
|
* Returns true when the interpreter args indicate stdin-exec mode - i.e. the
|
|
356
|
-
* interpreter will read code from stdin
|
|
357
|
-
* rather than from a file. Concretely:
|
|
376
|
+
* interpreter will read code from stdin rather than from a file. Concretely:
|
|
358
377
|
* - Any STDIN_EXEC_FLAGS present → stdin-exec
|
|
378
|
+
* - Interpreter-specific inline code flag (-c/-e) → NOT stdin-exec
|
|
359
379
|
* - No positional (non-flag) arguments at all → stdin-exec (bare `python`)
|
|
360
380
|
* - Otherwise the first positional arg is a filename → NOT stdin-exec
|
|
361
381
|
*/
|
|
362
382
|
function isStdinExecMode(interpreter: string, args: string[]): boolean {
|
|
363
383
|
const valueFlags =
|
|
364
384
|
INTERPRETER_VALUE_FLAGS.get(interpreter) ?? new Set<string>();
|
|
385
|
+
const inlineCodeFlags =
|
|
386
|
+
INTERPRETER_INLINE_CODE_FLAGS.get(interpreter) ?? new Set<string>();
|
|
365
387
|
for (let i = 0; i < args.length; i++) {
|
|
366
388
|
const arg = args[i];
|
|
367
389
|
if (STDIN_EXEC_FLAGS.has(arg)) return true;
|
|
390
|
+
// Interpreter-specific inline code flags (e.g. python -c, node -e) mean
|
|
391
|
+
// the code is provided as an argument, not read from stdin.
|
|
392
|
+
if (inlineCodeFlags.has(arg)) return false;
|
|
368
393
|
// First non-flag argument is a filename/module → file mode
|
|
369
394
|
if (!arg.startsWith("-")) return false;
|
|
370
395
|
// Flags like -W, -X consume the next token as their value - skip it
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { getGatewayInternalBaseUrl } from "../../config/env.js";
|
|
9
9
|
import { getDataDir, getWorkspaceDir } from "../../util/platform.js";
|
|
10
10
|
|
|
11
|
-
const SAFE_ENV_VARS = [
|
|
11
|
+
export const SAFE_ENV_VARS = [
|
|
12
12
|
"PATH",
|
|
13
13
|
"HOME",
|
|
14
14
|
"TERM",
|
|
@@ -35,7 +35,23 @@ const SAFE_ENV_VARS = [
|
|
|
35
35
|
"CES_CREDENTIAL_URL",
|
|
36
36
|
"CES_MANAGED_MODE",
|
|
37
37
|
"IS_CONTAINERIZED",
|
|
38
|
+
"IS_PLATFORM",
|
|
38
39
|
"CES_SERVICE_TOKEN",
|
|
40
|
+
"VELLUM_PROFILER_RUN_ID",
|
|
41
|
+
"VELLUM_PROFILER_MODE",
|
|
42
|
+
"VELLUM_PROFILER_MAX_BYTES",
|
|
43
|
+
"VELLUM_PROFILER_MAX_RUNS",
|
|
44
|
+
"VELLUM_PROFILER_MIN_FREE_MB",
|
|
45
|
+
] as const;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Keys that buildSanitizedEnv always injects into the returned env,
|
|
49
|
+
* independent of what is present in process.env.
|
|
50
|
+
*/
|
|
51
|
+
export const ALWAYS_INJECTED_ENV_VARS = [
|
|
52
|
+
"INTERNAL_GATEWAY_BASE_URL",
|
|
53
|
+
"VELLUM_DATA_DIR",
|
|
54
|
+
"VELLUM_WORKSPACE_DIR",
|
|
39
55
|
] as const;
|
|
40
56
|
|
|
41
57
|
export function buildSanitizedEnv(): Record<string, string> {
|
|
@@ -16,13 +16,15 @@ import { manageSecureCommandTool } from "./credential-execution/manage-secure-co
|
|
|
16
16
|
import { runAuthenticatedCommandTool } from "./credential-execution/run-authenticated-command.js";
|
|
17
17
|
import { credentialStoreTool } from "./credentials/vault.js";
|
|
18
18
|
import { fileEditTool } from "./filesystem/edit.js";
|
|
19
|
+
import { fileListTool } from "./filesystem/list.js";
|
|
19
20
|
import { fileReadTool } from "./filesystem/read.js";
|
|
20
21
|
import { fileWriteTool } from "./filesystem/write.js";
|
|
21
|
-
import {
|
|
22
|
+
import { recallTool, rememberTool } from "./memory/register.js";
|
|
22
23
|
import { webFetchTool } from "./network/web-fetch.js";
|
|
23
24
|
import { webSearchTool } from "./network/web-search.js";
|
|
24
25
|
import { skillExecuteTool } from "./skills/execute.js";
|
|
25
26
|
import { skillLoadTool } from "./skills/load.js";
|
|
27
|
+
import { notifyParentTool } from "./subagent/notify-parent.js";
|
|
26
28
|
import { requestSystemPermissionTool } from "./system/request-permission.js";
|
|
27
29
|
import { shellTool } from "./terminal/shell.js";
|
|
28
30
|
import type { Tool } from "./types.js";
|
|
@@ -56,11 +58,13 @@ export const eagerModuleToolNames: string[] = [
|
|
|
56
58
|
"file_read",
|
|
57
59
|
"file_write",
|
|
58
60
|
"file_edit",
|
|
61
|
+
"file_list",
|
|
59
62
|
"web_search",
|
|
60
63
|
"web_fetch",
|
|
61
64
|
"skill_execute",
|
|
62
65
|
"skill_load",
|
|
63
66
|
"request_system_permission",
|
|
67
|
+
"notify_parent",
|
|
64
68
|
];
|
|
65
69
|
|
|
66
70
|
// ── Explicit tool instances ─────────────────────────────────────────
|
|
@@ -76,15 +80,17 @@ export const explicitTools: Tool[] = [
|
|
|
76
80
|
fileReadTool,
|
|
77
81
|
fileWriteTool,
|
|
78
82
|
fileEditTool,
|
|
83
|
+
fileListTool,
|
|
79
84
|
webFetchTool,
|
|
80
85
|
webSearchTool,
|
|
81
86
|
skillExecuteTool,
|
|
82
87
|
skillLoadTool,
|
|
83
88
|
requestSystemPermissionTool,
|
|
84
89
|
// Always-explicit tools
|
|
85
|
-
|
|
86
|
-
|
|
90
|
+
rememberTool,
|
|
91
|
+
recallTool,
|
|
87
92
|
credentialStoreTool,
|
|
93
|
+
notifyParentTool,
|
|
88
94
|
];
|
|
89
95
|
|
|
90
96
|
// ── CES tools (feature-flag gated) ──────────────────────────────────
|
package/src/tools/types.ts
CHANGED
|
@@ -181,6 +181,8 @@ export interface ToolContext {
|
|
|
181
181
|
hostBashProxy?: import("../daemon/host-bash-proxy.js").HostBashProxy;
|
|
182
182
|
/** Optional proxy for delegating host_file_read/write/edit execution to a connected client (managed/cloud-hosted mode). */
|
|
183
183
|
hostFileProxy?: import("../daemon/host-file-proxy.js").HostFileProxy;
|
|
184
|
+
/** True when the assistant is running as a platform-managed remote instance. Used to auto-approve sandboxed bash tools. */
|
|
185
|
+
isPlatformHosted?: boolean;
|
|
184
186
|
/** CES RPC client for credential execution operations. When present, the executor can bridge CES approval flows. */
|
|
185
187
|
cesClient?: CesClient;
|
|
186
188
|
}
|
package/src/util/browser.ts
CHANGED
|
@@ -1,15 +1,30 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { getLogger } from "./logger.js";
|
|
5
|
+
import { getSignalsDir } from "./platform.js";
|
|
6
|
+
|
|
7
|
+
const log = getLogger("browser");
|
|
2
8
|
|
|
3
9
|
/**
|
|
4
|
-
* Open a URL
|
|
5
|
-
*
|
|
10
|
+
* Open a URL on the user's host machine.
|
|
11
|
+
*
|
|
12
|
+
* Writes an `open_url` event to the `signals/emit-event` file so that the
|
|
13
|
+
* daemon's ConfigWatcher picks it up and publishes it to connected clients
|
|
14
|
+
* (e.g. the Swift macOS app) via the assistant event hub.
|
|
6
15
|
*/
|
|
7
|
-
export function
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
16
|
+
export async function openInHostBrowser(url: string): Promise<void> {
|
|
17
|
+
try {
|
|
18
|
+
const signalsDir = getSignalsDir();
|
|
19
|
+
mkdirSync(signalsDir, { recursive: true });
|
|
20
|
+
writeFileSync(
|
|
21
|
+
join(signalsDir, "emit-event"),
|
|
22
|
+
JSON.stringify({ type: "open_url", url }),
|
|
23
|
+
);
|
|
24
|
+
} catch (err) {
|
|
25
|
+
log.warn(
|
|
26
|
+
{ error: err instanceof Error ? err.message : String(err) },
|
|
27
|
+
"Failed to write open_url signal",
|
|
28
|
+
);
|
|
14
29
|
}
|
|
15
30
|
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper for locating or JIT-installing a standalone `bun` binary.
|
|
3
|
+
*
|
|
4
|
+
* Several subsystems (package resolver, hook runner, browser runtime,
|
|
5
|
+
* credential execution, embedding runtime) need to spawn `bun` as a child
|
|
6
|
+
* process. Inside a `bun build --compile` binary, `process.execPath` is the
|
|
7
|
+
* compiled app — not the bun CLI — and the user may not have bun on PATH.
|
|
8
|
+
*
|
|
9
|
+
* This module checks well-known locations first, and if none is found it
|
|
10
|
+
* downloads a pinned release from GitHub into $VELLUM_WORKSPACE_DIR/bin/.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
chmodSync,
|
|
15
|
+
existsSync,
|
|
16
|
+
mkdirSync,
|
|
17
|
+
renameSync,
|
|
18
|
+
rmSync,
|
|
19
|
+
writeFileSync,
|
|
20
|
+
} from "node:fs";
|
|
21
|
+
import { arch, homedir, platform } from "node:os";
|
|
22
|
+
import { basename, join } from "node:path";
|
|
23
|
+
|
|
24
|
+
import { getLogger } from "./logger.js";
|
|
25
|
+
import { getBinDir } from "./platform.js";
|
|
26
|
+
|
|
27
|
+
const log = getLogger("bun-runtime");
|
|
28
|
+
|
|
29
|
+
/** Pinned bun version to download when no system bun is available. */
|
|
30
|
+
const BUN_VERSION = "1.2.0";
|
|
31
|
+
|
|
32
|
+
/** Module-level cache so we only resolve/download once per process. */
|
|
33
|
+
let cachedBunPath: string | undefined;
|
|
34
|
+
|
|
35
|
+
/** In-flight download promise to deduplicate concurrent callers. */
|
|
36
|
+
let inflightDownload: Promise<string> | undefined;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Return a path to a usable `bun` binary, downloading one if necessary.
|
|
40
|
+
*
|
|
41
|
+
* Resolution order:
|
|
42
|
+
* 1. `process.execPath` if it IS the bun CLI (dev mode)
|
|
43
|
+
* 2. Previously downloaded copy at $VELLUM_WORKSPACE_DIR/bin/bun
|
|
44
|
+
* 3. Common install locations (~/.bun/bin/bun, /opt/homebrew/bin/bun, etc.)
|
|
45
|
+
* 4. `Bun.which("bun")` (PATH lookup)
|
|
46
|
+
* 5. Download from GitHub releases into $VELLUM_WORKSPACE_DIR/bin/
|
|
47
|
+
*/
|
|
48
|
+
export async function ensureBun(): Promise<string> {
|
|
49
|
+
if (cachedBunPath && existsSync(cachedBunPath)) {
|
|
50
|
+
return cachedBunPath;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const found = findBun();
|
|
54
|
+
if (found) {
|
|
55
|
+
cachedBunPath = found;
|
|
56
|
+
return found;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// No bun found anywhere — download it.
|
|
60
|
+
// Use an in-flight promise to deduplicate concurrent callers.
|
|
61
|
+
if (!inflightDownload) {
|
|
62
|
+
log.info("No bun binary found, downloading…");
|
|
63
|
+
const binDir = getBinDir();
|
|
64
|
+
inflightDownload = downloadBun(binDir).finally(() => {
|
|
65
|
+
inflightDownload = undefined;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
const downloaded = await inflightDownload;
|
|
69
|
+
cachedBunPath = downloaded;
|
|
70
|
+
return downloaded;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Synchronous check for an already-available bun binary.
|
|
75
|
+
* Returns the path if found, undefined otherwise. Does NOT download.
|
|
76
|
+
*/
|
|
77
|
+
export function findBun(): string | undefined {
|
|
78
|
+
// 1. process.execPath if it is the bun CLI itself (dev mode)
|
|
79
|
+
const execBase = basename(process.execPath);
|
|
80
|
+
if (execBase === "bun" || execBase === "bun.exe") {
|
|
81
|
+
return process.execPath;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// 2. Previously downloaded copy
|
|
85
|
+
const downloaded = join(getBinDir(), "bun");
|
|
86
|
+
if (existsSync(downloaded)) return downloaded;
|
|
87
|
+
|
|
88
|
+
// 3. Common install locations
|
|
89
|
+
const home = homedir();
|
|
90
|
+
for (const p of [
|
|
91
|
+
join(home, ".bun", "bin", "bun"),
|
|
92
|
+
"/opt/homebrew/bin/bun",
|
|
93
|
+
"/usr/local/bin/bun",
|
|
94
|
+
]) {
|
|
95
|
+
if (existsSync(p)) return p;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// 4. PATH lookup
|
|
99
|
+
const which = Bun.which("bun");
|
|
100
|
+
if (which) return which;
|
|
101
|
+
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Download a pinned bun release into the given directory.
|
|
107
|
+
* Returns the absolute path to the downloaded binary.
|
|
108
|
+
*/
|
|
109
|
+
async function downloadBun(installDir: string): Promise<string> {
|
|
110
|
+
const os = platform();
|
|
111
|
+
const cpu = arch() === "arm64" ? "aarch64" : arch();
|
|
112
|
+
const target = `${os}-${cpu}`;
|
|
113
|
+
const url = `https://github.com/oven-sh/bun/releases/download/bun-v${BUN_VERSION}/bun-${target}.zip`;
|
|
114
|
+
|
|
115
|
+
log.info({ url, target, bunVersion: BUN_VERSION }, "Downloading bun binary");
|
|
116
|
+
|
|
117
|
+
const response = await fetch(url, { redirect: "follow" });
|
|
118
|
+
if (!response.ok) {
|
|
119
|
+
throw new Error(
|
|
120
|
+
`Failed to download bun: ${response.status} ${response.statusText}`,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const zipData = await response.arrayBuffer();
|
|
125
|
+
mkdirSync(installDir, { recursive: true });
|
|
126
|
+
|
|
127
|
+
const tmpZip = join(installDir, `bun-download-${Date.now()}.zip`);
|
|
128
|
+
writeFileSync(tmpZip, Buffer.from(zipData));
|
|
129
|
+
|
|
130
|
+
try {
|
|
131
|
+
const proc = Bun.spawn({
|
|
132
|
+
cmd: ["unzip", "-o", tmpZip, "-d", installDir],
|
|
133
|
+
stdout: "ignore",
|
|
134
|
+
stderr: "pipe",
|
|
135
|
+
});
|
|
136
|
+
await proc.exited;
|
|
137
|
+
if (proc.exitCode !== 0) {
|
|
138
|
+
const stderr = await new Response(proc.stderr).text();
|
|
139
|
+
throw new Error(`Failed to extract bun zip: ${stderr}`);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Move binary from bun-{target}/bun to installDir/bun
|
|
143
|
+
const extractedBun = join(installDir, `bun-${target}`, "bun");
|
|
144
|
+
const finalPath = join(installDir, "bun");
|
|
145
|
+
if (existsSync(extractedBun)) {
|
|
146
|
+
// Remove old binary first to avoid "Text file busy" on some systems
|
|
147
|
+
if (existsSync(finalPath)) {
|
|
148
|
+
rmSync(finalPath);
|
|
149
|
+
}
|
|
150
|
+
renameSync(extractedBun, finalPath);
|
|
151
|
+
rmSync(join(installDir, `bun-${target}`), {
|
|
152
|
+
recursive: true,
|
|
153
|
+
force: true,
|
|
154
|
+
});
|
|
155
|
+
} else if (!existsSync(finalPath)) {
|
|
156
|
+
throw new Error(
|
|
157
|
+
`Bun binary not found at expected path after extraction: ${extractedBun}`,
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
chmodSync(finalPath, 0o755);
|
|
162
|
+
|
|
163
|
+
log.info({ path: finalPath }, "Bun binary downloaded successfully");
|
|
164
|
+
return finalPath;
|
|
165
|
+
} finally {
|
|
166
|
+
try {
|
|
167
|
+
rmSync(tmpZip);
|
|
168
|
+
} catch {
|
|
169
|
+
/* ignore cleanup failure */
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
package/src/util/logger.ts
CHANGED
|
@@ -36,7 +36,7 @@ export type LogFileConfig = {
|
|
|
36
36
|
|
|
37
37
|
const LOG_FILE_PREFIX = "assistant-";
|
|
38
38
|
const LOG_FILE_SUFFIX = ".log";
|
|
39
|
-
const LOG_FILE_PATTERN = /^assistant-(\d{4}-\d{2}-\d{2})\.log$/;
|
|
39
|
+
export const LOG_FILE_PATTERN = /^assistant-(\d{4}-\d{2}-\d{2})\.log$/;
|
|
40
40
|
|
|
41
41
|
function formatDate(date: Date): string {
|
|
42
42
|
const y = date.getUTCFullYear();
|
package/src/util/platform.ts
CHANGED
|
@@ -25,16 +25,6 @@ export function getPlatformName(): string {
|
|
|
25
25
|
return process.platform;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
/**
|
|
29
|
-
* Returns the platform-specific clipboard copy command, or null if
|
|
30
|
-
* clipboard access is not supported on the current platform.
|
|
31
|
-
*/
|
|
32
|
-
export function getClipboardCommand(): string | null {
|
|
33
|
-
if (isMacOS()) return "pbcopy";
|
|
34
|
-
if (isLinux()) return "xclip -selection clipboard";
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
28
|
/**
|
|
39
29
|
* Normalize an assistant ID to its canonical form for DB operations.
|
|
40
30
|
*
|
|
@@ -105,13 +95,25 @@ export function getInterfacesDir(): string {
|
|
|
105
95
|
|
|
106
96
|
/**
|
|
107
97
|
* Returns the sounds directory (~/.vellum/workspace/data/sounds).
|
|
108
|
-
* Custom sound files and sound configuration live here.
|
|
109
|
-
* can be large, so this directory is excluded from diagnostic exports.
|
|
98
|
+
* Custom sound files and sound configuration live here.
|
|
110
99
|
*/
|
|
111
100
|
export function getSoundsDir(): string {
|
|
112
101
|
return join(getWorkspaceDir(), "data", "sounds");
|
|
113
102
|
}
|
|
114
103
|
|
|
104
|
+
/** Returns the avatar directory ($VELLUM_WORKSPACE_DIR/data/avatar). */
|
|
105
|
+
export function getAvatarDir(): string {
|
|
106
|
+
return join(getWorkspaceDir(), "data", "avatar");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Canonical filename for the custom avatar PNG. */
|
|
110
|
+
export const AVATAR_IMAGE_FILENAME = "avatar-image.png";
|
|
111
|
+
|
|
112
|
+
/** Returns the canonical avatar image path (~/.vellum/workspace/data/avatar/avatar-image.png). */
|
|
113
|
+
export function getAvatarImagePath(): string {
|
|
114
|
+
return join(getAvatarDir(), AVATAR_IMAGE_FILENAME);
|
|
115
|
+
}
|
|
116
|
+
|
|
115
117
|
/**
|
|
116
118
|
* Returns the TCP port the daemon should listen on for iOS clients.
|
|
117
119
|
* Hardcoded default: 8765.
|
|
@@ -218,7 +220,7 @@ export function getHistoryPath(): string {
|
|
|
218
220
|
* overrides, device approval lists — live here.
|
|
219
221
|
*
|
|
220
222
|
* This directory is:
|
|
221
|
-
* - Outside the workspace
|
|
223
|
+
* - Outside the workspace
|
|
222
224
|
* - Outside the sandbox write boundary (tools cannot modify it)
|
|
223
225
|
* - Skipped in containerized mode (credentials via CES, trust via gateway)
|
|
224
226
|
*/
|
|
@@ -271,10 +273,6 @@ export function getEmbedWorkerPidPath(): string {
|
|
|
271
273
|
* When the VELLUM_WORKSPACE_DIR env var is set, returns that value (used in
|
|
272
274
|
* containerized deployments where the workspace is a separate volume).
|
|
273
275
|
* Otherwise falls back to ~/.vellum/workspace.
|
|
274
|
-
*
|
|
275
|
-
* WARNING: The entire workspace directory is included in diagnostic log exports
|
|
276
|
-
* ("Send logs to Vellum"). Do not store secrets, API keys, or sensitive
|
|
277
|
-
* credentials here — use the credential store or ~/.vellum/protected/ instead.
|
|
278
276
|
*/
|
|
279
277
|
export function getWorkspaceDir(): string {
|
|
280
278
|
const override = getWorkspaceDirOverride();
|
|
@@ -315,6 +313,11 @@ export function getWorkspaceHooksDir(): string {
|
|
|
315
313
|
return join(getWorkspaceDir(), "hooks");
|
|
316
314
|
}
|
|
317
315
|
|
|
316
|
+
/** Returns $VELLUM_WORKSPACE_DIR/routes — user-defined HTTP route handlers. */
|
|
317
|
+
export function getWorkspaceRoutesDir(): string {
|
|
318
|
+
return join(getWorkspaceDir(), "routes");
|
|
319
|
+
}
|
|
320
|
+
|
|
318
321
|
/** Returns ~/.vellum/workspace/deprecated — transitional files slated for removal. */
|
|
319
322
|
export function getDeprecatedDir(): string {
|
|
320
323
|
return join(getWorkspaceDir(), "deprecated");
|
|
@@ -330,6 +333,35 @@ export function getWorkspacePromptPath(file: string): string {
|
|
|
330
333
|
return join(getWorkspaceDir(), file);
|
|
331
334
|
}
|
|
332
335
|
|
|
336
|
+
// ── Profiler filesystem layout ──────────────────────────────────────────
|
|
337
|
+
// Managed profiler runs live under <workspace>/data/profiler/. These
|
|
338
|
+
// helpers enforce a single canonical layout so every runtime caller
|
|
339
|
+
// resolves the same paths.
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Returns the profiler root directory (<workspace>/data/profiler).
|
|
343
|
+
* All profiler state (runs directory, global metadata) lives here.
|
|
344
|
+
*/
|
|
345
|
+
export function getProfilerRootDir(): string {
|
|
346
|
+
return join(getDataDir(), "profiler");
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Returns the profiler runs directory (<workspace>/data/profiler/runs).
|
|
351
|
+
* Each completed or active profiler run gets its own sub-directory here.
|
|
352
|
+
*/
|
|
353
|
+
export function getProfilerRunsDir(): string {
|
|
354
|
+
return join(getProfilerRootDir(), "runs");
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Returns the directory for a specific profiler run by ID
|
|
359
|
+
* (<workspace>/data/profiler/runs/<runId>).
|
|
360
|
+
*/
|
|
361
|
+
export function getProfilerRunDir(runId: string): string {
|
|
362
|
+
return join(getProfilerRunsDir(), runId);
|
|
363
|
+
}
|
|
364
|
+
|
|
333
365
|
export function ensureDataDir(): void {
|
|
334
366
|
const root = vellumRoot();
|
|
335
367
|
const workspace = getWorkspaceDir();
|
|
@@ -342,6 +374,7 @@ export function ensureDataDir(): void {
|
|
|
342
374
|
join(workspace, "signals"),
|
|
343
375
|
join(workspace, "hooks"),
|
|
344
376
|
join(workspace, "skills"),
|
|
377
|
+
join(workspace, "routes"),
|
|
345
378
|
join(workspace, "embedding-models"),
|
|
346
379
|
join(workspace, "conversations"),
|
|
347
380
|
join(workspace, "logs"),
|