@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
|
@@ -14,19 +14,19 @@ import { registerPlatformDisconnectCommand } from "./disconnect.js";
|
|
|
14
14
|
export function registerPlatformCommand(program: Command): void {
|
|
15
15
|
const platform = program
|
|
16
16
|
.command("platform")
|
|
17
|
-
.description("Manage
|
|
17
|
+
.description("Manage Vellum Platform integration")
|
|
18
18
|
.option("--json", "Machine-readable compact JSON output");
|
|
19
19
|
|
|
20
20
|
platform.addHelpText(
|
|
21
21
|
"after",
|
|
22
22
|
`
|
|
23
|
-
The platform subsystem manages the connection to Vellum Platform
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
Twilio webhooks, OAuth redirects)
|
|
29
|
-
|
|
23
|
+
The platform subsystem manages the connection to Vellum Platform. Use
|
|
24
|
+
'connect', 'status', and 'disconnect' to manage platform credentials.
|
|
25
|
+
Any assistant using the managed LLM proxy can use these commands.
|
|
26
|
+
|
|
27
|
+
When IS_PLATFORM=true (platform-managed deployments), external service
|
|
28
|
+
callbacks (Telegram webhooks, Twilio webhooks, OAuth redirects) also
|
|
29
|
+
route through the platform's gateway proxy via 'callback-routes'.
|
|
30
30
|
|
|
31
31
|
Examples:
|
|
32
32
|
$ assistant platform status --json
|
|
@@ -54,11 +54,11 @@ Examples:
|
|
|
54
54
|
"after",
|
|
55
55
|
`
|
|
56
56
|
Reads platform-related environment variables and stored credentials to report
|
|
57
|
-
the current
|
|
57
|
+
the current platform deployment context and connection state. Does not
|
|
58
58
|
require the assistant to be running.
|
|
59
59
|
|
|
60
60
|
Fields:
|
|
61
|
-
|
|
61
|
+
isPlatform Whether IS_PLATFORM is set (boolean)
|
|
62
62
|
baseUrl VELLUM_PLATFORM_URL — the platform gateway base URL
|
|
63
63
|
assistantId PLATFORM_ASSISTANT_ID — this assistant's platform UUID
|
|
64
64
|
hasInternalApiKey Whether PLATFORM_INTERNAL_API_KEY is set (boolean,
|
|
@@ -112,7 +112,7 @@ Examples:
|
|
|
112
112
|
const connected = !!storedBaseUrl && hasStoredApiKey;
|
|
113
113
|
|
|
114
114
|
const result = {
|
|
115
|
-
|
|
115
|
+
isPlatform: context.isPlatform,
|
|
116
116
|
baseUrl: context.platformBaseUrl,
|
|
117
117
|
assistantId: context.assistantId,
|
|
118
118
|
hasInternalApiKey: context.hasInternalApiKey,
|
|
@@ -126,7 +126,7 @@ Examples:
|
|
|
126
126
|
if (shouldOutputJson(cmd)) {
|
|
127
127
|
writeOutput(cmd, result);
|
|
128
128
|
} else {
|
|
129
|
-
log.info(`
|
|
129
|
+
log.info(`Platform: ${result.isPlatform}`);
|
|
130
130
|
log.info(`Base URL: ${result.baseUrl || "(not set)"}`);
|
|
131
131
|
log.info(`Assistant ID: ${result.assistantId || "(not set)"}`);
|
|
132
132
|
log.info(
|
|
@@ -167,7 +167,7 @@ Examples:
|
|
|
167
167
|
"after",
|
|
168
168
|
`
|
|
169
169
|
Callback routes tell the platform gateway how to forward inbound provider
|
|
170
|
-
webhooks to the correct
|
|
170
|
+
webhooks to the correct platform-managed assistant instance. Each route maps a
|
|
171
171
|
callback path and type to a stable external URL that external services
|
|
172
172
|
(Telegram, Twilio, OAuth providers) should use.
|
|
173
173
|
|
|
@@ -196,7 +196,7 @@ Examples:
|
|
|
196
196
|
`
|
|
197
197
|
Registers a callback route with the platform's internal gateway endpoint so
|
|
198
198
|
the platform knows how to forward inbound provider webhooks to this
|
|
199
|
-
|
|
199
|
+
platform-managed assistant instance.
|
|
200
200
|
|
|
201
201
|
Arguments:
|
|
202
202
|
--path The path portion after the ingress base URL. Leading/trailing
|
|
@@ -210,7 +210,7 @@ Known callback path/type combinations:
|
|
|
210
210
|
--path webhooks/twilio/status --type twilio_status
|
|
211
211
|
--path oauth/callback --type oauth
|
|
212
212
|
|
|
213
|
-
Requires a
|
|
213
|
+
Requires a platform-managed environment (IS_PLATFORM=true) with
|
|
214
214
|
VELLUM_PLATFORM_URL and PLATFORM_ASSISTANT_ID configured. Returns the
|
|
215
215
|
platform-provided stable callback URL that external services should use.
|
|
216
216
|
|
|
@@ -225,7 +225,7 @@ Examples:
|
|
|
225
225
|
writeOutput(cmd, {
|
|
226
226
|
ok: false,
|
|
227
227
|
error:
|
|
228
|
-
"Platform callbacks not available — missing
|
|
228
|
+
"Platform callbacks not available — missing platform registration context",
|
|
229
229
|
});
|
|
230
230
|
process.exitCode = 1;
|
|
231
231
|
return;
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
|
|
4
|
+
import type { Command } from "commander";
|
|
5
|
+
|
|
6
|
+
import { getConfig } from "../../config/loader.js";
|
|
7
|
+
import { getPublicBaseUrl } from "../../inbound/public-ingress-urls.js";
|
|
8
|
+
import { getWorkspaceRoutesDir } from "../../util/platform.js";
|
|
9
|
+
import { log } from "../logger.js";
|
|
10
|
+
|
|
11
|
+
/** HTTP methods that can be exported from a handler module. */
|
|
12
|
+
const HTTP_METHODS = [
|
|
13
|
+
"GET",
|
|
14
|
+
"POST",
|
|
15
|
+
"PUT",
|
|
16
|
+
"PATCH",
|
|
17
|
+
"DELETE",
|
|
18
|
+
"HEAD",
|
|
19
|
+
"OPTIONS",
|
|
20
|
+
] as const;
|
|
21
|
+
|
|
22
|
+
type HttpMethod = (typeof HTTP_METHODS)[number];
|
|
23
|
+
|
|
24
|
+
/** Supported file extensions for handler modules. */
|
|
25
|
+
const HANDLER_EXTENSIONS = [".ts", ".js"] as const;
|
|
26
|
+
|
|
27
|
+
type HandlerExtension = (typeof HANDLER_EXTENSIONS)[number];
|
|
28
|
+
|
|
29
|
+
interface DiscoveredRoute {
|
|
30
|
+
/** Route path relative to /x/ prefix (e.g. "my-app/status"). */
|
|
31
|
+
routePath: string;
|
|
32
|
+
/** Absolute path to the handler file. */
|
|
33
|
+
filePath: string;
|
|
34
|
+
/** HTTP methods exported by the handler module. */
|
|
35
|
+
methods: HttpMethod[];
|
|
36
|
+
/** Optional description exported by the handler module. */
|
|
37
|
+
description?: string;
|
|
38
|
+
/** File size in bytes. */
|
|
39
|
+
fileSize: number;
|
|
40
|
+
/** Last modified time as ISO string. */
|
|
41
|
+
modifiedAt: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Load a handler module and extract its exported HTTP methods and description.
|
|
46
|
+
*/
|
|
47
|
+
async function inspectModule(
|
|
48
|
+
filePath: string,
|
|
49
|
+
): Promise<{ methods: HttpMethod[]; description?: string }> {
|
|
50
|
+
const stat = statSync(filePath);
|
|
51
|
+
const mod = (await import(`${filePath}?t=${stat.mtimeMs}`)) as Record<
|
|
52
|
+
string,
|
|
53
|
+
unknown
|
|
54
|
+
>;
|
|
55
|
+
|
|
56
|
+
const methods: HttpMethod[] = [];
|
|
57
|
+
for (const method of HTTP_METHODS) {
|
|
58
|
+
if (typeof mod[method] === "function") {
|
|
59
|
+
methods.push(method);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const description =
|
|
64
|
+
typeof mod.description === "string" ? mod.description : undefined;
|
|
65
|
+
|
|
66
|
+
return { methods, description };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Recursively scan the routes directory for handler files (.ts, .js).
|
|
71
|
+
* Returns discovered routes sorted alphabetically by route path.
|
|
72
|
+
*/
|
|
73
|
+
async function discoverRoutes(routesDir: string): Promise<DiscoveredRoute[]> {
|
|
74
|
+
if (!existsSync(routesDir)) {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const routes: DiscoveredRoute[] = [];
|
|
79
|
+
|
|
80
|
+
function scanDir(dir: string): void {
|
|
81
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const fullPath = join(dir, entry.name);
|
|
84
|
+
if (entry.isDirectory()) {
|
|
85
|
+
scanDir(fullPath);
|
|
86
|
+
} else if (entry.isFile()) {
|
|
87
|
+
const ext = HANDLER_EXTENSIONS.find((e) => entry.name.endsWith(e)) as
|
|
88
|
+
| HandlerExtension
|
|
89
|
+
| undefined;
|
|
90
|
+
if (!ext) continue;
|
|
91
|
+
|
|
92
|
+
const relativePath = relative(routesDir, fullPath);
|
|
93
|
+
const withoutExt = relativePath.slice(0, -ext.length);
|
|
94
|
+
|
|
95
|
+
// Convert filesystem path to route path:
|
|
96
|
+
// - Strip /index suffix for index file convention
|
|
97
|
+
// - Replace backslashes with forward slashes (Windows compat)
|
|
98
|
+
let routePath = withoutExt.replace(/\\/g, "/");
|
|
99
|
+
if (routePath.endsWith("/index")) {
|
|
100
|
+
routePath = routePath.slice(0, -"/index".length);
|
|
101
|
+
} else if (routePath === "index") {
|
|
102
|
+
routePath = "";
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
routes.push({
|
|
106
|
+
routePath,
|
|
107
|
+
filePath: fullPath,
|
|
108
|
+
methods: [],
|
|
109
|
+
description: undefined,
|
|
110
|
+
fileSize: 0,
|
|
111
|
+
modifiedAt: "",
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
scanDir(routesDir);
|
|
118
|
+
|
|
119
|
+
// Load each module to detect exported methods and description
|
|
120
|
+
for (const route of routes) {
|
|
121
|
+
try {
|
|
122
|
+
const stat = statSync(route.filePath);
|
|
123
|
+
route.fileSize = stat.size;
|
|
124
|
+
route.modifiedAt = stat.mtime.toISOString();
|
|
125
|
+
|
|
126
|
+
const { methods, description } = await inspectModule(route.filePath);
|
|
127
|
+
route.methods = methods;
|
|
128
|
+
route.description = description;
|
|
129
|
+
} catch {
|
|
130
|
+
// If a module fails to load, keep it in the list with empty methods
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return routes.sort((a, b) => a.routePath.localeCompare(b.routePath));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Try to resolve the public base URL for building full endpoint URLs.
|
|
139
|
+
* Returns null if no public URL is configured (non-fatal for CLI display).
|
|
140
|
+
*/
|
|
141
|
+
function tryGetPublicBaseUrl(): string | null {
|
|
142
|
+
try {
|
|
143
|
+
const config = getConfig();
|
|
144
|
+
return getPublicBaseUrl(config);
|
|
145
|
+
} catch {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Format a list of HTTP methods for display, abbreviating DELETE to DEL.
|
|
152
|
+
*/
|
|
153
|
+
function formatMethods(methods: HttpMethod[]): string {
|
|
154
|
+
return methods.map((m) => (m === "DELETE" ? "DEL" : m)).join(",");
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function registerRoutesCommand(program: Command): void {
|
|
158
|
+
const routes = program
|
|
159
|
+
.command("routes")
|
|
160
|
+
.description("Manage user-defined HTTP route handlers under /x/*");
|
|
161
|
+
|
|
162
|
+
routes.addHelpText(
|
|
163
|
+
"after",
|
|
164
|
+
`
|
|
165
|
+
User-defined routes let you expose custom HTTP endpoints by dropping handler
|
|
166
|
+
files into /workspace/routes/. Each file exports named HTTP method functions
|
|
167
|
+
(GET, POST, etc.) and becomes reachable at /x/<path>.
|
|
168
|
+
|
|
169
|
+
Routes are managed by creating and deleting files — no add/remove commands
|
|
170
|
+
needed.
|
|
171
|
+
|
|
172
|
+
Examples:
|
|
173
|
+
$ assistant routes list
|
|
174
|
+
$ assistant routes list --json
|
|
175
|
+
$ assistant routes inspect my-dashboard-api/submit`,
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
routes
|
|
179
|
+
.command("list")
|
|
180
|
+
.description("List all user-defined route handlers and their public URLs")
|
|
181
|
+
.option("--json", "Machine-readable JSON output")
|
|
182
|
+
.addHelpText(
|
|
183
|
+
"after",
|
|
184
|
+
`
|
|
185
|
+
Scans /workspace/routes/ for handler files (.ts, .js) and displays the route
|
|
186
|
+
path, exported HTTP methods, optional description, and file location.
|
|
187
|
+
|
|
188
|
+
Examples:
|
|
189
|
+
$ assistant routes list
|
|
190
|
+
$ assistant routes list --json`,
|
|
191
|
+
)
|
|
192
|
+
.action(async (opts: { json?: boolean }) => {
|
|
193
|
+
try {
|
|
194
|
+
const routesDir = getWorkspaceRoutesDir();
|
|
195
|
+
const discovered = await discoverRoutes(routesDir);
|
|
196
|
+
|
|
197
|
+
if (opts.json) {
|
|
198
|
+
const publicBase = tryGetPublicBaseUrl();
|
|
199
|
+
const items = discovered.map((r) => ({
|
|
200
|
+
routePath: `/x/${r.routePath}`,
|
|
201
|
+
methods: r.methods,
|
|
202
|
+
description: r.description ?? null,
|
|
203
|
+
filePath: relative(routesDir, r.filePath),
|
|
204
|
+
publicUrl: publicBase ? `${publicBase}/x/${r.routePath}` : null,
|
|
205
|
+
}));
|
|
206
|
+
console.log(JSON.stringify({ ok: true, routes: items }));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (discovered.length === 0) {
|
|
211
|
+
log.info("No route handlers found in /workspace/routes/.");
|
|
212
|
+
log.info(
|
|
213
|
+
"Create a .ts or .js file exporting named HTTP method functions (GET, POST, etc.).",
|
|
214
|
+
);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const publicBase = tryGetPublicBaseUrl();
|
|
219
|
+
|
|
220
|
+
log.info("");
|
|
221
|
+
// Table header
|
|
222
|
+
const routeCol = "ROUTE PATH";
|
|
223
|
+
const methodsCol = "METHODS";
|
|
224
|
+
const descCol = "DESCRIPTION";
|
|
225
|
+
const fileCol = "FILE";
|
|
226
|
+
|
|
227
|
+
// Calculate column widths
|
|
228
|
+
const routeWidth = Math.max(
|
|
229
|
+
routeCol.length,
|
|
230
|
+
...discovered.map((r) => `/x/${r.routePath}`.length),
|
|
231
|
+
);
|
|
232
|
+
const methodsWidth = Math.max(
|
|
233
|
+
methodsCol.length,
|
|
234
|
+
...discovered.map((r) => formatMethods(r.methods).length),
|
|
235
|
+
);
|
|
236
|
+
const descWidth = Math.max(
|
|
237
|
+
descCol.length,
|
|
238
|
+
...discovered.map((r) => (r.description ?? "").length),
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
const header = [
|
|
242
|
+
routeCol.padEnd(routeWidth),
|
|
243
|
+
methodsCol.padEnd(methodsWidth),
|
|
244
|
+
descCol.padEnd(descWidth),
|
|
245
|
+
fileCol,
|
|
246
|
+
].join(" ");
|
|
247
|
+
|
|
248
|
+
log.info(` ${header}`);
|
|
249
|
+
|
|
250
|
+
for (const route of discovered) {
|
|
251
|
+
const cols = [
|
|
252
|
+
`/x/${route.routePath}`.padEnd(routeWidth),
|
|
253
|
+
formatMethods(route.methods).padEnd(methodsWidth),
|
|
254
|
+
(route.description ?? "").padEnd(descWidth),
|
|
255
|
+
`routes/${relative(routesDir, route.filePath)}`,
|
|
256
|
+
].join(" ");
|
|
257
|
+
log.info(` ${cols}`);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
log.info("");
|
|
261
|
+
const countLabel = discovered.length === 1 ? "route" : "routes";
|
|
262
|
+
const summary = `${discovered.length} ${countLabel}`;
|
|
263
|
+
if (publicBase) {
|
|
264
|
+
log.info(` ${summary} • Public base: ${publicBase}`);
|
|
265
|
+
} else {
|
|
266
|
+
log.info(` ${summary}`);
|
|
267
|
+
}
|
|
268
|
+
log.info("");
|
|
269
|
+
} catch (err) {
|
|
270
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
271
|
+
if (opts.json) {
|
|
272
|
+
console.log(JSON.stringify({ ok: false, error: msg }));
|
|
273
|
+
} else {
|
|
274
|
+
log.error(`Error: ${msg}`);
|
|
275
|
+
}
|
|
276
|
+
process.exitCode = 1;
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
routes
|
|
281
|
+
.command("inspect <path>")
|
|
282
|
+
.description("Show details of a specific user-defined route handler")
|
|
283
|
+
.option("--json", "Machine-readable JSON output")
|
|
284
|
+
.addHelpText(
|
|
285
|
+
"after",
|
|
286
|
+
`
|
|
287
|
+
Arguments:
|
|
288
|
+
path Route path relative to /x/ (e.g. "my-dashboard-api/submit").
|
|
289
|
+
Do not include the /x/ prefix.
|
|
290
|
+
|
|
291
|
+
Loads the handler file and displays exported methods, description, file path,
|
|
292
|
+
public URL, file size, and last modified time.
|
|
293
|
+
|
|
294
|
+
Examples:
|
|
295
|
+
$ assistant routes inspect my-dashboard-api/submit
|
|
296
|
+
$ assistant routes inspect items --json`,
|
|
297
|
+
)
|
|
298
|
+
.action(async (routePath: string, opts: { json?: boolean }) => {
|
|
299
|
+
try {
|
|
300
|
+
const routesDir = getWorkspaceRoutesDir();
|
|
301
|
+
const filePath = resolveHandlerFile(routesDir, routePath);
|
|
302
|
+
|
|
303
|
+
if (!filePath) {
|
|
304
|
+
const msg = `No handler file found for route path "${routePath}"`;
|
|
305
|
+
if (opts.json) {
|
|
306
|
+
console.log(JSON.stringify({ ok: false, error: msg }));
|
|
307
|
+
} else {
|
|
308
|
+
log.error(msg);
|
|
309
|
+
log.info("Expected file at one of:");
|
|
310
|
+
for (const ext of HANDLER_EXTENSIONS) {
|
|
311
|
+
log.info(` ${join(routesDir, `${routePath}${ext}`)}`);
|
|
312
|
+
log.info(` ${join(routesDir, routePath, `index${ext}`)}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
process.exitCode = 1;
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const stat = statSync(filePath);
|
|
320
|
+
const { methods, description } = await inspectModule(filePath);
|
|
321
|
+
const publicBase = tryGetPublicBaseUrl();
|
|
322
|
+
const publicUrl = publicBase ? `${publicBase}/x/${routePath}` : null;
|
|
323
|
+
|
|
324
|
+
if (opts.json) {
|
|
325
|
+
console.log(
|
|
326
|
+
JSON.stringify({
|
|
327
|
+
ok: true,
|
|
328
|
+
route: {
|
|
329
|
+
routePath: `/x/${routePath}`,
|
|
330
|
+
methods,
|
|
331
|
+
description: description ?? null,
|
|
332
|
+
filePath,
|
|
333
|
+
publicUrl,
|
|
334
|
+
fileSize: stat.size,
|
|
335
|
+
modifiedAt: stat.mtime.toISOString(),
|
|
336
|
+
},
|
|
337
|
+
}),
|
|
338
|
+
);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
log.info("");
|
|
343
|
+
log.info(` Route: /x/${routePath}`);
|
|
344
|
+
log.info(
|
|
345
|
+
` Methods: ${methods.join(", ") || "(none)"} (detected from named exports)`,
|
|
346
|
+
);
|
|
347
|
+
if (description) {
|
|
348
|
+
log.info(` Description: ${description}`);
|
|
349
|
+
}
|
|
350
|
+
log.info(` File: ${filePath}`);
|
|
351
|
+
if (publicUrl) {
|
|
352
|
+
log.info(` Public URL: ${publicUrl}`);
|
|
353
|
+
}
|
|
354
|
+
log.info(` File Size: ${stat.size} bytes`);
|
|
355
|
+
log.info(` Modified: ${stat.mtime.toISOString()}`);
|
|
356
|
+
log.info("");
|
|
357
|
+
} catch (err) {
|
|
358
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
359
|
+
if (opts.json) {
|
|
360
|
+
console.log(JSON.stringify({ ok: false, error: msg }));
|
|
361
|
+
} else {
|
|
362
|
+
log.error(`Error: ${msg}`);
|
|
363
|
+
}
|
|
364
|
+
process.exitCode = 1;
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Resolve a route path to a handler file on disk.
|
|
371
|
+
* Mirrors the resolution logic from UserRouteDispatcher.
|
|
372
|
+
*/
|
|
373
|
+
function resolveHandlerFile(
|
|
374
|
+
routesDir: string,
|
|
375
|
+
routePath: string,
|
|
376
|
+
): string | null {
|
|
377
|
+
const basePath = join(routesDir, routePath);
|
|
378
|
+
|
|
379
|
+
// Direct file match
|
|
380
|
+
for (const ext of HANDLER_EXTENSIONS) {
|
|
381
|
+
const candidate = `${basePath}${ext}`;
|
|
382
|
+
if (existsSync(candidate)) {
|
|
383
|
+
return candidate;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// Index file convention
|
|
388
|
+
for (const ext of HANDLER_EXTENSIONS) {
|
|
389
|
+
const candidate = join(basePath, `index${ext}`);
|
|
390
|
+
if (existsSync(candidate)) {
|
|
391
|
+
return candidate;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
return null;
|
|
396
|
+
}
|