@vellumai/assistant 0.9.0 → 0.9.1-staging.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +18 -34
- package/bun.lock +7 -8
- package/docs/activation-funnel-telemetry.md +4 -4
- package/docs/architecture/security.md +29 -28
- package/docs/stt-provider-onboarding.md +3 -5
- package/docs/workflows-testing.md +13 -44
- package/docs/workflows.md +3 -5
- package/node_modules/@vellumai/ces-client/src/__tests__/ces-client.test.ts +47 -0
- package/node_modules/@vellumai/ces-client/src/rpc-client.ts +28 -5
- package/node_modules/@vellumai/environments/src/seeds.ts +2 -5
- package/node_modules/@vellumai/gateway-client/src/index.ts +17 -6
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +119 -0
- package/node_modules/@vellumai/gateway-client/src/types.ts +15 -84
- package/openapi.yaml +135 -59
- package/package.json +2 -1
- package/scripts/sync-llm-catalog.ts +6 -15
- package/scripts/sync-web-search-catalog.ts +3 -11
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +14 -26
- package/src/__tests__/agent-loop-compaction-strip.test.ts +240 -0
- package/src/__tests__/agent-loop-output-hooks.test.ts +69 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +25 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -3
- package/src/__tests__/app-dir-path-guard.test.ts +0 -1
- package/src/__tests__/assistant-feature-flag-guard.test.ts +1 -4
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/avatar-identity-sync.test.ts +2 -27
- package/src/__tests__/btw-routes.test.ts +6 -8
- package/src/__tests__/checker.test.ts +0 -3
- package/src/__tests__/config-loader-backfill.test.ts +103 -6
- package/src/__tests__/config-watcher.test.ts +0 -18
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +22 -0
- package/src/__tests__/credential-broker.test.ts +449 -1
- package/src/__tests__/credential-execution-tools.test.ts +0 -1
- package/src/__tests__/credential-prompt-route.test.ts +3 -4
- package/src/__tests__/credential-routes.test.ts +360 -0
- package/src/__tests__/credential-security-invariants.test.ts +2 -13
- package/src/__tests__/dynamic-page-surface.test.ts +101 -1
- package/src/__tests__/fixtures/credential-security-fixtures.ts +2 -33
- package/src/__tests__/gateway-only-guard.test.ts +3 -7
- package/src/__tests__/identity-routes.test.ts +0 -189
- package/src/__tests__/inbound-invite-redemption.test.ts +4 -4
- package/src/__tests__/invite-redemption-service.test.ts +4 -4
- package/src/__tests__/llm-callsite-catalog.test.ts +5 -6
- package/src/__tests__/llm-catalog-parity.test.ts +0 -22
- package/src/__tests__/llm-resolver.test.ts +49 -24
- package/src/__tests__/oauth-provider-seed-logos.test.ts +4 -6
- package/src/__tests__/onboarding-persona-write.test.ts +1 -1
- package/src/__tests__/persona-resolver.test.ts +11 -14
- package/src/__tests__/plugin-api-model-profiles.test.ts +178 -0
- package/src/__tests__/registry.test.ts +2 -7
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -10
- package/src/__tests__/schedule-routes.test.ts +0 -30
- package/src/__tests__/schedule-tools.test.ts +2 -18
- package/src/__tests__/skill-execute-input.test.ts +46 -1
- package/src/__tests__/skill-runtime-path.test.ts +2 -3
- package/src/__tests__/subagent-tools.test.ts +116 -0
- package/src/__tests__/surface-completion-nudge-hook.test.ts +367 -0
- package/src/__tests__/token-estimator-accuracy.benchmark.test.ts +1 -29
- package/src/__tests__/token-manager.test.ts +519 -0
- package/src/__tests__/tool-executor.test.ts +0 -79
- package/src/__tests__/trusted-contact-multichannel.test.ts +3 -3
- package/src/__tests__/trusted-contact-verification.test.ts +6 -6
- package/src/__tests__/voice-invite-redemption.test.ts +2 -2
- package/src/__tests__/web-search-catalog-parity.test.ts +6 -25
- package/src/__tests__/workspace-greetings.test.ts +152 -0
- package/src/agent/loop.ts +25 -5
- package/src/api/README.md +6 -6
- package/src/api/responses/conversation-message.ts +2 -4
- package/src/api/responses/home.ts +0 -4
- package/src/approvals/guardian-request-resolvers.ts +2 -2
- package/src/calls/relay-access-wait.ts +1 -1
- package/src/calls/voice-session-bridge.ts +2 -2
- package/src/cli/commands/plugins.ts +143 -2
- package/src/cli/lib/__tests__/diff-plugin.test.ts +443 -0
- package/src/cli/lib/__tests__/merge-plugin-tree.test.ts +313 -0
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +253 -2
- package/src/cli/lib/diff-plugin.ts +346 -0
- package/src/cli/lib/install-from-github.ts +105 -17
- package/src/cli/lib/merge-plugin-tree.ts +228 -0
- package/src/cli/lib/plugin-fingerprint.ts +14 -0
- package/src/cli/lib/upgrade-plugin.ts +270 -10
- package/src/cli/program.ts +0 -2
- package/src/config/bundled-skills/subagent/SKILL.md +4 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +4 -0
- package/src/config/bundled-skills/workflows/SKILL.md +0 -1
- package/src/config/bundled-tool-registry.ts +2 -7
- package/src/config/call-site-defaults.ts +12 -2
- package/src/config/feature-flag-registry.json +1 -17
- package/src/config/inference-profile-validation.ts +26 -0
- package/src/config/loader.ts +4 -0
- package/src/config/profile-order.ts +28 -0
- package/src/config/schemas/elevenlabs.ts +0 -1
- package/src/config/schemas/platform.ts +0 -8
- package/src/config/seed-inference-profiles.ts +25 -20
- package/src/contacts/contact-store.ts +87 -96
- package/src/contacts/contacts-write.ts +5 -21
- package/src/context/compactor.ts +2 -2
- package/src/credential-execution/process-manager.ts +55 -14
- package/src/credential-execution/prompted-credential.ts +2 -3
- package/src/daemon/config-watcher.ts +0 -4
- package/src/daemon/conversation-agent-loop.ts +15 -4
- package/src/daemon/conversation-slash.ts +2 -23
- package/src/daemon/conversation-tool-setup.ts +11 -3
- package/src/daemon/conversation.ts +2 -0
- package/src/daemon/handlers/config-channels.ts +20 -16
- package/src/daemon/handlers/config-slack-channel.ts +2 -3
- package/src/daemon/lifecycle.ts +0 -7
- package/src/daemon/message-types/conversations.ts +3 -3
- package/src/daemon/message-types/sync.ts +0 -1
- package/src/daemon/orphan-reaper.test.ts +0 -19
- package/src/daemon/orphan-reaper.ts +2 -24
- package/src/daemon/server.ts +0 -10
- package/src/home/relationship-state.ts +2 -4
- package/src/memory/__tests__/memory-retrospective-job.test.ts +195 -401
- package/src/memory/bookmark-crud.ts +1 -2
- package/src/memory/db-init.ts +7 -17
- package/src/memory/embedding-backend.ts +23 -0
- package/src/memory/embedding-billing-breaker.ts +96 -0
- package/src/memory/jobs-store.ts +25 -13
- package/src/memory/jobs-worker.ts +52 -0
- package/src/memory/memory-retrospective-constants.ts +4 -4
- package/src/memory/memory-retrospective-job.ts +19 -227
- package/src/memory/migrations/291-contact-channels-renormalize-addresses.ts +62 -0
- package/src/memory/migrations/__tests__/291-contact-channels-renormalize-addresses.test.ts +311 -0
- package/src/memory/migrations/__tests__/run-migrations.test.ts +52 -0
- package/src/memory/migrations/index.ts +1 -0
- package/src/memory/migrations/run-migrations.ts +41 -0
- package/src/memory/migrations/validate-migration-state.ts +1 -1
- package/src/memory/schema/contacts.ts +0 -4
- package/src/messaging/providers/slack/adapter.ts +1 -1
- package/src/notifications/adapters/shared.ts +29 -0
- package/src/notifications/adapters/slack.ts +5 -32
- package/src/notifications/adapters/telegram.ts +2 -20
- package/src/notifications/broadcaster.ts +10 -1
- package/src/notifications/home-feed-side-effect.ts +4 -3
- package/src/notifications/notification-utils.ts +17 -19
- package/src/notifications/types.ts +7 -0
- package/src/oauth/AGENTS.md +5 -24
- package/src/plugin-api/constants.ts +1 -1
- package/src/plugin-api/index.ts +6 -1
- package/src/plugin-api/model-profiles.ts +33 -0
- package/src/plugin-api/types.ts +50 -2
- package/src/plugins/defaults/index.ts +25 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +54 -2
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +107 -7
- package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +276 -0
- package/src/plugins/defaults/surface-completion-nudge/hooks/stop.ts +22 -0
- package/src/plugins/defaults/surface-completion-nudge/nudge-state-store.ts +46 -0
- package/src/plugins/defaults/surface-completion-nudge/package.json +14 -0
- package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +1 -1
- package/src/prompts/persona-resolver.ts +2 -2
- package/src/runtime/AGENTS.md +0 -1
- package/src/runtime/actor-trust-resolver.ts +12 -44
- package/src/runtime/btw-sidechain.ts +3 -6
- package/src/runtime/channel-approval-types.ts +18 -45
- package/src/runtime/channel-invite-transports/telegram.ts +4 -4
- package/src/runtime/channel-verification-service.ts +4 -3
- package/src/runtime/invite-redemption-service.ts +3 -3
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +218 -1
- package/src/runtime/routes/app-routes.ts +1 -1
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +2 -2
- package/src/runtime/routes/assets/vellum-design-system.css +1959 -0
- package/src/runtime/routes/btw-routes.ts +1 -27
- package/src/runtime/routes/conversation-compaction-routes.ts +1 -1
- package/src/runtime/routes/conversation-routes.ts +2 -2
- package/src/runtime/routes/credential-routes.ts +40 -16
- package/src/runtime/routes/empty-state-greeting-cache.ts +1 -2
- package/src/runtime/routes/identity-routes.ts +1 -296
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +1 -1
- package/src/runtime/routes/plugins-routes.ts +171 -5
- package/src/runtime/routes/schedule-routes.ts +0 -22
- package/src/runtime/routes/workflow-routes.test.ts +4 -43
- package/src/runtime/routes/workflow-routes.ts +0 -28
- package/src/runtime/routes/workspace-greetings.ts +55 -0
- package/src/runtime/sync/resource-sync-events.ts +1 -11
- package/src/schedule/inference-profile.ts +2 -14
- package/src/subagent/manager.ts +6 -0
- package/src/subagent/types.ts +6 -0
- package/src/tools/AGENTS.md +3 -3
- package/src/tools/browser/browser-execution.ts +1 -1
- package/src/tools/network/web-search-error.ts +1 -1
- package/src/tools/permission-checker.ts +1 -1
- package/src/tools/schedule/create.ts +3 -9
- package/src/tools/schedule/update.ts +2 -10
- package/src/tools/side-effects.ts +2 -17
- package/src/tools/skills/execute.ts +34 -0
- package/src/tools/subagent/spawn.ts +34 -9
- package/src/tools/tool-approval-handler.ts +1 -3
- package/src/tools/tool-manifest.ts +0 -2
- package/src/tools/ui-surface/definitions.ts +39 -1
- package/src/tools/workflows/run-workflow.test.ts +8 -18
- package/src/util/platform.ts +2 -2
- package/src/workflows/capabilities.ts +2 -3
- package/src/workflows/run-manager.test.ts +0 -25
- package/src/workflows/run-manager.ts +2 -24
- package/src/__tests__/app-control-no-global-cgevent.test.ts +0 -98
- package/src/__tests__/credential-security-e2e.test.ts +0 -362
- package/src/__tests__/credential-vault-unit.test.ts +0 -1528
- package/src/__tests__/credential-vault.test.ts +0 -1706
- package/src/__tests__/identity-intro-cache.test.ts +0 -315
- package/src/__tests__/secret-onetime-send.test.ts +0 -182
- package/src/cli/commands/__tests__/task.test.ts +0 -914
- package/src/cli/commands/task.ts +0 -771
- package/src/config/bundled-skills/personal-page/SKILL.md +0 -57
- package/src/config/bundled-skills/personal-page/TOOLS.json +0 -27
- package/src/config/bundled-skills/personal-page/tools/app-refresh.ts +0 -17
- package/src/config/preloaded-apps/personal-page/src/components/About.tsx +0 -22
- package/src/config/preloaded-apps/personal-page/src/components/App.tsx +0 -16
- package/src/config/preloaded-apps/personal-page/src/components/Features.tsx +0 -77
- package/src/config/preloaded-apps/personal-page/src/components/Hero.tsx +0 -57
- package/src/config/preloaded-apps/personal-page/src/components/Pending.tsx +0 -28
- package/src/config/preloaded-apps/personal-page/src/components/animations.tsx +0 -234
- package/src/config/preloaded-apps/personal-page/src/components/icons.tsx +0 -48
- package/src/config/preloaded-apps/personal-page/src/components/media.ts +0 -16
- package/src/config/preloaded-apps/personal-page/src/index.html +0 -20
- package/src/config/preloaded-apps/personal-page/src/main.tsx +0 -7
- package/src/config/preloaded-apps/personal-page/src/profile-data.ts +0 -82
- package/src/config/preloaded-apps/personal-page/src/styles.css +0 -759
- package/src/memory/__tests__/preloaded-apps.test.ts +0 -85
- package/src/memory/preloaded-apps.ts +0 -116
- package/src/runtime/routes/identity-intro-cache.ts +0 -172
- package/src/tools/credentials/vault.ts +0 -712
package/src/cli/commands/task.ts
DELETED
|
@@ -1,771 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `assistant task` CLI namespace.
|
|
3
|
-
*
|
|
4
|
-
* Subcommands for task template management (save, list, run, delete) and
|
|
5
|
-
* work queue operations (queue show/add/update/remove/run). All commands
|
|
6
|
-
* are thin wrappers over the assistant's task IPC routes.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { Command } from "commander";
|
|
10
|
-
|
|
11
|
-
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
12
|
-
import { registerCommand } from "../lib/register-command.js";
|
|
13
|
-
import { log } from "../logger.js";
|
|
14
|
-
import { resolveConversationId } from "../utils/conversation-id.js";
|
|
15
|
-
|
|
16
|
-
// ── Registration ──────────────────────────────────────────────────────
|
|
17
|
-
|
|
18
|
-
export function registerTaskCommand(program: Command): void {
|
|
19
|
-
registerCommand(program, {
|
|
20
|
-
name: "task",
|
|
21
|
-
transport: "ipc",
|
|
22
|
-
description: "Manage task templates and work queue items",
|
|
23
|
-
build: (task) => {
|
|
24
|
-
|
|
25
|
-
task.addHelpText(
|
|
26
|
-
"after",
|
|
27
|
-
`
|
|
28
|
-
Task templates define reusable work items that the assistant can execute.
|
|
29
|
-
The work queue holds pending, in-progress, and completed work items
|
|
30
|
-
derived from task templates.
|
|
31
|
-
|
|
32
|
-
Examples:
|
|
33
|
-
$ assistant task list
|
|
34
|
-
$ assistant task save --title "Deploy workflow"
|
|
35
|
-
$ assistant task run --name "Deploy workflow"
|
|
36
|
-
$ assistant task queue show --status pending
|
|
37
|
-
$ assistant task queue add --name "Deploy workflow" --title "Deploy v2"`,
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
// ── save ──────────────────────────────────────────────────────────
|
|
41
|
-
|
|
42
|
-
task
|
|
43
|
-
.command("save")
|
|
44
|
-
.description("Save the current conversation as a task template")
|
|
45
|
-
.option(
|
|
46
|
-
"--conversation-id <id>",
|
|
47
|
-
"Conversation ID to save as a template -- run 'assistant conversations list' to find it. Falls back to env vars.",
|
|
48
|
-
)
|
|
49
|
-
.option("--title <title>", "Title for the task template.")
|
|
50
|
-
.option("--json", "Output result as machine-readable JSON.")
|
|
51
|
-
.addHelpText(
|
|
52
|
-
"after",
|
|
53
|
-
`
|
|
54
|
-
Saves the current conversation as a reusable task template. The
|
|
55
|
-
conversation ID is resolved from --conversation-id, the
|
|
56
|
-
__SKILL_CONTEXT_JSON env var, or __CONVERSATION_ID env var.
|
|
57
|
-
|
|
58
|
-
Examples:
|
|
59
|
-
$ assistant task save --title "Deploy workflow"
|
|
60
|
-
$ assistant task save --conversation-id conv_abc123 --title "My task"
|
|
61
|
-
$ assistant task save --json`,
|
|
62
|
-
)
|
|
63
|
-
.action(
|
|
64
|
-
async (opts: {
|
|
65
|
-
conversationId?: string;
|
|
66
|
-
title?: string;
|
|
67
|
-
json?: boolean;
|
|
68
|
-
}) => {
|
|
69
|
-
let conversationId: string;
|
|
70
|
-
try {
|
|
71
|
-
conversationId = resolveConversationId({
|
|
72
|
-
explicit: opts.conversationId,
|
|
73
|
-
failureHelp:
|
|
74
|
-
"No conversation ID available.\nProvide --conversation-id explicitly (run 'assistant conversations list' to find it),\nor run this command from a skill or bash tool context.",
|
|
75
|
-
});
|
|
76
|
-
} catch (err) {
|
|
77
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
78
|
-
if (opts.json) {
|
|
79
|
-
process.stdout.write(
|
|
80
|
-
JSON.stringify({ ok: false, error: msg }) + "\n",
|
|
81
|
-
);
|
|
82
|
-
} else {
|
|
83
|
-
log.error(msg);
|
|
84
|
-
}
|
|
85
|
-
process.exitCode = 1;
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const params: Record<string, unknown> = {
|
|
90
|
-
conversation_id: conversationId,
|
|
91
|
-
};
|
|
92
|
-
if (opts.title) params.title = opts.title;
|
|
93
|
-
|
|
94
|
-
const result = await cliIpcCall("task_save", { body: params });
|
|
95
|
-
|
|
96
|
-
if (!result.ok) {
|
|
97
|
-
if (opts.json) {
|
|
98
|
-
process.stdout.write(
|
|
99
|
-
JSON.stringify({ ok: false, error: result.error }) + "\n",
|
|
100
|
-
);
|
|
101
|
-
} else {
|
|
102
|
-
log.error(`Error: ${result.error}`);
|
|
103
|
-
}
|
|
104
|
-
process.exitCode = 1;
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (opts.json) {
|
|
109
|
-
process.stdout.write(
|
|
110
|
-
JSON.stringify({ ok: true, result: result.result }) + "\n",
|
|
111
|
-
);
|
|
112
|
-
} else {
|
|
113
|
-
log.info(JSON.stringify(result.result, null, 2));
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
// ── list ──────────────────────────────────────────────────────────
|
|
119
|
-
|
|
120
|
-
task
|
|
121
|
-
.command("list")
|
|
122
|
-
.description("List all saved task templates")
|
|
123
|
-
.option("--json", "Output result as machine-readable JSON.")
|
|
124
|
-
.addHelpText(
|
|
125
|
-
"after",
|
|
126
|
-
`
|
|
127
|
-
Lists all saved task templates with their IDs, names, and metadata.
|
|
128
|
-
|
|
129
|
-
Examples:
|
|
130
|
-
$ assistant task list
|
|
131
|
-
$ assistant task list --json`,
|
|
132
|
-
)
|
|
133
|
-
.action(async (opts: { json?: boolean }) => {
|
|
134
|
-
const result = await cliIpcCall("task_list", { body: {} });
|
|
135
|
-
|
|
136
|
-
if (!result.ok) {
|
|
137
|
-
if (opts.json) {
|
|
138
|
-
process.stdout.write(
|
|
139
|
-
JSON.stringify({ ok: false, error: result.error }) + "\n",
|
|
140
|
-
);
|
|
141
|
-
} else {
|
|
142
|
-
log.error(`Error: ${result.error}`);
|
|
143
|
-
}
|
|
144
|
-
process.exitCode = 1;
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (opts.json) {
|
|
149
|
-
process.stdout.write(
|
|
150
|
-
JSON.stringify({ ok: true, result: result.result }) + "\n",
|
|
151
|
-
);
|
|
152
|
-
} else {
|
|
153
|
-
log.info(JSON.stringify(result.result, null, 2));
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
// ── run ───────────────────────────────────────────────────────────
|
|
158
|
-
|
|
159
|
-
task
|
|
160
|
-
.command("run")
|
|
161
|
-
.description("Run a task template by ID or name")
|
|
162
|
-
.option(
|
|
163
|
-
"--id <id>",
|
|
164
|
-
"Task template ID to run -- run 'assistant task list' to find it.",
|
|
165
|
-
)
|
|
166
|
-
.option(
|
|
167
|
-
"--name <name>",
|
|
168
|
-
"Task template name to run -- run 'assistant task list' to find it.",
|
|
169
|
-
)
|
|
170
|
-
.option("--inputs <json>", "JSON string of inputs for the task.")
|
|
171
|
-
.option("--json", "Output result as machine-readable JSON.")
|
|
172
|
-
.addHelpText(
|
|
173
|
-
"after",
|
|
174
|
-
`
|
|
175
|
-
Runs a task template, creating a new conversation for execution.
|
|
176
|
-
Specify the task by --id or --name. Optionally pass --inputs as a
|
|
177
|
-
JSON string to provide runtime parameters.
|
|
178
|
-
|
|
179
|
-
Examples:
|
|
180
|
-
$ assistant task run --id task_abc123
|
|
181
|
-
$ assistant task run --name "Deploy workflow"
|
|
182
|
-
$ assistant task run --name "Deploy workflow" --inputs '{"env":"prod"}'
|
|
183
|
-
$ assistant task run --id task_abc123 --json`,
|
|
184
|
-
)
|
|
185
|
-
.action(
|
|
186
|
-
async (opts: {
|
|
187
|
-
id?: string;
|
|
188
|
-
name?: string;
|
|
189
|
-
inputs?: string;
|
|
190
|
-
json?: boolean;
|
|
191
|
-
}) => {
|
|
192
|
-
const params: Record<string, unknown> = {};
|
|
193
|
-
if (opts.id) params.task_id = opts.id;
|
|
194
|
-
if (opts.name) params.task_name = opts.name;
|
|
195
|
-
if (opts.inputs) {
|
|
196
|
-
try {
|
|
197
|
-
params.inputs = JSON.parse(opts.inputs);
|
|
198
|
-
} catch {
|
|
199
|
-
const msg = `Invalid JSON for --inputs: ${opts.inputs}`;
|
|
200
|
-
if (opts.json) {
|
|
201
|
-
process.stdout.write(
|
|
202
|
-
JSON.stringify({ ok: false, error: msg }) + "\n",
|
|
203
|
-
);
|
|
204
|
-
} else {
|
|
205
|
-
log.error(msg);
|
|
206
|
-
}
|
|
207
|
-
process.exitCode = 1;
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
const result = await cliIpcCall("task_run", { body: params });
|
|
213
|
-
|
|
214
|
-
if (!result.ok) {
|
|
215
|
-
if (opts.json) {
|
|
216
|
-
process.stdout.write(
|
|
217
|
-
JSON.stringify({ ok: false, error: result.error }) + "\n",
|
|
218
|
-
);
|
|
219
|
-
} else {
|
|
220
|
-
log.error(`Error: ${result.error}`);
|
|
221
|
-
}
|
|
222
|
-
process.exitCode = 1;
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
if (opts.json) {
|
|
227
|
-
process.stdout.write(
|
|
228
|
-
JSON.stringify({ ok: true, result: result.result }) + "\n",
|
|
229
|
-
);
|
|
230
|
-
} else {
|
|
231
|
-
log.info(JSON.stringify(result.result, null, 2));
|
|
232
|
-
}
|
|
233
|
-
},
|
|
234
|
-
);
|
|
235
|
-
|
|
236
|
-
// ── delete ────────────────────────────────────────────────────────
|
|
237
|
-
|
|
238
|
-
task
|
|
239
|
-
.command("delete <ids...>")
|
|
240
|
-
.description("Delete one or more task templates by ID")
|
|
241
|
-
.option("--json", "Output result as machine-readable JSON.")
|
|
242
|
-
.addHelpText(
|
|
243
|
-
"after",
|
|
244
|
-
`
|
|
245
|
-
Arguments:
|
|
246
|
-
ids One or more task template IDs to delete. Run 'assistant task list'
|
|
247
|
-
to find IDs.
|
|
248
|
-
|
|
249
|
-
Removes task templates permanently. Accepts multiple IDs for batch deletion.
|
|
250
|
-
|
|
251
|
-
Examples:
|
|
252
|
-
$ assistant task delete task_abc123
|
|
253
|
-
$ assistant task delete task_abc123 task_def456
|
|
254
|
-
$ assistant task delete task_abc123 --json`,
|
|
255
|
-
)
|
|
256
|
-
.action(async (ids: string[], opts: { json?: boolean }) => {
|
|
257
|
-
const result = await cliIpcCall("task_delete", {
|
|
258
|
-
body: { task_ids: ids },
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
if (!result.ok) {
|
|
262
|
-
if (opts.json) {
|
|
263
|
-
process.stdout.write(
|
|
264
|
-
JSON.stringify({ ok: false, error: result.error }) + "\n",
|
|
265
|
-
);
|
|
266
|
-
} else {
|
|
267
|
-
log.error(`Error: ${result.error}`);
|
|
268
|
-
}
|
|
269
|
-
process.exitCode = 1;
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
if (opts.json) {
|
|
274
|
-
process.stdout.write(
|
|
275
|
-
JSON.stringify({ ok: true, result: result.result }) + "\n",
|
|
276
|
-
);
|
|
277
|
-
} else {
|
|
278
|
-
log.info(JSON.stringify(result.result, null, 2));
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
// ── queue (subcommand group) ──────────────────────────────────────
|
|
283
|
-
|
|
284
|
-
const queue = task.command("queue").description("Manage work queue items");
|
|
285
|
-
|
|
286
|
-
queue.addHelpText(
|
|
287
|
-
"after",
|
|
288
|
-
`
|
|
289
|
-
The work queue holds pending, in-progress, and completed work items.
|
|
290
|
-
Work items are derived from task templates and can be managed
|
|
291
|
-
independently.
|
|
292
|
-
|
|
293
|
-
Examples:
|
|
294
|
-
$ assistant task queue show
|
|
295
|
-
$ assistant task queue show --status pending
|
|
296
|
-
$ assistant task queue add --name "Deploy workflow" --title "Deploy v2"
|
|
297
|
-
$ assistant task queue update --work-item-id wi_abc123 --status completed
|
|
298
|
-
$ assistant task queue remove --work-item-id wi_abc123
|
|
299
|
-
$ assistant task queue run`,
|
|
300
|
-
);
|
|
301
|
-
|
|
302
|
-
// ── queue show ──────────────────────────────────────────────────
|
|
303
|
-
|
|
304
|
-
queue
|
|
305
|
-
.command("show")
|
|
306
|
-
.description("Show work items in the queue")
|
|
307
|
-
.option("--status <status>", "Filter by work item status.")
|
|
308
|
-
.option("--json", "Output result as machine-readable JSON.")
|
|
309
|
-
.addHelpText(
|
|
310
|
-
"after",
|
|
311
|
-
`
|
|
312
|
-
Displays work items in the queue, optionally filtered by status.
|
|
313
|
-
|
|
314
|
-
Examples:
|
|
315
|
-
$ assistant task queue show
|
|
316
|
-
$ assistant task queue show --status pending
|
|
317
|
-
$ assistant task queue show --json`,
|
|
318
|
-
)
|
|
319
|
-
.action(async (opts: { status?: string; json?: boolean }) => {
|
|
320
|
-
const params: Record<string, unknown> = {};
|
|
321
|
-
if (opts.status) params.status = opts.status;
|
|
322
|
-
|
|
323
|
-
const result = await cliIpcCall<{ content: string; isError?: boolean }>(
|
|
324
|
-
"task_queue_show",
|
|
325
|
-
{ body: params },
|
|
326
|
-
);
|
|
327
|
-
|
|
328
|
-
if (!result.ok) {
|
|
329
|
-
if (opts.json) {
|
|
330
|
-
process.stdout.write(
|
|
331
|
-
JSON.stringify({ ok: false, error: result.error }) + "\n",
|
|
332
|
-
);
|
|
333
|
-
} else {
|
|
334
|
-
log.error(`Error: ${result.error}`);
|
|
335
|
-
}
|
|
336
|
-
process.exitCode = 1;
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
if (result.result?.isError) {
|
|
341
|
-
if (opts.json) {
|
|
342
|
-
process.stdout.write(
|
|
343
|
-
JSON.stringify({ ok: false, error: result.result.content }) + "\n",
|
|
344
|
-
);
|
|
345
|
-
} else {
|
|
346
|
-
log.error(`Error: ${result.result.content}`);
|
|
347
|
-
}
|
|
348
|
-
process.exitCode = 1;
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
if (opts.json) {
|
|
353
|
-
process.stdout.write(
|
|
354
|
-
JSON.stringify({ ok: true, result: result.result }) + "\n",
|
|
355
|
-
);
|
|
356
|
-
} else {
|
|
357
|
-
log.info(JSON.stringify(result.result, null, 2));
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
// ── queue add ───────────────────────────────────────────────────
|
|
362
|
-
|
|
363
|
-
queue
|
|
364
|
-
.command("add")
|
|
365
|
-
.description("Add a work item to the queue")
|
|
366
|
-
.option("--title <title>", "Title for the work item.")
|
|
367
|
-
.option(
|
|
368
|
-
"--id <id>",
|
|
369
|
-
"Task template ID -- run 'assistant task list' to find it.",
|
|
370
|
-
)
|
|
371
|
-
.option(
|
|
372
|
-
"--name <name>",
|
|
373
|
-
"Task template name -- run 'assistant task list' to find it.",
|
|
374
|
-
)
|
|
375
|
-
.option(
|
|
376
|
-
"--execution-prompt <prompt>",
|
|
377
|
-
"Execution prompt for the work item.",
|
|
378
|
-
)
|
|
379
|
-
.option("--notes <notes>", "Notes for the work item.")
|
|
380
|
-
.option("--priority <tier>", "Priority tier (number).", parseInt)
|
|
381
|
-
.option("--sort-index <n>", "Sort index (number).", parseInt)
|
|
382
|
-
.option(
|
|
383
|
-
"--if-exists <strategy>",
|
|
384
|
-
"Strategy when item exists: create_duplicate, reuse_existing, update_existing.",
|
|
385
|
-
)
|
|
386
|
-
.option(
|
|
387
|
-
"--required-tools <tools>",
|
|
388
|
-
"Comma-separated list of required tool names.",
|
|
389
|
-
)
|
|
390
|
-
.option("--json", "Output result as machine-readable JSON.")
|
|
391
|
-
.addHelpText(
|
|
392
|
-
"after",
|
|
393
|
-
`
|
|
394
|
-
Adds a new work item to the queue, optionally linked to a task template.
|
|
395
|
-
|
|
396
|
-
--required-tools accepts a comma-separated string of tool names, which is
|
|
397
|
-
split into an array before sending to the assistant.
|
|
398
|
-
|
|
399
|
-
--if-exists controls behavior when a matching item already exists:
|
|
400
|
-
create_duplicate Create a new item regardless (default)
|
|
401
|
-
reuse_existing Return the existing item without changes
|
|
402
|
-
update_existing Update the existing item with provided values
|
|
403
|
-
|
|
404
|
-
Examples:
|
|
405
|
-
$ assistant task queue add --name "Deploy workflow" --title "Deploy v2"
|
|
406
|
-
$ assistant task queue add --id task_abc123 --priority 1 --notes "Urgent"
|
|
407
|
-
$ assistant task queue add --name "Build" --required-tools "bash,browser"
|
|
408
|
-
$ assistant task queue add --name "Build" --if-exists update_existing --json`,
|
|
409
|
-
)
|
|
410
|
-
.action(
|
|
411
|
-
async (opts: {
|
|
412
|
-
title?: string;
|
|
413
|
-
id?: string;
|
|
414
|
-
name?: string;
|
|
415
|
-
executionPrompt?: string;
|
|
416
|
-
notes?: string;
|
|
417
|
-
priority?: number;
|
|
418
|
-
sortIndex?: number;
|
|
419
|
-
ifExists?: string;
|
|
420
|
-
requiredTools?: string;
|
|
421
|
-
json?: boolean;
|
|
422
|
-
}) => {
|
|
423
|
-
const params: Record<string, unknown> = {};
|
|
424
|
-
if (opts.title) params.title = opts.title;
|
|
425
|
-
if (opts.id) params.task_id = opts.id;
|
|
426
|
-
if (opts.name) params.task_name = opts.name;
|
|
427
|
-
if (opts.executionPrompt)
|
|
428
|
-
params.execution_prompt = opts.executionPrompt;
|
|
429
|
-
if (opts.notes) params.notes = opts.notes;
|
|
430
|
-
if (opts.priority !== undefined) params.priority_tier = opts.priority;
|
|
431
|
-
if (opts.sortIndex !== undefined) params.sort_index = opts.sortIndex;
|
|
432
|
-
if (opts.ifExists) params.if_exists = opts.ifExists;
|
|
433
|
-
if (opts.requiredTools) {
|
|
434
|
-
params.required_tools = opts.requiredTools
|
|
435
|
-
.split(",")
|
|
436
|
-
.map((t) => t.trim())
|
|
437
|
-
.filter(Boolean);
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
const result = await cliIpcCall<{
|
|
441
|
-
content: string;
|
|
442
|
-
isError?: boolean;
|
|
443
|
-
}>("task_queue_add", { body: params });
|
|
444
|
-
|
|
445
|
-
if (!result.ok) {
|
|
446
|
-
if (opts.json) {
|
|
447
|
-
process.stdout.write(
|
|
448
|
-
JSON.stringify({ ok: false, error: result.error }) + "\n",
|
|
449
|
-
);
|
|
450
|
-
} else {
|
|
451
|
-
log.error(`Error: ${result.error}`);
|
|
452
|
-
}
|
|
453
|
-
process.exitCode = 1;
|
|
454
|
-
return;
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
if (result.result?.isError) {
|
|
458
|
-
if (opts.json) {
|
|
459
|
-
process.stdout.write(
|
|
460
|
-
JSON.stringify({ ok: false, error: result.result.content }) +
|
|
461
|
-
"\n",
|
|
462
|
-
);
|
|
463
|
-
} else {
|
|
464
|
-
log.error(`Error: ${result.result.content}`);
|
|
465
|
-
}
|
|
466
|
-
process.exitCode = 1;
|
|
467
|
-
return;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
if (opts.json) {
|
|
471
|
-
process.stdout.write(
|
|
472
|
-
JSON.stringify({ ok: true, result: result.result }) + "\n",
|
|
473
|
-
);
|
|
474
|
-
} else {
|
|
475
|
-
log.info(JSON.stringify(result.result, null, 2));
|
|
476
|
-
}
|
|
477
|
-
},
|
|
478
|
-
);
|
|
479
|
-
|
|
480
|
-
// ── queue update ────────────────────────────────────────────────
|
|
481
|
-
|
|
482
|
-
queue
|
|
483
|
-
.command("update")
|
|
484
|
-
.description("Update work items in the queue")
|
|
485
|
-
.option(
|
|
486
|
-
"--work-item-id <id>",
|
|
487
|
-
"Work item ID to update -- run 'assistant task queue show' to find it.",
|
|
488
|
-
)
|
|
489
|
-
.option(
|
|
490
|
-
"--task-id <id>",
|
|
491
|
-
"Task template ID filter -- run 'assistant task list' to find it.",
|
|
492
|
-
)
|
|
493
|
-
.option(
|
|
494
|
-
"--task-name <name>",
|
|
495
|
-
"Task template name filter -- run 'assistant task list' to find it.",
|
|
496
|
-
)
|
|
497
|
-
.option("--title <title>", "New title for the work item.")
|
|
498
|
-
.option("--priority <tier>", "New priority tier (number).", parseInt)
|
|
499
|
-
.option("--notes <notes>", "New notes for the work item.")
|
|
500
|
-
.option("--status <status>", "New status for the work item.")
|
|
501
|
-
.option("--sort-index <n>", "New sort index (number).", parseInt)
|
|
502
|
-
.option(
|
|
503
|
-
"--filter-priority <tier>",
|
|
504
|
-
"Filter by priority tier (number).",
|
|
505
|
-
parseInt,
|
|
506
|
-
)
|
|
507
|
-
.option("--filter-status <status>", "Filter by status.")
|
|
508
|
-
.option(
|
|
509
|
-
"--created-order <n>",
|
|
510
|
-
"Filter by creation order (number).",
|
|
511
|
-
parseInt,
|
|
512
|
-
)
|
|
513
|
-
.option("--json", "Output result as machine-readable JSON.")
|
|
514
|
-
.addHelpText(
|
|
515
|
-
"after",
|
|
516
|
-
`
|
|
517
|
-
Updates one or more work items in the queue. Use --work-item-id to target
|
|
518
|
-
a specific item, or use filter options (--task-id, --task-name,
|
|
519
|
-
--filter-priority, --filter-status, --created-order) to match items.
|
|
520
|
-
|
|
521
|
-
Examples:
|
|
522
|
-
$ assistant task queue update --work-item-id wi_abc123 --status completed
|
|
523
|
-
$ assistant task queue update --task-name "Deploy" --priority 1
|
|
524
|
-
$ assistant task queue update --work-item-id wi_abc123 --title "New title" --json`,
|
|
525
|
-
)
|
|
526
|
-
.action(
|
|
527
|
-
async (opts: {
|
|
528
|
-
workItemId?: string;
|
|
529
|
-
taskId?: string;
|
|
530
|
-
taskName?: string;
|
|
531
|
-
title?: string;
|
|
532
|
-
priority?: number;
|
|
533
|
-
notes?: string;
|
|
534
|
-
status?: string;
|
|
535
|
-
sortIndex?: number;
|
|
536
|
-
filterPriority?: number;
|
|
537
|
-
filterStatus?: string;
|
|
538
|
-
createdOrder?: number;
|
|
539
|
-
json?: boolean;
|
|
540
|
-
}) => {
|
|
541
|
-
const params: Record<string, unknown> = {};
|
|
542
|
-
if (opts.workItemId) params.work_item_id = opts.workItemId;
|
|
543
|
-
if (opts.taskId) params.task_id = opts.taskId;
|
|
544
|
-
if (opts.taskName) params.task_name = opts.taskName;
|
|
545
|
-
if (opts.title) params.title = opts.title;
|
|
546
|
-
if (opts.priority !== undefined) params.priority_tier = opts.priority;
|
|
547
|
-
if (opts.notes) params.notes = opts.notes;
|
|
548
|
-
if (opts.status) params.status = opts.status;
|
|
549
|
-
if (opts.sortIndex !== undefined) params.sort_index = opts.sortIndex;
|
|
550
|
-
if (opts.filterPriority !== undefined)
|
|
551
|
-
params.filter_priority_tier = opts.filterPriority;
|
|
552
|
-
if (opts.filterStatus) params.filter_status = opts.filterStatus;
|
|
553
|
-
if (opts.createdOrder !== undefined)
|
|
554
|
-
params.created_order = opts.createdOrder;
|
|
555
|
-
|
|
556
|
-
const result = await cliIpcCall<{
|
|
557
|
-
content: string;
|
|
558
|
-
isError?: boolean;
|
|
559
|
-
}>("task_queue_update", { body: params });
|
|
560
|
-
|
|
561
|
-
if (!result.ok) {
|
|
562
|
-
if (opts.json) {
|
|
563
|
-
process.stdout.write(
|
|
564
|
-
JSON.stringify({ ok: false, error: result.error }) + "\n",
|
|
565
|
-
);
|
|
566
|
-
} else {
|
|
567
|
-
log.error(`Error: ${result.error}`);
|
|
568
|
-
}
|
|
569
|
-
process.exitCode = 1;
|
|
570
|
-
return;
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
if (result.result?.isError) {
|
|
574
|
-
if (opts.json) {
|
|
575
|
-
process.stdout.write(
|
|
576
|
-
JSON.stringify({ ok: false, error: result.result.content }) +
|
|
577
|
-
"\n",
|
|
578
|
-
);
|
|
579
|
-
} else {
|
|
580
|
-
log.error(`Error: ${result.result.content}`);
|
|
581
|
-
}
|
|
582
|
-
process.exitCode = 1;
|
|
583
|
-
return;
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
if (opts.json) {
|
|
587
|
-
process.stdout.write(
|
|
588
|
-
JSON.stringify({ ok: true, result: result.result }) + "\n",
|
|
589
|
-
);
|
|
590
|
-
} else {
|
|
591
|
-
log.info(JSON.stringify(result.result, null, 2));
|
|
592
|
-
}
|
|
593
|
-
},
|
|
594
|
-
);
|
|
595
|
-
|
|
596
|
-
// ── queue remove ────────────────────────────────────────────────
|
|
597
|
-
|
|
598
|
-
queue
|
|
599
|
-
.command("remove")
|
|
600
|
-
.description("Remove work items from the queue")
|
|
601
|
-
.option(
|
|
602
|
-
"--work-item-id <id>",
|
|
603
|
-
"Work item ID to remove -- run 'assistant task queue show' to find it.",
|
|
604
|
-
)
|
|
605
|
-
.option(
|
|
606
|
-
"--task-id <id>",
|
|
607
|
-
"Task template ID filter -- run 'assistant task list' to find it.",
|
|
608
|
-
)
|
|
609
|
-
.option(
|
|
610
|
-
"--task-name <name>",
|
|
611
|
-
"Task template name filter -- run 'assistant task list' to find it.",
|
|
612
|
-
)
|
|
613
|
-
.option("--title <title>", "Title filter.")
|
|
614
|
-
.option("--priority <tier>", "Priority tier filter (number).", parseInt)
|
|
615
|
-
.option("--status <status>", "Status filter.")
|
|
616
|
-
.option("--created-order <n>", "Creation order filter (number).", parseInt)
|
|
617
|
-
.option("--json", "Output result as machine-readable JSON.")
|
|
618
|
-
.addHelpText(
|
|
619
|
-
"after",
|
|
620
|
-
`
|
|
621
|
-
Removes one or more work items from the queue. Use --work-item-id to
|
|
622
|
-
target a specific item, or use filter options to match multiple items.
|
|
623
|
-
|
|
624
|
-
Examples:
|
|
625
|
-
$ assistant task queue remove --work-item-id wi_abc123
|
|
626
|
-
$ assistant task queue remove --task-name "Deploy" --status completed
|
|
627
|
-
$ assistant task queue remove --work-item-id wi_abc123 --json`,
|
|
628
|
-
)
|
|
629
|
-
.action(
|
|
630
|
-
async (opts: {
|
|
631
|
-
workItemId?: string;
|
|
632
|
-
taskId?: string;
|
|
633
|
-
taskName?: string;
|
|
634
|
-
title?: string;
|
|
635
|
-
priority?: number;
|
|
636
|
-
status?: string;
|
|
637
|
-
createdOrder?: number;
|
|
638
|
-
json?: boolean;
|
|
639
|
-
}) => {
|
|
640
|
-
const params: Record<string, unknown> = {};
|
|
641
|
-
if (opts.workItemId) params.work_item_id = opts.workItemId;
|
|
642
|
-
if (opts.taskId) params.task_id = opts.taskId;
|
|
643
|
-
if (opts.taskName) params.task_name = opts.taskName;
|
|
644
|
-
if (opts.title) params.title = opts.title;
|
|
645
|
-
if (opts.priority !== undefined) params.priority_tier = opts.priority;
|
|
646
|
-
if (opts.status) params.status = opts.status;
|
|
647
|
-
if (opts.createdOrder !== undefined)
|
|
648
|
-
params.created_order = opts.createdOrder;
|
|
649
|
-
|
|
650
|
-
const result = await cliIpcCall<{
|
|
651
|
-
content: string;
|
|
652
|
-
isError?: boolean;
|
|
653
|
-
}>("task_queue_remove", { body: params });
|
|
654
|
-
|
|
655
|
-
if (!result.ok) {
|
|
656
|
-
if (opts.json) {
|
|
657
|
-
process.stdout.write(
|
|
658
|
-
JSON.stringify({ ok: false, error: result.error }) + "\n",
|
|
659
|
-
);
|
|
660
|
-
} else {
|
|
661
|
-
log.error(`Error: ${result.error}`);
|
|
662
|
-
}
|
|
663
|
-
process.exitCode = 1;
|
|
664
|
-
return;
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
if (result.result?.isError) {
|
|
668
|
-
if (opts.json) {
|
|
669
|
-
process.stdout.write(
|
|
670
|
-
JSON.stringify({ ok: false, error: result.result.content }) +
|
|
671
|
-
"\n",
|
|
672
|
-
);
|
|
673
|
-
} else {
|
|
674
|
-
log.error(`Error: ${result.result.content}`);
|
|
675
|
-
}
|
|
676
|
-
process.exitCode = 1;
|
|
677
|
-
return;
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
if (opts.json) {
|
|
681
|
-
process.stdout.write(
|
|
682
|
-
JSON.stringify({ ok: true, result: result.result }) + "\n",
|
|
683
|
-
);
|
|
684
|
-
} else {
|
|
685
|
-
log.info(JSON.stringify(result.result, null, 2));
|
|
686
|
-
}
|
|
687
|
-
},
|
|
688
|
-
);
|
|
689
|
-
|
|
690
|
-
// ── queue run ───────────────────────────────────────────────────
|
|
691
|
-
|
|
692
|
-
queue
|
|
693
|
-
.command("run")
|
|
694
|
-
.description("Run the next work item from the queue")
|
|
695
|
-
.option(
|
|
696
|
-
"--work-item-id <id>",
|
|
697
|
-
"Specific work item ID to run -- run 'assistant task queue show' to find it.",
|
|
698
|
-
)
|
|
699
|
-
.option(
|
|
700
|
-
"--task-name <name>",
|
|
701
|
-
"Task template name filter -- run 'assistant task list' to find it.",
|
|
702
|
-
)
|
|
703
|
-
.option("--title <title>", "Title filter.")
|
|
704
|
-
.option("--json", "Output result as machine-readable JSON.")
|
|
705
|
-
.addHelpText(
|
|
706
|
-
"after",
|
|
707
|
-
`
|
|
708
|
-
Runs a work item from the queue. If --work-item-id is specified, runs
|
|
709
|
-
that specific item. Otherwise, selects the next eligible item based on
|
|
710
|
-
priority and sort order, optionally filtered by --task-name or --title.
|
|
711
|
-
|
|
712
|
-
Examples:
|
|
713
|
-
$ assistant task queue run
|
|
714
|
-
$ assistant task queue run --work-item-id wi_abc123
|
|
715
|
-
$ assistant task queue run --task-name "Deploy workflow"
|
|
716
|
-
$ assistant task queue run --json`,
|
|
717
|
-
)
|
|
718
|
-
.action(
|
|
719
|
-
async (opts: {
|
|
720
|
-
workItemId?: string;
|
|
721
|
-
taskName?: string;
|
|
722
|
-
title?: string;
|
|
723
|
-
json?: boolean;
|
|
724
|
-
}) => {
|
|
725
|
-
const params: Record<string, unknown> = {};
|
|
726
|
-
if (opts.workItemId) params.work_item_id = opts.workItemId;
|
|
727
|
-
if (opts.taskName) params.task_name = opts.taskName;
|
|
728
|
-
if (opts.title) params.title = opts.title;
|
|
729
|
-
|
|
730
|
-
const result = await cliIpcCall<{
|
|
731
|
-
content: string;
|
|
732
|
-
isError?: boolean;
|
|
733
|
-
}>("task_queue_run", { body: params });
|
|
734
|
-
|
|
735
|
-
if (!result.ok) {
|
|
736
|
-
if (opts.json) {
|
|
737
|
-
process.stdout.write(
|
|
738
|
-
JSON.stringify({ ok: false, error: result.error }) + "\n",
|
|
739
|
-
);
|
|
740
|
-
} else {
|
|
741
|
-
log.error(`Error: ${result.error}`);
|
|
742
|
-
}
|
|
743
|
-
process.exitCode = 1;
|
|
744
|
-
return;
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
if (result.result?.isError) {
|
|
748
|
-
if (opts.json) {
|
|
749
|
-
process.stdout.write(
|
|
750
|
-
JSON.stringify({ ok: false, error: result.result.content }) +
|
|
751
|
-
"\n",
|
|
752
|
-
);
|
|
753
|
-
} else {
|
|
754
|
-
log.error(`Error: ${result.result.content}`);
|
|
755
|
-
}
|
|
756
|
-
process.exitCode = 1;
|
|
757
|
-
return;
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
if (opts.json) {
|
|
761
|
-
process.stdout.write(
|
|
762
|
-
JSON.stringify({ ok: true, result: result.result }) + "\n",
|
|
763
|
-
);
|
|
764
|
-
} else {
|
|
765
|
-
log.info(JSON.stringify(result.result, null, 2));
|
|
766
|
-
}
|
|
767
|
-
},
|
|
768
|
-
);
|
|
769
|
-
},
|
|
770
|
-
});
|
|
771
|
-
}
|