@tickernelz/paperclip-pro-adapter-gemini-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 (86) 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 +223 -0
  5. package/dist/cli/format-event.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +2 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +63 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/server/acp.d.ts +19 -0
  15. package/dist/server/acp.d.ts.map +1 -0
  16. package/dist/server/acp.js +404 -0
  17. package/dist/server/acp.js.map +1 -0
  18. package/dist/server/acp.test.d.ts +2 -0
  19. package/dist/server/acp.test.d.ts.map +1 -0
  20. package/dist/server/acp.test.js +662 -0
  21. package/dist/server/acp.test.js.map +1 -0
  22. package/dist/server/config-schema.d.ts +3 -0
  23. package/dist/server/config-schema.d.ts.map +1 -0
  24. package/dist/server/config-schema.js +67 -0
  25. package/dist/server/config-schema.js.map +1 -0
  26. package/dist/server/engine-availability.test.d.ts +2 -0
  27. package/dist/server/engine-availability.test.d.ts.map +1 -0
  28. package/dist/server/engine-availability.test.js +41 -0
  29. package/dist/server/engine-availability.test.js.map +1 -0
  30. package/dist/server/execute.acp-fallback.test.d.ts +2 -0
  31. package/dist/server/execute.acp-fallback.test.d.ts.map +1 -0
  32. package/dist/server/execute.acp-fallback.test.js +130 -0
  33. package/dist/server/execute.acp-fallback.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 +625 -0
  37. package/dist/server/execute.js.map +1 -0
  38. package/dist/server/execute.remote.test.d.ts +2 -0
  39. package/dist/server/execute.remote.test.d.ts.map +1 -0
  40. package/dist/server/execute.remote.test.js +377 -0
  41. package/dist/server/execute.remote.test.js.map +1 -0
  42. package/dist/server/index.d.ts +9 -0
  43. package/dist/server/index.d.ts.map +1 -0
  44. package/dist/server/index.js +67 -0
  45. package/dist/server/index.js.map +1 -0
  46. package/dist/server/parse.d.ts +39 -0
  47. package/dist/server/parse.d.ts.map +1 -0
  48. package/dist/server/parse.js +268 -0
  49. package/dist/server/parse.js.map +1 -0
  50. package/dist/server/parse.test.d.ts +2 -0
  51. package/dist/server/parse.test.d.ts.map +1 -0
  52. package/dist/server/parse.test.js +166 -0
  53. package/dist/server/parse.test.js.map +1 -0
  54. package/dist/server/skills.d.ts +8 -0
  55. package/dist/server/skills.d.ts.map +1 -0
  56. package/dist/server/skills.js +69 -0
  57. package/dist/server/skills.js.map +1 -0
  58. package/dist/server/test.d.ts +3 -0
  59. package/dist/server/test.d.ts.map +1 -0
  60. package/dist/server/test.js +270 -0
  61. package/dist/server/test.js.map +1 -0
  62. package/dist/server/utils.d.ts +2 -0
  63. package/dist/server/utils.d.ts.map +1 -0
  64. package/dist/server/utils.js +7 -0
  65. package/dist/server/utils.js.map +1 -0
  66. package/dist/ui/build-config.d.ts +3 -0
  67. package/dist/ui/build-config.d.ts.map +1 -0
  68. package/dist/ui/build-config.js +39 -0
  69. package/dist/ui/build-config.js.map +1 -0
  70. package/dist/ui/build-config.test.d.ts +2 -0
  71. package/dist/ui/build-config.test.d.ts.map +1 -0
  72. package/dist/ui/build-config.test.js +63 -0
  73. package/dist/ui/build-config.test.js.map +1 -0
  74. package/dist/ui/index.d.ts +3 -0
  75. package/dist/ui/index.d.ts.map +1 -0
  76. package/dist/ui/index.js +3 -0
  77. package/dist/ui/index.js.map +1 -0
  78. package/dist/ui/parse-stdout.d.ts +3 -0
  79. package/dist/ui/parse-stdout.d.ts.map +1 -0
  80. package/dist/ui/parse-stdout.js +265 -0
  81. package/dist/ui/parse-stdout.js.map +1 -0
  82. package/dist/ui/parse-stdout.test.d.ts +2 -0
  83. package/dist/ui/parse-stdout.test.d.ts.map +1 -0
  84. package/dist/ui/parse-stdout.test.js +73 -0
  85. package/dist/ui/parse-stdout.test.js.map +1 -0
  86. package/package.json +58 -0
@@ -0,0 +1,270 @@
1
+ import path from "node:path";
2
+ import { asBoolean, asNumber, asString, asStringArray, ensurePathInEnv, parseObject, } from "@tickernelz/paperclip-pro-adapter-utils/server-utils";
3
+ import { ensureAdapterExecutionTargetCommandResolvable, maybeRunSandboxInstallCommand, ensureAdapterExecutionTargetDirectory, runAdapterExecutionTargetProcess, describeAdapterExecutionTarget, resolveAdapterExecutionTargetCwd, } from "@tickernelz/paperclip-pro-adapter-utils/execution-target";
4
+ import { DEFAULT_GEMINI_LOCAL_MODEL, SANDBOX_INSTALL_COMMAND } from "../index.js";
5
+ import { detectGeminiAuthRequired, detectGeminiQuotaExhausted, parseGeminiJsonl } from "./parse.js";
6
+ import { firstNonEmptyLine } from "./utils.js";
7
+ import { resolveGeminiExecutionEngineForRun, testGeminiAcpEnvironment, } from "./acp.js";
8
+ function summarizeStatus(checks) {
9
+ if (checks.some((check) => check.level === "error"))
10
+ return "fail";
11
+ if (checks.some((check) => check.level === "warn"))
12
+ return "warn";
13
+ return "pass";
14
+ }
15
+ function isNonEmpty(value) {
16
+ return typeof value === "string" && value.trim().length > 0;
17
+ }
18
+ function commandLooksLike(command, expected) {
19
+ const base = path.basename(command).toLowerCase();
20
+ return base === expected || base === `${expected}.cmd` || base === `${expected}.exe`;
21
+ }
22
+ function summarizeProbeDetail(stdout, stderr, parsedError) {
23
+ const raw = parsedError?.trim() || firstNonEmptyLine(stderr) || firstNonEmptyLine(stdout);
24
+ if (!raw)
25
+ return null;
26
+ const clean = raw.replace(/\s+/g, " ").trim();
27
+ const max = 240;
28
+ return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;
29
+ }
30
+ export async function testEnvironment(ctx) {
31
+ const engineSelection = await resolveGeminiExecutionEngineForRun({
32
+ config: parseObject(ctx.config),
33
+ executionTarget: ctx.executionTarget,
34
+ });
35
+ if (engineSelection.unavailableReason) {
36
+ return {
37
+ adapterType: "gemini_local",
38
+ status: "fail",
39
+ checks: [{
40
+ code: "adapter_engine_unavailable",
41
+ level: "error",
42
+ message: engineSelection.unavailableReason,
43
+ }],
44
+ testedAt: new Date().toISOString(),
45
+ };
46
+ }
47
+ if (engineSelection.engine === "acp") {
48
+ return testGeminiAcpEnvironment(ctx);
49
+ }
50
+ const checks = [];
51
+ const config = parseObject(ctx.config);
52
+ const command = asString(config.command, "gemini");
53
+ const target = ctx.executionTarget ?? null;
54
+ const targetIsRemote = target?.kind === "remote";
55
+ const cwd = resolveAdapterExecutionTargetCwd(target, asString(config.cwd, ""), process.cwd());
56
+ const targetLabel = targetIsRemote
57
+ ? ctx.environmentName ?? describeAdapterExecutionTarget(target)
58
+ : null;
59
+ const runId = `gemini-envtest-${Date.now()}-${Math.random().toString(16).slice(2)}`;
60
+ if (targetLabel) {
61
+ checks.push({
62
+ code: "gemini_environment_target",
63
+ level: "info",
64
+ message: `Probing inside environment: ${targetLabel}`,
65
+ });
66
+ }
67
+ try {
68
+ await ensureAdapterExecutionTargetDirectory(runId, target, cwd, {
69
+ cwd,
70
+ env: {},
71
+ createIfMissing: true,
72
+ });
73
+ checks.push({
74
+ code: "gemini_cwd_valid",
75
+ level: "info",
76
+ message: `Working directory is valid: ${cwd}`,
77
+ });
78
+ }
79
+ catch (err) {
80
+ checks.push({
81
+ code: "gemini_cwd_invalid",
82
+ level: "error",
83
+ message: err instanceof Error ? err.message : "Invalid working directory",
84
+ detail: cwd,
85
+ });
86
+ }
87
+ const envConfig = parseObject(config.env);
88
+ const env = {};
89
+ for (const [key, value] of Object.entries(envConfig)) {
90
+ if (typeof value === "string")
91
+ env[key] = value;
92
+ }
93
+ if (targetIsRemote && typeof env.GEMINI_CLI_TRUST_WORKSPACE !== "string") {
94
+ env.GEMINI_CLI_TRUST_WORKSPACE = "true";
95
+ }
96
+ const runtimeEnv = ensurePathInEnv({ ...process.env, ...env });
97
+ const installCheck = await maybeRunSandboxInstallCommand({
98
+ runId,
99
+ target,
100
+ adapterKey: "gemini",
101
+ installCommand: SANDBOX_INSTALL_COMMAND,
102
+ detectCommand: command,
103
+ env,
104
+ });
105
+ if (installCheck)
106
+ checks.push(installCheck);
107
+ try {
108
+ await ensureAdapterExecutionTargetCommandResolvable(command, target, cwd, runtimeEnv);
109
+ checks.push({
110
+ code: "gemini_command_resolvable",
111
+ level: "info",
112
+ message: `Command is executable: ${command}`,
113
+ });
114
+ }
115
+ catch (err) {
116
+ checks.push({
117
+ code: "gemini_command_unresolvable",
118
+ level: "error",
119
+ message: err instanceof Error ? err.message : "Command is not executable",
120
+ detail: command,
121
+ });
122
+ }
123
+ const configGeminiApiKey = env.GEMINI_API_KEY;
124
+ const hostGeminiApiKey = targetIsRemote ? undefined : process.env.GEMINI_API_KEY;
125
+ const configGoogleApiKey = env.GOOGLE_API_KEY;
126
+ const hostGoogleApiKey = targetIsRemote ? undefined : process.env.GOOGLE_API_KEY;
127
+ const hasGca = env.GOOGLE_GENAI_USE_GCA === "true" || (!targetIsRemote && process.env.GOOGLE_GENAI_USE_GCA === "true");
128
+ if (isNonEmpty(configGeminiApiKey) ||
129
+ isNonEmpty(hostGeminiApiKey) ||
130
+ isNonEmpty(configGoogleApiKey) ||
131
+ isNonEmpty(hostGoogleApiKey) ||
132
+ hasGca) {
133
+ const source = hasGca
134
+ ? "Google account login (GCA)"
135
+ : isNonEmpty(configGeminiApiKey) || isNonEmpty(configGoogleApiKey)
136
+ ? "adapter config env"
137
+ : "server environment";
138
+ checks.push({
139
+ code: "gemini_api_key_present",
140
+ level: "info",
141
+ message: "Gemini API credentials are set for CLI authentication.",
142
+ detail: `Detected in ${source}.`,
143
+ });
144
+ }
145
+ else {
146
+ checks.push({
147
+ code: "gemini_api_key_missing",
148
+ level: "info",
149
+ message: "No explicit API key detected. Gemini CLI may still authenticate via `gemini auth login` (OAuth).",
150
+ hint: "If the hello probe fails with an auth error, set GEMINI_API_KEY or GOOGLE_API_KEY in adapter env, or run `gemini auth login`.",
151
+ });
152
+ }
153
+ const canRunProbe = checks.every((check) => check.code !== "gemini_cwd_invalid" && check.code !== "gemini_command_unresolvable");
154
+ if (canRunProbe) {
155
+ if (!commandLooksLike(command, "gemini")) {
156
+ checks.push({
157
+ code: "gemini_hello_probe_skipped_custom_command",
158
+ level: "info",
159
+ message: "Skipped hello probe because command is not `gemini`.",
160
+ detail: command,
161
+ hint: "Use the `gemini` CLI command to run the automatic installation and auth probe.",
162
+ });
163
+ }
164
+ else {
165
+ const model = asString(config.model, DEFAULT_GEMINI_LOCAL_MODEL).trim();
166
+ const approvalMode = asString(config.approvalMode, asBoolean(config.yolo, true) ? "yolo" : "default");
167
+ const sandbox = asBoolean(config.sandbox, false);
168
+ const helloProbeTimeoutSec = Math.max(1, asNumber(config.helloProbeTimeoutSec, 60));
169
+ const extraArgs = (() => {
170
+ const fromExtraArgs = asStringArray(config.extraArgs);
171
+ if (fromExtraArgs.length > 0)
172
+ return fromExtraArgs;
173
+ return asStringArray(config.args);
174
+ })();
175
+ const args = ["--output-format", "stream-json", "--prompt", "Respond with hello."];
176
+ if (model && model !== DEFAULT_GEMINI_LOCAL_MODEL)
177
+ args.push("--model", model);
178
+ if (approvalMode !== "default")
179
+ args.push("--approval-mode", approvalMode);
180
+ if (sandbox) {
181
+ args.push("--sandbox");
182
+ }
183
+ else {
184
+ args.push("--sandbox=none");
185
+ }
186
+ if (extraArgs.length > 0)
187
+ args.push(...extraArgs);
188
+ const probe = await runAdapterExecutionTargetProcess(runId, target, command, args, {
189
+ cwd,
190
+ env,
191
+ timeoutSec: helloProbeTimeoutSec,
192
+ graceSec: 5,
193
+ onLog: async () => { },
194
+ });
195
+ const parsed = parseGeminiJsonl(probe.stdout);
196
+ const detail = summarizeProbeDetail(probe.stdout, probe.stderr, parsed.errorMessage);
197
+ const authMeta = detectGeminiAuthRequired({
198
+ parsed: parsed.resultEvent,
199
+ stdout: probe.stdout,
200
+ stderr: probe.stderr,
201
+ });
202
+ const quotaMeta = detectGeminiQuotaExhausted({
203
+ parsed: parsed.resultEvent,
204
+ stdout: probe.stdout,
205
+ stderr: probe.stderr,
206
+ });
207
+ if (quotaMeta.exhausted) {
208
+ checks.push({
209
+ code: "gemini_hello_probe_quota_exhausted",
210
+ level: "warn",
211
+ message: probe.timedOut
212
+ ? "Gemini CLI is retrying after quota exhaustion."
213
+ : "Gemini CLI authentication is configured, but the current account or API key is over quota.",
214
+ ...(detail ? { detail } : {}),
215
+ hint: "The configured Gemini account or API key is over quota. Check ai.google.dev usage/billing, then retry the probe.",
216
+ });
217
+ }
218
+ else if (probe.timedOut) {
219
+ checks.push({
220
+ code: "gemini_hello_probe_timed_out",
221
+ level: "warn",
222
+ message: "Gemini hello probe timed out.",
223
+ hint: "Retry the probe. If this persists, verify Gemini can run `Respond with hello.` from this directory manually.",
224
+ });
225
+ }
226
+ else if ((probe.exitCode ?? 1) === 0) {
227
+ const summary = parsed.summary.trim();
228
+ const hasHello = /\bhello\b/i.test(summary);
229
+ checks.push({
230
+ code: hasHello ? "gemini_hello_probe_passed" : "gemini_hello_probe_unexpected_output",
231
+ level: hasHello ? "info" : "warn",
232
+ message: hasHello
233
+ ? "Gemini hello probe succeeded."
234
+ : "Gemini probe ran but did not return `hello` as expected.",
235
+ ...(summary ? { detail: summary.replace(/\s+/g, " ").trim().slice(0, 240) } : {}),
236
+ ...(hasHello
237
+ ? {}
238
+ : {
239
+ hint: "Try `gemini --output-format json \"Respond with hello.\"` manually to inspect full output.",
240
+ }),
241
+ });
242
+ }
243
+ else if (authMeta.requiresAuth) {
244
+ checks.push({
245
+ code: "gemini_hello_probe_auth_required",
246
+ level: "warn",
247
+ message: "Gemini CLI is installed, but authentication is not ready.",
248
+ ...(detail ? { detail } : {}),
249
+ hint: "Run `gemini auth` or configure GEMINI_API_KEY / GOOGLE_API_KEY in adapter env/shell, then retry the probe.",
250
+ });
251
+ }
252
+ else {
253
+ checks.push({
254
+ code: "gemini_hello_probe_failed",
255
+ level: "error",
256
+ message: "Gemini hello probe failed.",
257
+ ...(detail ? { detail } : {}),
258
+ hint: "Run `gemini --output-format json \"Respond with hello.\"` manually in this working directory to debug.",
259
+ });
260
+ }
261
+ }
262
+ }
263
+ return {
264
+ adapterType: ctx.adapterType,
265
+ status: summarizeStatus(checks),
266
+ checks,
267
+ testedAt: new Date().toISOString(),
268
+ };
269
+ }
270
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,OAAO,EACL,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,eAAe,EACf,WAAW,GACZ,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EACL,6CAA6C,EAC7C,6BAA6B,EAC7B,qCAAqC,EACrC,gCAAgC,EAChC,8BAA8B,EAC9B,gCAAgC,GACjC,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EACL,kCAAkC,EAClC,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAElB,SAAS,eAAe,CAAC,MAAiC;IACxD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IACnE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAClE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,QAAgB;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,GAAG,QAAQ,MAAM,IAAI,IAAI,KAAK,GAAG,QAAQ,MAAM,CAAC;AACvF,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc,EAAE,MAAc,EAAE,WAA0B;IACtF,MAAM,GAAG,GAAG,WAAW,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1F,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,CAAC;IAChB,OAAO,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAkC;IAElC,MAAM,eAAe,GAAG,MAAM,kCAAkC,CAAC;QAC/D,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;QAC/B,eAAe,EAAE,GAAG,CAAC,eAAe;KACrC,CAAC,CAAC;IACH,IAAI,eAAe,CAAC,iBAAiB,EAAE,CAAC;QACtC,OAAO;YACL,WAAW,EAAE,cAAc;YAC3B,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,CAAC;oBACP,IAAI,EAAE,4BAA4B;oBAClC,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,eAAe,CAAC,iBAAiB;iBAC3C,CAAC;YACF,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACnC,CAAC;IACJ,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACrC,OAAO,wBAAwB,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC;IAC3C,MAAM,cAAc,GAAG,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC;IACjD,MAAM,GAAG,GAAG,gCAAgC,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9F,MAAM,WAAW,GAAG,cAAc;QAChC,CAAC,CAAC,GAAG,CAAC,eAAe,IAAI,8BAA8B,CAAC,MAAM,CAAC;QAC/D,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,KAAK,GAAG,kBAAkB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,2BAA2B;YACjC,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,+BAA+B,WAAW,EAAE;SACtD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,MAAM,qCAAqC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE;YAC9D,GAAG;YACH,GAAG,EAAE,EAAE;YACP,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,+BAA+B,GAAG,EAAE;SAC9C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B;YACzE,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAClD,CAAC;IACD,IAAI,cAAc,IAAI,OAAO,GAAG,CAAC,0BAA0B,KAAK,QAAQ,EAAE,CAAC;QACzE,GAAG,CAAC,0BAA0B,GAAG,MAAM,CAAC;IAC1C,CAAC;IACD,MAAM,UAAU,GAAG,eAAe,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,6BAA6B,CAAC;QACvD,KAAK;QACL,MAAM;QACN,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,uBAAuB;QACvC,aAAa,EAAE,OAAO;QACtB,GAAG;KACJ,CAAC,CAAC;IACH,IAAI,YAAY;QAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,6CAA6C,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,2BAA2B;YACjC,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,0BAA0B,OAAO,EAAE;SAC7C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,6BAA6B;YACnC,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B;YACzE,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,kBAAkB,GAAG,GAAG,CAAC,cAAc,CAAC;IAC9C,MAAM,gBAAgB,GAAG,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACjF,MAAM,kBAAkB,GAAG,GAAG,CAAC,cAAc,CAAC;IAC9C,MAAM,gBAAgB,GAAG,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACjF,MAAM,MAAM,GAAG,GAAG,CAAC,oBAAoB,KAAK,MAAM,IAAI,CAAC,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM,CAAC,CAAC;IACvH,IACE,UAAU,CAAC,kBAAkB,CAAC;QAC9B,UAAU,CAAC,gBAAgB,CAAC;QAC5B,UAAU,CAAC,kBAAkB,CAAC;QAC9B,UAAU,CAAC,gBAAgB,CAAC;QAC5B,MAAM,EACN,CAAC;QACD,MAAM,MAAM,GAAG,MAAM;YACnB,CAAC,CAAC,4BAA4B;YAC9B,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,UAAU,CAAC,kBAAkB,CAAC;gBAChE,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,oBAAoB,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,wBAAwB;YAC9B,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,wDAAwD;YACjE,MAAM,EAAE,eAAe,MAAM,GAAG;SACjC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,wBAAwB;YAC9B,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,kGAAkG;YAC3G,IAAI,EAAE,+HAA+H;SACtI,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GACf,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,oBAAoB,IAAI,KAAK,CAAC,IAAI,KAAK,6BAA6B,CAAC,CAAC;IAC/G,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,2CAA2C;gBACjD,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,sDAAsD;gBAC/D,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,gFAAgF;aACvF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC,IAAI,EAAE,CAAC;YACxE,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACtG,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,CAAC;YACpF,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE;gBACtB,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACtD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,aAAa,CAAC;gBACnD,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC,CAAC,EAAE,CAAC;YAEL,MAAM,IAAI,GAAG,CAAC,iBAAiB,EAAE,aAAa,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;YACnF,IAAI,KAAK,IAAI,KAAK,KAAK,0BAA0B;gBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC/E,IAAI,YAAY,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YAC3E,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC9B,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;YAElD,MAAM,KAAK,GAAG,MAAM,gCAAgC,CAClD,KAAK,EACL,MAAM,EACN,OAAO,EACP,IAAI,EACJ;gBACE,GAAG;gBACH,GAAG;gBACH,UAAU,EAAE,oBAAoB;gBAChC,QAAQ,EAAE,CAAC;gBACX,KAAK,EAAE,KAAK,IAAI,EAAE,GAAG,CAAC;aACvB,CACF,CAAC;YACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YACrF,MAAM,QAAQ,GAAG,wBAAwB,CAAC;gBACxC,MAAM,EAAE,MAAM,CAAC,WAAW;gBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,0BAA0B,CAAC;gBAC3C,MAAM,EAAE,MAAM,CAAC,WAAW;gBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;YAEH,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,oCAAoC;oBAC1C,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,KAAK,CAAC,QAAQ;wBACrB,CAAC,CAAC,gDAAgD;wBAClD,CAAC,CAAC,4FAA4F;oBAChG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7B,IAAI,EAAE,kHAAkH;iBACzH,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,8BAA8B;oBACpC,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,+BAA+B;oBACxC,IAAI,EAAE,8GAA8G;iBACrH,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,sCAAsC;oBACrF,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oBACjC,OAAO,EAAE,QAAQ;wBACf,CAAC,CAAC,+BAA+B;wBACjC,CAAC,CAAC,0DAA0D;oBAC9D,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjF,GAAG,CAAC,QAAQ;wBACV,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC;4BACA,IAAI,EAAE,4FAA4F;yBACnG,CAAC;iBACL,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,kCAAkC;oBACxC,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,2DAA2D;oBACpE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7B,IAAI,EAAE,4GAA4G;iBACnH,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,2BAA2B;oBACjC,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,4BAA4B;oBACrC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7B,IAAI,EAAE,wGAAwG;iBAC/G,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC;QAC/B,MAAM;QACN,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function firstNonEmptyLine(text: string): string;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtD"}
@@ -0,0 +1,7 @@
1
+ export function firstNonEmptyLine(text) {
2
+ return (text
3
+ .split(/\r?\n/)
4
+ .map((line) => line.trim())
5
+ .find(Boolean) ?? "");
6
+ }
7
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC1C,OAAO,CACH,IAAI;SACC,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAC3B,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type CreateConfigValues } from "@tickernelz/paperclip-pro-adapter-utils";
2
+ export declare function buildGeminiLocalConfig(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,sBAAsB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBrF"}
@@ -0,0 +1,39 @@
1
+ import { buildAdapterEnvConfig } from "@tickernelz/paperclip-pro-adapter-utils";
2
+ import { DEFAULT_GEMINI_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 buildGeminiLocalConfig(v) {
10
+ const ac = {};
11
+ if (v.cwd)
12
+ ac.cwd = v.cwd;
13
+ if (v.instructionsFilePath)
14
+ ac.instructionsFilePath = v.instructionsFilePath;
15
+ if (v.geminiEngine === "cli" || v.geminiEngine === "acp")
16
+ ac.engine = v.geminiEngine;
17
+ if (v.geminiEngine === "acp") {
18
+ if (v.geminiAcpAgentCommand)
19
+ ac.agentCommand = v.geminiAcpAgentCommand;
20
+ ac.mode = v.geminiAcpMode ?? "persistent";
21
+ ac.nonInteractivePermissions = v.geminiAcpNonInteractivePermissions ?? "deny";
22
+ if (v.geminiAcpStateDir)
23
+ ac.stateDir = v.geminiAcpStateDir;
24
+ ac.warmHandleIdleMs = v.geminiAcpWarmHandleIdleMs ?? 0;
25
+ }
26
+ ac.model = v.model || DEFAULT_GEMINI_LOCAL_MODEL;
27
+ ac.timeoutSec = 0;
28
+ ac.graceSec = 15;
29
+ const env = buildAdapterEnvConfig(v.envBindings, v.envVars);
30
+ if (Object.keys(env).length > 0)
31
+ ac.env = env;
32
+ ac.sandbox = !v.dangerouslyBypassSandbox;
33
+ if (v.command)
34
+ ac.command = v.command;
35
+ if (v.extraArgs)
36
+ ac.extraArgs = parseCommaArgs(v.extraArgs);
37
+ return ac;
38
+ }
39
+ //# 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,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEzD,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,sBAAsB,CAAC,CAAqB;IAC1D,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,IAAI,CAAC,CAAC,YAAY,KAAK,KAAK,IAAI,CAAC,CAAC,YAAY,KAAK,KAAK;QAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC;IACrF,IAAI,CAAC,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,qBAAqB;YAAE,EAAE,CAAC,YAAY,GAAG,CAAC,CAAC,qBAAqB,CAAC;QACvE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,aAAa,IAAI,YAAY,CAAC;QAC1C,EAAE,CAAC,yBAAyB,GAAG,CAAC,CAAC,kCAAkC,IAAI,MAAM,CAAC;QAC9E,IAAI,CAAC,CAAC,iBAAiB;YAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,iBAAiB,CAAC;QAC3D,EAAE,CAAC,gBAAgB,GAAG,CAAC,CAAC,yBAAyB,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,0BAA0B,CAAC;IACjD,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC;IAClB,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC;IACjB,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;IAC9C,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,wBAAwB,CAAC;IAEzC,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,63 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildGeminiLocalConfig } from "./build-config.js";
3
+ function makeValues(overrides = {}) {
4
+ return {
5
+ adapterType: "gemini_local",
6
+ cwd: "",
7
+ instructionsFilePath: "",
8
+ promptTemplate: "",
9
+ model: "gemini-2.5-pro",
10
+ thinkingEffort: "",
11
+ chrome: false,
12
+ dangerouslySkipPermissions: true,
13
+ search: false,
14
+ fastMode: false,
15
+ dangerouslyBypassSandbox: false,
16
+ command: "",
17
+ args: "",
18
+ extraArgs: "",
19
+ envVars: "",
20
+ envBindings: {},
21
+ url: "",
22
+ bootstrapPrompt: "",
23
+ payloadTemplateJson: "",
24
+ workspaceStrategyType: "project_primary",
25
+ workspaceBaseRef: "",
26
+ workspaceBranchTemplate: "",
27
+ worktreeParentDir: "",
28
+ runtimeServicesJson: "",
29
+ maxTurnsPerRun: 1000,
30
+ heartbeatEnabled: false,
31
+ intervalSec: 300,
32
+ ...overrides,
33
+ };
34
+ }
35
+ describe("buildGeminiLocalConfig", () => {
36
+ it("omits engine for the auto default so runtime fallback remains available", () => {
37
+ const config = buildGeminiLocalConfig(makeValues({ geminiEngine: "auto" }));
38
+ expect(config).not.toHaveProperty("engine");
39
+ });
40
+ it("persists explicit engine pins", () => {
41
+ expect(buildGeminiLocalConfig(makeValues({ geminiEngine: "cli" }))).toMatchObject({ engine: "cli" });
42
+ expect(buildGeminiLocalConfig(makeValues({ geminiEngine: "acp" }))).toMatchObject({ engine: "acp" });
43
+ });
44
+ it("persists ACP fields when Gemini ACP is selected", () => {
45
+ const config = buildGeminiLocalConfig(makeValues({
46
+ geminiEngine: "acp",
47
+ geminiAcpAgentCommand: "custom-gemini --acp",
48
+ geminiAcpMode: "oneshot",
49
+ geminiAcpNonInteractivePermissions: "fail",
50
+ geminiAcpStateDir: "/tmp/gemini-acp",
51
+ geminiAcpWarmHandleIdleMs: 30,
52
+ }));
53
+ expect(config).toMatchObject({
54
+ engine: "acp",
55
+ agentCommand: "custom-gemini --acp",
56
+ mode: "oneshot",
57
+ nonInteractivePermissions: "fail",
58
+ stateDir: "/tmp/gemini-acp",
59
+ warmHandleIdleMs: 30,
60
+ });
61
+ });
62
+ });
63
+ //# 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;AAE9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,SAAS,UAAU,CAAC,SAAS,GAAgC,EAAE;IAC7D,OAAO;QACL,WAAW,EAAE,cAAc;QAC3B,GAAG,EAAE,EAAE;QACP,oBAAoB,EAAE,EAAE;QACxB,cAAc,EAAE,EAAE;QAClB,KAAK,EAAE,gBAAgB;QACvB,cAAc,EAAE,EAAE;QAClB,MAAM,EAAE,KAAK;QACb,0BAA0B,EAAE,IAAI;QAChC,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,KAAK;QACf,wBAAwB,EAAE,KAAK;QAC/B,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,EAAE;QACR,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,EAAE;QACf,GAAG,EAAE,EAAE;QACP,eAAe,EAAE,EAAE;QACnB,mBAAmB,EAAE,EAAE;QACvB,qBAAqB,EAAE,iBAAiB;QACxC,gBAAgB,EAAE,EAAE;QACpB,uBAAuB,EAAE,EAAE;QAC3B,iBAAiB,EAAE,EAAE;QACrB,mBAAmB,EAAE,EAAE;QACvB,cAAc,EAAE,IAAI;QACpB,gBAAgB,EAAE,KAAK;QACvB,WAAW,EAAE,GAAG;QAChB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE5E,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACrG,MAAM,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,CAAC;YAC/C,YAAY,EAAE,KAAK;YACnB,qBAAqB,EAAE,qBAAqB;YAC5C,aAAa,EAAE,SAAS;YACxB,kCAAkC,EAAE,MAAM;YAC1C,iBAAiB,EAAE,iBAAiB;YACpC,yBAAyB,EAAE,EAAE;SAC9B,CAAC,CAAC,CAAC;QAEJ,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;YAC3B,MAAM,EAAE,KAAK;YACb,YAAY,EAAE,qBAAqB;YACnC,IAAI,EAAE,SAAS;YACf,yBAAyB,EAAE,MAAM;YACjC,QAAQ,EAAE,iBAAiB;YAC3B,gBAAgB,EAAE,EAAE;SACrB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { parseGeminiStdoutLine } from "./parse-stdout.js";
2
+ export { buildGeminiLocalConfig } 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,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { parseGeminiStdoutLine } from "./parse-stdout.js";
2
+ export { buildGeminiLocalConfig } 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,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TranscriptEntry } from "@tickernelz/paperclip-pro-adapter-utils";
2
+ export declare function parseGeminiStdoutLine(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,yCAAyC,CAAC;AAmN/E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,EAAE,CAmFjF"}