@asterxsk/kiln 0.4.0 → 0.4.2
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 +155 -155
- package/agent/AGENTS.md +67 -67
- package/agent/README.md +5 -5
- package/agent/extensions/ask-user/index.ts +418 -418
- package/agent/extensions/ask-user/install.ps1 +27 -27
- package/agent/extensions/ask-user/install.sh +24 -24
- package/agent/extensions/ask-user/package-lock.json +769 -769
- package/agent/extensions/ask-user/package.json +19 -19
- package/agent/extensions/ask-user/prompt.ts +45 -45
- package/agent/extensions/ask-user/tsconfig.json +7 -7
- package/agent/extensions/background-terminals/docs/implementation-guide.md +942 -942
- package/agent/extensions/background-terminals/index.ts +627 -627
- package/agent/extensions/background-terminals/install.ps1 +27 -27
- package/agent/extensions/background-terminals/install.sh +24 -24
- package/agent/extensions/background-terminals/manager.test.ts +735 -735
- package/agent/extensions/background-terminals/output.test.ts +109 -109
- package/agent/extensions/background-terminals/package-lock.json +769 -769
- package/agent/extensions/background-terminals/package.json +17 -17
- package/agent/extensions/background-terminals/prompt.test.ts +125 -125
- package/agent/extensions/background-terminals/ps.test.ts +82 -82
- package/agent/extensions/background-terminals/result-delivery.test.ts +44 -44
- package/agent/extensions/background-terminals/src/domain.ts +87 -87
- package/agent/extensions/background-terminals/src/manager.ts +907 -907
- package/agent/extensions/background-terminals/src/output.ts +84 -84
- package/agent/extensions/background-terminals/src/prompt.ts +142 -142
- package/agent/extensions/background-terminals/src/result-delivery.ts +27 -27
- package/agent/extensions/background-terminals/src/runtime.ts +36 -36
- package/agent/extensions/background-terminals/src/ui/output-view.ts +79 -79
- package/agent/extensions/background-terminals/src/ui/ps.ts +621 -621
- package/agent/extensions/background-terminals/tsconfig.json +7 -7
- package/agent/extensions/destructive/README.md +31 -31
- package/agent/extensions/destructive/index.ts +88 -88
- package/agent/extensions/destructive/install.ps1 +27 -27
- package/agent/extensions/destructive/install.sh +24 -24
- package/agent/extensions/file-search/index.spec.ts +443 -443
- package/agent/extensions/file-search/index.ts +459 -459
- package/agent/extensions/file-search/install.ps1 +27 -27
- package/agent/extensions/file-search/install.sh +24 -24
- package/agent/extensions/file-search/package-lock.json +2253 -2253
- package/agent/extensions/file-search/package.json +23 -23
- package/agent/extensions/file-search/src/args.ts +122 -122
- package/agent/extensions/file-search/src/binaries.ts +422 -422
- package/agent/extensions/file-search/src/output.ts +126 -126
- package/agent/extensions/file-search/src/process.ts +146 -146
- package/agent/extensions/file-search/src/prompt.ts +52 -52
- package/agent/extensions/file-search/tsconfig.json +7 -7
- package/agent/extensions/goal/README.md +50 -50
- package/agent/extensions/goal/index.ts +155 -155
- package/agent/extensions/goal/install.ps1 +27 -27
- package/agent/extensions/goal/install.sh +24 -24
- package/agent/extensions/kiln-update/README.md +38 -25
- package/agent/extensions/kiln-update/index.ts +177 -99
- package/agent/extensions/modelconf/PLAN.md +915 -915
- package/agent/extensions/modelconf/README.md +66 -66
- package/agent/extensions/modelconf/index.ts +296 -296
- package/agent/extensions/modelconf/install.ps1 +27 -27
- package/agent/extensions/modelconf/install.sh +24 -24
- package/agent/extensions/modelconf/package-lock.json +1809 -1809
- package/agent/extensions/modelconf/package.json +13 -13
- package/agent/extensions/modelconf/src/fuzzy.ts +26 -26
- package/agent/extensions/modelconf/src/glob.ts +13 -13
- package/agent/extensions/modelconf/src/persistence.test.ts +46 -46
- package/agent/extensions/modelconf/src/persistence.ts +164 -164
- package/agent/extensions/modelconf/src/ui/ModelConfView.test.ts +75 -75
- package/agent/extensions/modelconf/src/ui/ModelConfView.ts +1101 -1101
- package/agent/extensions/modelconf/tsconfig.json +15 -15
- package/agent/extensions/pi-web-access/CHANGELOG.md +690 -690
- package/agent/extensions/pi-web-access/LICENSE +21 -21
- package/agent/extensions/pi-web-access/README.md +470 -470
- package/agent/extensions/pi-web-access/SECURITY.md +5 -5
- package/agent/extensions/pi-web-access/activity.ts +101 -101
- package/agent/extensions/pi-web-access/auth-fetch.ts +148 -148
- package/agent/extensions/pi-web-access/brightdata-unlocker.ts +272 -272
- package/agent/extensions/pi-web-access/chrome-cookies.ts +669 -669
- package/agent/extensions/pi-web-access/content-find.ts +139 -139
- package/agent/extensions/pi-web-access/credential-source.ts +191 -191
- package/agent/extensions/pi-web-access/data-uri-sanitize.ts +406 -406
- package/agent/extensions/pi-web-access/datalab-pdf-extract.ts +568 -568
- package/agent/extensions/pi-web-access/declared-web-links.ts +173 -173
- package/agent/extensions/pi-web-access/evidence/CONTRACT-EVIDENCE.md +496 -496
- package/agent/extensions/pi-web-access/evidence/contract-probe.mjs +140 -140
- package/agent/extensions/pi-web-access/exa.ts +526 -526
- package/agent/extensions/pi-web-access/extract.ts +1196 -1196
- package/agent/extensions/pi-web-access/feature-config.ts +29 -29
- package/agent/extensions/pi-web-access/fetch-params.ts +111 -111
- package/agent/extensions/pi-web-access/gemini-adc.ts +298 -298
- package/agent/extensions/pi-web-access/gemini-api.ts +353 -353
- package/agent/extensions/pi-web-access/gemini-pdf-extract.ts +108 -108
- package/agent/extensions/pi-web-access/gemini-search.ts +21 -21
- package/agent/extensions/pi-web-access/gemini-url-context.ts +128 -128
- package/agent/extensions/pi-web-access/gemini-web-config.ts +101 -101
- package/agent/extensions/pi-web-access/gemini-web.ts +487 -487
- package/agent/extensions/pi-web-access/github-api.ts +197 -197
- package/agent/extensions/pi-web-access/github-extract.ts +746 -746
- package/agent/extensions/pi-web-access/github-issue-pr.ts +700 -700
- package/agent/extensions/pi-web-access/index.ts +1737 -1737
- package/agent/extensions/pi-web-access/package-lock.json +5808 -5808
- package/agent/extensions/pi-web-access/package.json +64 -64
- package/agent/extensions/pi-web-access/page-query.ts +96 -96
- package/agent/extensions/pi-web-access/pdf-extract.ts +409 -409
- package/agent/extensions/pi-web-access/promise-try.d.ts +7 -7
- package/agent/extensions/pi-web-access/query-rewrite.ts +51 -51
- package/agent/extensions/pi-web-access/render-search-error.ts +170 -170
- package/agent/extensions/pi-web-access/rsc-extract.ts +338 -338
- package/agent/extensions/pi-web-access/search-types.ts +20 -20
- package/agent/extensions/pi-web-access/source-check.ts +282 -282
- package/agent/extensions/pi-web-access/ssrf-protection.ts +526 -526
- package/agent/extensions/pi-web-access/storage.ts +521 -521
- package/agent/extensions/pi-web-access/summary-model-scope.ts +125 -125
- package/agent/extensions/pi-web-access/test/auth-fetch.test.mjs +208 -208
- package/agent/extensions/pi-web-access/test/brightdata-unlocker.test.mjs +840 -840
- package/agent/extensions/pi-web-access/test/chrome-cookie-extraction.test.mjs +441 -441
- package/agent/extensions/pi-web-access/test/config-path.test.mjs +283 -283
- package/agent/extensions/pi-web-access/test/content-find.test.mjs +25 -25
- package/agent/extensions/pi-web-access/test/credential-source.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/data-uri-sanitize.test.mjs +210 -210
- package/agent/extensions/pi-web-access/test/datalab-pdf-extract.test.mjs +552 -552
- package/agent/extensions/pi-web-access/test/declared-web-links.test.mjs +212 -212
- package/agent/extensions/pi-web-access/test/fetch-answer-storage.test.mjs +40 -40
- package/agent/extensions/pi-web-access/test/fetch-cache-storage.test.mjs +334 -334
- package/agent/extensions/pi-web-access/test/fetch-content-domain-policy.test.mjs +95 -95
- package/agent/extensions/pi-web-access/test/fetch-modes.test.mjs +53 -53
- package/agent/extensions/pi-web-access/test/fetch-not-found-guidance.test.mjs +92 -92
- package/agent/extensions/pi-web-access/test/fetch-params.test.mjs +86 -86
- package/agent/extensions/pi-web-access/test/fetch-render-call.test.mjs +34 -34
- package/agent/extensions/pi-web-access/test/fetch-routing.test.mjs +173 -173
- package/agent/extensions/pi-web-access/test/gemini-adc-auth.test.mjs +257 -257
- package/agent/extensions/pi-web-access/test/gemini-api-transport.test.mjs +170 -170
- package/agent/extensions/pi-web-access/test/gemini-pdf-extract.test.mjs +133 -133
- package/agent/extensions/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +178 -178
- package/agent/extensions/pi-web-access/test/gemini-web-header-overflow.test.mjs +148 -148
- package/agent/extensions/pi-web-access/test/get-search-content.test.mjs +223 -223
- package/agent/extensions/pi-web-access/test/github-extract.test.mjs +378 -378
- package/agent/extensions/pi-web-access/test/github-issue-pr.test.mjs +565 -565
- package/agent/extensions/pi-web-access/test/inline-content-config.test.mjs +99 -99
- package/agent/extensions/pi-web-access/test/lazy-extract-load.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/local-video-oversize.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/package-typebox-dependency.test.mjs +50 -50
- package/agent/extensions/pi-web-access/test/page-query.test.mjs +51 -51
- package/agent/extensions/pi-web-access/test/pdf-config.test.mjs +140 -140
- package/agent/extensions/pi-web-access/test/pdf-extract.test.mjs +500 -500
- package/agent/extensions/pi-web-access/test/proxy-transport.test.mjs +286 -286
- package/agent/extensions/pi-web-access/test/query-rewrite.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/rsc-fallback.test.mjs +102 -102
- package/agent/extensions/pi-web-access/test/search-error-render.test.mjs +152 -152
- package/agent/extensions/pi-web-access/test/search-providers.test.mjs +274 -274
- package/agent/extensions/pi-web-access/test/source-check.test.mjs +179 -179
- package/agent/extensions/pi-web-access/test/ssrf-allow-ranges-config.test.mjs +205 -205
- package/agent/extensions/pi-web-access/test/ssrf-protection.test.mjs +456 -456
- package/agent/extensions/pi-web-access/test/summary-model-scope.test.mjs +106 -106
- package/agent/extensions/pi-web-access/test/tool-registration-config.test.mjs +182 -182
- package/agent/extensions/pi-web-access/test/web-search-answer-render.test.mjs +66 -66
- package/agent/extensions/pi-web-access/test/youtube-extract-errors.test.mjs +64 -64
- package/agent/extensions/pi-web-access/tsconfig.json +11 -11
- package/agent/extensions/pi-web-access/utils.ts +451 -451
- package/agent/extensions/pi-web-access/video-extract.ts +392 -392
- package/agent/extensions/pi-web-access/youtube-extract.ts +328 -328
- package/agent/extensions/shared/activity-status.ts +31 -31
- package/agent/extensions/shared/child-session.test.ts +270 -270
- package/agent/extensions/shared/child-session.ts +148 -148
- package/agent/extensions/shared/context-utilization.test.ts +48 -48
- package/agent/extensions/shared/context-utilization.ts +47 -47
- package/agent/extensions/shared/dashboard-state.ts +99 -99
- package/agent/extensions/shared/install.ps1 +27 -27
- package/agent/extensions/shared/install.sh +24 -24
- package/agent/extensions/shared/tool-call-timeout.test.ts +117 -117
- package/agent/extensions/shared/tool-call-timeout.ts +104 -104
- package/agent/extensions/skillsconf/README.md +74 -74
- package/agent/extensions/skillsconf/index.ts +92 -92
- package/agent/extensions/skillsconf/install.ps1 +27 -27
- package/agent/extensions/skillsconf/install.sh +24 -24
- package/agent/extensions/skillsconf/package-lock.json +1809 -1809
- package/agent/extensions/skillsconf/package.json +18 -18
- package/agent/extensions/skillsconf/src/delete-skill.test.ts +64 -64
- package/agent/extensions/skillsconf/src/delete-skill.ts +45 -45
- package/agent/extensions/skillsconf/src/filter.test.ts +80 -80
- package/agent/extensions/skillsconf/src/filter.ts +74 -74
- package/agent/extensions/skillsconf/src/fuzzy.ts +26 -26
- package/agent/extensions/skillsconf/src/persistence.test.ts +72 -72
- package/agent/extensions/skillsconf/src/persistence.ts +169 -169
- package/agent/extensions/skillsconf/src/ui/SkillConfView.test.ts +337 -337
- package/agent/extensions/skillsconf/src/ui/SkillConfView.ts +758 -758
- package/agent/extensions/skillsconf/src/ui/text-input.ts +91 -91
- package/agent/extensions/skillsconf/src/ui/tui-helpers.ts +144 -144
- package/agent/extensions/skillsconf/tsconfig.json +15 -15
- package/agent/extensions/statusline/index.ts +273 -282
- package/agent/extensions/statusline/install.ps1 +27 -27
- package/agent/extensions/statusline/install.sh +24 -24
- package/agent/extensions/subagents/by-the-way.test.ts +29 -29
- package/agent/extensions/subagents/claude.test.ts +119 -119
- package/agent/extensions/subagents/codex.test.ts +102 -102
- package/agent/extensions/subagents/context-usage.test.ts +107 -107
- package/agent/extensions/subagents/docs/design-plan.md +568 -568
- package/agent/extensions/subagents/docs/effect-v4-extension-guide.md +354 -354
- package/agent/extensions/subagents/docs/effect-v4-notes.md +571 -571
- package/agent/extensions/subagents/index.ts +779 -779
- package/agent/extensions/subagents/install.ps1 +27 -27
- package/agent/extensions/subagents/install.sh +24 -24
- package/agent/extensions/subagents/manager.test.ts +276 -276
- package/agent/extensions/subagents/package-lock.json +2244 -2244
- package/agent/extensions/subagents/package.json +19 -19
- package/agent/extensions/subagents/result-delivery.test.ts +27 -27
- package/agent/extensions/subagents/src/backend.ts +73 -73
- package/agent/extensions/subagents/src/backends/claude.ts +701 -701
- package/agent/extensions/subagents/src/backends/codex.ts +1060 -1060
- package/agent/extensions/subagents/src/backends/pi.ts +575 -575
- package/agent/extensions/subagents/src/backends/stub.ts +300 -300
- package/agent/extensions/subagents/src/by-the-way.ts +21 -21
- package/agent/extensions/subagents/src/domain.ts +253 -253
- package/agent/extensions/subagents/src/format.ts +74 -74
- package/agent/extensions/subagents/src/manager.ts +736 -736
- package/agent/extensions/subagents/src/prompt.ts +92 -92
- package/agent/extensions/subagents/src/result-delivery.ts +20 -20
- package/agent/extensions/subagents/src/runtime.ts +53 -53
- package/agent/extensions/subagents/src/ui/takeover.ts +583 -583
- package/agent/extensions/subagents/src/ui/transcript.ts +201 -201
- package/agent/extensions/subagents/takeover.test.ts +29 -29
- package/agent/extensions/subagents/tsconfig.json +7 -7
- package/agent/extensions/todo/AGENTS.md +38 -38
- package/agent/extensions/todo/LICENSE +21 -21
- package/agent/extensions/todo/config.ts +55 -55
- package/agent/extensions/todo/index.ts +151 -151
- package/agent/extensions/todo/install.ps1 +27 -27
- package/agent/extensions/todo/install.sh +24 -24
- package/agent/extensions/todo/locales/de.json +17 -17
- package/agent/extensions/todo/locales/en.json +15 -15
- package/agent/extensions/todo/locales/es.json +17 -17
- package/agent/extensions/todo/locales/fr.json +17 -17
- package/agent/extensions/todo/locales/pt-BR.json +17 -17
- package/agent/extensions/todo/locales/pt.json +17 -17
- package/agent/extensions/todo/locales/ru.json +17 -17
- package/agent/extensions/todo/locales/uk.json +17 -17
- package/agent/extensions/todo/locales/zh.json +17 -17
- package/agent/extensions/todo/package-lock.json +3358 -3358
- package/agent/extensions/todo/package.json +67 -67
- package/agent/extensions/todo/state/i18n-bridge.ts +64 -64
- package/agent/extensions/todo/state/invariants.ts +20 -20
- package/agent/extensions/todo/state/replay.ts +38 -38
- package/agent/extensions/todo/state/selectors.ts +107 -107
- package/agent/extensions/todo/state/state-reducer.ts +326 -326
- package/agent/extensions/todo/state/state.ts +18 -18
- package/agent/extensions/todo/state/store.ts +82 -82
- package/agent/extensions/todo/state/task-graph.ts +57 -57
- package/agent/extensions/todo/todo-overlay.ts +200 -200
- package/agent/extensions/todo/todo.ts +155 -155
- package/agent/extensions/todo/tool/response-envelope.ts +109 -109
- package/agent/extensions/todo/tool/types.ts +206 -206
- package/agent/extensions/todo/view/format.ts +177 -177
- package/agent/extensions/trim-context/README.md +54 -54
- package/agent/extensions/trim-context/index.ts +487 -487
- package/agent/extensions/trim-context/install.ps1 +27 -27
- package/agent/extensions/trim-context/install.sh +24 -24
- package/agent/keybindings.json +7 -7
- package/agent/version.txt +1 -1
- package/bin/kiln.js +20 -13
- package/package.json +1 -1
- package/agent/extensions/taste/index.ts +0 -443
- package/agent/extensions/taste/install.ps1 +0 -27
- package/agent/extensions/taste/install.sh +0 -24
|
@@ -1,125 +1,125 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import { homedir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
|
|
5
|
-
const THINKING_LEVELS = new Set(["off", "minimal", "low", "medium", "high", "xhigh", "max"]);
|
|
6
|
-
|
|
7
|
-
export type SummaryThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
|
|
8
|
-
|
|
9
|
-
interface SummaryModelScopeContext {
|
|
10
|
-
cwd: string;
|
|
11
|
-
isProjectTrusted(): boolean;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface ModelLike {
|
|
15
|
-
provider: string;
|
|
16
|
-
id: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface ModelRegistryLike<T extends ModelLike = ModelLike> {
|
|
20
|
-
find(provider: string, id: string): T | undefined;
|
|
21
|
-
getAvailable(): readonly T[];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Resolve a model through its native provider or a provider that routes that model ID.
|
|
26
|
-
*
|
|
27
|
-
* The direct registry fallback preserves explicit/native model resolution when a
|
|
28
|
-
* provider's availability snapshot does not include the configured model. Callers
|
|
29
|
-
* continue to apply their existing enabled-model and authentication checks.
|
|
30
|
-
*/
|
|
31
|
-
export function findModelWithProviderRouting<T extends ModelLike>(
|
|
32
|
-
registry: ModelRegistryLike<T>,
|
|
33
|
-
provider: string,
|
|
34
|
-
id: string,
|
|
35
|
-
): T | undefined {
|
|
36
|
-
const available = registry.getAvailable();
|
|
37
|
-
const direct = available.find(model => model.provider === provider && model.id === id);
|
|
38
|
-
if (direct) return direct;
|
|
39
|
-
|
|
40
|
-
const routedId = `${provider}/${id}`;
|
|
41
|
-
// If multiple routers expose the same model ID, Pi's available-model ordering
|
|
42
|
-
// determines which route is selected. An explicit provider/model selector can
|
|
43
|
-
// select a specific route when that distinction matters.
|
|
44
|
-
const routed = available.find(model => model.id === routedId);
|
|
45
|
-
return routed ?? registry.find(provider, id);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function getAgentDir(): string {
|
|
49
|
-
return process.env.PI_CODING_AGENT_DIR || join(homedir(), ".pi", "agent");
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function readSettings(path: string): Record<string, unknown> {
|
|
53
|
-
if (!existsSync(path)) return {};
|
|
54
|
-
const raw = readFileSync(path, "utf8");
|
|
55
|
-
try {
|
|
56
|
-
return JSON.parse(raw) as Record<string, unknown>;
|
|
57
|
-
} catch (err) {
|
|
58
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
59
|
-
throw new Error(`Failed to parse ${path}: ${message}`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function loadEnabledModelPatterns(ctx: SummaryModelScopeContext): string[] | null {
|
|
64
|
-
const globalSettings = readSettings(join(getAgentDir(), "settings.json"));
|
|
65
|
-
const projectSettings = ctx.isProjectTrusted()
|
|
66
|
-
? readSettings(join(ctx.cwd, ".pi", "settings.json"))
|
|
67
|
-
: {};
|
|
68
|
-
const value = Object.hasOwn(projectSettings, "enabledModels")
|
|
69
|
-
? projectSettings.enabledModels
|
|
70
|
-
: globalSettings.enabledModels;
|
|
71
|
-
if (value === undefined) return null;
|
|
72
|
-
if (!Array.isArray(value)) throw new Error("enabledModels must be an array");
|
|
73
|
-
return value
|
|
74
|
-
.filter((item): item is string => typeof item === "string")
|
|
75
|
-
.map(item => item.trim())
|
|
76
|
-
.filter(Boolean);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export function summaryModelValue(model: ModelLike): string {
|
|
80
|
-
return `${model.provider}/${model.id}`;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export function splitThinkingSuffix(value: string): { value: string; thinkingLevel?: SummaryThinkingLevel } {
|
|
84
|
-
const index = value.lastIndexOf(":");
|
|
85
|
-
if (index < 0) return { value };
|
|
86
|
-
const suffix = value.slice(index + 1);
|
|
87
|
-
return THINKING_LEVELS.has(suffix)
|
|
88
|
-
? { value: value.slice(0, index), thinkingLevel: suffix as SummaryThinkingLevel }
|
|
89
|
-
: { value };
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function stripThinkingSuffix(pattern: string): string {
|
|
93
|
-
return splitThinkingSuffix(pattern).value;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function globToRegExp(pattern: string): RegExp {
|
|
97
|
-
let source = "^";
|
|
98
|
-
for (const char of pattern) {
|
|
99
|
-
if (char === "*") {
|
|
100
|
-
source += ".*";
|
|
101
|
-
} else if (char === "?") {
|
|
102
|
-
source += ".";
|
|
103
|
-
} else {
|
|
104
|
-
source += char.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return new RegExp(`${source}$`, "i");
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export function modelMatchesEnabledPatterns(model: ModelLike, patterns: string[] | null): boolean {
|
|
111
|
-
if (patterns === null) return true;
|
|
112
|
-
const value = summaryModelValue(model).toLowerCase();
|
|
113
|
-
const id = model.id.toLowerCase();
|
|
114
|
-
for (const rawPattern of patterns) {
|
|
115
|
-
const pattern = stripThinkingSuffix(rawPattern.trim()).toLowerCase();
|
|
116
|
-
if (!pattern) continue;
|
|
117
|
-
if (pattern.includes("*") || pattern.includes("?")) {
|
|
118
|
-
const regex = globToRegExp(pattern);
|
|
119
|
-
if (regex.test(value) || regex.test(id)) return true;
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
if (pattern === value || pattern === id) return true;
|
|
123
|
-
}
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
|
|
5
|
+
const THINKING_LEVELS = new Set(["off", "minimal", "low", "medium", "high", "xhigh", "max"]);
|
|
6
|
+
|
|
7
|
+
export type SummaryThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
|
|
8
|
+
|
|
9
|
+
interface SummaryModelScopeContext {
|
|
10
|
+
cwd: string;
|
|
11
|
+
isProjectTrusted(): boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface ModelLike {
|
|
15
|
+
provider: string;
|
|
16
|
+
id: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ModelRegistryLike<T extends ModelLike = ModelLike> {
|
|
20
|
+
find(provider: string, id: string): T | undefined;
|
|
21
|
+
getAvailable(): readonly T[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Resolve a model through its native provider or a provider that routes that model ID.
|
|
26
|
+
*
|
|
27
|
+
* The direct registry fallback preserves explicit/native model resolution when a
|
|
28
|
+
* provider's availability snapshot does not include the configured model. Callers
|
|
29
|
+
* continue to apply their existing enabled-model and authentication checks.
|
|
30
|
+
*/
|
|
31
|
+
export function findModelWithProviderRouting<T extends ModelLike>(
|
|
32
|
+
registry: ModelRegistryLike<T>,
|
|
33
|
+
provider: string,
|
|
34
|
+
id: string,
|
|
35
|
+
): T | undefined {
|
|
36
|
+
const available = registry.getAvailable();
|
|
37
|
+
const direct = available.find(model => model.provider === provider && model.id === id);
|
|
38
|
+
if (direct) return direct;
|
|
39
|
+
|
|
40
|
+
const routedId = `${provider}/${id}`;
|
|
41
|
+
// If multiple routers expose the same model ID, Pi's available-model ordering
|
|
42
|
+
// determines which route is selected. An explicit provider/model selector can
|
|
43
|
+
// select a specific route when that distinction matters.
|
|
44
|
+
const routed = available.find(model => model.id === routedId);
|
|
45
|
+
return routed ?? registry.find(provider, id);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function getAgentDir(): string {
|
|
49
|
+
return process.env.PI_CODING_AGENT_DIR || join(homedir(), ".pi", "agent");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function readSettings(path: string): Record<string, unknown> {
|
|
53
|
+
if (!existsSync(path)) return {};
|
|
54
|
+
const raw = readFileSync(path, "utf8");
|
|
55
|
+
try {
|
|
56
|
+
return JSON.parse(raw) as Record<string, unknown>;
|
|
57
|
+
} catch (err) {
|
|
58
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
59
|
+
throw new Error(`Failed to parse ${path}: ${message}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function loadEnabledModelPatterns(ctx: SummaryModelScopeContext): string[] | null {
|
|
64
|
+
const globalSettings = readSettings(join(getAgentDir(), "settings.json"));
|
|
65
|
+
const projectSettings = ctx.isProjectTrusted()
|
|
66
|
+
? readSettings(join(ctx.cwd, ".pi", "settings.json"))
|
|
67
|
+
: {};
|
|
68
|
+
const value = Object.hasOwn(projectSettings, "enabledModels")
|
|
69
|
+
? projectSettings.enabledModels
|
|
70
|
+
: globalSettings.enabledModels;
|
|
71
|
+
if (value === undefined) return null;
|
|
72
|
+
if (!Array.isArray(value)) throw new Error("enabledModels must be an array");
|
|
73
|
+
return value
|
|
74
|
+
.filter((item): item is string => typeof item === "string")
|
|
75
|
+
.map(item => item.trim())
|
|
76
|
+
.filter(Boolean);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function summaryModelValue(model: ModelLike): string {
|
|
80
|
+
return `${model.provider}/${model.id}`;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function splitThinkingSuffix(value: string): { value: string; thinkingLevel?: SummaryThinkingLevel } {
|
|
84
|
+
const index = value.lastIndexOf(":");
|
|
85
|
+
if (index < 0) return { value };
|
|
86
|
+
const suffix = value.slice(index + 1);
|
|
87
|
+
return THINKING_LEVELS.has(suffix)
|
|
88
|
+
? { value: value.slice(0, index), thinkingLevel: suffix as SummaryThinkingLevel }
|
|
89
|
+
: { value };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function stripThinkingSuffix(pattern: string): string {
|
|
93
|
+
return splitThinkingSuffix(pattern).value;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function globToRegExp(pattern: string): RegExp {
|
|
97
|
+
let source = "^";
|
|
98
|
+
for (const char of pattern) {
|
|
99
|
+
if (char === "*") {
|
|
100
|
+
source += ".*";
|
|
101
|
+
} else if (char === "?") {
|
|
102
|
+
source += ".";
|
|
103
|
+
} else {
|
|
104
|
+
source += char.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return new RegExp(`${source}$`, "i");
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function modelMatchesEnabledPatterns(model: ModelLike, patterns: string[] | null): boolean {
|
|
111
|
+
if (patterns === null) return true;
|
|
112
|
+
const value = summaryModelValue(model).toLowerCase();
|
|
113
|
+
const id = model.id.toLowerCase();
|
|
114
|
+
for (const rawPattern of patterns) {
|
|
115
|
+
const pattern = stripThinkingSuffix(rawPattern.trim()).toLowerCase();
|
|
116
|
+
if (!pattern) continue;
|
|
117
|
+
if (pattern.includes("*") || pattern.includes("?")) {
|
|
118
|
+
const regex = globToRegExp(pattern);
|
|
119
|
+
if (regex.test(value) || regex.test(id)) return true;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (pattern === value || pattern === id) return true;
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
}
|