@tickernelz/paperclip-pro-adapter-grok-local 2026.925.0

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 (119) hide show
  1. package/LICENSE +22 -0
  2. package/dist/cli/format-event.d.ts +2 -0
  3. package/dist/cli/format-event.d.ts.map +1 -0
  4. package/dist/cli/format-event.js +55 -0
  5. package/dist/cli/format-event.js.map +1 -0
  6. package/dist/cli/format-event.test.d.ts +2 -0
  7. package/dist/cli/format-event.test.d.ts.map +1 -0
  8. package/dist/cli/format-event.test.js +19 -0
  9. package/dist/cli/format-event.test.js.map +1 -0
  10. package/dist/cli/index.d.ts +2 -0
  11. package/dist/cli/index.d.ts.map +1 -0
  12. package/dist/cli/index.js +2 -0
  13. package/dist/cli/index.js.map +1 -0
  14. package/dist/index.d.ts +10 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +53 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/server/adapter-auth-promotion.d.ts +87 -0
  19. package/dist/server/adapter-auth-promotion.d.ts.map +1 -0
  20. package/dist/server/adapter-auth-promotion.js +294 -0
  21. package/dist/server/adapter-auth-promotion.js.map +1 -0
  22. package/dist/server/adapter-auth-promotion.test.d.ts +2 -0
  23. package/dist/server/adapter-auth-promotion.test.d.ts.map +1 -0
  24. package/dist/server/adapter-auth-promotion.test.js +563 -0
  25. package/dist/server/adapter-auth-promotion.test.js.map +1 -0
  26. package/dist/server/device-login-parse.d.ts +23 -0
  27. package/dist/server/device-login-parse.d.ts.map +1 -0
  28. package/dist/server/device-login-parse.js +148 -0
  29. package/dist/server/device-login-parse.js.map +1 -0
  30. package/dist/server/device-login-parse.test.d.ts +2 -0
  31. package/dist/server/device-login-parse.test.d.ts.map +1 -0
  32. package/dist/server/device-login-parse.test.js +146 -0
  33. package/dist/server/device-login-parse.test.js.map +1 -0
  34. package/dist/server/execute.d.ts +3 -0
  35. package/dist/server/execute.d.ts.map +1 -0
  36. package/dist/server/execute.js +572 -0
  37. package/dist/server/execute.js.map +1 -0
  38. package/dist/server/execute.test.d.ts +2 -0
  39. package/dist/server/execute.test.d.ts.map +1 -0
  40. package/dist/server/execute.test.js +731 -0
  41. package/dist/server/execute.test.js.map +1 -0
  42. package/dist/server/grok-auth-copyback.d.ts +48 -0
  43. package/dist/server/grok-auth-copyback.d.ts.map +1 -0
  44. package/dist/server/grok-auth-copyback.js +92 -0
  45. package/dist/server/grok-auth-copyback.js.map +1 -0
  46. package/dist/server/grok-auth-copyback.test.d.ts +2 -0
  47. package/dist/server/grok-auth-copyback.test.d.ts.map +1 -0
  48. package/dist/server/grok-auth-copyback.test.js +246 -0
  49. package/dist/server/grok-auth-copyback.test.js.map +1 -0
  50. package/dist/server/grok-auth-merge-decision.cjs +157 -0
  51. package/dist/server/grok-auth-merge-decision.d.ts +21 -0
  52. package/dist/server/grok-auth-merge-decision.d.ts.map +1 -0
  53. package/dist/server/grok-auth-merge-decision.js +58 -0
  54. package/dist/server/grok-auth-merge-decision.js.map +1 -0
  55. package/dist/server/grok-auth-merge-decision.test.d.ts +2 -0
  56. package/dist/server/grok-auth-merge-decision.test.d.ts.map +1 -0
  57. package/dist/server/grok-auth-merge-decision.test.js +189 -0
  58. package/dist/server/grok-auth-merge-decision.test.js.map +1 -0
  59. package/dist/server/grok-home.d.ts +57 -0
  60. package/dist/server/grok-home.d.ts.map +1 -0
  61. package/dist/server/grok-home.js +145 -0
  62. package/dist/server/grok-home.js.map +1 -0
  63. package/dist/server/grok-home.test.d.ts +2 -0
  64. package/dist/server/grok-home.test.d.ts.map +1 -0
  65. package/dist/server/grok-home.test.js +109 -0
  66. package/dist/server/grok-home.test.js.map +1 -0
  67. package/dist/server/index.d.ts +12 -0
  68. package/dist/server/index.d.ts.map +1 -0
  69. package/dist/server/index.js +67 -0
  70. package/dist/server/index.js.map +1 -0
  71. package/dist/server/parse.d.ts +15 -0
  72. package/dist/server/parse.d.ts.map +1 -0
  73. package/dist/server/parse.js +93 -0
  74. package/dist/server/parse.js.map +1 -0
  75. package/dist/server/parse.test.d.ts +2 -0
  76. package/dist/server/parse.test.d.ts.map +1 -0
  77. package/dist/server/parse.test.js +82 -0
  78. package/dist/server/parse.test.js.map +1 -0
  79. package/dist/server/skills.d.ts +4 -0
  80. package/dist/server/skills.d.ts.map +1 -0
  81. package/dist/server/skills.js +21 -0
  82. package/dist/server/skills.js.map +1 -0
  83. package/dist/server/test.d.ts +9 -0
  84. package/dist/server/test.d.ts.map +1 -0
  85. package/dist/server/test.js +362 -0
  86. package/dist/server/test.js.map +1 -0
  87. package/dist/server/test.test.d.ts +2 -0
  88. package/dist/server/test.test.d.ts.map +1 -0
  89. package/dist/server/test.test.js +293 -0
  90. package/dist/server/test.test.js.map +1 -0
  91. package/dist/shared/turn-boundary.d.ts +7 -0
  92. package/dist/shared/turn-boundary.d.ts.map +1 -0
  93. package/dist/shared/turn-boundary.js +44 -0
  94. package/dist/shared/turn-boundary.js.map +1 -0
  95. package/dist/shared/turn-boundary.test.d.ts +2 -0
  96. package/dist/shared/turn-boundary.test.d.ts.map +1 -0
  97. package/dist/shared/turn-boundary.test.js +43 -0
  98. package/dist/shared/turn-boundary.test.js.map +1 -0
  99. package/dist/ui/build-config.d.ts +3 -0
  100. package/dist/ui/build-config.d.ts.map +1 -0
  101. package/dist/ui/build-config.js +29 -0
  102. package/dist/ui/build-config.js.map +1 -0
  103. package/dist/ui/build-config.test.d.ts +2 -0
  104. package/dist/ui/build-config.test.d.ts.map +1 -0
  105. package/dist/ui/build-config.test.js +26 -0
  106. package/dist/ui/build-config.test.js.map +1 -0
  107. package/dist/ui/index.d.ts +3 -0
  108. package/dist/ui/index.d.ts.map +1 -0
  109. package/dist/ui/index.js +3 -0
  110. package/dist/ui/index.js.map +1 -0
  111. package/dist/ui/parse-stdout.d.ts +7 -0
  112. package/dist/ui/parse-stdout.d.ts.map +1 -0
  113. package/dist/ui/parse-stdout.js +76 -0
  114. package/dist/ui/parse-stdout.js.map +1 -0
  115. package/dist/ui/parse-stdout.test.d.ts +2 -0
  116. package/dist/ui/parse-stdout.test.d.ts.map +1 -0
  117. package/dist/ui/parse-stdout.test.js +62 -0
  118. package/dist/ui/parse-stdout.test.js.map +1 -0
  119. package/package.json +58 -0
@@ -0,0 +1,293 @@
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
+ const prepareRuntimeMock = vi.hoisted(() => vi.fn());
6
+ const stageGrokHomeMock = vi.hoisted(() => vi.fn(async () => "/tmp/staged-grok-home"));
7
+ vi.mock("@tickernelz/paperclip-pro-adapter-utils/execution-target", () => ({
8
+ describeAdapterExecutionTarget: () => "local",
9
+ ensureAdapterExecutionTargetCommandResolvable: ensureCommandMock,
10
+ ensureAdapterExecutionTargetDirectory: ensureDirectoryMock,
11
+ prepareAdapterExecutionTargetRuntime: prepareRuntimeMock,
12
+ resolveAdapterExecutionTargetCwd: (_target, configuredCwd, fallbackCwd) => configuredCwd || fallbackCwd,
13
+ runAdapterExecutionTargetProcess: runProcessMock,
14
+ }));
15
+ vi.mock("./grok-home.js", () => ({ stageGrokHomeForSync: stageGrokHomeMock }));
16
+ vi.mock("./grok-auth-copyback.js", () => ({ copyBackGrokAuth: vi.fn(async () => { }) }));
17
+ import { existsSync } from "node:fs";
18
+ import { parseGrokModelsOutput, testEnvironment } from "./test.js";
19
+ describe("parseGrokModelsOutput", () => {
20
+ it("extracts auth state and models from `grok models` output", () => {
21
+ expect(parseGrokModelsOutput([
22
+ "You are logged in with grok.com.",
23
+ "",
24
+ "Default model: grok-build",
25
+ "",
26
+ "Available models:",
27
+ " * grok-build (default)",
28
+ " * grok-code",
29
+ ].join("\n"))).toEqual({
30
+ authenticated: true,
31
+ defaultModel: "grok-build",
32
+ models: ["grok-build", "grok-code"],
33
+ });
34
+ });
35
+ });
36
+ describe("grok_local testEnvironment", () => {
37
+ beforeEach(() => {
38
+ ensureDirectoryMock.mockClear();
39
+ ensureCommandMock.mockClear();
40
+ runProcessMock.mockReset();
41
+ prepareRuntimeMock.mockReset();
42
+ stageGrokHomeMock.mockClear();
43
+ });
44
+ it("reports a healthy authenticated host with a working hello probe", async () => {
45
+ runProcessMock
46
+ .mockResolvedValueOnce({
47
+ exitCode: 0,
48
+ signal: null,
49
+ timedOut: false,
50
+ stdout: [
51
+ "You are logged in with grok.com.",
52
+ "",
53
+ "Default model: grok-build",
54
+ "",
55
+ "Available models:",
56
+ " * grok-build (default)",
57
+ ].join("\n"),
58
+ stderr: "",
59
+ })
60
+ .mockResolvedValueOnce({
61
+ exitCode: 0,
62
+ signal: null,
63
+ timedOut: false,
64
+ stdout: [
65
+ JSON.stringify({ type: "text", data: "hello" }),
66
+ JSON.stringify({ type: "end", stopReason: "EndTurn", sessionId: "sess-1", requestId: "req-1" }),
67
+ ].join("\n"),
68
+ stderr: "",
69
+ });
70
+ const result = await testEnvironment({
71
+ companyId: "company-1",
72
+ adapterType: "grok_local",
73
+ config: {
74
+ command: "grok",
75
+ cwd: "/tmp/project",
76
+ model: "grok-build",
77
+ },
78
+ });
79
+ expect(result.status).toBe("pass");
80
+ expect(result.checks.map((check) => check.code)).toEqual(expect.arrayContaining([
81
+ "grok_command_resolvable",
82
+ "grok_models_probe_passed",
83
+ "grok_model_configured",
84
+ "grok_hello_probe_passed",
85
+ ]));
86
+ expect(runProcessMock).toHaveBeenNthCalledWith(2, expect.any(String), null, "grok", expect.arrayContaining([
87
+ "--output-format",
88
+ "streaming-json",
89
+ "--always-approve",
90
+ "--permission-mode",
91
+ "dontAsk",
92
+ "--disable-web-search",
93
+ "--single",
94
+ "Respond with exactly hello.",
95
+ ]), expect.any(Object));
96
+ });
97
+ it("does not warn when the default-sentinel model is absent from the real model list", async () => {
98
+ // Real grok never lists the "grok-build" sentinel; execute.ts never sends
99
+ // it. The probe must treat the default as valid (info), not warn.
100
+ runProcessMock
101
+ .mockResolvedValueOnce({
102
+ exitCode: 0,
103
+ signal: null,
104
+ timedOut: false,
105
+ stdout: [
106
+ "You are logged in with grok.com.",
107
+ "",
108
+ "Default model: grok-4.20-0309-non-reasoning",
109
+ "",
110
+ "Available models:",
111
+ " * grok-4.20-0309-non-reasoning (default)",
112
+ " * grok-4",
113
+ ].join("\n"),
114
+ stderr: "",
115
+ })
116
+ .mockResolvedValueOnce({
117
+ exitCode: 0,
118
+ signal: null,
119
+ timedOut: false,
120
+ stdout: [
121
+ JSON.stringify({ type: "text", data: "hello" }),
122
+ JSON.stringify({ type: "end", stopReason: "EndTurn", sessionId: "s", requestId: "r" }),
123
+ ].join("\n"),
124
+ stderr: "",
125
+ });
126
+ const result = await testEnvironment({
127
+ companyId: "company-1",
128
+ adapterType: "grok_local",
129
+ config: { command: "grok", cwd: "/tmp/project" }, // no model → default sentinel
130
+ });
131
+ const codes = result.checks.map((check) => check.code);
132
+ expect(codes).toContain("grok_model_configured");
133
+ expect(codes).not.toContain("grok_model_not_found");
134
+ expect(result.status).toBe("pass");
135
+ });
136
+ it("warns when an explicitly configured real model is not available", async () => {
137
+ runProcessMock
138
+ .mockResolvedValueOnce({
139
+ exitCode: 0,
140
+ signal: null,
141
+ timedOut: false,
142
+ stdout: [
143
+ "You are logged in with grok.com.",
144
+ "",
145
+ "Default model: grok-4",
146
+ "",
147
+ "Available models:",
148
+ " * grok-4",
149
+ ].join("\n"),
150
+ stderr: "",
151
+ })
152
+ .mockResolvedValueOnce({
153
+ exitCode: 0,
154
+ signal: null,
155
+ timedOut: false,
156
+ stdout: [
157
+ JSON.stringify({ type: "text", data: "hello" }),
158
+ JSON.stringify({ type: "end", stopReason: "EndTurn", sessionId: "s", requestId: "r" }),
159
+ ].join("\n"),
160
+ stderr: "",
161
+ });
162
+ const result = await testEnvironment({
163
+ companyId: "company-1",
164
+ adapterType: "grok_local",
165
+ config: { command: "grok", cwd: "/tmp/project", model: "grok-nonexistent" },
166
+ });
167
+ expect(result.checks.map((check) => check.code)).toContain("grok_model_not_found");
168
+ });
169
+ it("downgrades auth failures to warnings", async () => {
170
+ runProcessMock
171
+ .mockResolvedValueOnce({
172
+ exitCode: 1,
173
+ signal: null,
174
+ timedOut: false,
175
+ stdout: "",
176
+ stderr: "Not logged in. Run `grok login`.",
177
+ })
178
+ .mockResolvedValueOnce({
179
+ exitCode: 1,
180
+ signal: null,
181
+ timedOut: false,
182
+ stdout: "",
183
+ stderr: "Not logged in. Run `grok login`.",
184
+ });
185
+ const result = await testEnvironment({
186
+ companyId: "company-1",
187
+ adapterType: "grok_local",
188
+ config: {
189
+ command: "grok",
190
+ cwd: "/tmp/project",
191
+ },
192
+ });
193
+ expect(result.status).toBe("warn");
194
+ expect(result.checks.map((check) => check.code)).toEqual(expect.arrayContaining([
195
+ "grok_auth_required",
196
+ "grok_hello_probe_auth_required",
197
+ ]));
198
+ });
199
+ it("emits the canonical adapter_auth_missing check for a sandbox target with missing authentication", async () => {
200
+ // The user interface reads this neutral canonical code to decide login
201
+ // eligibility for the sandbox; it does not parse the message text.
202
+ runProcessMock
203
+ .mockResolvedValueOnce({
204
+ exitCode: 1,
205
+ signal: null,
206
+ timedOut: false,
207
+ stdout: "",
208
+ stderr: "Not logged in. Run `grok login`.",
209
+ })
210
+ .mockResolvedValueOnce({
211
+ exitCode: 1,
212
+ signal: null,
213
+ timedOut: false,
214
+ stdout: "",
215
+ stderr: "Not logged in. Run `grok login`.",
216
+ });
217
+ const result = await testEnvironment({
218
+ companyId: "company-1",
219
+ adapterType: "grok_local",
220
+ config: { command: "grok", cwd: "/tmp/project" },
221
+ executionTarget: { kind: "remote", transport: "sandbox" },
222
+ });
223
+ expect(result.checks.some((check) => check.code === "adapter_auth_missing")).toBe(true);
224
+ });
225
+ it("stages the managed account through a host temp workspace, never the remote cwd", async () => {
226
+ // The remote cwd is a path inside the sandbox. Handing it to the runtime
227
+ // as `workspaceLocalDir` made the host-side ignore scan fail on a
228
+ // directory that does not exist (git-ignore-scan-failed in production).
229
+ let workspaceLocalDirAtCall;
230
+ let workspaceExistedAtCall;
231
+ prepareRuntimeMock.mockImplementationOnce(async (input) => {
232
+ workspaceLocalDirAtCall = input.workspaceLocalDir;
233
+ workspaceExistedAtCall = existsSync(input.workspaceLocalDir);
234
+ return { assetDirs: { home: "/sandbox/assets/home" }, restoreWorkspace: async () => { } };
235
+ });
236
+ runProcessMock
237
+ .mockResolvedValueOnce({ exitCode: 0, signal: null, timedOut: false, stdout: "You are logged in with grok.com.\n\nDefault model: grok-4\n\nAvailable models:\n * grok-4", stderr: "" })
238
+ .mockResolvedValueOnce({ exitCode: 0, signal: null, timedOut: false, stdout: [JSON.stringify({ type: "text", data: "hello" }), JSON.stringify({ type: "end", stopReason: "EndTurn", sessionId: "s", requestId: "r" })].join("\n"), stderr: "" });
239
+ const result = await testEnvironment({
240
+ companyId: "company-1",
241
+ adapterType: "grok_local",
242
+ config: { command: "grok", cwd: "/sandbox/workspace", managedAiConnection: { provider: "xai" } },
243
+ executionTarget: { kind: "remote", transport: "sandbox" },
244
+ });
245
+ expect(prepareRuntimeMock).toHaveBeenCalledOnce();
246
+ expect(prepareRuntimeMock).toHaveBeenCalledWith(expect.objectContaining({ workspaceRemoteDir: "/sandbox/workspace" }));
247
+ expect(workspaceLocalDirAtCall).not.toBe("/sandbox/workspace");
248
+ expect(workspaceExistedAtCall).toBe(true);
249
+ // The staged home dir the runtime uploaded is what the probe must use.
250
+ expect(runProcessMock.mock.calls[0]?.[4]).toMatchObject({ env: expect.objectContaining({ GROK_HOME: "/sandbox/assets/home" }) });
251
+ expect(result.status).toBe("pass");
252
+ });
253
+ it("reports a failed runtime preparation as a check instead of crashing", async () => {
254
+ prepareRuntimeMock.mockRejectedValueOnce(new Error("Workspace ignore scan failed: git-ignore-scan-failed"));
255
+ const result = await testEnvironment({
256
+ companyId: "company-1",
257
+ adapterType: "grok_local",
258
+ config: { command: "grok", cwd: "/sandbox/workspace", managedAiConnection: { provider: "xai" } },
259
+ executionTarget: { kind: "remote", transport: "sandbox" },
260
+ });
261
+ expect(result.status).toBe("fail");
262
+ const unprepared = result.checks.find((check) => check.code === "grok_environment_unprepared");
263
+ expect(unprepared).toMatchObject({ level: "error" });
264
+ // A failed staging means there is no environment worth probing.
265
+ expect(runProcessMock).not.toHaveBeenCalled();
266
+ });
267
+ it("emits no adapter_auth_missing check for a local target with missing authentication", async () => {
268
+ // The canonical check gates sandbox login eligibility only. A local target
269
+ // has no sandbox login to offer, so the check must not appear.
270
+ runProcessMock
271
+ .mockResolvedValueOnce({
272
+ exitCode: 1,
273
+ signal: null,
274
+ timedOut: false,
275
+ stdout: "",
276
+ stderr: "Not logged in. Run `grok login`.",
277
+ })
278
+ .mockResolvedValueOnce({
279
+ exitCode: 1,
280
+ signal: null,
281
+ timedOut: false,
282
+ stdout: "",
283
+ stderr: "Not logged in. Run `grok login`.",
284
+ });
285
+ const result = await testEnvironment({
286
+ companyId: "company-1",
287
+ adapterType: "grok_local",
288
+ config: { command: "grok", cwd: "/tmp/project" },
289
+ });
290
+ expect(result.checks.some((check) => check.code === "adapter_auth_missing")).toBe(false);
291
+ });
292
+ });
293
+ //# 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,7 @@
1
+ export interface TurnBoundaryState {
2
+ lastChunk: string;
3
+ backtickParity: 0 | 1;
4
+ }
5
+ export declare function createTurnBoundaryState(): TurnBoundaryState;
6
+ export declare function applyTurnBoundary(state: TurnBoundaryState, incoming: string): string;
7
+ //# sourceMappingURL=turn-boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-boundary.d.ts","sourceRoot":"","sources":["../../src/shared/turn-boundary.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC;CACvB;AAED,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D;AAYD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA4BpF"}
@@ -0,0 +1,44 @@
1
+ // Grok's `--output-format streaming-json` mode emits `thought` and `text` events
2
+ // token-by-token. Between reasoning turns (around tool calls) it drops the `\n`
3
+ // separator that the non-streaming `--output-format json` mode includes in the
4
+ // aggregated `thought` field. This helper inserts a single `\n` when a new chunk
5
+ // would otherwise glue two turns together (e.g. ``"`"`` then `"The"` => `` `The``).
6
+ export function createTurnBoundaryState() {
7
+ return { lastChunk: "", backtickParity: 0 };
8
+ }
9
+ function countBackticks(text) {
10
+ let count = 0;
11
+ for (const ch of text)
12
+ if (ch === "`")
13
+ count += 1;
14
+ return count;
15
+ }
16
+ function endsWithSentenceClose(ch) {
17
+ return ch === "." || ch === "?" || ch === "!" || ch === ":" || ch === ";";
18
+ }
19
+ export function applyTurnBoundary(state, incoming) {
20
+ if (!incoming)
21
+ return incoming;
22
+ let output = incoming;
23
+ const prev = state.lastChunk;
24
+ if (prev &&
25
+ !/\s$/.test(prev) &&
26
+ !/^\s/.test(incoming) &&
27
+ /^[A-Z]/.test(incoming) &&
28
+ incoming.length >= 2) {
29
+ const lastChar = prev[prev.length - 1];
30
+ // Narrow the backtick trigger to a lone closing-backtick chunk (e.g. the
31
+ // stream "...`", "ls", "`" then "The"). A compound chunk like "`ls`" is a
32
+ // self-contained span and the following capitalized word is a continuation,
33
+ // not a new turn.
34
+ const closingLoneBacktick = prev === "`" && state.backtickParity === 0;
35
+ const looksLikeNewTurn = endsWithSentenceClose(lastChar) || closingLoneBacktick;
36
+ if (looksLikeNewTurn) {
37
+ output = `\n${incoming}`;
38
+ }
39
+ }
40
+ state.lastChunk = incoming;
41
+ state.backtickParity = ((state.backtickParity + countBackticks(incoming)) % 2);
42
+ return output;
43
+ }
44
+ //# sourceMappingURL=turn-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-boundary.js","sourceRoot":"","sources":["../../src/shared/turn-boundary.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,gFAAgF;AAChF,+EAA+E;AAC/E,iFAAiF;AACjF,oFAAoF;AAOpF,MAAM,UAAU,uBAAuB;IACrC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,IAAI;QAAE,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,EAAU;IACvC,OAAO,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAwB,EAAE,QAAgB;IAC1E,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE/B,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;IAC7B,IACE,IAAI;QACJ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACjB,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvB,QAAQ,CAAC,MAAM,IAAI,CAAC,EACpB,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QACxC,yEAAyE;QACzE,0EAA0E;QAC1E,4EAA4E;QAC5E,kBAAkB;QAClB,MAAM,mBAAmB,GACvB,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,CAAC;QAC7C,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,QAAQ,CAAC,IAAI,mBAAmB,CAAC;QAChF,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAU,CAAC;IACxF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=turn-boundary.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-boundary.test.d.ts","sourceRoot":"","sources":["../../src/shared/turn-boundary.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { applyTurnBoundary, createTurnBoundaryState } from "./turn-boundary.js";
3
+ function run(chunks) {
4
+ const state = createTurnBoundaryState();
5
+ return chunks.map((chunk) => applyTurnBoundary(state, chunk)).join("");
6
+ }
7
+ describe("applyTurnBoundary", () => {
8
+ it("inserts a newline when a closing backtick is followed by a new capitalized turn", () => {
9
+ expect(run(["The user uses `", "ls", "`", "The", " `", "ls", "`", " returned"]))
10
+ .toBe("The user uses `ls`\nThe `ls` returned");
11
+ });
12
+ it("inserts a newline after sentence-ending punctuation glued to a capitalized word", () => {
13
+ expect(run(["returned", ":", "Confirmed", ":", " 4 files"]))
14
+ .toBe("returned:\nConfirmed: 4 files");
15
+ });
16
+ it("does not break apart backtick-wrapped CamelCase identifiers within a turn", () => {
17
+ expect(run(["render `", "React", "` then "]))
18
+ .toBe("render `React` then ");
19
+ });
20
+ it("leaves natural token streams with proper whitespace alone", () => {
21
+ expect(run(["The", " user", " wants", " me", " to", ":\n", "1", ".", " List"]))
22
+ .toBe("The user wants me to:\n1. List");
23
+ });
24
+ it("does not insert a separator when the next chunk starts with whitespace", () => {
25
+ expect(run(["function", ".", " They"]))
26
+ .toBe("function. They");
27
+ });
28
+ it("does not insert a separator when the next chunk starts lowercase", () => {
29
+ expect(run(["`", "ls", "`"]))
30
+ .toBe("`ls`");
31
+ });
32
+ it("does not insert a separator when the next chunk is a single character", () => {
33
+ expect(run([":", "A"]))
34
+ .toBe(":A");
35
+ });
36
+ it("does not insert a separator after a self-contained backtick span in a single chunk", () => {
37
+ // Greptile review: a chunk like "`ls`" is a balanced span; the following
38
+ // capitalized word should be treated as a continuation, not a new turn.
39
+ expect(run(["`ls`", "Then"]))
40
+ .toBe("`ls`Then");
41
+ });
42
+ });
43
+ //# sourceMappingURL=turn-boundary.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-boundary.test.js","sourceRoot":"","sources":["../../src/shared/turn-boundary.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,SAAS,GAAG,CAAC,MAAgB;IAC3B,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAC;IACxC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;aAC7E,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;aACzD,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;aAC1C,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;aAC5E,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;aACpC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;aAC1B,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;aACpB,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,yEAAyE;QACzE,wEAAwE;QACxE,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;aAC1B,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type CreateConfigValues } from "@tickernelz/paperclip-pro-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,EAAyB,KAAK,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAUzG,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAcnF"}
@@ -0,0 +1,29 @@
1
+ import { buildAdapterEnvConfig } from "@tickernelz/paperclip-pro-adapter-utils";
2
+ import { DEFAULT_GROK_LOCAL_MODEL } from "../index.js";
3
+ function parseCommaArgs(value) {
4
+ return value
5
+ .split(",")
6
+ .map((item) => item.trim())
7
+ .filter(Boolean);
8
+ }
9
+ export function buildGrokLocalConfig(v) {
10
+ const ac = {};
11
+ if (v.cwd)
12
+ ac.cwd = v.cwd;
13
+ if (v.instructionsFilePath)
14
+ ac.instructionsFilePath = v.instructionsFilePath;
15
+ ac.model = v.model || DEFAULT_GROK_LOCAL_MODEL;
16
+ ac.timeoutSec = 0;
17
+ ac.graceSec = 20;
18
+ if (v.thinkingEffort)
19
+ ac.reasoningEffort = v.thinkingEffort;
20
+ const env = buildAdapterEnvConfig(v.envBindings, v.envVars);
21
+ if (Object.keys(env).length > 0)
22
+ ac.env = env;
23
+ if (v.command)
24
+ ac.command = v.command;
25
+ if (v.extraArgs)
26
+ ac.extraArgs = parseCommaArgs(v.extraArgs);
27
+ return ac;
28
+ }
29
+ //# sourceMappingURL=build-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.js","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAA2B,MAAM,yCAAyC,CAAC;AACzG,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,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,qBAAqB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5D,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, createGrokStdoutParser } 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,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { parseGrokStdoutLine, createGrokStdoutParser } 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,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TranscriptEntry } from "@tickernelz/paperclip-pro-adapter-utils";
2
+ export declare function createGrokStdoutParser(): {
3
+ parseLine(line: string, ts: string): TranscriptEntry[];
4
+ reset(): void;
5
+ };
6
+ export declare function parseGrokStdoutLine(line: string, ts: string): TranscriptEntry[];
7
+ //# 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,yCAAyC,CAAC;AAqE/E,wBAAgB,sBAAsB;IAGlC,SAAS,OAAO,MAAM,MAAM,MAAM,GAAG,eAAe,EAAE;IAGtD,KAAK;EAIR;AAKD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,EAAE,CAE/E"}
@@ -0,0 +1,76 @@
1
+ import { applyTurnBoundary, createTurnBoundaryState } from "../shared/turn-boundary.js";
2
+ function safeJsonParse(text) {
3
+ try {
4
+ return JSON.parse(text);
5
+ }
6
+ catch {
7
+ return null;
8
+ }
9
+ }
10
+ function asRecord(value) {
11
+ if (typeof value !== "object" || value === null || Array.isArray(value))
12
+ return null;
13
+ return value;
14
+ }
15
+ function asString(value, fallback = "") {
16
+ return typeof value === "string" ? value : fallback;
17
+ }
18
+ function extractErrorText(value) {
19
+ if (typeof value === "string")
20
+ return value;
21
+ const record = asRecord(value);
22
+ if (!record)
23
+ return "";
24
+ return asString(record.message) || asString(record.detail) || asString(record.code);
25
+ }
26
+ function parseLineInternal(line, ts, thoughtBoundary) {
27
+ const parsed = asRecord(safeJsonParse(line));
28
+ if (!parsed) {
29
+ return [{ kind: "stdout", ts, text: line }];
30
+ }
31
+ const type = asString(parsed.type).trim();
32
+ if (type === "thought") {
33
+ const text = asString(parsed.data);
34
+ if (!text)
35
+ return [];
36
+ return [{ kind: "thinking", ts, text: applyTurnBoundary(thoughtBoundary, text), delta: true }];
37
+ }
38
+ if (type === "text") {
39
+ const text = asString(parsed.data);
40
+ if (!text)
41
+ return [];
42
+ return [{ kind: "assistant", ts, text, delta: true }];
43
+ }
44
+ if (type === "error") {
45
+ const text = asString(parsed.data) || asString(parsed.message) || extractErrorText(parsed.error);
46
+ return text ? [{ kind: "stderr", ts, text }] : [{ kind: "stderr", ts, text: "Grok error" }];
47
+ }
48
+ if (type === "end") {
49
+ const stopReason = asString(parsed.stopReason).trim();
50
+ const sessionId = asString(parsed.sessionId).trim();
51
+ const parts = [
52
+ stopReason ? `stop_reason=${stopReason}` : "",
53
+ sessionId ? `session=${sessionId}` : "",
54
+ ].filter(Boolean);
55
+ return [{ kind: "system", ts, text: parts.join(" ") || "run completed" }];
56
+ }
57
+ return [{ kind: "system", ts, text: `event: ${type || "unknown"}` }];
58
+ }
59
+ export function createGrokStdoutParser() {
60
+ let thoughtBoundary = createTurnBoundaryState();
61
+ return {
62
+ parseLine(line, ts) {
63
+ return parseLineInternal(line, ts, thoughtBoundary);
64
+ },
65
+ reset() {
66
+ thoughtBoundary = createTurnBoundaryState();
67
+ },
68
+ };
69
+ }
70
+ // Stateless fallback for callers that haven't migrated to the stateful factory.
71
+ // Without state, consecutive thought chunks at reasoning-turn boundaries can
72
+ // still appear merged; prefer createGrokStdoutParser for live transcripts.
73
+ export function parseGrokStdoutLine(line, ts) {
74
+ return parseLineInternal(line, ts, createTurnBoundaryState());
75
+ }
76
+ //# sourceMappingURL=parse-stdout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.js","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-stdout.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.test.d.ts","sourceRoot":"","sources":["../../src/ui/parse-stdout.test.ts"],"names":[],"mappings":""}