@paperclipai/adapter-grok-local 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/cli/format-event.d.ts +2 -0
  2. package/dist/cli/format-event.d.ts.map +1 -0
  3. package/dist/cli/format-event.js +55 -0
  4. package/dist/cli/format-event.js.map +1 -0
  5. package/dist/cli/format-event.test.d.ts +2 -0
  6. package/dist/cli/format-event.test.d.ts.map +1 -0
  7. package/dist/cli/format-event.test.js +19 -0
  8. package/dist/cli/format-event.test.js.map +1 -0
  9. package/dist/cli/index.d.ts +2 -0
  10. package/dist/cli/index.d.ts.map +1 -0
  11. package/dist/cli/index.js +2 -0
  12. package/dist/cli/index.js.map +1 -0
  13. package/dist/index.d.ts +9 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +43 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/server/execute.d.ts +3 -0
  18. package/dist/server/execute.d.ts.map +1 -0
  19. package/dist/server/execute.js +466 -0
  20. package/dist/server/execute.js.map +1 -0
  21. package/dist/server/execute.test.d.ts +2 -0
  22. package/dist/server/execute.test.d.ts.map +1 -0
  23. package/dist/server/execute.test.js +169 -0
  24. package/dist/server/execute.test.js.map +1 -0
  25. package/dist/server/index.d.ts +7 -0
  26. package/dist/server/index.d.ts.map +1 -0
  27. package/dist/server/index.js +62 -0
  28. package/dist/server/index.js.map +1 -0
  29. package/dist/server/parse.d.ts +11 -0
  30. package/dist/server/parse.d.ts.map +1 -0
  31. package/dist/server/parse.js +75 -0
  32. package/dist/server/parse.js.map +1 -0
  33. package/dist/server/parse.test.d.ts +2 -0
  34. package/dist/server/parse.test.d.ts.map +1 -0
  35. package/dist/server/parse.test.js +34 -0
  36. package/dist/server/parse.test.js.map +1 -0
  37. package/dist/server/skills.d.ts +4 -0
  38. package/dist/server/skills.d.ts.map +1 -0
  39. package/dist/server/skills.js +62 -0
  40. package/dist/server/skills.js.map +1 -0
  41. package/dist/server/test.d.ts +9 -0
  42. package/dist/server/test.d.ts.map +1 -0
  43. package/dist/server/test.js +266 -0
  44. package/dist/server/test.js.map +1 -0
  45. package/dist/server/test.test.d.ts +2 -0
  46. package/dist/server/test.test.d.ts.map +1 -0
  47. package/dist/server/test.test.js +120 -0
  48. package/dist/server/test.test.js.map +1 -0
  49. package/dist/ui/build-config.d.ts +3 -0
  50. package/dist/ui/build-config.d.ts.map +1 -0
  51. package/dist/ui/build-config.js +81 -0
  52. package/dist/ui/build-config.js.map +1 -0
  53. package/dist/ui/build-config.test.d.ts +2 -0
  54. package/dist/ui/build-config.test.d.ts.map +1 -0
  55. package/dist/ui/build-config.test.js +26 -0
  56. package/dist/ui/build-config.test.js.map +1 -0
  57. package/dist/ui/index.d.ts +3 -0
  58. package/dist/ui/index.d.ts.map +1 -0
  59. package/dist/ui/index.js +3 -0
  60. package/dist/ui/index.js.map +1 -0
  61. package/dist/ui/parse-stdout.d.ts +3 -0
  62. package/dist/ui/parse-stdout.d.ts.map +1 -0
  63. package/dist/ui/parse-stdout.js +54 -0
  64. package/dist/ui/parse-stdout.js.map +1 -0
  65. package/dist/ui/parse-stdout.test.d.ts +2 -0
  66. package/dist/ui/parse-stdout.test.d.ts.map +1 -0
  67. package/dist/ui/parse-stdout.test.js +25 -0
  68. package/dist/ui/parse-stdout.test.js.map +1 -0
  69. package/package.json +60 -0
@@ -0,0 +1,266 @@
1
+ import { asNumber, asString, ensurePathInEnv, parseObject, } from "@paperclipai/adapter-utils/server-utils";
2
+ import { describeAdapterExecutionTarget, ensureAdapterExecutionTargetCommandResolvable, ensureAdapterExecutionTargetDirectory, resolveAdapterExecutionTargetCwd, runAdapterExecutionTargetProcess, } from "@paperclipai/adapter-utils/execution-target";
3
+ import { DEFAULT_GROK_LOCAL_MODEL } from "../index.js";
4
+ import { parseGrokJsonl } from "./parse.js";
5
+ function summarizeStatus(checks) {
6
+ if (checks.some((check) => check.level === "error"))
7
+ return "fail";
8
+ if (checks.some((check) => check.level === "warn"))
9
+ return "warn";
10
+ return "pass";
11
+ }
12
+ function firstNonEmptyLine(text) {
13
+ return (text
14
+ .split(/\r?\n/)
15
+ .map((line) => line.trim())
16
+ .find(Boolean) ?? "");
17
+ }
18
+ function summarizeProbeDetail(stdout, stderr, parsedError) {
19
+ const raw = parsedError?.trim() || firstNonEmptyLine(stderr) || firstNonEmptyLine(stdout);
20
+ if (!raw)
21
+ return null;
22
+ const clean = raw.replace(/\s+/g, " ").trim();
23
+ const max = 240;
24
+ return clean.length > max ? `${clean.slice(0, max - 3)}...` : clean;
25
+ }
26
+ function normalizeEnv(input) {
27
+ if (typeof input !== "object" || input === null || Array.isArray(input))
28
+ return {};
29
+ const env = {};
30
+ for (const [key, value] of Object.entries(input)) {
31
+ if (typeof value === "string")
32
+ env[key] = value;
33
+ }
34
+ return env;
35
+ }
36
+ const GROK_AUTH_REQUIRED_RE = /(?:not\s+logged\s+in|login\s+required|run\s+`?grok\s+login`?|authentication\s+required|unauthorized|invalid\s+credentials)/i;
37
+ export function parseGrokModelsOutput(stdout) {
38
+ const trimmedLines = stdout
39
+ .split(/\r?\n/)
40
+ .map((line) => line.trim())
41
+ .filter(Boolean);
42
+ const models = [];
43
+ let defaultModel = null;
44
+ let authenticated = false;
45
+ let inModelsBlock = false;
46
+ for (const line of trimmedLines) {
47
+ if (/logged in/i.test(line))
48
+ authenticated = true;
49
+ const defaultMatch = /^Default model:\s*(.+)$/i.exec(line);
50
+ if (defaultMatch?.[1]) {
51
+ defaultModel = defaultMatch[1].trim();
52
+ continue;
53
+ }
54
+ if (/^Available models:/i.test(line)) {
55
+ inModelsBlock = true;
56
+ continue;
57
+ }
58
+ if (!inModelsBlock)
59
+ continue;
60
+ const bulletMatch = /^[*-]\s*(.+?)(?:\s+\(default\))?$/.exec(line);
61
+ if (bulletMatch?.[1]) {
62
+ models.push(bulletMatch[1].trim());
63
+ continue;
64
+ }
65
+ if (line.length > 0) {
66
+ models.push(line.replace(/\s+\(default\)$/, "").trim());
67
+ }
68
+ }
69
+ return {
70
+ authenticated,
71
+ defaultModel,
72
+ models: Array.from(new Set(models.filter(Boolean))),
73
+ };
74
+ }
75
+ export async function testEnvironment(ctx) {
76
+ const checks = [];
77
+ const config = parseObject(ctx.config);
78
+ const command = asString(config.command, "grok");
79
+ const target = ctx.executionTarget ?? null;
80
+ const targetIsRemote = target?.kind === "remote";
81
+ const cwd = resolveAdapterExecutionTargetCwd(target, asString(config.cwd, ""), process.cwd());
82
+ const targetLabel = targetIsRemote
83
+ ? ctx.environmentName ?? describeAdapterExecutionTarget(target)
84
+ : null;
85
+ const runId = `grok-envtest-${Date.now()}-${Math.random().toString(16).slice(2)}`;
86
+ if (targetLabel) {
87
+ checks.push({
88
+ code: "grok_environment_target",
89
+ level: "info",
90
+ message: `Probing inside environment: ${targetLabel}`,
91
+ });
92
+ }
93
+ try {
94
+ await ensureAdapterExecutionTargetDirectory(runId, target, cwd, {
95
+ cwd,
96
+ env: {},
97
+ createIfMissing: true,
98
+ });
99
+ checks.push({
100
+ code: "grok_cwd_valid",
101
+ level: "info",
102
+ message: `Working directory is valid: ${cwd}`,
103
+ });
104
+ }
105
+ catch (err) {
106
+ checks.push({
107
+ code: "grok_cwd_invalid",
108
+ level: "error",
109
+ message: err instanceof Error ? err.message : "Invalid working directory",
110
+ detail: cwd,
111
+ });
112
+ }
113
+ const env = normalizeEnv(config.env);
114
+ const runtimeEnv = ensurePathInEnv({ ...process.env, ...env });
115
+ try {
116
+ await ensureAdapterExecutionTargetCommandResolvable(command, target, cwd, runtimeEnv);
117
+ checks.push({
118
+ code: "grok_command_resolvable",
119
+ level: "info",
120
+ message: `Command is executable: ${command}`,
121
+ });
122
+ }
123
+ catch (err) {
124
+ checks.push({
125
+ code: "grok_command_unresolvable",
126
+ level: "error",
127
+ message: err instanceof Error ? err.message : "Command is not executable",
128
+ detail: command,
129
+ });
130
+ }
131
+ const canRunProbe = checks.every((check) => check.code !== "grok_cwd_invalid" && check.code !== "grok_command_unresolvable");
132
+ const configuredModel = asString(config.model, DEFAULT_GROK_LOCAL_MODEL).trim();
133
+ if (canRunProbe) {
134
+ const modelsProbe = await runAdapterExecutionTargetProcess(runId, target, command, ["models"], {
135
+ cwd,
136
+ env,
137
+ timeoutSec: Math.max(1, asNumber(config.helloProbeTimeoutSec, 45)),
138
+ graceSec: 5,
139
+ onLog: async () => { },
140
+ });
141
+ const probeOutput = `${modelsProbe.stdout}\n${modelsProbe.stderr}`;
142
+ const parsedModels = parseGrokModelsOutput(modelsProbe.stdout);
143
+ const authRequired = GROK_AUTH_REQUIRED_RE.test(probeOutput);
144
+ if (modelsProbe.timedOut) {
145
+ checks.push({
146
+ code: "grok_models_probe_timed_out",
147
+ level: "warn",
148
+ message: "`grok models` timed out.",
149
+ hint: "Retry the probe. If this persists, run `grok models` manually from the target environment.",
150
+ });
151
+ }
152
+ else if ((modelsProbe.exitCode ?? 1) !== 0) {
153
+ checks.push({
154
+ code: authRequired ? "grok_auth_required" : "grok_models_probe_failed",
155
+ level: authRequired ? "warn" : "error",
156
+ message: authRequired
157
+ ? "Grok CLI is not authenticated."
158
+ : "`grok models` failed.",
159
+ detail: summarizeProbeDetail(modelsProbe.stdout, modelsProbe.stderr, null),
160
+ hint: authRequired ? "Run `grok login` on the target host, then retry." : undefined,
161
+ });
162
+ }
163
+ else {
164
+ checks.push({
165
+ code: "grok_models_probe_passed",
166
+ level: "info",
167
+ message: parsedModels.authenticated
168
+ ? "Grok CLI authentication is configured."
169
+ : "`grok models` completed.",
170
+ detail: parsedModels.defaultModel ? `Default model: ${parsedModels.defaultModel}` : undefined,
171
+ });
172
+ if (parsedModels.models.length > 0) {
173
+ checks.push({
174
+ code: "grok_models_discovered",
175
+ level: "info",
176
+ message: `Discovered ${parsedModels.models.length} Grok model(s).`,
177
+ });
178
+ }
179
+ else {
180
+ checks.push({
181
+ code: "grok_models_empty",
182
+ level: "warn",
183
+ message: "Grok returned no available models.",
184
+ hint: "Run `grok models` manually and verify the account has access to a model.",
185
+ });
186
+ }
187
+ if (configuredModel) {
188
+ checks.push({
189
+ code: parsedModels.models.includes(configuredModel) ? "grok_model_configured" : "grok_model_not_found",
190
+ level: parsedModels.models.includes(configuredModel) ? "info" : "warn",
191
+ message: parsedModels.models.includes(configuredModel)
192
+ ? `Configured model: ${configuredModel}`
193
+ : `Configured model "${configuredModel}" not found in available models.`,
194
+ hint: parsedModels.models.includes(configuredModel)
195
+ ? undefined
196
+ : "Run `grok models` and choose an available model id.",
197
+ });
198
+ }
199
+ }
200
+ }
201
+ if (canRunProbe) {
202
+ const probeArgs = [
203
+ "--output-format",
204
+ "streaming-json",
205
+ "--always-approve",
206
+ "--permission-mode",
207
+ "dontAsk",
208
+ "--disable-web-search",
209
+ ];
210
+ if (configuredModel && configuredModel !== DEFAULT_GROK_LOCAL_MODEL) {
211
+ probeArgs.push("--model", configuredModel);
212
+ }
213
+ probeArgs.push("--single", "Respond with exactly hello.");
214
+ const helloProbe = await runAdapterExecutionTargetProcess(runId, target, command, probeArgs, {
215
+ cwd,
216
+ env,
217
+ timeoutSec: Math.max(1, asNumber(config.helloProbeTimeoutSec, 45)),
218
+ graceSec: 5,
219
+ onLog: async () => { },
220
+ });
221
+ const parsed = parseGrokJsonl(helloProbe.stdout);
222
+ const detail = summarizeProbeDetail(helloProbe.stdout, helloProbe.stderr, parsed.errorMessage);
223
+ const authRequired = GROK_AUTH_REQUIRED_RE.test(`${helloProbe.stdout}\n${helloProbe.stderr}`);
224
+ if (helloProbe.timedOut) {
225
+ checks.push({
226
+ code: "grok_hello_probe_timed_out",
227
+ level: "warn",
228
+ message: "Grok hello probe timed out.",
229
+ hint: "Retry the probe. If this persists, verify Grok can run a simple `--single` prompt manually.",
230
+ });
231
+ }
232
+ else if ((helloProbe.exitCode ?? 1) !== 0) {
233
+ checks.push({
234
+ code: authRequired ? "grok_hello_probe_auth_required" : "grok_hello_probe_failed",
235
+ level: authRequired ? "warn" : "error",
236
+ message: authRequired
237
+ ? "Grok CLI could not answer the hello probe because authentication is missing."
238
+ : "Grok hello probe failed.",
239
+ ...(detail ? { detail } : {}),
240
+ hint: authRequired ? "Run `grok login` on the target host, then retry." : undefined,
241
+ });
242
+ }
243
+ else if (/\bhello\b/i.test(parsed.summary)) {
244
+ checks.push({
245
+ code: "grok_hello_probe_passed",
246
+ level: "info",
247
+ message: "Grok hello probe succeeded.",
248
+ });
249
+ }
250
+ else {
251
+ checks.push({
252
+ code: "grok_hello_probe_unexpected_output",
253
+ level: "warn",
254
+ message: "Grok hello probe succeeded but returned unexpected output.",
255
+ ...(detail ? { detail } : {}),
256
+ });
257
+ }
258
+ }
259
+ return {
260
+ adapterType: "grok_local",
261
+ status: summarizeStatus(checks),
262
+ checks,
263
+ testedAt: new Date().toISOString(),
264
+ };
265
+ }
266
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.test.d.ts","sourceRoot":"","sources":["../../src/server/test.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
1
+ import { describe, expect, it, vi, beforeEach } from "vitest";
2
+ const ensureDirectoryMock = vi.hoisted(() => vi.fn(async () => { }));
3
+ const ensureCommandMock = vi.hoisted(() => vi.fn(async () => { }));
4
+ const runProcessMock = vi.hoisted(() => vi.fn());
5
+ vi.mock("@paperclipai/adapter-utils/execution-target", () => ({
6
+ describeAdapterExecutionTarget: () => "local",
7
+ ensureAdapterExecutionTargetCommandResolvable: ensureCommandMock,
8
+ ensureAdapterExecutionTargetDirectory: ensureDirectoryMock,
9
+ resolveAdapterExecutionTargetCwd: (_target, configuredCwd, fallbackCwd) => configuredCwd || fallbackCwd,
10
+ runAdapterExecutionTargetProcess: runProcessMock,
11
+ }));
12
+ import { parseGrokModelsOutput, testEnvironment } from "./test.js";
13
+ describe("parseGrokModelsOutput", () => {
14
+ it("extracts auth state and models from `grok models` output", () => {
15
+ expect(parseGrokModelsOutput([
16
+ "You are logged in with grok.com.",
17
+ "",
18
+ "Default model: grok-build",
19
+ "",
20
+ "Available models:",
21
+ " * grok-build (default)",
22
+ " * grok-code",
23
+ ].join("\n"))).toEqual({
24
+ authenticated: true,
25
+ defaultModel: "grok-build",
26
+ models: ["grok-build", "grok-code"],
27
+ });
28
+ });
29
+ });
30
+ describe("grok_local testEnvironment", () => {
31
+ beforeEach(() => {
32
+ ensureDirectoryMock.mockClear();
33
+ ensureCommandMock.mockClear();
34
+ runProcessMock.mockReset();
35
+ });
36
+ it("reports a healthy authenticated host with a working hello probe", async () => {
37
+ runProcessMock
38
+ .mockResolvedValueOnce({
39
+ exitCode: 0,
40
+ signal: null,
41
+ timedOut: false,
42
+ stdout: [
43
+ "You are logged in with grok.com.",
44
+ "",
45
+ "Default model: grok-build",
46
+ "",
47
+ "Available models:",
48
+ " * grok-build (default)",
49
+ ].join("\n"),
50
+ stderr: "",
51
+ })
52
+ .mockResolvedValueOnce({
53
+ exitCode: 0,
54
+ signal: null,
55
+ timedOut: false,
56
+ stdout: [
57
+ JSON.stringify({ type: "text", data: "hello" }),
58
+ JSON.stringify({ type: "end", stopReason: "EndTurn", sessionId: "sess-1", requestId: "req-1" }),
59
+ ].join("\n"),
60
+ stderr: "",
61
+ });
62
+ const result = await testEnvironment({
63
+ companyId: "company-1",
64
+ adapterType: "grok_local",
65
+ config: {
66
+ command: "grok",
67
+ cwd: "/tmp/project",
68
+ model: "grok-build",
69
+ },
70
+ });
71
+ expect(result.status).toBe("pass");
72
+ expect(result.checks.map((check) => check.code)).toEqual(expect.arrayContaining([
73
+ "grok_command_resolvable",
74
+ "grok_models_probe_passed",
75
+ "grok_model_configured",
76
+ "grok_hello_probe_passed",
77
+ ]));
78
+ expect(runProcessMock).toHaveBeenNthCalledWith(2, expect.any(String), null, "grok", expect.arrayContaining([
79
+ "--output-format",
80
+ "streaming-json",
81
+ "--always-approve",
82
+ "--permission-mode",
83
+ "dontAsk",
84
+ "--disable-web-search",
85
+ "--single",
86
+ "Respond with exactly hello.",
87
+ ]), expect.any(Object));
88
+ });
89
+ it("downgrades auth failures to warnings", async () => {
90
+ runProcessMock
91
+ .mockResolvedValueOnce({
92
+ exitCode: 1,
93
+ signal: null,
94
+ timedOut: false,
95
+ stdout: "",
96
+ stderr: "Not logged in. Run `grok login`.",
97
+ })
98
+ .mockResolvedValueOnce({
99
+ exitCode: 1,
100
+ signal: null,
101
+ timedOut: false,
102
+ stdout: "",
103
+ stderr: "Not logged in. Run `grok login`.",
104
+ });
105
+ const result = await testEnvironment({
106
+ companyId: "company-1",
107
+ adapterType: "grok_local",
108
+ config: {
109
+ command: "grok",
110
+ cwd: "/tmp/project",
111
+ },
112
+ });
113
+ expect(result.status).toBe("warn");
114
+ expect(result.checks.map((check) => check.code)).toEqual(expect.arrayContaining([
115
+ "grok_auth_required",
116
+ "grok_hello_probe_auth_required",
117
+ ]));
118
+ });
119
+ });
120
+ //# sourceMappingURL=test.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.test.js","sourceRoot":"","sources":["../../src/server/test.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CreateConfigValues } from "@paperclipai/adapter-utils";
2
+ export declare function buildGrokLocalConfig(v: CreateConfigValues): Record<string, unknown>;
3
+ //# sourceMappingURL=build-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAqDrE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBnF"}
@@ -0,0 +1,81 @@
1
+ import { DEFAULT_GROK_LOCAL_MODEL } from "../index.js";
2
+ function parseCommaArgs(value) {
3
+ return value
4
+ .split(",")
5
+ .map((item) => item.trim())
6
+ .filter(Boolean);
7
+ }
8
+ function parseEnvVars(text) {
9
+ const env = {};
10
+ for (const line of text.split(/\r?\n/)) {
11
+ const trimmed = line.trim();
12
+ if (!trimmed || trimmed.startsWith("#"))
13
+ continue;
14
+ const eq = trimmed.indexOf("=");
15
+ if (eq <= 0)
16
+ continue;
17
+ const key = trimmed.slice(0, eq).trim();
18
+ const value = trimmed.slice(eq + 1);
19
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
20
+ continue;
21
+ env[key] = value;
22
+ }
23
+ return env;
24
+ }
25
+ function parseEnvBindings(bindings) {
26
+ if (typeof bindings !== "object" || bindings === null || Array.isArray(bindings))
27
+ return {};
28
+ const env = {};
29
+ for (const [key, raw] of Object.entries(bindings)) {
30
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
31
+ continue;
32
+ if (typeof raw === "string") {
33
+ env[key] = { type: "plain", value: raw };
34
+ continue;
35
+ }
36
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
37
+ continue;
38
+ const rec = raw;
39
+ if (rec.type === "plain" && typeof rec.value === "string") {
40
+ env[key] = { type: "plain", value: rec.value };
41
+ continue;
42
+ }
43
+ if (rec.type === "secret_ref" && typeof rec.secretId === "string") {
44
+ env[key] = {
45
+ type: "secret_ref",
46
+ secretId: rec.secretId,
47
+ ...(typeof rec.version === "number" || rec.version === "latest"
48
+ ? { version: rec.version }
49
+ : {}),
50
+ };
51
+ }
52
+ }
53
+ return env;
54
+ }
55
+ export function buildGrokLocalConfig(v) {
56
+ const ac = {};
57
+ if (v.cwd)
58
+ ac.cwd = v.cwd;
59
+ if (v.instructionsFilePath)
60
+ ac.instructionsFilePath = v.instructionsFilePath;
61
+ ac.model = v.model || DEFAULT_GROK_LOCAL_MODEL;
62
+ ac.timeoutSec = 0;
63
+ ac.graceSec = 20;
64
+ if (v.thinkingEffort)
65
+ ac.reasoningEffort = v.thinkingEffort;
66
+ const env = parseEnvBindings(v.envBindings);
67
+ const legacy = parseEnvVars(v.envVars);
68
+ for (const [key, value] of Object.entries(legacy)) {
69
+ if (!Object.prototype.hasOwnProperty.call(env, key)) {
70
+ env[key] = { type: "plain", value };
71
+ }
72
+ }
73
+ if (Object.keys(env).length > 0)
74
+ ac.env = env;
75
+ if (v.command)
76
+ ac.command = v.command;
77
+ if (v.extraArgs)
78
+ ac.extraArgs = parseCommaArgs(v.extraArgs);
79
+ return ac;
80
+ }
81
+ //# sourceMappingURL=build-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.js","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,EAAE,IAAI,CAAC;YAAE,SAAS;QACtB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QACpD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAiB;IACzC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5F,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QACpD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YACzC,SAAS;QACX,CAAC;QACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5E,MAAM,GAAG,GAAG,GAA8B,CAAC;QAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC1D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;YAC/C,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClE,GAAG,CAAC,GAAG,CAAC,GAAG;gBACT,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,QAAQ;oBAC7D,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;oBAC1B,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,CAAqB;IACxD,MAAM,EAAE,GAA4B,EAAE,CAAC;IACvC,IAAI,CAAC,CAAC,GAAG;QAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;IAC1B,IAAI,CAAC,CAAC,oBAAoB;QAAE,EAAE,CAAC,oBAAoB,GAAG,CAAC,CAAC,oBAAoB,CAAC;IAC7E,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,wBAAwB,CAAC;IAC/C,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC;IAClB,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC,CAAC,cAAc;QAAE,EAAE,CAAC,eAAe,GAAG,CAAC,CAAC,cAAc,CAAC;IAC5D,MAAM,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC;IAE9C,IAAI,CAAC,CAAC,OAAO;QAAE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;IACtC,IAAI,CAAC,CAAC,SAAS;QAAE,EAAE,CAAC,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=build-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.test.d.ts","sourceRoot":"","sources":["../../src/ui/build-config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildGrokLocalConfig } from "./build-config.js";
3
+ describe("buildGrokLocalConfig", () => {
4
+ it("maps create-form values into adapter config", () => {
5
+ expect(buildGrokLocalConfig({
6
+ cwd: "/tmp/project",
7
+ instructionsFilePath: "/tmp/AGENTS.md",
8
+ model: "grok-build",
9
+ thinkingEffort: "high",
10
+ envVars: "XAI_API_KEY=secret\n",
11
+ extraArgs: "--check, --verbatim",
12
+ })).toEqual({
13
+ cwd: "/tmp/project",
14
+ instructionsFilePath: "/tmp/AGENTS.md",
15
+ model: "grok-build",
16
+ timeoutSec: 0,
17
+ graceSec: 20,
18
+ reasoningEffort: "high",
19
+ env: {
20
+ XAI_API_KEY: { type: "plain", value: "secret" },
21
+ },
22
+ extraArgs: ["--check", "--verbatim"],
23
+ });
24
+ });
25
+ });
26
+ //# sourceMappingURL=build-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.test.js","sourceRoot":"","sources":["../../src/ui/build-config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,oBAAoB,CAAC;YAC1B,GAAG,EAAE,cAAc;YACnB,oBAAoB,EAAE,gBAAgB;YACtC,KAAK,EAAE,YAAY;YACnB,cAAc,EAAE,MAAM;YACtB,OAAO,EAAE,sBAAsB;YAC/B,SAAS,EAAE,qBAAqB;SACxB,CAAC,CAAC,CAAC,OAAO,CAAC;YACnB,GAAG,EAAE,cAAc;YACnB,oBAAoB,EAAE,gBAAgB;YACtC,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,MAAM;YACvB,GAAG,EAAE;gBACH,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;aAChD;YACD,SAAS,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC;SACrC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { parseGrokStdoutLine } from "./parse-stdout.js";
2
+ export { buildGrokLocalConfig } from "./build-config.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { parseGrokStdoutLine } from "./parse-stdout.js";
2
+ export { buildGrokLocalConfig } from "./build-config.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TranscriptEntry } from "@paperclipai/adapter-utils";
2
+ export declare function parseGrokStdoutLine(line: string, ts: string): TranscriptEntry[];
3
+ //# sourceMappingURL=parse-stdout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.d.ts","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AA0BlE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,EAAE,CAkC/E"}
@@ -0,0 +1,54 @@
1
+ function safeJsonParse(text) {
2
+ try {
3
+ return JSON.parse(text);
4
+ }
5
+ catch {
6
+ return null;
7
+ }
8
+ }
9
+ function asRecord(value) {
10
+ if (typeof value !== "object" || value === null || Array.isArray(value))
11
+ return null;
12
+ return value;
13
+ }
14
+ function asString(value, fallback = "") {
15
+ return typeof value === "string" ? value : fallback;
16
+ }
17
+ function extractErrorText(value) {
18
+ if (typeof value === "string")
19
+ return value;
20
+ const record = asRecord(value);
21
+ if (!record)
22
+ return "";
23
+ return asString(record.message) || asString(record.detail) || asString(record.code);
24
+ }
25
+ export function parseGrokStdoutLine(line, ts) {
26
+ const parsed = asRecord(safeJsonParse(line));
27
+ if (!parsed) {
28
+ return [{ kind: "stdout", ts, text: line }];
29
+ }
30
+ const type = asString(parsed.type).trim();
31
+ if (type === "thought") {
32
+ const text = asString(parsed.data);
33
+ return text ? [{ kind: "thinking", ts, text, delta: true }] : [];
34
+ }
35
+ if (type === "text") {
36
+ const text = asString(parsed.data);
37
+ return text ? [{ kind: "assistant", ts, text, delta: true }] : [];
38
+ }
39
+ if (type === "error") {
40
+ const text = asString(parsed.data) || asString(parsed.message) || extractErrorText(parsed.error);
41
+ return text ? [{ kind: "stderr", ts, text }] : [{ kind: "stderr", ts, text: "Grok error" }];
42
+ }
43
+ if (type === "end") {
44
+ const stopReason = asString(parsed.stopReason).trim();
45
+ const sessionId = asString(parsed.sessionId).trim();
46
+ const parts = [
47
+ stopReason ? `stop_reason=${stopReason}` : "",
48
+ sessionId ? `session=${sessionId}` : "",
49
+ ].filter(Boolean);
50
+ return [{ kind: "system", ts, text: parts.join(" ") || "run completed" }];
51
+ }
52
+ return [{ kind: "system", ts, text: `event: ${type || "unknown"}` }];
53
+ }
54
+ //# sourceMappingURL=parse-stdout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.js","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"AAEA,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,QAAQ,GAAG,EAAE;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,EAAU;IAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG;YACZ,UAAU,CAAC,CAAC,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;YAC7C,SAAS,CAAC,CAAC,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;SACxC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,IAAI,IAAI,SAAS,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-stdout.test.d.ts.map