@ai-sdk/harness-grok-build 1.0.36 → 1.0.38
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/CHANGELOG.md +19 -0
- package/dist/index.d.ts +69 -29
- package/dist/index.js +249 -124
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/grok-build-harness.ts +4 -17
- package/src/grok-build-question-tool.ts +185 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @ai-sdk/harness-grok-build
|
|
2
2
|
|
|
3
|
+
## 1.0.38
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 951c54d: feat(harness): support `askUserQuestions` tool including support for normalization across harness adapters
|
|
8
|
+
- Updated dependencies [951c54d]
|
|
9
|
+
- @ai-sdk/harness-acp@1.0.39
|
|
10
|
+
- @ai-sdk/harness@1.0.101
|
|
11
|
+
|
|
12
|
+
## 1.0.37
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- 74d252a: fix(harness-acp): preserve terminal events replayed during ACP continuation startup
|
|
17
|
+
- Updated dependencies [74d252a]
|
|
18
|
+
- Updated dependencies [0c37bf0]
|
|
19
|
+
- @ai-sdk/harness-acp@1.0.38
|
|
20
|
+
- @ai-sdk/harness@1.0.100
|
|
21
|
+
|
|
3
22
|
## 1.0.36
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _ai_sdk_provider from '@ai-sdk/provider';
|
|
2
|
-
import * as _ai_sdk_provider_utils from '@ai-sdk/provider-utils';
|
|
3
2
|
import * as _ai_sdk_harness from '@ai-sdk/harness';
|
|
4
3
|
import { HarnessV1CredentialForwarding, HarnessV1PortEndpoint, HarnessV1, HarnessV1BuiltinTool } from '@ai-sdk/harness';
|
|
4
|
+
import * as _ai_sdk_provider_utils from '@ai-sdk/provider-utils';
|
|
5
5
|
import { ACPAuthenticationMode } from '@ai-sdk/harness-acp';
|
|
6
6
|
|
|
7
7
|
type GrokBuildAuthenticationMode = ACPAuthenticationMode;
|
|
@@ -54,6 +54,40 @@ type GrokBuildHarnessSettings = {
|
|
|
54
54
|
readonly mintBridgeToken?: (sandboxId: string) => string;
|
|
55
55
|
};
|
|
56
56
|
declare const GROK_BUILD_BUILTIN_TOOLS: {
|
|
57
|
+
readonly askUserQuestions: _ai_sdk_provider_utils.FunctionTool<{
|
|
58
|
+
allowPartialAnswers: boolean;
|
|
59
|
+
questions: {
|
|
60
|
+
id: string;
|
|
61
|
+
question: string;
|
|
62
|
+
header?: string | undefined;
|
|
63
|
+
options?: {
|
|
64
|
+
id: string;
|
|
65
|
+
label: string;
|
|
66
|
+
description?: string | undefined;
|
|
67
|
+
preview?: string | undefined;
|
|
68
|
+
}[] | undefined;
|
|
69
|
+
allowMultiple?: boolean | undefined;
|
|
70
|
+
allowFreeForm?: boolean | {
|
|
71
|
+
secret: boolean;
|
|
72
|
+
} | undefined;
|
|
73
|
+
}[];
|
|
74
|
+
}, {
|
|
75
|
+
action: "answered";
|
|
76
|
+
answers: Record<string, {
|
|
77
|
+
optionIds: string[];
|
|
78
|
+
freeform?: string | undefined;
|
|
79
|
+
}>;
|
|
80
|
+
} | {
|
|
81
|
+
action: "partially-answered";
|
|
82
|
+
answers: Record<string, {
|
|
83
|
+
optionIds: string[];
|
|
84
|
+
freeform?: string | undefined;
|
|
85
|
+
}>;
|
|
86
|
+
} | {
|
|
87
|
+
action: "declined";
|
|
88
|
+
} | {
|
|
89
|
+
action: "cancelled";
|
|
90
|
+
}>;
|
|
57
91
|
readonly bash: HarnessV1BuiltinTool<{
|
|
58
92
|
[x: string]: unknown;
|
|
59
93
|
command: string;
|
|
@@ -2265,20 +2299,6 @@ declare const GROK_BUILD_BUILTIN_TOOLS: {
|
|
|
2265
2299
|
readonly exit_plan_mode: _ai_sdk_provider_utils.Tool<{
|
|
2266
2300
|
[x: string]: unknown;
|
|
2267
2301
|
}, any, any>;
|
|
2268
|
-
readonly ask_user_question: _ai_sdk_provider_utils.Tool<{
|
|
2269
|
-
[x: string]: unknown;
|
|
2270
|
-
questions: {
|
|
2271
|
-
[x: string]: unknown;
|
|
2272
|
-
question: string;
|
|
2273
|
-
options: {
|
|
2274
|
-
[x: string]: unknown;
|
|
2275
|
-
label: string;
|
|
2276
|
-
description: string;
|
|
2277
|
-
preview?: string | null | undefined;
|
|
2278
|
-
}[];
|
|
2279
|
-
multi_select?: boolean | null | undefined;
|
|
2280
|
-
}[];
|
|
2281
|
-
}, any, any>;
|
|
2282
2302
|
readonly image_gen: _ai_sdk_provider_utils.Tool<{
|
|
2283
2303
|
[x: string]: unknown;
|
|
2284
2304
|
prompt: string;
|
|
@@ -2314,6 +2334,40 @@ declare const VERSION: string;
|
|
|
2314
2334
|
* Default Grok Build harness instance. Equivalent to `createGrokBuild()`.
|
|
2315
2335
|
*/
|
|
2316
2336
|
declare const grokBuild: _ai_sdk_harness.HarnessV1<{
|
|
2337
|
+
readonly askUserQuestions: _ai_sdk_provider_utils.FunctionTool<{
|
|
2338
|
+
allowPartialAnswers: boolean;
|
|
2339
|
+
questions: {
|
|
2340
|
+
id: string;
|
|
2341
|
+
question: string;
|
|
2342
|
+
header?: string | undefined;
|
|
2343
|
+
options?: {
|
|
2344
|
+
id: string;
|
|
2345
|
+
label: string;
|
|
2346
|
+
description?: string | undefined;
|
|
2347
|
+
preview?: string | undefined;
|
|
2348
|
+
}[] | undefined;
|
|
2349
|
+
allowMultiple?: boolean | undefined;
|
|
2350
|
+
allowFreeForm?: boolean | {
|
|
2351
|
+
secret: boolean;
|
|
2352
|
+
} | undefined;
|
|
2353
|
+
}[];
|
|
2354
|
+
}, {
|
|
2355
|
+
action: "answered";
|
|
2356
|
+
answers: Record<string, {
|
|
2357
|
+
optionIds: string[];
|
|
2358
|
+
freeform?: string | undefined;
|
|
2359
|
+
}>;
|
|
2360
|
+
} | {
|
|
2361
|
+
action: "partially-answered";
|
|
2362
|
+
answers: Record<string, {
|
|
2363
|
+
optionIds: string[];
|
|
2364
|
+
freeform?: string | undefined;
|
|
2365
|
+
}>;
|
|
2366
|
+
} | {
|
|
2367
|
+
action: "declined";
|
|
2368
|
+
} | {
|
|
2369
|
+
action: "cancelled";
|
|
2370
|
+
}>;
|
|
2317
2371
|
readonly bash: _ai_sdk_harness.HarnessV1BuiltinTool<{
|
|
2318
2372
|
[x: string]: unknown;
|
|
2319
2373
|
command: string;
|
|
@@ -4525,20 +4579,6 @@ declare const grokBuild: _ai_sdk_harness.HarnessV1<{
|
|
|
4525
4579
|
readonly exit_plan_mode: _ai_sdk_provider_utils.Tool<{
|
|
4526
4580
|
[x: string]: unknown;
|
|
4527
4581
|
}, any, any>;
|
|
4528
|
-
readonly ask_user_question: _ai_sdk_provider_utils.Tool<{
|
|
4529
|
-
[x: string]: unknown;
|
|
4530
|
-
questions: {
|
|
4531
|
-
[x: string]: unknown;
|
|
4532
|
-
question: string;
|
|
4533
|
-
options: {
|
|
4534
|
-
[x: string]: unknown;
|
|
4535
|
-
label: string;
|
|
4536
|
-
description: string;
|
|
4537
|
-
preview?: string | null | undefined;
|
|
4538
|
-
}[];
|
|
4539
|
-
multi_select?: boolean | null | undefined;
|
|
4540
|
-
}[];
|
|
4541
|
-
}, any, any>;
|
|
4542
4582
|
readonly image_gen: _ai_sdk_provider_utils.Tool<{
|
|
4543
4583
|
[x: string]: unknown;
|
|
4544
4584
|
prompt: string;
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,154 @@
|
|
|
1
1
|
// src/grok-build-harness.ts
|
|
2
2
|
import {
|
|
3
|
+
HARNESS_V1_BUILTIN_TOOLS,
|
|
3
4
|
commonTool
|
|
4
5
|
} from "@ai-sdk/harness";
|
|
5
6
|
import { createCredentialRequestTransformation } from "@ai-sdk/harness/utils";
|
|
6
7
|
import { createACP } from "@ai-sdk/harness-acp";
|
|
7
8
|
import { tool } from "@ai-sdk/provider-utils";
|
|
8
|
-
import { z } from "zod/v4";
|
|
9
|
+
import { z as z2 } from "zod/v4";
|
|
9
10
|
|
|
10
11
|
// src/version.ts
|
|
11
|
-
var VERSION = true ? "1.0.
|
|
12
|
+
var VERSION = true ? "1.0.38" : "0.0.0-test";
|
|
13
|
+
|
|
14
|
+
// src/grok-build-question-tool.ts
|
|
15
|
+
import {
|
|
16
|
+
harnessV1QuestionsToolOutputSchema
|
|
17
|
+
} from "@ai-sdk/harness";
|
|
18
|
+
import { z } from "zod/v4";
|
|
19
|
+
var grokBuildQuestionRequestSchema = z.object({
|
|
20
|
+
sessionId: z.string(),
|
|
21
|
+
toolCallId: z.string(),
|
|
22
|
+
questions: z.array(
|
|
23
|
+
z.object({
|
|
24
|
+
question: z.string(),
|
|
25
|
+
options: z.array(
|
|
26
|
+
z.object({
|
|
27
|
+
label: z.string(),
|
|
28
|
+
description: z.string(),
|
|
29
|
+
preview: z.string().nullable().optional()
|
|
30
|
+
})
|
|
31
|
+
),
|
|
32
|
+
multi_select: z.boolean().nullable().optional()
|
|
33
|
+
})
|
|
34
|
+
),
|
|
35
|
+
mode: z.enum(["default", "plan"])
|
|
36
|
+
});
|
|
37
|
+
var grokBuildAskUserQuestions = {
|
|
38
|
+
requestMethod: "_x.ai/ask_user_question",
|
|
39
|
+
fromNativeRequest: ({ nativeRequest }) => {
|
|
40
|
+
const parsed = grokBuildQuestionRequestSchema.safeParse(nativeRequest);
|
|
41
|
+
if (!parsed.success) return null;
|
|
42
|
+
return {
|
|
43
|
+
type: "tool-call",
|
|
44
|
+
toolCallId: parsed.data.toolCallId,
|
|
45
|
+
toolName: "askUserQuestions",
|
|
46
|
+
nativeName: "ask_user_question",
|
|
47
|
+
input: JSON.stringify(toHarnessQuestionsInput(parsed.data)),
|
|
48
|
+
providerExecuted: false
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
toNativeResponse: ({ nativeRequest, toolResult }) => {
|
|
52
|
+
const request = grokBuildQuestionRequestSchema.parse(nativeRequest);
|
|
53
|
+
const output = parseQuestionsOutput(toolResult);
|
|
54
|
+
if (output.action === "cancelled") {
|
|
55
|
+
return { outcome: "cancelled" };
|
|
56
|
+
}
|
|
57
|
+
const nativeAnswers = output.action === "declined" ? { answers: {}, annotations: {} } : toNativeAnswers({ request, output });
|
|
58
|
+
const requestedOutcome = toolResult.providerOptions?.["grok-build"]?.outcome;
|
|
59
|
+
if (requestedOutcome === "chat_about_this" || requestedOutcome === "skip_interview") {
|
|
60
|
+
return {
|
|
61
|
+
outcome: requestedOutcome,
|
|
62
|
+
partial_answers: Object.fromEntries(
|
|
63
|
+
Object.entries(nativeAnswers.answers).map(([question, answers]) => [
|
|
64
|
+
question,
|
|
65
|
+
answers.join(", ")
|
|
66
|
+
])
|
|
67
|
+
)
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
if (output.action === "declined") {
|
|
71
|
+
return { outcome: "skip_interview", partial_answers: {} };
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
outcome: "accepted",
|
|
75
|
+
answers: nativeAnswers.answers,
|
|
76
|
+
...Object.keys(nativeAnswers.annotations).length === 0 ? {} : { annotations: nativeAnswers.annotations }
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
matchesNativeRequest: ({ previousNativeRequest, nativeRequest }) => {
|
|
80
|
+
const previous = grokBuildQuestionRequestSchema.safeParse(
|
|
81
|
+
previousNativeRequest
|
|
82
|
+
);
|
|
83
|
+
const current = grokBuildQuestionRequestSchema.safeParse(nativeRequest);
|
|
84
|
+
return previous.success && current.success && questionFingerprint(previous.data) === questionFingerprint(current.data);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
function toHarnessQuestionsInput(request) {
|
|
88
|
+
return {
|
|
89
|
+
allowPartialAnswers: true,
|
|
90
|
+
questions: request.questions.map((question, questionIndex) => ({
|
|
91
|
+
id: questionId(questionIndex),
|
|
92
|
+
question: question.question,
|
|
93
|
+
options: question.options.map((option, optionIndex) => ({
|
|
94
|
+
id: optionId(optionIndex),
|
|
95
|
+
label: option.label,
|
|
96
|
+
description: option.description,
|
|
97
|
+
...option.preview == null ? {} : { preview: option.preview }
|
|
98
|
+
})),
|
|
99
|
+
...question.multi_select == null ? {} : { allowMultiple: question.multi_select },
|
|
100
|
+
allowFreeForm: true
|
|
101
|
+
}))
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function toNativeAnswers({
|
|
105
|
+
request,
|
|
106
|
+
output
|
|
107
|
+
}) {
|
|
108
|
+
const answers = {};
|
|
109
|
+
const annotations = {};
|
|
110
|
+
request.questions.forEach((question, questionIndex) => {
|
|
111
|
+
const answer = output.answers[questionId(questionIndex)];
|
|
112
|
+
if (answer == null) return;
|
|
113
|
+
const labels = answer.optionIds.flatMap((id) => {
|
|
114
|
+
const optionIndex = positionalIdIndex({ id, prefix: "option-" });
|
|
115
|
+
const option = optionIndex == null ? void 0 : question.options[optionIndex];
|
|
116
|
+
return option == null ? [] : [option.label];
|
|
117
|
+
});
|
|
118
|
+
if (answer.freeform != null) {
|
|
119
|
+
labels.push("Other");
|
|
120
|
+
annotations[question.question] = { notes: answer.freeform };
|
|
121
|
+
}
|
|
122
|
+
answers[question.question] = labels;
|
|
123
|
+
});
|
|
124
|
+
return { answers, annotations };
|
|
125
|
+
}
|
|
126
|
+
function parseQuestionsOutput(toolResult) {
|
|
127
|
+
if (toolResult.output.type !== "json" && toolResult.output.type !== "error-json") {
|
|
128
|
+
throw new Error("Grok Build askUserQuestions requires a JSON tool result.");
|
|
129
|
+
}
|
|
130
|
+
return harnessV1QuestionsToolOutputSchema.parse(toolResult.output.value);
|
|
131
|
+
}
|
|
132
|
+
function questionId(index) {
|
|
133
|
+
return `question-${index + 1}`;
|
|
134
|
+
}
|
|
135
|
+
function optionId(index) {
|
|
136
|
+
return `option-${index + 1}`;
|
|
137
|
+
}
|
|
138
|
+
function positionalIdIndex({
|
|
139
|
+
id,
|
|
140
|
+
prefix
|
|
141
|
+
}) {
|
|
142
|
+
if (!id.startsWith(prefix)) return void 0;
|
|
143
|
+
const index = Number(id.slice(prefix.length)) - 1;
|
|
144
|
+
return Number.isInteger(index) && index >= 0 ? index : void 0;
|
|
145
|
+
}
|
|
146
|
+
function questionFingerprint(request) {
|
|
147
|
+
return JSON.stringify({
|
|
148
|
+
questions: request.questions,
|
|
149
|
+
mode: request.mode
|
|
150
|
+
});
|
|
151
|
+
}
|
|
12
152
|
|
|
13
153
|
// src/grok-build-harness.ts
|
|
14
154
|
var GROK_BUILD_CLIENT_APP = `ai-sdk/harness-grok-build/${VERSION}`;
|
|
@@ -16,215 +156,199 @@ var GROK_BUILD_IMPLEMENTATION_PACKAGE_JSON = '{\n "name": "harness-grok-build-b
|
|
|
16
156
|
var GROK_BUILD_IMPLEMENTATION_PNPM_LOCK = "lockfileVersion: '9.0'\n\nsettings:\n autoInstallPeers: true\n excludeLinksFromLockfile: false\n\nimporters:\n\n .:\n dependencies:\n '@agentclientprotocol/sdk':\n specifier: 1.4.0\n version: 1.4.0(zod@4.4.3)\n '@modelcontextprotocol/sdk':\n specifier: 1.30.0\n version: 1.30.0(zod@4.4.3)\n '@xai-official/grok':\n specifier: 1.0.5\n version: 1.0.5\n ws:\n specifier: 8.21.0\n version: 8.21.0\n zod:\n specifier: 4.4.3\n version: 4.4.3\n\npackages:\n\n '@agentclientprotocol/sdk@1.4.0':\n resolution: {integrity: sha512-/eufudw+aFY1LKLolT6yFE6UMmYRl7fMJ/DEONSIyR6wI3slHWITBsANRGqXEY8FRzqUxwh7QEaGiZHcJPVThg==}\n peerDependencies:\n zod: ^3.25.0 || ^4.0.0\n\n '@hono/node-server@2.1.1':\n resolution: {integrity: sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==}\n engines: {node: '>=20'}\n peerDependencies:\n hono: ^4\n\n '@iarna/toml@3.0.0':\n resolution: {integrity: sha512-td6ZUkz2oS3VeleBcN+m//Q6HlCFCPrnI0FZhrt/h4XqLEdOyYp2u21nd8MdsR+WJy5r9PTDaHTDDfhf4H4l6Q==}\n\n '@modelcontextprotocol/sdk@1.30.0':\n resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==}\n engines: {node: '>=18'}\n peerDependencies:\n '@cfworker/json-schema': ^4.1.1\n zod: ^3.25 || ^4.0\n peerDependenciesMeta:\n '@cfworker/json-schema':\n optional: true\n\n '@xai-official/grok-darwin-arm64@1.0.5':\n resolution: {integrity: sha512-akEtE93V7nOHEMfj16kkl3Nxl/AjcNaRkZCnY5HoIayy3VR6qQ6VTsQdUka4ZgT1bGJCZff4UIcTVpFGDaMAQQ==}\n cpu: [arm64]\n os: [darwin]\n\n '@xai-official/grok-darwin-x64@1.0.5':\n resolution: {integrity: sha512-kIr1YUidX+Zl8Ti7qFBCmQyVzR/D779Q0/pNvCBo7enLObFaGiM7JUAuQ7Y23aaIC/m1rwPv7xzoQ3DGHOO1yA==}\n cpu: [x64]\n os: [darwin]\n\n '@xai-official/grok-linux-arm64@1.0.5':\n resolution: {integrity: sha512-yPdBddzfqBNfmyKGEuy0Vy+8zr/0I9xTqX9aYzaaz5QUS3+3Xe3bIJ2EYbAZV6o/16WUC2ZbkLNUx3X3IkBSRA==}\n cpu: [arm64]\n os: [linux]\n\n '@xai-official/grok-linux-x64@1.0.5':\n resolution: {integrity: sha512-JJ6ajCCdBeLc14jvcGKQmeOvoJdEvWMe2Bj82McNikup1d6QaX/E7MI7nmMmoHfQthqRfUSnFk/ExFRu4fodTw==}\n cpu: [x64]\n os: [linux]\n\n '@xai-official/grok-win32-arm64@1.0.5':\n resolution: {integrity: sha512-B4cIPElA8KWpOX2fvIxFeb8U5Ifwal56ZNKtvqPgatflLMf9Quo+3KnBUXH7X8/Ohwe81ff8G+mcU6Ja6Z5RKQ==}\n cpu: [arm64]\n os: [win32]\n\n '@xai-official/grok-win32-x64@1.0.5':\n resolution: {integrity: sha512-EqPxlKg5FMFymmnF+w58VQ8V+ZrghIp7Qsuc2VCurIY82H+6qvnAMgJXGCpo2qH6JSWfh0HPiHkmTk32kHstjw==}\n cpu: [x64]\n os: [win32]\n\n '@xai-official/grok@1.0.5':\n resolution: {integrity: sha512-kk5hez+Oz5CvWonDGkMNmL483CWRIGRF2ki8jQzpIXH56P0fhCgaX9lrr0IUoFCKh/rYAm5vfCPgQsdIIYLu8Q==}\n engines: {node: '>=20'}\n cpu: [arm64, x64]\n os: [darwin, linux, win32]\n hasBin: true\n\n accepts@2.0.0:\n resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}\n engines: {node: '>= 0.6'}\n\n ajv-formats@3.0.1:\n resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}\n peerDependencies:\n ajv: ^8.0.0\n peerDependenciesMeta:\n ajv:\n optional: true\n\n ajv@8.20.0:\n resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}\n\n body-parser@2.3.0:\n resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==}\n engines: {node: '>=18'}\n\n bytes@3.1.2:\n resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}\n engines: {node: '>= 0.8'}\n\n call-bind-apply-helpers@1.0.2:\n resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}\n engines: {node: '>= 0.4'}\n\n call-bound@1.0.4:\n resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}\n engines: {node: '>= 0.4'}\n\n content-disposition@1.1.0:\n resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==}\n engines: {node: '>=18'}\n\n content-type@1.0.5:\n resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}\n engines: {node: '>= 0.6'}\n\n content-type@2.1.0:\n resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==}\n engines: {node: '>=18'}\n\n cookie-signature@1.2.2:\n resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}\n engines: {node: '>=6.6.0'}\n\n cookie@0.7.2:\n resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}\n engines: {node: '>= 0.6'}\n\n cors@2.8.6:\n resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}\n engines: {node: '>= 0.10'}\n\n cross-spawn@7.0.6:\n resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}\n engines: {node: '>= 8'}\n\n debug@4.4.3:\n resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}\n engines: {node: '>=6.0'}\n peerDependencies:\n supports-color: '*'\n peerDependenciesMeta:\n supports-color:\n optional: true\n\n depd@2.0.0:\n resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}\n engines: {node: '>= 0.8'}\n\n dunder-proto@1.0.1:\n resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}\n engines: {node: '>= 0.4'}\n\n ee-first@1.1.1:\n resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}\n\n encodeurl@2.0.0:\n resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}\n engines: {node: '>= 0.8'}\n\n es-define-property@1.0.1:\n resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}\n engines: {node: '>= 0.4'}\n\n es-errors@1.3.0:\n resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}\n engines: {node: '>= 0.4'}\n\n es-object-atoms@1.1.2:\n resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}\n engines: {node: '>= 0.4'}\n\n escape-html@1.0.3:\n resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}\n\n etag@1.8.1:\n resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}\n engines: {node: '>= 0.6'}\n\n eventsource-parser@3.1.1:\n resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==}\n engines: {node: '>=18.0.0'}\n\n eventsource@3.0.7:\n resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}\n engines: {node: '>=18.0.0'}\n\n express-rate-limit@8.6.2:\n resolution: {integrity: sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==}\n engines: {node: '>= 16'}\n peerDependencies:\n express: '>= 4.11'\n\n express@5.2.1:\n resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}\n engines: {node: '>= 18'}\n\n fast-deep-equal@3.1.3:\n resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}\n\n fast-uri@3.1.6:\n resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==}\n\n finalhandler@2.1.1:\n resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==}\n engines: {node: '>= 18.0.0'}\n\n forwarded@0.2.0:\n resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}\n engines: {node: '>= 0.6'}\n\n fresh@2.0.0:\n resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}\n engines: {node: '>= 0.8'}\n\n function-bind@1.1.2:\n resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}\n\n get-intrinsic@1.3.0:\n resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}\n engines: {node: '>= 0.4'}\n\n get-proto@1.0.1:\n resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}\n engines: {node: '>= 0.4'}\n\n gopd@1.2.0:\n resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}\n engines: {node: '>= 0.4'}\n\n has-symbols@1.1.0:\n resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}\n engines: {node: '>= 0.4'}\n\n hasown@2.0.4:\n resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}\n engines: {node: '>= 0.4'}\n\n hono@4.13.4:\n resolution: {integrity: sha512-AGEwKIyRMHRv1t8Wjwa3LHxQ61X5CqrdFT+4BRNTpqS5aJNnpl5WLjADb7vFlJzI/8uK7T5QLVApCMQKNa3LgQ==}\n engines: {node: '>=16.9.0'}\n\n http-errors@2.0.1:\n resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}\n engines: {node: '>= 0.8'}\n\n iconv-lite@0.7.3:\n resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==}\n engines: {node: '>=0.10.0'}\n\n inherits@2.0.4:\n resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}\n\n ip-address@10.5.0:\n resolution: {integrity: sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==}\n engines: {node: '>= 12'}\n\n ipaddr.js@1.9.1:\n resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}\n engines: {node: '>= 0.10'}\n\n is-promise@4.0.0:\n resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}\n\n isexe@2.0.0:\n resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}\n\n jose@6.2.10:\n resolution: {integrity: sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==}\n\n json-schema-traverse@1.0.0:\n resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}\n\n json-schema-typed@8.0.2:\n resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==}\n\n math-intrinsics@1.1.0:\n resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}\n engines: {node: '>= 0.4'}\n\n media-typer@1.1.1:\n resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==}\n engines: {node: '>= 0.8'}\n\n merge-descriptors@2.0.0:\n resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}\n engines: {node: '>=18'}\n\n mime-db@1.54.0:\n resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}\n engines: {node: '>= 0.6'}\n\n mime-types@3.0.2:\n resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}\n engines: {node: '>=18'}\n\n ms@2.1.3:\n resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}\n\n negotiator@1.1.0:\n resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==}\n engines: {node: '>=18'}\n\n object-assign@4.1.1:\n resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}\n engines: {node: '>=0.10.0'}\n\n object-inspect@1.13.4:\n resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}\n engines: {node: '>= 0.4'}\n\n on-finished@2.4.1:\n resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}\n engines: {node: '>= 0.8'}\n\n once@1.4.0:\n resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}\n\n parseurl@1.3.3:\n resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}\n engines: {node: '>= 0.8'}\n\n path-key@3.1.1:\n resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}\n engines: {node: '>=8'}\n\n path-to-regexp@8.4.2:\n resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}\n\n pkce-challenge@5.0.1:\n resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==}\n engines: {node: '>=16.20.0'}\n\n proxy-addr@2.0.7:\n resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}\n engines: {node: '>= 0.10'}\n\n qs@6.15.3:\n resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==}\n engines: {node: '>=0.6'}\n\n range-parser@1.3.0:\n resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==}\n engines: {node: '>= 0.6'}\n\n raw-body@3.0.2:\n resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}\n engines: {node: '>= 0.10'}\n\n require-from-string@2.0.2:\n resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}\n engines: {node: '>=0.10.0'}\n\n router@2.2.0:\n resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}\n engines: {node: '>= 18'}\n\n safer-buffer@2.1.2:\n resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}\n\n send@1.2.1:\n resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}\n engines: {node: '>= 18'}\n\n serve-static@2.2.1:\n resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}\n engines: {node: '>= 18'}\n\n setprototypeof@1.2.0:\n resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}\n\n shebang-command@2.0.0:\n resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}\n engines: {node: '>=8'}\n\n shebang-regex@3.0.0:\n resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}\n engines: {node: '>=8'}\n\n side-channel-list@1.0.1:\n resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}\n engines: {node: '>= 0.4'}\n\n side-channel-map@1.0.1:\n resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}\n engines: {node: '>= 0.4'}\n\n side-channel-weakmap@1.0.2:\n resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}\n engines: {node: '>= 0.4'}\n\n side-channel@1.1.1:\n resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}\n engines: {node: '>= 0.4'}\n\n statuses@2.0.2:\n resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}\n engines: {node: '>= 0.8'}\n\n toidentifier@1.0.1:\n resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}\n engines: {node: '>=0.6'}\n\n type-is@2.1.0:\n resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==}\n engines: {node: '>= 18'}\n\n unpipe@1.0.0:\n resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}\n engines: {node: '>= 0.8'}\n\n vary@1.1.2:\n resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}\n engines: {node: '>= 0.8'}\n\n which@2.0.2:\n resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}\n engines: {node: '>= 8'}\n hasBin: true\n\n wrappy@1.0.2:\n resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}\n\n ws@8.21.0:\n resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==}\n engines: {node: '>=10.0.0'}\n peerDependencies:\n bufferutil: ^4.0.1\n utf-8-validate: '>=5.0.2'\n peerDependenciesMeta:\n bufferutil:\n optional: true\n utf-8-validate:\n optional: true\n\n zod-to-json-schema@3.25.2:\n resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==}\n peerDependencies:\n zod: ^3.25.28 || ^4\n\n zod@4.4.3:\n resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}\n\nsnapshots:\n\n '@agentclientprotocol/sdk@1.4.0(zod@4.4.3)':\n dependencies:\n zod: 4.4.3\n\n '@hono/node-server@2.1.1(hono@4.13.4)':\n dependencies:\n hono: 4.13.4\n\n '@iarna/toml@3.0.0': {}\n\n '@modelcontextprotocol/sdk@1.30.0(zod@4.4.3)':\n dependencies:\n '@hono/node-server': 2.1.1(hono@4.13.4)\n ajv: 8.20.0\n ajv-formats: 3.0.1(ajv@8.20.0)\n content-type: 1.0.5\n cors: 2.8.6\n cross-spawn: 7.0.6\n eventsource: 3.0.7\n eventsource-parser: 3.1.1\n express: 5.2.1\n express-rate-limit: 8.6.2(express@5.2.1)\n hono: 4.13.4\n jose: 6.2.10\n json-schema-typed: 8.0.2\n pkce-challenge: 5.0.1\n raw-body: 3.0.2\n zod: 4.4.3\n zod-to-json-schema: 3.25.2(zod@4.4.3)\n transitivePeerDependencies:\n - supports-color\n\n '@xai-official/grok-darwin-arm64@1.0.5':\n optional: true\n\n '@xai-official/grok-darwin-x64@1.0.5':\n optional: true\n\n '@xai-official/grok-linux-arm64@1.0.5':\n optional: true\n\n '@xai-official/grok-linux-x64@1.0.5':\n optional: true\n\n '@xai-official/grok-win32-arm64@1.0.5':\n optional: true\n\n '@xai-official/grok-win32-x64@1.0.5':\n optional: true\n\n '@xai-official/grok@1.0.5':\n dependencies:\n '@iarna/toml': 3.0.0\n optionalDependencies:\n '@xai-official/grok-darwin-arm64': 1.0.5\n '@xai-official/grok-darwin-x64': 1.0.5\n '@xai-official/grok-linux-arm64': 1.0.5\n '@xai-official/grok-linux-x64': 1.0.5\n '@xai-official/grok-win32-arm64': 1.0.5\n '@xai-official/grok-win32-x64': 1.0.5\n\n accepts@2.0.0:\n dependencies:\n mime-types: 3.0.2\n negotiator: 1.1.0\n\n ajv-formats@3.0.1(ajv@8.20.0):\n optionalDependencies:\n ajv: 8.20.0\n\n ajv@8.20.0:\n dependencies:\n fast-deep-equal: 3.1.3\n fast-uri: 3.1.6\n json-schema-traverse: 1.0.0\n require-from-string: 2.0.2\n\n body-parser@2.3.0:\n dependencies:\n bytes: 3.1.2\n content-type: 2.1.0\n debug: 4.4.3\n http-errors: 2.0.1\n iconv-lite: 0.7.3\n on-finished: 2.4.1\n qs: 6.15.3\n raw-body: 3.0.2\n type-is: 2.1.0\n transitivePeerDependencies:\n - supports-color\n\n bytes@3.1.2: {}\n\n call-bind-apply-helpers@1.0.2:\n dependencies:\n es-errors: 1.3.0\n function-bind: 1.1.2\n\n call-bound@1.0.4:\n dependencies:\n call-bind-apply-helpers: 1.0.2\n get-intrinsic: 1.3.0\n\n content-disposition@1.1.0: {}\n\n content-type@1.0.5: {}\n\n content-type@2.1.0: {}\n\n cookie-signature@1.2.2: {}\n\n cookie@0.7.2: {}\n\n cors@2.8.6:\n dependencies:\n object-assign: 4.1.1\n vary: 1.1.2\n\n cross-spawn@7.0.6:\n dependencies:\n path-key: 3.1.1\n shebang-command: 2.0.0\n which: 2.0.2\n\n debug@4.4.3:\n dependencies:\n ms: 2.1.3\n\n depd@2.0.0: {}\n\n dunder-proto@1.0.1:\n dependencies:\n call-bind-apply-helpers: 1.0.2\n es-errors: 1.3.0\n gopd: 1.2.0\n\n ee-first@1.1.1: {}\n\n encodeurl@2.0.0: {}\n\n es-define-property@1.0.1: {}\n\n es-errors@1.3.0: {}\n\n es-object-atoms@1.1.2:\n dependencies:\n es-errors: 1.3.0\n\n escape-html@1.0.3: {}\n\n etag@1.8.1: {}\n\n eventsource-parser@3.1.1: {}\n\n eventsource@3.0.7:\n dependencies:\n eventsource-parser: 3.1.1\n\n express-rate-limit@8.6.2(express@5.2.1):\n dependencies:\n debug: 4.4.3\n express: 5.2.1\n ip-address: 10.5.0\n transitivePeerDependencies:\n - supports-color\n\n express@5.2.1:\n dependencies:\n accepts: 2.0.0\n body-parser: 2.3.0\n content-disposition: 1.1.0\n content-type: 1.0.5\n cookie: 0.7.2\n cookie-signature: 1.2.2\n debug: 4.4.3\n depd: 2.0.0\n encodeurl: 2.0.0\n escape-html: 1.0.3\n etag: 1.8.1\n finalhandler: 2.1.1\n fresh: 2.0.0\n http-errors: 2.0.1\n merge-descriptors: 2.0.0\n mime-types: 3.0.2\n on-finished: 2.4.1\n once: 1.4.0\n parseurl: 1.3.3\n proxy-addr: 2.0.7\n qs: 6.15.3\n range-parser: 1.3.0\n router: 2.2.0\n send: 1.2.1\n serve-static: 2.2.1\n statuses: 2.0.2\n type-is: 2.1.0\n vary: 1.1.2\n transitivePeerDependencies:\n - supports-color\n\n fast-deep-equal@3.1.3: {}\n\n fast-uri@3.1.6: {}\n\n finalhandler@2.1.1:\n dependencies:\n debug: 4.4.3\n encodeurl: 2.0.0\n escape-html: 1.0.3\n on-finished: 2.4.1\n parseurl: 1.3.3\n statuses: 2.0.2\n transitivePeerDependencies:\n - supports-color\n\n forwarded@0.2.0: {}\n\n fresh@2.0.0: {}\n\n function-bind@1.1.2: {}\n\n get-intrinsic@1.3.0:\n dependencies:\n call-bind-apply-helpers: 1.0.2\n es-define-property: 1.0.1\n es-errors: 1.3.0\n es-object-atoms: 1.1.2\n function-bind: 1.1.2\n get-proto: 1.0.1\n gopd: 1.2.0\n has-symbols: 1.1.0\n hasown: 2.0.4\n math-intrinsics: 1.1.0\n\n get-proto@1.0.1:\n dependencies:\n dunder-proto: 1.0.1\n es-object-atoms: 1.1.2\n\n gopd@1.2.0: {}\n\n has-symbols@1.1.0: {}\n\n hasown@2.0.4:\n dependencies:\n function-bind: 1.1.2\n\n hono@4.13.4: {}\n\n http-errors@2.0.1:\n dependencies:\n depd: 2.0.0\n inherits: 2.0.4\n setprototypeof: 1.2.0\n statuses: 2.0.2\n toidentifier: 1.0.1\n\n iconv-lite@0.7.3:\n dependencies:\n safer-buffer: 2.1.2\n\n inherits@2.0.4: {}\n\n ip-address@10.5.0: {}\n\n ipaddr.js@1.9.1: {}\n\n is-promise@4.0.0: {}\n\n isexe@2.0.0: {}\n\n jose@6.2.10: {}\n\n json-schema-traverse@1.0.0: {}\n\n json-schema-typed@8.0.2: {}\n\n math-intrinsics@1.1.0: {}\n\n media-typer@1.1.1: {}\n\n merge-descriptors@2.0.0: {}\n\n mime-db@1.54.0: {}\n\n mime-types@3.0.2:\n dependencies:\n mime-db: 1.54.0\n\n ms@2.1.3: {}\n\n negotiator@1.1.0:\n dependencies:\n content-type: 2.1.0\n\n object-assign@4.1.1: {}\n\n object-inspect@1.13.4: {}\n\n on-finished@2.4.1:\n dependencies:\n ee-first: 1.1.1\n\n once@1.4.0:\n dependencies:\n wrappy: 1.0.2\n\n parseurl@1.3.3: {}\n\n path-key@3.1.1: {}\n\n path-to-regexp@8.4.2: {}\n\n pkce-challenge@5.0.1: {}\n\n proxy-addr@2.0.7:\n dependencies:\n forwarded: 0.2.0\n ipaddr.js: 1.9.1\n\n qs@6.15.3:\n dependencies:\n es-define-property: 1.0.1\n side-channel: 1.1.1\n\n range-parser@1.3.0: {}\n\n raw-body@3.0.2:\n dependencies:\n bytes: 3.1.2\n http-errors: 2.0.1\n iconv-lite: 0.7.3\n unpipe: 1.0.0\n\n require-from-string@2.0.2: {}\n\n router@2.2.0:\n dependencies:\n debug: 4.4.3\n depd: 2.0.0\n is-promise: 4.0.0\n parseurl: 1.3.3\n path-to-regexp: 8.4.2\n transitivePeerDependencies:\n - supports-color\n\n safer-buffer@2.1.2: {}\n\n send@1.2.1:\n dependencies:\n debug: 4.4.3\n encodeurl: 2.0.0\n escape-html: 1.0.3\n etag: 1.8.1\n fresh: 2.0.0\n http-errors: 2.0.1\n mime-types: 3.0.2\n ms: 2.1.3\n on-finished: 2.4.1\n range-parser: 1.3.0\n statuses: 2.0.2\n transitivePeerDependencies:\n - supports-color\n\n serve-static@2.2.1:\n dependencies:\n encodeurl: 2.0.0\n escape-html: 1.0.3\n parseurl: 1.3.3\n send: 1.2.1\n transitivePeerDependencies:\n - supports-color\n\n setprototypeof@1.2.0: {}\n\n shebang-command@2.0.0:\n dependencies:\n shebang-regex: 3.0.0\n\n shebang-regex@3.0.0: {}\n\n side-channel-list@1.0.1:\n dependencies:\n es-errors: 1.3.0\n object-inspect: 1.13.4\n\n side-channel-map@1.0.1:\n dependencies:\n call-bound: 1.0.4\n es-errors: 1.3.0\n get-intrinsic: 1.3.0\n object-inspect: 1.13.4\n\n side-channel-weakmap@1.0.2:\n dependencies:\n call-bound: 1.0.4\n es-errors: 1.3.0\n get-intrinsic: 1.3.0\n object-inspect: 1.13.4\n side-channel-map: 1.0.1\n\n side-channel@1.1.1:\n dependencies:\n es-errors: 1.3.0\n object-inspect: 1.13.4\n side-channel-list: 1.0.1\n side-channel-map: 1.0.1\n side-channel-weakmap: 1.0.2\n\n statuses@2.0.2: {}\n\n toidentifier@1.0.1: {}\n\n type-is@2.1.0:\n dependencies:\n content-type: 2.1.0\n media-typer: 1.1.1\n mime-types: 3.0.2\n\n unpipe@1.0.0: {}\n\n vary@1.1.2: {}\n\n which@2.0.2:\n dependencies:\n isexe: 2.0.0\n\n wrappy@1.0.2: {}\n\n ws@8.21.0: {}\n\n zod-to-json-schema@3.25.2(zod@4.4.3):\n dependencies:\n zod: 4.4.3\n\n zod@4.4.3: {}\n";
|
|
17
157
|
var GROK_BUILD_IMPLEMENTATION_PNPM_WORKSPACE = "allowBuilds:\n '@xai-official/grok@1.0.5': true\n";
|
|
18
158
|
var GROK_BUILD_BUILTIN_TOOLS = {
|
|
159
|
+
askUserQuestions: HARNESS_V1_BUILTIN_TOOLS.askUserQuestions,
|
|
19
160
|
bash: commonTool("bash", {
|
|
20
161
|
nativeName: "run_terminal_command",
|
|
21
162
|
toolUseKind: "bash",
|
|
22
|
-
inputSchema:
|
|
23
|
-
command:
|
|
24
|
-
timeout:
|
|
25
|
-
description:
|
|
26
|
-
background:
|
|
163
|
+
inputSchema: z2.looseObject({
|
|
164
|
+
command: z2.string(),
|
|
165
|
+
timeout: z2.number().int().min(0).max(36e6).nullable().optional(),
|
|
166
|
+
description: z2.string().optional(),
|
|
167
|
+
background: z2.boolean().optional()
|
|
27
168
|
})
|
|
28
169
|
}),
|
|
29
170
|
edit: commonTool("edit", {
|
|
30
171
|
nativeName: "search_replace",
|
|
31
172
|
toolUseKind: "edit",
|
|
32
|
-
inputSchema:
|
|
33
|
-
file_path:
|
|
34
|
-
old_string:
|
|
35
|
-
new_string:
|
|
36
|
-
replace_all:
|
|
173
|
+
inputSchema: z2.looseObject({
|
|
174
|
+
file_path: z2.string(),
|
|
175
|
+
old_string: z2.string(),
|
|
176
|
+
new_string: z2.string(),
|
|
177
|
+
replace_all: z2.boolean().optional()
|
|
37
178
|
})
|
|
38
179
|
}),
|
|
39
180
|
grep: commonTool("grep", {
|
|
40
181
|
nativeName: "grep",
|
|
41
182
|
toolUseKind: "readonly",
|
|
42
|
-
inputSchema:
|
|
43
|
-
pattern:
|
|
44
|
-
path:
|
|
45
|
-
glob:
|
|
46
|
-
"-B":
|
|
47
|
-
"-A":
|
|
48
|
-
"-C":
|
|
49
|
-
"-i":
|
|
50
|
-
type:
|
|
51
|
-
head_limit:
|
|
52
|
-
multiline:
|
|
183
|
+
inputSchema: z2.looseObject({
|
|
184
|
+
pattern: z2.string(),
|
|
185
|
+
path: z2.string().nullable().optional(),
|
|
186
|
+
glob: z2.string().nullable().optional(),
|
|
187
|
+
"-B": z2.number().int().optional(),
|
|
188
|
+
"-A": z2.number().int().optional(),
|
|
189
|
+
"-C": z2.number().int().optional(),
|
|
190
|
+
"-i": z2.boolean().optional(),
|
|
191
|
+
type: z2.string().nullable().optional(),
|
|
192
|
+
head_limit: z2.number().int().optional(),
|
|
193
|
+
multiline: z2.boolean().optional()
|
|
53
194
|
})
|
|
54
195
|
}),
|
|
55
196
|
webSearch: commonTool("webSearch", {
|
|
56
197
|
nativeName: "web_search",
|
|
57
198
|
toolUseKind: "readonly",
|
|
58
|
-
inputSchema:
|
|
59
|
-
query:
|
|
60
|
-
allowed_domains:
|
|
199
|
+
inputSchema: z2.looseObject({
|
|
200
|
+
query: z2.string(),
|
|
201
|
+
allowed_domains: z2.array(z2.string()).nullable().optional()
|
|
61
202
|
})
|
|
62
203
|
}),
|
|
63
204
|
write: commonTool("write", {
|
|
64
205
|
nativeName: "write",
|
|
65
206
|
toolUseKind: "edit",
|
|
66
|
-
inputSchema:
|
|
67
|
-
file_path:
|
|
68
|
-
content:
|
|
207
|
+
inputSchema: z2.looseObject({
|
|
208
|
+
file_path: z2.string(),
|
|
209
|
+
content: z2.string()
|
|
69
210
|
})
|
|
70
211
|
}),
|
|
71
212
|
read_file: {
|
|
72
213
|
...tool({
|
|
73
|
-
inputSchema:
|
|
74
|
-
target_file:
|
|
75
|
-
offset:
|
|
76
|
-
limit:
|
|
77
|
-
pages:
|
|
78
|
-
format:
|
|
214
|
+
inputSchema: z2.looseObject({
|
|
215
|
+
target_file: z2.string(),
|
|
216
|
+
offset: z2.number().int().optional(),
|
|
217
|
+
limit: z2.number().int().optional(),
|
|
218
|
+
pages: z2.string().nullable().optional(),
|
|
219
|
+
format: z2.string().nullable().optional()
|
|
79
220
|
})
|
|
80
221
|
}),
|
|
81
222
|
toolUseKind: "readonly"
|
|
82
223
|
},
|
|
83
224
|
list_dir: {
|
|
84
225
|
...tool({
|
|
85
|
-
inputSchema:
|
|
86
|
-
target_directory:
|
|
226
|
+
inputSchema: z2.looseObject({
|
|
227
|
+
target_directory: z2.string()
|
|
87
228
|
})
|
|
88
229
|
}),
|
|
89
230
|
toolUseKind: "readonly"
|
|
90
231
|
},
|
|
91
232
|
kill_command_or_subagent: tool({
|
|
92
|
-
inputSchema:
|
|
93
|
-
task_id:
|
|
233
|
+
inputSchema: z2.looseObject({
|
|
234
|
+
task_id: z2.string()
|
|
94
235
|
})
|
|
95
236
|
}),
|
|
96
237
|
todo_write: tool({
|
|
97
|
-
inputSchema:
|
|
98
|
-
merge:
|
|
99
|
-
todos:
|
|
100
|
-
|
|
101
|
-
id:
|
|
102
|
-
content:
|
|
103
|
-
status:
|
|
238
|
+
inputSchema: z2.looseObject({
|
|
239
|
+
merge: z2.boolean().optional(),
|
|
240
|
+
todos: z2.array(
|
|
241
|
+
z2.looseObject({
|
|
242
|
+
id: z2.string(),
|
|
243
|
+
content: z2.string().nullable().optional(),
|
|
244
|
+
status: z2.enum(["pending", "in_progress", "completed", "cancelled"]).nullable().optional()
|
|
104
245
|
})
|
|
105
246
|
)
|
|
106
247
|
})
|
|
107
248
|
}),
|
|
108
249
|
get_command_or_subagent_output: {
|
|
109
250
|
...tool({
|
|
110
|
-
inputSchema:
|
|
111
|
-
task_ids:
|
|
112
|
-
timeout_ms:
|
|
251
|
+
inputSchema: z2.looseObject({
|
|
252
|
+
task_ids: z2.array(z2.string()).optional(),
|
|
253
|
+
timeout_ms: z2.number().int().nonnegative().nullable().optional()
|
|
113
254
|
})
|
|
114
255
|
}),
|
|
115
256
|
toolUseKind: "readonly"
|
|
116
257
|
},
|
|
117
258
|
spawn_subagent: tool({
|
|
118
|
-
inputSchema:
|
|
119
|
-
prompt:
|
|
120
|
-
description:
|
|
121
|
-
subagent_type:
|
|
122
|
-
background:
|
|
123
|
-
capability_mode:
|
|
124
|
-
isolation:
|
|
125
|
-
resume_from:
|
|
126
|
-
cwd:
|
|
127
|
-
model:
|
|
259
|
+
inputSchema: z2.looseObject({
|
|
260
|
+
prompt: z2.string(),
|
|
261
|
+
description: z2.string(),
|
|
262
|
+
subagent_type: z2.string().optional(),
|
|
263
|
+
background: z2.boolean().optional(),
|
|
264
|
+
capability_mode: z2.enum(["read-only", "read-write", "execute", "all"]).nullable().optional(),
|
|
265
|
+
isolation: z2.enum(["none", "worktree"]).nullable().optional(),
|
|
266
|
+
resume_from: z2.string().nullable().optional(),
|
|
267
|
+
cwd: z2.string().nullable().optional(),
|
|
268
|
+
model: z2.string().nullable().optional()
|
|
128
269
|
})
|
|
129
270
|
}),
|
|
130
271
|
scheduler_create: tool({
|
|
131
|
-
inputSchema:
|
|
132
|
-
task_id:
|
|
133
|
-
interval:
|
|
134
|
-
prompt:
|
|
135
|
-
durable:
|
|
136
|
-
foreground:
|
|
137
|
-
fire_immediately:
|
|
272
|
+
inputSchema: z2.looseObject({
|
|
273
|
+
task_id: z2.string().nullable().optional(),
|
|
274
|
+
interval: z2.string().nullable().optional(),
|
|
275
|
+
prompt: z2.string().nullable().optional(),
|
|
276
|
+
durable: z2.boolean().nullable().optional(),
|
|
277
|
+
foreground: z2.boolean().nullable().optional(),
|
|
278
|
+
fire_immediately: z2.boolean().optional()
|
|
138
279
|
})
|
|
139
280
|
}),
|
|
140
281
|
scheduler_delete: tool({
|
|
141
|
-
inputSchema:
|
|
282
|
+
inputSchema: z2.looseObject({ id: z2.string() })
|
|
142
283
|
}),
|
|
143
284
|
scheduler_list: {
|
|
144
|
-
...tool({ inputSchema:
|
|
285
|
+
...tool({ inputSchema: z2.looseObject({}) }),
|
|
145
286
|
toolUseKind: "readonly"
|
|
146
287
|
},
|
|
147
288
|
monitor: tool({
|
|
148
|
-
inputSchema:
|
|
149
|
-
command:
|
|
150
|
-
description:
|
|
151
|
-
timeout_ms:
|
|
152
|
-
persistent:
|
|
289
|
+
inputSchema: z2.looseObject({
|
|
290
|
+
command: z2.string(),
|
|
291
|
+
description: z2.string(),
|
|
292
|
+
timeout_ms: z2.number().int().nonnegative().nullable().optional(),
|
|
293
|
+
persistent: z2.boolean().optional()
|
|
153
294
|
})
|
|
154
295
|
}),
|
|
155
296
|
search_tool: {
|
|
156
297
|
...tool({
|
|
157
|
-
inputSchema:
|
|
158
|
-
query:
|
|
159
|
-
limit:
|
|
298
|
+
inputSchema: z2.looseObject({
|
|
299
|
+
query: z2.string(),
|
|
300
|
+
limit: z2.number().int().min(0).max(255).nullable().optional()
|
|
160
301
|
})
|
|
161
302
|
}),
|
|
162
303
|
toolUseKind: "readonly"
|
|
163
304
|
},
|
|
164
305
|
use_tool: tool({
|
|
165
|
-
inputSchema:
|
|
166
|
-
tool_name:
|
|
167
|
-
tool_input:
|
|
306
|
+
inputSchema: z2.looseObject({
|
|
307
|
+
tool_name: z2.string(),
|
|
308
|
+
tool_input: z2.looseObject({})
|
|
168
309
|
})
|
|
169
310
|
}),
|
|
170
311
|
workflow: tool({
|
|
171
|
-
inputSchema:
|
|
172
|
-
agent_budget:
|
|
173
|
-
name:
|
|
174
|
-
script:
|
|
175
|
-
script_path:
|
|
176
|
-
args:
|
|
177
|
-
resume_from_run_id:
|
|
178
|
-
validate_only:
|
|
179
|
-
})
|
|
180
|
-
}),
|
|
181
|
-
enter_plan_mode: tool({ inputSchema: z.looseObject({}) }),
|
|
182
|
-
exit_plan_mode: tool({ inputSchema: z.looseObject({}) }),
|
|
183
|
-
ask_user_question: tool({
|
|
184
|
-
inputSchema: z.looseObject({
|
|
185
|
-
questions: z.array(
|
|
186
|
-
z.looseObject({
|
|
187
|
-
question: z.string(),
|
|
188
|
-
options: z.array(
|
|
189
|
-
z.looseObject({
|
|
190
|
-
label: z.string(),
|
|
191
|
-
description: z.string(),
|
|
192
|
-
preview: z.string().nullable().optional()
|
|
193
|
-
})
|
|
194
|
-
),
|
|
195
|
-
multi_select: z.boolean().nullable().optional()
|
|
196
|
-
})
|
|
197
|
-
)
|
|
312
|
+
inputSchema: z2.looseObject({
|
|
313
|
+
agent_budget: z2.number().int().min(1).max(1024).nullable().optional(),
|
|
314
|
+
name: z2.string().nullable().optional(),
|
|
315
|
+
script: z2.string().nullable().optional(),
|
|
316
|
+
script_path: z2.string().nullable().optional(),
|
|
317
|
+
args: z2.unknown().optional(),
|
|
318
|
+
resume_from_run_id: z2.string().nullable().optional(),
|
|
319
|
+
validate_only: z2.boolean().optional()
|
|
198
320
|
})
|
|
199
321
|
}),
|
|
322
|
+
enter_plan_mode: tool({ inputSchema: z2.looseObject({}) }),
|
|
323
|
+
exit_plan_mode: tool({ inputSchema: z2.looseObject({}) }),
|
|
200
324
|
image_gen: tool({
|
|
201
|
-
inputSchema:
|
|
202
|
-
prompt:
|
|
203
|
-
aspect_ratio:
|
|
325
|
+
inputSchema: z2.looseObject({
|
|
326
|
+
prompt: z2.string(),
|
|
327
|
+
aspect_ratio: z2.string().optional()
|
|
204
328
|
})
|
|
205
329
|
}),
|
|
206
330
|
image_edit: tool({
|
|
207
|
-
inputSchema:
|
|
208
|
-
prompt:
|
|
209
|
-
image:
|
|
210
|
-
aspect_ratio:
|
|
331
|
+
inputSchema: z2.looseObject({
|
|
332
|
+
prompt: z2.string(),
|
|
333
|
+
image: z2.array(z2.string()),
|
|
334
|
+
aspect_ratio: z2.string().optional()
|
|
211
335
|
})
|
|
212
336
|
}),
|
|
213
337
|
image_to_video: tool({
|
|
214
|
-
inputSchema:
|
|
215
|
-
prompt:
|
|
216
|
-
image:
|
|
217
|
-
duration:
|
|
218
|
-
resolution_name:
|
|
338
|
+
inputSchema: z2.looseObject({
|
|
339
|
+
prompt: z2.string().nullable().optional(),
|
|
340
|
+
image: z2.string(),
|
|
341
|
+
duration: z2.number().int().nonnegative().nullable().optional(),
|
|
342
|
+
resolution_name: z2.string().optional()
|
|
219
343
|
})
|
|
220
344
|
}),
|
|
221
345
|
reference_to_video: tool({
|
|
222
|
-
inputSchema:
|
|
223
|
-
prompt:
|
|
224
|
-
images:
|
|
225
|
-
aspect_ratio:
|
|
226
|
-
duration:
|
|
227
|
-
resolution_name:
|
|
346
|
+
inputSchema: z2.looseObject({
|
|
347
|
+
prompt: z2.string(),
|
|
348
|
+
images: z2.array(z2.string()),
|
|
349
|
+
aspect_ratio: z2.string(),
|
|
350
|
+
duration: z2.number().int().nonnegative().nullable().optional(),
|
|
351
|
+
resolution_name: z2.string().optional()
|
|
228
352
|
})
|
|
229
353
|
})
|
|
230
354
|
};
|
|
@@ -251,6 +375,7 @@ function createGrokBuild(settings = {}) {
|
|
|
251
375
|
version: "v1",
|
|
252
376
|
harnessId: "grok-build",
|
|
253
377
|
builtinTools: GROK_BUILD_BUILTIN_TOOLS,
|
|
378
|
+
askUserQuestions: grokBuildAskUserQuestions,
|
|
254
379
|
clientApp: {
|
|
255
380
|
name: clientAppSegments.join("/"),
|
|
256
381
|
version: clientAppVersion
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/grok-build-harness.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import {\n commonTool,\n type HarnessV1,\n type HarnessV1BuiltinTool,\n type HarnessV1CredentialForwarding,\n type HarnessV1PortEndpoint,\n} from '@ai-sdk/harness';\nimport { createCredentialRequestTransformation } from '@ai-sdk/harness/utils';\nimport { createACP, type ACPAuthenticationMode } from '@ai-sdk/harness-acp';\nimport { tool } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { VERSION } from './version';\n\ndeclare const __GROK_BUILD_IMPLEMENTATION_PACKAGE_JSON__: string;\ndeclare const __GROK_BUILD_IMPLEMENTATION_PNPM_LOCK_YAML__: string;\ndeclare const __GROK_BUILD_IMPLEMENTATION_PNPM_WORKSPACE_YAML__: string;\n\nconst GROK_BUILD_CLIENT_APP = `ai-sdk/harness-grok-build/${VERSION}`;\nconst GROK_BUILD_IMPLEMENTATION_PACKAGE_JSON =\n __GROK_BUILD_IMPLEMENTATION_PACKAGE_JSON__;\nconst GROK_BUILD_IMPLEMENTATION_PNPM_LOCK =\n __GROK_BUILD_IMPLEMENTATION_PNPM_LOCK_YAML__;\nconst GROK_BUILD_IMPLEMENTATION_PNPM_WORKSPACE =\n __GROK_BUILD_IMPLEMENTATION_PNPM_WORKSPACE_YAML__;\n\nexport type GrokBuildAuthenticationMode = ACPAuthenticationMode;\n\nexport type GrokBuildHarnessSettings = {\n /**\n * Selects direct xAI or AI Gateway authentication. Defaults to automatic\n * environment-based selection.\n */\n readonly auth?: GrokBuildAuthenticationMode;\n /**\n * Customizes each credential value before it is forwarded into a sandbox\n * process. This does not restrict which credentials the harness adapter can\n * discover, read, or otherwise access in the host process.\n */\n readonly credentialForwarding?: HarnessV1CredentialForwarding;\n /**\n * Grok model id selected through Grok Build configuration. Leaving this\n * unset uses the default model.\n *\n * @deprecated Use `model` on `HarnessAgent` instead.\n */\n readonly model?: string;\n /**\n * Reasoning effort for reasoning-capable models. Leaving this unset defers\n * to Grok Build's default.\n */\n readonly reasoningEffort?:\n | 'none'\n | 'minimal'\n | 'low'\n | 'medium'\n | 'high'\n | 'xhigh'\n | 'max';\n /**\n * Overrides the sandbox port used by the ACP bridge.\n */\n readonly port?: number;\n /**\n * Override the host endpoint used to connect to the sandbox bridge. Required\n * together with `port` when using a basic sandbox session.\n */\n readonly portEndpoint?: HarnessV1PortEndpoint;\n /**\n * Maximum milliseconds to wait for the ACP bridge to start.\n */\n readonly startupTimeoutMs?: number;\n /**\n * MCP server definitions keyed by server name. Each definition uses the\n * underlying runtime's native MCP server configuration format.\n */\n readonly mcpServers?: Record<string, unknown>;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: (sandboxId: string) => string;\n};\n\n/*\n * Tool names and inputs were captured from the model request produced by\n * @xai-official/grok 0.2.111, the version used by the pinned Grok Build ACP\n * implementation.\n */\nconst GROK_BUILD_BUILTIN_TOOLS = {\n bash: commonTool('bash', {\n nativeName: 'run_terminal_command',\n toolUseKind: 'bash',\n inputSchema: z.looseObject({\n command: z.string(),\n timeout: z.number().int().min(0).max(36_000_000).nullable().optional(),\n description: z.string().optional(),\n background: z.boolean().optional(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'search_replace',\n toolUseKind: 'edit',\n inputSchema: z.looseObject({\n file_path: z.string(),\n old_string: z.string(),\n new_string: z.string(),\n replace_all: z.boolean().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'grep',\n toolUseKind: 'readonly',\n inputSchema: z.looseObject({\n pattern: z.string(),\n path: z.string().nullable().optional(),\n glob: z.string().nullable().optional(),\n '-B': z.number().int().optional(),\n '-A': z.number().int().optional(),\n '-C': z.number().int().optional(),\n '-i': z.boolean().optional(),\n type: z.string().nullable().optional(),\n head_limit: z.number().int().optional(),\n multiline: z.boolean().optional(),\n }),\n }),\n webSearch: commonTool('webSearch', {\n nativeName: 'web_search',\n toolUseKind: 'readonly',\n inputSchema: z.looseObject({\n query: z.string(),\n allowed_domains: z.array(z.string()).nullable().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'write',\n toolUseKind: 'edit',\n inputSchema: z.looseObject({\n file_path: z.string(),\n content: z.string(),\n }),\n }),\n read_file: {\n ...tool({\n inputSchema: z.looseObject({\n target_file: z.string(),\n offset: z.number().int().optional(),\n limit: z.number().int().optional(),\n pages: z.string().nullable().optional(),\n format: z.string().nullable().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n list_dir: {\n ...tool({\n inputSchema: z.looseObject({\n target_directory: z.string(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n kill_command_or_subagent: tool({\n inputSchema: z.looseObject({\n task_id: z.string(),\n }),\n }),\n todo_write: tool({\n inputSchema: z.looseObject({\n merge: z.boolean().optional(),\n todos: z.array(\n z.looseObject({\n id: z.string(),\n content: z.string().nullable().optional(),\n status: z\n .enum(['pending', 'in_progress', 'completed', 'cancelled'])\n .nullable()\n .optional(),\n }),\n ),\n }),\n }),\n get_command_or_subagent_output: {\n ...tool({\n inputSchema: z.looseObject({\n task_ids: z.array(z.string()).optional(),\n timeout_ms: z.number().int().nonnegative().nullable().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n spawn_subagent: tool({\n inputSchema: z.looseObject({\n prompt: z.string(),\n description: z.string(),\n subagent_type: z.string().optional(),\n background: z.boolean().optional(),\n capability_mode: z\n .enum(['read-only', 'read-write', 'execute', 'all'])\n .nullable()\n .optional(),\n isolation: z.enum(['none', 'worktree']).nullable().optional(),\n resume_from: z.string().nullable().optional(),\n cwd: z.string().nullable().optional(),\n model: z.string().nullable().optional(),\n }),\n }),\n scheduler_create: tool({\n inputSchema: z.looseObject({\n task_id: z.string().nullable().optional(),\n interval: z.string().nullable().optional(),\n prompt: z.string().nullable().optional(),\n durable: z.boolean().nullable().optional(),\n foreground: z.boolean().nullable().optional(),\n fire_immediately: z.boolean().optional(),\n }),\n }),\n scheduler_delete: tool({\n inputSchema: z.looseObject({ id: z.string() }),\n }),\n scheduler_list: {\n ...tool({ inputSchema: z.looseObject({}) }),\n toolUseKind: 'readonly',\n },\n monitor: tool({\n inputSchema: z.looseObject({\n command: z.string(),\n description: z.string(),\n timeout_ms: z.number().int().nonnegative().nullable().optional(),\n persistent: z.boolean().optional(),\n }),\n }),\n search_tool: {\n ...tool({\n inputSchema: z.looseObject({\n query: z.string(),\n limit: z.number().int().min(0).max(255).nullable().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n use_tool: tool({\n inputSchema: z.looseObject({\n tool_name: z.string(),\n tool_input: z.looseObject({}),\n }),\n }),\n workflow: tool({\n inputSchema: z.looseObject({\n agent_budget: z.number().int().min(1).max(1024).nullable().optional(),\n name: z.string().nullable().optional(),\n script: z.string().nullable().optional(),\n script_path: z.string().nullable().optional(),\n args: z.unknown().optional(),\n resume_from_run_id: z.string().nullable().optional(),\n validate_only: z.boolean().optional(),\n }),\n }),\n enter_plan_mode: tool({ inputSchema: z.looseObject({}) }),\n exit_plan_mode: tool({ inputSchema: z.looseObject({}) }),\n ask_user_question: tool({\n inputSchema: z.looseObject({\n questions: z.array(\n z.looseObject({\n question: z.string(),\n options: z.array(\n z.looseObject({\n label: z.string(),\n description: z.string(),\n preview: z.string().nullable().optional(),\n }),\n ),\n multi_select: z.boolean().nullable().optional(),\n }),\n ),\n }),\n }),\n image_gen: tool({\n inputSchema: z.looseObject({\n prompt: z.string(),\n aspect_ratio: z.string().optional(),\n }),\n }),\n image_edit: tool({\n inputSchema: z.looseObject({\n prompt: z.string(),\n image: z.array(z.string()),\n aspect_ratio: z.string().optional(),\n }),\n }),\n image_to_video: tool({\n inputSchema: z.looseObject({\n prompt: z.string().nullable().optional(),\n image: z.string(),\n duration: z.number().int().nonnegative().nullable().optional(),\n resolution_name: z.string().optional(),\n }),\n }),\n reference_to_video: tool({\n inputSchema: z.looseObject({\n prompt: z.string(),\n images: z.array(z.string()),\n aspect_ratio: z.string(),\n duration: z.number().int().nonnegative().nullable().optional(),\n resolution_name: z.string().optional(),\n }),\n }),\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\nexport function createGrokBuild(\n settings: GrokBuildHarnessSettings = {},\n): HarnessV1<typeof GROK_BUILD_BUILTIN_TOOLS> {\n const clientAppSegments = GROK_BUILD_CLIENT_APP.split('/');\n const clientAppVersion = clientAppSegments.pop()!;\n return createACP({\n auth: settings.auth,\n credentialForwarding: settings.credentialForwarding,\n modelId: settings.model,\n port: settings.port,\n portEndpoint: settings.portEndpoint,\n startupTimeoutMs: settings.startupTimeoutMs,\n mcpServers: settings.mcpServers,\n modelMapping: {\n type: 'session-model',\n path: 'modelId',\n },\n isMcpToolCall: toolCall => {\n const metadata = toolCall._meta?.['x.ai/tool'];\n return isRecord(metadata) && metadata.namespace === 'mcp';\n },\n mintBridgeToken: settings.mintBridgeToken,\n version: 'v1',\n harnessId: 'grok-build',\n builtinTools: GROK_BUILD_BUILTIN_TOOLS,\n clientApp: {\n name: clientAppSegments.join('/'),\n version: clientAppVersion,\n },\n source: {\n type: 'npm-locked',\n packageJson: GROK_BUILD_IMPLEMENTATION_PACKAGE_JSON,\n pnpmLockYaml: GROK_BUILD_IMPLEMENTATION_PNPM_LOCK,\n pnpmWorkspaceYaml: GROK_BUILD_IMPLEMENTATION_PNPM_WORKSPACE,\n },\n executable: 'grok',\n args: [\n 'agent',\n ...(settings.reasoningEffort == null\n ? []\n : ['--reasoning-effort', settings.reasoningEffort]),\n 'stdio',\n ],\n credentialEnv: ['XAI_API_KEY'],\n credentialBrokering: ({ env, sandboxEnv }) => {\n if (!env.XAI_API_KEY || !sandboxEnv?.XAI_API_KEY) return [];\n return [\n createCredentialRequestTransformation({\n matchUrl: env.GROK_XAI_API_BASE_URL ?? 'https://api.x.ai/v1',\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnv.XAI_API_KEY}`,\n },\n transformHeaders: { Authorization: `Bearer ${env.XAI_API_KEY}` },\n }),\n ];\n },\n instructionMapping: {\n type: 'session-meta',\n path: ['rules'],\n },\n outputSchemaMapping: {\n type: 'session-prompt-meta',\n path: ['outputSchema'],\n },\n providerAuthentication: {\n gateway: {\n env: {\n GROK_CLIENT_NAME: { $source: 'client-app-name' },\n GROK_CLIENT_VERSION: { $source: 'client-app-version' },\n XAI_API_KEY: { $source: 'gateway-api-key' },\n GROK_XAI_API_BASE_URL: {\n $source: 'gateway-base-url',\n ensureSuffix: '/v1',\n },\n GROK_MODELS_BASE_URL: {\n $source: 'gateway-base-url',\n ensureSuffix: '/v1',\n },\n },\n },\n },\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n","declare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { createGrokBuild } from './grok-build-harness';\n\n/**\n * Default Grok Build harness instance. Equivalent to `createGrokBuild()`.\n */\nexport const grokBuild = createGrokBuild();\n\nexport { createGrokBuild } from './grok-build-harness';\nexport type {\n GrokBuildAuthenticationMode,\n GrokBuildHarnessSettings,\n} from './grok-build-harness';\nexport { VERSION } from './version';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/grok-build-harness.ts","../src/version.ts","../src/grok-build-question-tool.ts","../src/index.ts"],"sourcesContent":["import {\n HARNESS_V1_BUILTIN_TOOLS,\n commonTool,\n type HarnessV1,\n type HarnessV1BuiltinTool,\n type HarnessV1CredentialForwarding,\n type HarnessV1PortEndpoint,\n} from '@ai-sdk/harness';\nimport { createCredentialRequestTransformation } from '@ai-sdk/harness/utils';\nimport { createACP, type ACPAuthenticationMode } from '@ai-sdk/harness-acp';\nimport { tool } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { VERSION } from './version';\nimport { grokBuildAskUserQuestions } from './grok-build-question-tool';\n\ndeclare const __GROK_BUILD_IMPLEMENTATION_PACKAGE_JSON__: string;\ndeclare const __GROK_BUILD_IMPLEMENTATION_PNPM_LOCK_YAML__: string;\ndeclare const __GROK_BUILD_IMPLEMENTATION_PNPM_WORKSPACE_YAML__: string;\n\nconst GROK_BUILD_CLIENT_APP = `ai-sdk/harness-grok-build/${VERSION}`;\nconst GROK_BUILD_IMPLEMENTATION_PACKAGE_JSON =\n __GROK_BUILD_IMPLEMENTATION_PACKAGE_JSON__;\nconst GROK_BUILD_IMPLEMENTATION_PNPM_LOCK =\n __GROK_BUILD_IMPLEMENTATION_PNPM_LOCK_YAML__;\nconst GROK_BUILD_IMPLEMENTATION_PNPM_WORKSPACE =\n __GROK_BUILD_IMPLEMENTATION_PNPM_WORKSPACE_YAML__;\n\nexport type GrokBuildAuthenticationMode = ACPAuthenticationMode;\n\nexport type GrokBuildHarnessSettings = {\n /**\n * Selects direct xAI or AI Gateway authentication. Defaults to automatic\n * environment-based selection.\n */\n readonly auth?: GrokBuildAuthenticationMode;\n /**\n * Customizes each credential value before it is forwarded into a sandbox\n * process. This does not restrict which credentials the harness adapter can\n * discover, read, or otherwise access in the host process.\n */\n readonly credentialForwarding?: HarnessV1CredentialForwarding;\n /**\n * Grok model id selected through Grok Build configuration. Leaving this\n * unset uses the default model.\n *\n * @deprecated Use `model` on `HarnessAgent` instead.\n */\n readonly model?: string;\n /**\n * Reasoning effort for reasoning-capable models. Leaving this unset defers\n * to Grok Build's default.\n */\n readonly reasoningEffort?:\n | 'none'\n | 'minimal'\n | 'low'\n | 'medium'\n | 'high'\n | 'xhigh'\n | 'max';\n /**\n * Overrides the sandbox port used by the ACP bridge.\n */\n readonly port?: number;\n /**\n * Override the host endpoint used to connect to the sandbox bridge. Required\n * together with `port` when using a basic sandbox session.\n */\n readonly portEndpoint?: HarnessV1PortEndpoint;\n /**\n * Maximum milliseconds to wait for the ACP bridge to start.\n */\n readonly startupTimeoutMs?: number;\n /**\n * MCP server definitions keyed by server name. Each definition uses the\n * underlying runtime's native MCP server configuration format.\n */\n readonly mcpServers?: Record<string, unknown>;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: (sandboxId: string) => string;\n};\n\n/*\n * Tool names and inputs were captured from the model request produced by\n * @xai-official/grok 0.2.111, the version used by the pinned Grok Build ACP\n * implementation.\n */\nconst GROK_BUILD_BUILTIN_TOOLS = {\n askUserQuestions: HARNESS_V1_BUILTIN_TOOLS.askUserQuestions,\n bash: commonTool('bash', {\n nativeName: 'run_terminal_command',\n toolUseKind: 'bash',\n inputSchema: z.looseObject({\n command: z.string(),\n timeout: z.number().int().min(0).max(36_000_000).nullable().optional(),\n description: z.string().optional(),\n background: z.boolean().optional(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'search_replace',\n toolUseKind: 'edit',\n inputSchema: z.looseObject({\n file_path: z.string(),\n old_string: z.string(),\n new_string: z.string(),\n replace_all: z.boolean().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'grep',\n toolUseKind: 'readonly',\n inputSchema: z.looseObject({\n pattern: z.string(),\n path: z.string().nullable().optional(),\n glob: z.string().nullable().optional(),\n '-B': z.number().int().optional(),\n '-A': z.number().int().optional(),\n '-C': z.number().int().optional(),\n '-i': z.boolean().optional(),\n type: z.string().nullable().optional(),\n head_limit: z.number().int().optional(),\n multiline: z.boolean().optional(),\n }),\n }),\n webSearch: commonTool('webSearch', {\n nativeName: 'web_search',\n toolUseKind: 'readonly',\n inputSchema: z.looseObject({\n query: z.string(),\n allowed_domains: z.array(z.string()).nullable().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'write',\n toolUseKind: 'edit',\n inputSchema: z.looseObject({\n file_path: z.string(),\n content: z.string(),\n }),\n }),\n read_file: {\n ...tool({\n inputSchema: z.looseObject({\n target_file: z.string(),\n offset: z.number().int().optional(),\n limit: z.number().int().optional(),\n pages: z.string().nullable().optional(),\n format: z.string().nullable().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n list_dir: {\n ...tool({\n inputSchema: z.looseObject({\n target_directory: z.string(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n kill_command_or_subagent: tool({\n inputSchema: z.looseObject({\n task_id: z.string(),\n }),\n }),\n todo_write: tool({\n inputSchema: z.looseObject({\n merge: z.boolean().optional(),\n todos: z.array(\n z.looseObject({\n id: z.string(),\n content: z.string().nullable().optional(),\n status: z\n .enum(['pending', 'in_progress', 'completed', 'cancelled'])\n .nullable()\n .optional(),\n }),\n ),\n }),\n }),\n get_command_or_subagent_output: {\n ...tool({\n inputSchema: z.looseObject({\n task_ids: z.array(z.string()).optional(),\n timeout_ms: z.number().int().nonnegative().nullable().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n spawn_subagent: tool({\n inputSchema: z.looseObject({\n prompt: z.string(),\n description: z.string(),\n subagent_type: z.string().optional(),\n background: z.boolean().optional(),\n capability_mode: z\n .enum(['read-only', 'read-write', 'execute', 'all'])\n .nullable()\n .optional(),\n isolation: z.enum(['none', 'worktree']).nullable().optional(),\n resume_from: z.string().nullable().optional(),\n cwd: z.string().nullable().optional(),\n model: z.string().nullable().optional(),\n }),\n }),\n scheduler_create: tool({\n inputSchema: z.looseObject({\n task_id: z.string().nullable().optional(),\n interval: z.string().nullable().optional(),\n prompt: z.string().nullable().optional(),\n durable: z.boolean().nullable().optional(),\n foreground: z.boolean().nullable().optional(),\n fire_immediately: z.boolean().optional(),\n }),\n }),\n scheduler_delete: tool({\n inputSchema: z.looseObject({ id: z.string() }),\n }),\n scheduler_list: {\n ...tool({ inputSchema: z.looseObject({}) }),\n toolUseKind: 'readonly',\n },\n monitor: tool({\n inputSchema: z.looseObject({\n command: z.string(),\n description: z.string(),\n timeout_ms: z.number().int().nonnegative().nullable().optional(),\n persistent: z.boolean().optional(),\n }),\n }),\n search_tool: {\n ...tool({\n inputSchema: z.looseObject({\n query: z.string(),\n limit: z.number().int().min(0).max(255).nullable().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n use_tool: tool({\n inputSchema: z.looseObject({\n tool_name: z.string(),\n tool_input: z.looseObject({}),\n }),\n }),\n workflow: tool({\n inputSchema: z.looseObject({\n agent_budget: z.number().int().min(1).max(1024).nullable().optional(),\n name: z.string().nullable().optional(),\n script: z.string().nullable().optional(),\n script_path: z.string().nullable().optional(),\n args: z.unknown().optional(),\n resume_from_run_id: z.string().nullable().optional(),\n validate_only: z.boolean().optional(),\n }),\n }),\n enter_plan_mode: tool({ inputSchema: z.looseObject({}) }),\n exit_plan_mode: tool({ inputSchema: z.looseObject({}) }),\n image_gen: tool({\n inputSchema: z.looseObject({\n prompt: z.string(),\n aspect_ratio: z.string().optional(),\n }),\n }),\n image_edit: tool({\n inputSchema: z.looseObject({\n prompt: z.string(),\n image: z.array(z.string()),\n aspect_ratio: z.string().optional(),\n }),\n }),\n image_to_video: tool({\n inputSchema: z.looseObject({\n prompt: z.string().nullable().optional(),\n image: z.string(),\n duration: z.number().int().nonnegative().nullable().optional(),\n resolution_name: z.string().optional(),\n }),\n }),\n reference_to_video: tool({\n inputSchema: z.looseObject({\n prompt: z.string(),\n images: z.array(z.string()),\n aspect_ratio: z.string(),\n duration: z.number().int().nonnegative().nullable().optional(),\n resolution_name: z.string().optional(),\n }),\n }),\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\nexport function createGrokBuild(\n settings: GrokBuildHarnessSettings = {},\n): HarnessV1<typeof GROK_BUILD_BUILTIN_TOOLS> {\n const clientAppSegments = GROK_BUILD_CLIENT_APP.split('/');\n const clientAppVersion = clientAppSegments.pop()!;\n return createACP({\n auth: settings.auth,\n credentialForwarding: settings.credentialForwarding,\n modelId: settings.model,\n port: settings.port,\n portEndpoint: settings.portEndpoint,\n startupTimeoutMs: settings.startupTimeoutMs,\n mcpServers: settings.mcpServers,\n modelMapping: {\n type: 'session-model',\n path: 'modelId',\n },\n isMcpToolCall: toolCall => {\n const metadata = toolCall._meta?.['x.ai/tool'];\n return isRecord(metadata) && metadata.namespace === 'mcp';\n },\n mintBridgeToken: settings.mintBridgeToken,\n version: 'v1',\n harnessId: 'grok-build',\n builtinTools: GROK_BUILD_BUILTIN_TOOLS,\n askUserQuestions: grokBuildAskUserQuestions,\n clientApp: {\n name: clientAppSegments.join('/'),\n version: clientAppVersion,\n },\n source: {\n type: 'npm-locked',\n packageJson: GROK_BUILD_IMPLEMENTATION_PACKAGE_JSON,\n pnpmLockYaml: GROK_BUILD_IMPLEMENTATION_PNPM_LOCK,\n pnpmWorkspaceYaml: GROK_BUILD_IMPLEMENTATION_PNPM_WORKSPACE,\n },\n executable: 'grok',\n args: [\n 'agent',\n ...(settings.reasoningEffort == null\n ? []\n : ['--reasoning-effort', settings.reasoningEffort]),\n 'stdio',\n ],\n credentialEnv: ['XAI_API_KEY'],\n credentialBrokering: ({ env, sandboxEnv }) => {\n if (!env.XAI_API_KEY || !sandboxEnv?.XAI_API_KEY) return [];\n return [\n createCredentialRequestTransformation({\n matchUrl: env.GROK_XAI_API_BASE_URL ?? 'https://api.x.ai/v1',\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnv.XAI_API_KEY}`,\n },\n transformHeaders: { Authorization: `Bearer ${env.XAI_API_KEY}` },\n }),\n ];\n },\n instructionMapping: {\n type: 'session-meta',\n path: ['rules'],\n },\n outputSchemaMapping: {\n type: 'session-prompt-meta',\n path: ['outputSchema'],\n },\n providerAuthentication: {\n gateway: {\n env: {\n GROK_CLIENT_NAME: { $source: 'client-app-name' },\n GROK_CLIENT_VERSION: { $source: 'client-app-version' },\n XAI_API_KEY: { $source: 'gateway-api-key' },\n GROK_XAI_API_BASE_URL: {\n $source: 'gateway-base-url',\n ensureSuffix: '/v1',\n },\n GROK_MODELS_BASE_URL: {\n $source: 'gateway-base-url',\n ensureSuffix: '/v1',\n },\n },\n },\n },\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n","declare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import {\n harnessV1QuestionsToolOutputSchema,\n type HarnessV1QuestionsToolInput,\n} from '@ai-sdk/harness';\nimport type { ACPAskUserQuestionsSettings } from '@ai-sdk/harness-acp';\nimport type { ToolResultPart } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nconst grokBuildQuestionRequestSchema = z.object({\n sessionId: z.string(),\n toolCallId: z.string(),\n questions: z.array(\n z.object({\n question: z.string(),\n options: z.array(\n z.object({\n label: z.string(),\n description: z.string(),\n preview: z.string().nullable().optional(),\n }),\n ),\n multi_select: z.boolean().nullable().optional(),\n }),\n ),\n mode: z.enum(['default', 'plan']),\n});\n\ntype GrokBuildQuestionRequest = z.infer<typeof grokBuildQuestionRequestSchema>;\n\nexport const grokBuildAskUserQuestions = {\n requestMethod: '_x.ai/ask_user_question',\n fromNativeRequest: ({ nativeRequest }) => {\n const parsed = grokBuildQuestionRequestSchema.safeParse(nativeRequest);\n if (!parsed.success) return null;\n return {\n type: 'tool-call',\n toolCallId: parsed.data.toolCallId,\n toolName: 'askUserQuestions',\n nativeName: 'ask_user_question',\n input: JSON.stringify(toHarnessQuestionsInput(parsed.data)),\n providerExecuted: false,\n };\n },\n toNativeResponse: ({ nativeRequest, toolResult }) => {\n const request = grokBuildQuestionRequestSchema.parse(nativeRequest);\n const output = parseQuestionsOutput(toolResult);\n if (output.action === 'cancelled') {\n return { outcome: 'cancelled' };\n }\n\n const nativeAnswers =\n output.action === 'declined'\n ? { answers: {}, annotations: {} }\n : toNativeAnswers({ request, output });\n const requestedOutcome =\n toolResult.providerOptions?.['grok-build']?.outcome;\n if (\n requestedOutcome === 'chat_about_this' ||\n requestedOutcome === 'skip_interview'\n ) {\n return {\n outcome: requestedOutcome,\n partial_answers: Object.fromEntries(\n Object.entries(nativeAnswers.answers).map(([question, answers]) => [\n question,\n answers.join(', '),\n ]),\n ),\n };\n }\n if (output.action === 'declined') {\n return { outcome: 'skip_interview', partial_answers: {} };\n }\n return {\n outcome: 'accepted',\n answers: nativeAnswers.answers,\n ...(Object.keys(nativeAnswers.annotations).length === 0\n ? {}\n : { annotations: nativeAnswers.annotations }),\n };\n },\n matchesNativeRequest: ({ previousNativeRequest, nativeRequest }) => {\n const previous = grokBuildQuestionRequestSchema.safeParse(\n previousNativeRequest,\n );\n const current = grokBuildQuestionRequestSchema.safeParse(nativeRequest);\n return (\n previous.success &&\n current.success &&\n questionFingerprint(previous.data) === questionFingerprint(current.data)\n );\n },\n} satisfies ACPAskUserQuestionsSettings;\n\nfunction toHarnessQuestionsInput(\n request: GrokBuildQuestionRequest,\n): HarnessV1QuestionsToolInput {\n return {\n allowPartialAnswers: true,\n questions: request.questions.map((question, questionIndex) => ({\n id: questionId(questionIndex),\n question: question.question,\n options: question.options.map((option, optionIndex) => ({\n id: optionId(optionIndex),\n label: option.label,\n description: option.description,\n ...(option.preview == null ? {} : { preview: option.preview }),\n })),\n ...(question.multi_select == null\n ? {}\n : { allowMultiple: question.multi_select }),\n allowFreeForm: true,\n })),\n };\n}\n\nfunction toNativeAnswers({\n request,\n output,\n}: {\n request: GrokBuildQuestionRequest;\n output: Extract<\n ReturnType<typeof parseQuestionsOutput>,\n { action: 'answered' | 'partially-answered' }\n >;\n}): {\n answers: Record<string, string[]>;\n annotations: Record<string, { preview?: string; notes?: string }>;\n} {\n const answers: Record<string, string[]> = {};\n const annotations: Record<string, { preview?: string; notes?: string }> = {};\n request.questions.forEach((question, questionIndex) => {\n const answer = output.answers[questionId(questionIndex)];\n if (answer == null) return;\n const labels = answer.optionIds.flatMap(id => {\n const optionIndex = positionalIdIndex({ id, prefix: 'option-' });\n const option =\n optionIndex == null ? undefined : question.options[optionIndex];\n return option == null ? [] : [option.label];\n });\n if (answer.freeform != null) {\n labels.push('Other');\n annotations[question.question] = { notes: answer.freeform };\n }\n answers[question.question] = labels;\n });\n return { answers, annotations };\n}\n\nfunction parseQuestionsOutput(toolResult: ToolResultPart) {\n if (\n toolResult.output.type !== 'json' &&\n toolResult.output.type !== 'error-json'\n ) {\n throw new Error('Grok Build askUserQuestions requires a JSON tool result.');\n }\n return harnessV1QuestionsToolOutputSchema.parse(toolResult.output.value);\n}\n\nfunction questionId(index: number): string {\n return `question-${index + 1}`;\n}\n\nfunction optionId(index: number): string {\n return `option-${index + 1}`;\n}\n\nfunction positionalIdIndex({\n id,\n prefix,\n}: {\n id: string;\n prefix: string;\n}): number | undefined {\n if (!id.startsWith(prefix)) return undefined;\n const index = Number(id.slice(prefix.length)) - 1;\n return Number.isInteger(index) && index >= 0 ? index : undefined;\n}\n\nfunction questionFingerprint(request: GrokBuildQuestionRequest): string {\n return JSON.stringify({\n questions: request.questions,\n mode: request.mode,\n });\n}\n","import { createGrokBuild } from './grok-build-harness';\n\n/**\n * Default Grok Build harness instance. Equivalent to `createGrokBuild()`.\n */\nexport const grokBuild = createGrokBuild();\n\nexport { createGrokBuild } from './grok-build-harness';\nexport type {\n GrokBuildAuthenticationMode,\n GrokBuildHarnessSettings,\n} from './grok-build-harness';\nexport { VERSION } from './version';\n"],"mappings":"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","names":["z","z"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/harness-grok-build",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.38",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@ai-sdk/harness": "1.0.
|
|
30
|
-
"@ai-sdk/harness-acp": "1.0.
|
|
29
|
+
"@ai-sdk/harness": "1.0.101",
|
|
30
|
+
"@ai-sdk/harness-acp": "1.0.39",
|
|
31
31
|
"@ai-sdk/provider-utils": "5.0.36"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
HARNESS_V1_BUILTIN_TOOLS,
|
|
2
3
|
commonTool,
|
|
3
4
|
type HarnessV1,
|
|
4
5
|
type HarnessV1BuiltinTool,
|
|
@@ -10,6 +11,7 @@ import { createACP, type ACPAuthenticationMode } from '@ai-sdk/harness-acp';
|
|
|
10
11
|
import { tool } from '@ai-sdk/provider-utils';
|
|
11
12
|
import { z } from 'zod/v4';
|
|
12
13
|
import { VERSION } from './version';
|
|
14
|
+
import { grokBuildAskUserQuestions } from './grok-build-question-tool';
|
|
13
15
|
|
|
14
16
|
declare const __GROK_BUILD_IMPLEMENTATION_PACKAGE_JSON__: string;
|
|
15
17
|
declare const __GROK_BUILD_IMPLEMENTATION_PNPM_LOCK_YAML__: string;
|
|
@@ -87,6 +89,7 @@ export type GrokBuildHarnessSettings = {
|
|
|
87
89
|
* implementation.
|
|
88
90
|
*/
|
|
89
91
|
const GROK_BUILD_BUILTIN_TOOLS = {
|
|
92
|
+
askUserQuestions: HARNESS_V1_BUILTIN_TOOLS.askUserQuestions,
|
|
90
93
|
bash: commonTool('bash', {
|
|
91
94
|
nativeName: 'run_terminal_command',
|
|
92
95
|
toolUseKind: 'bash',
|
|
@@ -257,23 +260,6 @@ const GROK_BUILD_BUILTIN_TOOLS = {
|
|
|
257
260
|
}),
|
|
258
261
|
enter_plan_mode: tool({ inputSchema: z.looseObject({}) }),
|
|
259
262
|
exit_plan_mode: tool({ inputSchema: z.looseObject({}) }),
|
|
260
|
-
ask_user_question: tool({
|
|
261
|
-
inputSchema: z.looseObject({
|
|
262
|
-
questions: z.array(
|
|
263
|
-
z.looseObject({
|
|
264
|
-
question: z.string(),
|
|
265
|
-
options: z.array(
|
|
266
|
-
z.looseObject({
|
|
267
|
-
label: z.string(),
|
|
268
|
-
description: z.string(),
|
|
269
|
-
preview: z.string().nullable().optional(),
|
|
270
|
-
}),
|
|
271
|
-
),
|
|
272
|
-
multi_select: z.boolean().nullable().optional(),
|
|
273
|
-
}),
|
|
274
|
-
),
|
|
275
|
-
}),
|
|
276
|
-
}),
|
|
277
263
|
image_gen: tool({
|
|
278
264
|
inputSchema: z.looseObject({
|
|
279
265
|
prompt: z.string(),
|
|
@@ -331,6 +317,7 @@ export function createGrokBuild(
|
|
|
331
317
|
version: 'v1',
|
|
332
318
|
harnessId: 'grok-build',
|
|
333
319
|
builtinTools: GROK_BUILD_BUILTIN_TOOLS,
|
|
320
|
+
askUserQuestions: grokBuildAskUserQuestions,
|
|
334
321
|
clientApp: {
|
|
335
322
|
name: clientAppSegments.join('/'),
|
|
336
323
|
version: clientAppVersion,
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import {
|
|
2
|
+
harnessV1QuestionsToolOutputSchema,
|
|
3
|
+
type HarnessV1QuestionsToolInput,
|
|
4
|
+
} from '@ai-sdk/harness';
|
|
5
|
+
import type { ACPAskUserQuestionsSettings } from '@ai-sdk/harness-acp';
|
|
6
|
+
import type { ToolResultPart } from '@ai-sdk/provider-utils';
|
|
7
|
+
import { z } from 'zod/v4';
|
|
8
|
+
|
|
9
|
+
const grokBuildQuestionRequestSchema = z.object({
|
|
10
|
+
sessionId: z.string(),
|
|
11
|
+
toolCallId: z.string(),
|
|
12
|
+
questions: z.array(
|
|
13
|
+
z.object({
|
|
14
|
+
question: z.string(),
|
|
15
|
+
options: z.array(
|
|
16
|
+
z.object({
|
|
17
|
+
label: z.string(),
|
|
18
|
+
description: z.string(),
|
|
19
|
+
preview: z.string().nullable().optional(),
|
|
20
|
+
}),
|
|
21
|
+
),
|
|
22
|
+
multi_select: z.boolean().nullable().optional(),
|
|
23
|
+
}),
|
|
24
|
+
),
|
|
25
|
+
mode: z.enum(['default', 'plan']),
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
type GrokBuildQuestionRequest = z.infer<typeof grokBuildQuestionRequestSchema>;
|
|
29
|
+
|
|
30
|
+
export const grokBuildAskUserQuestions = {
|
|
31
|
+
requestMethod: '_x.ai/ask_user_question',
|
|
32
|
+
fromNativeRequest: ({ nativeRequest }) => {
|
|
33
|
+
const parsed = grokBuildQuestionRequestSchema.safeParse(nativeRequest);
|
|
34
|
+
if (!parsed.success) return null;
|
|
35
|
+
return {
|
|
36
|
+
type: 'tool-call',
|
|
37
|
+
toolCallId: parsed.data.toolCallId,
|
|
38
|
+
toolName: 'askUserQuestions',
|
|
39
|
+
nativeName: 'ask_user_question',
|
|
40
|
+
input: JSON.stringify(toHarnessQuestionsInput(parsed.data)),
|
|
41
|
+
providerExecuted: false,
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
toNativeResponse: ({ nativeRequest, toolResult }) => {
|
|
45
|
+
const request = grokBuildQuestionRequestSchema.parse(nativeRequest);
|
|
46
|
+
const output = parseQuestionsOutput(toolResult);
|
|
47
|
+
if (output.action === 'cancelled') {
|
|
48
|
+
return { outcome: 'cancelled' };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const nativeAnswers =
|
|
52
|
+
output.action === 'declined'
|
|
53
|
+
? { answers: {}, annotations: {} }
|
|
54
|
+
: toNativeAnswers({ request, output });
|
|
55
|
+
const requestedOutcome =
|
|
56
|
+
toolResult.providerOptions?.['grok-build']?.outcome;
|
|
57
|
+
if (
|
|
58
|
+
requestedOutcome === 'chat_about_this' ||
|
|
59
|
+
requestedOutcome === 'skip_interview'
|
|
60
|
+
) {
|
|
61
|
+
return {
|
|
62
|
+
outcome: requestedOutcome,
|
|
63
|
+
partial_answers: Object.fromEntries(
|
|
64
|
+
Object.entries(nativeAnswers.answers).map(([question, answers]) => [
|
|
65
|
+
question,
|
|
66
|
+
answers.join(', '),
|
|
67
|
+
]),
|
|
68
|
+
),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (output.action === 'declined') {
|
|
72
|
+
return { outcome: 'skip_interview', partial_answers: {} };
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
outcome: 'accepted',
|
|
76
|
+
answers: nativeAnswers.answers,
|
|
77
|
+
...(Object.keys(nativeAnswers.annotations).length === 0
|
|
78
|
+
? {}
|
|
79
|
+
: { annotations: nativeAnswers.annotations }),
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
matchesNativeRequest: ({ previousNativeRequest, nativeRequest }) => {
|
|
83
|
+
const previous = grokBuildQuestionRequestSchema.safeParse(
|
|
84
|
+
previousNativeRequest,
|
|
85
|
+
);
|
|
86
|
+
const current = grokBuildQuestionRequestSchema.safeParse(nativeRequest);
|
|
87
|
+
return (
|
|
88
|
+
previous.success &&
|
|
89
|
+
current.success &&
|
|
90
|
+
questionFingerprint(previous.data) === questionFingerprint(current.data)
|
|
91
|
+
);
|
|
92
|
+
},
|
|
93
|
+
} satisfies ACPAskUserQuestionsSettings;
|
|
94
|
+
|
|
95
|
+
function toHarnessQuestionsInput(
|
|
96
|
+
request: GrokBuildQuestionRequest,
|
|
97
|
+
): HarnessV1QuestionsToolInput {
|
|
98
|
+
return {
|
|
99
|
+
allowPartialAnswers: true,
|
|
100
|
+
questions: request.questions.map((question, questionIndex) => ({
|
|
101
|
+
id: questionId(questionIndex),
|
|
102
|
+
question: question.question,
|
|
103
|
+
options: question.options.map((option, optionIndex) => ({
|
|
104
|
+
id: optionId(optionIndex),
|
|
105
|
+
label: option.label,
|
|
106
|
+
description: option.description,
|
|
107
|
+
...(option.preview == null ? {} : { preview: option.preview }),
|
|
108
|
+
})),
|
|
109
|
+
...(question.multi_select == null
|
|
110
|
+
? {}
|
|
111
|
+
: { allowMultiple: question.multi_select }),
|
|
112
|
+
allowFreeForm: true,
|
|
113
|
+
})),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function toNativeAnswers({
|
|
118
|
+
request,
|
|
119
|
+
output,
|
|
120
|
+
}: {
|
|
121
|
+
request: GrokBuildQuestionRequest;
|
|
122
|
+
output: Extract<
|
|
123
|
+
ReturnType<typeof parseQuestionsOutput>,
|
|
124
|
+
{ action: 'answered' | 'partially-answered' }
|
|
125
|
+
>;
|
|
126
|
+
}): {
|
|
127
|
+
answers: Record<string, string[]>;
|
|
128
|
+
annotations: Record<string, { preview?: string; notes?: string }>;
|
|
129
|
+
} {
|
|
130
|
+
const answers: Record<string, string[]> = {};
|
|
131
|
+
const annotations: Record<string, { preview?: string; notes?: string }> = {};
|
|
132
|
+
request.questions.forEach((question, questionIndex) => {
|
|
133
|
+
const answer = output.answers[questionId(questionIndex)];
|
|
134
|
+
if (answer == null) return;
|
|
135
|
+
const labels = answer.optionIds.flatMap(id => {
|
|
136
|
+
const optionIndex = positionalIdIndex({ id, prefix: 'option-' });
|
|
137
|
+
const option =
|
|
138
|
+
optionIndex == null ? undefined : question.options[optionIndex];
|
|
139
|
+
return option == null ? [] : [option.label];
|
|
140
|
+
});
|
|
141
|
+
if (answer.freeform != null) {
|
|
142
|
+
labels.push('Other');
|
|
143
|
+
annotations[question.question] = { notes: answer.freeform };
|
|
144
|
+
}
|
|
145
|
+
answers[question.question] = labels;
|
|
146
|
+
});
|
|
147
|
+
return { answers, annotations };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function parseQuestionsOutput(toolResult: ToolResultPart) {
|
|
151
|
+
if (
|
|
152
|
+
toolResult.output.type !== 'json' &&
|
|
153
|
+
toolResult.output.type !== 'error-json'
|
|
154
|
+
) {
|
|
155
|
+
throw new Error('Grok Build askUserQuestions requires a JSON tool result.');
|
|
156
|
+
}
|
|
157
|
+
return harnessV1QuestionsToolOutputSchema.parse(toolResult.output.value);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function questionId(index: number): string {
|
|
161
|
+
return `question-${index + 1}`;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function optionId(index: number): string {
|
|
165
|
+
return `option-${index + 1}`;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function positionalIdIndex({
|
|
169
|
+
id,
|
|
170
|
+
prefix,
|
|
171
|
+
}: {
|
|
172
|
+
id: string;
|
|
173
|
+
prefix: string;
|
|
174
|
+
}): number | undefined {
|
|
175
|
+
if (!id.startsWith(prefix)) return undefined;
|
|
176
|
+
const index = Number(id.slice(prefix.length)) - 1;
|
|
177
|
+
return Number.isInteger(index) && index >= 0 ? index : undefined;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function questionFingerprint(request: GrokBuildQuestionRequest): string {
|
|
181
|
+
return JSON.stringify({
|
|
182
|
+
questions: request.questions,
|
|
183
|
+
mode: request.mode,
|
|
184
|
+
});
|
|
185
|
+
}
|