@jini-ai/agent-plugins 0.4.7 → 0.6.10

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 (212) hide show
  1. package/CHANGELOG.md +24 -2
  2. package/README.md +46 -0
  3. package/dist/admin-surfaces/action-dispatcher.d.ts +37 -0
  4. package/dist/admin-surfaces/action-dispatcher.d.ts.map +1 -0
  5. package/dist/admin-surfaces/action-dispatcher.js +69 -0
  6. package/dist/admin-surfaces/action-dispatcher.js.map +1 -0
  7. package/dist/admin-surfaces/action-schema.d.ts +56 -0
  8. package/dist/admin-surfaces/action-schema.d.ts.map +1 -0
  9. package/dist/admin-surfaces/action-schema.js +167 -0
  10. package/dist/admin-surfaces/action-schema.js.map +1 -0
  11. package/dist/admin-surfaces/action-tools.d.ts +40 -0
  12. package/dist/admin-surfaces/action-tools.d.ts.map +1 -0
  13. package/dist/admin-surfaces/action-tools.js +52 -0
  14. package/dist/admin-surfaces/action-tools.js.map +1 -0
  15. package/dist/admin-surfaces/callback-field-inbox.d.ts +35 -0
  16. package/dist/admin-surfaces/callback-field-inbox.d.ts.map +1 -0
  17. package/dist/admin-surfaces/callback-field-inbox.js +53 -0
  18. package/dist/admin-surfaces/callback-field-inbox.js.map +1 -0
  19. package/dist/admin-surfaces/capability-declarations.d.ts +41 -0
  20. package/dist/admin-surfaces/capability-declarations.d.ts.map +1 -0
  21. package/dist/admin-surfaces/capability-declarations.js +102 -0
  22. package/dist/admin-surfaces/capability-declarations.js.map +1 -0
  23. package/dist/admin-surfaces/contribution.d.ts +49 -0
  24. package/dist/admin-surfaces/contribution.d.ts.map +1 -0
  25. package/dist/admin-surfaces/contribution.js +30 -0
  26. package/dist/admin-surfaces/contribution.js.map +1 -0
  27. package/dist/admin-surfaces/delivery-bindings.d.ts +76 -0
  28. package/dist/admin-surfaces/delivery-bindings.d.ts.map +1 -0
  29. package/dist/admin-surfaces/delivery-bindings.js +99 -0
  30. package/dist/admin-surfaces/delivery-bindings.js.map +1 -0
  31. package/dist/admin-surfaces/descriptor.d.ts +69 -0
  32. package/dist/admin-surfaces/descriptor.d.ts.map +1 -0
  33. package/dist/admin-surfaces/descriptor.js +196 -0
  34. package/dist/admin-surfaces/descriptor.js.map +1 -0
  35. package/dist/admin-surfaces/external-links.d.ts +45 -0
  36. package/dist/admin-surfaces/external-links.d.ts.map +1 -0
  37. package/dist/admin-surfaces/external-links.js +70 -0
  38. package/dist/admin-surfaces/external-links.js.map +1 -0
  39. package/dist/admin-surfaces/host-validator.d.ts +62 -0
  40. package/dist/admin-surfaces/host-validator.d.ts.map +1 -0
  41. package/dist/admin-surfaces/host-validator.js +87 -0
  42. package/dist/admin-surfaces/host-validator.js.map +1 -0
  43. package/dist/admin-surfaces/index.d.ts +23 -0
  44. package/dist/admin-surfaces/index.d.ts.map +1 -0
  45. package/dist/admin-surfaces/index.js +21 -0
  46. package/dist/admin-surfaces/index.js.map +1 -0
  47. package/dist/admin-surfaces/protocol.d.ts +103 -0
  48. package/dist/admin-surfaces/protocol.d.ts.map +1 -0
  49. package/dist/admin-surfaces/protocol.js +25 -0
  50. package/dist/admin-surfaces/protocol.js.map +1 -0
  51. package/dist/admin-surfaces/sandbox.d.ts +78 -0
  52. package/dist/admin-surfaces/sandbox.d.ts.map +1 -0
  53. package/dist/admin-surfaces/sandbox.js +92 -0
  54. package/dist/admin-surfaces/sandbox.js.map +1 -0
  55. package/dist/admin-surfaces/settings-value.d.ts +28 -0
  56. package/dist/admin-surfaces/settings-value.d.ts.map +1 -0
  57. package/dist/admin-surfaces/settings-value.js +45 -0
  58. package/dist/admin-surfaces/settings-value.js.map +1 -0
  59. package/dist/admin-surfaces/surface-capabilities.d.ts +167 -0
  60. package/dist/admin-surfaces/surface-capabilities.d.ts.map +1 -0
  61. package/dist/admin-surfaces/surface-capabilities.js +215 -0
  62. package/dist/admin-surfaces/surface-capabilities.js.map +1 -0
  63. package/dist/admin-surfaces/surface-client.d.ts +116 -0
  64. package/dist/admin-surfaces/surface-client.d.ts.map +1 -0
  65. package/dist/admin-surfaces/surface-client.js +219 -0
  66. package/dist/admin-surfaces/surface-client.js.map +1 -0
  67. package/dist/admin-surfaces/surface-handlers.d.ts +111 -0
  68. package/dist/admin-surfaces/surface-handlers.d.ts.map +1 -0
  69. package/dist/admin-surfaces/surface-handlers.js +172 -0
  70. package/dist/admin-surfaces/surface-handlers.js.map +1 -0
  71. package/dist/admin-surfaces/theme.d.ts +59 -0
  72. package/dist/admin-surfaces/theme.d.ts.map +1 -0
  73. package/dist/admin-surfaces/theme.js +57 -0
  74. package/dist/admin-surfaces/theme.js.map +1 -0
  75. package/dist/folder-zip-node.d.ts.map +1 -0
  76. package/dist/folder-zip-node.js +59 -49
  77. package/dist/folder-zip-node.js.map +1 -0
  78. package/dist/folder-zip.d.ts.map +1 -0
  79. package/dist/folder-zip.js +9 -7
  80. package/dist/folder-zip.js.map +1 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/lifecycle/activation.d.ts.map +1 -0
  84. package/dist/lifecycle/activation.js.map +1 -0
  85. package/dist/lifecycle/automatic-use.d.ts +79 -0
  86. package/dist/lifecycle/automatic-use.d.ts.map +1 -0
  87. package/dist/lifecycle/automatic-use.js +165 -0
  88. package/dist/lifecycle/automatic-use.js.map +1 -0
  89. package/dist/lifecycle/bundled-digests.d.ts.map +1 -0
  90. package/dist/lifecycle/bundled-digests.js.map +1 -0
  91. package/dist/lifecycle/bundled-source-archive.d.ts.map +1 -0
  92. package/dist/lifecycle/bundled-source-archive.js.map +1 -0
  93. package/dist/lifecycle/capability-projection.d.ts.map +1 -0
  94. package/dist/lifecycle/capability-projection.js.map +1 -0
  95. package/dist/lifecycle/compatibility-metadata.d.ts +19 -0
  96. package/dist/lifecycle/compatibility-metadata.d.ts.map +1 -0
  97. package/dist/lifecycle/compatibility-metadata.js +45 -0
  98. package/dist/lifecycle/compatibility-metadata.js.map +1 -0
  99. package/dist/lifecycle/compatibility.d.ts +52 -0
  100. package/dist/lifecycle/compatibility.d.ts.map +1 -0
  101. package/dist/lifecycle/compatibility.js +60 -0
  102. package/dist/lifecycle/compatibility.js.map +1 -0
  103. package/dist/lifecycle/contribution-loader.d.ts.map +1 -0
  104. package/dist/lifecycle/contribution-loader.js.map +1 -0
  105. package/dist/lifecycle/fetch-archive.d.ts.map +1 -0
  106. package/dist/lifecycle/fetch-archive.js +26 -24
  107. package/dist/lifecycle/fetch-archive.js.map +1 -0
  108. package/dist/lifecycle/index.d.ts +14 -2
  109. package/dist/lifecycle/index.d.ts.map +1 -0
  110. package/dist/lifecycle/index.js +8 -1
  111. package/dist/lifecycle/index.js.map +1 -0
  112. package/dist/lifecycle/install-errors.d.ts.map +1 -0
  113. package/dist/lifecycle/install-errors.js.map +1 -0
  114. package/dist/lifecycle/install-from-url.d.ts.map +1 -0
  115. package/dist/lifecycle/install-from-url.js.map +1 -0
  116. package/dist/lifecycle/install.d.ts.map +1 -0
  117. package/dist/lifecycle/install.js +7 -0
  118. package/dist/lifecycle/install.js.map +1 -0
  119. package/dist/lifecycle/installed-package-index.d.ts.map +1 -0
  120. package/dist/lifecycle/installed-package-index.js +41 -29
  121. package/dist/lifecycle/installed-package-index.js.map +1 -0
  122. package/dist/lifecycle/installed-package-roots.d.ts.map +1 -0
  123. package/dist/lifecycle/installed-package-roots.js +28 -20
  124. package/dist/lifecycle/installed-package-roots.js.map +1 -0
  125. package/dist/lifecycle/layout.d.ts.map +1 -0
  126. package/dist/lifecycle/layout.js.map +1 -0
  127. package/dist/lifecycle/manifest.d.ts +13 -0
  128. package/dist/lifecycle/manifest.d.ts.map +1 -0
  129. package/dist/lifecycle/manifest.js +115 -101
  130. package/dist/lifecycle/manifest.js.map +1 -0
  131. package/dist/lifecycle/mcp-provisioning.d.ts.map +1 -0
  132. package/dist/lifecycle/mcp-provisioning.js.map +1 -0
  133. package/dist/lifecycle/node.d.ts.map +1 -0
  134. package/dist/lifecycle/node.js.map +1 -0
  135. package/dist/lifecycle/package-paths.d.ts.map +1 -0
  136. package/dist/lifecycle/package-paths.js +3 -3
  137. package/dist/lifecycle/package-paths.js.map +1 -0
  138. package/dist/lifecycle/persistent-state.d.ts.map +1 -0
  139. package/dist/lifecycle/persistent-state.js.map +1 -0
  140. package/dist/lifecycle/ports.d.ts +1 -1
  141. package/dist/lifecycle/ports.d.ts.map +1 -0
  142. package/dist/lifecycle/ports.js.map +1 -0
  143. package/dist/lifecycle/provider-contribution.d.ts +65 -0
  144. package/dist/lifecycle/provider-contribution.d.ts.map +1 -0
  145. package/dist/lifecycle/provider-contribution.js +93 -0
  146. package/dist/lifecycle/provider-contribution.js.map +1 -0
  147. package/dist/lifecycle/resolve-agent-plugin-refs.d.ts.map +1 -0
  148. package/dist/lifecycle/resolve-agent-plugin-refs.js +15 -2
  149. package/dist/lifecycle/resolve-agent-plugin-refs.js.map +1 -0
  150. package/dist/lifecycle/retire-bundled.d.ts.map +1 -0
  151. package/dist/lifecycle/retire-bundled.js +20 -18
  152. package/dist/lifecycle/retire-bundled.js.map +1 -0
  153. package/dist/lifecycle/search.d.ts +6 -1
  154. package/dist/lifecycle/search.d.ts.map +1 -0
  155. package/dist/lifecycle/search.js +45 -7
  156. package/dist/lifecycle/search.js.map +1 -0
  157. package/dist/lifecycle/seed-bundled.d.ts.map +1 -0
  158. package/dist/lifecycle/seed-bundled.js.map +1 -0
  159. package/dist/lifecycle/set-enabled.d.ts +2 -1
  160. package/dist/lifecycle/set-enabled.d.ts.map +1 -0
  161. package/dist/lifecycle/set-enabled.js +52 -8
  162. package/dist/lifecycle/set-enabled.js.map +1 -0
  163. package/dist/lifecycle/skill-file-reader.d.ts.map +1 -0
  164. package/dist/lifecycle/skill-file-reader.js +85 -71
  165. package/dist/lifecycle/skill-file-reader.js.map +1 -0
  166. package/dist/lifecycle/tools/capabilities.d.ts +199 -0
  167. package/dist/lifecycle/tools/capabilities.d.ts.map +1 -0
  168. package/dist/lifecycle/tools/capabilities.js +213 -0
  169. package/dist/lifecycle/tools/capabilities.js.map +1 -0
  170. package/dist/lifecycle/tools/definition.d.ts +32 -0
  171. package/dist/lifecycle/tools/definition.d.ts.map +1 -0
  172. package/dist/lifecycle/tools/definition.js +33 -0
  173. package/dist/lifecycle/tools/definition.js.map +1 -0
  174. package/dist/lifecycle/tools/index.d.ts +10 -0
  175. package/dist/lifecycle/tools/index.d.ts.map +1 -0
  176. package/dist/lifecycle/tools/index.js +10 -0
  177. package/dist/lifecycle/tools/index.js.map +1 -0
  178. package/dist/lifecycle/tools/manifest.d.ts +33 -0
  179. package/dist/lifecycle/tools/manifest.d.ts.map +1 -0
  180. package/dist/lifecycle/tools/manifest.js +89 -0
  181. package/dist/lifecycle/tools/manifest.js.map +1 -0
  182. package/dist/lifecycle/tools/projection.d.ts +90 -0
  183. package/dist/lifecycle/tools/projection.d.ts.map +1 -0
  184. package/dist/lifecycle/tools/projection.js +283 -0
  185. package/dist/lifecycle/tools/projection.js.map +1 -0
  186. package/dist/lifecycle/trusted-plugin-files.d.ts.map +1 -0
  187. package/dist/lifecycle/trusted-plugin-files.js.map +1 -0
  188. package/dist/lifecycle/types.d.ts +2 -0
  189. package/dist/lifecycle/types.d.ts.map +1 -0
  190. package/dist/lifecycle/types.js.map +1 -0
  191. package/dist/lifecycle/uninstall.d.ts +3 -1
  192. package/dist/lifecycle/uninstall.d.ts.map +1 -0
  193. package/dist/lifecycle/uninstall.js +51 -27
  194. package/dist/lifecycle/uninstall.js.map +1 -0
  195. package/dist/lifecycle/update-plan.d.ts +18 -0
  196. package/dist/lifecycle/update-plan.d.ts.map +1 -0
  197. package/dist/lifecycle/update-plan.js +22 -0
  198. package/dist/lifecycle/update-plan.js.map +1 -0
  199. package/dist/lifecycle/update-store.d.ts +71 -0
  200. package/dist/lifecycle/update-store.d.ts.map +1 -0
  201. package/dist/lifecycle/update-store.js +150 -0
  202. package/dist/lifecycle/update-store.js.map +1 -0
  203. package/dist/lifecycle/update.d.ts +55 -0
  204. package/dist/lifecycle/update.d.ts.map +1 -0
  205. package/dist/lifecycle/update.js +321 -0
  206. package/dist/lifecycle/update.js.map +1 -0
  207. package/dist/lifecycle/yauzl-archive-reader.d.ts.map +1 -0
  208. package/dist/lifecycle/yauzl-archive-reader.js.map +1 -0
  209. package/dist/manifest.d.ts.map +1 -0
  210. package/dist/manifest.js.map +1 -0
  211. package/package.json +39 -7
  212. package/ui-ux-design/plugin.json +7 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-contribution.js","sourceRoot":"","sources":["../../src/lifecycle/provider-contribution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-agent-plugin-refs.d.ts","sourceRoot":"","sources":["../../src/lifecycle/resolve-agent-plugin-refs.ts"],"names":[],"mappings":"AAiEA,OAAO,KAAK,EAAE;;;;;;;;;;;;GAYX,CACH,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,MAAM,4BAA4B,GACpC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAwPpD,gFAAgF;AAChF,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,yBAAyB;2CA9MjE,SAAS,MAAM,EAAE,mBACd,IAAI,CAAC,0BAA0B,EAAE,UAAU,GAAG,MAAM,CAAC,iBACxD,uBAAuB,KACpC,OAAO,CAAC,4BAA4B,CAAC;0CAqDW,MAAM,KAAG,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC;4CAmC/C,MAAM,iBAAiB,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;EAuHtG"}
@@ -22,7 +22,8 @@ import { listInstalledPackageRoots, INSTALLED_PLUGIN_DIGEST_PATTERN } from "./in
22
22
  * `packages/sha256/*` and matches on the installed `plugin.json`'s own `name` field, after dropping
23
23
  * any digest of a bundled plugin the ledger records as superseded:
24
24
  *
25
- * - Exactly one match: resolves normally.
25
+ * - Exactly one match: resolves normally, unless the bundled ledger records that id at a different
26
+ * digest (a copy the build did not ship never guides under a bundled id).
26
27
  * - Zero matches: fails with a "not installed" reason — the operator pinned a chip for a plugin
27
28
  * that is not (or no longer) actually on disk for this workspace.
28
29
  * - More than one match: fails with an explicit ambiguity reason naming every matching digest.
@@ -218,9 +219,21 @@ function buildModule(ports) {
218
219
  };
219
220
  }
220
221
  const plugin = matches[0];
221
- const skillPath = `skills/${pluginRefId}/SKILL.md`;
222
+ // Activation is checked by the caller. A lone copy under an id the bundled ledger records must be
223
+ // the digest this build shipped; an operator install (no ledger entry) was digest-verified when
224
+ // installed and its skills may guide once enabled (install-upload's trust warning). Inline, not
225
+ // trusted-plugin-files' verdict: that module lists installs through this one (import cycle).
226
+ const shippedDigest = bundledDigests.get(pluginRefId);
227
+ if (shippedDigest !== undefined && shippedDigest !== plugin.archiveDigest) {
228
+ return { ok: false, reason: `Agent Plugin '${pluginRefId}' was not loaded: only plugins shipped with ${ports.productName} may add agent guidance under a bundled id (installed digest ${plugin.archiveDigest.slice(0, 12)} is not the one this build shipped)` };
229
+ }
222
230
  if (deliveryMode === "pointer")
223
231
  return buildPointerSection(pluginRefId, plugin);
232
+ return buildInjectedSection({ pluginRefId, packagesDir, plugin });
233
+ }
234
+ /** `inject` mode: the eponymous SKILL.md, the plugin's user notes, and its readable-file inventory. */
235
+ async function buildInjectedSection({ pluginRefId, packagesDir, plugin }) {
236
+ const skillPath = `skills/${pluginRefId}/SKILL.md`;
224
237
  let skillMarkdown;
225
238
  let files;
226
239
  let fileNote;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-agent-plugin-refs.js","sourceRoot":"","sources":["../../src/lifecycle/resolve-agent-plugin-refs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retire-bundled.d.ts","sourceRoot":"","sources":["../../src/lifecycle/retire-bundled.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,uFAAuF;AACvF,OAAO,KAAK,EAAG,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAGxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D;mFACmF;AACnF,MAAM,MAAM,kCAAkC,GAAG,+BAA+B,GAAG,YAAY,CAAC;AAEhG;sDACsD;AACtD,UAAU,4BAA4B;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACvD;AAED,MAAM,MAAM,yBAAyB,GACjC,CAAC,4BAA4B,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,CAAC,GACzF,CAAC,4BAA4B,GAAG;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAE3B,iGAAiG;IACrG,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IAErC;4FACwF;IAC5F,QAAQ,CAAC,SAAS,EAAE,kCAAkC,CAAC;IAEnD,kGAAkG;IACtG,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC,GAAG,SAAS,CAAC;CAC5F,CAAC,GACF,CAAC,4BAA4B,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEvH,MAAM,WAAW,iCAAiC;IAEhD,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,iCAAiC;IAEhD;4EACwE;IACxE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IACjF,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACxE;AAuHD,gFAAgF;AAChF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,yBAAyB;0CAzG5D,iCAAiC,aACjC,iCAAiC,KAC1C,OAAO,CAAC,SAAS,yBAAyB,EAAE,CAAC;EA2GjD"}
@@ -41,28 +41,13 @@ function buildModule(ports) {
41
41
  const allInstalled = await listInstalledPlugins(workspaceLayout.root);
42
42
  const installed = allInstalled.filter((plugin) => plugin.pluginId === pluginId);
43
43
  const hasRecord = Object.hasOwn((await readAgentPluginActivations(workspaceRoot)).plugins, pluginId);
44
- if (installed.length === 0 && !hasRecord) {
45
- const ledgerEntryRemoved = await removeBundledAgentPluginDigest({ workspaceRoot, pluginId });
46
- if (!ledgerEntryRemoved)
47
- return { pluginId, ...ids, status: "absent" };
48
- return { pluginId, ...ids, status: "retired", removedDigests: [], activationRemoved: false, ledgerEntryRemoved, successor: "not-needed", ...(ids.successorIds ? { successors: {} } : {}) };
49
- }
44
+ if (installed.length === 0 && !hasRecord)
45
+ return dropLeftoverLedgerEntry({ workspaceRoot, pluginId, ids });
50
46
  const unusable = await unusableSuccessor(workspaceRoot, allInstalled, successorIds);
51
47
  if (unusable !== undefined) {
52
48
  return { pluginId, ...ids, status: "failed", reason: `'${pluginId}' is kept until every successor is usable: ${unusable}` };
53
49
  }
54
- const successors = {};
55
- for (const successorId of successorIds) {
56
- successors[successorId] =
57
- verdict.verdict === "active"
58
- ? await enableBundledAgentPluginUnlessOperatorDisabled({
59
- workspaceRoot,
60
- pluginId: successorId,
61
- actor: `system:retire-${pluginId}`,
62
- ...(optional.now !== undefined ? { now: optional.now } : {}),
63
- })
64
- : "not-needed";
65
- }
50
+ const successors = await switchOnSuccessors({ workspaceRoot, pluginId, successorIds, wasActive: verdict.verdict === "active" }, { now: optional.now });
66
51
  const successor = successors[ids.successorId] ?? "not-needed";
67
52
  let removedDigests = [];
68
53
  if (installed.length > 0) {
@@ -74,6 +59,23 @@ function buildModule(ports) {
74
59
  const ledgerEntryRemoved = await removeBundledAgentPluginDigest({ workspaceRoot, pluginId });
75
60
  return { pluginId, ...ids, status: "retired", removedDigests, activationRemoved: hasRecord, ledgerEntryRemoved, successor, ...(ids.successorIds ? { successors } : {}) };
76
61
  }
62
+ /** Step 1: nothing installed and no record — only a leftover ledger entry can remain to drop. */
63
+ async function dropLeftoverLedgerEntry({ workspaceRoot, pluginId, ids }) {
64
+ const ledgerEntryRemoved = await removeBundledAgentPluginDigest({ workspaceRoot, pluginId });
65
+ if (!ledgerEntryRemoved)
66
+ return { pluginId, ...ids, status: "absent" };
67
+ return { pluginId, ...ids, status: "retired", removedDigests: [], activationRemoved: false, ledgerEntryRemoved, successor: "not-needed", ...(ids.successorIds ? { successors: {} } : {}) };
68
+ }
69
+ /** Step 2: each successor's outcome — switched on only when the retired plugin was active. */
70
+ async function switchOnSuccessors({ workspaceRoot, pluginId, successorIds, wasActive }, { now } = {}) {
71
+ const successors = {};
72
+ for (const successorId of successorIds) {
73
+ successors[successorId] = wasActive
74
+ ? await enableBundledAgentPluginUnlessOperatorDisabled({ workspaceRoot, pluginId: successorId, actor: `system:retire-${pluginId}`, ...(now !== undefined ? { now } : {}) })
75
+ : "not-needed";
76
+ }
77
+ return successors;
78
+ }
77
79
  /** Why one of `successorIds` cannot take over yet, or `undefined` when every one is installed at the
78
80
  * digest the ledger records for it (this file's header, step 1a).
79
81
  * @complexity O(s * n) for s successors over n installed packages; both are small bundled counts. */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retire-bundled.js","sourceRoot":"","sources":["../../src/lifecycle/retire-bundled.ts"],"names":[],"mappings":"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"}
@@ -60,6 +60,11 @@ export interface AgentPluginSearchSkill {
60
60
  * `packageRoot`/`skillPath`/any other host-filesystem detail (see `tool-registrations.ts`'s own
61
61
  * SECURITY note for why: this candidate shape is what actually reaches the model). */
62
62
  export interface AgentPluginSearchCandidate {
63
+ readonly origin?: import("./activation.js").AgentPluginOrigin;
64
+ readonly hostOk?: boolean;
65
+ readonly missingRequires?: readonly string[];
66
+ readonly requiredBy?: readonly string[];
67
+ readonly archiveDigest?: string;
63
68
  readonly pluginId: string;
64
69
  readonly version?: (string) | undefined;
65
70
  /** Human-facing title from the host extension namespace in `plugin.json`: `displayName`, when the package set one. */
@@ -83,6 +88,6 @@ export interface AgentPluginSearchMatch extends AgentPluginSearchCandidate {
83
88
  }
84
89
  /** Internal composition; one state/queue instance per injected host context. */
85
90
  export declare function createSearchModule(ports: AgentPluginLifecyclePorts): {
86
- rankInstalledAgentPlugins: (query: string, candidates: readonly AgentPluginSearchCandidate[], limit: number) => readonly AgentPluginSearchMatch[];
91
+ rankInstalledAgentPlugins: (query: string, candidates: readonly AgentPluginSearchCandidate[], limit: number, automatic?: boolean) => readonly AgentPluginSearchMatch[];
87
92
  };
88
93
  //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/lifecycle/search.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH;;oDAEoD;AACpD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;gGAC4F;IAC5F,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;uFAEuF;AACvF,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,iBAAiB,EAAE,iBAAiB,CAAC;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACxC,sHAAsH;IACtH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAElD;qGACiG;IACjG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAEnD;0FACsF;IACtF,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,wFAAwF;AACxF,MAAM,WAAW,sBAAuB,SAAQ,0BAA0B;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AA4HD,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,yBAAyB;uCAvBxD,MAAM,cACD,SAAS,0BAA0B,EAAE,SAC1C,MAAM,0BAEZ,SAAS,sBAAsB,EAAE;EAuBrC"}
@@ -1,4 +1,39 @@
1
1
  /** Extracted from the host plugin lifecycle. Effects are supplied per host context. */
2
+ /** These describe the conversation or target, not a plugin's topic. Prose-only hits remain
3
+ * available to explicit search without silently loading unrelated guidance. */
4
+ const INCIDENTAL_TERMS = new Set('a an and are as at be build can could create do for from get help i in is it make me my new of on or please the this to use want we with you your site sites page pages website websites plugin plugins tell which load just don t anything'.split(' '));
5
+ const DEPLOYMENT_TERMS = new Set('deploy deployment deploying deployed publish publishing published host hosting hosted'.split(' '));
6
+ function automaticTerms(query) {
7
+ return [...new Set((query.toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? []).filter(term => !INCIDENTAL_TERMS.has(term)))];
8
+ }
9
+ /** A dedicated deployment provider (only `deploy-*` and `credential-scheme:*` capabilities) matches only a
10
+ * query naming both a deployment action and one of its vendor terms; any other plugin passes. */
11
+ function passesDeploymentGate({ candidate, capabilities, terms }, _options = {}) {
12
+ const deployment = capabilities.filter(capability => capability.startsWith('deploy-'));
13
+ const dedicatedDeployment = deployment.length > 0 && capabilities.every(capability => capability.startsWith('deploy-') || capability.startsWith('credential-scheme:'));
14
+ if (!dedicatedDeployment)
15
+ return true;
16
+ const vendors = automaticTerms([candidate.pluginId, candidate.displayName ?? '', ...deployment.map(capability => capability.split(':')[1] ?? '')].join(' '))
17
+ .filter(term => !DEPLOYMENT_TERMS.has(term));
18
+ return terms.some(term => DEPLOYMENT_TERMS.has(term)) && terms.some(term => vendors.includes(term));
19
+ }
20
+ /** Score complete authored terms only: long descriptions must not manufacture relevance.
21
+ * Dedicated deployment providers additionally need both the action and their declared vendor.
22
+ * Mixed-purpose plugins can still match their other capabilities (for example source control).
23
+ */
24
+ function automaticScore({ candidate, terms }, _options = {}) {
25
+ if (!candidate.enabled)
26
+ return 0;
27
+ const capabilities = candidate.provides ?? [];
28
+ if (!passesDeploymentGate({ candidate, capabilities, terms }))
29
+ return 0;
30
+ const fields = [
31
+ { terms: automaticTerms(capabilities.join(' ')), weight: 6 },
32
+ { terms: automaticTerms(`${candidate.pluginId} ${candidate.id ?? ''} ${candidate.displayName ?? ''}`), weight: 5 },
33
+ { terms: automaticTerms(candidate.keywords.join(' ')), weight: 4 },
34
+ ];
35
+ return terms.reduce((score, term) => score + fields.reduce((sum, field) => sum + (field.terms.includes(term) ? field.weight : 0), 0), 0);
36
+ }
2
37
  function buildModule(ports) {
3
38
  const ID_FIELD_WEIGHT = 5;
4
39
  const KEYWORD_FIELD_WEIGHT = 4;
@@ -18,7 +53,7 @@ function buildModule(ports) {
18
53
  * plain, independently-readable list rather than interleaved with the scoring loop itself. */
19
54
  function fieldHaystacks(candidate) {
20
55
  return [
21
- { text: `${candidate.pluginId} ${candidate.id ?? ""}`.toLowerCase(), weight: ID_FIELD_WEIGHT },
56
+ { text: `${candidate.pluginId} ${candidate.id ?? ""} ${candidate.displayName ?? ""}`.toLowerCase(), weight: ID_FIELD_WEIGHT },
22
57
  { text: [...candidate.keywords, ...(candidate.provides ?? [])].join(" ").toLowerCase(), weight: KEYWORD_FIELD_WEIGHT },
23
58
  { text: (candidate.description ?? "").toLowerCase(), weight: DESCRIPTION_FIELD_WEIGHT },
24
59
  {
@@ -48,20 +83,23 @@ function buildModule(ports) {
48
83
  * @param limit - Max matches to return, already clamped by the caller (mirrors
49
84
  * `component-catalog-tool.ts`'s handler, which owns the clamp so this function can stay a pure
50
85
  * "given these inputs, rank them" step with no knowledge of the tool's own schema bounds).
51
- * @returns Matches with score > 0, sorted by score descending, truncated to `limit`. A candidate
86
+ * @returns Matches with score > 0, sorted by score descending then plugin id, truncated to `limit`. A candidate
52
87
  * that scores 0 (no term matched anything) is dropped, not returned at the bottom — the caller's own
53
88
  * "N installed, 0 matched" framing is what tells the model the workspace is not empty even when a
54
89
  * query matches nothing.
55
90
  * @complexity See this file's header.
56
91
  */
57
- function rankInstalledAgentPlugins(query, candidates, limit) {
58
- const terms = tokenize(query);
92
+ function rankInstalledAgentPlugins(query, candidates, limit, automatic = false) {
93
+ const terms = automatic ? automaticTerms(query) : tokenize(query);
59
94
  if (terms.length === 0)
60
95
  return [];
61
- return candidates
62
- .map((candidate) => ({ ...candidate, score: scoreCandidate(candidate, terms) }))
96
+ const ranked = candidates
97
+ .map((candidate) => ({ ...candidate, score: automatic ? automaticScore({ candidate, terms }) : scoreCandidate(candidate, terms) }))
63
98
  .filter((match) => match.score > 0)
64
- .sort((a, b) => b.score - a.score)
99
+ .sort((a, b) => b.score - a.score || a.pluginId.localeCompare(b.pluginId));
100
+ // A weak shared keyword must not ride alongside a substantially stronger task owner.
101
+ const threshold = automatic ? Math.max(4, (ranked[0]?.score ?? 0) * 0.6) : 0;
102
+ return ranked.filter(match => match.score >= threshold)
65
103
  .slice(0, Math.max(limit, 0));
66
104
  }
67
105
  return { rankInstalledAgentPlugins };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/lifecycle/search.ts"],"names":[],"mappings":"AAAA,uFAAuF;AA+FvF;+EAC+E;AAC/E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,6OAA6O,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3R,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,uFAAuF,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACrI,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACxH,CAAC;AACD;iGACiG;AACjG,SAAS,oBAAoB,CAC3B,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAwG,EACxI,QAAQ,GAAG,EAAE;IAEb,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACvF,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACvK,IAAI,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,IAAI,EAAE,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACzJ,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACtG,CAAC;AACD;;;GAGG;AACH,SAAS,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAuE,EAAE,QAAQ,GAAG,EAAE;IAC9H,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAAE,OAAO,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG;QACb,EAAE,KAAK,EAAE,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QAC5D,EAAE,KAAK,EAAE,cAAc,CAAC,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QAClH,EAAE,KAAK,EAAE,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;KACnE,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3I,CAAC;AAED,SAAS,WAAW,CAAC,KAAgC;IAEnD,MAAM,eAAe,GAAG,CAAC,CAAC;IAC1B,MAAM,oBAAoB,GAAG,CAAC,CAAC;IAC/B,MAAM,wBAAwB,GAAG,CAAC,CAAC;IACnC,MAAM,kBAAkB,GAAG,CAAC,CAAC;IAE7B;;4FAEwF;IACxF,SAAS,QAAQ,CAAC,KAAa;QAC7B,OAAO,KAAK;aACT,WAAW,EAAE;aACb,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED;;iGAE6F;IAC7F,SAAS,cAAc,CAAC,SAAqC;QAC3D,OAAO;YACL,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;YAC7H,EAAE,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE;YACtH,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,wBAAwB,EAAE;YACvF;gBACE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;gBAC/F,MAAM,EAAE,kBAAkB;aAC3B;SACF,CAAC;IACJ,CAAC;IAED;;;;;8BAK0B;IAC1B,SAAS,cAAc,CAAC,SAAqC,EAAE,KAAwB;QACrF,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAClJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;;;;KAgBC;IACD,SAAS,yBAAyB,CAChC,KAAa,EACb,UAAiD,EACjD,KAAa,EACb,SAAS,GAAG,KAAK;QAEjB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,MAAM,GAAG,UAAU;aACtB,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;aAClI,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;aAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7E,qFAAqF;QACrF,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC;aACpD,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,EAAE,yBAAyB,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,OAAO,EAA6D,CAAC;AAC3F,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,KAAgC;IACjE,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAAC,CAAC;IACjF,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-bundled.d.ts","sourceRoot":"","sources":["../../src/lifecycle/seed-bundled.ts"],"names":[],"mappings":"AAuFA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAG,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEtE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,MAAM,wBAAwB,GAChC;IACE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B;;qBAEiB;IACrB,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CAClC,GACD;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,MAAM,WAAW,6BAA6B;IAC5C;yBACqB;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAEvD;;;;;kBAKc;IACd,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAE9C;oGACgG;IAChG,QAAQ,CAAC,WAAW,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,+BAA+B;IAE9C;;;+EAG2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAyLD,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,yBAAyB;wCAtJ1D,+BAA+B,KACxC,OAAO,CAAC,6BAA6B,CAAC;EAyJ1C"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-bundled.js","sourceRoot":"","sources":["../../src/lifecycle/seed-bundled.ts"],"names":[],"mappings":"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"}
@@ -20,9 +20,10 @@ export interface SetAgentPluginEnabledResult {
20
20
  readonly pluginId: string;
21
21
  /** As actually written and read back, not as requested. */
22
22
  readonly enabled: boolean;
23
+ readonly warnings?: readonly string[];
23
24
  }
24
25
  /** Internal composition; one state/queue instance per injected host context. */
25
26
  export declare function createSetEnabledModule(ports: AgentPluginLifecyclePorts): {
26
- setAgentPluginEnabled: (input: SetAgentPluginEnabledInput) => Promise<SetAgentPluginEnabledResult>;
27
+ setAgentPluginEnabled: (input: SetAgentPluginEnabledInput, _optional?: Record<string, never>) => Promise<SetAgentPluginEnabledResult>;
27
28
  };
28
29
  //# sourceMappingURL=set-enabled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-enabled.d.ts","sourceRoot":"","sources":["../../src/lifecycle/set-enabled.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAG5D;;;;GAIG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;gBACzC,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAIxD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,oGAAoG;IACpG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAwED,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,yBAAyB;mCAdzB,0BAA0B,cAAa,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAQ,OAAO,CAAC,2BAA2B,CAAC;EAkBrJ"}
@@ -1,6 +1,9 @@
1
1
  /** Extracted from the host plugin lifecycle. Effects are supplied per host context. */
2
+ import { createPersistentStateModule } from './persistent-state.js';
3
+ import { AgentPluginHostIncompatibleError, describeAgentPluginCompatibility, agentPluginDependentWarnings } from './compatibility.js';
2
4
  import { createActivationModule } from "./activation.js";
3
5
  import { createResolveAgentPluginRefsModule } from "./resolve-agent-plugin-refs.js";
6
+ import { createAgentPluginUpdateStore, settleAgentPluginUpdateJournal } from "./update-store.js";
4
7
  /**
5
8
  * The id named is not installed in this workspace. A distinct class rather than a bare `Error` so
6
9
  * each caller can map it to its own boundary's vocabulary — 404 `AGENT_PLUGIN_NOT_FOUND` at the
@@ -13,21 +16,62 @@ export class AgentPluginNotInstalledError extends Error {
13
16
  }
14
17
  }
15
18
  function buildModule(ports) {
16
- const { setAgentPluginActivation } = createActivationModule(ports);
19
+ const { setAgentPluginActivation, readAgentPluginActivations } = createActivationModule(ports);
17
20
  const { listInstalledPlugins } = createResolveAgentPluginRefsModule(ports);
18
- async function setAgentPluginEnabled(input) {
19
- const workspaceLayout = ports.layout.forWorkspace({ workspaceId: input.workspaceId });
20
- const installed = await listInstalledPlugins(workspaceLayout.root);
21
- if (!installed.some((plugin) => plugin.pluginId === input.pluginId)) {
22
- throw new AgentPluginNotInstalledError({ pluginId: input.pluginId });
21
+ const persistentState = createPersistentStateModule(ports);
22
+ async function findInstalled({ workspaceRoot, pluginId }) {
23
+ const installed = await listInstalledPlugins(workspaceRoot);
24
+ const plugin = installed.find(candidate => candidate.pluginId === pluginId);
25
+ if (!plugin) {
26
+ throw new AgentPluginNotInstalledError({ pluginId });
23
27
  }
28
+ return { installed, plugin };
29
+ }
30
+ /** Refuses a host-incompatible enable; otherwise returns advisory warnings, never blocking. */
31
+ async function enablementWarnings({ input, workspaceRoot, installed, plugin }) {
32
+ const activations = await readAgentPluginActivations(workspaceRoot);
33
+ if (!input.enabled)
34
+ return agentPluginDependentWarnings({ plugin, installed, activations, nextProvides: [] });
35
+ const compatibility = describeAgentPluginCompatibility({ plugin, installed, activations });
36
+ // Several digests of one id can be installed (a bundled upgrade lands beside the old one), and
37
+ // the listing order is arbitrary, so every installed revision must be host-compatible.
38
+ const revisions = installed.filter(candidate => candidate.pluginId === plugin.pluginId);
39
+ if (revisions.some(revision => !describeAgentPluginCompatibility({ plugin: revision, installed, activations }).hostOk)) {
40
+ throw new AgentPluginHostIncompatibleError({ pluginId: input.pluginId });
41
+ }
42
+ return compatibility.missingRequires.map(id => `Needs ${id}`);
43
+ }
44
+ async function setEnabledLocked({ input, workspaceRoot }) {
45
+ // Re-read under the lock: an uninstall or update may have finished while this call waited.
46
+ const { installed, plugin } = await findInstalled({ workspaceRoot, pluginId: input.pluginId });
47
+ // Boot recovery of an unfinished update would overwrite this decision, so it refuses
48
+ // (PLUGIN_UPDATE_PENDING) until a boot recovers it.
49
+ await settleAgentPluginUpdateJournal({ store: createAgentPluginUpdateStore({ ports, workspaceId: input.workspaceId, pluginId: input.pluginId }) });
50
+ const warnings = await enablementWarnings({ input, workspaceRoot, installed, plugin });
24
51
  const written = await setAgentPluginActivation({
25
- workspaceRoot: workspaceLayout.root,
52
+ workspaceRoot,
26
53
  pluginId: input.pluginId,
27
54
  enabled: input.enabled,
28
55
  actor: input.actor,
29
56
  });
30
- return { pluginId: input.pluginId, enabled: written.plugins[input.pluginId]?.enabled ?? input.enabled };
57
+ // Always present: setAgentPluginActivation asserts the same id grammar its normalizer keeps and
58
+ // writes a boolean `enabled`, so the record it returns holds this entry (the former
59
+ // `?? input.enabled` fallback was unreachable).
60
+ return { pluginId: input.pluginId, enabled: written.plugins[input.pluginId].enabled, ...(warnings.length ? { warnings } : {}) };
61
+ }
62
+ /**
63
+ * Serialized with install/update/uninstall of the same plugin by the per-plugin state lock, so a
64
+ * toggle never judges compatibility against a package that is mid-swap. The lock is a
65
+ * non-reentrant file lock: no caller holds it around this function (checked 2026-10-21 in this
66
+ * package and in Tovu's admin route / `plugins_set_enabled` tool).
67
+ */
68
+ async function setAgentPluginEnabled(input, _optional = {}) {
69
+ const workspaceRoot = ports.layout.forWorkspace({ workspaceId: input.workspaceId }).root;
70
+ // Checked once before locking so an unknown or ungrammatical id stays a not-installed refusal
71
+ // and never creates workspace or lock directories (the lock path re-asserts the id grammar).
72
+ await findInstalled({ workspaceRoot, pluginId: input.pluginId });
73
+ return persistentState.withPluginLock({ workspaceRoot, pluginId: input.pluginId,
74
+ run: () => setEnabledLocked({ input, workspaceRoot }) });
31
75
  }
32
76
  return { setAgentPluginEnabled };
33
77
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-enabled.js","sourceRoot":"","sources":["../../src/lifecycle/set-enabled.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-file-reader.d.ts","sourceRoot":"","sources":["../../src/lifecycle/skill-file-reader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAmCjD,sGAAsG;AACtG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACpG;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAA;CAAE,EAC9F,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAM,GACnC,eAAe,CAqFjB"}
@@ -6,6 +6,36 @@ const TEXT_EXTENSIONS = new Set([".md", ".mdx", ".txt", ".json", ".yaml", ".yml"
6
6
  const MAX_FILE_BYTES = 256 * 1024;
7
7
  const MAX_WALK_ENTRIES = 4096;
8
8
  const MAX_WALK_DEPTH = 32;
9
+ const TOO_LARGE = "File request refused: exceeds the 256 KiB text limit; no content returned.";
10
+ const UNREADABLE = "File request refused: file is missing or unreadable.";
11
+ /** Reads an opened regular file of at most the cap; a file that grows past it after `stat` is still refused. */
12
+ async function readOpened(handle) {
13
+ const stat = await handle.stat();
14
+ if (!stat.isFile())
15
+ return { refusal: "File request refused: only regular text files are readable." };
16
+ if (stat.size > MAX_FILE_BYTES)
17
+ return { refusal: TOO_LARGE };
18
+ const buffer = Buffer.alloc(MAX_FILE_BYTES + 1);
19
+ let length = 0;
20
+ while (length < buffer.length) {
21
+ const { bytesRead } = await handle.read(buffer, length, buffer.length - length, null);
22
+ if (!bytesRead)
23
+ break;
24
+ length += bytesRead;
25
+ }
26
+ return length > MAX_FILE_BYTES ? { refusal: TOO_LARGE } : decodeText(buffer.subarray(0, length));
27
+ }
28
+ /** Admit only control-free UTF-8 text (tab, LF and CR allowed). */
29
+ function decodeText(bytes) {
30
+ if (bytes.some(byte => (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) || byte === 127))
31
+ return { refusal: "File request refused: binary content cannot be read as text." };
32
+ try {
33
+ return { text: new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes) };
34
+ }
35
+ catch {
36
+ return { refusal: "File request refused: binary or invalid UTF-8 content cannot be read as text." };
37
+ }
38
+ }
9
39
  /**
10
40
  * Progressive disclosure for plugin AND standalone skills, with a skill-folder trust boundary.
11
41
  * Uses the lifecycle containment owner, native bounded reads and injected async filesystem effects.
@@ -14,67 +44,48 @@ const MAX_WALK_DEPTH = 32;
14
44
  */
15
45
  export function createSkillFileReader({ skillRoot, filesystem }, _options = {}) {
16
46
  const { assertContainedOnDisk } = createPackagePathsModule({ filesystem });
17
- /** Reject traversal even when normalization would leave it inside the folder. */
47
+ /** Reject traversal even when normalization would leave it inside the folder.
48
+ * @returns The refusal message, or `undefined` for an admissible name. */
18
49
  function validateFile(file) {
19
50
  if (!file || file.includes("\0") || file.includes("\\") || path.posix.isAbsolute(file) || /^[a-zA-Z]:/.test(file) || file.split("/").some(segment => segment === "..")) {
20
- throw new Error("File request refused: use a path relative to this skill folder, without traversal or absolute paths.");
51
+ return "File request refused: use a path relative to this skill folder, without traversal or absolute paths.";
21
52
  }
22
53
  if (!TEXT_EXTENSIONS.has(path.extname(file).toLowerCase())) {
23
- throw new Error("File request refused: only supported text extensions are readable.");
54
+ return "File request refused: only supported text extensions are readable.";
24
55
  }
56
+ return undefined;
25
57
  }
26
- /** Open the resolved target with no-follow and read at most cap + 1, including growing files. */
27
- async function readText(file) {
28
- validateFile(file);
29
- let absolute;
58
+ /** The canonical contained target of `file`, or `undefined` when it is missing or escapes the folder. */
59
+ async function resolveTarget(file) {
30
60
  try {
31
- absolute = await filesystem.realpath(await assertContainedOnDisk(skillRoot, file));
61
+ const absolute = await filesystem.realpath(await assertContainedOnDisk(skillRoot, file));
32
62
  // Recheck the canonical target through the same owner before opening it.
33
63
  const relative = path.relative(await filesystem.realpath(skillRoot), absolute);
34
64
  await assertContainedOnDisk(skillRoot, relative);
35
- validateFile(relative.split(path.sep).join("/"));
65
+ return validateFile(relative.split(path.sep).join("/")) === undefined ? absolute : undefined;
36
66
  }
37
67
  catch {
38
- throw new Error("File request refused: file is missing, unreadable, or resolves outside this skill folder.");
39
- }
40
- let handle;
41
- try {
42
- handle = await filesystem.open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
43
- const stat = await handle.stat();
44
- if (!stat.isFile())
45
- throw new Error("File request refused: only regular text files are readable.");
46
- if (stat.size > MAX_FILE_BYTES)
47
- throw new Error("File request refused: exceeds the 256 KiB text limit; no content returned.");
48
- const buffer = Buffer.alloc(MAX_FILE_BYTES + 1);
49
- let length = 0;
50
- while (length < buffer.length) {
51
- const { bytesRead } = await handle.read(buffer, length, buffer.length - length, null);
52
- if (!bytesRead)
53
- break;
54
- length += bytesRead;
55
- }
56
- if (length > MAX_FILE_BYTES)
57
- throw new Error("File request refused: exceeds the 256 KiB text limit; no content returned.");
58
- const bytes = buffer.subarray(0, length);
59
- if (bytes.some(byte => (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) || byte === 127))
60
- throw new Error("File request refused: binary content cannot be read as text.");
61
- try {
62
- return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes);
63
- }
64
- catch {
65
- throw new Error("File request refused: binary or invalid UTF-8 content cannot be read as text.");
66
- }
67
- }
68
- catch (error) {
69
- // Never reflect native errors or caller paths: either can contain an absolute host path.
70
- if (error instanceof Error && error.message.startsWith("File request refused:"))
71
- throw error;
72
- throw new Error("File request refused: file is missing or unreadable.");
73
- }
74
- finally {
75
- await handle?.close().catch(() => { });
68
+ return undefined;
76
69
  }
77
70
  }
71
+ /** Validate, resolve, then read one file; every refusal is a value, never a thrown native error. */
72
+ async function readText(file) {
73
+ const invalid = validateFile(file);
74
+ if (invalid !== undefined)
75
+ return { refusal: invalid };
76
+ const absolute = await resolveTarget(file);
77
+ if (absolute === undefined)
78
+ return { refusal: "File request refused: file is missing, unreadable, or resolves outside this skill folder." };
79
+ return readContained(absolute);
80
+ }
81
+ /** Open the resolved target with no-follow and read at most cap + 1, including growing files. */
82
+ async function readContained(absolute) {
83
+ const handle = await filesystem.open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK).catch(() => undefined);
84
+ if (!handle)
85
+ return { refusal: UNREADABLE };
86
+ // Never reflect native errors or caller paths: either can contain an absolute host path.
87
+ return readOpened(handle).catch(() => ({ refusal: UNREADABLE })).finally(() => handle.close().catch(() => { }));
88
+ }
78
89
  /** Skip directory symlinks (including cycles); contained file symlinks use the same read guard. */
79
90
  async function listFiles() {
80
91
  const files = [];
@@ -85,45 +96,48 @@ export function createSkillFileReader({ skillRoot, filesystem }, _options = {})
85
96
  incomplete = true;
86
97
  return;
87
98
  }
88
- let entries;
89
- try {
90
- const directory = relative ? await assertContainedOnDisk(skillRoot, relative) : await filesystem.realpath(skillRoot);
91
- entries = await filesystem.readdir(directory, { withFileTypes: true });
92
- }
93
- catch {
99
+ const entries = await readDirectory(relative);
100
+ if (!entries) {
94
101
  incomplete = true;
95
102
  return;
96
103
  }
97
- for (const entry of entries.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0)) {
104
+ for (const entry of entries) {
98
105
  if (remaining-- <= 0) {
99
106
  incomplete = true;
100
107
  break;
101
108
  }
102
- const file = relative ? `${relative}/${entry.name}` : entry.name;
103
- if (entry.isDirectory())
104
- await walk(file, depth + 1);
105
- else if (file !== "SKILL.md" && (entry.isFile() || entry.isSymbolicLink())) {
106
- try {
107
- await readText(file);
108
- files.push(file);
109
- }
110
- catch { /* Refused files must not be advertised as readable. */ }
111
- }
109
+ await visit(entry, relative ? `${relative}/${entry.name}` : entry.name, depth);
112
110
  }
113
111
  }
112
+ async function visit(entry, file, depth) {
113
+ if (entry.isDirectory())
114
+ return walk(file, depth + 1);
115
+ if (file === "SKILL.md" || !(entry.isFile() || entry.isSymbolicLink()))
116
+ return;
117
+ // Refused files must not be advertised as readable.
118
+ if ("text" in await readText(file))
119
+ files.push(file);
120
+ }
114
121
  await walk("", 0);
115
122
  return { files: files.sort(), ...(incomplete ? { note: "Supporting-file inventory is incomplete: traversal limit reached or a directory is unreadable." } : {}) };
116
123
  }
124
+ /** One directory's entries in code-unit name order, or `undefined` when it cannot be read. */
125
+ async function readDirectory(relative) {
126
+ try {
127
+ const directory = relative ? await assertContainedOnDisk(skillRoot, relative) : await filesystem.realpath(skillRoot);
128
+ return (await filesystem.readdir(directory, { withFileTypes: true })).sort((a, b) => Number(a.name > b.name) - Number(a.name < b.name));
129
+ }
130
+ catch {
131
+ return undefined;
132
+ }
133
+ }
117
134
  return {
118
135
  async read(_input, options = {}) {
119
136
  const listing = await listFiles();
120
- try {
121
- return { ...listing, text: await readText(options.file ?? "SKILL.md") };
122
- }
123
- catch (error) {
124
- const refusal = error instanceof Error ? error.message : "File request refused.";
125
- return { files: listing.files, text: "", note: [refusal, `Valid supporting files: ${listing.files.join(", ") || "(none)"}. Omit file to request SKILL.md.`, listing.note].filter(Boolean).join(" ") };
126
- }
137
+ const outcome = await readText(options.file ?? "SKILL.md");
138
+ if ("text" in outcome)
139
+ return { ...listing, text: outcome.text };
140
+ return { files: listing.files, text: "", note: [outcome.refusal, `Valid supporting files: ${listing.files.join(", ") || "(none)"}. Omit file to request SKILL.md.`, listing.note].filter(Boolean).join(" ") };
127
141
  },
128
142
  };
129
143
  }