@oh-my-pi/pi-coding-agent 0.1.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.
- package/CHANGELOG.md +1629 -0
- package/README.md +1041 -0
- package/docs/compaction.md +403 -0
- package/docs/config-usage.md +113 -0
- package/docs/custom-tools.md +541 -0
- package/docs/extension-loading.md +1004 -0
- package/docs/hooks.md +867 -0
- package/docs/rpc.md +1040 -0
- package/docs/sdk.md +994 -0
- package/docs/session-tree-plan.md +441 -0
- package/docs/session.md +240 -0
- package/docs/skills.md +290 -0
- package/docs/theme.md +670 -0
- package/docs/tree.md +197 -0
- package/docs/tui.md +341 -0
- package/examples/README.md +21 -0
- package/examples/custom-tools/README.md +124 -0
- package/examples/custom-tools/hello/index.ts +20 -0
- package/examples/custom-tools/question/index.ts +84 -0
- package/examples/custom-tools/subagent/README.md +172 -0
- package/examples/custom-tools/subagent/agents/planner.md +37 -0
- package/examples/custom-tools/subagent/agents/scout.md +50 -0
- package/examples/custom-tools/subagent/agents/worker.md +24 -0
- package/examples/custom-tools/subagent/agents.ts +156 -0
- package/examples/custom-tools/subagent/commands/implement-and-review.md +10 -0
- package/examples/custom-tools/subagent/commands/implement.md +10 -0
- package/examples/custom-tools/subagent/commands/scout-and-plan.md +9 -0
- package/examples/custom-tools/subagent/index.ts +1002 -0
- package/examples/custom-tools/todo/index.ts +212 -0
- package/examples/hooks/README.md +56 -0
- package/examples/hooks/auto-commit-on-exit.ts +49 -0
- package/examples/hooks/confirm-destructive.ts +59 -0
- package/examples/hooks/custom-compaction.ts +116 -0
- package/examples/hooks/dirty-repo-guard.ts +52 -0
- package/examples/hooks/file-trigger.ts +41 -0
- package/examples/hooks/git-checkpoint.ts +53 -0
- package/examples/hooks/handoff.ts +150 -0
- package/examples/hooks/permission-gate.ts +34 -0
- package/examples/hooks/protected-paths.ts +30 -0
- package/examples/hooks/qna.ts +119 -0
- package/examples/hooks/snake.ts +343 -0
- package/examples/hooks/status-line.ts +40 -0
- package/examples/sdk/01-minimal.ts +22 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +44 -0
- package/examples/sdk/04-skills.ts +44 -0
- package/examples/sdk/05-tools.ts +90 -0
- package/examples/sdk/06-hooks.ts +61 -0
- package/examples/sdk/07-context-files.ts +36 -0
- package/examples/sdk/08-slash-commands.ts +42 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +55 -0
- package/examples/sdk/10-settings.ts +38 -0
- package/examples/sdk/11-sessions.ts +48 -0
- package/examples/sdk/12-full-control.ts +95 -0
- package/examples/sdk/README.md +154 -0
- package/package.json +89 -0
- package/src/bun-imports.d.ts +16 -0
- package/src/capability/context-file.ts +40 -0
- package/src/capability/extension.ts +48 -0
- package/src/capability/hook.ts +40 -0
- package/src/capability/index.ts +616 -0
- package/src/capability/instruction.ts +37 -0
- package/src/capability/mcp.ts +52 -0
- package/src/capability/prompt.ts +35 -0
- package/src/capability/rule.ts +56 -0
- package/src/capability/settings.ts +35 -0
- package/src/capability/skill.ts +49 -0
- package/src/capability/slash-command.ts +40 -0
- package/src/capability/system-prompt.ts +35 -0
- package/src/capability/tool.ts +38 -0
- package/src/capability/types.ts +166 -0
- package/src/cli/args.ts +259 -0
- package/src/cli/file-processor.ts +121 -0
- package/src/cli/list-models.ts +104 -0
- package/src/cli/plugin-cli.ts +661 -0
- package/src/cli/session-picker.ts +41 -0
- package/src/cli/update-cli.ts +274 -0
- package/src/cli.ts +10 -0
- package/src/config.ts +391 -0
- package/src/core/agent-session.ts +2178 -0
- package/src/core/auth-storage.ts +258 -0
- package/src/core/bash-executor.ts +197 -0
- package/src/core/compaction/branch-summarization.ts +315 -0
- package/src/core/compaction/compaction.ts +664 -0
- package/src/core/compaction/index.ts +7 -0
- package/src/core/compaction/utils.ts +153 -0
- package/src/core/custom-commands/bundled/review/index.ts +156 -0
- package/src/core/custom-commands/index.ts +15 -0
- package/src/core/custom-commands/loader.ts +226 -0
- package/src/core/custom-commands/types.ts +112 -0
- package/src/core/custom-tools/index.ts +22 -0
- package/src/core/custom-tools/loader.ts +248 -0
- package/src/core/custom-tools/types.ts +185 -0
- package/src/core/custom-tools/wrapper.ts +29 -0
- package/src/core/exec.ts +139 -0
- package/src/core/export-html/index.ts +159 -0
- package/src/core/export-html/template.css +774 -0
- package/src/core/export-html/template.generated.ts +2 -0
- package/src/core/export-html/template.html +45 -0
- package/src/core/export-html/template.js +1185 -0
- package/src/core/export-html/template.macro.ts +24 -0
- package/src/core/file-mentions.ts +54 -0
- package/src/core/hooks/index.ts +16 -0
- package/src/core/hooks/loader.ts +288 -0
- package/src/core/hooks/runner.ts +434 -0
- package/src/core/hooks/tool-wrapper.ts +98 -0
- package/src/core/hooks/types.ts +770 -0
- package/src/core/index.ts +53 -0
- package/src/core/logger.ts +112 -0
- package/src/core/mcp/client.ts +185 -0
- package/src/core/mcp/config.ts +248 -0
- package/src/core/mcp/index.ts +45 -0
- package/src/core/mcp/loader.ts +99 -0
- package/src/core/mcp/manager.ts +235 -0
- package/src/core/mcp/tool-bridge.ts +156 -0
- package/src/core/mcp/transports/http.ts +316 -0
- package/src/core/mcp/transports/index.ts +6 -0
- package/src/core/mcp/transports/stdio.ts +252 -0
- package/src/core/mcp/types.ts +228 -0
- package/src/core/messages.ts +211 -0
- package/src/core/model-registry.ts +334 -0
- package/src/core/model-resolver.ts +494 -0
- package/src/core/plugins/doctor.ts +67 -0
- package/src/core/plugins/index.ts +38 -0
- package/src/core/plugins/installer.ts +189 -0
- package/src/core/plugins/loader.ts +339 -0
- package/src/core/plugins/manager.ts +672 -0
- package/src/core/plugins/parser.ts +105 -0
- package/src/core/plugins/paths.ts +37 -0
- package/src/core/plugins/types.ts +190 -0
- package/src/core/sdk.ts +900 -0
- package/src/core/session-manager.ts +1837 -0
- package/src/core/settings-manager.ts +860 -0
- package/src/core/skills.ts +352 -0
- package/src/core/slash-commands.ts +132 -0
- package/src/core/system-prompt.ts +442 -0
- package/src/core/timings.ts +25 -0
- package/src/core/title-generator.ts +110 -0
- package/src/core/tools/ask.ts +193 -0
- package/src/core/tools/bash-interceptor.ts +120 -0
- package/src/core/tools/bash.ts +91 -0
- package/src/core/tools/context.ts +32 -0
- package/src/core/tools/edit-diff.ts +487 -0
- package/src/core/tools/edit.ts +140 -0
- package/src/core/tools/exa/company.ts +59 -0
- package/src/core/tools/exa/index.ts +63 -0
- package/src/core/tools/exa/linkedin.ts +59 -0
- package/src/core/tools/exa/mcp-client.ts +368 -0
- package/src/core/tools/exa/render.ts +200 -0
- package/src/core/tools/exa/researcher.ts +90 -0
- package/src/core/tools/exa/search.ts +338 -0
- package/src/core/tools/exa/types.ts +167 -0
- package/src/core/tools/exa/websets.ts +248 -0
- package/src/core/tools/find.ts +244 -0
- package/src/core/tools/grep.ts +584 -0
- package/src/core/tools/index.ts +283 -0
- package/src/core/tools/ls.ts +142 -0
- package/src/core/tools/lsp/client.ts +767 -0
- package/src/core/tools/lsp/clients/biome-client.ts +207 -0
- package/src/core/tools/lsp/clients/index.ts +49 -0
- package/src/core/tools/lsp/clients/lsp-linter-client.ts +98 -0
- package/src/core/tools/lsp/config.ts +845 -0
- package/src/core/tools/lsp/edits.ts +110 -0
- package/src/core/tools/lsp/index.ts +1364 -0
- package/src/core/tools/lsp/render.ts +560 -0
- package/src/core/tools/lsp/rust-analyzer.ts +145 -0
- package/src/core/tools/lsp/types.ts +495 -0
- package/src/core/tools/lsp/utils.ts +526 -0
- package/src/core/tools/notebook.ts +182 -0
- package/src/core/tools/output.ts +198 -0
- package/src/core/tools/path-utils.ts +61 -0
- package/src/core/tools/read.ts +507 -0
- package/src/core/tools/renderers.ts +820 -0
- package/src/core/tools/review.ts +275 -0
- package/src/core/tools/rulebook.ts +124 -0
- package/src/core/tools/task/agents.ts +158 -0
- package/src/core/tools/task/artifacts.ts +114 -0
- package/src/core/tools/task/commands.ts +157 -0
- package/src/core/tools/task/discovery.ts +217 -0
- package/src/core/tools/task/executor.ts +531 -0
- package/src/core/tools/task/index.ts +548 -0
- package/src/core/tools/task/model-resolver.ts +176 -0
- package/src/core/tools/task/parallel.ts +38 -0
- package/src/core/tools/task/render.ts +502 -0
- package/src/core/tools/task/subprocess-tool-registry.ts +89 -0
- package/src/core/tools/task/types.ts +142 -0
- package/src/core/tools/truncate.ts +265 -0
- package/src/core/tools/web-fetch.ts +2511 -0
- package/src/core/tools/web-search/auth.ts +199 -0
- package/src/core/tools/web-search/index.ts +583 -0
- package/src/core/tools/web-search/providers/anthropic.ts +198 -0
- package/src/core/tools/web-search/providers/exa.ts +196 -0
- package/src/core/tools/web-search/providers/perplexity.ts +195 -0
- package/src/core/tools/web-search/render.ts +372 -0
- package/src/core/tools/web-search/types.ts +180 -0
- package/src/core/tools/write.ts +63 -0
- package/src/core/ttsr.ts +211 -0
- package/src/core/utils.ts +187 -0
- package/src/discovery/agents-md.ts +75 -0
- package/src/discovery/builtin.ts +647 -0
- package/src/discovery/claude.ts +623 -0
- package/src/discovery/cline.ts +104 -0
- package/src/discovery/codex.ts +571 -0
- package/src/discovery/cursor.ts +266 -0
- package/src/discovery/gemini.ts +368 -0
- package/src/discovery/github.ts +120 -0
- package/src/discovery/helpers.test.ts +127 -0
- package/src/discovery/helpers.ts +249 -0
- package/src/discovery/index.ts +84 -0
- package/src/discovery/mcp-json.ts +127 -0
- package/src/discovery/vscode.ts +99 -0
- package/src/discovery/windsurf.ts +219 -0
- package/src/index.ts +192 -0
- package/src/main.ts +507 -0
- package/src/migrations.ts +156 -0
- package/src/modes/cleanup.ts +23 -0
- package/src/modes/index.ts +48 -0
- package/src/modes/interactive/components/armin.ts +382 -0
- package/src/modes/interactive/components/assistant-message.ts +86 -0
- package/src/modes/interactive/components/bash-execution.ts +199 -0
- package/src/modes/interactive/components/bordered-loader.ts +41 -0
- package/src/modes/interactive/components/branch-summary-message.ts +42 -0
- package/src/modes/interactive/components/compaction-summary-message.ts +45 -0
- package/src/modes/interactive/components/custom-editor.ts +122 -0
- package/src/modes/interactive/components/diff.ts +147 -0
- package/src/modes/interactive/components/dynamic-border.ts +25 -0
- package/src/modes/interactive/components/extensions/extension-dashboard.ts +296 -0
- package/src/modes/interactive/components/extensions/extension-list.ts +479 -0
- package/src/modes/interactive/components/extensions/index.ts +9 -0
- package/src/modes/interactive/components/extensions/inspector-panel.ts +313 -0
- package/src/modes/interactive/components/extensions/state-manager.ts +558 -0
- package/src/modes/interactive/components/extensions/types.ts +191 -0
- package/src/modes/interactive/components/hook-editor.ts +117 -0
- package/src/modes/interactive/components/hook-input.ts +64 -0
- package/src/modes/interactive/components/hook-message.ts +96 -0
- package/src/modes/interactive/components/hook-selector.ts +91 -0
- package/src/modes/interactive/components/model-selector.ts +560 -0
- package/src/modes/interactive/components/oauth-selector.ts +136 -0
- package/src/modes/interactive/components/plugin-settings.ts +481 -0
- package/src/modes/interactive/components/queue-mode-selector.ts +56 -0
- package/src/modes/interactive/components/session-selector.ts +220 -0
- package/src/modes/interactive/components/settings-defs.ts +597 -0
- package/src/modes/interactive/components/settings-selector.ts +545 -0
- package/src/modes/interactive/components/show-images-selector.ts +45 -0
- package/src/modes/interactive/components/status-line/index.ts +4 -0
- package/src/modes/interactive/components/status-line/presets.ts +94 -0
- package/src/modes/interactive/components/status-line/segments.ts +350 -0
- package/src/modes/interactive/components/status-line/separators.ts +55 -0
- package/src/modes/interactive/components/status-line/types.ts +81 -0
- package/src/modes/interactive/components/status-line-segment-editor.ts +357 -0
- package/src/modes/interactive/components/status-line.ts +384 -0
- package/src/modes/interactive/components/theme-selector.ts +62 -0
- package/src/modes/interactive/components/thinking-selector.ts +64 -0
- package/src/modes/interactive/components/tool-execution.ts +946 -0
- package/src/modes/interactive/components/tree-selector.ts +877 -0
- package/src/modes/interactive/components/ttsr-notification.ts +82 -0
- package/src/modes/interactive/components/user-message-selector.ts +159 -0
- package/src/modes/interactive/components/user-message.ts +18 -0
- package/src/modes/interactive/components/visual-truncate.ts +50 -0
- package/src/modes/interactive/components/welcome.ts +228 -0
- package/src/modes/interactive/interactive-mode.ts +2669 -0
- package/src/modes/interactive/theme/dark.json +102 -0
- package/src/modes/interactive/theme/defaults/dark-arctic.json +111 -0
- package/src/modes/interactive/theme/defaults/dark-catppuccin.json +106 -0
- package/src/modes/interactive/theme/defaults/dark-cyberpunk.json +109 -0
- package/src/modes/interactive/theme/defaults/dark-dracula.json +105 -0
- package/src/modes/interactive/theme/defaults/dark-forest.json +103 -0
- package/src/modes/interactive/theme/defaults/dark-github.json +112 -0
- package/src/modes/interactive/theme/defaults/dark-gruvbox.json +119 -0
- package/src/modes/interactive/theme/defaults/dark-monochrome.json +101 -0
- package/src/modes/interactive/theme/defaults/dark-monokai.json +105 -0
- package/src/modes/interactive/theme/defaults/dark-nord.json +104 -0
- package/src/modes/interactive/theme/defaults/dark-ocean.json +108 -0
- package/src/modes/interactive/theme/defaults/dark-one.json +107 -0
- package/src/modes/interactive/theme/defaults/dark-retro.json +99 -0
- package/src/modes/interactive/theme/defaults/dark-rose-pine.json +95 -0
- package/src/modes/interactive/theme/defaults/dark-solarized.json +96 -0
- package/src/modes/interactive/theme/defaults/dark-sunset.json +106 -0
- package/src/modes/interactive/theme/defaults/dark-synthwave.json +102 -0
- package/src/modes/interactive/theme/defaults/dark-tokyo-night.json +108 -0
- package/src/modes/interactive/theme/defaults/index.ts +67 -0
- package/src/modes/interactive/theme/defaults/light-arctic.json +106 -0
- package/src/modes/interactive/theme/defaults/light-catppuccin.json +105 -0
- package/src/modes/interactive/theme/defaults/light-cyberpunk.json +103 -0
- package/src/modes/interactive/theme/defaults/light-forest.json +107 -0
- package/src/modes/interactive/theme/defaults/light-github.json +114 -0
- package/src/modes/interactive/theme/defaults/light-gruvbox.json +115 -0
- package/src/modes/interactive/theme/defaults/light-monochrome.json +100 -0
- package/src/modes/interactive/theme/defaults/light-ocean.json +106 -0
- package/src/modes/interactive/theme/defaults/light-one.json +105 -0
- package/src/modes/interactive/theme/defaults/light-retro.json +105 -0
- package/src/modes/interactive/theme/defaults/light-solarized.json +101 -0
- package/src/modes/interactive/theme/defaults/light-sunset.json +106 -0
- package/src/modes/interactive/theme/defaults/light-synthwave.json +105 -0
- package/src/modes/interactive/theme/defaults/light-tokyo-night.json +118 -0
- package/src/modes/interactive/theme/light.json +99 -0
- package/src/modes/interactive/theme/theme-schema.json +424 -0
- package/src/modes/interactive/theme/theme.ts +2211 -0
- package/src/modes/print-mode.ts +163 -0
- package/src/modes/rpc/rpc-client.ts +527 -0
- package/src/modes/rpc/rpc-mode.ts +494 -0
- package/src/modes/rpc/rpc-types.ts +203 -0
- package/src/prompts/architect-plan.md +10 -0
- package/src/prompts/branch-summary-preamble.md +3 -0
- package/src/prompts/branch-summary.md +28 -0
- package/src/prompts/browser.md +71 -0
- package/src/prompts/compaction-summary.md +34 -0
- package/src/prompts/compaction-turn-prefix.md +16 -0
- package/src/prompts/compaction-update-summary.md +41 -0
- package/src/prompts/explore.md +82 -0
- package/src/prompts/implement-with-critic.md +11 -0
- package/src/prompts/implement.md +11 -0
- package/src/prompts/init.md +30 -0
- package/src/prompts/plan.md +54 -0
- package/src/prompts/reviewer.md +81 -0
- package/src/prompts/summarization-system.md +3 -0
- package/src/prompts/system-prompt.md +27 -0
- package/src/prompts/task.md +56 -0
- package/src/prompts/title-system.md +8 -0
- package/src/prompts/tools/ask.md +24 -0
- package/src/prompts/tools/bash.md +23 -0
- package/src/prompts/tools/edit.md +9 -0
- package/src/prompts/tools/find.md +6 -0
- package/src/prompts/tools/grep.md +12 -0
- package/src/prompts/tools/lsp.md +14 -0
- package/src/prompts/tools/output.md +23 -0
- package/src/prompts/tools/read.md +25 -0
- package/src/prompts/tools/web-fetch.md +8 -0
- package/src/prompts/tools/web-search.md +10 -0
- package/src/prompts/tools/write.md +10 -0
- package/src/utils/changelog.ts +99 -0
- package/src/utils/clipboard.ts +265 -0
- package/src/utils/fuzzy.ts +108 -0
- package/src/utils/mime.ts +30 -0
- package/src/utils/shell-snapshot.ts +218 -0
- package/src/utils/shell.ts +364 -0
- package/src/utils/tools-manager.ts +265 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model resolution with fuzzy pattern matching.
|
|
3
|
+
*
|
|
4
|
+
* Returns models in "provider/modelId" format for use with --model flag.
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Exact match: "gpt-5.2" → "p-openai/gpt-5.2"
|
|
8
|
+
* - Fuzzy match: "opus" → "p-anthropic/claude-opus-4-5"
|
|
9
|
+
* - Comma fallback: "gpt, opus" → tries gpt first, then opus
|
|
10
|
+
* - "default" → undefined (use system default)
|
|
11
|
+
* - "omp/slow" → configured slow model from settings
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { spawnSync } from "node:child_process";
|
|
15
|
+
import { type Settings, settingsCapability } from "../../../capability/settings";
|
|
16
|
+
import { loadSync } from "../../../discovery";
|
|
17
|
+
|
|
18
|
+
/** omp command: 'omp.cmd' on Windows, 'omp' elsewhere */
|
|
19
|
+
const OMP_CMD = process.platform === "win32" ? "omp.cmd" : "omp";
|
|
20
|
+
|
|
21
|
+
/** Windows shell option for spawn/spawnSync */
|
|
22
|
+
const OMP_SHELL_OPT = process.platform === "win32";
|
|
23
|
+
|
|
24
|
+
/** Cache for available models (provider/modelId format) */
|
|
25
|
+
let cachedModels: string[] | null = null;
|
|
26
|
+
|
|
27
|
+
/** Cache expiry time (5 minutes) */
|
|
28
|
+
let cacheExpiry = 0;
|
|
29
|
+
|
|
30
|
+
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Get available models from `omp --list-models`.
|
|
34
|
+
* Returns models in "provider/modelId" format.
|
|
35
|
+
* Caches the result for performance.
|
|
36
|
+
*/
|
|
37
|
+
export function getAvailableModels(): string[] {
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
if (cachedModels !== null && now < cacheExpiry) {
|
|
40
|
+
return cachedModels;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
const result = spawnSync(OMP_CMD, ["--list-models"], {
|
|
45
|
+
encoding: "utf-8",
|
|
46
|
+
timeout: 5000,
|
|
47
|
+
shell: OMP_SHELL_OPT,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
if (result.status !== 0 || !result.stdout) {
|
|
51
|
+
cachedModels = [];
|
|
52
|
+
cacheExpiry = now + CACHE_TTL_MS;
|
|
53
|
+
return cachedModels;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Parse output: skip header line, extract provider/model
|
|
57
|
+
const lines = result.stdout.trim().split("\n");
|
|
58
|
+
cachedModels = lines
|
|
59
|
+
.slice(1) // Skip header
|
|
60
|
+
.map((line) => {
|
|
61
|
+
const parts = line.trim().split(/\s+/);
|
|
62
|
+
// Format: provider/modelId
|
|
63
|
+
return parts[0] && parts[1] ? `${parts[0]}/${parts[1]}` : "";
|
|
64
|
+
})
|
|
65
|
+
.filter(Boolean);
|
|
66
|
+
|
|
67
|
+
cacheExpiry = now + CACHE_TTL_MS;
|
|
68
|
+
return cachedModels;
|
|
69
|
+
} catch {
|
|
70
|
+
cachedModels = [];
|
|
71
|
+
cacheExpiry = now + CACHE_TTL_MS;
|
|
72
|
+
return cachedModels;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Clear the model cache (for testing).
|
|
78
|
+
*/
|
|
79
|
+
export function clearModelCache(): void {
|
|
80
|
+
cachedModels = null;
|
|
81
|
+
cacheExpiry = 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Load model roles from settings files using capability API.
|
|
86
|
+
*/
|
|
87
|
+
function loadModelRoles(): Record<string, string> {
|
|
88
|
+
const result = loadSync<Settings>(settingsCapability.id, { cwd: process.cwd() });
|
|
89
|
+
|
|
90
|
+
// Merge all settings, prioritizing first (highest priority)
|
|
91
|
+
let modelRoles: Record<string, string> = {};
|
|
92
|
+
for (const settings of result.items.reverse()) {
|
|
93
|
+
const roles = settings.data.modelRoles as Record<string, string> | undefined;
|
|
94
|
+
if (roles) {
|
|
95
|
+
modelRoles = { ...modelRoles, ...roles };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return modelRoles;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Resolve an omp/<role> alias to a model string.
|
|
104
|
+
* Looks up the role in settings.modelRoles and returns the configured model.
|
|
105
|
+
* Returns undefined if the role isn't configured.
|
|
106
|
+
*/
|
|
107
|
+
function resolveOmpAlias(role: string, availableModels: string[]): string | undefined {
|
|
108
|
+
const roles = loadModelRoles();
|
|
109
|
+
|
|
110
|
+
// Look up role in settings (case-insensitive)
|
|
111
|
+
const configured = roles[role] || roles[role.toLowerCase()];
|
|
112
|
+
if (!configured) return undefined;
|
|
113
|
+
|
|
114
|
+
// configured is in "provider/modelId" format, find in available models
|
|
115
|
+
return availableModels.find((m) => m.toLowerCase() === configured.toLowerCase());
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Extract model ID from "provider/modelId" format.
|
|
120
|
+
*/
|
|
121
|
+
function getModelId(fullModel: string): string {
|
|
122
|
+
const slashIdx = fullModel.indexOf("/");
|
|
123
|
+
return slashIdx > 0 ? fullModel.slice(slashIdx + 1) : fullModel;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Resolve a fuzzy model pattern to "provider/modelId" format.
|
|
128
|
+
*
|
|
129
|
+
* Supports comma-separated patterns (e.g., "gpt, opus") - tries each in order.
|
|
130
|
+
* Returns undefined if pattern is "default", undefined, or no match found.
|
|
131
|
+
*
|
|
132
|
+
* @param pattern - Model pattern to resolve
|
|
133
|
+
* @param availableModels - Optional pre-fetched list of available models (in provider/modelId format)
|
|
134
|
+
*/
|
|
135
|
+
export function resolveModelPattern(pattern: string | undefined, availableModels?: string[]): string | undefined {
|
|
136
|
+
if (!pattern || pattern === "default") {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const models = availableModels ?? getAvailableModels();
|
|
141
|
+
if (models.length === 0) {
|
|
142
|
+
// Fallback: return pattern as-is if we can't get available models
|
|
143
|
+
return pattern;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Split by comma, try each pattern in order
|
|
147
|
+
const patterns = pattern
|
|
148
|
+
.split(",")
|
|
149
|
+
.map((p) => p.trim())
|
|
150
|
+
.filter(Boolean);
|
|
151
|
+
|
|
152
|
+
for (const p of patterns) {
|
|
153
|
+
// Handle omp/<role> aliases - looks up role in settings.modelRoles
|
|
154
|
+
if (p.toLowerCase().startsWith("omp/")) {
|
|
155
|
+
const role = p.slice(4); // Remove "omp/" prefix
|
|
156
|
+
const resolved = resolveOmpAlias(role, models);
|
|
157
|
+
if (resolved) return resolved;
|
|
158
|
+
continue; // Role not configured, try next pattern
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Try exact match on full provider/modelId
|
|
162
|
+
const exactFull = models.find((m) => m.toLowerCase() === p.toLowerCase());
|
|
163
|
+
if (exactFull) return exactFull;
|
|
164
|
+
|
|
165
|
+
// Try exact match on model ID only
|
|
166
|
+
const exactId = models.find((m) => getModelId(m).toLowerCase() === p.toLowerCase());
|
|
167
|
+
if (exactId) return exactId;
|
|
168
|
+
|
|
169
|
+
// Try fuzzy match on model ID (substring)
|
|
170
|
+
const fuzzyMatch = models.find((m) => getModelId(m).toLowerCase().includes(p.toLowerCase()));
|
|
171
|
+
if (fuzzyMatch) return fuzzyMatch;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// No match found - use default model
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel execution with concurrency control.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { MAX_CONCURRENCY } from "./types";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Execute items with a concurrency limit using a worker pool pattern.
|
|
9
|
+
* Results are returned in the same order as input items.
|
|
10
|
+
*
|
|
11
|
+
* @param items - Items to process
|
|
12
|
+
* @param concurrency - Maximum concurrent operations
|
|
13
|
+
* @param fn - Async function to execute for each item
|
|
14
|
+
*/
|
|
15
|
+
export async function mapWithConcurrencyLimit<T, R>(
|
|
16
|
+
items: T[],
|
|
17
|
+
concurrency: number,
|
|
18
|
+
fn: (item: T, index: number) => Promise<R>,
|
|
19
|
+
): Promise<R[]> {
|
|
20
|
+
const limit = Math.max(1, Math.min(concurrency, items.length, MAX_CONCURRENCY));
|
|
21
|
+
const results: R[] = new Array(items.length);
|
|
22
|
+
let nextIndex = 0;
|
|
23
|
+
|
|
24
|
+
const worker = async (): Promise<void> => {
|
|
25
|
+
while (nextIndex < items.length) {
|
|
26
|
+
const index = nextIndex++;
|
|
27
|
+
results[index] = await fn(items[index], index);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// Create worker pool
|
|
32
|
+
const workers = Array(limit)
|
|
33
|
+
.fill(null)
|
|
34
|
+
.map(() => worker());
|
|
35
|
+
|
|
36
|
+
await Promise.all(workers);
|
|
37
|
+
return results;
|
|
38
|
+
}
|