@aria-cli/tools 1.0.9 → 1.0.11
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/package.json +9 -5
- package/src/__tests__/web-fetch-download.test.ts +0 -433
- package/src/__tests__/web-tools.test.ts +0 -619
- package/src/ask-user-interaction.ts +0 -33
- package/src/cache/web-cache.ts +0 -110
- package/src/definitions/arion.ts +0 -118
- package/src/definitions/browser/browser.ts +0 -502
- package/src/definitions/browser/index.ts +0 -5
- package/src/definitions/browser/pw-downloads.ts +0 -142
- package/src/definitions/browser/pw-interactions.ts +0 -282
- package/src/definitions/browser/pw-responses.ts +0 -98
- package/src/definitions/browser/pw-session.ts +0 -405
- package/src/definitions/browser/pw-shared.ts +0 -85
- package/src/definitions/browser/pw-snapshot.ts +0 -383
- package/src/definitions/browser/pw-state.ts +0 -101
- package/src/definitions/browser/types.ts +0 -203
- package/src/definitions/code-intelligence.ts +0 -526
- package/src/definitions/core.ts +0 -118
- package/src/definitions/delegation.ts +0 -567
- package/src/definitions/deploy.ts +0 -73
- package/src/definitions/filesystem.ts +0 -217
- package/src/definitions/frg.ts +0 -67
- package/src/definitions/index.ts +0 -28
- package/src/definitions/memory.ts +0 -150
- package/src/definitions/messaging.ts +0 -734
- package/src/definitions/meta.ts +0 -392
- package/src/definitions/network.ts +0 -179
- package/src/definitions/outlook.ts +0 -318
- package/src/definitions/patch/apply-patch.ts +0 -235
- package/src/definitions/patch/fuzzy-match.ts +0 -217
- package/src/definitions/patch/index.ts +0 -1
- package/src/definitions/patch/patch-parser.ts +0 -297
- package/src/definitions/patch/sandbox-paths.ts +0 -129
- package/src/definitions/process/index.ts +0 -5
- package/src/definitions/process/process-registry.ts +0 -303
- package/src/definitions/process/process.ts +0 -456
- package/src/definitions/process/pty-keys.ts +0 -298
- package/src/definitions/process/session-slug.ts +0 -147
- package/src/definitions/quip.ts +0 -225
- package/src/definitions/search.ts +0 -67
- package/src/definitions/session-history.ts +0 -79
- package/src/definitions/shell.ts +0 -202
- package/src/definitions/slack.ts +0 -211
- package/src/definitions/web.ts +0 -119
- package/src/executors/apply-patch.ts +0 -1035
- package/src/executors/arion.ts +0 -199
- package/src/executors/code-intelligence.ts +0 -1179
- package/src/executors/deploy.ts +0 -1066
- package/src/executors/filesystem.ts +0 -1428
- package/src/executors/frg-freshness.ts +0 -743
- package/src/executors/frg.ts +0 -394
- package/src/executors/index.ts +0 -280
- package/src/executors/learning-meta.ts +0 -1367
- package/src/executors/lsp-client.ts +0 -355
- package/src/executors/memory.ts +0 -978
- package/src/executors/meta.ts +0 -293
- package/src/executors/process-registry.ts +0 -570
- package/src/executors/pty-session-store.ts +0 -43
- package/src/executors/pty.ts +0 -342
- package/src/executors/restart.ts +0 -133
- package/src/executors/search-freshness.ts +0 -249
- package/src/executors/search-types.ts +0 -98
- package/src/executors/search.ts +0 -89
- package/src/executors/self-diagnose.ts +0 -552
- package/src/executors/session-history.ts +0 -435
- package/src/executors/shell-safety.ts +0 -519
- package/src/executors/shell.ts +0 -1243
- package/src/executors/utils.ts +0 -40
- package/src/executors/web.ts +0 -786
- package/src/extraction/content-extraction.ts +0 -281
- package/src/extraction/index.ts +0 -5
- package/src/headless-control-contract.ts +0 -1149
- package/src/index.ts +0 -788
- package/src/local-control-http-auth.ts +0 -2
- package/src/mcp/client.ts +0 -218
- package/src/mcp/connection.ts +0 -568
- package/src/mcp/index.ts +0 -11
- package/src/mcp/jsonrpc.ts +0 -195
- package/src/mcp/types.ts +0 -199
- package/src/network-control-adapter.ts +0 -88
- package/src/network-runtime/address-types.ts +0 -218
- package/src/network-runtime/db-owner-fencing.ts +0 -91
- package/src/network-runtime/delivery-receipts.ts +0 -372
- package/src/network-runtime/direct-endpoint-authority.ts +0 -35
- package/src/network-runtime/index.ts +0 -316
- package/src/network-runtime/local-control-contract.ts +0 -784
- package/src/network-runtime/node-store-contract.ts +0 -46
- package/src/network-runtime/pair-route-contract.ts +0 -97
- package/src/network-runtime/peer-capabilities.ts +0 -48
- package/src/network-runtime/peer-principal-ref.ts +0 -20
- package/src/network-runtime/peer-state-machine.ts +0 -160
- package/src/network-runtime/protocol-schemas.ts +0 -265
- package/src/network-runtime/runtime-bootstrap-contract.ts +0 -83
- package/src/outlook/desktop-session.ts +0 -409
- package/src/policy.ts +0 -171
- package/src/providers/brave.ts +0 -80
- package/src/providers/duckduckgo.ts +0 -199
- package/src/providers/exa.ts +0 -85
- package/src/providers/firecrawl.ts +0 -77
- package/src/providers/index.ts +0 -8
- package/src/providers/jina.ts +0 -70
- package/src/providers/router.ts +0 -121
- package/src/providers/search-provider.ts +0 -74
- package/src/providers/tavily.ts +0 -74
- package/src/quip/desktop-session.ts +0 -435
- package/src/registry/index.ts +0 -1
- package/src/registry/registry.ts +0 -905
- package/src/runtime-socket-local-control-client.ts +0 -632
- package/src/security/dns-normalization.ts +0 -34
- package/src/security/dns-pinning.ts +0 -138
- package/src/security/external-content.ts +0 -129
- package/src/security/ssrf.ts +0 -207
- package/src/slack/desktop-session.ts +0 -493
- package/src/tool-factory.ts +0 -91
- package/src/types.ts +0 -1341
- package/src/utils/retry.ts +0 -163
- package/src/utils/safe-parse-json.ts +0 -176
- package/src/utils/url.ts +0 -20
- package/tests/benchmarks/registry.bench.ts +0 -57
- package/tests/cache/web-cache.test.ts +0 -147
- package/tests/critical-integration.test.ts +0 -1465
- package/tests/definitions/apply-patch.test.ts +0 -586
- package/tests/definitions/browser.test.ts +0 -495
- package/tests/definitions/delegation-pause-resume.test.ts +0 -758
- package/tests/definitions/execution.test.ts +0 -671
- package/tests/definitions/messaging-inbox-scope.test.ts +0 -229
- package/tests/definitions/messaging.test.ts +0 -1468
- package/tests/definitions/outlook.test.ts +0 -30
- package/tests/definitions/process.test.ts +0 -469
- package/tests/definitions/slack.test.ts +0 -28
- package/tests/definitions/tool-inventory.test.ts +0 -218
- package/tests/e2e/delegation-quest-orchestration.e2e.test.ts +0 -433
- package/tests/e2e/memory-tool-discovery-contract.e2e.test.ts +0 -81
- package/tests/executors/apply-patch.test.ts +0 -538
- package/tests/executors/arion.test.ts +0 -309
- package/tests/executors/conversation-primitives.test.ts +0 -250
- package/tests/executors/deploy.test.ts +0 -746
- package/tests/executors/filesystem-tools.test.ts +0 -357
- package/tests/executors/filesystem.test.ts +0 -959
- package/tests/executors/frg-freshness.test.ts +0 -136
- package/tests/executors/frg-merge.test.ts +0 -70
- package/tests/executors/frg-session-content.test.ts +0 -40
- package/tests/executors/frg.test.ts +0 -56
- package/tests/executors/memory-bugfixes.test.ts +0 -257
- package/tests/executors/memory-real-memoria.integration.test.ts +0 -316
- package/tests/executors/memory.test.ts +0 -853
- package/tests/executors/meta-tools.test.ts +0 -411
- package/tests/executors/meta.test.ts +0 -683
- package/tests/executors/path-containment.test.ts +0 -51
- package/tests/executors/process-registry.test.ts +0 -505
- package/tests/executors/pty.test.ts +0 -664
- package/tests/executors/quest-security.test.ts +0 -249
- package/tests/executors/read-file-media.test.ts +0 -230
- package/tests/executors/recall-knowledge-schema.test.ts +0 -209
- package/tests/executors/recall-tags.test.ts +0 -278
- package/tests/executors/remember-null-safety.contract.test.ts +0 -41
- package/tests/executors/restart.test.ts +0 -67
- package/tests/executors/search-unified.test.ts +0 -381
- package/tests/executors/session-history.test.ts +0 -340
- package/tests/executors/session-transcript.test.ts +0 -561
- package/tests/executors/shell-abort.test.ts +0 -416
- package/tests/executors/shell-env-blocklist.test.ts +0 -648
- package/tests/executors/shell-env-process.test.ts +0 -245
- package/tests/executors/shell-process-registry.test.ts +0 -334
- package/tests/executors/shell-tools.test.ts +0 -393
- package/tests/executors/shell.test.ts +0 -690
- package/tests/executors/web-abort-vs-timeout.test.ts +0 -213
- package/tests/executors/web-integration.test.ts +0 -633
- package/tests/executors/web-symlink.test.ts +0 -18
- package/tests/executors/web.test.ts +0 -1400
- package/tests/executors/write-stdin.test.ts +0 -145
- package/tests/extraction/content-extraction.test.ts +0 -153
- package/tests/guards/tools-default-test-lane.integration.test.ts +0 -21
- package/tests/guards/tools-package-test-commands.e2e.test.ts +0 -43
- package/tests/guards/tools-test-lane-manifest.contract.test.ts +0 -76
- package/tests/guards/tools-vitest-workspace-alias.contract.test.ts +0 -63
- package/tests/helpers/async-waits.ts +0 -53
- package/tests/integration/headless-control-contract.integration.test.ts +0 -153
- package/tests/integration/memory-tool-schema-parity.integration.test.ts +0 -67
- package/tests/integration/meta-tools-round-trip.integration.test.ts +0 -506
- package/tests/integration/quest-round-trip.test.ts +0 -303
- package/tests/integration/registry-executor-flow.test.ts +0 -85
- package/tests/integration.test.ts +0 -177
- package/tests/loading-tier.test.ts +0 -126
- package/tests/mcp/client-reconnect.test.ts +0 -267
- package/tests/mcp/connection.test.ts +0 -846
- package/tests/mcp/injectable-logger.test.ts +0 -83
- package/tests/mcp/jsonrpc.test.ts +0 -109
- package/tests/mcp/lifecycle.test.ts +0 -879
- package/tests/network-runtime/address-types.contract.test.ts +0 -143
- package/tests/network-runtime/continuity-bind-schema.contract.test.ts +0 -203
- package/tests/network-runtime/local-control-contract.test.ts +0 -869
- package/tests/network-runtime/local-control-invite-token.contract.test.ts +0 -146
- package/tests/network-runtime/node-store-contract.test.ts +0 -11
- package/tests/network-runtime/pair-protocol-nodeid.contract.test.ts +0 -15
- package/tests/network-runtime/peer-state-machine.contract.test.ts +0 -148
- package/tests/network-runtime/protocol-schemas.contract.test.ts +0 -512
- package/tests/network-runtime/relay-pending-nodeid.contract.test.ts +0 -62
- package/tests/network-runtime/runtime-bootstrap-contract.test.ts +0 -227
- package/tests/network-runtime/runtime-socket-local-control-client.test.ts +0 -621
- package/tests/network-runtime/wait-for-message-script.test.ts +0 -288
- package/tests/parallel.test.ts +0 -71
- package/tests/policy.test.ts +0 -184
- package/tests/print-default-test-lane.ts +0 -14
- package/tests/print-test-lane-manifest.ts +0 -22
- package/tests/providers/brave.test.ts +0 -159
- package/tests/providers/duckduckgo.test.ts +0 -207
- package/tests/providers/exa.test.ts +0 -175
- package/tests/providers/firecrawl.test.ts +0 -168
- package/tests/providers/jina.test.ts +0 -144
- package/tests/providers/router.test.ts +0 -328
- package/tests/providers/tavily.test.ts +0 -165
- package/tests/registry/discovery.test.ts +0 -154
- package/tests/registry/injectable-logger.test.ts +0 -230
- package/tests/registry/input-validation.test.ts +0 -361
- package/tests/registry/interface-completeness.test.ts +0 -85
- package/tests/registry/mcp-integration.test.ts +0 -103
- package/tests/registry/mcp-read-only-hint.test.ts +0 -60
- package/tests/registry/memoria-discovery.test.ts +0 -390
- package/tests/registry/nested-validation.test.ts +0 -283
- package/tests/registry/pseudo-tool-filtering.test.ts +0 -258
- package/tests/registry/registration-lifecycle.test.ts +0 -133
- package/tests/registry-validation.test.ts +0 -424
- package/tests/registry.test.ts +0 -460
- package/tests/security/dns-pinning.test.ts +0 -162
- package/tests/security/external-content.test.ts +0 -144
- package/tests/security/ssrf.test.ts +0 -118
- package/tests/shell-safety-integration.test.ts +0 -32
- package/tests/shell-safety.test.ts +0 -365
- package/tests/slack/desktop-session.test.ts +0 -50
- package/tests/test-lane-manifest.ts +0 -440
- package/tests/test-utils.ts +0 -27
- package/tests/tool-factory.test.ts +0 -188
- package/tests/utils/retry.test.ts +0 -231
- package/tests/utils/url.test.ts +0 -63
- package/tsconfig.cjs.json +0 -24
- package/tsconfig.json +0 -12
- package/vitest.config.ts +0 -55
- package/vitest.e2e.config.ts +0 -24
- package/vitest.integration.config.ts +0 -24
- package/vitest.native.config.ts +0 -24
package/src/executors/meta.ts
DELETED
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @aria/tools - Meta tool executors
|
|
3
|
-
*
|
|
4
|
-
* Implementation of meta operations for ARIA tool system:
|
|
5
|
-
* - ask_user: Interactive user prompting with rate limiting
|
|
6
|
-
* - quest_update: Create/update quests persisted via QuestStore
|
|
7
|
-
* - quest_list: List quests with status filtering
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { nanoid } from "nanoid";
|
|
11
|
-
import type { ToolContext, ToolResult, QuestStoreStatus } from "../types.js";
|
|
12
|
-
import { success, fail, getErrorMessage } from "./utils.js";
|
|
13
|
-
|
|
14
|
-
// ============================================================================
|
|
15
|
-
// Ask User
|
|
16
|
-
// ============================================================================
|
|
17
|
-
|
|
18
|
-
export interface AskUserInput {
|
|
19
|
-
questions: Array<{ question: string; options?: string[] }>;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Module-level ask_user call counter for rate limiting.
|
|
24
|
-
* Reset via resetAskUserCounter() between turns (called by the runner).
|
|
25
|
-
*/
|
|
26
|
-
let askUserCallCount = 0;
|
|
27
|
-
const ASK_USER_MAX_CALLS = 3;
|
|
28
|
-
|
|
29
|
-
function isAskUserAnswersExhaustedError(error: unknown): error is Error & {
|
|
30
|
-
code: "ASK_USER_ANSWERS_EXHAUSTED";
|
|
31
|
-
questions?: Array<{ question: string; options?: string[] }>;
|
|
32
|
-
} {
|
|
33
|
-
if (!error || typeof error !== "object") return false;
|
|
34
|
-
const candidate = error as { code?: unknown; name?: unknown };
|
|
35
|
-
return (
|
|
36
|
-
candidate.code === "ASK_USER_ANSWERS_EXHAUSTED" ||
|
|
37
|
-
candidate.name === "AskUserAnswersExhaustedError"
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Reset the ask_user rate limit counter.
|
|
43
|
-
* Should be called by the runner at the start of each turn.
|
|
44
|
-
*/
|
|
45
|
-
export function resetAskUserCounter(): void {
|
|
46
|
-
askUserCallCount = 0;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Prompt the user with one or more questions.
|
|
51
|
-
* Rate-limited to ASK_USER_MAX_CALLS per turn to prevent abuse loops.
|
|
52
|
-
*/
|
|
53
|
-
export async function executeAskUser(input: AskUserInput, ctx: ToolContext): Promise<ToolResult> {
|
|
54
|
-
if (ctx.abortSignal?.aborted) return fail("Operation cancelled");
|
|
55
|
-
|
|
56
|
-
// Check if user interaction handler is wired
|
|
57
|
-
if (!ctx.userInteraction) {
|
|
58
|
-
return fail("ask_user not available in this context");
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Rate limit — prefer per-session counter from ToolContext, fall back to module-level global
|
|
62
|
-
const counter = ctx.askUserCallCounter ?? { count: askUserCallCount };
|
|
63
|
-
if (counter.count >= ASK_USER_MAX_CALLS) {
|
|
64
|
-
return fail(`Rate limit: max ${ASK_USER_MAX_CALLS} ask_user calls per turn`);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Validate input
|
|
68
|
-
if (!input.questions || !Array.isArray(input.questions) || input.questions.length === 0) {
|
|
69
|
-
return fail("questions array is required and must not be empty");
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
try {
|
|
73
|
-
const answers = await ctx.userInteraction.ask(input.questions);
|
|
74
|
-
// Only exhaustion retries are free. A completed prompt attempt, even if it
|
|
75
|
-
// fails for another reason, still burns the turn-local ask_user budget.
|
|
76
|
-
counter.count++;
|
|
77
|
-
if (!ctx.askUserCallCounter) askUserCallCount = counter.count;
|
|
78
|
-
return success(
|
|
79
|
-
`Received ${answers.length} answer${answers.length === 1 ? "" : "s"} from user`,
|
|
80
|
-
{ answers },
|
|
81
|
-
);
|
|
82
|
-
} catch (err) {
|
|
83
|
-
if (isAskUserAnswersExhaustedError(err)) {
|
|
84
|
-
throw err;
|
|
85
|
-
}
|
|
86
|
-
counter.count++;
|
|
87
|
-
if (!ctx.askUserCallCounter) askUserCallCount = counter.count;
|
|
88
|
-
return fail(getErrorMessage(err));
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// ============================================================================
|
|
93
|
-
// Quest Update
|
|
94
|
-
// ============================================================================
|
|
95
|
-
|
|
96
|
-
/** Valid quest statuses — used for runtime validation of LLM-provided values */
|
|
97
|
-
const VALID_STATUSES: Set<string> = new Set(["open", "active", "blocked", "done"]);
|
|
98
|
-
|
|
99
|
-
export interface QuestUpdateInput {
|
|
100
|
-
quests: Array<{
|
|
101
|
-
id?: string;
|
|
102
|
-
title?: string;
|
|
103
|
-
status?: QuestStoreStatus;
|
|
104
|
-
priority?: number;
|
|
105
|
-
blocked_by?: string;
|
|
106
|
-
notes?: string;
|
|
107
|
-
}>;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export interface QuestUpdateOutput {
|
|
111
|
-
quests: Array<{
|
|
112
|
-
id: string;
|
|
113
|
-
title: string;
|
|
114
|
-
status: string;
|
|
115
|
-
action: "created" | "updated" | "failed";
|
|
116
|
-
error?: string;
|
|
117
|
-
}>;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Create or update quests, persisted via QuestStore (structured SQL storage).
|
|
122
|
-
*
|
|
123
|
-
* New quests get a nanoid-generated ID. Existing quests (with `id`) are updated
|
|
124
|
-
* in-place via QuestStore.updateQuest().
|
|
125
|
-
*
|
|
126
|
-
* Each quest in the batch is processed independently — a failure on one quest
|
|
127
|
-
* does not prevent others from being processed.
|
|
128
|
-
*/
|
|
129
|
-
export async function executeQuestUpdate(
|
|
130
|
-
input: QuestUpdateInput,
|
|
131
|
-
ctx: ToolContext,
|
|
132
|
-
): Promise<ToolResult> {
|
|
133
|
-
if (ctx.abortSignal?.aborted) return fail("Operation cancelled");
|
|
134
|
-
|
|
135
|
-
if (!ctx.questStore) {
|
|
136
|
-
return fail("QuestStore is not available — quest persistence requires a database");
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (!input.quests || !Array.isArray(input.quests) || input.quests.length === 0) {
|
|
140
|
-
return fail("quests array is required and must not be empty");
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const results: QuestUpdateOutput["quests"] = [];
|
|
144
|
-
let failures = 0;
|
|
145
|
-
|
|
146
|
-
for (const quest of input.quests) {
|
|
147
|
-
// Runtime status validation — LLM may hallucinate invalid values
|
|
148
|
-
if (quest.status !== undefined && !VALID_STATUSES.has(quest.status)) {
|
|
149
|
-
results.push({
|
|
150
|
-
id: quest.id ?? "unknown",
|
|
151
|
-
title: quest.title ?? "(untitled)",
|
|
152
|
-
status: quest.status,
|
|
153
|
-
action: "failed",
|
|
154
|
-
error: `Invalid status "${quest.status}" — must be one of: open, active, blocked, done`,
|
|
155
|
-
});
|
|
156
|
-
failures++;
|
|
157
|
-
continue;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const isUpdate = !!quest.id;
|
|
161
|
-
const questId = quest.id ?? `quest_${nanoid(12)}`;
|
|
162
|
-
|
|
163
|
-
try {
|
|
164
|
-
if (isUpdate) {
|
|
165
|
-
// Update existing quest — only pass defined fields to avoid overwriting
|
|
166
|
-
const updates: Record<string, unknown> = {};
|
|
167
|
-
if (quest.title !== undefined) updates.title = quest.title;
|
|
168
|
-
if (quest.status !== undefined) updates.status = quest.status;
|
|
169
|
-
if (quest.notes !== undefined) updates.progress = quest.notes;
|
|
170
|
-
if (quest.priority !== undefined) updates.priority = quest.priority;
|
|
171
|
-
if (quest.blocked_by !== undefined) updates.blockedBy = quest.blocked_by;
|
|
172
|
-
const updated = ctx.questStore.updateQuest(questId, updates);
|
|
173
|
-
results.push({
|
|
174
|
-
id: questId,
|
|
175
|
-
title: updated.title,
|
|
176
|
-
status: updated.status,
|
|
177
|
-
action: "updated",
|
|
178
|
-
});
|
|
179
|
-
} else {
|
|
180
|
-
// Create new quest — title required, status defaults to "open"
|
|
181
|
-
if (!quest.title) {
|
|
182
|
-
results.push({
|
|
183
|
-
id: questId,
|
|
184
|
-
title: "(untitled)",
|
|
185
|
-
status: quest.status ?? "open",
|
|
186
|
-
action: "failed",
|
|
187
|
-
error: "title is required when creating a new quest",
|
|
188
|
-
});
|
|
189
|
-
failures++;
|
|
190
|
-
continue;
|
|
191
|
-
}
|
|
192
|
-
const created = ctx.questStore.createQuest({
|
|
193
|
-
id: questId,
|
|
194
|
-
title: quest.title,
|
|
195
|
-
status: quest.status ?? "open",
|
|
196
|
-
priority: quest.priority ?? 2,
|
|
197
|
-
progress: quest.notes,
|
|
198
|
-
blockedBy: quest.blocked_by,
|
|
199
|
-
});
|
|
200
|
-
results.push({
|
|
201
|
-
id: questId,
|
|
202
|
-
title: created.title,
|
|
203
|
-
status: created.status,
|
|
204
|
-
action: "created",
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
} catch (err) {
|
|
208
|
-
results.push({
|
|
209
|
-
id: questId,
|
|
210
|
-
title: quest.title ?? "(untitled)",
|
|
211
|
-
status: quest.status ?? "unknown",
|
|
212
|
-
action: "failed",
|
|
213
|
-
error: getErrorMessage(err),
|
|
214
|
-
});
|
|
215
|
-
failures++;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
const created = results.filter((r) => r.action === "created").length;
|
|
220
|
-
const updated = results.filter((r) => r.action === "updated").length;
|
|
221
|
-
const parts: string[] = [];
|
|
222
|
-
if (created > 0) parts.push(`${created} created`);
|
|
223
|
-
if (updated > 0) parts.push(`${updated} updated`);
|
|
224
|
-
if (failures > 0) parts.push(`${failures} failed`);
|
|
225
|
-
|
|
226
|
-
const data = { quests: results } satisfies QuestUpdateOutput;
|
|
227
|
-
|
|
228
|
-
if (failures > 0 && failures === input.quests.length) {
|
|
229
|
-
return fail(`All quests failed: ${parts.join(", ")}`, data);
|
|
230
|
-
}
|
|
231
|
-
if (failures > 0) {
|
|
232
|
-
return success(`Quests: ${parts.join(", ")} (partial failure)`, data);
|
|
233
|
-
}
|
|
234
|
-
return success(`Quests: ${parts.join(", ")}`, data);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// ============================================================================
|
|
238
|
-
// Quest List
|
|
239
|
-
// ============================================================================
|
|
240
|
-
|
|
241
|
-
export interface QuestListInput {
|
|
242
|
-
status?: "all" | QuestStoreStatus;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
export interface QuestListOutput {
|
|
246
|
-
quests: Array<{
|
|
247
|
-
id: string;
|
|
248
|
-
title: string;
|
|
249
|
-
status: string;
|
|
250
|
-
priority: number;
|
|
251
|
-
blocked_by: string;
|
|
252
|
-
notes: string;
|
|
253
|
-
updatedAt: number;
|
|
254
|
-
}>;
|
|
255
|
-
count: number;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* List quests from QuestStore with optional status filtering.
|
|
260
|
-
*/
|
|
261
|
-
export async function executeQuestList(
|
|
262
|
-
input: QuestListInput,
|
|
263
|
-
ctx: ToolContext,
|
|
264
|
-
): Promise<ToolResult> {
|
|
265
|
-
if (ctx.abortSignal?.aborted) return fail("Operation cancelled");
|
|
266
|
-
|
|
267
|
-
if (!ctx.questStore) {
|
|
268
|
-
return fail("QuestStore is not available — quest listing requires a database");
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
try {
|
|
272
|
-
const statusFilter = input.status ?? "all";
|
|
273
|
-
const filter = statusFilter !== "all" ? { status: statusFilter } : undefined;
|
|
274
|
-
const rawQuests = ctx.questStore.listQuests(filter);
|
|
275
|
-
|
|
276
|
-
const quests: QuestListOutput["quests"] = rawQuests.map((q) => ({
|
|
277
|
-
id: q.id,
|
|
278
|
-
title: q.title,
|
|
279
|
-
status: q.status,
|
|
280
|
-
priority: q.priority,
|
|
281
|
-
blocked_by: q.blockedBy ?? "",
|
|
282
|
-
notes: q.progress ?? "",
|
|
283
|
-
updatedAt: q.updatedAt,
|
|
284
|
-
}));
|
|
285
|
-
|
|
286
|
-
return success(`Found ${quests.length} quest${quests.length === 1 ? "" : "s"}`, {
|
|
287
|
-
quests,
|
|
288
|
-
count: quests.length,
|
|
289
|
-
} satisfies QuestListOutput);
|
|
290
|
-
} catch (err) {
|
|
291
|
-
return fail(getErrorMessage(err));
|
|
292
|
-
}
|
|
293
|
-
}
|