@astralyn/pi 1.4.6 → 1.4.7
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 +22 -0
- package/dist/bundle/chunks/{chunk-KDO6L76C.js → chunk-FODCTZXW.js} +4 -4
- package/dist/bundle/chunks/{chunk-EYKC6ESU.js → chunk-FYKNSJG6.js} +1 -1
- package/dist/bundle/chunks/{chunk-AXFWZIHH.js → chunk-MG5XDTXV.js} +1 -1
- package/dist/bundle/chunks/{chunk-ALHAFUHP.js → chunk-PU2IWWXV.js} +1 -1
- package/dist/bundle/chunks/{chunk-5M3YJ54Z.js → chunk-RO2VH6UZ.js} +1 -1
- package/dist/bundle/chunks/{chunk-RBTJBQWX.js → chunk-YJTSOLP2.js} +73 -74
- package/dist/bundle/chunks/{cli-FH77R7JR.js → cli-MEL7SGJD.js} +1 -1
- package/dist/bundle/chunks/{execute-5ZQUS52M.js → execute-4CWRNHPO.js} +1 -1
- package/dist/bundle/chunks/{runtime-R5CMHJ5P.js → runtime-R3X67XMR.js} +1 -1
- package/dist/bundle/chunks/{virtual-modules-KCQU7LOC.js → virtual-modules-PKEOKGYI.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/agent-session.d.ts +0 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +0 -4
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/package-manager.d.ts +7 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +72 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/resource-loader.d.ts +1 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +23 -7
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +11 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-schema.d.ts +7 -0
- package/dist/core/settings-schema.d.ts.map +1 -1
- package/dist/core/settings-schema.js +6 -0
- package/dist/core/settings-schema.js.map +1 -1
- package/dist/core/skills.d.ts +10 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +23 -0
- package/dist/core/skills.js.map +1 -1
- package/dist/core/tasks/delivery.d.ts +11 -4
- package/dist/core/tasks/delivery.d.ts.map +1 -1
- package/dist/core/tasks/delivery.js +9 -9
- package/dist/core/tasks/delivery.js.map +1 -1
- package/dist/core/tasks/execution.d.ts +10 -3
- package/dist/core/tasks/execution.d.ts.map +1 -1
- package/dist/core/tasks/execution.js +72 -52
- package/dist/core/tasks/execution.js.map +1 -1
- package/dist/core/tasks/format.d.ts +0 -2
- package/dist/core/tasks/format.d.ts.map +1 -1
- package/dist/core/tasks/format.js +1 -16
- package/dist/core/tasks/format.js.map +1 -1
- package/dist/core/tasks/limits.d.ts +12 -1
- package/dist/core/tasks/limits.d.ts.map +1 -1
- package/dist/core/tasks/limits.js +20 -1
- package/dist/core/tasks/limits.js.map +1 -1
- package/dist/core/tasks/output.d.ts +6 -12
- package/dist/core/tasks/output.d.ts.map +1 -1
- package/dist/core/tasks/output.js +35 -32
- package/dist/core/tasks/output.js.map +1 -1
- package/dist/core/tasks/record.d.ts +45 -0
- package/dist/core/tasks/record.d.ts.map +1 -0
- package/dist/core/tasks/record.js +80 -0
- package/dist/core/tasks/record.js.map +1 -0
- package/dist/core/tasks/runtime.d.ts +14 -14
- package/dist/core/tasks/runtime.d.ts.map +1 -1
- package/dist/core/tasks/runtime.js +111 -93
- package/dist/core/tasks/runtime.js.map +1 -1
- package/dist/core/tasks/session.d.ts +0 -1
- package/dist/core/tasks/session.d.ts.map +1 -1
- package/dist/core/tasks/session.js +7 -8
- package/dist/core/tasks/session.js.map +1 -1
- package/dist/core/tasks/store.d.ts +18 -25
- package/dist/core/tasks/store.d.ts.map +1 -1
- package/dist/core/tasks/store.js +42 -40
- package/dist/core/tasks/store.js.map +1 -1
- package/dist/core/tasks/types.d.ts +96 -17
- package/dist/core/tasks/types.d.ts.map +1 -1
- package/dist/core/tasks/types.js.map +1 -1
- package/dist/core/tools/shell-execution.d.ts +8 -7
- package/dist/core/tools/shell-execution.d.ts.map +1 -1
- package/dist/core/tools/shell-execution.js +18 -26
- package/dist/core/tools/shell-execution.js.map +1 -1
- package/dist/core/tools/shell-tool.d.ts.map +1 -1
- package/dist/core/tools/shell-tool.js +31 -29
- package/dist/core/tools/shell-tool.js.map +1 -1
- package/dist/core/usage-totals.d.ts +3 -0
- package/dist/core/usage-totals.d.ts.map +1 -1
- package/dist/core/usage-totals.js +15 -0
- package/dist/core/usage-totals.js.map +1 -1
- package/dist/extensions/agent/progress.d.ts.map +1 -1
- package/dist/extensions/agent/progress.js +1 -11
- package/dist/extensions/agent/progress.js.map +1 -1
- package/dist/extensions/agent/tool.d.ts.map +1 -1
- package/dist/extensions/agent/tool.js +9 -5
- package/dist/extensions/agent/tool.js.map +1 -1
- package/dist/extensions/agent/worker.d.ts.map +1 -1
- package/dist/extensions/agent/worker.js +3 -5
- package/dist/extensions/agent/worker.js.map +1 -1
- package/dist/extensions/btw/agent.d.ts +1 -1
- package/dist/extensions/btw/agent.d.ts.map +1 -1
- package/dist/extensions/btw/agent.js +3 -20
- package/dist/extensions/btw/agent.js.map +1 -1
- package/dist/extensions/cached-compaction/index.d.ts.map +1 -1
- package/dist/extensions/cached-compaction/index.js +3 -22
- package/dist/extensions/cached-compaction/index.js.map +1 -1
- package/dist/extensions/cached-compaction/render.d.ts +1 -0
- package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
- package/dist/extensions/cached-compaction/render.js +42 -14
- package/dist/extensions/cached-compaction/render.js.map +1 -1
- package/dist/extensions/deepwiki/client.d.ts.map +1 -1
- package/dist/extensions/deepwiki/client.js +6 -78
- package/dist/extensions/deepwiki/client.js.map +1 -1
- package/dist/extensions/deepwiki/transport.d.ts +3 -0
- package/dist/extensions/deepwiki/transport.d.ts.map +1 -0
- package/dist/extensions/deepwiki/transport.js +96 -0
- package/dist/extensions/deepwiki/transport.js.map +1 -0
- package/dist/extensions/provider/ui/builtin-data.d.ts +3 -3
- package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
- package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
- package/dist/extensions/provider/ui/compat.d.ts +3 -3
- package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
- package/dist/extensions/provider/ui/compat.js.map +1 -1
- package/dist/extensions/provider/ui/controls.d.ts +2 -2
- package/dist/extensions/provider/ui/controls.d.ts.map +1 -1
- package/dist/extensions/provider/ui/controls.js.map +1 -1
- package/dist/extensions/provider/ui/dialogs.d.ts +3 -3
- package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -1
- package/dist/extensions/provider/ui/dialogs.js.map +1 -1
- package/dist/extensions/provider/ui/dictionary.d.ts +2 -2
- package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
- package/dist/extensions/provider/ui/dictionary.js.map +1 -1
- package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
- package/dist/extensions/provider/ui/editor.js +1 -3
- package/dist/extensions/provider/ui/editor.js.map +1 -1
- package/dist/extensions/provider/ui/fetch-models.d.ts +2 -2
- package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
- package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
- package/dist/extensions/provider/ui/model-fields.d.ts +2 -2
- package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
- package/dist/extensions/provider/ui/model-fields.js.map +1 -1
- package/dist/extensions/provider/ui/model-options.d.ts +6 -6
- package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
- package/dist/extensions/provider/ui/model-options.js.map +1 -1
- package/dist/extensions/provider/ui/pane.d.ts +21 -12
- package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
- package/dist/extensions/provider/ui/pane.js.map +1 -1
- package/dist/extensions/provider/ui/provider-fields.d.ts +3 -3
- package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
- package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
- package/dist/extensions/provider/ui/thinking-map.d.ts +2 -2
- package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
- package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
- package/dist/extensions/run-summary/format.js +1 -1
- package/dist/extensions/run-summary/format.js.map +1 -1
- package/dist/extensions/statusline/usage.d.ts.map +1 -1
- package/dist/extensions/statusline/usage.js +2 -6
- package/dist/extensions/statusline/usage.js.map +1 -1
- package/dist/extensions/tasks/tool/actions.d.ts +1 -1
- package/dist/extensions/tasks/tool/actions.d.ts.map +1 -1
- package/dist/extensions/tasks/tool/actions.js +49 -106
- package/dist/extensions/tasks/tool/actions.js.map +1 -1
- package/dist/extensions/tasks/tool/constants.d.ts +1 -6
- package/dist/extensions/tasks/tool/constants.d.ts.map +1 -1
- package/dist/extensions/tasks/tool/constants.js +1 -6
- package/dist/extensions/tasks/tool/constants.js.map +1 -1
- package/dist/extensions/tasks/tool/schema.d.ts +0 -3
- package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
- package/dist/extensions/tasks/tool/schema.js +4 -13
- package/dist/extensions/tasks/tool/schema.js.map +1 -1
- package/dist/extensions/tasks/tool.d.ts.map +1 -1
- package/dist/extensions/tasks/tool.js +2 -2
- package/dist/extensions/tasks/tool.js.map +1 -1
- package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/completion-render.js +31 -33
- package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
- package/dist/extensions/tasks/ui/layout.d.ts +7 -7
- package/dist/extensions/tasks/ui/layout.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/layout.js +17 -19
- package/dist/extensions/tasks/ui/layout.js.map +1 -1
- package/dist/extensions/tasks/ui/list.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/list.js +2 -3
- package/dist/extensions/tasks/ui/list.js.map +1 -1
- package/dist/extensions/tasks/ui/manager.d.ts +16 -7
- package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/manager.js +163 -131
- package/dist/extensions/tasks/ui/manager.js.map +1 -1
- package/dist/extensions/tasks/ui/model.d.ts +25 -0
- package/dist/extensions/tasks/ui/model.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/model.js +4 -0
- package/dist/extensions/tasks/ui/model.js.map +1 -1
- package/dist/extensions/tasks/ui/render.d.ts +1 -1
- package/dist/extensions/tasks/ui/render.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/render.js +11 -7
- package/dist/extensions/tasks/ui/render.js.map +1 -1
- package/dist/extensions/tasks/ui/status.d.ts +15 -0
- package/dist/extensions/tasks/ui/status.d.ts.map +1 -0
- package/dist/extensions/tasks/ui/status.js +16 -0
- package/dist/extensions/tasks/ui/status.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +14 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +258 -7
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-marker.d.ts +2 -1
- package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-marker.js +0 -1
- package/dist/modes/interactive/components/status-marker.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +7 -1
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/utils/duration.d.ts +3 -0
- package/dist/utils/duration.d.ts.map +1 -0
- package/dist/utils/duration.js +17 -0
- package/dist/utils/duration.js.map +1 -0
- package/dist/utils/number.d.ts +3 -0
- package/dist/utils/number.d.ts.map +1 -0
- package/dist/utils/number.js +5 -0
- package/dist/utils/number.js.map +1 -0
- package/docs/bundled/extensions/agent.md +3 -3
- package/docs/bundled/extensions/cached-compaction.md +13 -4
- package/docs/bundled/extensions/deepwiki.md +3 -1
- package/docs/extensions.md +5 -5
- package/docs/packages.md +5 -3
- package/docs/sdk.md +1 -1
- package/docs/session-format.md +1 -1
- package/docs/settings.md +11 -0
- package/docs/skills.md +23 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/schemas/settings.schema.json +36 -0
- package/dist/extensions/deepwiki/http.d.ts +0 -13
- package/dist/extensions/deepwiki/http.d.ts.map +0 -1
- package/dist/extensions/deepwiki/http.js +0 -88
- package/dist/extensions/deepwiki/http.js.map +0 -1
- package/dist/extensions/tasks/ui/task-view.d.ts +0 -8
- package/dist/extensions/tasks/ui/task-view.d.ts.map +0 -1
- package/dist/extensions/tasks/ui/task-view.js +0 -13
- package/dist/extensions/tasks/ui/task-view.js.map +0 -1
|
@@ -5,11 +5,20 @@ import { homedir } from "node:os";
|
|
|
5
5
|
import { basename, dirname, join, relative } from "node:path";
|
|
6
6
|
import { Container, getKeybindings, Input, matchesKey, Spacer, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
|
|
7
7
|
import { CONFIG_DIR_NAME } from "../../../config.js";
|
|
8
|
+
import { readSkillDisableModelInvocation, resolveSkillEffectiveState, } from "../../../core/skills.js";
|
|
8
9
|
import { BUILTIN_PATH_PREFIX } from "../../../core/source-info.js";
|
|
9
10
|
import { canonicalizePath, isLocalPath, resolvePath } from "../../../utils/paths.js";
|
|
10
11
|
import { theme } from "../theme/theme.js";
|
|
11
12
|
import { DynamicBorder } from "./dynamic-border.js";
|
|
12
13
|
import { keyHint, rawKeyHint } from "./keybinding-hints.js";
|
|
14
|
+
function hasResourcePattern(patterns, pattern) {
|
|
15
|
+
const normalized = pattern.replace(/\\/g, "/");
|
|
16
|
+
for (const candidate of patterns) {
|
|
17
|
+
if (candidate.replace(/\\/g, "/") === normalized)
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
13
22
|
const RESOURCE_TYPES = ["extensions", "skills", "prompts", "themes"];
|
|
14
23
|
const RESOURCE_TYPE_LABELS = {
|
|
15
24
|
extensions: "Extensions",
|
|
@@ -101,6 +110,8 @@ function buildGroups(resolved, agentDir) {
|
|
|
101
110
|
displayName,
|
|
102
111
|
groupKey,
|
|
103
112
|
subgroupKey,
|
|
113
|
+
skillInvocationOverride: res.skillInvocationOverride,
|
|
114
|
+
frontmatterDisableModelInvocation: resourceType === "skills" ? readSkillDisableModelInvocation(path) : undefined,
|
|
104
115
|
});
|
|
105
116
|
}
|
|
106
117
|
};
|
|
@@ -142,7 +153,7 @@ class ConfigSelectorHeader {
|
|
|
142
153
|
const title = theme.bold(this.writeScope === "project" ? "Project Local Resources" : "Global Resources");
|
|
143
154
|
const sep = theme.fg("muted", " · ");
|
|
144
155
|
const switchHint = this.projectModeAvailable ? keyHint("tui.input.tab", "switch mode") + sep : "";
|
|
145
|
-
const actionHint =
|
|
156
|
+
const actionHint = rawKeyHint("space", "change");
|
|
146
157
|
const hint = switchHint + actionHint + sep + rawKeyHint("esc", "close");
|
|
147
158
|
const spacing = Math.max(1, width - visibleWidth(title) - visibleWidth(hint));
|
|
148
159
|
const scopeHint = this.writeScope === "project"
|
|
@@ -173,6 +184,7 @@ class ResourceList {
|
|
|
173
184
|
this.agentDir = agentDir;
|
|
174
185
|
this.writeScope = writeScope;
|
|
175
186
|
this.inheritedEnabledByKey = this.buildInheritedEnabledMap(groupsByScope.global);
|
|
187
|
+
this.inheritedSkillStateByKey = this.buildInheritedSkillStateMap(groupsByScope.global);
|
|
176
188
|
this.searchInput = new Input();
|
|
177
189
|
// 8 lines of chrome: top spacer + top border + spacer + header (2 lines) + spacer + bottom spacer + bottom border
|
|
178
190
|
const chrome = 8;
|
|
@@ -199,6 +211,19 @@ class ResourceList {
|
|
|
199
211
|
}
|
|
200
212
|
return result;
|
|
201
213
|
}
|
|
214
|
+
buildInheritedSkillStateMap(groups) {
|
|
215
|
+
const result = new Map();
|
|
216
|
+
for (const group of groups) {
|
|
217
|
+
for (const subgroup of group.subgroups) {
|
|
218
|
+
if (subgroup.type !== "skills")
|
|
219
|
+
continue;
|
|
220
|
+
for (const item of subgroup.items) {
|
|
221
|
+
result.set(this.getResourceItemKey(item), this.getSkillEffectiveState(item));
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
202
227
|
buildFlatList() {
|
|
203
228
|
this.flatItems = [];
|
|
204
229
|
for (const group of this.groups) {
|
|
@@ -276,6 +301,12 @@ class ResourceList {
|
|
|
276
301
|
}
|
|
277
302
|
updateItem(item, enabled) {
|
|
278
303
|
item.enabled = enabled;
|
|
304
|
+
if (this.writeScope === "global") {
|
|
305
|
+
this.inheritedEnabledByKey.set(this.getResourceItemKey(item), enabled);
|
|
306
|
+
if (item.resourceType === "skills") {
|
|
307
|
+
this.inheritedSkillStateByKey.set(this.getResourceItemKey(item), this.getSkillEffectiveState(item));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
279
310
|
// Update in groups too
|
|
280
311
|
for (const group of this.groups) {
|
|
281
312
|
for (const subgroup of group.subgroups) {
|
|
@@ -323,7 +354,11 @@ class ResourceList {
|
|
|
323
354
|
const dimmed = this.isDimmedItem(item);
|
|
324
355
|
const nameText = isSelected && !dimmed ? theme.bold(item.displayName) : item.displayName;
|
|
325
356
|
const name = dimmed ? theme.fg("dim", nameText) : nameText;
|
|
326
|
-
|
|
357
|
+
const prefix = `${cursor} ${this.renderCheckbox(item)} `;
|
|
358
|
+
const suffix = this.getItemSuffix(item);
|
|
359
|
+
const nameWidth = Math.max(1, width - visibleWidth(prefix) - visibleWidth(suffix));
|
|
360
|
+
const renderedName = truncateToWidth(name, nameWidth, "...");
|
|
361
|
+
lines.push(truncateToWidth(`${prefix}${renderedName}${suffix}`, width, "..."));
|
|
327
362
|
}
|
|
328
363
|
}
|
|
329
364
|
// Scroll indicator
|
|
@@ -394,6 +429,22 @@ class ResourceList {
|
|
|
394
429
|
this.filterItems(this.searchInput.getValue());
|
|
395
430
|
}
|
|
396
431
|
toggleResource(item) {
|
|
432
|
+
if (item.resourceType === "skills") {
|
|
433
|
+
if (this.writeScope === "project") {
|
|
434
|
+
const state = this.getNextProjectSkillOverrideState(item);
|
|
435
|
+
if (!this.setProjectSkillOverride(item, state))
|
|
436
|
+
return undefined;
|
|
437
|
+
item.skillInvocationOverride =
|
|
438
|
+
state === "on" ? "model-and-user" : state === "user-only" ? "user-only" : undefined;
|
|
439
|
+
return state === "inherit" ? this.getInheritedSkillEffectiveState(item) !== "off" : state !== "off";
|
|
440
|
+
}
|
|
441
|
+
const currentState = this.getSkillEffectiveState(item);
|
|
442
|
+
const nextState = currentState === "on" ? "user-only" : currentState === "user-only" ? "off" : "on";
|
|
443
|
+
this.setGlobalSkillEffectiveState(item, nextState);
|
|
444
|
+
item.skillInvocationOverride =
|
|
445
|
+
nextState === "on" ? "model-and-user" : nextState === "user-only" ? "user-only" : undefined;
|
|
446
|
+
return nextState !== "off";
|
|
447
|
+
}
|
|
397
448
|
if (this.writeScope === "project") {
|
|
398
449
|
const state = this.getNextOverrideState(item);
|
|
399
450
|
if (!this.setProjectResourceOverride(item, state))
|
|
@@ -505,7 +556,104 @@ class ResourceList {
|
|
|
505
556
|
this.settingsManager.setPackages(packages);
|
|
506
557
|
}
|
|
507
558
|
}
|
|
559
|
+
setGlobalSkillEffectiveState(item, state) {
|
|
560
|
+
const enabled = state !== "off";
|
|
561
|
+
if (item.metadata.origin === "top-level")
|
|
562
|
+
this.toggleTopLevelResource(item, enabled);
|
|
563
|
+
else
|
|
564
|
+
this.togglePackageResource(item, enabled);
|
|
565
|
+
this.setSkillInvocationOverride(item, "user", state === "on" ? "model-and-user" : state === "user-only" ? "user-only" : undefined);
|
|
566
|
+
}
|
|
567
|
+
setProjectSkillOverride(item, state) {
|
|
568
|
+
const loadState = state === "inherit" ? "inherit" : state === "off" ? "unload" : "load";
|
|
569
|
+
if (!this.setProjectResourceOverride(item, loadState))
|
|
570
|
+
return false;
|
|
571
|
+
this.setSkillInvocationOverride(item, "project", state === "on" ? "model-and-user" : state === "user-only" ? "user-only" : undefined);
|
|
572
|
+
return true;
|
|
573
|
+
}
|
|
574
|
+
setSkillInvocationOverride(item, scope, override) {
|
|
575
|
+
if (item.metadata.origin === "top-level") {
|
|
576
|
+
const settings = scope === "project" ? this.settingsManager.getProjectSettings() : this.settingsManager.getGlobalSettings();
|
|
577
|
+
const updated = { ...settings.skillInvocationOverrides };
|
|
578
|
+
const patterns = this.getTopLevelOverridePatterns(item, scope);
|
|
579
|
+
for (const pattern of Object.keys(updated)) {
|
|
580
|
+
if (hasResourcePattern(patterns, pattern))
|
|
581
|
+
delete updated[pattern];
|
|
582
|
+
}
|
|
583
|
+
if (override) {
|
|
584
|
+
const pattern = scope === "project" && this.isInheritedGlobalItem(item)
|
|
585
|
+
? item.path
|
|
586
|
+
: this.getResourcePatternForScope(item, scope);
|
|
587
|
+
updated[pattern] = override;
|
|
588
|
+
}
|
|
589
|
+
if (scope === "project")
|
|
590
|
+
this.settingsManager.setProjectSkillInvocationOverrides(updated);
|
|
591
|
+
else
|
|
592
|
+
this.settingsManager.setSkillInvocationOverrides(updated);
|
|
593
|
+
return;
|
|
594
|
+
}
|
|
595
|
+
const settings = scope === "project" ? this.settingsManager.getProjectSettings() : this.settingsManager.getGlobalSettings();
|
|
596
|
+
const packages = [...(settings.packages ?? [])];
|
|
597
|
+
const pkgIndex = packages.findIndex((pkg) => this.packageSourceStringMatches(item.metadata.source, this.getItemScope(item), typeof pkg === "string" ? pkg : pkg.source, scope));
|
|
598
|
+
if (pkgIndex === -1)
|
|
599
|
+
return;
|
|
600
|
+
let pkg = packages[pkgIndex];
|
|
601
|
+
if (typeof pkg === "string") {
|
|
602
|
+
if (!override)
|
|
603
|
+
return;
|
|
604
|
+
pkg = { source: pkg };
|
|
605
|
+
packages[pkgIndex] = pkg;
|
|
606
|
+
}
|
|
607
|
+
const updated = { ...pkg.skillInvocationOverrides };
|
|
608
|
+
const patterns = this.getPackageSkillInvocationOverridePatterns(item);
|
|
609
|
+
for (const pattern of Object.keys(updated)) {
|
|
610
|
+
if (hasResourcePattern(patterns, pattern))
|
|
611
|
+
delete updated[pattern];
|
|
612
|
+
}
|
|
613
|
+
const pattern = this.getPackageResourcePattern(item);
|
|
614
|
+
if (override)
|
|
615
|
+
updated[pattern] = override;
|
|
616
|
+
pkg.skillInvocationOverrides = Object.keys(updated).length > 0 ? updated : undefined;
|
|
617
|
+
const hasConfiguration = RESOURCE_TYPES.some((key) => pkg[key] !== undefined) || pkg.skillInvocationOverrides !== undefined;
|
|
618
|
+
if (!hasConfiguration) {
|
|
619
|
+
if (scope === "project" && pkg.autoload === false)
|
|
620
|
+
packages.splice(pkgIndex, 1);
|
|
621
|
+
else
|
|
622
|
+
packages[pkgIndex] = pkg.source;
|
|
623
|
+
}
|
|
624
|
+
if (scope === "project")
|
|
625
|
+
this.settingsManager.setProjectPackages(packages);
|
|
626
|
+
else
|
|
627
|
+
this.settingsManager.setPackages(packages);
|
|
628
|
+
}
|
|
508
629
|
renderCheckbox(item) {
|
|
630
|
+
if (item.resourceType === "skills") {
|
|
631
|
+
if (this.writeScope === "project") {
|
|
632
|
+
const state = this.getProjectSkillOverrideState(item);
|
|
633
|
+
if (state === "on")
|
|
634
|
+
return theme.fg("success", "[+]");
|
|
635
|
+
if (state === "user-only")
|
|
636
|
+
return theme.fg("accent", "[u]");
|
|
637
|
+
if (state === "off")
|
|
638
|
+
return theme.fg("warning", "[-]");
|
|
639
|
+
if (state === "load") {
|
|
640
|
+
const effectiveState = this.getSkillEffectiveState(item);
|
|
641
|
+
if (effectiveState === "user-only")
|
|
642
|
+
return theme.fg("accent", "[u]");
|
|
643
|
+
if (effectiveState === "off")
|
|
644
|
+
return theme.fg("warning", "[-]");
|
|
645
|
+
return theme.fg("success", "[+]");
|
|
646
|
+
}
|
|
647
|
+
const inheritedState = this.getInheritedSkillEffectiveState(item);
|
|
648
|
+
return theme.fg("dim", inheritedState === "on" ? "[x]" : inheritedState === "user-only" ? "[u]" : "[ ]");
|
|
649
|
+
}
|
|
650
|
+
const state = this.getSkillEffectiveState(item);
|
|
651
|
+
if (state === "on")
|
|
652
|
+
return theme.fg("success", "[x]");
|
|
653
|
+
if (state === "user-only")
|
|
654
|
+
return theme.fg("accent", "[u]");
|
|
655
|
+
return theme.fg("dim", "[ ]");
|
|
656
|
+
}
|
|
509
657
|
if (this.writeScope === "project") {
|
|
510
658
|
const state = this.getProjectOverrideState(item);
|
|
511
659
|
if (state === "load")
|
|
@@ -517,6 +665,21 @@ class ResourceList {
|
|
|
517
665
|
return item.enabled ? theme.fg("success", "[x]") : theme.fg("dim", "[ ]");
|
|
518
666
|
}
|
|
519
667
|
getItemSuffix(item) {
|
|
668
|
+
if (item.resourceType === "skills") {
|
|
669
|
+
if (this.writeScope === "project") {
|
|
670
|
+
const state = this.getProjectSkillOverrideState(item);
|
|
671
|
+
if (state === "on")
|
|
672
|
+
return theme.fg("muted", " project on");
|
|
673
|
+
if (state === "user-only")
|
|
674
|
+
return theme.fg("muted", " project user only");
|
|
675
|
+
if (state === "off")
|
|
676
|
+
return theme.fg("muted", " project off");
|
|
677
|
+
if (state === "load")
|
|
678
|
+
return theme.fg("muted", " project load");
|
|
679
|
+
return this.isInheritedGlobalItem(item) ? theme.fg("dim", " inherited global") : "";
|
|
680
|
+
}
|
|
681
|
+
return this.getSkillEffectiveState(item) === "user-only" ? theme.fg("accent", " user only") : "";
|
|
682
|
+
}
|
|
520
683
|
if (this.writeScope !== "project")
|
|
521
684
|
return "";
|
|
522
685
|
const state = this.getProjectOverrideState(item);
|
|
@@ -527,9 +690,80 @@ class ResourceList {
|
|
|
527
690
|
return this.isInheritedGlobalItem(item) ? theme.fg("dim", " inherited global") : "";
|
|
528
691
|
}
|
|
529
692
|
isDimmedItem(item) {
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
693
|
+
if (this.writeScope !== "project" || !this.isInheritedGlobalItem(item))
|
|
694
|
+
return false;
|
|
695
|
+
return item.resourceType === "skills"
|
|
696
|
+
? this.getProjectSkillOverrideState(item) === "inherit"
|
|
697
|
+
: this.getProjectOverrideState(item) === "inherit";
|
|
698
|
+
}
|
|
699
|
+
getSkillEffectiveState(item) {
|
|
700
|
+
return resolveSkillEffectiveState({
|
|
701
|
+
enabled: item.enabled,
|
|
702
|
+
invocationOverride: item.skillInvocationOverride,
|
|
703
|
+
frontmatterDisableModelInvocation: item.frontmatterDisableModelInvocation,
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
getInheritedSkillEffectiveState(item) {
|
|
707
|
+
const inherited = this.inheritedSkillStateByKey.get(this.getResourceItemKey(item));
|
|
708
|
+
if (inherited)
|
|
709
|
+
return inherited;
|
|
710
|
+
const userScoped = this.getItemScope(item) === "user";
|
|
711
|
+
return resolveSkillEffectiveState({
|
|
712
|
+
enabled: userScoped ? item.enabled : true,
|
|
713
|
+
invocationOverride: userScoped ? item.skillInvocationOverride : undefined,
|
|
714
|
+
frontmatterDisableModelInvocation: item.frontmatterDisableModelInvocation,
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
getNextProjectSkillOverrideState(item) {
|
|
718
|
+
const states = ["on", "user-only", "off"];
|
|
719
|
+
const inheritedIndex = states.indexOf(this.getInheritedSkillEffectiveState(item));
|
|
720
|
+
const sequence = [...states.slice(inheritedIndex + 1), ...states.slice(0, inheritedIndex + 1)];
|
|
721
|
+
const current = this.getProjectSkillOverrideState(item);
|
|
722
|
+
if (current === "inherit")
|
|
723
|
+
return sequence[0];
|
|
724
|
+
if (current === "load")
|
|
725
|
+
return "inherit";
|
|
726
|
+
const currentIndex = sequence.indexOf(current);
|
|
727
|
+
return sequence[currentIndex + 1] ?? "inherit";
|
|
728
|
+
}
|
|
729
|
+
getProjectSkillOverrideState(item) {
|
|
730
|
+
if (this.writeScope !== "project")
|
|
731
|
+
return "inherit";
|
|
732
|
+
let loadState;
|
|
733
|
+
let invocationOverrides;
|
|
734
|
+
let patterns;
|
|
735
|
+
if (item.metadata.origin === "top-level") {
|
|
736
|
+
const settings = this.settingsManager.getProjectSettings();
|
|
737
|
+
loadState = this.getOverrideStateFromEntries((settings.skills ?? []), this.getTopLevelOverridePatterns(item, "project"), false);
|
|
738
|
+
invocationOverrides = settings.skillInvocationOverrides;
|
|
739
|
+
patterns = this.getTopLevelOverridePatterns(item, "project");
|
|
740
|
+
}
|
|
741
|
+
else {
|
|
742
|
+
const pkg = this.findMatchingPackageSource(item, "project");
|
|
743
|
+
if (typeof pkg !== "object")
|
|
744
|
+
return "inherit";
|
|
745
|
+
loadState =
|
|
746
|
+
pkg.skills === undefined
|
|
747
|
+
? "inherit"
|
|
748
|
+
: this.getOverrideStateFromEntries(pkg.skills, this.getPackageSkillInvocationOverridePatterns(item), pkg.autoload !== false);
|
|
749
|
+
invocationOverrides = pkg.skillInvocationOverrides;
|
|
750
|
+
patterns = this.getPackageSkillInvocationOverridePatterns(item);
|
|
751
|
+
}
|
|
752
|
+
if (loadState === "unload")
|
|
753
|
+
return "off";
|
|
754
|
+
const invocation = this.getSkillInvocationOverrideFromMap(invocationOverrides, patterns);
|
|
755
|
+
if (invocation)
|
|
756
|
+
return invocation === "user-only" ? "user-only" : "on";
|
|
757
|
+
return loadState;
|
|
758
|
+
}
|
|
759
|
+
getSkillInvocationOverrideFromMap(overrides, patterns) {
|
|
760
|
+
for (const [pattern, override] of Object.entries(overrides ?? {})) {
|
|
761
|
+
if (!hasResourcePattern(patterns, pattern))
|
|
762
|
+
continue;
|
|
763
|
+
if (override === "model-and-user" || override === "user-only")
|
|
764
|
+
return override;
|
|
765
|
+
}
|
|
766
|
+
return undefined;
|
|
533
767
|
}
|
|
534
768
|
setProjectResourceOverride(item, state) {
|
|
535
769
|
return item.metadata.origin === "top-level"
|
|
@@ -586,7 +820,8 @@ class ResourceList {
|
|
|
586
820
|
if (state !== "inherit")
|
|
587
821
|
updated.push(`${state === "load" ? "+" : "-"}${pattern}`);
|
|
588
822
|
pkg[item.resourceType] = updated.length > 0 ? updated : undefined;
|
|
589
|
-
if (!RESOURCE_TYPES.some((key) => pkg[key] !== undefined)
|
|
823
|
+
if (!RESOURCE_TYPES.some((key) => pkg[key] !== undefined) &&
|
|
824
|
+
pkg.skillInvocationOverrides === undefined) {
|
|
590
825
|
if (pkg.autoload === false)
|
|
591
826
|
packages.splice(pkgIndex, 1);
|
|
592
827
|
else
|
|
@@ -623,7 +858,7 @@ class ResourceList {
|
|
|
623
858
|
return "unload";
|
|
624
859
|
let state = "inherit";
|
|
625
860
|
for (const entry of entries) {
|
|
626
|
-
if (!patterns
|
|
861
|
+
if (!hasResourcePattern(patterns, this.getPatternEntryTarget(entry)))
|
|
627
862
|
continue;
|
|
628
863
|
if (entry.startsWith("!") || entry.startsWith("-"))
|
|
629
864
|
state = "unload";
|
|
@@ -648,6 +883,13 @@ class ResourceList {
|
|
|
648
883
|
]);
|
|
649
884
|
if (item.metadata.baseDir)
|
|
650
885
|
patterns.add(relative(item.metadata.baseDir, item.path));
|
|
886
|
+
if (item.resourceType === "skills" && basename(item.path) === "SKILL.md") {
|
|
887
|
+
const parentDir = dirname(item.path);
|
|
888
|
+
patterns.add(parentDir);
|
|
889
|
+
patterns.add(relative(baseDir, parentDir));
|
|
890
|
+
if (item.metadata.baseDir)
|
|
891
|
+
patterns.add(relative(item.metadata.baseDir, parentDir));
|
|
892
|
+
}
|
|
651
893
|
return patterns;
|
|
652
894
|
}
|
|
653
895
|
getResourcePatternForScope(item, scope) {
|
|
@@ -702,6 +944,15 @@ class ResourceList {
|
|
|
702
944
|
const baseDir = item.metadata.baseDir ?? dirname(item.path);
|
|
703
945
|
return relative(baseDir, item.path);
|
|
704
946
|
}
|
|
947
|
+
getPackageSkillInvocationOverridePatterns(item) {
|
|
948
|
+
const baseDir = item.metadata.baseDir ?? dirname(item.path);
|
|
949
|
+
const patterns = new Set([this.getPackageResourcePattern(item), item.path]);
|
|
950
|
+
if (basename(item.path) === "SKILL.md") {
|
|
951
|
+
patterns.add(relative(baseDir, dirname(item.path)));
|
|
952
|
+
patterns.add(dirname(item.path));
|
|
953
|
+
}
|
|
954
|
+
return patterns;
|
|
955
|
+
}
|
|
705
956
|
}
|
|
706
957
|
export class ConfigSelectorComponent extends Container {
|
|
707
958
|
get focused() {
|