@vellumai/assistant 0.4.43 → 0.4.45
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/.prettierignore +4 -0
- package/ARCHITECTURE.md +46 -44
- package/README.md +15 -16
- package/bun.lock +10 -35
- package/docs/architecture/integrations.md +102 -215
- package/docs/architecture/keychain-broker.md +1 -1
- package/docs/architecture/memory.md +2 -2
- package/docs/architecture/scheduling.md +1 -1
- package/docs/architecture/security.md +11 -11
- package/docs/error-handling.md +1 -1
- package/docs/trusted-contact-access.md +3 -3
- package/drizzle/meta/0000_snapshot.json +34 -100
- package/drizzle/meta/_journal.json +1 -1
- package/drizzle.config.ts +4 -4
- package/package.json +3 -2
- package/scripts/capture-x-graphql.ts +237 -141
- package/scripts/generate-bundled-tool-registry.ts +223 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/actor-token-service.test.ts +23 -24
- package/src/__tests__/agent-loop.test.ts +0 -131
- package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
- package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
- package/src/__tests__/approval-primitive.test.ts +0 -1
- package/src/__tests__/approval-routes-http.test.ts +11 -3
- package/src/__tests__/asset-materialize-tool.test.ts +0 -1
- package/src/__tests__/asset-search-tool.test.ts +0 -1
- package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
- package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
- package/src/__tests__/attachments-store.test.ts +0 -1
- package/src/__tests__/avatar-e2e.test.ts +74 -115
- package/src/__tests__/avatar-router.test.ts +25 -62
- package/src/__tests__/browser-manager.test.ts +24 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
- package/src/__tests__/browser-skill-endstate.test.ts +8 -11
- package/src/__tests__/btw-routes.test.ts +326 -0
- package/src/__tests__/bundled-asset.test.ts +1 -1
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/call-conversation-messages.test.ts +0 -1
- package/src/__tests__/call-domain.test.ts +0 -1
- package/src/__tests__/call-pointer-messages.test.ts +0 -1
- package/src/__tests__/call-recovery.test.ts +0 -1
- package/src/__tests__/call-routes-http.test.ts +0 -1
- package/src/__tests__/call-store.test.ts +0 -1
- package/src/__tests__/canonical-guardian-store.test.ts +0 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/channel-delivery-store.test.ts +0 -1
- package/src/__tests__/channel-guardian.test.ts +5 -7
- package/src/__tests__/channel-retry-sweep.test.ts +0 -1
- package/src/__tests__/checker.test.ts +32 -36
- package/src/__tests__/compaction.benchmark.test.ts +16 -14
- package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
- package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
- package/src/__tests__/computer-use-tools.test.ts +35 -31
- package/src/__tests__/config-schema.test.ts +11 -15
- package/src/__tests__/config-watcher.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/conflict-store.test.ts +0 -1
- package/src/__tests__/connection-policy.test.ts +4 -7
- package/src/__tests__/contacts-tools.test.ts +0 -1
- package/src/__tests__/context-memory-e2e.test.ts +2 -4
- package/src/__tests__/context-overflow-reducer.test.ts +2 -4
- package/src/__tests__/context-window-manager.test.ts +147 -60
- package/src/__tests__/contradiction-checker.test.ts +0 -1
- package/src/__tests__/conversation-attention-store.test.ts +0 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +31 -7
- package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
- package/src/__tests__/conversation-store.test.ts +0 -1
- package/src/__tests__/conversation-unread-route.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +8 -8
- package/src/__tests__/cross-provider-web-search.test.ts +353 -0
- package/src/__tests__/daemon-assistant-events.test.ts +6 -7
- package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
- package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
- package/src/__tests__/diagnostics-export.test.ts +189 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
- package/src/__tests__/entity-extractor.test.ts +0 -1
- package/src/__tests__/entity-search.test.ts +0 -1
- package/src/__tests__/ephemeral-permissions.test.ts +2 -4
- package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
- package/src/__tests__/file-read-tool.test.ts +86 -0
- package/src/__tests__/followup-tools.test.ts +0 -1
- package/src/__tests__/frontmatter.test.ts +77 -34
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/gateway-only-guard.test.ts +1 -1
- package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
- package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
- package/src/__tests__/guardian-action-store.test.ts +0 -1
- package/src/__tests__/guardian-action-sweep.test.ts +0 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-outbound-http.test.ts +0 -1
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
- package/src/__tests__/guardian-routing-state.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
- package/src/__tests__/host-bash-proxy.test.ts +335 -0
- package/src/__tests__/host-file-proxy.test.ts +374 -0
- package/src/__tests__/host-shell-tool.test.ts +147 -1
- package/src/__tests__/http-user-message-parity.test.ts +361 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
- package/src/__tests__/integration-status.test.ts +3 -8
- package/src/__tests__/intent-routing.test.ts +7 -46
- package/src/__tests__/invite-redemption-service.test.ts +0 -1
- package/src/__tests__/invite-routes-http.test.ts +0 -1
- package/src/__tests__/llm-usage-store.test.ts +0 -1
- package/src/__tests__/managed-avatar-client.test.ts +101 -55
- package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
- package/src/__tests__/managed-store.test.ts +94 -21
- package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
- package/src/__tests__/memory-recall-quality.test.ts +0 -1
- package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
- package/src/__tests__/memory-regressions.test.ts +0 -1
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
- package/src/__tests__/messaging-send-tool.test.ts +35 -0
- package/src/__tests__/messaging-skill-split.test.ts +138 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
- package/src/__tests__/migration-export-http.test.ts +2 -3
- package/src/__tests__/migration-import-commit-http.test.ts +1 -2
- package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
- package/src/__tests__/migration-validate-http.test.ts +1 -2
- package/src/__tests__/native-web-search.test.ts +475 -0
- package/src/__tests__/navigate-settings-tab.test.ts +84 -0
- package/src/__tests__/non-member-access-request.test.ts +0 -1
- package/src/__tests__/notification-broadcaster.test.ts +15 -15
- package/src/__tests__/notification-decision-strategy.test.ts +6 -6
- package/src/__tests__/notification-deep-link.test.ts +7 -7
- package/src/__tests__/notification-guardian-path.test.ts +2 -3
- package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
- package/src/__tests__/notification-thread-candidates.test.ts +4 -4
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
- package/src/__tests__/onboarding-template-contract.test.ts +0 -10
- package/src/__tests__/playbook-execution.test.ts +0 -1
- package/src/__tests__/playbook-tools.test.ts +0 -1
- package/src/__tests__/profile-compiler.test.ts +0 -1
- package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
- package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
- package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
- package/src/__tests__/recording-handler.test.ts +30 -94
- package/src/__tests__/registry.test.ts +28 -35
- package/src/__tests__/relay-server.test.ts +0 -1
- package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +0 -1
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
- package/src/__tests__/schedule-store.test.ts +441 -1
- package/src/__tests__/schedule-tools.test.ts +468 -7
- package/src/__tests__/scheduler-recurrence.test.ts +196 -23
- package/src/__tests__/scoped-approval-grants.test.ts +0 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
- package/src/__tests__/secret-response-routing.test.ts +4 -1
- package/src/__tests__/send-endpoint-busy.test.ts +14 -5
- package/src/__tests__/send-notification-tool.test.ts +0 -7
- package/src/__tests__/sequence-store.test.ts +0 -1
- package/src/__tests__/server-history-render.test.ts +1 -2
- package/src/__tests__/session-abort-tool-results.test.ts +0 -1
- package/src/__tests__/session-agent-loop.test.ts +46 -6
- package/src/__tests__/session-confirmation-signals.test.ts +7 -46
- package/src/__tests__/session-conflict-gate.test.ts +2 -6
- package/src/__tests__/session-error.test.ts +5 -14
- package/src/__tests__/session-init.benchmark.test.ts +3 -5
- package/src/__tests__/session-load-history-repair.test.ts +0 -1
- package/src/__tests__/session-media-retry.test.ts +12 -74
- package/src/__tests__/session-pre-run-repair.test.ts +0 -1
- package/src/__tests__/session-profile-injection.test.ts +2 -6
- package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
- package/src/__tests__/session-queue.test.ts +94 -139
- package/src/__tests__/session-skill-tools.test.ts +115 -115
- package/src/__tests__/session-slash-known.test.ts +0 -1
- package/src/__tests__/session-slash-queue.test.ts +0 -1
- package/src/__tests__/session-slash-unknown.test.ts +0 -1
- package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
- package/src/__tests__/session-usage.test.ts +0 -1
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
- package/src/__tests__/session-workspace-injection.test.ts +2 -6
- package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
- package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
- package/src/__tests__/skill-feature-flags.test.ts +125 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
- package/src/__tests__/skill-load-tool.test.ts +194 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
- package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
- package/src/__tests__/skills.test.ts +14 -53
- package/src/__tests__/slack-channel-config.test.ts +0 -1
- package/src/__tests__/slack-inbound-verification.test.ts +0 -1
- package/src/__tests__/slack-skill.test.ts +1 -1
- package/src/__tests__/starter-task-flow.test.ts +9 -19
- package/src/__tests__/subagent-tools.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +7 -7
- package/src/__tests__/task-compiler.test.ts +0 -1
- package/src/__tests__/task-management-tools.test.ts +0 -1
- package/src/__tests__/task-memory-cleanup.test.ts +0 -1
- package/src/__tests__/task-runner.test.ts +0 -1
- package/src/__tests__/task-scheduler.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +0 -1
- package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
- package/src/__tests__/thread-seed-composer.test.ts +5 -5
- package/src/__tests__/tool-approval-handler.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +8 -86
- package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
- package/src/__tests__/tool-notification-listener.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
- package/src/__tests__/trust-store.test.ts +84 -8
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/trusted-contact-verification.test.ts +0 -1
- package/src/__tests__/twilio-provider.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
- package/src/__tests__/update-bulletin.test.ts +0 -1
- package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
- package/src/__tests__/usage-routes.test.ts +0 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
- package/src/__tests__/voice-invite-redemption.test.ts +0 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
- package/src/__tests__/voice-session-bridge.test.ts +9 -1
- package/src/__tests__/web-fetch.test.ts +57 -0
- package/src/__tests__/workspace-git-service.test.ts +5 -14
- package/src/__tests__/workspace-policy.test.ts +0 -1
- package/src/agent/loop.ts +22 -34
- package/src/bundler/bundle-signer.ts +4 -4
- package/src/calls/call-controller.ts +1 -1
- package/src/calls/relay-server.ts +1 -1
- package/src/calls/twilio-rest.ts +1 -1
- package/src/calls/voice-session-bridge.ts +3 -1
- package/src/cli/__tests__/notifications.test.ts +3 -4
- package/src/cli/commands/map.ts +2 -6
- package/src/cli/commands/mcp.ts +73 -15
- package/src/cli/commands/notifications.ts +4 -4
- package/src/cli/commands/sessions.ts +9 -1
- package/src/cli/commands/skills.ts +6 -10
- package/src/cli/http-client.ts +2 -3
- package/src/cli/main-screen.tsx +10 -10
- package/src/cli/program.ts +0 -4
- package/src/cli/reference.ts +0 -2
- package/src/cli.ts +15 -9
- package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +6 -7
- package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
- package/src/config/bundled-skills/browser/SKILL.md +6 -1
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
- package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
- package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
- package/src/config/bundled-skills/contacts/SKILL.md +10 -1
- package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
- package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -1
- package/src/config/bundled-skills/doordash/SKILL.md +8 -2
- package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -82
- package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -28
- package/src/config/bundled-skills/doordash/lib/session.ts +21 -17
- package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
- package/src/config/bundled-skills/followups/SKILL.md +4 -1
- package/src/config/bundled-skills/gmail/SKILL.md +180 -0
- package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
- package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
- package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
- package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
- package/src/config/bundled-skills/messaging/SKILL.md +23 -139
- package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
- package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
- package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
- package/src/config/bundled-skills/notifications/SKILL.md +5 -1
- package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
- package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → orchestration/tools/swarm-delegate.ts} +3 -3
- package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
- package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
- package/src/config/bundled-skills/schedule/SKILL.md +70 -9
- package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
- package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
- package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
- package/src/config/bundled-skills/sequences/SKILL.md +47 -0
- package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
- package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
- package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
- package/src/config/bundled-skills/settings/SKILL.md +12 -0
- package/src/config/bundled-skills/settings/TOOLS.json +112 -0
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
- package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
- package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
- package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
- package/src/config/bundled-skills/slack/SKILL.md +5 -1
- package/src/config/bundled-skills/subagent/SKILL.md +4 -1
- package/src/config/bundled-skills/tasks/SKILL.md +5 -2
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
- package/src/config/bundled-skills/watcher/SKILL.md +4 -1
- package/src/config/bundled-tool-registry.ts +118 -107
- package/src/config/env.ts +5 -2
- package/src/config/feature-flag-registry.json +33 -9
- package/src/config/loader.ts +10 -2
- package/src/config/schema.ts +19 -16
- package/src/config/schemas/inference.ts +12 -22
- package/src/config/schemas/memory-storage.ts +19 -1
- package/src/config/schemas/platform.ts +0 -16
- package/src/config/skill-state.ts +11 -8
- package/src/config/skills.ts +83 -32
- package/src/context/token-estimator.ts +11 -0
- package/src/context/window-manager.ts +180 -151
- package/src/daemon/computer-use-session.ts +11 -43
- package/src/daemon/daemon-control.ts +4 -1
- package/src/daemon/handlers/config-channels.ts +5 -9
- package/src/daemon/handlers/config-ingress.ts +0 -4
- package/src/daemon/handlers/config-model.ts +7 -13
- package/src/daemon/handlers/config-telegram.ts +4 -8
- package/src/daemon/handlers/config-voice.ts +2 -5
- package/src/daemon/handlers/dictation.ts +2 -12
- package/src/daemon/handlers/identity.ts +0 -105
- package/src/daemon/handlers/recording.ts +3 -23
- package/src/daemon/handlers/session-history.ts +42 -10
- package/src/daemon/handlers/sessions.ts +53 -72
- package/src/daemon/handlers/shared.ts +7 -28
- package/src/daemon/handlers/skills.ts +31 -27
- package/src/daemon/host-bash-proxy.ts +148 -0
- package/src/daemon/host-file-proxy.ts +135 -0
- package/src/daemon/lifecycle.ts +53 -41
- package/src/daemon/mcp-reload-service.ts +123 -0
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/apps.ts +0 -25
- package/src/daemon/message-types/browser.ts +1 -1
- package/src/daemon/message-types/computer-use.ts +1 -4
- package/src/daemon/message-types/guardian-actions.ts +1 -1
- package/src/daemon/message-types/host-bash.ts +18 -0
- package/src/daemon/message-types/host-file.ts +44 -0
- package/src/daemon/message-types/integrations.ts +1 -73
- package/src/daemon/message-types/messages.ts +15 -0
- package/src/daemon/message-types/schedules.ts +11 -27
- package/src/daemon/message-types/sessions.ts +8 -2
- package/src/daemon/message-types/settings.ts +1 -1
- package/src/daemon/message-types/shared.ts +1 -1
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/ride-shotgun-handler.ts +35 -43
- package/src/daemon/seed-files.ts +3 -27
- package/src/daemon/server.ts +45 -28
- package/src/daemon/session-agent-loop-handlers.ts +72 -9
- package/src/daemon/session-agent-loop.ts +97 -66
- package/src/daemon/session-attachments.ts +1 -1
- package/src/daemon/session-error.ts +17 -16
- package/src/daemon/session-lifecycle.ts +20 -1
- package/src/daemon/session-media-retry.ts +1 -15
- package/src/daemon/session-messaging.ts +14 -6
- package/src/daemon/session-process.ts +36 -7
- package/src/daemon/session-queue-manager.ts +62 -103
- package/src/daemon/session-runtime-assembly.ts +27 -7
- package/src/daemon/session-skill-tools.ts +12 -11
- package/src/daemon/session-slash.ts +7 -0
- package/src/daemon/session-surfaces.ts +192 -118
- package/src/daemon/session-tool-setup.ts +146 -6
- package/src/daemon/session.ts +75 -37
- package/src/errors.ts +0 -2
- package/src/export/formatter.ts +6 -0
- package/src/mcp/mcp-oauth-provider.ts +1 -3
- package/src/media/avatar-router.ts +20 -28
- package/src/media/avatar-types.ts +7 -14
- package/src/media/managed-avatar-client.ts +70 -34
- package/src/memory/app-store.ts +0 -18
- package/src/memory/conversation-title-service.ts +1 -2
- package/src/memory/db-init.ts +16 -0
- package/src/memory/embedding-backend.ts +129 -27
- package/src/memory/embedding-gemini.test.ts +256 -0
- package/src/memory/embedding-gemini.ts +47 -13
- package/src/memory/embedding-local.ts +14 -2
- package/src/memory/embedding-ollama.ts +15 -2
- package/src/memory/embedding-openai.ts +15 -2
- package/src/memory/embedding-types.test.ts +116 -0
- package/src/memory/embedding-types.ts +61 -0
- package/src/memory/fingerprint.ts +1 -1
- package/src/memory/indexer.ts +25 -1
- package/src/memory/job-handlers/embedding.test.ts +258 -0
- package/src/memory/job-handlers/embedding.ts +81 -1
- package/src/memory/job-handlers/index-maintenance.ts +35 -1
- package/src/memory/job-handlers/media-processing.ts +11 -1
- package/src/memory/job-utils.ts +21 -6
- package/src/memory/jobs-store.ts +5 -1
- package/src/memory/jobs-worker.ts +8 -0
- package/src/memory/message-content.ts +66 -0
- package/src/memory/migrations/100-core-tables.ts +1 -31
- package/src/memory/migrations/104-core-indexes.ts +0 -11
- package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
- package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
- package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/migrations/registry.ts +19 -0
- package/src/memory/qdrant-client.ts +158 -43
- package/src/memory/retriever.test.ts +0 -1
- package/src/memory/retriever.ts +12 -2
- package/src/memory/schema/infrastructure.ts +5 -37
- package/src/memory/search/formatting.ts +34 -9
- package/src/memory/search/semantic.ts +57 -2
- package/src/memory/search/types.ts +2 -1
- package/src/notifications/AGENTS.md +2 -2
- package/src/notifications/README.md +59 -58
- package/src/notifications/adapters/macos.ts +1 -1
- package/src/notifications/broadcaster.ts +5 -5
- package/src/notifications/copy-composer.ts +1 -1
- package/src/notifications/decision-engine.ts +2 -2
- package/src/notifications/destination-resolver.ts +2 -2
- package/src/notifications/emit-signal.ts +8 -8
- package/src/notifications/signal.ts +1 -1
- package/src/notifications/thread-seed-composer.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +1 -1
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +12 -1
- package/src/permissions/defaults.ts +13 -17
- package/src/permissions/trust-store.ts +37 -0
- package/src/permissions/workspace-policy.ts +0 -1
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
- package/src/prompts/computer-use-prompt.ts +1 -1
- package/src/prompts/system-prompt.ts +33 -35
- package/src/prompts/templates/BOOTSTRAP.md +0 -3
- package/src/prompts/templates/SOUL.md +1 -2
- package/src/prompts/templates/UPDATES.md +16 -7
- package/src/providers/anthropic/client.ts +87 -33
- package/src/providers/gemini/client.ts +6 -0
- package/src/providers/managed-proxy/constants.ts +5 -0
- package/src/providers/openai/client.ts +15 -0
- package/src/providers/registry.ts +4 -6
- package/src/providers/types.ts +24 -2
- package/src/runtime/AGENTS.md +18 -0
- package/src/runtime/assistant-event-hub.ts +2 -3
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/auth/__tests__/context.test.ts +5 -5
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +3 -2
- package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
- package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
- package/src/runtime/auth/__tests__/scopes.test.ts +9 -8
- package/src/runtime/auth/__tests__/subject.test.ts +8 -8
- package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
- package/src/runtime/auth/route-policy.ts +8 -8
- package/src/runtime/auth/scopes.ts +2 -1
- package/src/runtime/auth/subject.ts +4 -4
- package/src/runtime/auth/token-service.ts +1 -24
- package/src/runtime/auth/types.ts +3 -3
- package/src/runtime/guardian-action-followup-executor.ts +1 -1
- package/src/runtime/guardian-action-grant-minter.ts +1 -1
- package/src/runtime/guardian-action-service.ts +3 -3
- package/src/runtime/http-server.ts +15 -2
- package/src/runtime/http-types.ts +10 -0
- package/src/runtime/invite-service.ts +3 -3
- package/src/runtime/local-actor-identity.ts +17 -22
- package/src/runtime/middleware/error-handler.ts +14 -1
- package/src/runtime/pending-interactions.ts +21 -9
- package/src/runtime/routes/app-management-routes.ts +63 -67
- package/src/runtime/routes/approval-routes.ts +1 -3
- package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
- package/src/runtime/routes/brain-graph-routes.ts +4 -42
- package/src/runtime/routes/btw-routes.ts +155 -0
- package/src/runtime/routes/computer-use-routes.ts +77 -31
- package/src/runtime/routes/conversation-routes.ts +234 -47
- package/src/runtime/routes/diagnostics-routes.ts +154 -43
- package/src/runtime/routes/documents-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/host-bash-routes.ts +83 -0
- package/src/runtime/routes/host-file-routes.ts +79 -0
- package/src/runtime/routes/integrations/slack/share.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +120 -0
- package/src/runtime/routes/mcp-routes.ts +20 -0
- package/src/runtime/routes/migration-routes.ts +3 -3
- package/src/runtime/routes/pairing-routes.ts +1 -1
- package/src/runtime/routes/recording-routes.ts +6 -4
- package/src/runtime/routes/schedule-routes.ts +31 -5
- package/src/runtime/routes/session-management-routes.ts +2 -6
- package/src/runtime/routes/session-query-routes.ts +18 -15
- package/src/runtime/routes/settings-routes.ts +7 -351
- package/src/runtime/routes/skills-routes.ts +7 -6
- package/src/runtime/routes/subagents-routes.ts +4 -10
- package/src/runtime/routes/surface-action-routes.ts +3 -14
- package/src/runtime/routes/surface-content-routes.ts +22 -5
- package/src/runtime/routes/work-items-routes.ts +21 -25
- package/src/runtime/routes/workspace-routes.test.ts +3 -3
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/telegram-streaming-delivery.ts +3 -0
- package/src/runtime/verification-outbound-actions.ts +2 -2
- package/src/schedule/integration-status.ts +0 -6
- package/src/schedule/schedule-store.ts +234 -43
- package/src/schedule/scheduler.ts +73 -74
- package/src/security/oauth2.ts +1 -1
- package/src/sequence/store.ts +12 -2
- package/src/skills/frontmatter.ts +19 -77
- package/src/skills/managed-store.ts +11 -2
- package/src/subagent/manager.ts +5 -3
- package/src/tasks/ephemeral-permissions.ts +3 -5
- package/src/tools/AGENTS.md +37 -0
- package/src/tools/apps/executors.ts +0 -6
- package/src/tools/browser/browser-manager.ts +17 -11
- package/src/tools/browser/jit-auth.ts +4 -1
- package/src/tools/claude-code/claude-code.ts +1 -1
- package/src/tools/computer-use/definitions.ts +48 -60
- package/src/tools/document/document-tool.ts +6 -6
- package/src/tools/document/editor-template.ts +10 -8
- package/src/tools/filesystem/edit.ts +2 -1
- package/src/tools/filesystem/read.ts +20 -2
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +17 -1
- package/src/tools/host-filesystem/read.ts +16 -1
- package/src/tools/host-filesystem/write.ts +15 -1
- package/src/tools/host-terminal/host-shell.ts +24 -0
- package/src/tools/memory/definitions.ts +45 -81
- package/src/tools/memory/handlers.test.ts +0 -1
- package/src/tools/memory/handlers.ts +1 -1
- package/src/tools/memory/register.ts +26 -60
- package/src/tools/network/script-proxy/session-manager.ts +6 -8
- package/src/tools/network/web-fetch.ts +7 -1
- package/src/tools/network/web-search.ts +2 -1
- package/src/tools/registry.ts +23 -0
- package/src/tools/schedule/create.ts +113 -5
- package/src/tools/schedule/list.ts +57 -15
- package/src/tools/schedule/update.ts +73 -3
- package/src/tools/shared/filesystem/image-read.ts +192 -0
- package/src/tools/side-effects.ts +1 -7
- package/src/tools/skills/delete-managed.ts +27 -64
- package/src/tools/skills/execute.ts +54 -0
- package/src/tools/skills/load.ts +127 -5
- package/src/tools/skills/scaffold-managed.ts +93 -172
- package/src/tools/subagent/message.ts +0 -7
- package/src/tools/subagent/spawn.ts +1 -1
- package/src/tools/swarm/delegate.ts +0 -3
- package/src/tools/system/avatar-generator.ts +13 -19
- package/src/tools/system/request-permission.ts +2 -1
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/tool-manifest.ts +41 -47
- package/src/tools/types.ts +6 -2
- package/src/tools/ui-surface/definitions.ts +0 -55
- package/src/util/errors.ts +12 -10
- package/src/workspace/git-service.ts +0 -2
- package/src/__tests__/account-registry.test.ts +0 -258
- package/src/__tests__/email-classifier.test.ts +0 -25
- package/src/__tests__/gmail-integration.test.ts +0 -97
- package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
- package/src/__tests__/home-base-bootstrap.test.ts +0 -84
- package/src/__tests__/managed-twitter-guardrails.test.ts +0 -353
- package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
- package/src/__tests__/recording-intent-fallback.test.ts +0 -199
- package/src/__tests__/recording-intent.test.ts +0 -985
- package/src/__tests__/recording-state-machine.test.ts +0 -1574
- package/src/__tests__/reminder-store.test.ts +0 -350
- package/src/__tests__/reminder.test.ts +0 -337
- package/src/__tests__/scan-result-store.test.ts +0 -121
- package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -450
- package/src/__tests__/view-image-tool.test.ts +0 -241
- package/src/cli/commands/amazon/cart.ts +0 -513
- package/src/cli/commands/amazon/checkout.ts +0 -394
- package/src/cli/commands/amazon/client.ts +0 -513
- package/src/cli/commands/amazon/index.ts +0 -920
- package/src/cli/commands/amazon/product-details.ts +0 -145
- package/src/cli/commands/amazon/request-extractor.ts +0 -187
- package/src/cli/commands/amazon/search.ts +0 -76
- package/src/cli/commands/amazon/session.ts +0 -116
- package/src/cli/commands/twitter/__tests__/cli-error-shaping.test.ts +0 -265
- package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -483
- package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -412
- package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -197
- package/src/cli/commands/twitter/client.ts +0 -989
- package/src/cli/commands/twitter/index.ts +0 -1160
- package/src/cli/commands/twitter/oauth-client.ts +0 -94
- package/src/cli/commands/twitter/router.ts +0 -396
- package/src/cli/commands/twitter/session.ts +0 -121
- package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
- package/src/config/bundled-skills/agentmail/icon.svg +0 -21
- package/src/config/bundled-skills/amazon/SKILL.md +0 -137
- package/src/config/bundled-skills/amazon/icon.svg +0 -13
- package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
- package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
- package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
- package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
- package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
- package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
- package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
- package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
- package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
- package/src/config/bundled-skills/influencer/SKILL.md +0 -144
- package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
- package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
- package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
- package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
- package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
- package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
- package/src/config/bundled-skills/notion/SKILL.md +0 -240
- package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
- package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
- package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
- package/src/config/bundled-skills/reminder/SKILL.md +0 -79
- package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
- package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
- package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
- package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
- package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
- package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
- package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
- package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
- package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
- package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
- package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
- package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
- package/src/config/bundled-skills/twitter/SKILL.md +0 -319
- package/src/config/bundled-skills/twitter/icon.svg +0 -14
- package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
- package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
- package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
- package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
- package/src/daemon/handlers/pairing.ts +0 -119
- package/src/daemon/handlers/session-user-message.ts +0 -961
- package/src/daemon/recording-executor.ts +0 -180
- package/src/daemon/recording-intent-fallback.ts +0 -162
- package/src/daemon/recording-intent.ts +0 -493
- package/src/home-base/app-link-store.ts +0 -78
- package/src/home-base/bootstrap.ts +0 -74
- package/src/home-base/prebuilt/brain-graph.html +0 -1483
- package/src/home-base/prebuilt/index.html +0 -702
- package/src/home-base/prebuilt/seed-metadata.json +0 -21
- package/src/home-base/prebuilt/seed.ts +0 -122
- package/src/home-base/prebuilt-home-base-updater.ts +0 -36
- package/src/memory/account-store.ts +0 -117
- package/src/messaging/activity-analyzer.ts +0 -76
- package/src/messaging/email-classifier.ts +0 -208
- package/src/messaging/index.ts +0 -2
- package/src/messaging/outreach-classifier.ts +0 -185
- package/src/messaging/thread-summarizer.ts +0 -346
- package/src/messaging/types.ts +0 -17
- package/src/tools/browser/x-auto-navigate.ts +0 -254
- package/src/tools/credentials/account-registry.ts +0 -144
- package/src/tools/filesystem/view-image.ts +0 -244
- package/src/tools/reminder/reminder-store.ts +0 -194
- package/src/tools/reminder/reminder.ts +0 -158
- package/src/tools/system/navigate-settings.ts +0 -74
- package/src/tools/system/open-system-settings.ts +0 -85
- package/src/tools/system/version.ts +0 -54
- package/src/twitter/platform-proxy-client.ts +0 -405
- package/src/util/cookie-session.ts +0 -98
- /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import { bootstrapConversation } from "../memory/conversation-bootstrap.js";
|
|
2
2
|
import { invalidateAssistantInferredItemsForConversation } from "../memory/task-memory-cleanup.js";
|
|
3
3
|
import { runSequencesOnce } from "../sequence/engine.js";
|
|
4
|
-
import {
|
|
5
|
-
claimDueReminders,
|
|
6
|
-
completeReminder,
|
|
7
|
-
failReminder,
|
|
8
|
-
type RoutingIntent,
|
|
9
|
-
setReminderConversationId,
|
|
10
|
-
} from "../tools/reminder/reminder-store.js";
|
|
11
4
|
import { getLogger } from "../util/logger.js";
|
|
12
5
|
import {
|
|
13
6
|
runWatchersOnce,
|
|
@@ -17,8 +10,11 @@ import {
|
|
|
17
10
|
import { hasSetConstructs } from "./recurrence-engine.js";
|
|
18
11
|
import {
|
|
19
12
|
claimDueSchedules,
|
|
13
|
+
completeOneShot,
|
|
20
14
|
completeScheduleRun,
|
|
21
15
|
createScheduleRun,
|
|
16
|
+
failOneShot,
|
|
17
|
+
type RoutingIntent,
|
|
22
18
|
} from "./schedule-store.js";
|
|
23
19
|
|
|
24
20
|
const log = getLogger("scheduler");
|
|
@@ -33,13 +29,13 @@ export type ScheduleMessageProcessor = (
|
|
|
33
29
|
options?: ScheduleMessageOptions,
|
|
34
30
|
) => Promise<unknown>;
|
|
35
31
|
|
|
36
|
-
export type
|
|
32
|
+
export type ScheduleNotifyModeNotifier = (payload: {
|
|
37
33
|
id: string;
|
|
38
34
|
label: string;
|
|
39
35
|
message: string;
|
|
40
36
|
routingIntent: RoutingIntent;
|
|
41
37
|
routingHints: Record<string, unknown>;
|
|
42
|
-
}) => void
|
|
38
|
+
}) => void | Promise<void>;
|
|
43
39
|
|
|
44
40
|
export type ScheduleNotifier = (schedule: { id: string; name: string }) => void;
|
|
45
41
|
|
|
@@ -58,7 +54,7 @@ const TICK_INTERVAL_MS = 15_000;
|
|
|
58
54
|
|
|
59
55
|
export function startScheduler(
|
|
60
56
|
processMessage: ScheduleMessageProcessor,
|
|
61
|
-
|
|
57
|
+
notifyScheduleOneShot: ScheduleNotifyModeNotifier,
|
|
62
58
|
notifySchedule: ScheduleNotifier,
|
|
63
59
|
watcherNotifier?: WatcherNotifier,
|
|
64
60
|
watcherEscalator?: WatcherEscalator,
|
|
@@ -73,7 +69,7 @@ export function startScheduler(
|
|
|
73
69
|
try {
|
|
74
70
|
await runScheduleOnce(
|
|
75
71
|
processMessage,
|
|
76
|
-
|
|
72
|
+
notifyScheduleOneShot,
|
|
77
73
|
notifySchedule,
|
|
78
74
|
watcherNotifier,
|
|
79
75
|
watcherEscalator,
|
|
@@ -96,7 +92,7 @@ export function startScheduler(
|
|
|
96
92
|
async runOnce(): Promise<number> {
|
|
97
93
|
return runScheduleOnce(
|
|
98
94
|
processMessage,
|
|
99
|
-
|
|
95
|
+
notifyScheduleOneShot,
|
|
100
96
|
notifySchedule,
|
|
101
97
|
watcherNotifier,
|
|
102
98
|
watcherEscalator,
|
|
@@ -112,7 +108,7 @@ export function startScheduler(
|
|
|
112
108
|
|
|
113
109
|
async function runScheduleOnce(
|
|
114
110
|
processMessage: ScheduleMessageProcessor,
|
|
115
|
-
|
|
111
|
+
notifyScheduleOneShot: ScheduleNotifyModeNotifier,
|
|
116
112
|
notifySchedule: ScheduleNotifier,
|
|
117
113
|
watcherNotifier?: WatcherNotifier,
|
|
118
114
|
watcherEscalator?: WatcherEscalator,
|
|
@@ -121,15 +117,60 @@ async function runScheduleOnce(
|
|
|
121
117
|
const now = Date.now();
|
|
122
118
|
let processed = 0;
|
|
123
119
|
|
|
124
|
-
// ──
|
|
120
|
+
// ── Schedules (recurring cron/RRULE + one-shot) ─────────────────────
|
|
125
121
|
const jobs = claimDueSchedules(now);
|
|
126
122
|
for (const job of jobs) {
|
|
123
|
+
const isOneShot = job.expression == null;
|
|
124
|
+
|
|
125
|
+
// ── Notify mode (one-shot or recurring) ─────────────────────────
|
|
126
|
+
if (job.mode === "notify") {
|
|
127
|
+
try {
|
|
128
|
+
log.info(
|
|
129
|
+
{ jobId: job.id, name: job.name, isOneShot },
|
|
130
|
+
"Firing schedule notification",
|
|
131
|
+
);
|
|
132
|
+
await notifyScheduleOneShot({
|
|
133
|
+
id: job.id,
|
|
134
|
+
label: job.name,
|
|
135
|
+
message: job.message,
|
|
136
|
+
routingIntent: job.routingIntent,
|
|
137
|
+
routingHints: job.routingHints,
|
|
138
|
+
});
|
|
139
|
+
if (isOneShot) {
|
|
140
|
+
completeOneShot(job.id);
|
|
141
|
+
} else {
|
|
142
|
+
// Track recurring notify-mode success so lastStatus resets to ok
|
|
143
|
+
// and retryCount clears after a transient failure.
|
|
144
|
+
const runId = createScheduleRun(job.id, `notify-ok:${job.id}`);
|
|
145
|
+
completeScheduleRun(runId, { status: "ok" });
|
|
146
|
+
}
|
|
147
|
+
} catch (err) {
|
|
148
|
+
log.warn(
|
|
149
|
+
{ err, jobId: job.id, name: job.name, isOneShot },
|
|
150
|
+
"Schedule notification failed",
|
|
151
|
+
);
|
|
152
|
+
if (isOneShot) {
|
|
153
|
+
failOneShot(job.id);
|
|
154
|
+
} else {
|
|
155
|
+
// Track recurring notify-mode failures via a schedule run so the
|
|
156
|
+
// occurrence isn't silently lost and lastStatus/retryCount update.
|
|
157
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
158
|
+
const runId = createScheduleRun(job.id, `notify-error:${job.id}`);
|
|
159
|
+
completeScheduleRun(runId, { status: "error", error: errorMsg });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
processed += 1;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// ── Execute mode ────────────────────────────────────────────────
|
|
167
|
+
|
|
127
168
|
// Check if message is a task invocation (run_task:<task_id>)
|
|
128
169
|
const taskMatch = job.message.match(/^run_task:(\S+)$/);
|
|
129
170
|
if (taskMatch) {
|
|
130
171
|
const taskId = taskMatch[1];
|
|
131
172
|
const isRruleSet =
|
|
132
|
-
job.syntax === "rrule" && hasSetConstructs(job.expression);
|
|
173
|
+
job.syntax === "rrule" && job.expression != null && hasSetConstructs(job.expression);
|
|
133
174
|
try {
|
|
134
175
|
log.info(
|
|
135
176
|
{
|
|
@@ -139,6 +180,7 @@ async function runScheduleOnce(
|
|
|
139
180
|
syntax: job.syntax,
|
|
140
181
|
expression: job.expression,
|
|
141
182
|
isRruleSet,
|
|
183
|
+
isOneShot,
|
|
142
184
|
},
|
|
143
185
|
"Executing scheduled task",
|
|
144
186
|
);
|
|
@@ -159,9 +201,11 @@ async function runScheduleOnce(
|
|
|
159
201
|
status: "error",
|
|
160
202
|
error: result.error ?? "Task run failed",
|
|
161
203
|
});
|
|
204
|
+
if (isOneShot) failOneShot(job.id);
|
|
162
205
|
} else {
|
|
163
206
|
completeScheduleRun(runId, { status: "ok" });
|
|
164
207
|
notifySchedule({ id: job.id, name: job.name });
|
|
208
|
+
if (isOneShot) completeOneShot(job.id);
|
|
165
209
|
}
|
|
166
210
|
processed += 1;
|
|
167
211
|
} catch (err) {
|
|
@@ -175,6 +219,7 @@ async function runScheduleOnce(
|
|
|
175
219
|
syntax: job.syntax,
|
|
176
220
|
expression: job.expression,
|
|
177
221
|
isRruleSet,
|
|
222
|
+
isOneShot,
|
|
178
223
|
},
|
|
179
224
|
"Scheduled task execution failed",
|
|
180
225
|
);
|
|
@@ -192,6 +237,7 @@ async function runScheduleOnce(
|
|
|
192
237
|
});
|
|
193
238
|
const runId = createScheduleRun(job.id, fallbackConversation.id);
|
|
194
239
|
completeScheduleRun(runId, { status: "error", error: message });
|
|
240
|
+
if (isOneShot) failOneShot(job.id);
|
|
195
241
|
}
|
|
196
242
|
continue;
|
|
197
243
|
}
|
|
@@ -200,7 +246,9 @@ async function runScheduleOnce(
|
|
|
200
246
|
source: "schedule",
|
|
201
247
|
scheduleJobId: job.id,
|
|
202
248
|
origin: "schedule",
|
|
203
|
-
systemHint:
|
|
249
|
+
systemHint: isOneShot
|
|
250
|
+
? `Reminder: ${job.name}`
|
|
251
|
+
: `Schedule: ${job.name}`,
|
|
204
252
|
});
|
|
205
253
|
onScheduleThreadCreated?.({
|
|
206
254
|
conversationId: conversation.id,
|
|
@@ -209,7 +257,7 @@ async function runScheduleOnce(
|
|
|
209
257
|
});
|
|
210
258
|
const runId = createScheduleRun(job.id, conversation.id);
|
|
211
259
|
const isRruleSetMsg =
|
|
212
|
-
job.syntax === "rrule" && hasSetConstructs(job.expression);
|
|
260
|
+
job.syntax === "rrule" && job.expression != null && hasSetConstructs(job.expression);
|
|
213
261
|
|
|
214
262
|
try {
|
|
215
263
|
log.info(
|
|
@@ -219,15 +267,17 @@ async function runScheduleOnce(
|
|
|
219
267
|
syntax: job.syntax,
|
|
220
268
|
expression: job.expression,
|
|
221
269
|
isRruleSet: isRruleSetMsg,
|
|
270
|
+
isOneShot,
|
|
222
271
|
conversationId: conversation.id,
|
|
223
272
|
},
|
|
224
|
-
"Executing schedule",
|
|
273
|
+
isOneShot ? "Executing one-shot schedule" : "Executing schedule",
|
|
225
274
|
);
|
|
226
275
|
await processMessage(conversation.id, job.message, {
|
|
227
276
|
trustClass: "guardian",
|
|
228
277
|
});
|
|
229
278
|
completeScheduleRun(runId, { status: "ok" });
|
|
230
279
|
notifySchedule({ id: job.id, name: job.name });
|
|
280
|
+
if (isOneShot) completeOneShot(job.id);
|
|
231
281
|
processed += 1;
|
|
232
282
|
} catch (err) {
|
|
233
283
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -239,10 +289,14 @@ async function runScheduleOnce(
|
|
|
239
289
|
syntax: job.syntax,
|
|
240
290
|
expression: job.expression,
|
|
241
291
|
isRruleSet: isRruleSetMsg,
|
|
292
|
+
isOneShot,
|
|
242
293
|
},
|
|
243
|
-
|
|
294
|
+
isOneShot
|
|
295
|
+
? "One-shot schedule execution failed"
|
|
296
|
+
: "Schedule execution failed",
|
|
244
297
|
);
|
|
245
298
|
completeScheduleRun(runId, { status: "error", error: message });
|
|
299
|
+
if (isOneShot) failOneShot(job.id);
|
|
246
300
|
|
|
247
301
|
try {
|
|
248
302
|
invalidateAssistantInferredItemsForConversation(conversation.id);
|
|
@@ -255,61 +309,6 @@ async function runScheduleOnce(
|
|
|
255
309
|
}
|
|
256
310
|
}
|
|
257
311
|
|
|
258
|
-
// ── One-shot reminders ──────────────────────────────────────────────
|
|
259
|
-
const dueReminders = claimDueReminders(now);
|
|
260
|
-
for (const reminder of dueReminders) {
|
|
261
|
-
if (reminder.mode === "execute") {
|
|
262
|
-
const conversation = bootstrapConversation({
|
|
263
|
-
source: "reminder",
|
|
264
|
-
origin: "reminder",
|
|
265
|
-
systemHint: `Reminder: ${reminder.label}`,
|
|
266
|
-
});
|
|
267
|
-
setReminderConversationId(reminder.id, conversation.id);
|
|
268
|
-
try {
|
|
269
|
-
log.info(
|
|
270
|
-
{
|
|
271
|
-
reminderId: reminder.id,
|
|
272
|
-
label: reminder.label,
|
|
273
|
-
conversationId: conversation.id,
|
|
274
|
-
},
|
|
275
|
-
"Executing reminder",
|
|
276
|
-
);
|
|
277
|
-
await processMessage(conversation.id, reminder.message, {
|
|
278
|
-
trustClass: "guardian",
|
|
279
|
-
});
|
|
280
|
-
completeReminder(reminder.id);
|
|
281
|
-
} catch (err) {
|
|
282
|
-
log.warn(
|
|
283
|
-
{ err, reminderId: reminder.id },
|
|
284
|
-
"Reminder execution failed, reverting to pending",
|
|
285
|
-
);
|
|
286
|
-
failReminder(reminder.id);
|
|
287
|
-
}
|
|
288
|
-
} else {
|
|
289
|
-
try {
|
|
290
|
-
log.info(
|
|
291
|
-
{ reminderId: reminder.id, label: reminder.label },
|
|
292
|
-
"Firing reminder notification",
|
|
293
|
-
);
|
|
294
|
-
notifyReminder({
|
|
295
|
-
id: reminder.id,
|
|
296
|
-
label: reminder.label,
|
|
297
|
-
message: reminder.message,
|
|
298
|
-
routingIntent: reminder.routingIntent,
|
|
299
|
-
routingHints: reminder.routingHints,
|
|
300
|
-
});
|
|
301
|
-
completeReminder(reminder.id);
|
|
302
|
-
} catch (err) {
|
|
303
|
-
log.warn(
|
|
304
|
-
{ err, reminderId: reminder.id },
|
|
305
|
-
"Reminder notification failed, reverting to pending",
|
|
306
|
-
);
|
|
307
|
-
failReminder(reminder.id);
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
processed += 1;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
312
|
// ── Watchers (event-driven polling) ────────────────────────────────
|
|
314
313
|
if (watcherNotifier && watcherEscalator) {
|
|
315
314
|
try {
|
package/src/security/oauth2.ts
CHANGED
|
@@ -59,7 +59,7 @@ export interface OAuth2TokenResult {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
export interface OAuth2FlowCallbacks {
|
|
62
|
-
/** Open a URL in the user's browser (e.g. via
|
|
62
|
+
/** Open a URL in the user's browser (e.g. via `open_url` message). */
|
|
63
63
|
openUrl: (url: string) => void;
|
|
64
64
|
}
|
|
65
65
|
|
package/src/sequence/store.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SQLite-backed implementation of the SequenceStore interface.
|
|
3
3
|
*
|
|
4
|
-
* Follows the same patterns as schedule-store.ts
|
|
4
|
+
* Follows the same patterns as schedule-store.ts:
|
|
5
5
|
* - Flat exported functions (no class)
|
|
6
6
|
* - getDb() called inside each function
|
|
7
7
|
* - Optimistic locking for claimDueEnrollments
|
|
@@ -215,7 +215,7 @@ export function listEnrollments(
|
|
|
215
215
|
/**
|
|
216
216
|
* Atomically claim enrollments that are due for processing.
|
|
217
217
|
*
|
|
218
|
-
* Uses the same optimistic locking pattern as
|
|
218
|
+
* Uses the same optimistic locking pattern as claimDueSchedules:
|
|
219
219
|
* 1. Query candidates (status=active, nextStepAt <= now)
|
|
220
220
|
* 2. For each, UPDATE with WHERE status='active' — only succeeds if not already claimed
|
|
221
221
|
* 3. Check rawChanges() to confirm the lock was acquired
|
|
@@ -315,6 +315,16 @@ export function pauseEnrollment(id: string): void {
|
|
|
315
315
|
.run();
|
|
316
316
|
}
|
|
317
317
|
|
|
318
|
+
/** Resume a paused enrollment — re-activates it so the scheduler picks it up. */
|
|
319
|
+
export function resumeEnrollment(id: string): void {
|
|
320
|
+
const db = getDb();
|
|
321
|
+
const now = Date.now();
|
|
322
|
+
db.update(sequenceEnrollments)
|
|
323
|
+
.set({ status: "active", nextStepAt: now, updatedAt: now })
|
|
324
|
+
.where(eq(sequenceEnrollments.id, id))
|
|
325
|
+
.run();
|
|
326
|
+
}
|
|
327
|
+
|
|
318
328
|
// ── Query Helpers ───────────────────────────────────────────────────
|
|
319
329
|
|
|
320
330
|
export function findActiveEnrollmentsByEmail(
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared frontmatter parsing for SKILL.md files.
|
|
3
3
|
*
|
|
4
|
-
* Frontmatter is a YAML
|
|
4
|
+
* Frontmatter is a YAML block delimited by `---` at the top of a file.
|
|
5
5
|
* This module provides a single implementation used by the skill catalog loader
|
|
6
6
|
* and the CC command registry.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { parse as parseYaml } from "yaml";
|
|
10
|
+
|
|
11
|
+
import { getLogger } from "../util/logger.js";
|
|
12
|
+
|
|
13
|
+
const log = getLogger("frontmatter");
|
|
14
|
+
|
|
9
15
|
/** Matches a `---` delimited frontmatter block at the start of a file. */
|
|
10
16
|
export const FRONTMATTER_REGEX = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/;
|
|
11
17
|
|
|
12
18
|
export interface FrontmatterParseResult {
|
|
13
19
|
/** Key-value pairs extracted from the frontmatter block. */
|
|
14
|
-
fields: Record<string,
|
|
20
|
+
fields: Record<string, unknown>;
|
|
15
21
|
/** The remaining file content after the frontmatter block. */
|
|
16
22
|
body: string;
|
|
17
23
|
}
|
|
@@ -20,8 +26,8 @@ export interface FrontmatterParseResult {
|
|
|
20
26
|
* Parse frontmatter fields from file content.
|
|
21
27
|
*
|
|
22
28
|
* Extracts key-value pairs from the `---` delimited block at the top of the
|
|
23
|
-
* file
|
|
24
|
-
*
|
|
29
|
+
* file using a proper YAML parser. Handles nested objects, arrays, quoted
|
|
30
|
+
* strings, escape sequences, and all YAML features natively.
|
|
25
31
|
*
|
|
26
32
|
* Returns `null` if no frontmatter block is found.
|
|
27
33
|
*/
|
|
@@ -32,80 +38,16 @@ export function parseFrontmatterFields(
|
|
|
32
38
|
if (!match) return null;
|
|
33
39
|
|
|
34
40
|
const frontmatter = match[1];
|
|
35
|
-
const
|
|
41
|
+
const body = content.slice(match[0].length);
|
|
36
42
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
function flushContinuation() {
|
|
42
|
-
if (currentKey !== undefined) {
|
|
43
|
-
if (continuationLines.length > 0) {
|
|
44
|
-
const joined = continuationLines.map((l) => l.trim()).join(" ");
|
|
45
|
-
// Try parsing as-is first to avoid corrupting commas inside quoted strings.
|
|
46
|
-
// Only apply trailing-comma cleanup if the raw text isn't valid JSON.
|
|
47
|
-
try {
|
|
48
|
-
JSON.parse(joined);
|
|
49
|
-
fields[currentKey] = joined;
|
|
50
|
-
} catch {
|
|
51
|
-
fields[currentKey] = joined.replace(/,\s*([}\]])/g, "$1");
|
|
52
|
-
}
|
|
53
|
-
} else {
|
|
54
|
-
fields[currentKey] = "";
|
|
55
|
-
}
|
|
43
|
+
try {
|
|
44
|
+
const parsed = parseYaml(frontmatter);
|
|
45
|
+
if (parsed == null || typeof parsed !== "object") {
|
|
46
|
+
return { fields: {}, body };
|
|
56
47
|
}
|
|
57
|
-
|
|
58
|
-
|
|
48
|
+
return { fields: parsed as Record<string, unknown>, body };
|
|
49
|
+
} catch (err) {
|
|
50
|
+
log.warn({ err }, "Failed to parse YAML frontmatter");
|
|
51
|
+
return null;
|
|
59
52
|
}
|
|
60
|
-
|
|
61
|
-
for (const line of lines) {
|
|
62
|
-
const trimmed = line.trim();
|
|
63
|
-
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
64
|
-
|
|
65
|
-
// Continuation line: indented and no top-level key: pattern
|
|
66
|
-
// (i.e. starts with whitespace and either has no colon or the colon
|
|
67
|
-
// is inside braces/quotes — heuristic: line starts with space/tab)
|
|
68
|
-
if (currentKey !== undefined && /^\s/.test(line)) {
|
|
69
|
-
continuationLines.push(trimmed);
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Flush any pending multiline value
|
|
74
|
-
flushContinuation();
|
|
75
|
-
|
|
76
|
-
const separatorIndex = trimmed.indexOf(":");
|
|
77
|
-
if (separatorIndex === -1) continue;
|
|
78
|
-
|
|
79
|
-
const key = trimmed.slice(0, separatorIndex).trim();
|
|
80
|
-
let value = trimmed.slice(separatorIndex + 1).trim();
|
|
81
|
-
|
|
82
|
-
if (!value) {
|
|
83
|
-
// Value may continue on subsequent indented lines
|
|
84
|
-
currentKey = key;
|
|
85
|
-
continuationLines = [];
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const isDoubleQuoted = value.startsWith('"') && value.endsWith('"');
|
|
90
|
-
const isSingleQuoted = value.startsWith("'") && value.endsWith("'");
|
|
91
|
-
if (isDoubleQuoted || isSingleQuoted) {
|
|
92
|
-
value = value.slice(1, -1);
|
|
93
|
-
if (isDoubleQuoted) {
|
|
94
|
-
// Unescape sequences produced by buildSkillMarkdown's esc().
|
|
95
|
-
// Only for double-quoted values — single-quoted YAML treats backslashes literally.
|
|
96
|
-
// Single-pass to avoid misinterpreting \\n (escaped backslash + n) as a newline.
|
|
97
|
-
value = value.replace(/\\(["\\nr])/g, (_, ch) => {
|
|
98
|
-
if (ch === "n") return "\n";
|
|
99
|
-
if (ch === "r") return "\r";
|
|
100
|
-
return ch; // handles \\ → \ and \" → "
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
fields[key] = value;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Flush any trailing multiline value
|
|
108
|
-
flushContinuation();
|
|
109
|
-
|
|
110
|
-
return { fields, body: content.slice(match[0].length) };
|
|
111
53
|
}
|
|
@@ -9,6 +9,8 @@ import {
|
|
|
9
9
|
} from "node:fs";
|
|
10
10
|
import { dirname, join } from "node:path";
|
|
11
11
|
|
|
12
|
+
import { stringify as stringifyYaml } from "yaml";
|
|
13
|
+
|
|
12
14
|
import { getLogger } from "../util/logger.js";
|
|
13
15
|
import { getWorkspaceSkillsDir } from "../util/platform.js";
|
|
14
16
|
|
|
@@ -67,7 +69,10 @@ export function buildSkillMarkdown(input: BuildSkillMarkdownInput): string {
|
|
|
67
69
|
lines.push(`description: "${esc(input.description)}"`);
|
|
68
70
|
|
|
69
71
|
// Build metadata object matching the format parseFrontmatter expects:
|
|
70
|
-
// metadata:
|
|
72
|
+
// metadata:
|
|
73
|
+
// vellum:
|
|
74
|
+
// emoji: "..."
|
|
75
|
+
// user-invocable: false
|
|
71
76
|
const vellum: Record<string, unknown> = {};
|
|
72
77
|
if (input.emoji) {
|
|
73
78
|
vellum.emoji = input.emoji;
|
|
@@ -84,7 +89,11 @@ export function buildSkillMarkdown(input: BuildSkillMarkdownInput): string {
|
|
|
84
89
|
|
|
85
90
|
if (Object.keys(vellum).length > 0) {
|
|
86
91
|
const metadata = { vellum };
|
|
87
|
-
|
|
92
|
+
const yamlBlock = stringifyYaml(metadata, { indent: 2 });
|
|
93
|
+
lines.push("metadata:");
|
|
94
|
+
for (const yamlLine of yamlBlock.trimEnd().split("\n")) {
|
|
95
|
+
lines.push(` ${yamlLine}`);
|
|
96
|
+
}
|
|
88
97
|
}
|
|
89
98
|
|
|
90
99
|
lines.push("---");
|
package/src/subagent/manager.ts
CHANGED
|
@@ -188,7 +188,7 @@ export class SubagentManager {
|
|
|
188
188
|
memoryPolicy,
|
|
189
189
|
);
|
|
190
190
|
|
|
191
|
-
// Mark session as having no direct
|
|
191
|
+
// Mark session as having no direct client — it routes through parent.
|
|
192
192
|
// This ensures interactive prompts (host attachment reads) fail fast.
|
|
193
193
|
session.updateClient(wrappedSendToClient, true);
|
|
194
194
|
|
|
@@ -380,7 +380,7 @@ export class SubagentManager {
|
|
|
380
380
|
async sendMessage(
|
|
381
381
|
subagentId: string,
|
|
382
382
|
content: string,
|
|
383
|
-
): Promise<"sent" | "empty" | "not_found" | "terminal"
|
|
383
|
+
): Promise<"sent" | "empty" | "not_found" | "terminal"> {
|
|
384
384
|
const trimmed = content?.trim();
|
|
385
385
|
if (!trimmed) return "empty";
|
|
386
386
|
|
|
@@ -398,7 +398,9 @@ export class SubagentManager {
|
|
|
398
398
|
onEvent,
|
|
399
399
|
requestId,
|
|
400
400
|
);
|
|
401
|
-
if (result.rejected)
|
|
401
|
+
if (result.rejected) {
|
|
402
|
+
return "sent"; // error event already delivered via onEvent
|
|
403
|
+
}
|
|
402
404
|
if (!result.queued) {
|
|
403
405
|
// Session is idle — send directly. Fire-and-forget so we don't block.
|
|
404
406
|
const messageId = await managed.session.persistUserMessage(trimmed, []);
|
|
@@ -29,10 +29,9 @@ export function clearTaskRunRules(taskRunId: string): void {
|
|
|
29
29
|
* default rules (50) so pre-approved tools aren't shadowed by default
|
|
30
30
|
* `ask` rules (which would trigger prompting and auto-deny in
|
|
31
31
|
* non-interactive task runs), but below user rules (100) so user deny
|
|
32
|
-
* rules still take precedence. `allowHighRisk` is
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* so there is no interactive prompt during the run itself.
|
|
32
|
+
* rules still take precedence. `allowHighRisk` is intentionally omitted:
|
|
33
|
+
* high-risk tool invocations still flow through the normal risk-classification
|
|
34
|
+
* path rather than being blanket-approved.
|
|
36
35
|
*/
|
|
37
36
|
export function buildTaskRules(
|
|
38
37
|
taskRunId: string,
|
|
@@ -45,7 +44,6 @@ export function buildTaskRules(
|
|
|
45
44
|
pattern: "**",
|
|
46
45
|
scope: "everywhere",
|
|
47
46
|
decision: "allow" as const,
|
|
48
|
-
allowHighRisk: true,
|
|
49
47
|
priority: 75,
|
|
50
48
|
createdAt: Date.now(),
|
|
51
49
|
}));
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Tools — Agent Instructions
|
|
2
|
+
|
|
3
|
+
## No New Tools Policy
|
|
4
|
+
|
|
5
|
+
**New tool registrations require approval from Team Jarvis.**
|
|
6
|
+
|
|
7
|
+
The tool registration system (`class ... implements Tool` + `registerTool()`) is being phased out in favor of skill-based approaches. Before adding a new tool, contact Team Jarvis for approval.
|
|
8
|
+
|
|
9
|
+
## Why This Policy Exists
|
|
10
|
+
|
|
11
|
+
1. **Skills are preferred** — The project direction is to teach the assistant CLI tools via skills rather than hardcoding tool implementations. Skills are progressively disclosed into context, are more portable, and are often self-contained.
|
|
12
|
+
|
|
13
|
+
2. **Context overhead** — Each registered tool adds to the system prompt and increases token usage for every conversation.
|
|
14
|
+
|
|
15
|
+
3. **Maintenance burden** — Tools require ongoing maintenance, testing, and security review. Skills can be iterated on independently.
|
|
16
|
+
|
|
17
|
+
## What To Do Instead
|
|
18
|
+
|
|
19
|
+
Instead of creating a new tool, consider:
|
|
20
|
+
|
|
21
|
+
1. **Create a skill**
|
|
22
|
+
|
|
23
|
+
2. **Use existing tools** — Many capabilities can be achieved by combining existing tools (bash, file operations, network tools) with skill instructions.
|
|
24
|
+
|
|
25
|
+
3. **External CLI tools** — If you need new functionality, consider whether it can be exposed as a CLI tool that the assistant can invoke via bash.
|
|
26
|
+
|
|
27
|
+
## If You Have Approval
|
|
28
|
+
|
|
29
|
+
If Team Jarvis has approved your new tool:
|
|
30
|
+
|
|
31
|
+
1. The pre-commit hook will block your commit by default
|
|
32
|
+
2. Use `git commit --no-verify` to bypass the hook
|
|
33
|
+
3. Include the approval context in your PR description
|
|
34
|
+
|
|
35
|
+
## Questions?
|
|
36
|
+
|
|
37
|
+
Contact Team Jarvis before shipping a new tool.
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { compileApp } from "../../bundler/app-compiler.js";
|
|
12
|
-
import { setHomeBaseAppLink } from "../../home-base/app-link-store.js";
|
|
13
12
|
import { generateAppIcon } from "../../media/app-icon-generator.js";
|
|
14
13
|
import type {
|
|
15
14
|
AppDefinition,
|
|
@@ -115,7 +114,6 @@ export interface AppCreateInput {
|
|
|
115
114
|
html?: string;
|
|
116
115
|
pages?: Record<string, string>;
|
|
117
116
|
auto_open?: boolean;
|
|
118
|
-
set_as_home_base?: boolean;
|
|
119
117
|
preview?: Record<string, unknown>;
|
|
120
118
|
/** When provided, controls multifile scaffold behavior. */
|
|
121
119
|
featureFlags?: { multifileEnabled: boolean };
|
|
@@ -240,10 +238,6 @@ render(<App />, document.getElementById('app')!);
|
|
|
240
238
|
}
|
|
241
239
|
}
|
|
242
240
|
|
|
243
|
-
if (input.set_as_home_base) {
|
|
244
|
-
setHomeBaseAppLink(app.id, "personalized");
|
|
245
|
-
}
|
|
246
|
-
|
|
247
241
|
// Emit the inline preview card via the proxy without opening a workspace panel.
|
|
248
242
|
// open_mode: "preview" signals to the client that this should be shown inline only.
|
|
249
243
|
if (autoOpen && proxyToolResolver) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
2
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
3
3
|
|
|
4
4
|
import { getLogger } from "../../util/logger.js";
|
|
5
5
|
import { getDataDir } from "../../util/platform.js";
|
|
@@ -30,10 +30,7 @@ function findSystemChrome(): string | null {
|
|
|
30
30
|
);
|
|
31
31
|
} else {
|
|
32
32
|
// Linux
|
|
33
|
-
candidates.push(
|
|
34
|
-
"/usr/bin/google-chrome",
|
|
35
|
-
"/usr/bin/google-chrome-stable",
|
|
36
|
-
);
|
|
33
|
+
candidates.push("/usr/bin/google-chrome", "/usr/bin/google-chrome-stable");
|
|
37
34
|
}
|
|
38
35
|
|
|
39
36
|
for (const candidate of candidates) {
|
|
@@ -60,6 +57,13 @@ function getDownloadsDir(): string {
|
|
|
60
57
|
return dir;
|
|
61
58
|
}
|
|
62
59
|
|
|
60
|
+
export function sanitizeDownloadFilename(filename: string): string {
|
|
61
|
+
const leaf = filename.replaceAll("\\", "/").split("/").pop() ?? "";
|
|
62
|
+
const stripped = leaf.replaceAll("\0", "").trim();
|
|
63
|
+
const safe = stripped.length > 0 ? stripped : "download";
|
|
64
|
+
return safe === "." || safe === ".." ? "download" : safe;
|
|
65
|
+
}
|
|
66
|
+
|
|
63
67
|
/** Wraps a promise with a timeout to prevent indefinite hangs. */
|
|
64
68
|
export function withTimeout<T>(
|
|
65
69
|
promise: Promise<T>,
|
|
@@ -284,10 +288,7 @@ class BrowserManager {
|
|
|
284
288
|
const systemChrome = findSystemChrome();
|
|
285
289
|
|
|
286
290
|
if (systemChrome) {
|
|
287
|
-
log.info(
|
|
288
|
-
{ path: systemChrome },
|
|
289
|
-
"Using system Chrome installation",
|
|
290
|
-
);
|
|
291
|
+
log.info({ path: systemChrome }, "Using system Chrome installation");
|
|
291
292
|
launch = (userDataDir, options) =>
|
|
292
293
|
pw.chromium.launchPersistentContext(userDataDir, {
|
|
293
294
|
...options,
|
|
@@ -778,8 +779,13 @@ class BrowserManager {
|
|
|
778
779
|
failure(): Promise<string | null>;
|
|
779
780
|
};
|
|
780
781
|
try {
|
|
781
|
-
const filename = dl.suggestedFilename();
|
|
782
|
-
const
|
|
782
|
+
const filename = sanitizeDownloadFilename(dl.suggestedFilename());
|
|
783
|
+
const downloadsDir = getDownloadsDir();
|
|
784
|
+
const destPath = resolve(downloadsDir, `${Date.now()}-${filename}`);
|
|
785
|
+
const relPath = relative(resolve(downloadsDir), destPath);
|
|
786
|
+
if (relPath.startsWith("..") || isAbsolute(relPath)) {
|
|
787
|
+
throw new Error("Resolved download path escaped downloads directory");
|
|
788
|
+
}
|
|
783
789
|
await withTimeout(dl.saveAs(destPath), 120_000, "Download save");
|
|
784
790
|
const info: DownloadInfo = { path: destPath, filename };
|
|
785
791
|
|