@astralyn/pi 1.4.7 → 1.4.9

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.
Files changed (77) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/bundle/chunks/{chunk-YJTSOLP2.js → chunk-3PKXUKTB.js} +90 -90
  3. package/dist/bundle/chunks/{chunk-FODCTZXW.js → chunk-BAGHIP5J.js} +2 -2
  4. package/dist/bundle/chunks/{chunk-PU2IWWXV.js → chunk-DLVLAQEG.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-FYKNSJG6.js → chunk-F66AY3WR.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-MG5XDTXV.js → chunk-LPF7HQ3S.js} +1 -1
  7. package/dist/bundle/chunks/{chunk-RO2VH6UZ.js → chunk-R267VV5T.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-RLNMABLM.js → chunk-RVKT7OUB.js} +1 -1
  9. package/dist/bundle/chunks/{cli-MEL7SGJD.js → cli-MBFCFGI2.js} +1 -1
  10. package/dist/bundle/chunks/{execute-4CWRNHPO.js → execute-P22VMM2H.js} +1 -1
  11. package/dist/bundle/chunks/{runtime-R3X67XMR.js → runtime-3RPOJS5T.js} +1 -1
  12. package/dist/bundle/chunks/{virtual-modules-PKEOKGYI.js → virtual-modules-VKMBQTR2.js} +1 -1
  13. package/dist/bundle/cli.js +1 -1
  14. package/dist/bundle/index.js +1 -1
  15. package/dist/bundle/rpc-entry.js +1 -1
  16. package/dist/core/package-manager.d.ts +4 -8
  17. package/dist/core/package-manager.d.ts.map +1 -1
  18. package/dist/core/package-manager.js +11 -72
  19. package/dist/core/package-manager.js.map +1 -1
  20. package/dist/core/resource-loader.d.ts +2 -1
  21. package/dist/core/resource-loader.d.ts.map +1 -1
  22. package/dist/core/resource-loader.js +21 -24
  23. package/dist/core/resource-loader.js.map +1 -1
  24. package/dist/core/skill-invocation.d.ts +46 -0
  25. package/dist/core/skill-invocation.d.ts.map +1 -0
  26. package/dist/core/skill-invocation.js +128 -0
  27. package/dist/core/skill-invocation.js.map +1 -0
  28. package/dist/extensions/agent/settings-host.d.ts +33 -0
  29. package/dist/extensions/agent/settings-host.d.ts.map +1 -0
  30. package/dist/extensions/agent/settings-host.js +75 -0
  31. package/dist/extensions/agent/settings-host.js.map +1 -0
  32. package/dist/extensions/agent/settings.d.ts.map +1 -1
  33. package/dist/extensions/agent/settings.js +18 -7
  34. package/dist/extensions/agent/settings.js.map +1 -1
  35. package/dist/extensions/index.d.ts.map +1 -1
  36. package/dist/extensions/index.js +2 -0
  37. package/dist/extensions/index.js.map +1 -1
  38. package/dist/extensions/shell-paths/index.d.ts +8 -0
  39. package/dist/extensions/shell-paths/index.d.ts.map +1 -0
  40. package/dist/extensions/shell-paths/index.js +74 -0
  41. package/dist/extensions/shell-paths/index.js.map +1 -0
  42. package/dist/modes/interactive/chat-viewport.d.ts +5 -2
  43. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -1
  44. package/dist/modes/interactive/chat-viewport.js +72 -12
  45. package/dist/modes/interactive/chat-viewport.js.map +1 -1
  46. package/dist/modes/interactive/components/config-selector.d.ts +10 -8
  47. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  48. package/dist/modes/interactive/components/config-selector.js +51 -121
  49. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  50. package/dist/modes/interactive/components/sticky-user-message.d.ts +23 -0
  51. package/dist/modes/interactive/components/sticky-user-message.d.ts.map +1 -0
  52. package/dist/modes/interactive/components/sticky-user-message.js +58 -0
  53. package/dist/modes/interactive/components/sticky-user-message.js.map +1 -0
  54. package/dist/modes/interactive/components/user-message.d.ts +9 -0
  55. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  56. package/dist/modes/interactive/components/user-message.js +51 -10
  57. package/dist/modes/interactive/components/user-message.js.map +1 -1
  58. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  59. package/dist/modes/interactive/interactive-mode.js +4 -1
  60. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  61. package/dist/modes/interactive/tool-view/chat.d.ts +3 -2
  62. package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -1
  63. package/dist/modes/interactive/tool-view/chat.js +3 -3
  64. package/dist/modes/interactive/tool-view/chat.js.map +1 -1
  65. package/dist/modes/interactive/transcript-layout.d.ts +23 -0
  66. package/dist/modes/interactive/transcript-layout.d.ts.map +1 -0
  67. package/dist/modes/interactive/transcript-layout.js +29 -0
  68. package/dist/modes/interactive/transcript-layout.js.map +1 -0
  69. package/docs/bundled/README.md +1 -0
  70. package/docs/bundled/extensions/shell-paths.md +17 -0
  71. package/docs/docs.json +4 -0
  72. package/docs/packages.md +1 -1
  73. package/docs/settings.md +1 -1
  74. package/docs/skills.md +1 -1
  75. package/docs/usage.md +1 -1
  76. package/npm-shrinkwrap.json +2 -2
  77. 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;AAUhG,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;AAmGD,oFAAoF;AACpF,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEnF"}
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 ctx.ui.custom((tui, _theme, _keys, done) => new ModelSelectorComponent(tui, saved ?? ctx.model, ctx.modelRuntime, ctx.scopedModels, done, () => done(undefined)));
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 ctx.ui.custom((_tui, _theme, _keys, done) => new ThinkingSelectorComponent(current, available, done, () => done(undefined)));
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 ctx.ui.custom((tui, theme, keys, done) => new AgentSettingsPanel(tui, theme, keys, settingsRows(ctx, inspection, resolution), selectedAction, done, () => done(undefined)));
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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAiBnE,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAgB9C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAkBnE,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAiB9C,CAAC"}
@@ -10,6 +10,7 @@ import providerExtension from "./provider/index.js";
10
10
  import questionExtension from "./question/index.js";
11
11
  import runSummaryExtension from "./run-summary/index.js";
12
12
  import searchExtension from "./search/index.js";
13
+ import shellPathsExtension from "./shell-paths/index.js";
13
14
  import statuslineExtension from "./statusline/index.js";
14
15
  import tasksExtension from "./tasks/index.js";
15
16
  import toolPresentationExtension from "./tool-presentation/index.js";
@@ -30,5 +31,6 @@ export const builtInExtensions = [
30
31
  { name: "tool-presentation", factory: toolPresentationExtension, builtin: true },
31
32
  { name: "tasks", factory: tasksExtension, replaceable: true, builtin: true },
32
33
  { name: "search", factory: searchExtension, builtin: true },
34
+ { name: "shell-paths", factory: shellPathsExtension, builtin: true },
33
35
  ];
34
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,yBAAyB,MAAM,8BAA8B,CAAC;AACrE,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,mBAAmB,MAAM,wBAAwB,CAAC;AACzD,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,yBAAyB,MAAM,8BAA8B,CAAC;AACrE,OAAO,mBAAmB,MAAM,wBAAwB,CAAC;AAEzD,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IACnD,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAC5E,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAClF,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACxE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACvF,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACnG,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;IAC7D,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE;IACrD,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;IAC/D,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACvF,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE;IACnE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAE,IAAI,EAAE;IAChF,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAC5E,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE;CAC3D,CAAC","sourcesContent":["import \"./keybindings.ts\";\nimport type { InlineExtension } from \"../core/extensions/types.ts\";\nimport agentExtension from \"./agent/index.ts\";\nimport btwExtension from \"./btw/index.ts\";\nimport cachedCompactionExtension from \"./cached-compaction/index.ts\";\nimport codemodeExtension from \"./codemode/index.ts\";\nimport deepwikiExtension from \"./deepwiki/index.ts\";\nimport llamaExtension from \"./llama/index.ts\";\nimport mcpExtension from \"./mcp/index.ts\";\nimport providerExtension from \"./provider/index.ts\";\nimport questionExtension from \"./question/index.ts\";\nimport runSummaryExtension from \"./run-summary/index.ts\";\nimport searchExtension from \"./search/index.ts\";\nimport statuslineExtension from \"./statusline/index.ts\";\nimport tasksExtension from \"./tasks/index.ts\";\nimport toolPresentationExtension from \"./tool-presentation/index.ts\";\nimport toolSearchExtension from \"./tool-search/index.ts\";\n\nexport const builtInExtensions: InlineExtension[] = [\n\t{ name: \"Agent\", factory: agentExtension, replaceable: true, builtin: true },\n\t{ name: \"codemode\", factory: codemodeExtension, replaceable: true, builtin: true },\n\t{ name: \"mcp\", factory: mcpExtension, replaceable: true, builtin: true },\n\t{ name: \"tool-search\", factory: toolSearchExtension, replaceable: true, builtin: true },\n\t{ name: \"cached-compaction\", factory: cachedCompactionExtension, replaceable: true, builtin: true },\n\t{ name: \"llama.cpp\", factory: llamaExtension, builtin: true },\n\t{ name: \"btw\", factory: btwExtension, builtin: true },\n\t{ name: \"deepwiki\", factory: deepwikiExtension, builtin: true },\n\t{ name: \"provider\", factory: providerExtension, builtin: true },\n\t{ name: \"question\", factory: questionExtension, builtin: true },\n\t{ name: \"run-summary\", factory: runSummaryExtension, replaceable: true, builtin: true },\n\t{ name: \"statusline\", factory: statuslineExtension, builtin: true },\n\t{ name: \"tool-presentation\", factory: toolPresentationExtension, builtin: true },\n\t{ name: \"tasks\", factory: tasksExtension, replaceable: true, builtin: true },\n\t{ name: \"search\", factory: searchExtension, builtin: true },\n];\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,yBAAyB,MAAM,8BAA8B,CAAC;AACrE,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,mBAAmB,MAAM,wBAAwB,CAAC;AACzD,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,mBAAmB,MAAM,wBAAwB,CAAC;AACzD,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,yBAAyB,MAAM,8BAA8B,CAAC;AACrE,OAAO,mBAAmB,MAAM,wBAAwB,CAAC;AAEzD,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IACnD,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAC5E,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAClF,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACxE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACvF,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACnG,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;IAC7D,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE;IACrD,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;IAC/D,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACvF,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE;IACnE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAE,IAAI,EAAE;IAChF,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAC5E,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE;IAC3D,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE;CACpE,CAAC","sourcesContent":["import \"./keybindings.ts\";\nimport type { InlineExtension } from \"../core/extensions/types.ts\";\nimport agentExtension from \"./agent/index.ts\";\nimport btwExtension from \"./btw/index.ts\";\nimport cachedCompactionExtension from \"./cached-compaction/index.ts\";\nimport codemodeExtension from \"./codemode/index.ts\";\nimport deepwikiExtension from \"./deepwiki/index.ts\";\nimport llamaExtension from \"./llama/index.ts\";\nimport mcpExtension from \"./mcp/index.ts\";\nimport providerExtension from \"./provider/index.ts\";\nimport questionExtension from \"./question/index.ts\";\nimport runSummaryExtension from \"./run-summary/index.ts\";\nimport searchExtension from \"./search/index.ts\";\nimport shellPathsExtension from \"./shell-paths/index.ts\";\nimport statuslineExtension from \"./statusline/index.ts\";\nimport tasksExtension from \"./tasks/index.ts\";\nimport toolPresentationExtension from \"./tool-presentation/index.ts\";\nimport toolSearchExtension from \"./tool-search/index.ts\";\n\nexport const builtInExtensions: InlineExtension[] = [\n\t{ name: \"Agent\", factory: agentExtension, replaceable: true, builtin: true },\n\t{ name: \"codemode\", factory: codemodeExtension, replaceable: true, builtin: true },\n\t{ name: \"mcp\", factory: mcpExtension, replaceable: true, builtin: true },\n\t{ name: \"tool-search\", factory: toolSearchExtension, replaceable: true, builtin: true },\n\t{ name: \"cached-compaction\", factory: cachedCompactionExtension, replaceable: true, builtin: true },\n\t{ name: \"llama.cpp\", factory: llamaExtension, builtin: true },\n\t{ name: \"btw\", factory: btwExtension, builtin: true },\n\t{ name: \"deepwiki\", factory: deepwikiExtension, builtin: true },\n\t{ name: \"provider\", factory: providerExtension, builtin: true },\n\t{ name: \"question\", factory: questionExtension, builtin: true },\n\t{ name: \"run-summary\", factory: runSummaryExtension, replaceable: true, builtin: true },\n\t{ name: \"statusline\", factory: statuslineExtension, builtin: true },\n\t{ name: \"tool-presentation\", factory: toolPresentationExtension, builtin: true },\n\t{ name: \"tasks\", factory: tasksExtension, replaceable: true, builtin: true },\n\t{ name: \"search\", factory: searchExtension, builtin: true },\n\t{ name: \"shell-paths\", factory: shellPathsExtension, builtin: true },\n];\n"]}
@@ -0,0 +1,8 @@
1
+ import type { ExtensionAPI } from "../../core/extensions/types.ts";
2
+ /**
3
+ * Bash on Windows reports paths under its own mount table (`/tmp`, `/usr`, ...), which native file
4
+ * tools would otherwise resolve against the current drive root. Rewrite them to the Windows
5
+ * directories bash means. Drive paths such as `/c/...` stay with core path normalization.
6
+ */
7
+ export default function shellPathsExtension(pi: ExtensionAPI): void;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/shell-paths/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAsDnE;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAuBlE"}