vellum 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -2
- package/bun.lock +5 -2
- package/package.json +4 -2
- package/scripts/capture-x-graphql.ts +562 -0
- package/scripts/ipc/check-swift-decoder-drift.ts +2 -1
- package/scripts/test.sh +5 -0
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +161 -34
- package/src/__tests__/account-registry.test.ts +2 -1
- package/src/__tests__/agent-heartbeat-service.test.ts +250 -0
- package/src/__tests__/app-bundler.test.ts +12 -33
- package/src/__tests__/asset-materialize-tool.test.ts +16 -15
- package/src/__tests__/asset-search-tool.test.ts +23 -22
- package/src/__tests__/attachments-store.test.ts +56 -127
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +5 -4
- package/src/__tests__/browser-skill-endstate.test.ts +5 -8
- package/src/__tests__/call-bridge.test.ts +385 -0
- package/src/__tests__/call-constants.test.ts +40 -0
- package/src/__tests__/call-orchestrator.test.ts +454 -0
- package/src/__tests__/call-recovery.test.ts +518 -0
- package/src/__tests__/call-routes-http.test.ts +459 -0
- package/src/__tests__/call-state-machine.test.ts +143 -0
- package/src/__tests__/call-state.test.ts +133 -0
- package/src/__tests__/call-store.test.ts +691 -0
- package/src/__tests__/cli-discover.test.ts +1 -1
- package/src/__tests__/commit-message-enrichment-service.test.ts +550 -0
- package/src/__tests__/compaction.benchmark.test.ts +176 -0
- package/src/__tests__/computer-use-tools.test.ts +250 -0
- package/src/__tests__/config-schema.test.ts +348 -3
- package/src/__tests__/conflict-store.test.ts +2 -1
- package/src/__tests__/contacts-tools.test.ts +331 -0
- package/src/__tests__/conversation-store.test.ts +30 -32
- package/src/__tests__/credential-security-invariants.test.ts +4 -0
- package/src/__tests__/date-context.test.ts +373 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +129 -0
- package/src/__tests__/doordash-session.test.ts +9 -0
- package/src/__tests__/fixtures/media-reuse-fixtures.ts +3 -3
- package/src/__tests__/followup-tools.test.ts +303 -0
- package/src/__tests__/handlers-twitter-config.test.ts +718 -0
- package/src/__tests__/intent-routing.test.ts +64 -57
- package/src/__tests__/ipc-roundtrip.benchmark.test.ts +237 -0
- package/src/__tests__/ipc-snapshot.test.ts +96 -28
- package/src/__tests__/llm-usage-store.test.ts +3 -8
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/media-reuse-story.e2e.test.ts +7 -7
- package/src/__tests__/memory-retrieval.benchmark.test.ts +430 -0
- package/src/__tests__/parallel-tool.benchmark.test.ts +294 -0
- package/src/__tests__/playbook-tools.test.ts +342 -0
- package/src/__tests__/profile-compiler.test.ts +2 -1
- package/src/__tests__/provider-streaming.benchmark.test.ts +773 -0
- package/src/__tests__/recurrence-engine-rruleset.test.ts +78 -0
- package/src/__tests__/recurrence-engine.test.ts +69 -0
- package/src/__tests__/recurrence-types.test.ts +71 -0
- package/src/__tests__/registry.test.ts +17 -10
- package/src/__tests__/relay-server.test.ts +633 -0
- package/src/__tests__/reminder-store.test.ts +6 -3
- package/src/__tests__/reminder.test.ts +43 -77
- package/src/__tests__/run-orchestrator-assistant-events.test.ts +222 -0
- package/src/__tests__/run-orchestrator.test.ts +7 -7
- package/src/__tests__/runtime-attachment-metadata.test.ts +19 -20
- package/src/__tests__/runtime-runs-http.test.ts +5 -23
- package/src/__tests__/runtime-runs.test.ts +11 -11
- package/src/__tests__/schedule-store.test.ts +482 -0
- package/src/__tests__/schedule-tools.test.ts +700 -0
- package/src/__tests__/scheduler-recurrence.test.ts +329 -0
- package/src/__tests__/server-history-render.test.ts +14 -13
- package/src/__tests__/session-error.test.ts +28 -0
- package/src/__tests__/session-init.benchmark.test.ts +462 -0
- package/src/__tests__/session-queue.test.ts +89 -16
- package/src/__tests__/session-runtime-assembly.test.ts +161 -0
- package/src/__tests__/session-surfaces-task-progress.test.ts +104 -0
- package/src/__tests__/signup-e2e.test.ts +2 -1
- package/src/__tests__/skill-projection.benchmark.test.ts +328 -0
- package/src/__tests__/skill-script-runner.test.ts +159 -0
- package/src/__tests__/speaker-identification.test.ts +52 -0
- package/src/__tests__/subagent-manager-notify.test.ts +42 -10
- package/src/__tests__/subagent-tools.test.ts +141 -41
- package/src/__tests__/task-compiler.test.ts +2 -1
- package/src/__tests__/task-runner.test.ts +2 -1
- package/src/__tests__/task-scheduler.test.ts +2 -1
- package/src/__tests__/task-tools.test.ts +49 -56
- package/src/__tests__/tool-audit-listener.test.ts +1 -0
- package/src/__tests__/tool-domain-event-publisher.test.ts +2 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +500 -0
- package/src/__tests__/tool-executor.test.ts +13 -17
- package/src/__tests__/turn-commit.test.ts +273 -2
- package/src/__tests__/twilio-provider.test.ts +143 -0
- package/src/__tests__/twilio-routes.test.ts +789 -0
- package/src/__tests__/twitter-auth-handler.test.ts +581 -0
- package/src/__tests__/view-image-tool.test.ts +217 -0
- package/src/__tests__/workspace-git-service.test.ts +403 -0
- package/src/__tests__/workspace-heartbeat-service.test.ts +141 -2
- package/src/agent-heartbeat/agent-heartbeat-service.ts +155 -0
- package/src/bundler/app-bundler.ts +35 -14
- package/src/calls/call-bridge.ts +95 -0
- package/src/calls/call-constants.ts +48 -0
- package/src/calls/call-domain.ts +276 -0
- package/src/calls/call-orchestrator.ts +390 -0
- package/src/calls/call-recovery.ts +207 -0
- package/src/calls/call-state-machine.ts +68 -0
- package/src/calls/call-state.ts +64 -0
- package/src/calls/call-store.ts +416 -0
- package/src/calls/relay-server.ts +335 -0
- package/src/calls/speaker-identification.ts +213 -0
- package/src/calls/twilio-config.ts +34 -0
- package/src/calls/twilio-provider.ts +173 -0
- package/src/calls/twilio-routes.ts +250 -0
- package/src/calls/types.ts +37 -0
- package/src/calls/voice-provider.ts +14 -0
- package/src/cli/config-commands.ts +334 -0
- package/src/cli/core-commands.ts +776 -0
- package/src/cli/doordash.ts +256 -25
- package/src/cli/ipc-client.ts +82 -0
- package/src/cli/map.ts +246 -0
- package/src/cli/twitter.ts +575 -0
- package/src/cli.ts +7 -5
- package/src/commands/__tests__/cc-command-registry.test.ts +319 -0
- package/src/commands/cc-command-registry.ts +209 -0
- package/src/config/bundled-skills/contacts/SKILL.md +39 -0
- package/src/config/bundled-skills/contacts/TOOLS.json +122 -0
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +9 -0
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +9 -0
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +9 -0
- package/src/config/bundled-skills/document/SKILL.md +18 -0
- package/src/config/bundled-skills/document/TOOLS.json +53 -0
- package/src/config/bundled-skills/document/tools/document-create.ts +9 -0
- package/src/config/bundled-skills/document/tools/document-update.ts +9 -0
- package/src/config/bundled-skills/doordash/SKILL.md +163 -0
- package/src/config/bundled-skills/followups/SKILL.md +32 -0
- package/src/config/bundled-skills/followups/TOOLS.json +100 -0
- package/src/config/bundled-skills/followups/tools/followup-create.ts +9 -0
- package/src/config/bundled-skills/followups/tools/followup-list.ts +9 -0
- package/src/config/bundled-skills/followups/tools/followup-resolve.ts +9 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +2 -2
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -24
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +2 -1
- package/src/config/bundled-skills/playbooks/SKILL.md +31 -0
- package/src/config/bundled-skills/playbooks/TOOLS.json +126 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +9 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +9 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +9 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +9 -0
- package/src/config/bundled-skills/reminder/SKILL.md +20 -0
- package/src/config/bundled-skills/reminder/TOOLS.json +67 -0
- package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +9 -0
- package/src/config/bundled-skills/reminder/tools/reminder-create.ts +9 -0
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +9 -0
- package/src/config/bundled-skills/schedule/SKILL.md +74 -0
- package/src/config/bundled-skills/schedule/TOOLS.json +135 -0
- package/src/config/bundled-skills/schedule/tools/schedule-create.ts +9 -0
- package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +9 -0
- package/src/config/bundled-skills/schedule/tools/schedule-list.ts +9 -0
- package/src/config/bundled-skills/schedule/tools/schedule-update.ts +9 -0
- package/src/config/bundled-skills/subagent/SKILL.md +25 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +107 -0
- package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +9 -0
- package/src/config/bundled-skills/subagent/tools/subagent-message.ts +9 -0
- package/src/config/bundled-skills/subagent/tools/subagent-read.ts +9 -0
- package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +9 -0
- package/src/config/bundled-skills/subagent/tools/subagent-status.ts +9 -0
- package/src/config/bundled-skills/tasks/SKILL.md +28 -0
- package/src/config/bundled-skills/tasks/TOOLS.json +256 -0
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-list.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-run.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-save.ts +9 -0
- package/src/config/bundled-skills/twitter/SKILL.md +134 -0
- package/src/config/bundled-skills/watcher/SKILL.md +27 -0
- package/src/config/bundled-skills/watcher/TOOLS.json +147 -0
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +9 -0
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +9 -0
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +9 -0
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +9 -0
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +9 -0
- package/src/config/defaults.ts +44 -0
- package/src/config/loader.ts +4 -1
- package/src/config/schema.ts +218 -1
- package/src/config/system-prompt.ts +100 -6
- package/src/config/templates/IDENTITY.md +7 -0
- package/src/config/types.ts +5 -0
- package/src/contacts/contact-store.ts +4 -4
- package/src/daemon/assistant-attachments.ts +10 -0
- package/src/daemon/classifier.ts +3 -1
- package/src/daemon/computer-use-session.ts +3 -1
- package/src/daemon/date-context.ts +136 -0
- package/src/daemon/handlers/apps.ts +16 -1
- package/src/daemon/handlers/browser.ts +54 -0
- package/src/daemon/handlers/computer-use.ts +7 -1
- package/src/daemon/handlers/config.ts +192 -4
- package/src/daemon/handlers/diagnostics.ts +5 -1
- package/src/daemon/handlers/documents.ts +18 -29
- package/src/daemon/handlers/home-base.ts +5 -1
- package/src/daemon/handlers/index.ts +40 -271
- package/src/daemon/handlers/misc.ts +9 -1
- package/src/daemon/handlers/publish.ts +6 -1
- package/src/daemon/handlers/sessions.ts +65 -12
- package/src/daemon/handlers/shared.ts +36 -1
- package/src/daemon/handlers/signing.ts +37 -0
- package/src/daemon/handlers/skills.ts +20 -6
- package/src/daemon/handlers/subagents.ts +8 -3
- package/src/daemon/handlers/twitter-auth.ts +169 -0
- package/src/daemon/handlers/work-items.ts +495 -39
- package/src/daemon/ipc-contract-inventory.json +40 -4
- package/src/daemon/ipc-contract.ts +185 -37
- package/src/daemon/ipc-protocol.ts +7 -2
- package/src/daemon/lifecycle.ts +48 -5
- package/src/daemon/main.ts +10 -4
- package/src/daemon/ride-shotgun-handler.ts +74 -10
- package/src/daemon/server.ts +144 -29
- package/src/daemon/session-agent-loop.ts +887 -0
- package/src/daemon/session-attachments.ts +28 -5
- package/src/daemon/session-error.ts +24 -3
- package/src/daemon/session-lifecycle.ts +147 -0
- package/src/daemon/session-media-retry.ts +147 -0
- package/src/daemon/session-messaging.ts +145 -0
- package/src/daemon/session-notifiers.ts +164 -0
- package/src/daemon/session-process.ts +2 -2
- package/src/daemon/session-queue-manager.ts +1 -0
- package/src/daemon/session-runtime-assembly.ts +52 -0
- package/src/daemon/session-skill-tools.ts +124 -5
- package/src/daemon/session-slash.ts +3 -0
- package/src/daemon/session-surfaces.ts +77 -2
- package/src/daemon/session-tool-setup.ts +222 -2
- package/src/daemon/session-usage.ts +0 -2
- package/src/daemon/session.ts +114 -1365
- package/src/daemon/video-thumbnail.ts +60 -0
- package/src/doordash/client.ts +121 -27
- package/src/doordash/queries.ts +1 -2
- package/src/export/formatter.ts +3 -1
- package/src/followups/followup-store.ts +4 -2
- package/src/followups/types.ts +6 -0
- package/src/hooks/templates.ts +1 -1
- package/src/index.ts +32 -1151
- package/src/media/gemini-image-service.ts +1 -1
- package/src/memory/attachments-store.ts +28 -83
- package/src/memory/channel-delivery-store.ts +7 -21
- package/src/memory/clarification-resolver.ts +6 -5
- package/src/memory/contradiction-checker.ts +3 -2
- package/src/memory/conversation-key-store.ts +10 -29
- package/src/memory/conversation-store.ts +2 -1
- package/src/memory/db.ts +362 -2
- package/src/memory/entity-extractor.ts +6 -3
- package/src/memory/items-extractor.ts +5 -4
- package/src/memory/jobs-store.ts +3 -2
- package/src/memory/llm-usage-store.ts +1 -2
- package/src/memory/runs-store.ts +1 -2
- package/src/memory/schema.ts +65 -2
- package/src/messaging/style-analyzer.ts +3 -2
- package/src/messaging/thread-summarizer.ts +8 -12
- package/src/messaging/triage-engine.ts +4 -2
- package/src/providers/openrouter/client.ts +20 -0
- package/src/providers/registry.ts +8 -0
- package/src/runtime/http-server.ts +277 -25
- package/src/runtime/http-types.ts +0 -2
- package/src/runtime/routes/attachment-routes.ts +5 -6
- package/src/runtime/routes/call-routes.ts +140 -0
- package/src/runtime/routes/channel-routes.ts +12 -19
- package/src/runtime/routes/conversation-routes.ts +5 -9
- package/src/runtime/routes/run-routes.ts +4 -8
- package/src/runtime/run-orchestrator.ts +39 -6
- package/src/schedule/recurrence-engine.ts +138 -0
- package/src/schedule/recurrence-types.ts +67 -0
- package/src/schedule/schedule-store.ts +102 -57
- package/src/schedule/scheduler.ts +9 -6
- package/src/security/oauth2.ts +29 -4
- package/src/security/secret-allowlist.ts +46 -0
- package/src/skills/clawhub.ts +1 -1
- package/src/subagent/manager.ts +40 -8
- package/src/swarm/backend-claude-code.ts +64 -9
- package/src/swarm/worker-prompts.ts +2 -1
- package/src/tasks/SPEC.md +34 -28
- package/src/tasks/ephemeral-permissions.ts +16 -7
- package/src/tasks/task-compiler.ts +5 -4
- package/src/tasks/task-runner.ts +10 -5
- package/src/tasks/task-scheduler.ts +1 -1
- package/src/tasks/tool-sanitizer.ts +36 -0
- package/src/tools/assets/search.ts +4 -4
- package/src/tools/browser/api-map.ts +220 -0
- package/src/tools/browser/auto-navigate.ts +270 -0
- package/src/tools/browser/browser-execution.ts +2 -1
- package/src/tools/browser/browser-manager.ts +2 -2
- package/src/tools/browser/network-recorder.ts +5 -4
- package/src/tools/browser/x-auto-navigate.ts +207 -0
- package/src/tools/calls/call-end.ts +67 -0
- package/src/tools/calls/call-start.ts +73 -0
- package/src/tools/calls/call-status.ts +81 -0
- package/src/tools/claude-code/claude-code.ts +77 -11
- package/src/tools/contacts/contact-merge.ts +46 -78
- package/src/tools/contacts/contact-search.ts +35 -79
- package/src/tools/contacts/contact-upsert.ts +35 -108
- package/src/tools/credentials/vault.ts +21 -5
- package/src/tools/document/document-tool.ts +71 -144
- package/src/tools/executor.ts +129 -10
- package/src/tools/followups/followup_create.ts +46 -88
- package/src/tools/followups/followup_list.ts +34 -74
- package/src/tools/followups/followup_resolve.ts +31 -66
- package/src/tools/host-terminal/cli-discover.ts +2 -1
- package/src/tools/host-terminal/host-shell.ts +10 -0
- package/src/tools/memory/handlers.ts +5 -4
- package/src/tools/network/__tests__/web-search.test.ts +427 -0
- package/src/tools/network/script-proxy/__tests__/logging.test.ts +248 -0
- package/src/tools/network/script-proxy/__tests__/policy.test.ts +234 -0
- package/src/tools/network/script-proxy/__tests__/router.test.ts +76 -0
- package/src/tools/network/web-fetch.ts +18 -6
- package/src/tools/playbooks/index.ts +4 -5
- package/src/tools/playbooks/playbook-create.ts +3 -47
- package/src/tools/playbooks/playbook-delete.ts +1 -25
- package/src/tools/playbooks/playbook-list.ts +1 -28
- package/src/tools/playbooks/playbook-update.ts +3 -51
- package/src/tools/registry.ts +2 -4
- package/src/tools/reminder/reminder.ts +5 -78
- package/src/tools/schedule/create.ts +69 -74
- package/src/tools/schedule/delete.ts +21 -47
- package/src/tools/schedule/list.ts +55 -74
- package/src/tools/schedule/update.ts +77 -84
- package/src/tools/subagent/abort.ts +29 -58
- package/src/tools/subagent/message.ts +30 -63
- package/src/tools/subagent/read.ts +53 -84
- package/src/tools/subagent/spawn.ts +43 -82
- package/src/tools/subagent/status.ts +42 -71
- package/src/tools/swarm/delegate.ts +2 -1
- package/src/tools/tasks/index.ts +8 -6
- package/src/tools/tasks/task-delete.ts +69 -56
- package/src/tools/tasks/task-list.ts +31 -52
- package/src/tools/tasks/task-run.ts +74 -102
- package/src/tools/tasks/task-save.ts +33 -65
- package/src/tools/tasks/work-item-enqueue.ts +192 -134
- package/src/tools/tasks/work-item-list.ts +33 -78
- package/src/tools/tasks/work-item-remove.ts +60 -0
- package/src/tools/tasks/work-item-update.ts +114 -0
- package/src/tools/terminal/backends/native.ts +3 -1
- package/src/tools/tool-manifest.ts +20 -74
- package/src/tools/types.ts +6 -0
- package/src/tools/ui-surface/definitions.ts +6 -1
- package/src/tools/watch/screen-watch.ts +3 -1
- package/src/tools/watcher/create.ts +52 -98
- package/src/tools/watcher/delete.ts +20 -46
- package/src/tools/watcher/digest.ts +36 -70
- package/src/tools/watcher/list.ts +49 -79
- package/src/tools/watcher/update.ts +45 -91
- package/src/twitter/client.ts +690 -0
- package/src/twitter/session.ts +91 -0
- package/src/usage/types.ts +0 -1
- package/src/util/truncate.ts +6 -0
- package/src/watcher/providers/slack.ts +2 -1
- package/src/watcher/watcher-store.ts +3 -2
- package/src/work-items/work-item-store.ts +236 -2
- package/src/workspace/commit-message-enrichment-service.ts +284 -0
- package/src/workspace/commit-message-provider.ts +95 -0
- package/src/workspace/git-service.ts +272 -52
- package/src/workspace/heartbeat-service.ts +70 -13
- package/src/workspace/provider-commit-message-generator.ts +242 -0
- package/src/workspace/turn-commit.ts +100 -51
- package/src/tools/contacts/index.ts +0 -4
- package/src/tools/document/index.ts +0 -5
- package/src/tools/followups/index.ts +0 -3
- package/src/tools/subagent/index.ts +0 -5
- /package/src/__tests__/{memory-context-benchmark.test.ts → memory-context-benchmark.benchmark.test.ts} +0 -0
|
@@ -34,20 +34,21 @@ mock.module('./indexer.js', () => ({
|
|
|
34
34
|
}));
|
|
35
35
|
|
|
36
36
|
import type { Database } from 'bun:sqlite';
|
|
37
|
-
import { initializeDb, getDb } from '../memory/db.js';
|
|
37
|
+
import { initializeDb, getDb, resetDb } from '../memory/db.js';
|
|
38
38
|
import { createTask, createTaskRun } from '../tasks/task-store.js';
|
|
39
39
|
import { createWorkItem } from '../work-items/work-item-store.js';
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
40
|
+
import { executeTaskSave } from '../tools/tasks/task-save.js';
|
|
41
|
+
import { executeTaskRun } from '../tools/tasks/task-run.js';
|
|
42
|
+
import { executeTaskList } from '../tools/tasks/task-list.js';
|
|
43
|
+
import { executeTaskListShow } from '../tools/tasks/work-item-list.js';
|
|
44
|
+
import { executeTaskListAdd } from '../tools/tasks/work-item-enqueue.js';
|
|
45
|
+
import { executeTaskDelete } from '../tools/tasks/task-delete.js';
|
|
46
46
|
import type { ToolContext } from '../tools/types.js';
|
|
47
47
|
|
|
48
48
|
initializeDb();
|
|
49
49
|
|
|
50
50
|
afterAll(() => {
|
|
51
|
+
resetDb();
|
|
51
52
|
try { rmSync(testDir, { recursive: true }); } catch { /* best effort */ }
|
|
52
53
|
});
|
|
53
54
|
|
|
@@ -104,7 +105,7 @@ describe('task_save tool', () => {
|
|
|
104
105
|
);
|
|
105
106
|
addTestMessage(convId, 'assistant', 'Here is the summary...');
|
|
106
107
|
|
|
107
|
-
const result = await
|
|
108
|
+
const result = await executeTaskSave(
|
|
108
109
|
{ conversation_id: convId },
|
|
109
110
|
stubContext,
|
|
110
111
|
);
|
|
@@ -120,7 +121,7 @@ describe('task_save tool', () => {
|
|
|
120
121
|
addTestMessage(convId, 'user', 'Read and analyze the logs');
|
|
121
122
|
addTestMessage(convId, 'assistant', 'Done!');
|
|
122
123
|
|
|
123
|
-
const result = await
|
|
124
|
+
const result = await executeTaskSave(
|
|
124
125
|
{ conversation_id: convId, title: 'My Custom Title' },
|
|
125
126
|
stubContext,
|
|
126
127
|
);
|
|
@@ -134,7 +135,7 @@ describe('task_save tool', () => {
|
|
|
134
135
|
addTestMessage(convId, 'user', 'Summarize the report');
|
|
135
136
|
addTestMessage(convId, 'assistant', 'Done.');
|
|
136
137
|
|
|
137
|
-
const result = await
|
|
138
|
+
const result = await executeTaskSave({}, stubContext);
|
|
138
139
|
|
|
139
140
|
expect(result.isError).toBe(false);
|
|
140
141
|
expect(result.content).toContain('Task saved successfully');
|
|
@@ -142,7 +143,7 @@ describe('task_save tool', () => {
|
|
|
142
143
|
});
|
|
143
144
|
|
|
144
145
|
test('returns error for nonexistent conversation', async () => {
|
|
145
|
-
const result = await
|
|
146
|
+
const result = await executeTaskSave(
|
|
146
147
|
{ conversation_id: 'nonexistent' },
|
|
147
148
|
stubContext,
|
|
148
149
|
);
|
|
@@ -171,7 +172,7 @@ describe('task_run tool', () => {
|
|
|
171
172
|
requiredTools: ['file_read'],
|
|
172
173
|
});
|
|
173
174
|
|
|
174
|
-
const result = await
|
|
175
|
+
const result = await executeTaskRun(
|
|
175
176
|
{ task_name: 'summarize', inputs: { file_path: '/tmp/report.txt' } },
|
|
176
177
|
stubContext,
|
|
177
178
|
);
|
|
@@ -188,7 +189,7 @@ describe('task_run tool', () => {
|
|
|
188
189
|
inputSchema: { type: 'object', properties: { url: { type: 'string', description: 'URL' } } },
|
|
189
190
|
});
|
|
190
191
|
|
|
191
|
-
const result = await
|
|
192
|
+
const result = await executeTaskRun(
|
|
192
193
|
{ task_id: task.id, inputs: { url: 'https://prod.example.com' } },
|
|
193
194
|
stubContext,
|
|
194
195
|
);
|
|
@@ -204,7 +205,7 @@ describe('task_run tool', () => {
|
|
|
204
205
|
template: 'Do something',
|
|
205
206
|
});
|
|
206
207
|
|
|
207
|
-
const result = await
|
|
208
|
+
const result = await executeTaskRun(
|
|
208
209
|
{ task_name: 'nonexistent' },
|
|
209
210
|
stubContext,
|
|
210
211
|
);
|
|
@@ -215,13 +216,13 @@ describe('task_run tool', () => {
|
|
|
215
216
|
});
|
|
216
217
|
|
|
217
218
|
test('returns error when task not found by ID', async () => {
|
|
218
|
-
const result = await
|
|
219
|
+
const result = await executeTaskRun(
|
|
219
220
|
{ task_id: 'bad-id' },
|
|
220
221
|
stubContext,
|
|
221
222
|
);
|
|
222
223
|
|
|
223
224
|
expect(result.isError).toBe(true);
|
|
224
|
-
expect(result.content).toContain('No task found with ID "bad-id"');
|
|
225
|
+
expect(result.content).toContain('No task template found with ID "bad-id"');
|
|
225
226
|
});
|
|
226
227
|
|
|
227
228
|
test('renders template with inputs', async () => {
|
|
@@ -237,7 +238,7 @@ describe('task_run tool', () => {
|
|
|
237
238
|
},
|
|
238
239
|
});
|
|
239
240
|
|
|
240
|
-
const result = await
|
|
241
|
+
const result = await executeTaskRun(
|
|
241
242
|
{
|
|
242
243
|
task_name: 'multi-input',
|
|
243
244
|
inputs: { file_path: '/home/user/data.csv', url: 'https://api.example.com/upload' },
|
|
@@ -259,7 +260,7 @@ describe('task_run tool', () => {
|
|
|
259
260
|
},
|
|
260
261
|
});
|
|
261
262
|
|
|
262
|
-
const result = await
|
|
263
|
+
const result = await executeTaskRun(
|
|
263
264
|
{ task_name: 'input required' },
|
|
264
265
|
stubContext,
|
|
265
266
|
);
|
|
@@ -269,14 +270,14 @@ describe('task_run tool', () => {
|
|
|
269
270
|
});
|
|
270
271
|
|
|
271
272
|
test('returns error when neither task_name nor task_id provided', async () => {
|
|
272
|
-
const result = await
|
|
273
|
+
const result = await executeTaskRun({}, stubContext);
|
|
273
274
|
|
|
274
275
|
expect(result.isError).toBe(true);
|
|
275
276
|
expect(result.content).toContain('At least one of task_name or task_id must be provided');
|
|
276
277
|
});
|
|
277
278
|
|
|
278
279
|
test('returns error with helpful message when no tasks exist', async () => {
|
|
279
|
-
const result = await
|
|
280
|
+
const result = await executeTaskRun(
|
|
280
281
|
{ task_name: 'anything' },
|
|
281
282
|
stubContext,
|
|
282
283
|
);
|
|
@@ -292,7 +293,7 @@ describe('task_run tool', () => {
|
|
|
292
293
|
requiredTools: ['file_read', 'bash'],
|
|
293
294
|
});
|
|
294
295
|
|
|
295
|
-
const result = await
|
|
296
|
+
const result = await executeTaskRun(
|
|
296
297
|
{ task_name: 'tools' },
|
|
297
298
|
stubContext,
|
|
298
299
|
);
|
|
@@ -329,7 +330,7 @@ describe('task_list tool', () => {
|
|
|
329
330
|
requiredTools: ['file_read', 'file_write'],
|
|
330
331
|
});
|
|
331
332
|
|
|
332
|
-
const result = await
|
|
333
|
+
const result = await executeTaskList({}, stubContext);
|
|
333
334
|
|
|
334
335
|
expect(result.isError).toBe(false);
|
|
335
336
|
expect(result.content).toContain('Found 2 task template(s)');
|
|
@@ -342,7 +343,7 @@ describe('task_list tool', () => {
|
|
|
342
343
|
});
|
|
343
344
|
|
|
344
345
|
test('returns empty message when no tasks exist', async () => {
|
|
345
|
-
const result = await
|
|
346
|
+
const result = await executeTaskList({}, stubContext);
|
|
346
347
|
|
|
347
348
|
expect(result.isError).toBe(false);
|
|
348
349
|
expect(result.content).toContain('No task templates found');
|
|
@@ -355,7 +356,7 @@ describe('task_list tool', () => {
|
|
|
355
356
|
template: 'Something',
|
|
356
357
|
});
|
|
357
358
|
|
|
358
|
-
const result = await
|
|
359
|
+
const result = await executeTaskList({}, stubContext);
|
|
359
360
|
|
|
360
361
|
expect(result.isError).toBe(false);
|
|
361
362
|
expect(result.content).toContain('Status: active');
|
|
@@ -378,21 +379,17 @@ describe('task_list_show tool', () => {
|
|
|
378
379
|
createWorkItem({ taskId: task.id, title: 'Work Item Alpha', priorityTier: 0 });
|
|
379
380
|
createWorkItem({ taskId: task.id, title: 'Work Item Beta', notes: 'some notes', priorityTier: 1 });
|
|
380
381
|
|
|
381
|
-
const result = await
|
|
382
|
+
const result = await executeTaskListShow({}, stubContext);
|
|
382
383
|
|
|
383
384
|
expect(result.isError).toBe(false);
|
|
384
|
-
expect(result.content).toContain('
|
|
385
|
-
expect(result.content).toContain('Work Item Alpha');
|
|
386
|
-
expect(result.content).toContain('Work Item Beta');
|
|
387
|
-
expect(result.content).toContain('Status: queued');
|
|
388
|
-
expect(result.content).toContain('Notes: some notes');
|
|
385
|
+
expect(result.content).toContain('Opened Tasks window (2 items)');
|
|
389
386
|
});
|
|
390
387
|
|
|
391
388
|
test('returns empty message when no work items', async () => {
|
|
392
|
-
const result = await
|
|
389
|
+
const result = await executeTaskListShow({}, stubContext);
|
|
393
390
|
|
|
394
391
|
expect(result.isError).toBe(false);
|
|
395
|
-
expect(result.content).toContain('
|
|
392
|
+
expect(result.content).toContain('no tasks queued');
|
|
396
393
|
});
|
|
397
394
|
|
|
398
395
|
test('filters by status when status param is provided', async () => {
|
|
@@ -403,17 +400,13 @@ describe('task_list_show tool', () => {
|
|
|
403
400
|
const doneItem = createWorkItem({ taskId: task.id, title: 'Done Item', priorityTier: 1 });
|
|
404
401
|
raw.query('UPDATE work_items SET status = ? WHERE id = ?').run('done', doneItem.id);
|
|
405
402
|
|
|
406
|
-
const resultQueued = await
|
|
403
|
+
const resultQueued = await executeTaskListShow({ status: 'queued' }, stubContext);
|
|
407
404
|
expect(resultQueued.isError).toBe(false);
|
|
408
|
-
expect(resultQueued.content).toContain('
|
|
409
|
-
expect(resultQueued.content).toContain('Queued Item');
|
|
410
|
-
expect(resultQueued.content).not.toContain('Done Item');
|
|
405
|
+
expect(resultQueued.content).toContain('1 queued item');
|
|
411
406
|
|
|
412
|
-
const resultDone = await
|
|
407
|
+
const resultDone = await executeTaskListShow({ status: 'done' }, stubContext);
|
|
413
408
|
expect(resultDone.isError).toBe(false);
|
|
414
|
-
expect(resultDone.content).toContain('
|
|
415
|
-
expect(resultDone.content).toContain('Done Item');
|
|
416
|
-
expect(resultDone.content).not.toContain('Queued Item');
|
|
409
|
+
expect(resultDone.content).toContain('1 done item');
|
|
417
410
|
});
|
|
418
411
|
});
|
|
419
412
|
|
|
@@ -430,7 +423,7 @@ describe('task_list_add tool', () => {
|
|
|
430
423
|
test('successfully enqueues by task_id', async () => {
|
|
431
424
|
const task = createTask({ title: 'Deploy Service', template: 'deploy it' });
|
|
432
425
|
|
|
433
|
-
const result = await
|
|
426
|
+
const result = await executeTaskListAdd({ task_id: task.id }, stubContext);
|
|
434
427
|
|
|
435
428
|
expect(result.isError).toBe(false);
|
|
436
429
|
expect(result.content).toContain('Enqueued work item');
|
|
@@ -441,7 +434,7 @@ describe('task_list_add tool', () => {
|
|
|
441
434
|
test('successfully enqueues by task_name (case-insensitive match)', async () => {
|
|
442
435
|
createTask({ title: 'Run Database Migration', template: 'migrate' });
|
|
443
436
|
|
|
444
|
-
const result = await
|
|
437
|
+
const result = await executeTaskListAdd({ task_name: 'database migration' }, stubContext);
|
|
445
438
|
|
|
446
439
|
expect(result.isError).toBe(false);
|
|
447
440
|
expect(result.content).toContain('Enqueued work item');
|
|
@@ -452,7 +445,7 @@ describe('task_list_add tool', () => {
|
|
|
452
445
|
createTask({ title: 'Deploy Frontend', template: 'deploy fe' });
|
|
453
446
|
createTask({ title: 'Deploy Backend', template: 'deploy be' });
|
|
454
447
|
|
|
455
|
-
const result = await
|
|
448
|
+
const result = await executeTaskListAdd({ task_name: 'deploy' }, stubContext);
|
|
456
449
|
|
|
457
450
|
expect(result.isError).toBe(true);
|
|
458
451
|
expect(result.content).toContain('Multiple task definitions match');
|
|
@@ -463,21 +456,21 @@ describe('task_list_add tool', () => {
|
|
|
463
456
|
test('returns error when no matching task found', async () => {
|
|
464
457
|
createTask({ title: 'Existing Task', template: 'do something' });
|
|
465
458
|
|
|
466
|
-
const result = await
|
|
459
|
+
const result = await executeTaskListAdd({ task_name: 'nonexistent' }, stubContext);
|
|
467
460
|
|
|
468
461
|
expect(result.isError).toBe(true);
|
|
469
462
|
expect(result.content).toContain('No task definition found matching "nonexistent"');
|
|
470
463
|
});
|
|
471
464
|
|
|
472
465
|
test('returns error when no identifiers provided at all', async () => {
|
|
473
|
-
const result = await
|
|
466
|
+
const result = await executeTaskListAdd({}, stubContext);
|
|
474
467
|
|
|
475
468
|
expect(result.isError).toBe(true);
|
|
476
469
|
expect(result.content).toContain('You must provide either task_id, task_name, or title');
|
|
477
470
|
});
|
|
478
471
|
|
|
479
472
|
test('creates ad-hoc work item with just title (no task_id or task_name)', async () => {
|
|
480
|
-
const result = await
|
|
473
|
+
const result = await executeTaskListAdd(
|
|
481
474
|
{ title: 'Check Gmail' },
|
|
482
475
|
stubContext,
|
|
483
476
|
);
|
|
@@ -491,7 +484,7 @@ describe('task_list_add tool', () => {
|
|
|
491
484
|
});
|
|
492
485
|
|
|
493
486
|
test('ad-hoc work item with notes and priority', async () => {
|
|
494
|
-
const result = await
|
|
487
|
+
const result = await executeTaskListAdd(
|
|
495
488
|
{
|
|
496
489
|
title: 'Buy groceries',
|
|
497
490
|
notes: 'Milk, eggs, bread',
|
|
@@ -507,21 +500,21 @@ describe('task_list_add tool', () => {
|
|
|
507
500
|
});
|
|
508
501
|
|
|
509
502
|
test('ad-hoc work item shows up in task_list_show', async () => {
|
|
510
|
-
await
|
|
503
|
+
await executeTaskListAdd(
|
|
511
504
|
{ title: 'Call dentist' },
|
|
512
505
|
stubContext,
|
|
513
506
|
);
|
|
514
507
|
|
|
515
|
-
const listResult = await
|
|
508
|
+
const listResult = await executeTaskListShow({}, stubContext);
|
|
516
509
|
|
|
517
510
|
expect(listResult.isError).toBe(false);
|
|
518
|
-
expect(listResult.content).toContain('
|
|
511
|
+
expect(listResult.content).toContain('Opened Tasks window (1 item)');
|
|
519
512
|
});
|
|
520
513
|
|
|
521
514
|
test('applies optional overrides (title, notes, priority_tier)', async () => {
|
|
522
515
|
const task = createTask({ title: 'Generic Task', template: 'do it' });
|
|
523
516
|
|
|
524
|
-
const result = await
|
|
517
|
+
const result = await executeTaskListAdd(
|
|
525
518
|
{
|
|
526
519
|
task_id: task.id,
|
|
527
520
|
title: 'Custom Title Override',
|
|
@@ -551,7 +544,7 @@ describe('task_delete tool', () => {
|
|
|
551
544
|
test('successfully deletes a single task', async () => {
|
|
552
545
|
const task = createTask({ title: 'Doomed Task', template: 'bye' });
|
|
553
546
|
|
|
554
|
-
const result = await
|
|
547
|
+
const result = await executeTaskDelete({ task_ids: [task.id] }, stubContext);
|
|
555
548
|
|
|
556
549
|
expect(result.isError).toBe(false);
|
|
557
550
|
expect(result.content).toContain('Deleted task: Doomed Task');
|
|
@@ -561,7 +554,7 @@ describe('task_delete tool', () => {
|
|
|
561
554
|
const t1 = createTask({ title: 'Task One', template: 'one' });
|
|
562
555
|
const t2 = createTask({ title: 'Task Two', template: 'two' });
|
|
563
556
|
|
|
564
|
-
const result = await
|
|
557
|
+
const result = await executeTaskDelete({ task_ids: [t1.id, t2.id] }, stubContext);
|
|
565
558
|
|
|
566
559
|
expect(result.isError).toBe(false);
|
|
567
560
|
expect(result.content).toContain('Deleted 2 task(s)');
|
|
@@ -570,10 +563,10 @@ describe('task_delete tool', () => {
|
|
|
570
563
|
});
|
|
571
564
|
|
|
572
565
|
test('returns error for non-existent task ID', async () => {
|
|
573
|
-
const result = await
|
|
566
|
+
const result = await executeTaskDelete({ task_ids: ['nonexistent-id'] }, stubContext);
|
|
574
567
|
|
|
575
568
|
expect(result.isError).toBe(true);
|
|
576
|
-
expect(result.content).toContain('No task found with ID nonexistent-id');
|
|
569
|
+
expect(result.content).toContain('No task template or work item found with ID "nonexistent-id"');
|
|
577
570
|
});
|
|
578
571
|
|
|
579
572
|
test('cascades deletion to associated task runs and work items', async () => {
|
|
@@ -588,7 +581,7 @@ describe('task_delete tool', () => {
|
|
|
588
581
|
expect(runsBefore.count).toBe(1);
|
|
589
582
|
expect(itemsBefore.count).toBe(1);
|
|
590
583
|
|
|
591
|
-
const result = await
|
|
584
|
+
const result = await executeTaskDelete({ task_ids: [task.id] }, stubContext);
|
|
592
585
|
|
|
593
586
|
expect(result.isError).toBe(false);
|
|
594
587
|
expect(result.content).toContain('Deleted task: Parent Task');
|
|
@@ -190,6 +190,7 @@ describe('createToolDomainEventPublisher', () => {
|
|
|
190
190
|
durationMs: 12,
|
|
191
191
|
errorMessage: 'cat: /missing: No such file or directory',
|
|
192
192
|
isExpected: false,
|
|
193
|
+
errorCategory: 'tool_failure',
|
|
193
194
|
errorName: 'Error',
|
|
194
195
|
errorStack: 'Error: cat: /missing: No such file or directory',
|
|
195
196
|
});
|
|
@@ -229,6 +230,7 @@ describe('createToolDomainEventPublisher', () => {
|
|
|
229
230
|
durationMs: 9,
|
|
230
231
|
errorMessage: 'ENOENT',
|
|
231
232
|
isExpected: false,
|
|
233
|
+
errorCategory: 'tool_failure',
|
|
232
234
|
errorName: 'Error',
|
|
233
235
|
errorStack: 'Error: ENOENT\n at test',
|
|
234
236
|
});
|