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,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClaudeDriver — ProviderDriver for the Claude Code CLI agent.
|
|
3
|
+
*
|
|
4
|
+
* Adapted from t3code's ClaudeDriver pattern. Owns config schema,
|
|
5
|
+
* binary probe, model discovery (binary catalog scan), session/turn
|
|
6
|
+
* adapter, and managed snapshot refresh.
|
|
7
|
+
*
|
|
8
|
+
* Reuses existing modules:
|
|
9
|
+
* - cli-provider/agents/claude.ts — discovery (scanClaudeBinaryCatalog)
|
|
10
|
+
* - cli-provider/runner.ts — process spawning (runCliAgent)
|
|
11
|
+
* - cli-provider/sessions.ts — session marker management
|
|
12
|
+
* - cli-provider/parsers.ts — output parsing
|
|
13
|
+
* - shared/build-system-prompt.ts — system prompt injection
|
|
14
|
+
*
|
|
15
|
+
* @module providers/claude-driver
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type {
|
|
19
|
+
ConfigSchema,
|
|
20
|
+
DiscoveredModel,
|
|
21
|
+
DriverStreamEvent,
|
|
22
|
+
ProviderAdapterShape,
|
|
23
|
+
ProviderDriver,
|
|
24
|
+
ProviderDriverCreateInput,
|
|
25
|
+
ProviderInstance,
|
|
26
|
+
ProviderProbeResult,
|
|
27
|
+
ProviderSnapshotShape,
|
|
28
|
+
SessionHandle,
|
|
29
|
+
SessionStartOptions,
|
|
30
|
+
TurnOptions,
|
|
31
|
+
TurnResult,
|
|
32
|
+
} from "../shared/provider-driver.js";
|
|
33
|
+
import { ProviderDriverError } from "../shared/provider-errors.js";
|
|
34
|
+
import { makeManagedSnapshot, buildInitialSnapshot } from "../shared/managed-refresh.js";
|
|
35
|
+
import { resolveBinary } from "../cli-provider/shared/discover-cache.js";
|
|
36
|
+
import { discoverCliModelsDetailed } from "../cli-provider/discover.js";
|
|
37
|
+
import { runCliAgent } from "../cli-provider/runner.js";
|
|
38
|
+
import {
|
|
39
|
+
loadCliSessionId,
|
|
40
|
+
saveCliSessionId,
|
|
41
|
+
clearCliSessionId,
|
|
42
|
+
applySystemPromptToCliPrompt,
|
|
43
|
+
shouldRetryWithoutResume,
|
|
44
|
+
createProvisionalPiSessionId,
|
|
45
|
+
type CliSessionKey,
|
|
46
|
+
} from "../cli-provider/sessions.js";
|
|
47
|
+
import { buildExternalSystemPrompt } from "../shared/build-system-prompt.js";
|
|
48
|
+
import { fileLog } from "../shared/file-logger.js";
|
|
49
|
+
|
|
50
|
+
const LOG_DOMAIN = "claude-driver";
|
|
51
|
+
const DRIVER_KIND = "claude-cli";
|
|
52
|
+
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Config
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
export interface ClaudeCliConfig {
|
|
58
|
+
readonly binary: string;
|
|
59
|
+
readonly enabled: boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const claudeConfigSchema: ConfigSchema<ClaudeCliConfig> = {
|
|
63
|
+
parse: (raw: unknown): ClaudeCliConfig => {
|
|
64
|
+
if (!raw || typeof raw !== "object") {
|
|
65
|
+
return { binary: "claude", enabled: true };
|
|
66
|
+
}
|
|
67
|
+
const obj = raw as Record<string, unknown>;
|
|
68
|
+
return {
|
|
69
|
+
binary: typeof obj.binary === "string" ? obj.binary : "claude",
|
|
70
|
+
enabled: typeof obj.enabled === "boolean" ? obj.enabled : true,
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Adapter (session / turn runtime)
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
|
|
79
|
+
function createClaudeAdapter(
|
|
80
|
+
config: ClaudeCliConfig,
|
|
81
|
+
cwd: string,
|
|
82
|
+
instanceId: string,
|
|
83
|
+
): ProviderAdapterShape & {
|
|
84
|
+
bindPiSessionId: (sid: string) => void;
|
|
85
|
+
handleSessionStart: (reason: string, sid: string | null) => void;
|
|
86
|
+
} {
|
|
87
|
+
let piSessionId = createProvisionalPiSessionId();
|
|
88
|
+
const systemPromptSent = new Set<string>();
|
|
89
|
+
const storedSystemPrompts = new Map<string, string>();
|
|
90
|
+
|
|
91
|
+
function sessionKeyFor(model: string): CliSessionKey {
|
|
92
|
+
return { cwd, agent: "claude", model, piSessionId };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
bindPiSessionId: (sid: string) => {
|
|
97
|
+
if (sid) piSessionId = sid;
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
handleSessionStart: (reason: string, _sid: string | null) => {
|
|
101
|
+
if (reason === "new" || reason === "resume") {
|
|
102
|
+
systemPromptSent.clear();
|
|
103
|
+
storedSystemPrompts.clear();
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
startSession: async (opts: SessionStartOptions): Promise<SessionHandle> => {
|
|
108
|
+
const model = opts.model || "default";
|
|
109
|
+
if (opts.systemPrompt) storedSystemPrompts.set(model, opts.systemPrompt);
|
|
110
|
+
const key = sessionKeyFor(model);
|
|
111
|
+
const existingId = loadCliSessionId(key);
|
|
112
|
+
return {
|
|
113
|
+
sessionId: existingId || `claude-${instanceId}-${model}`,
|
|
114
|
+
model,
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
sendTurn: async (
|
|
119
|
+
handle: SessionHandle,
|
|
120
|
+
prompt: string,
|
|
121
|
+
opts?: TurnOptions,
|
|
122
|
+
): Promise<TurnResult> => {
|
|
123
|
+
const key = sessionKeyFor(handle.model);
|
|
124
|
+
const sessionId = loadCliSessionId(key);
|
|
125
|
+
const handleKey = handle.model || "default";
|
|
126
|
+
const needsSystemPrompt = !systemPromptSent.has(handleKey);
|
|
127
|
+
|
|
128
|
+
// Prefer the system prompt stored at startSession over rebuilding
|
|
129
|
+
let systemPrompt: string | undefined;
|
|
130
|
+
if (needsSystemPrompt) {
|
|
131
|
+
systemPrompt =
|
|
132
|
+
storedSystemPrompts.get(handleKey) ||
|
|
133
|
+
buildExternalSystemPrompt({ systemPrompt: undefined }, cwd);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Apply system prompt to the prompt text
|
|
137
|
+
let finalPrompt = prompt;
|
|
138
|
+
if (needsSystemPrompt && systemPrompt) {
|
|
139
|
+
finalPrompt = applySystemPromptToCliPrompt(prompt, systemPrompt);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Build event handler that bridges to DriverStreamEvent
|
|
143
|
+
const onEvent = opts?.onEvent
|
|
144
|
+
? (ev: { kind: string; text?: string; sessionId?: string }) => {
|
|
145
|
+
if (ev.kind === "session" && ev.sessionId) {
|
|
146
|
+
saveCliSessionId(key, ev.sessionId);
|
|
147
|
+
opts.onEvent!({ kind: "session", sessionId: ev.sessionId });
|
|
148
|
+
} else if (ev.kind === "thinking_delta" && ev.text) {
|
|
149
|
+
opts.onEvent!({ kind: "thinking_delta", text: ev.text });
|
|
150
|
+
} else if (ev.kind === "text_delta" && ev.text) {
|
|
151
|
+
opts.onEvent!({ kind: "text_delta", text: ev.text });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
: undefined;
|
|
155
|
+
|
|
156
|
+
const runOnce = (sid: string | null, p: string) =>
|
|
157
|
+
runCliAgent({
|
|
158
|
+
agent: "claude",
|
|
159
|
+
model: handle.model === "default" ? "default" : handle.model,
|
|
160
|
+
cwd,
|
|
161
|
+
prompt: p,
|
|
162
|
+
sessionId: sid,
|
|
163
|
+
signal: opts?.signal,
|
|
164
|
+
binary: config.binary,
|
|
165
|
+
onEvent,
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
try {
|
|
169
|
+
const result = await runOnce(sessionId, finalPrompt);
|
|
170
|
+
|
|
171
|
+
// Save session id from result
|
|
172
|
+
if (result.sessionId) {
|
|
173
|
+
saveCliSessionId(key, result.sessionId);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Mark system prompt sent on success
|
|
177
|
+
if (needsSystemPrompt) {
|
|
178
|
+
systemPromptSent.add(handleKey);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
text: result.text,
|
|
183
|
+
thinking: result.thinking,
|
|
184
|
+
sessionId: result.sessionId,
|
|
185
|
+
stopReason: "stop",
|
|
186
|
+
usage: result.usage,
|
|
187
|
+
};
|
|
188
|
+
} catch (err) {
|
|
189
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
190
|
+
// Resume recovery: if --resume fails, clear marker and retry
|
|
191
|
+
if (sessionId && shouldRetryWithoutResume(message)) {
|
|
192
|
+
fileLog(LOG_DOMAIN, "warn", LOG_DOMAIN,
|
|
193
|
+
`resume failed, clearing session and retrying: ${message.slice(0, 200)}`);
|
|
194
|
+
clearCliSessionId(key);
|
|
195
|
+
const retryPrompt = needsSystemPrompt && systemPrompt
|
|
196
|
+
? applySystemPromptToCliPrompt(prompt, systemPrompt)
|
|
197
|
+
: prompt;
|
|
198
|
+
const result = await runOnce(null, retryPrompt);
|
|
199
|
+
if (result.sessionId) {
|
|
200
|
+
saveCliSessionId(key, result.sessionId);
|
|
201
|
+
}
|
|
202
|
+
if (needsSystemPrompt) {
|
|
203
|
+
systemPromptSent.add(handleKey);
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
text: result.text,
|
|
207
|
+
thinking: result.thinking,
|
|
208
|
+
sessionId: result.sessionId,
|
|
209
|
+
stopReason: "stop",
|
|
210
|
+
usage: result.usage,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
throw err;
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
|
|
217
|
+
stopSession: async (handle: SessionHandle): Promise<void> => {
|
|
218
|
+
const key = sessionKeyFor(handle.model);
|
|
219
|
+
clearCliSessionId(key);
|
|
220
|
+
const handleKey = handle.model || "default";
|
|
221
|
+
systemPromptSent.delete(handleKey);
|
|
222
|
+
storedSystemPrompts.delete(handleKey);
|
|
223
|
+
},
|
|
224
|
+
|
|
225
|
+
stopAll: async (): Promise<void> => {
|
|
226
|
+
systemPromptSent.clear();
|
|
227
|
+
storedSystemPrompts.clear();
|
|
228
|
+
},
|
|
229
|
+
|
|
230
|
+
hasSession: (_sessionId: string): boolean => {
|
|
231
|
+
// Check if any session key maps to this session id
|
|
232
|
+
return false; // CLI sessions are stateless from adapter perspective
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// Driver
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
|
|
241
|
+
export const ClaudeDriver: ProviderDriver<ClaudeCliConfig> = {
|
|
242
|
+
driverKind: DRIVER_KIND,
|
|
243
|
+
metadata: {
|
|
244
|
+
displayName: "Claude CLI",
|
|
245
|
+
supportsMultipleInstances: false,
|
|
246
|
+
},
|
|
247
|
+
configSchema: claudeConfigSchema,
|
|
248
|
+
defaultConfig: () => ({ binary: "claude", enabled: true }),
|
|
249
|
+
|
|
250
|
+
probe: async (config: ClaudeCliConfig): Promise<ProviderProbeResult> => {
|
|
251
|
+
const binary = resolveBinary(config.binary);
|
|
252
|
+
if (!binary) {
|
|
253
|
+
return {
|
|
254
|
+
available: false,
|
|
255
|
+
reason: `Binary '${config.binary}' not found on PATH`,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
return { available: true };
|
|
259
|
+
},
|
|
260
|
+
|
|
261
|
+
create: async (
|
|
262
|
+
input: ProviderDriverCreateInput<ClaudeCliConfig>,
|
|
263
|
+
): Promise<ProviderInstance> => {
|
|
264
|
+
const { instanceId, config, cwd } = input;
|
|
265
|
+
|
|
266
|
+
// Discover models
|
|
267
|
+
let discoveredModels: DiscoveredModel[] = [];
|
|
268
|
+
try {
|
|
269
|
+
const detailed = await discoverCliModelsDetailed("claude");
|
|
270
|
+
discoveredModels = detailed.map((m) => ({ id: m.id, name: m.name }));
|
|
271
|
+
} catch (err) {
|
|
272
|
+
fileLog(LOG_DOMAIN, "warn", LOG_DOMAIN,
|
|
273
|
+
`model discovery failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Create managed snapshot with periodic refresh
|
|
277
|
+
const managed = makeManagedSnapshot({
|
|
278
|
+
skipInitialRefresh: true,
|
|
279
|
+
initialSnapshot: () =>
|
|
280
|
+
buildInitialSnapshot(true, discoveredModels),
|
|
281
|
+
checkProvider: async () => {
|
|
282
|
+
const binary = resolveBinary(config.binary);
|
|
283
|
+
if (!binary) {
|
|
284
|
+
return buildInitialSnapshot(false, [], undefined, `Binary '${config.binary}' not found`);
|
|
285
|
+
}
|
|
286
|
+
try {
|
|
287
|
+
const next = await discoverCliModelsDetailed("claude");
|
|
288
|
+
const models = next.map((m) => ({ id: m.id, name: m.name }));
|
|
289
|
+
return buildInitialSnapshot(true, models);
|
|
290
|
+
} catch {
|
|
291
|
+
return buildInitialSnapshot(true, discoveredModels);
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
getSettings: () => config,
|
|
295
|
+
haveSettingsChanged: (prev, next) =>
|
|
296
|
+
prev.binary !== next.binary || prev.enabled !== next.enabled,
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// Create adapter
|
|
300
|
+
const adapter = createClaudeAdapter(config, cwd, instanceId);
|
|
301
|
+
|
|
302
|
+
return {
|
|
303
|
+
instanceId,
|
|
304
|
+
driverKind: DRIVER_KIND,
|
|
305
|
+
displayName: input.displayName || "Claude CLI",
|
|
306
|
+
enabled: input.enabled,
|
|
307
|
+
snapshot: {
|
|
308
|
+
getSnapshot: managed.getSnapshot,
|
|
309
|
+
refresh: managed.refresh,
|
|
310
|
+
dispose: managed.dispose,
|
|
311
|
+
},
|
|
312
|
+
adapter,
|
|
313
|
+
dispose: async () => {
|
|
314
|
+
managed.dispose();
|
|
315
|
+
await adapter.stopAll();
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
},
|
|
319
|
+
};
|