@astralyn/pi 1.4.7 → 1.4.8
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 +15 -0
- package/dist/bundle/chunks/{chunk-FYKNSJG6.js → chunk-5VIOGR76.js} +1 -1
- package/dist/bundle/chunks/{chunk-YJTSOLP2.js → chunk-I2COK45I.js} +89 -89
- package/dist/bundle/chunks/{virtual-modules-PKEOKGYI.js → virtual-modules-BBLD7YLS.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/package-manager.d.ts +4 -8
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +11 -72
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/resource-loader.d.ts +2 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +21 -24
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/skill-invocation.d.ts +46 -0
- package/dist/core/skill-invocation.d.ts.map +1 -0
- package/dist/core/skill-invocation.js +128 -0
- package/dist/core/skill-invocation.js.map +1 -0
- package/dist/extensions/agent/settings-host.d.ts +33 -0
- package/dist/extensions/agent/settings-host.d.ts.map +1 -0
- package/dist/extensions/agent/settings-host.js +75 -0
- package/dist/extensions/agent/settings-host.js.map +1 -0
- package/dist/extensions/agent/settings.d.ts.map +1 -1
- package/dist/extensions/agent/settings.js +18 -7
- package/dist/extensions/agent/settings.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +10 -8
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +51 -121
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/docs/packages.md +1 -1
- package/docs/settings.md +1 -1
- package/docs/skills.md +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { PathMetadata } from "./package-manager.ts";
|
|
2
|
+
import type { SkillInvocationOverride, SkillInvocationOverrides } from "./settings-manager.ts";
|
|
3
|
+
/** Settings scope that declares an invocation override. */
|
|
4
|
+
export type InvocationScope = "user" | "project";
|
|
5
|
+
/** Where a skill came from; `PathMetadata` and `SourceInfo` both carry it. */
|
|
6
|
+
export type SkillOrigin = Pick<PathMetadata, "source" | "scope" | "origin" | "baseDir">;
|
|
7
|
+
/** One `skillInvocationOverrides` map and the directories its relative keys resolve against. */
|
|
8
|
+
export interface InvocationLayer {
|
|
9
|
+
overrides: SkillInvocationOverrides | undefined;
|
|
10
|
+
roots: readonly string[];
|
|
11
|
+
}
|
|
12
|
+
/** The override a layer gives one skill, and every key in the layer that names that skill. */
|
|
13
|
+
export interface InvocationMatch {
|
|
14
|
+
override?: SkillInvocationOverride;
|
|
15
|
+
keys: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Find the keys of `layer` that name `skillFile`: the file itself, or the directory of a `SKILL.md`.
|
|
19
|
+
* A file key beats a directory key; among equals the later key wins.
|
|
20
|
+
*/
|
|
21
|
+
export declare function matchInvocation(layer: InvocationLayer, skillFile: string): InvocationMatch;
|
|
22
|
+
/** `layer`'s overrides with every key naming `skillFile` replaced by one key, or removed to inherit. */
|
|
23
|
+
export declare function withInvocation(layer: InvocationLayer, skillFile: string, override: SkillInvocationOverride | undefined): SkillInvocationOverrides | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Layered skill invocation settings, shared by skill loading and `pi config` so a key names the same skill
|
|
26
|
+
* everywhere. Relative top-level keys resolve against the directories of the settings file that declares
|
|
27
|
+
* them, package keys against the package root. Project settings beat global ones, and package entries
|
|
28
|
+
* match by package identity, as package loading does.
|
|
29
|
+
*/
|
|
30
|
+
export declare class SkillInvocationPolicy {
|
|
31
|
+
private readonly settings;
|
|
32
|
+
private readonly packages;
|
|
33
|
+
private readonly rootsByScope;
|
|
34
|
+
constructor(settings: SkillInvocationPolicy["settings"], packages: SkillInvocationPolicy["packages"]);
|
|
35
|
+
/** The override that applies to a skill. Pass `["user"]` for what project settings inherit. */
|
|
36
|
+
resolve(skillFile: string, origin: SkillOrigin | undefined, scopes?: readonly InvocationScope[]): SkillInvocationOverride | undefined;
|
|
37
|
+
/** The layer `scope` keeps a skill's override in; undefined when that scope has no entry for its package. */
|
|
38
|
+
layer(scope: InvocationScope, origin: SkillOrigin | undefined): InvocationLayer | undefined;
|
|
39
|
+
/** Index of the entry `scope` keeps for a package skill's source, or -1. */
|
|
40
|
+
findPackage(scope: InvocationScope, origin: SkillOrigin): number;
|
|
41
|
+
private layers;
|
|
42
|
+
private packageEntry;
|
|
43
|
+
private settingsFor;
|
|
44
|
+
private topLevelRoots;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=skill-invocation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-invocation.d.ts","sourceRoot":"","sources":["../../src/core/skill-invocation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAyB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,KAAK,EAIX,uBAAuB,EACvB,wBAAwB,EACxB,MAAM,uBAAuB,CAAC;AAE/B,2DAA2D;AAC3D,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,CAAC;AAEjD,8EAA8E;AAC9E,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;AAExF,gGAAgG;AAChG,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAChD,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB;AAED,8FAA8F;AAC9F,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,IAAI,EAAE,MAAM,EAAE,CAAC;CACf;AAuBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,CAgB1F;AAED,wGAAwG;AACxG,wBAAgB,cAAc,CAC7B,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,uBAAuB,GAAG,SAAS,GAC3C,wBAAwB,GAAG,SAAS,CAKtC;AAMD;;;;;GAKG;AACH,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyF;IAClH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4E;IACrG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiD;gBAElE,QAAQ,EAAE,qBAAqB,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,qBAAqB,CAAC,UAAU,CAAC;IAKpG,+FAA+F;IAC/F,OAAO,CACN,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,GAAE,SAAS,eAAe,EAAe,GAC7C,uBAAuB,GAAG,SAAS;IAQtC,6GAA6G;IAC7G,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS;IAa3F,4EAA4E;IAC5E,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM;IAWhE,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,aAAa;CAQrB"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { basename, dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
2
|
+
import { canonicalizePath, normalizePath } from "../utils/paths.js";
|
|
3
|
+
const ALL_SCOPES = ["project", "user"];
|
|
4
|
+
function isInvocationOverride(value) {
|
|
5
|
+
return value === "model-and-user" || value === "user-only";
|
|
6
|
+
}
|
|
7
|
+
function keyTargets(key, roots) {
|
|
8
|
+
const path = normalizePath(key, { trim: true });
|
|
9
|
+
if (isAbsolute(path))
|
|
10
|
+
return [canonicalizePath(resolve(path))];
|
|
11
|
+
return roots.map((root) => canonicalizePath(resolve(root, path)));
|
|
12
|
+
}
|
|
13
|
+
/** Key for a new override: relative to the first root that contains the skill, otherwise absolute. */
|
|
14
|
+
function invocationKey(roots, skillFile) {
|
|
15
|
+
for (const root of roots) {
|
|
16
|
+
const path = relative(root, skillFile);
|
|
17
|
+
if (path && path !== ".." && !path.startsWith(`..${sep}`) && !isAbsolute(path))
|
|
18
|
+
return path;
|
|
19
|
+
}
|
|
20
|
+
return skillFile;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Find the keys of `layer` that name `skillFile`: the file itself, or the directory of a `SKILL.md`.
|
|
24
|
+
* A file key beats a directory key; among equals the later key wins.
|
|
25
|
+
*/
|
|
26
|
+
export function matchInvocation(layer, skillFile) {
|
|
27
|
+
const file = canonicalizePath(resolve(skillFile));
|
|
28
|
+
const dir = basename(file) === "SKILL.md" ? dirname(file) : undefined;
|
|
29
|
+
const keys = [];
|
|
30
|
+
let fileOverride;
|
|
31
|
+
let dirOverride;
|
|
32
|
+
for (const [key, value] of Object.entries(layer.overrides ?? {})) {
|
|
33
|
+
const targets = keyTargets(key, layer.roots);
|
|
34
|
+
const namesFile = targets.includes(file);
|
|
35
|
+
if (!namesFile && (dir === undefined || !targets.includes(dir)))
|
|
36
|
+
continue;
|
|
37
|
+
keys.push(key);
|
|
38
|
+
if (!isInvocationOverride(value))
|
|
39
|
+
continue;
|
|
40
|
+
if (namesFile)
|
|
41
|
+
fileOverride = value;
|
|
42
|
+
else
|
|
43
|
+
dirOverride = value;
|
|
44
|
+
}
|
|
45
|
+
return { override: fileOverride ?? dirOverride, keys };
|
|
46
|
+
}
|
|
47
|
+
/** `layer`'s overrides with every key naming `skillFile` replaced by one key, or removed to inherit. */
|
|
48
|
+
export function withInvocation(layer, skillFile, override) {
|
|
49
|
+
const next = { ...layer.overrides };
|
|
50
|
+
for (const key of matchInvocation(layer, skillFile).keys)
|
|
51
|
+
delete next[key];
|
|
52
|
+
if (override)
|
|
53
|
+
next[invocationKey(layer.roots, skillFile)] = override;
|
|
54
|
+
return Object.keys(next).length > 0 ? next : undefined;
|
|
55
|
+
}
|
|
56
|
+
function isPackageDelta(entry) {
|
|
57
|
+
return typeof entry === "object" && entry.autoload === false;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Layered skill invocation settings, shared by skill loading and `pi config` so a key names the same skill
|
|
61
|
+
* everywhere. Relative top-level keys resolve against the directories of the settings file that declares
|
|
62
|
+
* them, package keys against the package root. Project settings beat global ones, and package entries
|
|
63
|
+
* match by package identity, as package loading does.
|
|
64
|
+
*/
|
|
65
|
+
export class SkillInvocationPolicy {
|
|
66
|
+
constructor(settings, packages) {
|
|
67
|
+
this.rootsByScope = new Map();
|
|
68
|
+
this.settings = settings;
|
|
69
|
+
this.packages = packages;
|
|
70
|
+
}
|
|
71
|
+
/** The override that applies to a skill. Pass `["user"]` for what project settings inherit. */
|
|
72
|
+
resolve(skillFile, origin, scopes = ALL_SCOPES) {
|
|
73
|
+
for (const layer of this.layers(origin, scopes)) {
|
|
74
|
+
const { override } = matchInvocation(layer, skillFile);
|
|
75
|
+
if (override)
|
|
76
|
+
return override;
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
/** The layer `scope` keeps a skill's override in; undefined when that scope has no entry for its package. */
|
|
81
|
+
layer(scope, origin) {
|
|
82
|
+
if (scope === "project" && !this.settings.isProjectTrusted())
|
|
83
|
+
return undefined;
|
|
84
|
+
if (origin?.origin !== "package") {
|
|
85
|
+
return { overrides: this.settingsFor(scope).skillInvocationOverrides, roots: this.topLevelRoots(scope) };
|
|
86
|
+
}
|
|
87
|
+
const entry = this.packageEntry(scope, origin);
|
|
88
|
+
if (entry === undefined)
|
|
89
|
+
return undefined;
|
|
90
|
+
return {
|
|
91
|
+
overrides: typeof entry === "object" ? entry.skillInvocationOverrides : undefined,
|
|
92
|
+
roots: origin.baseDir ? [origin.baseDir] : [],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Index of the entry `scope` keeps for a package skill's source, or -1. */
|
|
96
|
+
findPackage(scope, origin) {
|
|
97
|
+
if (scope === "project" && !this.settings.isProjectTrusted())
|
|
98
|
+
return -1;
|
|
99
|
+
const identity = this.packages.getPackageIdentity(origin.source, origin.scope === "project" && this.settings.isProjectTrusted() ? "project" : "user");
|
|
100
|
+
return (this.settingsFor(scope).packages ?? []).findIndex((pkg) => this.packages.getPackageIdentity(typeof pkg === "string" ? pkg : pkg.source, scope) === identity);
|
|
101
|
+
}
|
|
102
|
+
layers(origin, scopes) {
|
|
103
|
+
const project = scopes.includes("project") ? this.layer("project", origin) : undefined;
|
|
104
|
+
const user = scopes.includes("user") ? this.layer("user", origin) : undefined;
|
|
105
|
+
if (!project)
|
|
106
|
+
return user ? [user] : [];
|
|
107
|
+
// A project package entry replaces the global one unless it is an autoload-disabled delta over it.
|
|
108
|
+
if (origin?.origin === "package" && !isPackageDelta(this.packageEntry("project", origin)))
|
|
109
|
+
return [project];
|
|
110
|
+
return user ? [project, user] : [project];
|
|
111
|
+
}
|
|
112
|
+
packageEntry(scope, origin) {
|
|
113
|
+
const index = this.findPackage(scope, origin);
|
|
114
|
+
return index === -1 ? undefined : this.settingsFor(scope).packages?.[index];
|
|
115
|
+
}
|
|
116
|
+
settingsFor(scope) {
|
|
117
|
+
return scope === "project" ? this.settings.getProjectSettings() : this.settings.getGlobalSettings();
|
|
118
|
+
}
|
|
119
|
+
topLevelRoots(scope) {
|
|
120
|
+
let roots = this.rootsByScope.get(scope);
|
|
121
|
+
if (!roots) {
|
|
122
|
+
roots = this.packages.getTopLevelBaseDirs(scope);
|
|
123
|
+
this.rootsByScope.set(scope, roots);
|
|
124
|
+
}
|
|
125
|
+
return roots;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=skill-invocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-invocation.js","sourceRoot":"","sources":["../../src/core/skill-invocation.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { canonicalizePath, normalizePath } from \"../utils/paths.ts\";\nimport type { DefaultPackageManager, PathMetadata } from \"./package-manager.ts\";\nimport type {\n\tPackageSource,\n\tSettings,\n\tSettingsManager,\n\tSkillInvocationOverride,\n\tSkillInvocationOverrides,\n} from \"./settings-manager.ts\";\n\n/** Settings scope that declares an invocation override. */\nexport type InvocationScope = \"user\" | \"project\";\n\n/** Where a skill came from; `PathMetadata` and `SourceInfo` both carry it. */\nexport type SkillOrigin = Pick<PathMetadata, \"source\" | \"scope\" | \"origin\" | \"baseDir\">;\n\n/** One `skillInvocationOverrides` map and the directories its relative keys resolve against. */\nexport interface InvocationLayer {\n\toverrides: SkillInvocationOverrides | undefined;\n\troots: readonly string[];\n}\n\n/** The override a layer gives one skill, and every key in the layer that names that skill. */\nexport interface InvocationMatch {\n\toverride?: SkillInvocationOverride;\n\tkeys: string[];\n}\n\nconst ALL_SCOPES: readonly InvocationScope[] = [\"project\", \"user\"];\n\nfunction isInvocationOverride(value: unknown): value is SkillInvocationOverride {\n\treturn value === \"model-and-user\" || value === \"user-only\";\n}\n\nfunction keyTargets(key: string, roots: readonly string[]): string[] {\n\tconst path = normalizePath(key, { trim: true });\n\tif (isAbsolute(path)) return [canonicalizePath(resolve(path))];\n\treturn roots.map((root) => canonicalizePath(resolve(root, path)));\n}\n\n/** Key for a new override: relative to the first root that contains the skill, otherwise absolute. */\nfunction invocationKey(roots: readonly string[], skillFile: string): string {\n\tfor (const root of roots) {\n\t\tconst path = relative(root, skillFile);\n\t\tif (path && path !== \"..\" && !path.startsWith(`..${sep}`) && !isAbsolute(path)) return path;\n\t}\n\treturn skillFile;\n}\n\n/**\n * Find the keys of `layer` that name `skillFile`: the file itself, or the directory of a `SKILL.md`.\n * A file key beats a directory key; among equals the later key wins.\n */\nexport function matchInvocation(layer: InvocationLayer, skillFile: string): InvocationMatch {\n\tconst file = canonicalizePath(resolve(skillFile));\n\tconst dir = basename(file) === \"SKILL.md\" ? dirname(file) : undefined;\n\tconst keys: string[] = [];\n\tlet fileOverride: SkillInvocationOverride | undefined;\n\tlet dirOverride: SkillInvocationOverride | undefined;\n\tfor (const [key, value] of Object.entries(layer.overrides ?? {})) {\n\t\tconst targets = keyTargets(key, layer.roots);\n\t\tconst namesFile = targets.includes(file);\n\t\tif (!namesFile && (dir === undefined || !targets.includes(dir))) continue;\n\t\tkeys.push(key);\n\t\tif (!isInvocationOverride(value)) continue;\n\t\tif (namesFile) fileOverride = value;\n\t\telse dirOverride = value;\n\t}\n\treturn { override: fileOverride ?? dirOverride, keys };\n}\n\n/** `layer`'s overrides with every key naming `skillFile` replaced by one key, or removed to inherit. */\nexport function withInvocation(\n\tlayer: InvocationLayer,\n\tskillFile: string,\n\toverride: SkillInvocationOverride | undefined,\n): SkillInvocationOverrides | undefined {\n\tconst next: SkillInvocationOverrides = { ...layer.overrides };\n\tfor (const key of matchInvocation(layer, skillFile).keys) delete next[key];\n\tif (override) next[invocationKey(layer.roots, skillFile)] = override;\n\treturn Object.keys(next).length > 0 ? next : undefined;\n}\n\nfunction isPackageDelta(entry: PackageSource | undefined): boolean {\n\treturn typeof entry === \"object\" && entry.autoload === false;\n}\n\n/**\n * Layered skill invocation settings, shared by skill loading and `pi config` so a key names the same skill\n * everywhere. Relative top-level keys resolve against the directories of the settings file that declares\n * them, package keys against the package root. Project settings beat global ones, and package entries\n * match by package identity, as package loading does.\n */\nexport class SkillInvocationPolicy {\n\tprivate readonly settings: Pick<SettingsManager, \"getGlobalSettings\" | \"getProjectSettings\" | \"isProjectTrusted\">;\n\tprivate readonly packages: Pick<DefaultPackageManager, \"getPackageIdentity\" | \"getTopLevelBaseDirs\">;\n\tprivate readonly rootsByScope = new Map<InvocationScope, readonly string[]>();\n\n\tconstructor(settings: SkillInvocationPolicy[\"settings\"], packages: SkillInvocationPolicy[\"packages\"]) {\n\t\tthis.settings = settings;\n\t\tthis.packages = packages;\n\t}\n\n\t/** The override that applies to a skill. Pass `[\"user\"]` for what project settings inherit. */\n\tresolve(\n\t\tskillFile: string,\n\t\torigin: SkillOrigin | undefined,\n\t\tscopes: readonly InvocationScope[] = ALL_SCOPES,\n\t): SkillInvocationOverride | undefined {\n\t\tfor (const layer of this.layers(origin, scopes)) {\n\t\t\tconst { override } = matchInvocation(layer, skillFile);\n\t\t\tif (override) return override;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/** The layer `scope` keeps a skill's override in; undefined when that scope has no entry for its package. */\n\tlayer(scope: InvocationScope, origin: SkillOrigin | undefined): InvocationLayer | undefined {\n\t\tif (scope === \"project\" && !this.settings.isProjectTrusted()) return undefined;\n\t\tif (origin?.origin !== \"package\") {\n\t\t\treturn { overrides: this.settingsFor(scope).skillInvocationOverrides, roots: this.topLevelRoots(scope) };\n\t\t}\n\t\tconst entry = this.packageEntry(scope, origin);\n\t\tif (entry === undefined) return undefined;\n\t\treturn {\n\t\t\toverrides: typeof entry === \"object\" ? entry.skillInvocationOverrides : undefined,\n\t\t\troots: origin.baseDir ? [origin.baseDir] : [],\n\t\t};\n\t}\n\n\t/** Index of the entry `scope` keeps for a package skill's source, or -1. */\n\tfindPackage(scope: InvocationScope, origin: SkillOrigin): number {\n\t\tif (scope === \"project\" && !this.settings.isProjectTrusted()) return -1;\n\t\tconst identity = this.packages.getPackageIdentity(\n\t\t\torigin.source,\n\t\t\torigin.scope === \"project\" && this.settings.isProjectTrusted() ? \"project\" : \"user\",\n\t\t);\n\t\treturn (this.settingsFor(scope).packages ?? []).findIndex(\n\t\t\t(pkg) => this.packages.getPackageIdentity(typeof pkg === \"string\" ? pkg : pkg.source, scope) === identity,\n\t\t);\n\t}\n\n\tprivate layers(origin: SkillOrigin | undefined, scopes: readonly InvocationScope[]): InvocationLayer[] {\n\t\tconst project = scopes.includes(\"project\") ? this.layer(\"project\", origin) : undefined;\n\t\tconst user = scopes.includes(\"user\") ? this.layer(\"user\", origin) : undefined;\n\t\tif (!project) return user ? [user] : [];\n\t\t// A project package entry replaces the global one unless it is an autoload-disabled delta over it.\n\t\tif (origin?.origin === \"package\" && !isPackageDelta(this.packageEntry(\"project\", origin))) return [project];\n\t\treturn user ? [project, user] : [project];\n\t}\n\n\tprivate packageEntry(scope: InvocationScope, origin: SkillOrigin): PackageSource | undefined {\n\t\tconst index = this.findPackage(scope, origin);\n\t\treturn index === -1 ? undefined : this.settingsFor(scope).packages?.[index];\n\t}\n\n\tprivate settingsFor(scope: InvocationScope): Settings {\n\t\treturn scope === \"project\" ? this.settings.getProjectSettings() : this.settings.getGlobalSettings();\n\t}\n\n\tprivate topLevelRoots(scope: InvocationScope): readonly string[] {\n\t\tlet roots = this.rootsByScope.get(scope);\n\t\tif (!roots) {\n\t\t\troots = this.packages.getTopLevelBaseDirs(scope);\n\t\t\tthis.rootsByScope.set(scope, roots);\n\t\t}\n\t\treturn roots;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type Component, Container, type Focusable, type TUI, type TuiMouseEvent } from "@earendil-works/pi-tui";
|
|
2
|
+
import type { KeybindingsManager } from "../../core/keybindings.ts";
|
|
3
|
+
import type { Theme } from "../../modes/interactive/theme/theme.ts";
|
|
4
|
+
type AgentSettingsPage = Component & {
|
|
5
|
+
dispose?(): void;
|
|
6
|
+
};
|
|
7
|
+
export type AgentSettingsPageFactory<T> = (tui: TUI, theme: Theme, keys: KeybindingsManager, done: (result: T) => void) => AgentSettingsPage;
|
|
8
|
+
/**
|
|
9
|
+
* One dialog lifetime for every Agent settings page. Pages swap synchronously, so the editor never
|
|
10
|
+
* shows between the panel and a picker, nor while a choice is saved.
|
|
11
|
+
*/
|
|
12
|
+
export declare class AgentSettingsHost extends Container implements Focusable {
|
|
13
|
+
private readonly tui;
|
|
14
|
+
private readonly theme;
|
|
15
|
+
private readonly keys;
|
|
16
|
+
private page;
|
|
17
|
+
/** Cleared once the page answers, so input waits for the next page instead of reaching a stale one. */
|
|
18
|
+
private accepting;
|
|
19
|
+
private active;
|
|
20
|
+
private disposed;
|
|
21
|
+
constructor(tui: TUI, theme: Theme, keys: KeybindingsManager);
|
|
22
|
+
get focused(): boolean;
|
|
23
|
+
set focused(value: boolean);
|
|
24
|
+
/** Show a page until it answers; it stays visible until the next page replaces it. */
|
|
25
|
+
show<T>(create: AgentSettingsPageFactory<T>): Promise<T>;
|
|
26
|
+
handleInput(data: string): void;
|
|
27
|
+
handleMouse(event: TuiMouseEvent): ReturnType<Container["handleMouse"]>;
|
|
28
|
+
dispose(): void;
|
|
29
|
+
private replacePage;
|
|
30
|
+
private disposePage;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=settings-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-host.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/settings-host.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EACd,SAAS,EACT,KAAK,SAAS,EAEd,KAAK,GAAG,EACR,KAAK,aAAa,EAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAEpE,KAAK,iBAAiB,GAAG,SAAS,GAAG;IAAE,OAAO,CAAC,IAAI,IAAI,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI,CACzC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,KACrB,iBAAiB,CAAC;AAEvB;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,SAAU,YAAW,SAAS;IACpE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,IAAI,CAAgC;IAC5C,uGAAuG;IACvG,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB;IAO5D,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAED,sFAAsF;IACtF,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAgBxD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAIvE,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,WAAW;CAMnB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Container, isFocusable, } from "@earendil-works/pi-tui";
|
|
2
|
+
/**
|
|
3
|
+
* One dialog lifetime for every Agent settings page. Pages swap synchronously, so the editor never
|
|
4
|
+
* shows between the panel and a picker, nor while a choice is saved.
|
|
5
|
+
*/
|
|
6
|
+
export class AgentSettingsHost extends Container {
|
|
7
|
+
constructor(tui, theme, keys) {
|
|
8
|
+
super();
|
|
9
|
+
/** Cleared once the page answers, so input waits for the next page instead of reaching a stale one. */
|
|
10
|
+
this.accepting = false;
|
|
11
|
+
this.active = false;
|
|
12
|
+
this.disposed = false;
|
|
13
|
+
this.tui = tui;
|
|
14
|
+
this.theme = theme;
|
|
15
|
+
this.keys = keys;
|
|
16
|
+
}
|
|
17
|
+
get focused() {
|
|
18
|
+
return this.active;
|
|
19
|
+
}
|
|
20
|
+
set focused(value) {
|
|
21
|
+
this.active = value;
|
|
22
|
+
if (this.page && isFocusable(this.page))
|
|
23
|
+
this.page.focused = value;
|
|
24
|
+
}
|
|
25
|
+
/** Show a page until it answers; it stays visible until the next page replaces it. */
|
|
26
|
+
show(create) {
|
|
27
|
+
return new Promise((resolve) => {
|
|
28
|
+
// A torn-down dialog never answers, like any other disposed custom UI.
|
|
29
|
+
if (this.disposed)
|
|
30
|
+
return;
|
|
31
|
+
let answered = false;
|
|
32
|
+
const page = create(this.tui, this.theme, this.keys, (result) => {
|
|
33
|
+
if (answered || this.disposed)
|
|
34
|
+
return;
|
|
35
|
+
answered = true;
|
|
36
|
+
this.accepting = false;
|
|
37
|
+
resolve(result);
|
|
38
|
+
});
|
|
39
|
+
this.replacePage(page);
|
|
40
|
+
this.accepting = true;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
handleInput(data) {
|
|
44
|
+
if (this.accepting)
|
|
45
|
+
this.page?.handleInput?.(data);
|
|
46
|
+
}
|
|
47
|
+
handleMouse(event) {
|
|
48
|
+
return this.accepting ? super.handleMouse(event) : undefined;
|
|
49
|
+
}
|
|
50
|
+
dispose() {
|
|
51
|
+
if (this.disposed)
|
|
52
|
+
return;
|
|
53
|
+
this.disposed = true;
|
|
54
|
+
this.accepting = false;
|
|
55
|
+
this.disposePage();
|
|
56
|
+
this.clear();
|
|
57
|
+
}
|
|
58
|
+
replacePage(page) {
|
|
59
|
+
this.disposePage();
|
|
60
|
+
this.page = page;
|
|
61
|
+
this.clear();
|
|
62
|
+
this.addChild(page);
|
|
63
|
+
if (isFocusable(page))
|
|
64
|
+
page.focused = this.active;
|
|
65
|
+
this.tui.requestRender();
|
|
66
|
+
}
|
|
67
|
+
disposePage() {
|
|
68
|
+
const previous = this.page;
|
|
69
|
+
this.page = undefined;
|
|
70
|
+
if (previous && isFocusable(previous))
|
|
71
|
+
previous.focused = false;
|
|
72
|
+
previous?.dispose?.();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=settings-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-host.js","sourceRoot":"","sources":["../../../src/extensions/agent/settings-host.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tisFocusable,\n\ttype TUI,\n\ttype TuiMouseEvent,\n} from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\n\ntype AgentSettingsPage = Component & { dispose?(): void };\n\nexport type AgentSettingsPageFactory<T> = (\n\ttui: TUI,\n\ttheme: Theme,\n\tkeys: KeybindingsManager,\n\tdone: (result: T) => void,\n) => AgentSettingsPage;\n\n/**\n * One dialog lifetime for every Agent settings page. Pages swap synchronously, so the editor never\n * shows between the panel and a picker, nor while a choice is saved.\n */\nexport class AgentSettingsHost extends Container implements Focusable {\n\tprivate readonly tui: TUI;\n\tprivate readonly theme: Theme;\n\tprivate readonly keys: KeybindingsManager;\n\tprivate page: AgentSettingsPage | undefined;\n\t/** Cleared once the page answers, so input waits for the next page instead of reaching a stale one. */\n\tprivate accepting = false;\n\tprivate active = false;\n\tprivate disposed = false;\n\n\tconstructor(tui: TUI, theme: Theme, keys: KeybindingsManager) {\n\t\tsuper();\n\t\tthis.tui = tui;\n\t\tthis.theme = theme;\n\t\tthis.keys = keys;\n\t}\n\n\tget focused(): boolean {\n\t\treturn this.active;\n\t}\n\tset focused(value: boolean) {\n\t\tthis.active = value;\n\t\tif (this.page && isFocusable(this.page)) this.page.focused = value;\n\t}\n\n\t/** Show a page until it answers; it stays visible until the next page replaces it. */\n\tshow<T>(create: AgentSettingsPageFactory<T>): Promise<T> {\n\t\treturn new Promise((resolve) => {\n\t\t\t// A torn-down dialog never answers, like any other disposed custom UI.\n\t\t\tif (this.disposed) return;\n\t\t\tlet answered = false;\n\t\t\tconst page = create(this.tui, this.theme, this.keys, (result) => {\n\t\t\t\tif (answered || this.disposed) return;\n\t\t\t\tanswered = true;\n\t\t\t\tthis.accepting = false;\n\t\t\t\tresolve(result);\n\t\t\t});\n\t\t\tthis.replacePage(page);\n\t\t\tthis.accepting = true;\n\t\t});\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.accepting) this.page?.handleInput?.(data);\n\t}\n\n\thandleMouse(event: TuiMouseEvent): ReturnType<Container[\"handleMouse\"]> {\n\t\treturn this.accepting ? super.handleMouse(event) : undefined;\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tthis.accepting = false;\n\t\tthis.disposePage();\n\t\tthis.clear();\n\t}\n\n\tprivate replacePage(page: AgentSettingsPage): void {\n\t\tthis.disposePage();\n\t\tthis.page = page;\n\t\tthis.clear();\n\t\tthis.addChild(page);\n\t\tif (isFocusable(page)) page.focused = this.active;\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate disposePage(): void {\n\t\tconst previous = this.page;\n\t\tthis.page = undefined;\n\t\tif (previous && isFocusable(previous)) previous.focused = false;\n\t\tprevious?.dispose?.();\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAkD,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAE1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAkD,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAE1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAWhG,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAG1E,KAAK,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,cAAc,GAAG,eAAe,CAAC,CAAC;AA8BvF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,GAAG,aAAa,CAOpG;AAgCD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,GAAG;IAC9G,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC;CACxB,CAYA;AAwGD,oFAAoF;AACpF,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBnF"}
|
|
@@ -3,6 +3,7 @@ import { DEFAULT_THINKING_LEVEL, THINKING_LEVEL_OPTIONS } from "../../core/defau
|
|
|
3
3
|
import { truncateHead } from "../../core/tools/truncate.js";
|
|
4
4
|
import { ModelSelectorComponent } from "../../modes/interactive/components/model-selector.js";
|
|
5
5
|
import { ThinkingSelectorComponent } from "../../modes/interactive/components/thinking-selector.js";
|
|
6
|
+
import { AgentSettingsHost } from "./settings-host.js";
|
|
6
7
|
import { AgentSettingsPanel, } from "./settings-panel.js";
|
|
7
8
|
import { AGENT_SETTINGS_NAMESPACE } from "./types.js";
|
|
8
9
|
function inspectAgentSettings(ctx) {
|
|
@@ -84,17 +85,17 @@ async function saveAgentSettings(ctx, patch) {
|
|
|
84
85
|
next.thinking = patch.thinking;
|
|
85
86
|
await ctx.setExtensionSettings(AGENT_SETTINGS_NAMESPACE, next);
|
|
86
87
|
}
|
|
87
|
-
async function selectAgentModel(ctx, current) {
|
|
88
|
+
async function selectAgentModel(ctx, host, current) {
|
|
88
89
|
// Preselect the saved reference even when it is unavailable, so the picker can repair it.
|
|
89
90
|
const saved = resolveAgentModel(ctx, current)?.model;
|
|
90
|
-
const selected = await
|
|
91
|
+
const selected = await host.show((tui, _theme, _keys, done) => new ModelSelectorComponent(tui, saved ?? ctx.model, ctx.modelRuntime, ctx.scopedModels, done, () => done(undefined)));
|
|
91
92
|
return selected ? `${selected.provider}/${selected.id}` : undefined;
|
|
92
93
|
}
|
|
93
|
-
async function selectAgentThinking(ctx, settings, model) {
|
|
94
|
+
async function selectAgentThinking(ctx, host, settings, model) {
|
|
94
95
|
const requested = requestedEffort(ctx, settings);
|
|
95
96
|
const current = model ? supportedEffort(model, requested) : requested;
|
|
96
97
|
const available = model ? getSupportedThinkingLevels(model) : [...THINKING_LEVEL_OPTIONS];
|
|
97
|
-
return
|
|
98
|
+
return host.show((_tui, _theme, _keys, done) => new ThinkingSelectorComponent(current, available, done, () => done(undefined)));
|
|
98
99
|
}
|
|
99
100
|
function formatInvalidValue(value) {
|
|
100
101
|
let text = "";
|
|
@@ -155,6 +156,16 @@ export async function openAgentSettings(ctx) {
|
|
|
155
156
|
}
|
|
156
157
|
return;
|
|
157
158
|
}
|
|
159
|
+
const outcome = await ctx.ui.custom((tui, theme, keys, done) => {
|
|
160
|
+
const host = new AgentSettingsHost(tui, theme, keys);
|
|
161
|
+
runAgentSettings(ctx, host).then(() => done(undefined), (error) => done({ error }));
|
|
162
|
+
return host;
|
|
163
|
+
});
|
|
164
|
+
if (outcome)
|
|
165
|
+
throw outcome.error;
|
|
166
|
+
}
|
|
167
|
+
/** Every page shares one dialog, so moving between them never exposes the editor. */
|
|
168
|
+
async function runAgentSettings(ctx, host) {
|
|
158
169
|
let selectedAction = "model";
|
|
159
170
|
while (true) {
|
|
160
171
|
let inspection;
|
|
@@ -166,7 +177,7 @@ export async function openAgentSettings(ctx) {
|
|
|
166
177
|
return;
|
|
167
178
|
}
|
|
168
179
|
const resolution = inspection.invalidModel !== undefined ? undefined : resolveAgentModel(ctx, inspection.model);
|
|
169
|
-
const action = await
|
|
180
|
+
const action = await host.show((tui, theme, keys, done) => new AgentSettingsPanel(tui, theme, keys, settingsRows(ctx, inspection, resolution), selectedAction, done, () => done(undefined)));
|
|
170
181
|
if (!action)
|
|
171
182
|
return;
|
|
172
183
|
selectedAction = action;
|
|
@@ -178,14 +189,14 @@ export async function openAgentSettings(ctx) {
|
|
|
178
189
|
ctx.ui.notify("Agent settings: Follow current session", "info");
|
|
179
190
|
}
|
|
180
191
|
else if (action === "model") {
|
|
181
|
-
const selected = await selectAgentModel(ctx, inspection.model ?? "");
|
|
192
|
+
const selected = await selectAgentModel(ctx, host, inspection.model ?? "");
|
|
182
193
|
if (selected === undefined || selected === inspection.model)
|
|
183
194
|
continue;
|
|
184
195
|
await saveAgentSettings(ctx, { model: selected });
|
|
185
196
|
ctx.ui.notify(`Agent model: ${selected}`, "info");
|
|
186
197
|
}
|
|
187
198
|
else if (action === "thinking") {
|
|
188
|
-
const selected = await selectAgentThinking(ctx, inspection, resolution?.model);
|
|
199
|
+
const selected = await selectAgentThinking(ctx, host, inspection, resolution?.model);
|
|
189
200
|
if (selected === undefined ||
|
|
190
201
|
(selected === inspection.thinking && inspection.invalidThinking === undefined))
|
|
191
202
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/extensions/agent/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { clampThinkingLevel, getSupportedThinkingLevels, type Model } from \"@earendil-works/pi-ai/compat\";\nimport { DEFAULT_THINKING_LEVEL, THINKING_LEVEL_OPTIONS } from \"../../core/defaults.ts\";\nimport type { ExtensionCommandContext, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport { truncateHead } from \"../../core/tools/truncate.ts\";\nimport { ModelSelectorComponent } from \"../../modes/interactive/components/model-selector.ts\";\nimport { ThinkingSelectorComponent } from \"../../modes/interactive/components/thinking-selector.ts\";\nimport {\n\ttype AgentSettingsAction,\n\ttype AgentSettingsField,\n\tAgentSettingsPanel,\n\ttype AgentSettingsRow,\n} from \"./settings-panel.ts\";\nimport { AGENT_SETTINGS_NAMESPACE, type AgentSettings } from \"./types.ts\";\n\ntype SettingsContext = Pick<ExtensionContext, \"getExtensionSettings\" | \"setExtensionSettings\">;\ntype ModelContext = Pick<ExtensionContext, \"model\" | \"modelRuntime\" | \"thinkingLevel\">;\n\ninterface InspectedAgentSettings extends AgentSettings {\n\tinvalidModel?: unknown;\n\tinvalidThinking?: unknown;\n}\n\nfunction inspectAgentSettings(ctx: Pick<ExtensionContext, \"getExtensionSettings\">): InspectedAgentSettings {\n\tconst raw = ctx.getExtensionSettings(AGENT_SETTINGS_NAMESPACE);\n\tlet model: string | undefined;\n\tlet invalidModel: unknown;\n\tif (raw.model !== undefined) {\n\t\tif (typeof raw.model === \"string\" && raw.model.includes(\"/\")) {\n\t\t\tmodel = raw.model;\n\t\t} else {\n\t\t\tinvalidModel = raw.model;\n\t\t}\n\t}\n\tlet thinking: ThinkingLevel | undefined;\n\tlet invalidThinking: unknown;\n\tif (raw.thinking !== undefined) {\n\t\tif (typeof raw.thinking === \"string\" && THINKING_LEVEL_OPTIONS.includes(raw.thinking as ThinkingLevel)) {\n\t\t\tthinking = raw.thinking as ThinkingLevel;\n\t\t} else {\n\t\t\tinvalidThinking = raw.thinking;\n\t\t}\n\t}\n\treturn { model, thinking, invalidModel, invalidThinking };\n}\n\nexport function readAgentSettings(ctx: Pick<ExtensionContext, \"getExtensionSettings\">): AgentSettings {\n\tconst inspection = inspectAgentSettings(ctx);\n\tif (inspection.invalidModel !== undefined)\n\t\tthrow new Error(\"Invalid Agent model setting. Choose a model with /agent.\");\n\tif (inspection.invalidThinking !== undefined)\n\t\tthrow new Error(\"Invalid Agent effort setting. Choose an effort level with /agent.\");\n\treturn { model: inspection.model, thinking: inspection.thinking };\n}\n\ninterface AgentModelResolution {\n\tmodel: Model<any>;\n\t/** Listed by `/model` right now. The availability snapshot can lag auth changes, so this is display-only. */\n\tavailable: boolean;\n}\n\nfunction resolveAgentModel(\n\tctx: Pick<ModelContext, \"model\" | \"modelRuntime\">,\n\treference?: string,\n): AgentModelResolution | undefined {\n\tif (!reference) return ctx.model ? { model: ctx.model, available: true } : undefined;\n\tconst slash = reference.indexOf(\"/\");\n\tif (slash <= 0) return undefined;\n\tconst model = ctx.modelRuntime.getModel(reference.slice(0, slash), reference.slice(slash + 1));\n\tif (!model) return undefined;\n\tconst available = ctx.modelRuntime\n\t\t.getAvailableSnapshot()\n\t\t.some((item) => item.provider === model.provider && item.id === model.id);\n\treturn { model, available };\n}\n\nfunction requestedEffort(ctx: Pick<ModelContext, \"thinkingLevel\">, settings: AgentSettings): ThinkingLevel {\n\treturn settings.thinking ?? ctx.thinkingLevel ?? DEFAULT_THINKING_LEVEL;\n}\n\n/** Clamp a requested level to what the model supports. */\nfunction supportedEffort(model: Model<any>, requested: ThinkingLevel): ThinkingLevel {\n\treturn clampThinkingLevel(model, requested) as ThinkingLevel;\n}\n\nexport function resolveAgentConfiguration(ctx: ModelContext & Pick<ExtensionContext, \"getExtensionSettings\">): {\n\tmodel: Model<any>;\n\tthinking: ThinkingLevel;\n\tsettings: AgentSettings;\n} {\n\tconst settings = readAgentSettings(ctx);\n\tconst resolution = resolveAgentModel(ctx, settings.model);\n\tif (!resolution) {\n\t\tif (settings.model) throw new Error(`Agent model is unavailable: ${settings.model}`);\n\t\tthrow new Error(\"Agent has no model to follow. Choose one with /agent.\");\n\t}\n\treturn {\n\t\tmodel: resolution.model,\n\t\tthinking: supportedEffort(resolution.model, requestedEffort(ctx, settings)),\n\t\tsettings,\n\t};\n}\n\nasync function saveAgentSettings(\n\tctx: SettingsContext,\n\tpatch: { model?: string | null; thinking?: ThinkingLevel | null },\n): Promise<void> {\n\tconst next = { ...ctx.getExtensionSettings(AGENT_SETTINGS_NAMESPACE) };\n\tif (patch.model === null || patch.model === \"\") delete next.model;\n\telse if (patch.model !== undefined) next.model = patch.model;\n\tif (patch.thinking === null) delete next.thinking;\n\telse if (patch.thinking !== undefined) next.thinking = patch.thinking;\n\tawait ctx.setExtensionSettings(AGENT_SETTINGS_NAMESPACE, next);\n}\n\nasync function selectAgentModel(ctx: ExtensionCommandContext, current: string): Promise<string | undefined> {\n\t// Preselect the saved reference even when it is unavailable, so the picker can repair it.\n\tconst saved = resolveAgentModel(ctx, current)?.model;\n\tconst selected = await ctx.ui.custom<Model<any> | undefined>(\n\t\t(tui, _theme, _keys, done) =>\n\t\t\tnew ModelSelectorComponent(tui, saved ?? ctx.model, ctx.modelRuntime, ctx.scopedModels, done, () =>\n\t\t\t\tdone(undefined),\n\t\t\t),\n\t);\n\treturn selected ? `${selected.provider}/${selected.id}` : undefined;\n}\n\nasync function selectAgentThinking(\n\tctx: ExtensionCommandContext,\n\tsettings: AgentSettings,\n\tmodel: Model<any> | undefined,\n): Promise<ThinkingLevel | undefined> {\n\tconst requested = requestedEffort(ctx, settings);\n\tconst current = model ? supportedEffort(model, requested) : requested;\n\tconst available = model ? getSupportedThinkingLevels(model) : [...THINKING_LEVEL_OPTIONS];\n\treturn ctx.ui.custom<ThinkingLevel | undefined>(\n\t\t(_tui, _theme, _keys, done) => new ThinkingSelectorComponent(current, available, done, () => done(undefined)),\n\t);\n}\n\nfunction formatInvalidValue(value: unknown): string {\n\tlet text = \"\";\n\ttry {\n\t\ttext = typeof value === \"string\" ? value : (JSON.stringify(value) ?? \"\");\n\t} catch {}\n\treturn truncateHead(text, { maxLines: 1, maxBytes: 80 }).content;\n}\n\nfunction invalidField(raw: unknown): AgentSettingsField {\n\treturn { value: formatInvalidValue(raw), status: \"[invalid]\", tone: \"error\" };\n}\n\nfunction describeModel(\n\tinspection: InspectedAgentSettings,\n\tresolution: AgentModelResolution | undefined,\n): AgentSettingsField {\n\tif (inspection.invalidModel !== undefined) return invalidField(inspection.invalidModel);\n\tif (!resolution) return { value: inspection.model ?? \"\", status: \"[unavailable]\", tone: \"warning\" };\n\treturn {\n\t\tvalue: `${resolution.model.provider}/${resolution.model.id}`,\n\t\tfollowing: inspection.model === undefined,\n\t\t...(resolution.available ? {} : { status: \"[unavailable]\", tone: \"warning\" as const }),\n\t};\n}\n\nfunction describeEffort(\n\tctx: ModelContext,\n\tinspection: InspectedAgentSettings,\n\tmodel: Model<any> | undefined,\n): AgentSettingsField {\n\tif (inspection.invalidThinking !== undefined) return invalidField(inspection.invalidThinking);\n\tconst requested = requestedEffort(ctx, inspection);\n\tconst following = inspection.thinking === undefined;\n\tif (!model) return { value: requested, following, status: \"[unresolved]\", tone: \"warning\" };\n\tconst effective = supportedEffort(model, requested);\n\tif (effective === requested) return { value: requested, following };\n\treturn { value: `${requested} → ${effective}`, following, tone: \"warning\" };\n}\n\nfunction hasOverrides(inspection: InspectedAgentSettings): boolean {\n\treturn (\n\t\tinspection.model !== undefined ||\n\t\tinspection.thinking !== undefined ||\n\t\tinspection.invalidModel !== undefined ||\n\t\tinspection.invalidThinking !== undefined\n\t);\n}\n\nfunction settingsRows(\n\tctx: ModelContext,\n\tinspection: InspectedAgentSettings,\n\tresolution: AgentModelResolution | undefined,\n): AgentSettingsRow[] {\n\treturn [\n\t\t{ action: \"model\", label: \"Model\", field: describeModel(inspection, resolution) },\n\t\t{ action: \"thinking\", label: \"Effort\", field: describeEffort(ctx, inspection, resolution?.model) },\n\t\t{ action: \"reset\", label: \"Reset to follow current session\" },\n\t];\n}\n\n/** The native pickers save only Agent overrides; reset clears both in one write. */\nexport async function openAgentSettings(ctx: ExtensionCommandContext): Promise<void> {\n\tif (ctx.mode !== \"tui\") {\n\t\ttry {\n\t\t\tconst settings = readAgentSettings(ctx);\n\t\t\tctx.ui.notify(\n\t\t\t\t`Agent model: ${settings.model ?? \"Follow current session\"} · Effort: ${settings.thinking ?? \"Follow current session\"}`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t}\n\t\treturn;\n\t}\n\tlet selectedAction: AgentSettingsAction = \"model\";\n\twhile (true) {\n\t\tlet inspection: InspectedAgentSettings;\n\t\ttry {\n\t\t\tinspection = inspectAgentSettings(ctx);\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst resolution = inspection.invalidModel !== undefined ? undefined : resolveAgentModel(ctx, inspection.model);\n\t\tconst action = await ctx.ui.custom<AgentSettingsAction | undefined>(\n\t\t\t(tui, theme, keys, done) =>\n\t\t\t\tnew AgentSettingsPanel(\n\t\t\t\t\ttui,\n\t\t\t\t\ttheme,\n\t\t\t\t\tkeys,\n\t\t\t\t\tsettingsRows(ctx, inspection, resolution),\n\t\t\t\t\tselectedAction,\n\t\t\t\t\tdone,\n\t\t\t\t\t() => done(undefined),\n\t\t\t\t),\n\t\t);\n\t\tif (!action) return;\n\t\tselectedAction = action;\n\t\ttry {\n\t\t\tif (action === \"reset\") {\n\t\t\t\tif (!hasOverrides(inspection)) continue;\n\t\t\t\tawait saveAgentSettings(ctx, { model: null, thinking: null });\n\t\t\t\tctx.ui.notify(\"Agent settings: Follow current session\", \"info\");\n\t\t\t} else if (action === \"model\") {\n\t\t\t\tconst selected = await selectAgentModel(ctx, inspection.model ?? \"\");\n\t\t\t\tif (selected === undefined || selected === inspection.model) continue;\n\t\t\t\tawait saveAgentSettings(ctx, { model: selected });\n\t\t\t\tctx.ui.notify(`Agent model: ${selected}`, \"info\");\n\t\t\t} else if (action === \"thinking\") {\n\t\t\t\tconst selected = await selectAgentThinking(ctx, inspection, resolution?.model);\n\t\t\t\tif (\n\t\t\t\t\tselected === undefined ||\n\t\t\t\t\t(selected === inspection.thinking && inspection.invalidThinking === undefined)\n\t\t\t\t)\n\t\t\t\t\tcontinue;\n\t\t\t\tawait saveAgentSettings(ctx, { thinking: selected });\n\t\t\t\tctx.ui.notify(`Agent effort: ${selected}`, \"info\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Could not save Agent settings: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/extensions/agent/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { clampThinkingLevel, getSupportedThinkingLevels, type Model } from \"@earendil-works/pi-ai/compat\";\nimport { DEFAULT_THINKING_LEVEL, THINKING_LEVEL_OPTIONS } from \"../../core/defaults.ts\";\nimport type { ExtensionCommandContext, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport { truncateHead } from \"../../core/tools/truncate.ts\";\nimport { ModelSelectorComponent } from \"../../modes/interactive/components/model-selector.ts\";\nimport { ThinkingSelectorComponent } from \"../../modes/interactive/components/thinking-selector.ts\";\nimport { AgentSettingsHost } from \"./settings-host.ts\";\nimport {\n\ttype AgentSettingsAction,\n\ttype AgentSettingsField,\n\tAgentSettingsPanel,\n\ttype AgentSettingsRow,\n} from \"./settings-panel.ts\";\nimport { AGENT_SETTINGS_NAMESPACE, type AgentSettings } from \"./types.ts\";\n\ntype SettingsContext = Pick<ExtensionContext, \"getExtensionSettings\" | \"setExtensionSettings\">;\ntype ModelContext = Pick<ExtensionContext, \"model\" | \"modelRuntime\" | \"thinkingLevel\">;\n\ninterface InspectedAgentSettings extends AgentSettings {\n\tinvalidModel?: unknown;\n\tinvalidThinking?: unknown;\n}\n\nfunction inspectAgentSettings(ctx: Pick<ExtensionContext, \"getExtensionSettings\">): InspectedAgentSettings {\n\tconst raw = ctx.getExtensionSettings(AGENT_SETTINGS_NAMESPACE);\n\tlet model: string | undefined;\n\tlet invalidModel: unknown;\n\tif (raw.model !== undefined) {\n\t\tif (typeof raw.model === \"string\" && raw.model.includes(\"/\")) {\n\t\t\tmodel = raw.model;\n\t\t} else {\n\t\t\tinvalidModel = raw.model;\n\t\t}\n\t}\n\tlet thinking: ThinkingLevel | undefined;\n\tlet invalidThinking: unknown;\n\tif (raw.thinking !== undefined) {\n\t\tif (typeof raw.thinking === \"string\" && THINKING_LEVEL_OPTIONS.includes(raw.thinking as ThinkingLevel)) {\n\t\t\tthinking = raw.thinking as ThinkingLevel;\n\t\t} else {\n\t\t\tinvalidThinking = raw.thinking;\n\t\t}\n\t}\n\treturn { model, thinking, invalidModel, invalidThinking };\n}\n\nexport function readAgentSettings(ctx: Pick<ExtensionContext, \"getExtensionSettings\">): AgentSettings {\n\tconst inspection = inspectAgentSettings(ctx);\n\tif (inspection.invalidModel !== undefined)\n\t\tthrow new Error(\"Invalid Agent model setting. Choose a model with /agent.\");\n\tif (inspection.invalidThinking !== undefined)\n\t\tthrow new Error(\"Invalid Agent effort setting. Choose an effort level with /agent.\");\n\treturn { model: inspection.model, thinking: inspection.thinking };\n}\n\ninterface AgentModelResolution {\n\tmodel: Model<any>;\n\t/** Listed by `/model` right now. The availability snapshot can lag auth changes, so this is display-only. */\n\tavailable: boolean;\n}\n\nfunction resolveAgentModel(\n\tctx: Pick<ModelContext, \"model\" | \"modelRuntime\">,\n\treference?: string,\n): AgentModelResolution | undefined {\n\tif (!reference) return ctx.model ? { model: ctx.model, available: true } : undefined;\n\tconst slash = reference.indexOf(\"/\");\n\tif (slash <= 0) return undefined;\n\tconst model = ctx.modelRuntime.getModel(reference.slice(0, slash), reference.slice(slash + 1));\n\tif (!model) return undefined;\n\tconst available = ctx.modelRuntime\n\t\t.getAvailableSnapshot()\n\t\t.some((item) => item.provider === model.provider && item.id === model.id);\n\treturn { model, available };\n}\n\nfunction requestedEffort(ctx: Pick<ModelContext, \"thinkingLevel\">, settings: AgentSettings): ThinkingLevel {\n\treturn settings.thinking ?? ctx.thinkingLevel ?? DEFAULT_THINKING_LEVEL;\n}\n\n/** Clamp a requested level to what the model supports. */\nfunction supportedEffort(model: Model<any>, requested: ThinkingLevel): ThinkingLevel {\n\treturn clampThinkingLevel(model, requested) as ThinkingLevel;\n}\n\nexport function resolveAgentConfiguration(ctx: ModelContext & Pick<ExtensionContext, \"getExtensionSettings\">): {\n\tmodel: Model<any>;\n\tthinking: ThinkingLevel;\n\tsettings: AgentSettings;\n} {\n\tconst settings = readAgentSettings(ctx);\n\tconst resolution = resolveAgentModel(ctx, settings.model);\n\tif (!resolution) {\n\t\tif (settings.model) throw new Error(`Agent model is unavailable: ${settings.model}`);\n\t\tthrow new Error(\"Agent has no model to follow. Choose one with /agent.\");\n\t}\n\treturn {\n\t\tmodel: resolution.model,\n\t\tthinking: supportedEffort(resolution.model, requestedEffort(ctx, settings)),\n\t\tsettings,\n\t};\n}\n\nasync function saveAgentSettings(\n\tctx: SettingsContext,\n\tpatch: { model?: string | null; thinking?: ThinkingLevel | null },\n): Promise<void> {\n\tconst next = { ...ctx.getExtensionSettings(AGENT_SETTINGS_NAMESPACE) };\n\tif (patch.model === null || patch.model === \"\") delete next.model;\n\telse if (patch.model !== undefined) next.model = patch.model;\n\tif (patch.thinking === null) delete next.thinking;\n\telse if (patch.thinking !== undefined) next.thinking = patch.thinking;\n\tawait ctx.setExtensionSettings(AGENT_SETTINGS_NAMESPACE, next);\n}\n\nasync function selectAgentModel(\n\tctx: ExtensionCommandContext,\n\thost: AgentSettingsHost,\n\tcurrent: string,\n): Promise<string | undefined> {\n\t// Preselect the saved reference even when it is unavailable, so the picker can repair it.\n\tconst saved = resolveAgentModel(ctx, current)?.model;\n\tconst selected = await host.show<Model<any> | undefined>(\n\t\t(tui, _theme, _keys, done) =>\n\t\t\tnew ModelSelectorComponent(tui, saved ?? ctx.model, ctx.modelRuntime, ctx.scopedModels, done, () =>\n\t\t\t\tdone(undefined),\n\t\t\t),\n\t);\n\treturn selected ? `${selected.provider}/${selected.id}` : undefined;\n}\n\nasync function selectAgentThinking(\n\tctx: ExtensionCommandContext,\n\thost: AgentSettingsHost,\n\tsettings: AgentSettings,\n\tmodel: Model<any> | undefined,\n): Promise<ThinkingLevel | undefined> {\n\tconst requested = requestedEffort(ctx, settings);\n\tconst current = model ? supportedEffort(model, requested) : requested;\n\tconst available = model ? getSupportedThinkingLevels(model) : [...THINKING_LEVEL_OPTIONS];\n\treturn host.show<ThinkingLevel | undefined>(\n\t\t(_tui, _theme, _keys, done) => new ThinkingSelectorComponent(current, available, done, () => done(undefined)),\n\t);\n}\n\nfunction formatInvalidValue(value: unknown): string {\n\tlet text = \"\";\n\ttry {\n\t\ttext = typeof value === \"string\" ? value : (JSON.stringify(value) ?? \"\");\n\t} catch {}\n\treturn truncateHead(text, { maxLines: 1, maxBytes: 80 }).content;\n}\n\nfunction invalidField(raw: unknown): AgentSettingsField {\n\treturn { value: formatInvalidValue(raw), status: \"[invalid]\", tone: \"error\" };\n}\n\nfunction describeModel(\n\tinspection: InspectedAgentSettings,\n\tresolution: AgentModelResolution | undefined,\n): AgentSettingsField {\n\tif (inspection.invalidModel !== undefined) return invalidField(inspection.invalidModel);\n\tif (!resolution) return { value: inspection.model ?? \"\", status: \"[unavailable]\", tone: \"warning\" };\n\treturn {\n\t\tvalue: `${resolution.model.provider}/${resolution.model.id}`,\n\t\tfollowing: inspection.model === undefined,\n\t\t...(resolution.available ? {} : { status: \"[unavailable]\", tone: \"warning\" as const }),\n\t};\n}\n\nfunction describeEffort(\n\tctx: ModelContext,\n\tinspection: InspectedAgentSettings,\n\tmodel: Model<any> | undefined,\n): AgentSettingsField {\n\tif (inspection.invalidThinking !== undefined) return invalidField(inspection.invalidThinking);\n\tconst requested = requestedEffort(ctx, inspection);\n\tconst following = inspection.thinking === undefined;\n\tif (!model) return { value: requested, following, status: \"[unresolved]\", tone: \"warning\" };\n\tconst effective = supportedEffort(model, requested);\n\tif (effective === requested) return { value: requested, following };\n\treturn { value: `${requested} → ${effective}`, following, tone: \"warning\" };\n}\n\nfunction hasOverrides(inspection: InspectedAgentSettings): boolean {\n\treturn (\n\t\tinspection.model !== undefined ||\n\t\tinspection.thinking !== undefined ||\n\t\tinspection.invalidModel !== undefined ||\n\t\tinspection.invalidThinking !== undefined\n\t);\n}\n\nfunction settingsRows(\n\tctx: ModelContext,\n\tinspection: InspectedAgentSettings,\n\tresolution: AgentModelResolution | undefined,\n): AgentSettingsRow[] {\n\treturn [\n\t\t{ action: \"model\", label: \"Model\", field: describeModel(inspection, resolution) },\n\t\t{ action: \"thinking\", label: \"Effort\", field: describeEffort(ctx, inspection, resolution?.model) },\n\t\t{ action: \"reset\", label: \"Reset to follow current session\" },\n\t];\n}\n\n/** The native pickers save only Agent overrides; reset clears both in one write. */\nexport async function openAgentSettings(ctx: ExtensionCommandContext): Promise<void> {\n\tif (ctx.mode !== \"tui\") {\n\t\ttry {\n\t\t\tconst settings = readAgentSettings(ctx);\n\t\t\tctx.ui.notify(\n\t\t\t\t`Agent model: ${settings.model ?? \"Follow current session\"} · Effort: ${settings.thinking ?? \"Follow current session\"}`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t}\n\t\treturn;\n\t}\n\tconst outcome = await ctx.ui.custom<{ error: unknown } | undefined>((tui, theme, keys, done) => {\n\t\tconst host = new AgentSettingsHost(tui, theme, keys);\n\t\trunAgentSettings(ctx, host).then(\n\t\t\t() => done(undefined),\n\t\t\t(error: unknown) => done({ error }),\n\t\t);\n\t\treturn host;\n\t});\n\tif (outcome) throw outcome.error;\n}\n\n/** Every page shares one dialog, so moving between them never exposes the editor. */\nasync function runAgentSettings(ctx: ExtensionCommandContext, host: AgentSettingsHost): Promise<void> {\n\tlet selectedAction: AgentSettingsAction = \"model\";\n\twhile (true) {\n\t\tlet inspection: InspectedAgentSettings;\n\t\ttry {\n\t\t\tinspection = inspectAgentSettings(ctx);\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst resolution = inspection.invalidModel !== undefined ? undefined : resolveAgentModel(ctx, inspection.model);\n\t\tconst action = await host.show<AgentSettingsAction | undefined>(\n\t\t\t(tui, theme, keys, done) =>\n\t\t\t\tnew AgentSettingsPanel(\n\t\t\t\t\ttui,\n\t\t\t\t\ttheme,\n\t\t\t\t\tkeys,\n\t\t\t\t\tsettingsRows(ctx, inspection, resolution),\n\t\t\t\t\tselectedAction,\n\t\t\t\t\tdone,\n\t\t\t\t\t() => done(undefined),\n\t\t\t\t),\n\t\t);\n\t\tif (!action) return;\n\t\tselectedAction = action;\n\t\ttry {\n\t\t\tif (action === \"reset\") {\n\t\t\t\tif (!hasOverrides(inspection)) continue;\n\t\t\t\tawait saveAgentSettings(ctx, { model: null, thinking: null });\n\t\t\t\tctx.ui.notify(\"Agent settings: Follow current session\", \"info\");\n\t\t\t} else if (action === \"model\") {\n\t\t\t\tconst selected = await selectAgentModel(ctx, host, inspection.model ?? \"\");\n\t\t\t\tif (selected === undefined || selected === inspection.model) continue;\n\t\t\t\tawait saveAgentSettings(ctx, { model: selected });\n\t\t\t\tctx.ui.notify(`Agent model: ${selected}`, \"info\");\n\t\t\t} else if (action === \"thinking\") {\n\t\t\t\tconst selected = await selectAgentThinking(ctx, host, inspection, resolution?.model);\n\t\t\t\tif (\n\t\t\t\t\tselected === undefined ||\n\t\t\t\t\t(selected === inspection.thinking && inspection.invalidThinking === undefined)\n\t\t\t\t)\n\t\t\t\t\tcontinue;\n\t\t\t\tawait saveAgentSettings(ctx, { thinking: selected });\n\t\t\t\tctx.ui.notify(`Agent effort: ${selected}`, \"info\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Could not save Agent settings: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* TUI component for managing package resources (enable/disable)
|
|
3
3
|
*/
|
|
4
4
|
import { type Component, Container, type Focusable } from "@earendil-works/pi-tui";
|
|
5
|
-
import type
|
|
6
|
-
import type { SettingsManager
|
|
5
|
+
import { type PathMetadata, type ResolvedPaths } from "../../../core/package-manager.ts";
|
|
6
|
+
import type { SettingsManager } from "../../../core/settings-manager.ts";
|
|
7
7
|
type ResourceType = "extensions" | "skills" | "prompts" | "themes";
|
|
8
8
|
type ConfigWriteScope = "global" | "project";
|
|
9
9
|
export type ScopedResolvedPaths = Record<ConfigWriteScope, ResolvedPaths>;
|
|
@@ -15,7 +15,6 @@ interface ResourceItem {
|
|
|
15
15
|
displayName: string;
|
|
16
16
|
groupKey: string;
|
|
17
17
|
subgroupKey: string;
|
|
18
|
-
skillInvocationOverride?: SkillInvocationOverride;
|
|
19
18
|
frontmatterDisableModelInvocation?: boolean;
|
|
20
19
|
}
|
|
21
20
|
interface ResourceSubgroup {
|
|
@@ -43,7 +42,8 @@ declare class ResourceList implements Component, Focusable {
|
|
|
43
42
|
private agentDir;
|
|
44
43
|
private writeScope;
|
|
45
44
|
private inheritedEnabledByKey;
|
|
46
|
-
private
|
|
45
|
+
private packageManager;
|
|
46
|
+
private skillInvocation;
|
|
47
47
|
onCancel?: () => void;
|
|
48
48
|
onExit?: () => void;
|
|
49
49
|
onToggle?: (item: ResourceItem, newEnabled: boolean) => void;
|
|
@@ -55,7 +55,6 @@ declare class ResourceList implements Component, Focusable {
|
|
|
55
55
|
setWriteScope(writeScope: ConfigWriteScope): void;
|
|
56
56
|
private get groups();
|
|
57
57
|
private buildInheritedEnabledMap;
|
|
58
|
-
private buildInheritedSkillStateMap;
|
|
59
58
|
private buildFlatList;
|
|
60
59
|
private findNextItem;
|
|
61
60
|
private filterItems;
|
|
@@ -69,15 +68,16 @@ declare class ResourceList implements Component, Focusable {
|
|
|
69
68
|
private togglePackageResource;
|
|
70
69
|
private setGlobalSkillEffectiveState;
|
|
71
70
|
private setProjectSkillOverride;
|
|
71
|
+
/** Runs after the load write, which creates the package entry a project override needs. */
|
|
72
72
|
private setSkillInvocationOverride;
|
|
73
73
|
private renderCheckbox;
|
|
74
74
|
private getItemSuffix;
|
|
75
75
|
private isDimmedItem;
|
|
76
|
+
/** The state settings give a skill in the current mode; global mode ignores project settings. */
|
|
76
77
|
private getSkillEffectiveState;
|
|
77
78
|
private getInheritedSkillEffectiveState;
|
|
78
79
|
private getNextProjectSkillOverrideState;
|
|
79
80
|
private getProjectSkillOverrideState;
|
|
80
|
-
private getSkillInvocationOverrideFromMap;
|
|
81
81
|
private setProjectResourceOverride;
|
|
82
82
|
private setProjectTopLevelOverride;
|
|
83
83
|
private setProjectTopLevelPaths;
|
|
@@ -90,7 +90,8 @@ declare class ResourceList implements Component, Focusable {
|
|
|
90
90
|
private getTopLevelOverridePatterns;
|
|
91
91
|
private getResourcePatternForScope;
|
|
92
92
|
private createPackageOverrideSource;
|
|
93
|
-
|
|
93
|
+
/** Package entries match by the identity package loading dedupes on, so `npm:pkg@1` and `npm:pkg` are one package. */
|
|
94
|
+
private isSamePackage;
|
|
94
95
|
private findMatchingPackageSource;
|
|
95
96
|
private getPatternEntryTarget;
|
|
96
97
|
private getResourceItemKey;
|
|
@@ -98,7 +99,8 @@ declare class ResourceList implements Component, Focusable {
|
|
|
98
99
|
private getTopLevelBaseDir;
|
|
99
100
|
private getResourcePattern;
|
|
100
101
|
private getPackageResourcePattern;
|
|
101
|
-
|
|
102
|
+
/** Package filter entries that name an item; a skill can also be named by its absolute path or directory. */
|
|
103
|
+
private getPackageOverridePatterns;
|
|
102
104
|
}
|
|
103
105
|
export declare class ConfigSelectorComponent extends Container implements Focusable {
|
|
104
106
|
private header;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/config-selector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACN,KAAK,SAAS,EACd,SAAS,EACT,KAAK,SAAS,EAOd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"config-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/config-selector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACN,KAAK,SAAS,EACd,SAAS,EACT,KAAK,SAAS,EAOd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEN,KAAK,YAAY,EACjB,KAAK,aAAa,EAElB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAiB,eAAe,EAA2B,MAAM,mCAAmC,CAAC;AAqBjH,KAAK,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AACnE,KAAK,gBAAgB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAI7C,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAgB1E,UAAU,YAAY;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,YAAY,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC,CAAC,EAAE,OAAO,CAAC;CAC5C;AAED,UAAU,gBAAgB;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,EAAE,CAAC;CACtB;AAED,UAAU,aAAa;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACxC,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAoKD,cAAM,YAAa,YAAW,SAAS,EAAE,SAAS;IACjD,OAAO,CAAC,aAAa,CAA4C;IACjE,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,eAAe,CAAwB;IAExC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;gBAGA,aAAa,EAAE,MAAM,CAAC,gBAAgB,EAAE,aAAa,EAAE,CAAC,EACxD,eAAe,EAAE,eAAe,EAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,EACvB,UAAU,GAAE,gBAA2B;IAkBxC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI;IAMjD,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,WAAW;IAmDnB,OAAO,CAAC,eAAe;IAKvB,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAetD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA4D/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA8D/B,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,sBAAsB;IAgD9B,OAAO,CAAC,qBAAqB;IA2D7B,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,uBAAuB;IAO/B,2FAA2F;IAC3F,OAAO,CAAC,0BAA0B;IA6BlC,OAAO,CAAC,cAAc;IA+BtB,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,YAAY;IAOpB,iGAAiG;IACjG,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,+BAA+B;IAQvC,OAAO,CAAC,gCAAgC;IAWxC,OAAO,CAAC,4BAA4B;IAUpC,OAAO,CAAC,0BAA0B;IAMlC,OAAO,CAAC,0BAA0B;IAoBlC,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,yBAAyB;IAsCjC,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,uBAAuB;IAgB/B,OAAO,CAAC,2BAA2B;IAenC,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,2BAA2B;IAiBnC,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,2BAA2B;IAOnC,sHAAsH;IACtH,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,yBAAyB;IAKjC,6GAA6G;IAC7G,OAAO,CAAC,0BAA0B;CAOlC;AAED,qBAAa,uBAAwB,SAAQ,SAAU,YAAW,SAAS;IAC1E,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,UAAU,CAAmB;IAErC,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;gBAGA,aAAa,EAAE,mBAAmB,EAClC,eAAe,EAAE,eAAe,EAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,IAAI,EACnB,MAAM,EAAE,MAAM,IAAI,EAClB,aAAa,EAAE,MAAM,IAAI,EACzB,cAAc,CAAC,EAAE,MAAM,EACvB,UAAU,GAAE,gBAA2B,EACvC,oBAAoB,UAAO;IA2C5B,OAAO,CAAC,gBAAgB;IAMxB,eAAe,IAAI,YAAY;CAG/B"}
|