pi-orchestrator-config 4.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +808 -0
- package/agents/api-documenter.md +32 -0
- package/agents/bash-expert.md +53 -0
- package/agents/code-reviewer-docs.md +145 -0
- package/agents/code-reviewer-guidelines.md +97 -0
- package/agents/code-reviewer-quality.md +142 -0
- package/agents/code-reviewer-security.md +107 -0
- package/agents/code-reviewer-spec.md +164 -0
- package/agents/debugger.md +63 -0
- package/agents/docker-expert.md +40 -0
- package/agents/docs-fetcher.md +48 -0
- package/agents/git-expert.md +63 -0
- package/agents/github-expert.md +83 -0
- package/agents/go-expert.md +62 -0
- package/agents/issue-reviewer-feasibility.md +60 -0
- package/agents/issue-reviewer-scope.md +63 -0
- package/agents/issue-reviewer-spec.md +77 -0
- package/agents/java-expert.md +31 -0
- package/agents/jenkins-expert.md +38 -0
- package/agents/kubernetes-expert.md +40 -0
- package/agents/planner.md +42 -0
- package/agents/python-expert.md +61 -0
- package/agents/reviewer.md +26 -0
- package/agents/scout.md +40 -0
- package/agents/security-auditor.md +254 -0
- package/agents/technical-documentation-writer.md +37 -0
- package/agents/test-automator.md +55 -0
- package/agents/test-runner.md +47 -0
- package/agents/ts-expert.md +23 -0
- package/agents/worker.md +30 -0
- package/extensions/acpx-provider/index.ts +104 -0
- package/extensions/acpx-provider/load-runtime.ts +99 -0
- package/extensions/acpx-provider/runtime-models.ts +40 -0
- package/extensions/cli-provider/agents/claude.ts +128 -0
- package/extensions/cli-provider/agents/cursor.ts +84 -0
- package/extensions/cli-provider/agents/gemini.ts +100 -0
- package/extensions/cli-provider/discover.ts +77 -0
- package/extensions/cli-provider/index.ts +57 -0
- package/extensions/cli-provider/parsers.ts +304 -0
- package/extensions/cli-provider/providers.ts +58 -0
- package/extensions/cli-provider/runner.ts +225 -0
- package/extensions/cli-provider/runtime-models.ts +32 -0
- package/extensions/cli-provider/session-reaper.ts +122 -0
- package/extensions/cli-provider/sessions.ts +533 -0
- package/extensions/cli-provider/shared/discover-cache.ts +235 -0
- package/extensions/cli-provider/types.ts +48 -0
- package/extensions/coms/coms-net-server.ts +1642 -0
- package/extensions/coms/coms-net-wrapper.ts +521 -0
- package/extensions/coms/coms-net.ts +1589 -0
- package/extensions/coms/coms-p2p.ts +1879 -0
- package/extensions/coms/coms-shared.ts +510 -0
- package/extensions/coms/coms-wrapper.ts +138 -0
- package/extensions/coms/index.ts +20 -0
- package/extensions/coms/themeMap.ts +147 -0
- package/extensions/image-gen/image-gen.ts +332 -0
- package/extensions/image-gen/index.ts +14 -0
- package/extensions/orchestrator/agents.ts +134 -0
- package/extensions/orchestrator/ask-user.ts +293 -0
- package/extensions/orchestrator/async-agents.ts +1037 -0
- package/extensions/orchestrator/async-capability.ts +129 -0
- package/extensions/orchestrator/async-runner.ts +324 -0
- package/extensions/orchestrator/async-status-parse.ts +31 -0
- package/extensions/orchestrator/async-status-ui.ts +201 -0
- package/extensions/orchestrator/async-wait.ts +36 -0
- package/extensions/orchestrator/btw.ts +210 -0
- package/extensions/orchestrator/cron-status-format.ts +126 -0
- package/extensions/orchestrator/cron-status-ui.ts +132 -0
- package/extensions/orchestrator/cron.ts +730 -0
- package/extensions/orchestrator/dreaming.ts +355 -0
- package/extensions/orchestrator/enforcement-helpers.ts +530 -0
- package/extensions/orchestrator/enforcement-rules.ts +329 -0
- package/extensions/orchestrator/enforcement.ts +828 -0
- package/extensions/orchestrator/extended-autocomplete.ts +593 -0
- package/extensions/orchestrator/git-helpers.ts +420 -0
- package/extensions/orchestrator/github-autocomplete.ts +250 -0
- package/extensions/orchestrator/icons.ts +17 -0
- package/extensions/orchestrator/index.ts +100 -0
- package/extensions/orchestrator/memory-embeddings.ts +281 -0
- package/extensions/orchestrator/memory-promotion.ts +449 -0
- package/extensions/orchestrator/memory-provenance.ts +80 -0
- package/extensions/orchestrator/memory-query-class.ts +90 -0
- package/extensions/orchestrator/memory-scoring.ts +434 -0
- package/extensions/orchestrator/memory-tools.ts +883 -0
- package/extensions/orchestrator/memory-tree.ts +212 -0
- package/extensions/orchestrator/nvim.ts +169 -0
- package/extensions/orchestrator/overlay-dashboard-utils.ts +25 -0
- package/extensions/orchestrator/overlay-dashboard.ts +512 -0
- package/extensions/orchestrator/pi-config-review-state.ts +303 -0
- package/extensions/orchestrator/preference-extractor.ts +106 -0
- package/extensions/orchestrator/project-settings.ts +468 -0
- package/extensions/orchestrator/promotion-queue.ts +311 -0
- package/extensions/orchestrator/resolve-agent-model.ts +32 -0
- package/extensions/orchestrator/review-ui.ts +204 -0
- package/extensions/orchestrator/rule-placeholders.ts +12 -0
- package/extensions/orchestrator/rules.ts +481 -0
- package/extensions/orchestrator/session-search.ts +243 -0
- package/extensions/orchestrator/session-validation.ts +374 -0
- package/extensions/orchestrator/situation-report.ts +370 -0
- package/extensions/orchestrator/status-bar.ts +31 -0
- package/extensions/orchestrator/status-line.ts +192 -0
- package/extensions/orchestrator/status.ts +110 -0
- package/extensions/orchestrator/subagent-tool.ts +1748 -0
- package/extensions/orchestrator/task-lifecycle.ts +88 -0
- package/extensions/orchestrator/utils.ts +227 -0
- package/extensions/pidash/index.ts +15 -0
- package/extensions/pidash/pidash.ts +941 -0
- package/extensions/pidiff/index.ts +13 -0
- package/extensions/pidiff/pidiff.ts +369 -0
- package/extensions/providers/acpx-driver.ts +479 -0
- package/extensions/providers/built-in-drivers.ts +52 -0
- package/extensions/providers/claude-driver.ts +319 -0
- package/extensions/providers/cursor-acpx-driver.ts +398 -0
- package/extensions/providers/cursor-cli-driver.ts +484 -0
- package/extensions/providers/gemini-driver.ts +302 -0
- package/extensions/providers/index.ts +513 -0
- package/extensions/shared/build-system-prompt.ts +57 -0
- package/extensions/shared/create-runtime-provider.ts +190 -0
- package/extensions/shared/daemon-manager.ts +248 -0
- package/extensions/shared/file-logger.ts +115 -0
- package/extensions/shared/managed-refresh.ts +211 -0
- package/extensions/shared/provider-driver.ts +295 -0
- package/extensions/shared/provider-errors.ts +305 -0
- package/extensions/shared/provider-registry.ts +388 -0
- package/extensions/shared/stream-builder.ts +275 -0
- package/extensions/shared/types.ts +20 -0
- package/extensions/shared/ui/README.md +10 -0
- package/extensions/shared/ui/badge.tsx +52 -0
- package/extensions/shared/ui/button.tsx +58 -0
- package/extensions/shared/ui/collapsible.tsx +21 -0
- package/extensions/shared/ui/dropdown-menu.tsx +266 -0
- package/extensions/shared/ui/input.tsx +20 -0
- package/extensions/shared/ui/popover.tsx +114 -0
- package/extensions/shared/ui/resizable.tsx +48 -0
- package/extensions/shared/ui/scroll-area.tsx +53 -0
- package/extensions/shared/ui/select.tsx +201 -0
- package/extensions/shared/ui/separator.tsx +25 -0
- package/extensions/shared/ui/tooltip.tsx +64 -0
- package/extensions/shared/ws-client.ts +74 -0
- package/package.json +59 -0
- package/prompts/coderabbit-rate-limit.md +95 -0
- package/prompts/create-coms-feature-manager.md +186 -0
- package/prompts/create-skill.md +128 -0
- package/prompts/domain-model.md +109 -0
- package/prompts/external-ai.md +665 -0
- package/prompts/implement-and-review.md +25 -0
- package/prompts/implement.md +26 -0
- package/prompts/issue-review.md +256 -0
- package/prompts/pr-review.md +753 -0
- package/prompts/query-db.md +154 -0
- package/prompts/refine-review.md +208 -0
- package/prompts/release.md +235 -0
- package/prompts/remember.md +33 -0
- package/prompts/review-handler-status.md +27 -0
- package/prompts/review-handler.md +677 -0
- package/prompts/review-local.md +159 -0
- package/prompts/scout-and-plan.md +21 -0
- package/rules/00-orchestrator-core.md +42 -0
- package/rules/05-issue-first-workflow.md +119 -0
- package/rules/10-agent-routing.md +58 -0
- package/rules/15-mcp-launchpad.md +46 -0
- package/rules/20-code-review-loop.md +234 -0
- package/rules/25-documentation-updates.md +15 -0
- package/rules/30-prompt-templates.md +19 -0
- package/rules/35-memory.md +240 -0
- package/rules/40-critical-rules.md +124 -0
- package/rules/45-file-preview.md +29 -0
- package/rules/50-agent-bug-reporting.md +90 -0
- package/rules/55-coms-protocol.md +63 -0
- package/rules/60-task-tracking.md +66 -0
- package/skills/conflict-resolver/SKILL.md +213 -0
- package/skills/skill-creator/SKILL.md +85 -0
- package/skills/systematic-debugging/SKILL.md +353 -0
- package/skills/test-driven-development/SKILL.md +335 -0
- package/skills/update-agents-md/SKILL.md +282 -0
- package/templates/coms-feature-manager-prompt.md +313 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GeminiDriver — ProviderDriver for the Gemini CLI agent.
|
|
3
|
+
*
|
|
4
|
+
* Adapted from t3code's driver pattern. Owns config schema,
|
|
5
|
+
* binary probe, model discovery (bundle parsing), session/turn
|
|
6
|
+
* adapter, and managed snapshot refresh.
|
|
7
|
+
*
|
|
8
|
+
* Reuses existing modules:
|
|
9
|
+
* - cli-provider/agents/gemini.ts — discovery (parseGeminiCliVisibleModels)
|
|
10
|
+
* - cli-provider/runner.ts — process spawning (runCliAgent)
|
|
11
|
+
* - cli-provider/sessions.ts — session marker management
|
|
12
|
+
* - shared/build-system-prompt.ts — system prompt injection
|
|
13
|
+
*
|
|
14
|
+
* @module providers/gemini-driver
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type {
|
|
18
|
+
ConfigSchema,
|
|
19
|
+
DiscoveredModel,
|
|
20
|
+
ProviderAdapterShape,
|
|
21
|
+
ProviderDriver,
|
|
22
|
+
ProviderDriverCreateInput,
|
|
23
|
+
ProviderInstance,
|
|
24
|
+
ProviderProbeResult,
|
|
25
|
+
SessionHandle,
|
|
26
|
+
SessionStartOptions,
|
|
27
|
+
TurnOptions,
|
|
28
|
+
TurnResult,
|
|
29
|
+
} from "../shared/provider-driver.js";
|
|
30
|
+
import { makeManagedSnapshot, buildInitialSnapshot } from "../shared/managed-refresh.js";
|
|
31
|
+
import { resolveBinary } from "../cli-provider/shared/discover-cache.js";
|
|
32
|
+
import { discoverCliModelsDetailed } from "../cli-provider/discover.js";
|
|
33
|
+
import { runCliAgent } from "../cli-provider/runner.js";
|
|
34
|
+
import {
|
|
35
|
+
loadCliSessionId,
|
|
36
|
+
saveCliSessionId,
|
|
37
|
+
clearCliSessionId,
|
|
38
|
+
applySystemPromptToCliPrompt,
|
|
39
|
+
shouldRetryWithoutResume,
|
|
40
|
+
createProvisionalPiSessionId,
|
|
41
|
+
type CliSessionKey,
|
|
42
|
+
} from "../cli-provider/sessions.js";
|
|
43
|
+
import { buildExternalSystemPrompt } from "../shared/build-system-prompt.js";
|
|
44
|
+
import { fileLog } from "../shared/file-logger.js";
|
|
45
|
+
|
|
46
|
+
const LOG_DOMAIN = "gemini-driver";
|
|
47
|
+
const DRIVER_KIND = "gemini-cli";
|
|
48
|
+
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Config
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
|
|
53
|
+
export interface GeminiCliConfig {
|
|
54
|
+
readonly binary: string;
|
|
55
|
+
readonly enabled: boolean;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const geminiConfigSchema: ConfigSchema<GeminiCliConfig> = {
|
|
59
|
+
parse: (raw: unknown): GeminiCliConfig => {
|
|
60
|
+
if (!raw || typeof raw !== "object") {
|
|
61
|
+
return { binary: "gemini", enabled: true };
|
|
62
|
+
}
|
|
63
|
+
const obj = raw as Record<string, unknown>;
|
|
64
|
+
return {
|
|
65
|
+
binary: typeof obj.binary === "string" ? obj.binary : "gemini",
|
|
66
|
+
enabled: typeof obj.enabled === "boolean" ? obj.enabled : true,
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// Adapter
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
|
|
75
|
+
function createGeminiAdapter(
|
|
76
|
+
config: GeminiCliConfig,
|
|
77
|
+
cwd: string,
|
|
78
|
+
instanceId: string,
|
|
79
|
+
): ProviderAdapterShape & {
|
|
80
|
+
bindPiSessionId: (sid: string) => void;
|
|
81
|
+
handleSessionStart: (reason: string, sid: string | null) => void;
|
|
82
|
+
} {
|
|
83
|
+
let piSessionId = createProvisionalPiSessionId();
|
|
84
|
+
const systemPromptSent = new Set<string>();
|
|
85
|
+
const storedSystemPrompts = new Map<string, string>();
|
|
86
|
+
|
|
87
|
+
function sessionKeyFor(model: string): CliSessionKey {
|
|
88
|
+
return { cwd, agent: "gemini", model, piSessionId };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
bindPiSessionId: (sid: string) => {
|
|
93
|
+
if (sid) piSessionId = sid;
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
handleSessionStart: (reason: string, _sid: string | null) => {
|
|
97
|
+
if (reason === "new" || reason === "resume") {
|
|
98
|
+
systemPromptSent.clear();
|
|
99
|
+
storedSystemPrompts.clear();
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
startSession: async (opts: SessionStartOptions): Promise<SessionHandle> => {
|
|
104
|
+
const model = opts.model || "default";
|
|
105
|
+
if (opts.systemPrompt) storedSystemPrompts.set(model, opts.systemPrompt);
|
|
106
|
+
const key = sessionKeyFor(model);
|
|
107
|
+
const existingId = loadCliSessionId(key);
|
|
108
|
+
return {
|
|
109
|
+
sessionId: existingId || `gemini-${instanceId}-${model}`,
|
|
110
|
+
model,
|
|
111
|
+
};
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
sendTurn: async (
|
|
115
|
+
handle: SessionHandle,
|
|
116
|
+
prompt: string,
|
|
117
|
+
opts?: TurnOptions,
|
|
118
|
+
): Promise<TurnResult> => {
|
|
119
|
+
const key = sessionKeyFor(handle.model);
|
|
120
|
+
const sessionId = loadCliSessionId(key);
|
|
121
|
+
const handleKey = handle.model || "default";
|
|
122
|
+
const needsSystemPrompt = !systemPromptSent.has(handleKey);
|
|
123
|
+
|
|
124
|
+
let systemPrompt: string | undefined;
|
|
125
|
+
if (needsSystemPrompt) {
|
|
126
|
+
systemPrompt =
|
|
127
|
+
storedSystemPrompts.get(handleKey) ||
|
|
128
|
+
buildExternalSystemPrompt({ systemPrompt: undefined }, cwd);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
let finalPrompt = prompt;
|
|
132
|
+
if (needsSystemPrompt && systemPrompt) {
|
|
133
|
+
finalPrompt = applySystemPromptToCliPrompt(prompt, systemPrompt);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const onEvent = opts?.onEvent
|
|
137
|
+
? (ev: { kind: string; text?: string; sessionId?: string }) => {
|
|
138
|
+
if (ev.kind === "session" && ev.sessionId) {
|
|
139
|
+
saveCliSessionId(key, ev.sessionId);
|
|
140
|
+
opts.onEvent!({ kind: "session", sessionId: ev.sessionId });
|
|
141
|
+
} else if (ev.kind === "thinking_delta" && ev.text) {
|
|
142
|
+
opts.onEvent!({ kind: "thinking_delta", text: ev.text });
|
|
143
|
+
} else if (ev.kind === "text_delta" && ev.text) {
|
|
144
|
+
opts.onEvent!({ kind: "text_delta", text: ev.text });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
: undefined;
|
|
148
|
+
|
|
149
|
+
const runOnce = (sid: string | null, p: string) =>
|
|
150
|
+
runCliAgent({
|
|
151
|
+
agent: "gemini",
|
|
152
|
+
model: handle.model === "default" ? "default" : handle.model,
|
|
153
|
+
cwd,
|
|
154
|
+
prompt: p,
|
|
155
|
+
sessionId: sid,
|
|
156
|
+
signal: opts?.signal,
|
|
157
|
+
binary: config.binary,
|
|
158
|
+
onEvent,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
const result = await runOnce(sessionId, finalPrompt);
|
|
163
|
+
if (result.sessionId) {
|
|
164
|
+
saveCliSessionId(key, result.sessionId);
|
|
165
|
+
}
|
|
166
|
+
if (needsSystemPrompt) {
|
|
167
|
+
systemPromptSent.add(handleKey);
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
text: result.text,
|
|
171
|
+
thinking: result.thinking,
|
|
172
|
+
sessionId: result.sessionId,
|
|
173
|
+
stopReason: "stop",
|
|
174
|
+
usage: result.usage,
|
|
175
|
+
};
|
|
176
|
+
} catch (err) {
|
|
177
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
178
|
+
if (sessionId && shouldRetryWithoutResume(message)) {
|
|
179
|
+
fileLog(LOG_DOMAIN, "warn", LOG_DOMAIN,
|
|
180
|
+
`resume failed, clearing session and retrying: ${message.slice(0, 200)}`);
|
|
181
|
+
clearCliSessionId(key);
|
|
182
|
+
const retryPrompt = needsSystemPrompt && systemPrompt
|
|
183
|
+
? applySystemPromptToCliPrompt(prompt, systemPrompt)
|
|
184
|
+
: prompt;
|
|
185
|
+
const result = await runOnce(null, retryPrompt);
|
|
186
|
+
if (result.sessionId) {
|
|
187
|
+
saveCliSessionId(key, result.sessionId);
|
|
188
|
+
}
|
|
189
|
+
if (needsSystemPrompt) {
|
|
190
|
+
systemPromptSent.add(handleKey);
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
text: result.text,
|
|
194
|
+
thinking: result.thinking,
|
|
195
|
+
sessionId: result.sessionId,
|
|
196
|
+
stopReason: "stop",
|
|
197
|
+
usage: result.usage,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
throw err;
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
stopSession: async (handle: SessionHandle): Promise<void> => {
|
|
205
|
+
const key = sessionKeyFor(handle.model);
|
|
206
|
+
clearCliSessionId(key);
|
|
207
|
+
const handleKey = handle.model || "default";
|
|
208
|
+
systemPromptSent.delete(handleKey);
|
|
209
|
+
storedSystemPrompts.delete(handleKey);
|
|
210
|
+
},
|
|
211
|
+
|
|
212
|
+
stopAll: async (): Promise<void> => {
|
|
213
|
+
systemPromptSent.clear();
|
|
214
|
+
storedSystemPrompts.clear();
|
|
215
|
+
},
|
|
216
|
+
|
|
217
|
+
hasSession: (_sessionId: string): boolean => {
|
|
218
|
+
return false;
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
// Driver
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
|
|
227
|
+
export const GeminiDriver: ProviderDriver<GeminiCliConfig> = {
|
|
228
|
+
driverKind: DRIVER_KIND,
|
|
229
|
+
metadata: {
|
|
230
|
+
displayName: "Gemini CLI",
|
|
231
|
+
supportsMultipleInstances: false,
|
|
232
|
+
},
|
|
233
|
+
configSchema: geminiConfigSchema,
|
|
234
|
+
defaultConfig: () => ({ binary: "gemini", enabled: true }),
|
|
235
|
+
|
|
236
|
+
probe: async (config: GeminiCliConfig): Promise<ProviderProbeResult> => {
|
|
237
|
+
const binary = resolveBinary(config.binary);
|
|
238
|
+
if (!binary) {
|
|
239
|
+
return {
|
|
240
|
+
available: false,
|
|
241
|
+
reason: `Binary '${config.binary}' not found on PATH`,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
return { available: true };
|
|
245
|
+
},
|
|
246
|
+
|
|
247
|
+
create: async (
|
|
248
|
+
input: ProviderDriverCreateInput<GeminiCliConfig>,
|
|
249
|
+
): Promise<ProviderInstance> => {
|
|
250
|
+
const { instanceId, config, cwd } = input;
|
|
251
|
+
|
|
252
|
+
let discoveredModels: DiscoveredModel[] = [];
|
|
253
|
+
try {
|
|
254
|
+
const detailed = await discoverCliModelsDetailed("gemini");
|
|
255
|
+
discoveredModels = detailed.map((m) => ({ id: m.id, name: m.name }));
|
|
256
|
+
} catch (err) {
|
|
257
|
+
fileLog(LOG_DOMAIN, "warn", LOG_DOMAIN,
|
|
258
|
+
`model discovery failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const managed = makeManagedSnapshot({
|
|
262
|
+
skipInitialRefresh: true,
|
|
263
|
+
initialSnapshot: () =>
|
|
264
|
+
buildInitialSnapshot(true, discoveredModels),
|
|
265
|
+
checkProvider: async () => {
|
|
266
|
+
const binary = resolveBinary(config.binary);
|
|
267
|
+
if (!binary) {
|
|
268
|
+
return buildInitialSnapshot(false, [], undefined, `Binary '${config.binary}' not found`);
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
const next = await discoverCliModelsDetailed("gemini");
|
|
272
|
+
const models = next.map((m) => ({ id: m.id, name: m.name }));
|
|
273
|
+
return buildInitialSnapshot(true, models);
|
|
274
|
+
} catch {
|
|
275
|
+
return buildInitialSnapshot(true, discoveredModels);
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
getSettings: () => config,
|
|
279
|
+
haveSettingsChanged: (prev, next) =>
|
|
280
|
+
prev.binary !== next.binary || prev.enabled !== next.enabled,
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
const adapter = createGeminiAdapter(config, cwd, instanceId);
|
|
284
|
+
|
|
285
|
+
return {
|
|
286
|
+
instanceId,
|
|
287
|
+
driverKind: DRIVER_KIND,
|
|
288
|
+
displayName: input.displayName || "Gemini CLI",
|
|
289
|
+
enabled: input.enabled,
|
|
290
|
+
snapshot: {
|
|
291
|
+
getSnapshot: managed.getSnapshot,
|
|
292
|
+
refresh: managed.refresh,
|
|
293
|
+
dispose: managed.dispose,
|
|
294
|
+
},
|
|
295
|
+
adapter,
|
|
296
|
+
dispose: async () => {
|
|
297
|
+
managed.dispose();
|
|
298
|
+
await adapter.stopAll();
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
},
|
|
302
|
+
};
|