@astralyn/pi 1.4.5 → 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.
Files changed (324) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/bundle/chunks/chunk-FODCTZXW.js +230 -0
  3. package/dist/bundle/chunks/{chunk-I5S7H7GA.js → chunk-FYKNSJG6.js} +1 -1
  4. package/dist/bundle/chunks/{chunk-AXFWZIHH.js → chunk-MG5XDTXV.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-ALHAFUHP.js → chunk-PU2IWWXV.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-5M3YJ54Z.js → chunk-RO2VH6UZ.js} +1 -1
  7. package/dist/bundle/chunks/chunk-YJTSOLP2.js +1499 -0
  8. package/dist/bundle/chunks/{cli-FH77R7JR.js → cli-MEL7SGJD.js} +1 -1
  9. package/dist/bundle/chunks/{execute-GMFGC27P.js → execute-4CWRNHPO.js} +1 -1
  10. package/dist/bundle/chunks/{runtime-R5CMHJ5P.js → runtime-R3X67XMR.js} +1 -1
  11. package/dist/bundle/chunks/{virtual-modules-6FUV7ZDV.js → virtual-modules-PKEOKGYI.js} +1 -1
  12. package/dist/bundle/cli.js +1 -1
  13. package/dist/bundle/index.js +1 -1
  14. package/dist/bundle/rpc-entry.js +1 -1
  15. package/dist/core/agent-session.d.ts +0 -3
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +0 -4
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/extensions/index.d.ts +1 -1
  20. package/dist/core/extensions/index.d.ts.map +1 -1
  21. package/dist/core/extensions/index.js.map +1 -1
  22. package/dist/core/isolated-session.d.ts +23 -0
  23. package/dist/core/isolated-session.d.ts.map +1 -0
  24. package/dist/core/isolated-session.js +55 -0
  25. package/dist/core/isolated-session.js.map +1 -0
  26. package/dist/core/package-manager.d.ts +7 -1
  27. package/dist/core/package-manager.d.ts.map +1 -1
  28. package/dist/core/package-manager.js +72 -1
  29. package/dist/core/package-manager.js.map +1 -1
  30. package/dist/core/resource-loader.d.ts +1 -0
  31. package/dist/core/resource-loader.d.ts.map +1 -1
  32. package/dist/core/resource-loader.js +23 -7
  33. package/dist/core/resource-loader.js.map +1 -1
  34. package/dist/core/settings-manager.d.ts +4 -2
  35. package/dist/core/settings-manager.d.ts.map +1 -1
  36. package/dist/core/settings-manager.js +11 -0
  37. package/dist/core/settings-manager.js.map +1 -1
  38. package/dist/core/settings-schema.d.ts +7 -0
  39. package/dist/core/settings-schema.d.ts.map +1 -1
  40. package/dist/core/settings-schema.js +6 -0
  41. package/dist/core/settings-schema.js.map +1 -1
  42. package/dist/core/skills.d.ts +10 -0
  43. package/dist/core/skills.d.ts.map +1 -1
  44. package/dist/core/skills.js +23 -0
  45. package/dist/core/skills.js.map +1 -1
  46. package/dist/core/tasks/codec.d.ts +12 -0
  47. package/dist/core/tasks/codec.d.ts.map +1 -0
  48. package/dist/core/tasks/codec.js +139 -0
  49. package/dist/core/tasks/codec.js.map +1 -0
  50. package/dist/core/tasks/delivery.d.ts +11 -4
  51. package/dist/core/tasks/delivery.d.ts.map +1 -1
  52. package/dist/core/tasks/delivery.js +9 -9
  53. package/dist/core/tasks/delivery.js.map +1 -1
  54. package/dist/core/tasks/execution.d.ts +71 -0
  55. package/dist/core/tasks/execution.d.ts.map +1 -0
  56. package/dist/core/tasks/execution.js +292 -0
  57. package/dist/core/tasks/execution.js.map +1 -0
  58. package/dist/core/tasks/format.d.ts +0 -2
  59. package/dist/core/tasks/format.d.ts.map +1 -1
  60. package/dist/core/tasks/format.js +1 -16
  61. package/dist/core/tasks/format.js.map +1 -1
  62. package/dist/core/tasks/limits.d.ts +12 -1
  63. package/dist/core/tasks/limits.d.ts.map +1 -1
  64. package/dist/core/tasks/limits.js +20 -1
  65. package/dist/core/tasks/limits.js.map +1 -1
  66. package/dist/core/tasks/output.d.ts +17 -17
  67. package/dist/core/tasks/output.d.ts.map +1 -1
  68. package/dist/core/tasks/output.js +72 -69
  69. package/dist/core/tasks/output.js.map +1 -1
  70. package/dist/core/tasks/presentation.d.ts +14 -5
  71. package/dist/core/tasks/presentation.d.ts.map +1 -1
  72. package/dist/core/tasks/presentation.js +56 -185
  73. package/dist/core/tasks/presentation.js.map +1 -1
  74. package/dist/core/tasks/record.d.ts +45 -0
  75. package/dist/core/tasks/record.d.ts.map +1 -0
  76. package/dist/core/tasks/record.js +80 -0
  77. package/dist/core/tasks/record.js.map +1 -0
  78. package/dist/core/tasks/runtime.d.ts +22 -22
  79. package/dist/core/tasks/runtime.d.ts.map +1 -1
  80. package/dist/core/tasks/runtime.js +170 -343
  81. package/dist/core/tasks/runtime.js.map +1 -1
  82. package/dist/core/tasks/scheduler.d.ts +16 -0
  83. package/dist/core/tasks/scheduler.d.ts.map +1 -0
  84. package/dist/core/tasks/scheduler.js +42 -0
  85. package/dist/core/tasks/scheduler.js.map +1 -0
  86. package/dist/core/tasks/session.d.ts +1 -1
  87. package/dist/core/tasks/session.d.ts.map +1 -1
  88. package/dist/core/tasks/session.js +22 -35
  89. package/dist/core/tasks/session.js.map +1 -1
  90. package/dist/core/tasks/store.d.ts +18 -25
  91. package/dist/core/tasks/store.d.ts.map +1 -1
  92. package/dist/core/tasks/store.js +45 -43
  93. package/dist/core/tasks/store.js.map +1 -1
  94. package/dist/core/tasks/types.d.ts +159 -70
  95. package/dist/core/tasks/types.d.ts.map +1 -1
  96. package/dist/core/tasks/types.js +3 -9
  97. package/dist/core/tasks/types.js.map +1 -1
  98. package/dist/core/tools/shell-execution.d.ts +8 -7
  99. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  100. package/dist/core/tools/shell-execution.js +19 -27
  101. package/dist/core/tools/shell-execution.js.map +1 -1
  102. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  103. package/dist/core/tools/shell-tool.js +42 -47
  104. package/dist/core/tools/shell-tool.js.map +1 -1
  105. package/dist/core/usage-totals.d.ts +4 -3
  106. package/dist/core/usage-totals.d.ts.map +1 -1
  107. package/dist/core/usage-totals.js +32 -8
  108. package/dist/core/usage-totals.js.map +1 -1
  109. package/dist/extensions/agent/activity.d.ts +4 -4
  110. package/dist/extensions/agent/activity.d.ts.map +1 -1
  111. package/dist/extensions/agent/activity.js +15 -24
  112. package/dist/extensions/agent/activity.js.map +1 -1
  113. package/dist/extensions/agent/index.d.ts +2 -11
  114. package/dist/extensions/agent/index.d.ts.map +1 -1
  115. package/dist/extensions/agent/index.js +3 -88
  116. package/dist/extensions/agent/index.js.map +1 -1
  117. package/dist/extensions/agent/progress.d.ts +31 -0
  118. package/dist/extensions/agent/progress.d.ts.map +1 -0
  119. package/dist/extensions/agent/progress.js +135 -0
  120. package/dist/extensions/agent/progress.js.map +1 -0
  121. package/dist/extensions/agent/render.d.ts.map +1 -1
  122. package/dist/extensions/agent/render.js +8 -17
  123. package/dist/extensions/agent/render.js.map +1 -1
  124. package/dist/extensions/agent/report.d.ts +9 -0
  125. package/dist/extensions/agent/report.d.ts.map +1 -0
  126. package/dist/extensions/agent/report.js +40 -0
  127. package/dist/extensions/agent/report.js.map +1 -0
  128. package/dist/extensions/agent/settings-panel.d.ts +43 -0
  129. package/dist/extensions/agent/settings-panel.d.ts.map +1 -0
  130. package/dist/extensions/agent/settings-panel.js +125 -0
  131. package/dist/extensions/agent/settings-panel.js.map +1 -0
  132. package/dist/extensions/agent/settings.d.ts +1 -1
  133. package/dist/extensions/agent/settings.d.ts.map +1 -1
  134. package/dist/extensions/agent/settings.js +101 -83
  135. package/dist/extensions/agent/settings.js.map +1 -1
  136. package/dist/extensions/agent/tool.d.ts +13 -0
  137. package/dist/extensions/agent/tool.d.ts.map +1 -0
  138. package/dist/extensions/agent/tool.js +88 -0
  139. package/dist/extensions/agent/tool.js.map +1 -0
  140. package/dist/extensions/agent/types.d.ts +19 -21
  141. package/dist/extensions/agent/types.d.ts.map +1 -1
  142. package/dist/extensions/agent/types.js +2 -10
  143. package/dist/extensions/agent/types.js.map +1 -1
  144. package/dist/extensions/agent/worker.d.ts +16 -0
  145. package/dist/extensions/agent/worker.d.ts.map +1 -0
  146. package/dist/extensions/agent/worker.js +66 -0
  147. package/dist/extensions/agent/worker.js.map +1 -0
  148. package/dist/extensions/btw/agent.d.ts +1 -1
  149. package/dist/extensions/btw/agent.d.ts.map +1 -1
  150. package/dist/extensions/btw/agent.js +3 -20
  151. package/dist/extensions/btw/agent.js.map +1 -1
  152. package/dist/extensions/cached-compaction/index.d.ts.map +1 -1
  153. package/dist/extensions/cached-compaction/index.js +3 -22
  154. package/dist/extensions/cached-compaction/index.js.map +1 -1
  155. package/dist/extensions/cached-compaction/render.d.ts +1 -0
  156. package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
  157. package/dist/extensions/cached-compaction/render.js +42 -14
  158. package/dist/extensions/cached-compaction/render.js.map +1 -1
  159. package/dist/extensions/deepwiki/client.d.ts.map +1 -1
  160. package/dist/extensions/deepwiki/client.js +6 -78
  161. package/dist/extensions/deepwiki/client.js.map +1 -1
  162. package/dist/extensions/deepwiki/transport.d.ts +3 -0
  163. package/dist/extensions/deepwiki/transport.d.ts.map +1 -0
  164. package/dist/extensions/deepwiki/transport.js +96 -0
  165. package/dist/extensions/deepwiki/transport.js.map +1 -0
  166. package/dist/extensions/provider/ui/builtin-data.d.ts +3 -3
  167. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
  168. package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
  169. package/dist/extensions/provider/ui/compat.d.ts +3 -3
  170. package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
  171. package/dist/extensions/provider/ui/compat.js.map +1 -1
  172. package/dist/extensions/provider/ui/controls.d.ts +2 -2
  173. package/dist/extensions/provider/ui/controls.d.ts.map +1 -1
  174. package/dist/extensions/provider/ui/controls.js.map +1 -1
  175. package/dist/extensions/provider/ui/dialogs.d.ts +3 -3
  176. package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -1
  177. package/dist/extensions/provider/ui/dialogs.js.map +1 -1
  178. package/dist/extensions/provider/ui/dictionary.d.ts +2 -2
  179. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
  180. package/dist/extensions/provider/ui/dictionary.js.map +1 -1
  181. package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
  182. package/dist/extensions/provider/ui/editor.js +1 -3
  183. package/dist/extensions/provider/ui/editor.js.map +1 -1
  184. package/dist/extensions/provider/ui/fetch-models.d.ts +2 -2
  185. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
  186. package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
  187. package/dist/extensions/provider/ui/model-fields.d.ts +2 -2
  188. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
  189. package/dist/extensions/provider/ui/model-fields.js.map +1 -1
  190. package/dist/extensions/provider/ui/model-options.d.ts +6 -6
  191. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
  192. package/dist/extensions/provider/ui/model-options.js.map +1 -1
  193. package/dist/extensions/provider/ui/pane.d.ts +21 -12
  194. package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
  195. package/dist/extensions/provider/ui/pane.js.map +1 -1
  196. package/dist/extensions/provider/ui/provider-fields.d.ts +3 -3
  197. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
  198. package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
  199. package/dist/extensions/provider/ui/thinking-map.d.ts +2 -2
  200. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
  201. package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
  202. package/dist/extensions/run-summary/format.js +1 -1
  203. package/dist/extensions/run-summary/format.js.map +1 -1
  204. package/dist/extensions/statusline/usage.d.ts.map +1 -1
  205. package/dist/extensions/statusline/usage.js +2 -6
  206. package/dist/extensions/statusline/usage.js.map +1 -1
  207. package/dist/extensions/tasks/tool/actions.d.ts +1 -1
  208. package/dist/extensions/tasks/tool/actions.d.ts.map +1 -1
  209. package/dist/extensions/tasks/tool/actions.js +50 -115
  210. package/dist/extensions/tasks/tool/actions.js.map +1 -1
  211. package/dist/extensions/tasks/tool/constants.d.ts +1 -6
  212. package/dist/extensions/tasks/tool/constants.d.ts.map +1 -1
  213. package/dist/extensions/tasks/tool/constants.js +1 -6
  214. package/dist/extensions/tasks/tool/constants.js.map +1 -1
  215. package/dist/extensions/tasks/tool/schema.d.ts +0 -3
  216. package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
  217. package/dist/extensions/tasks/tool/schema.js +5 -14
  218. package/dist/extensions/tasks/tool/schema.js.map +1 -1
  219. package/dist/extensions/tasks/tool/types.d.ts +2 -8
  220. package/dist/extensions/tasks/tool/types.d.ts.map +1 -1
  221. package/dist/extensions/tasks/tool/types.js +0 -2
  222. package/dist/extensions/tasks/tool/types.js.map +1 -1
  223. package/dist/extensions/tasks/tool.d.ts.map +1 -1
  224. package/dist/extensions/tasks/tool.js +2 -2
  225. package/dist/extensions/tasks/tool.js.map +1 -1
  226. package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
  227. package/dist/extensions/tasks/ui/completion-render.js +46 -47
  228. package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
  229. package/dist/extensions/tasks/ui/inspector.d.ts +5 -3
  230. package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
  231. package/dist/extensions/tasks/ui/inspector.js +18 -6
  232. package/dist/extensions/tasks/ui/inspector.js.map +1 -1
  233. package/dist/extensions/tasks/ui/layout.d.ts +7 -7
  234. package/dist/extensions/tasks/ui/layout.d.ts.map +1 -1
  235. package/dist/extensions/tasks/ui/layout.js +118 -84
  236. package/dist/extensions/tasks/ui/layout.js.map +1 -1
  237. package/dist/extensions/tasks/ui/list.d.ts.map +1 -1
  238. package/dist/extensions/tasks/ui/list.js +45 -31
  239. package/dist/extensions/tasks/ui/list.js.map +1 -1
  240. package/dist/extensions/tasks/ui/manager.d.ts +16 -7
  241. package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
  242. package/dist/extensions/tasks/ui/manager.js +167 -129
  243. package/dist/extensions/tasks/ui/manager.js.map +1 -1
  244. package/dist/extensions/tasks/ui/model.d.ts +29 -0
  245. package/dist/extensions/tasks/ui/model.d.ts.map +1 -1
  246. package/dist/extensions/tasks/ui/model.js +16 -1
  247. package/dist/extensions/tasks/ui/model.js.map +1 -1
  248. package/dist/extensions/tasks/ui/render.d.ts +1 -1
  249. package/dist/extensions/tasks/ui/render.d.ts.map +1 -1
  250. package/dist/extensions/tasks/ui/render.js +12 -9
  251. package/dist/extensions/tasks/ui/render.js.map +1 -1
  252. package/dist/extensions/tasks/ui/status.d.ts +15 -0
  253. package/dist/extensions/tasks/ui/status.d.ts.map +1 -0
  254. package/dist/extensions/tasks/ui/status.js +16 -0
  255. package/dist/extensions/tasks/ui/status.js.map +1 -0
  256. package/dist/extensions/tasks/ui/tree.js +1 -1
  257. package/dist/extensions/tasks/ui/tree.js.map +1 -1
  258. package/dist/extensions/tasks/ui/views.d.ts +10 -5
  259. package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
  260. package/dist/extensions/tasks/ui/views.js +61 -36
  261. package/dist/extensions/tasks/ui/views.js.map +1 -1
  262. package/dist/index.d.ts +2 -1
  263. package/dist/index.d.ts.map +1 -1
  264. package/dist/index.js.map +1 -1
  265. package/dist/modes/interactive/components/config-selector.d.ts +14 -1
  266. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  267. package/dist/modes/interactive/components/config-selector.js +258 -7
  268. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  269. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  270. package/dist/modes/interactive/components/keybinding-hints.js +2 -1
  271. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  272. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  273. package/dist/modes/interactive/components/model-selector.js +7 -4
  274. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  275. package/dist/modes/interactive/components/status-marker.d.ts +2 -1
  276. package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
  277. package/dist/modes/interactive/components/status-marker.js +0 -1
  278. package/dist/modes/interactive/components/status-marker.js.map +1 -1
  279. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  280. package/dist/modes/interactive/components/thinking-selector.js +10 -3
  281. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  282. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  283. package/dist/modes/interactive/interactive-mode.js +7 -1
  284. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  285. package/dist/utils/duration.d.ts +3 -0
  286. package/dist/utils/duration.d.ts.map +1 -0
  287. package/dist/utils/duration.js +17 -0
  288. package/dist/utils/duration.js.map +1 -0
  289. package/dist/utils/number.d.ts +3 -0
  290. package/dist/utils/number.d.ts.map +1 -0
  291. package/dist/utils/number.js +5 -0
  292. package/dist/utils/number.js.map +1 -0
  293. package/docs/bundled/extensions/agent.md +14 -12
  294. package/docs/bundled/extensions/cached-compaction.md +13 -4
  295. package/docs/bundled/extensions/deepwiki.md +3 -1
  296. package/docs/bundled/extensions/statusline.md +1 -1
  297. package/docs/bundled/tasks.md +15 -14
  298. package/docs/extensions.md +26 -10
  299. package/docs/packages.md +5 -3
  300. package/docs/sdk.md +3 -3
  301. package/docs/session-format.md +28 -24
  302. package/docs/settings.md +11 -0
  303. package/docs/skills.md +23 -0
  304. package/npm-shrinkwrap.json +2 -2
  305. package/package.json +1 -1
  306. package/schemas/settings.schema.json +36 -0
  307. package/dist/bundle/chunks/chunk-FSJ45CRP.js +0 -229
  308. package/dist/bundle/chunks/chunk-W3FIUMGM.js +0 -1501
  309. package/dist/core/tasks/history.d.ts +0 -4
  310. package/dist/core/tasks/history.d.ts.map +0 -1
  311. package/dist/core/tasks/history.js +0 -131
  312. package/dist/core/tasks/history.js.map +0 -1
  313. package/dist/extensions/agent/runner.d.ts +0 -24
  314. package/dist/extensions/agent/runner.d.ts.map +0 -1
  315. package/dist/extensions/agent/runner.js +0 -274
  316. package/dist/extensions/agent/runner.js.map +0 -1
  317. package/dist/extensions/deepwiki/http.d.ts +0 -13
  318. package/dist/extensions/deepwiki/http.d.ts.map +0 -1
  319. package/dist/extensions/deepwiki/http.js +0 -88
  320. package/dist/extensions/deepwiki/http.js.map +0 -1
  321. package/dist/extensions/tasks/ui/task-view.d.ts +0 -13
  322. package/dist/extensions/tasks/ui/task-view.d.ts.map +0 -1
  323. package/dist/extensions/tasks/ui/task-view.js +0 -20
  324. 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 = this.writeScope === "project" ? rawKeyHint("space", "cycle inherit/+/-") : rawKeyHint("space", "toggle");
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
- lines.push(truncateToWidth(`${cursor} ${this.renderCheckbox(item)} ${name}${this.getItemSuffix(item)}`, width, "..."));
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
- return (this.writeScope === "project" &&
531
- this.isInheritedGlobalItem(item) &&
532
- this.getProjectOverrideState(item) === "inherit");
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.has(this.getPatternEntryTarget(entry)))
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() {