@skaile/workspaces 5.0.0 → 5.1.0

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 (214) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/{asset-feeds-HIWT4DVT.js → asset-feeds-TU5CS6QL.js} +10 -17
  3. package/dist/asset-feeds-TU5CS6QL.js.map +1 -0
  4. package/dist/asset-manager/catalog-deployer.js +5 -5
  5. package/dist/asset-manager/index.js +8 -8
  6. package/dist/asset-manager/installer.js +6 -6
  7. package/dist/asset-manager/src/index.d.ts +2 -1
  8. package/dist/asset-manager/src/index.d.ts.map +1 -1
  9. package/dist/bridge/drivers/claude-sdk.js +7 -7
  10. package/dist/bridge/drivers/codex.js +7 -7
  11. package/dist/bridge/drivers/continue.js +8 -8
  12. package/dist/bridge/drivers/echo.js +1 -1
  13. package/dist/bridge/drivers/gemini.js +5 -5
  14. package/dist/bridge/drivers/goose.js +8 -8
  15. package/dist/bridge/drivers/omp.js +2 -2
  16. package/dist/bridge/drivers/opencode.js +8 -8
  17. package/dist/bridge/drivers/qwen.js +5 -5
  18. package/dist/bridge/index.js +8 -8
  19. package/dist/{chunk-WOJ4AK3Q.js → chunk-2Y6DSR36.js} +5 -4
  20. package/dist/chunk-2Y6DSR36.js.map +1 -0
  21. package/dist/{chunk-I7Z4FN52.js → chunk-3KSAFYD4.js} +9 -5
  22. package/dist/chunk-3KSAFYD4.js.map +1 -0
  23. package/dist/{chunk-32DMH2GD.js → chunk-3NGPZC44.js} +10 -10
  24. package/dist/chunk-3NGPZC44.js.map +1 -0
  25. package/dist/{chunk-YOWFUJO7.js → chunk-55RMUF4G.js} +20 -15
  26. package/dist/chunk-55RMUF4G.js.map +1 -0
  27. package/dist/{chunk-LHFZTVIM.js → chunk-6LDUA57J.js} +9 -9
  28. package/dist/chunk-6LDUA57J.js.map +1 -0
  29. package/dist/{chunk-7QMRP6BC.js → chunk-AGWYBS2E.js} +6 -6
  30. package/dist/{chunk-7QMRP6BC.js.map → chunk-AGWYBS2E.js.map} +1 -1
  31. package/dist/{chunk-35G4M33T.js → chunk-AOMWF2OE.js} +4 -4
  32. package/dist/chunk-AOMWF2OE.js.map +1 -0
  33. package/dist/{chunk-RSHMAEK3.js → chunk-AYNPGPT5.js} +5 -5
  34. package/dist/{chunk-RSHMAEK3.js.map → chunk-AYNPGPT5.js.map} +1 -1
  35. package/dist/{chunk-CFL5IJHV.js → chunk-CI6FQ654.js} +3 -3
  36. package/dist/{chunk-CFL5IJHV.js.map → chunk-CI6FQ654.js.map} +1 -1
  37. package/dist/{chunk-MX7IRKTO.js → chunk-E3ZACBHD.js} +13 -16
  38. package/dist/chunk-E3ZACBHD.js.map +1 -0
  39. package/dist/{chunk-HD5K3BYW.js → chunk-E67J56FJ.js} +3 -3
  40. package/dist/{chunk-HD5K3BYW.js.map → chunk-E67J56FJ.js.map} +1 -1
  41. package/dist/{chunk-JFVEX4G5.js → chunk-EPHQWHOH.js} +6 -6
  42. package/dist/{chunk-JFVEX4G5.js.map → chunk-EPHQWHOH.js.map} +1 -1
  43. package/dist/chunk-F7JHP7JV.js +122 -0
  44. package/dist/chunk-F7JHP7JV.js.map +1 -0
  45. package/dist/{chunk-TVYLXZTT.js → chunk-G47EV3V6.js} +2 -2
  46. package/dist/{chunk-TVYLXZTT.js.map → chunk-G47EV3V6.js.map} +1 -1
  47. package/dist/{chunk-GFPG27HK.js → chunk-G4T7MYTA.js} +6 -6
  48. package/dist/{chunk-GFPG27HK.js.map → chunk-G4T7MYTA.js.map} +1 -1
  49. package/dist/{chunk-MBVNMPG7.js → chunk-IWCCZL7C.js} +17 -11
  50. package/dist/chunk-IWCCZL7C.js.map +1 -0
  51. package/dist/{chunk-I3ITSUWS.js → chunk-IYIIT4R3.js} +5 -5
  52. package/dist/{chunk-I3ITSUWS.js.map → chunk-IYIIT4R3.js.map} +1 -1
  53. package/dist/{chunk-XWLEXD34.js → chunk-KAYH6AXN.js} +3 -3
  54. package/dist/{chunk-XWLEXD34.js.map → chunk-KAYH6AXN.js.map} +1 -1
  55. package/dist/{chunk-HWE3FXF4.js → chunk-MXXKTQXJ.js} +3 -3
  56. package/dist/{chunk-HWE3FXF4.js.map → chunk-MXXKTQXJ.js.map} +1 -1
  57. package/dist/{chunk-IGXKUCLI.js → chunk-P5UQ56RA.js} +3 -3
  58. package/dist/{chunk-IGXKUCLI.js.map → chunk-P5UQ56RA.js.map} +1 -1
  59. package/dist/{chunk-53WMBXSL.js → chunk-QFZFZXQW.js} +118 -21
  60. package/dist/chunk-QFZFZXQW.js.map +1 -0
  61. package/dist/{chunk-RP4B4HVX.js → chunk-RDTHJSGY.js} +2 -2
  62. package/dist/{chunk-RP4B4HVX.js.map → chunk-RDTHJSGY.js.map} +1 -1
  63. package/dist/{chunk-PV4OBVA3.js → chunk-RNNUYFFD.js} +2 -2
  64. package/dist/{chunk-PV4OBVA3.js.map → chunk-RNNUYFFD.js.map} +1 -1
  65. package/dist/{chunk-X7MHVL4R.js → chunk-SP47UJKE.js} +28 -16
  66. package/dist/{chunk-X7MHVL4R.js.map → chunk-SP47UJKE.js.map} +1 -1
  67. package/dist/{chunk-EB4ZTESQ.js → chunk-TOSHZX4C.js} +8 -3
  68. package/dist/chunk-TOSHZX4C.js.map +1 -0
  69. package/dist/{chunk-KAJH3XPW.js → chunk-U6K3I3AX.js} +3 -3
  70. package/dist/{chunk-KAJH3XPW.js.map → chunk-U6K3I3AX.js.map} +1 -1
  71. package/dist/{chunk-22DN3DB2.js → chunk-UMSWQKCY.js} +3 -3
  72. package/dist/{chunk-22DN3DB2.js.map → chunk-UMSWQKCY.js.map} +1 -1
  73. package/dist/{chunk-H5G3OYY6.js → chunk-WKIOWDLQ.js} +3 -3
  74. package/dist/{chunk-H5G3OYY6.js.map → chunk-WKIOWDLQ.js.map} +1 -1
  75. package/dist/{chunk-ODT7HSLI.js → chunk-X6E7Y4JD.js} +10 -9
  76. package/dist/chunk-X6E7Y4JD.js.map +1 -0
  77. package/dist/chunk-XUQBVK4R.js +15 -0
  78. package/dist/chunk-XUQBVK4R.js.map +1 -0
  79. package/dist/{chunk-CGJ7B6MZ.js → chunk-YDJZRLGN.js} +3 -3
  80. package/dist/{chunk-CGJ7B6MZ.js.map → chunk-YDJZRLGN.js.map} +1 -1
  81. package/dist/{chunk-KREXWKVX.js → chunk-YIVB7GIP.js} +3 -3
  82. package/dist/{chunk-KREXWKVX.js.map → chunk-YIVB7GIP.js.map} +1 -1
  83. package/dist/{chunk-HTBGJCKP.js → chunk-YMOZC2D3.js} +4 -4
  84. package/dist/{chunk-HTBGJCKP.js.map → chunk-YMOZC2D3.js.map} +1 -1
  85. package/dist/cli/index.js +460 -479
  86. package/dist/cli/index.js.map +1 -1
  87. package/dist/cli/src/asset-feeds.d.ts.map +1 -1
  88. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  89. package/dist/cli/src/commands/flow.d.ts +5 -5
  90. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  91. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  92. package/dist/cli/src/commands/project.d.ts.map +1 -1
  93. package/dist/cli/src/commands/publish-core.d.ts +10 -0
  94. package/dist/cli/src/commands/publish-core.d.ts.map +1 -1
  95. package/dist/cli/src/commands/run.d.ts.map +1 -1
  96. package/dist/cli/src/commands/skailify-lib.d.ts +17 -0
  97. package/dist/cli/src/commands/skailify-lib.d.ts.map +1 -1
  98. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  99. package/dist/cli/src/flow-discovery.d.ts +44 -1
  100. package/dist/cli/src/flow-discovery.d.ts.map +1 -1
  101. package/dist/cli/src/helpers.d.ts +6 -0
  102. package/dist/cli/src/helpers.d.ts.map +1 -1
  103. package/dist/cli/src/open-library.d.ts +11 -0
  104. package/dist/cli/src/open-library.d.ts.map +1 -1
  105. package/dist/connectors/config.js +3 -3
  106. package/dist/connectors/index.js +11 -11
  107. package/dist/connectors/src/connector-manager.d.ts +53 -3
  108. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  109. package/dist/connectors/src/connector-prompt.d.ts +16 -2
  110. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  111. package/dist/connectors/src/fleet-utils.d.ts +3 -4
  112. package/dist/connectors/src/fleet-utils.d.ts.map +1 -1
  113. package/dist/connectors/src/index.d.ts +3 -3
  114. package/dist/connectors/src/index.d.ts.map +1 -1
  115. package/dist/connectors-VX7YRFFS.js +45 -0
  116. package/dist/{connectors-T57XL7EA.js.map → connectors-VX7YRFFS.js.map} +1 -1
  117. package/dist/core/driver-targets.js +1 -1
  118. package/dist/core/index.js +5 -5
  119. package/dist/core/runtime-assets.js +3 -3
  120. package/dist/core/src/driver-targets.d.ts +10 -0
  121. package/dist/core/src/driver-targets.d.ts.map +1 -1
  122. package/dist/core/src/index.d.ts +2 -2
  123. package/dist/core/src/index.d.ts.map +1 -1
  124. package/dist/core/src/settings.d.ts +13 -0
  125. package/dist/core/src/settings.d.ts.map +1 -1
  126. package/dist/core/store.js +2 -2
  127. package/dist/core/workspace-config.js +2 -2
  128. package/dist/deploy/index.js +5 -5
  129. package/dist/{ensure-sources-G4FXTJDB.js → ensure-sources-2XQS32WI.js} +11 -11
  130. package/dist/{ensure-sources-G4FXTJDB.js.map → ensure-sources-2XQS32WI.js.map} +1 -1
  131. package/dist/factory-assets/connectors/box.js +11 -11
  132. package/dist/factory-assets/connectors/deploy.js +11 -11
  133. package/dist/factory-assets/connectors/devserver.js +11 -11
  134. package/dist/factory-assets/connectors/flow/adapter.js +11 -11
  135. package/dist/factory-assets/connectors/flow/engine.js +6 -6
  136. package/dist/factory-assets/connectors/flow/run-flow.js +12 -12
  137. package/dist/factory-assets/connectors/flow.js +11 -11
  138. package/dist/factory-assets/connectors/git.js +11 -11
  139. package/dist/factory-assets/connectors/gmail.js +11 -11
  140. package/dist/factory-assets/connectors/googledrive.js +11 -11
  141. package/dist/factory-assets/connectors/local.js +11 -11
  142. package/dist/factory-assets/connectors/mattermost.js +11 -11
  143. package/dist/factory-assets/connectors/memory.js +11 -11
  144. package/dist/factory-assets/connectors/minio.js +11 -11
  145. package/dist/factory-assets/connectors/postgres.js +11 -11
  146. package/dist/factory-assets/connectors/s3.js +11 -11
  147. package/dist/factory-assets/connectors/sharepoint.js +11 -11
  148. package/dist/factory-assets/connectors/sqlite.js +11 -11
  149. package/dist/factory-assets/connectors/static-server.js +11 -11
  150. package/dist/factory-assets/connectors/tunnel.js +11 -11
  151. package/dist/factory-assets/connectors/webdav.js +11 -11
  152. package/dist/factory-assets/connectors/xstate-store.js +11 -11
  153. package/dist/factory-assets/connectors/xstate.js +11 -11
  154. package/dist/{flows-7E2GVW5L.js → flows-SVCCADGE.js} +8 -8
  155. package/dist/{flows-7E2GVW5L.js.map → flows-SVCCADGE.js.map} +1 -1
  156. package/dist/{helpers-EVPKJXGS.js → helpers-IELQGVGB.js} +11 -11
  157. package/dist/{helpers-EVPKJXGS.js.map → helpers-IELQGVGB.js.map} +1 -1
  158. package/dist/library/index.js +6 -6
  159. package/dist/library/src/local/local-catalog-source.d.ts +14 -1
  160. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  161. package/dist/{library-publish-SBEWWTPM.js → library-publish-TCFU3X5L.js} +27 -15
  162. package/dist/library-publish-TCFU3X5L.js.map +1 -0
  163. package/dist/{open-library-UAZIGZUQ.js → open-library-SSBN4FX2.js} +14 -13
  164. package/dist/{open-library-UAZIGZUQ.js.map → open-library-SSBN4FX2.js.map} +1 -1
  165. package/dist/open-registry-CHCWKV5W.js +32 -0
  166. package/dist/open-registry-CHCWKV5W.js.map +1 -0
  167. package/dist/{paths-U7TA7MTE.js → paths-MKSI52PF.js} +8 -8
  168. package/dist/{paths-U7TA7MTE.js.map → paths-MKSI52PF.js.map} +1 -1
  169. package/dist/{plugin-store-TT45MGQZ.js → plugin-store-SVYV7L4C.js} +7 -7
  170. package/dist/{plugin-store-TT45MGQZ.js.map → plugin-store-SVYV7L4C.js.map} +1 -1
  171. package/dist/{project-JLD5RCVK.js → project-PJ37PM6N.js} +12 -12
  172. package/dist/{project-JLD5RCVK.js.map → project-PJ37PM6N.js.map} +1 -1
  173. package/dist/resolver/index.js +5 -5
  174. package/dist/runner/index.js +17 -17
  175. package/dist/runner/src/fleet-health-flag-dispatcher.d.ts +14 -11
  176. package/dist/runner/src/fleet-health-flag-dispatcher.d.ts.map +1 -1
  177. package/dist/sdk/asset-manager.js +8 -8
  178. package/dist/sdk/bridge.js +8 -8
  179. package/dist/sdk/core.js +5 -5
  180. package/dist/sdk/flow.js +6 -6
  181. package/dist/sdk/index.js +17 -17
  182. package/dist/sdk/resolver.js +5 -5
  183. package/dist/sdk/runner.js +17 -17
  184. package/dist/{setup-PGZM4SOO.js → setup-JW2ZGCUG.js} +15 -15
  185. package/dist/{setup-PGZM4SOO.js.map → setup-JW2ZGCUG.js.map} +1 -1
  186. package/dist/{skills-7QVYPIXI.js → skills-7K2YO3KN.js} +7 -7
  187. package/dist/{skills-7QVYPIXI.js.map → skills-7K2YO3KN.js.map} +1 -1
  188. package/dist/{source-SDZYXVVV.js → source-F2VO32W6.js} +15 -14
  189. package/dist/{source-SDZYXVVV.js.map → source-F2VO32W6.js.map} +1 -1
  190. package/dist/{source-manifest-publish-UDLTYV6Y.js → source-manifest-publish-AXNII2J4.js} +17 -16
  191. package/dist/source-manifest-publish-AXNII2J4.js.map +1 -0
  192. package/dist/tui/index.js +17 -17
  193. package/dist/workspace-plugin/adapters/mcp.js +29 -8
  194. package/dist/workspace-plugin/adapters/omp.js +15 -15
  195. package/dist/workspace-plugin/adapters/omp.js.map +1 -1
  196. package/dist/workspace-plugin/index.js +1 -1
  197. package/dist/workspace-plugin/src/tools/connectors.d.ts +1 -1
  198. package/dist/workspace-plugin/src/tools/connectors.d.ts.map +1 -1
  199. package/package.json +1 -1
  200. package/dist/asset-feeds-HIWT4DVT.js.map +0 -1
  201. package/dist/chunk-32DMH2GD.js.map +0 -1
  202. package/dist/chunk-35G4M33T.js.map +0 -1
  203. package/dist/chunk-53WMBXSL.js.map +0 -1
  204. package/dist/chunk-EB4ZTESQ.js.map +0 -1
  205. package/dist/chunk-I7Z4FN52.js.map +0 -1
  206. package/dist/chunk-LHFZTVIM.js.map +0 -1
  207. package/dist/chunk-MBVNMPG7.js.map +0 -1
  208. package/dist/chunk-MX7IRKTO.js.map +0 -1
  209. package/dist/chunk-ODT7HSLI.js.map +0 -1
  210. package/dist/chunk-WOJ4AK3Q.js.map +0 -1
  211. package/dist/chunk-YOWFUJO7.js.map +0 -1
  212. package/dist/connectors-T57XL7EA.js +0 -5
  213. package/dist/library-publish-SBEWWTPM.js.map +0 -1
  214. package/dist/source-manifest-publish-UDLTYV6Y.js.map +0 -1
@@ -56,7 +56,7 @@ function buildOmpToolSet(plugin) {
56
56
  description: "List all mounts declared in skaile.yaml with their mount status.",
57
57
  parameters: {},
58
58
  handler: async () => {
59
- const { mountList } = await import('../../connectors-T57XL7EA.js');
59
+ const { mountList } = await import('../../connectors-VX7YRFFS.js');
60
60
  return (await mountList(plugin.connectorManager)).content[0].text;
61
61
  }
62
62
  },
@@ -65,7 +65,7 @@ function buildOmpToolSet(plugin) {
65
65
  description: "Sync a mount (pull latest from remote).",
66
66
  parameters: { mount_id: { type: "string" } },
67
67
  handler: async ({ mount_id }) => {
68
- const { mountSync } = await import('../../connectors-T57XL7EA.js');
68
+ const { mountSync } = await import('../../connectors-VX7YRFFS.js');
69
69
  return (await mountSync(plugin.connectorManager, mount_id)).content[0].text;
70
70
  }
71
71
  },
@@ -74,7 +74,7 @@ function buildOmpToolSet(plugin) {
74
74
  description: "List all available flow definitions from ai-assets.",
75
75
  parameters: {},
76
76
  handler: async () => {
77
- const { flowList } = await import('../../flows-7E2GVW5L.js');
77
+ const { flowList } = await import('../../flows-SVCCADGE.js');
78
78
  return (await flowList(plugin.projectDir)).content[0].text;
79
79
  }
80
80
  },
@@ -83,7 +83,7 @@ function buildOmpToolSet(plugin) {
83
83
  description: "List past flow run sessions for this workspace.",
84
84
  parameters: {},
85
85
  handler: async () => {
86
- const { flowListSessions } = await import('../../flows-7E2GVW5L.js');
86
+ const { flowListSessions } = await import('../../flows-SVCCADGE.js');
87
87
  return (await flowListSessions(plugin.projectDir)).content[0].text;
88
88
  }
89
89
  },
@@ -92,7 +92,7 @@ function buildOmpToolSet(plugin) {
92
92
  description: "List all skills in the ai-assets catalog.",
93
93
  parameters: {},
94
94
  handler: async () => {
95
- const { skillList } = await import('../../skills-7QVYPIXI.js');
95
+ const { skillList } = await import('../../skills-7K2YO3KN.js');
96
96
  return (await skillList(plugin.projectDir)).content[0].text;
97
97
  }
98
98
  },
@@ -101,7 +101,7 @@ function buildOmpToolSet(plugin) {
101
101
  description: "Search skills by name, description, or keywords.",
102
102
  parameters: { query: { type: "string" } },
103
103
  handler: async ({ query }) => {
104
- const { skillSearch } = await import('../../skills-7QVYPIXI.js');
104
+ const { skillSearch } = await import('../../skills-7K2YO3KN.js');
105
105
  return (await skillSearch(plugin.projectDir, query)).content[0].text;
106
106
  }
107
107
  },
@@ -110,16 +110,16 @@ function buildOmpToolSet(plugin) {
110
110
  description: "Show the full SKILL.md content for a skill.",
111
111
  parameters: { skill_id: { type: "string" } },
112
112
  handler: async ({ skill_id }) => {
113
- const { skillShow } = await import('../../skills-7QVYPIXI.js');
113
+ const { skillShow } = await import('../../skills-7K2YO3KN.js');
114
114
  return (await skillShow(plugin.projectDir, skill_id)).content[0].text;
115
115
  }
116
116
  },
117
117
  {
118
118
  name: "connector_list",
119
- description: "List connectors declared in skaile.yaml as {connected, failed}. `failed` holds connectors that did not connect this session, with the failure reason \u2014 their mount paths are dead directories, not synced workspaces.",
119
+ description: "List connectors declared in skaile.yaml as {connected, failed, notice?}. A host-managed mount in `connected` carries `health` {status: ok|stale|failed, errorClass, checkedAt}; if it is not ok, tell the user and do not write to it. `failed` holds connectors that did not connect this session, with the failure reason \u2014 their mount paths are dead directories, not synced workspaces.",
120
120
  parameters: {},
121
121
  handler: async () => {
122
- const { connectorList } = await import('../../connectors-T57XL7EA.js');
122
+ const { connectorList } = await import('../../connectors-VX7YRFFS.js');
123
123
  return (await connectorList(plugin.connectorManager)).content[0].text;
124
124
  }
125
125
  },
@@ -128,7 +128,7 @@ function buildOmpToolSet(plugin) {
128
128
  description: "Read content from a connector by path.",
129
129
  parameters: { connector_id: { type: "string" }, path: { type: "string" } },
130
130
  handler: async ({ connector_id, path }) => {
131
- const { connectorRead } = await import('../../connectors-T57XL7EA.js');
131
+ const { connectorRead } = await import('../../connectors-VX7YRFFS.js');
132
132
  return (await connectorRead(plugin.connectorManager, connector_id, path)).content[0].text;
133
133
  }
134
134
  },
@@ -145,7 +145,7 @@ function buildOmpToolSet(plugin) {
145
145
  operation,
146
146
  args
147
147
  }) => {
148
- const { connectorExec } = await import('../../connectors-T57XL7EA.js');
148
+ const { connectorExec } = await import('../../connectors-VX7YRFFS.js');
149
149
  return (await connectorExec(plugin.connectorManager, connector_id, operation, args ?? {})).content[0].text;
150
150
  }
151
151
  },
@@ -201,7 +201,7 @@ async function handleSlashCommand(plugin, group, args) {
201
201
  }
202
202
  }
203
203
  async function handleFlowCommand(plugin, sub, rest) {
204
- const { flowList, flowShow, flowListSessions, flowGetSession } = await import('../../flows-7E2GVW5L.js');
204
+ const { flowList, flowShow, flowListSessions, flowGetSession } = await import('../../flows-SVCCADGE.js');
205
205
  if (!sub || sub === "list") return (await flowList(plugin.projectDir)).content[0].text;
206
206
  if (sub === "show" && rest[0])
207
207
  return (await flowShow(plugin.projectDir, rest[0])).content[0].text;
@@ -211,7 +211,7 @@ async function handleFlowCommand(plugin, sub, rest) {
211
211
  return "Usage: /flow list | show <id> | sessions | session <runId>";
212
212
  }
213
213
  async function handleConnectorCommand(plugin, sub, rest) {
214
- const { connectorList, connectorRead, connectorExec, connectorDescribe } = await import('../../connectors-T57XL7EA.js');
214
+ const { connectorList, connectorRead, connectorExec, connectorDescribe } = await import('../../connectors-VX7YRFFS.js');
215
215
  if (!sub || sub === "list") return (await connectorList(plugin.connectorManager)).content[0].text;
216
216
  if (sub === "read" && rest[0] && rest[1])
217
217
  return (await connectorRead(plugin.connectorManager, rest[0], rest[1])).content[0].text;
@@ -230,7 +230,7 @@ async function handleConnectorCommand(plugin, sub, rest) {
230
230
  return "Usage: /connector list | read <id> <path> | exec <id> <op> [json-args] | describe <id>";
231
231
  }
232
232
  async function handleSkillCommand(plugin, sub, rest) {
233
- const { skillList, skillShow, skillSearch } = await import('../../skills-7QVYPIXI.js');
233
+ const { skillList, skillShow, skillSearch } = await import('../../skills-7K2YO3KN.js');
234
234
  if (sub === "run" && rest[0])
235
235
  return (await skillShow(plugin.projectDir, rest[0])).content[0].text;
236
236
  if (!sub || sub === "list") return (await skillList(plugin.projectDir)).content[0].text;
@@ -241,7 +241,7 @@ async function handleSkillCommand(plugin, sub, rest) {
241
241
  return "Usage: /skill list | show <id> | search <query> | run <id>";
242
242
  }
243
243
  async function handleMountsCommand(plugin, sub, rest) {
244
- const { mountList, mountSync, mountStatus } = await import('../../connectors-T57XL7EA.js');
244
+ const { mountList, mountSync, mountStatus } = await import('../../connectors-VX7YRFFS.js');
245
245
  if (!sub || sub === "list") return (await mountList(plugin.connectorManager)).content[0].text;
246
246
  if (sub === "sync" && rest[0])
247
247
  return (await mountSync(plugin.connectorManager, rest[0])).content[0].text;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../workspace-plugin/src/adapters/omp.ts"],"names":[],"mappings":";;;AAyBO,SAAS,wBAAwB,UAAA,EAA4B;AAClE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AACzC,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA,kEAAA,EAG2D,UAAU;AAAA;;AAAA,iDAAA,EAG3B,OAAO,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuC1D;AAsBO,SAAS,gBAAgB,MAAA,EAAoC;AAClE,EAAA,OAAO;AAAA,IACL;AAAA,MACE,IAAA,EAAM,YAAA;AAAA,MACN,WAAA,EAAa,kEAAA;AAAA,MACb,YAAY,EAAC;AAAA,MACb,SAAS,YAAY;AACnB,QAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,8BAAwB,CAAA;AAC3D,QAAA,OAAA,CAAQ,MAAM,SAAA,CAAU,MAAA,CAAO,gBAAgB,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MAC/D;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,YAAA;AAAA,MACN,WAAA,EAAa,yCAAA;AAAA,MACb,YAAY,EAAE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,MAC3C,OAAA,EAAS,OAAO,EAAE,QAAA,EAAS,KAA4B;AACrD,QAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,8BAAwB,CAAA;AAC3D,QAAA,OAAA,CAAQ,MAAM,UAAU,MAAA,CAAO,gBAAA,EAAkB,QAAQ,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MACzE;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EAAa,qDAAA;AAAA,MACb,YAAY,EAAC;AAAA,MACb,SAAS,YAAY;AACnB,QAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,yBAAmB,CAAA;AACrD,QAAA,OAAA,CAAQ,MAAM,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MACxD;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,oBAAA;AAAA,MACN,WAAA,EAAa,iDAAA;AAAA,MACb,YAAY,EAAC;AAAA,MACb,SAAS,YAAY;AACnB,QAAA,MAAM,EAAE,gBAAA,EAAiB,GAAI,MAAM,OAAO,yBAAmB,CAAA;AAC7D,QAAA,OAAA,CAAQ,MAAM,gBAAA,CAAiB,MAAA,CAAO,UAAU,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MAChE;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,YAAA;AAAA,MACN,WAAA,EAAa,2CAAA;AAAA,MACb,YAAY,EAAC;AAAA,MACb,SAAS,YAAY;AACnB,QAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,0BAAoB,CAAA;AACvD,QAAA,OAAA,CAAQ,MAAM,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MACzD;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,cAAA;AAAA,MACN,WAAA,EAAa,kDAAA;AAAA,MACb,YAAY,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,MACxC,OAAA,EAAS,OAAO,EAAE,KAAA,EAAM,KAAyB;AAC/C,QAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,OAAO,0BAAoB,CAAA;AACzD,QAAA,OAAA,CAAQ,MAAM,YAAY,MAAA,CAAO,UAAA,EAAY,KAAK,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MAClE;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,YAAA;AAAA,MACN,WAAA,EAAa,6CAAA;AAAA,MACb,YAAY,EAAE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,MAC3C,OAAA,EAAS,OAAO,EAAE,QAAA,EAAS,KAA4B;AACrD,QAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,0BAAoB,CAAA;AACvD,QAAA,OAAA,CAAQ,MAAM,UAAU,MAAA,CAAO,UAAA,EAAY,QAAQ,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MACnE;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EACE,4NAAA;AAAA,MACF,YAAY,EAAC;AAAA,MACb,SAAS,YAAY;AACnB,QAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,8BAAwB,CAAA;AAC/D,QAAA,OAAA,CAAQ,MAAM,aAAA,CAAc,MAAA,CAAO,gBAAgB,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MACnE;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EAAa,wCAAA;AAAA,MACb,UAAA,EAAY,EAAE,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,MACzE,OAAA,EAAS,OAAO,EAAE,YAAA,EAAc,MAAK,KAA8C;AACjF,QAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,8BAAwB,CAAA;AAC/D,QAAA,OAAA,CAAQ,MAAM,cAAc,MAAA,CAAO,gBAAA,EAAkB,cAAc,IAAI,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MACvF;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EAAa,4CAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC/B,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC5B,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA;AAAK,OACzC;AAAA,MACA,SAAS,OAAO;AAAA,QACd,YAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF,KAIM;AACJ,QAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,8BAAwB,CAAA;AAC/D,QAAA,OAAA,CAAQ,MAAM,aAAA,CAAc,MAAA,CAAO,gBAAA,EAAkB,YAAA,EAAc,SAAA,EAAW,IAAA,IAAQ,EAAE,CAAA,EACrF,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MAChB;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,cAAA;AAAA,MACN,WAAA,EAAa,+BAAA;AAAA,MACb,YAAY,EAAC;AAAA,MACb,SAAS,YAAY;AACnB,QAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,OAAO,4BAAsB,CAAA;AAC3D,QAAA,OAAA,CAAQ,MAAM,WAAA,CAAY,MAAA,CAAO,UAAU,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MAC3D;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,oBAAA;AAAA,MACN,WAAA,EAAa,kDAAA;AAAA,MACb,YAAY,EAAC;AAAA,MACb,SAAS,YAAY;AACnB,QAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,MAAM,OAAO,6BAAuB,CAAA;AAClE,QAAA,OAAA,CAAQ,MAAM,kBAAkB,MAAA,EAAQ,MAAA,CAAO,UAAU,KAAK,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MAC9E;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EAAa,gEAAA;AAAA,MACb,YAAY,EAAC;AAAA,MACb,SAAS,YAAY;AACnB,QAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,6BAAuB,CAAA;AAC9D,QAAA,OAAA,CAAQ,MAAM,aAAA,CAAc,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,MACxF;AAAA;AACF,GACF;AACF;AA0BA,eAAsB,kBAAA,CACpB,MAAA,EACA,KAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAEzB,EAAA,IAAI;AACF,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,MAAA;AACH,QAAA,OAAO,MAAM,iBAAA,CAAkB,MAAA,EAAQ,GAAA,EAAK,IAAI,CAAA;AAAA,MAClD,KAAK,WAAA;AACH,QAAA,OAAO,MAAM,sBAAA,CAAuB,MAAA,EAAQ,GAAA,EAAK,IAAI,CAAA;AAAA,MACvD,KAAK,OAAA;AACH,QAAA,OAAO,MAAM,kBAAA,CAAmB,MAAA,EAAQ,GAAA,EAAK,IAAI,CAAA;AAAA,MACnD,KAAK,QAAA;AACH,QAAA,OAAO,MAAM,mBAAA,CAAoB,MAAA,EAAQ,GAAA,EAAK,IAAI,CAAA;AAAA,MACpD,KAAK,UAAA;AACH,QAAA,OAAO,MAAM,sBAAsB,MAAM,CAAA;AAAA,MAC3C;AACE,QAAA,OAAO,kBAAkB,KAAK,CAAA,CAAA,CAAA;AAAA;AAClC,EACF,SAAS,CAAA,EAAY;AACnB,IAAA,OAAO,UAAU,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,EAC7D;AACF;AAEA,eAAe,iBAAA,CACb,MAAA,EACA,GAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,EAAE,UAAU,QAAA,EAAU,gBAAA,EAAkB,gBAAe,GAAI,MAAM,OACrE,yBACF,CAAA;AACA,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,MAAA,EAAQ,OAAA,CAAQ,MAAM,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAClF,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,IAAA,CAAK,CAAC,CAAA;AAC1B,IAAA,OAAA,CAAQ,MAAM,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AACjE,EAAA,IAAI,GAAA,KAAQ,UAAA,EAAY,OAAA,CAAQ,MAAM,gBAAA,CAAiB,OAAO,UAAU,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AACtF,EAAA,IAAI,GAAA,KAAQ,SAAA,IAAa,IAAA,CAAK,CAAC,CAAA;AAC7B,IAAA,OAAA,CAAQ,MAAM,cAAA,CAAe,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AACvE,EAAA,OAAO,4DAAA;AACT;AAEA,eAAe,sBAAA,CACb,MAAA,EACA,GAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,EAAE,eAAe,aAAA,EAAe,aAAA,EAAe,mBAAkB,GAAI,MAAM,OAC/E,8BACF,CAAA;AACA,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,MAAA,EAAQ,OAAA,CAAQ,MAAM,aAAA,CAAc,MAAA,CAAO,gBAAgB,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAC7F,EAAA,IAAI,QAAQ,MAAA,IAAU,IAAA,CAAK,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AACrC,IAAA,OAAA,CAAQ,MAAM,aAAA,CAAc,MAAA,CAAO,gBAAA,EAAkB,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AACrF,EAAA,IAAI,QAAQ,MAAA,IAAU,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,EAAG;AACxC,IAAA,IAAI,OAAgC,EAAC;AACrC,IAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG;AACX,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,MAC3C,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,MAAM,aAAA,CAAc,MAAA,CAAO,gBAAA,EAAkB,KAAK,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,EAAG,IAAI,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,EAC3F;AACA,EAAA,IAAI,GAAA,KAAQ,UAAA,IAAc,IAAA,CAAK,CAAC,CAAA;AAC9B,IAAA,OAAA,CAAQ,MAAM,iBAAA,CAAkB,MAAA,CAAO,gBAAA,EAAkB,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAChF,EAAA,OAAO,wFAAA;AACT;AAEA,eAAe,kBAAA,CACb,MAAA,EACA,GAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,aAAY,GAAI,MAAM,OAAO,0BAAoB,CAAA;AAC/E,EAAA,IAAI,GAAA,KAAQ,KAAA,IAAS,IAAA,CAAK,CAAC,CAAA;AACzB,IAAA,OAAA,CAAQ,MAAM,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAClE,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,MAAA,EAAQ,OAAA,CAAQ,MAAM,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AACnF,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,IAAA,CAAK,CAAC,CAAA;AAC1B,IAAA,OAAA,CAAQ,MAAM,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAClE,EAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,IAAA,CAAK,CAAC,CAAA;AAC5B,IAAA,OAAA,CAAQ,MAAM,WAAA,CAAY,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAC3E,EAAA,OAAO,4DAAA;AACT;AAEA,eAAe,mBAAA,CACb,MAAA,EACA,GAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,aAAY,GAAI,MAAM,OAAO,8BAAwB,CAAA;AACnF,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,MAAA,EAAQ,OAAA,CAAQ,MAAM,SAAA,CAAU,MAAA,CAAO,gBAAgB,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AACzF,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,IAAA,CAAK,CAAC,CAAA;AAC1B,IAAA,OAAA,CAAQ,MAAM,SAAA,CAAU,MAAA,CAAO,gBAAA,EAAkB,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AACxE,EAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,IAAA,CAAK,CAAC,CAAA;AAC5B,IAAA,OAAA,CAAQ,MAAM,WAAA,CAAY,MAAA,CAAO,gBAAA,EAAkB,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAC1E,EAAA,OAAO,+CAAA;AACT;AAEA,eAAe,sBAAsB,MAAA,EAA0C;AAC7E,EAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,MAAM,OAAO,6BAAuB,CAAA;AAClE,EAAA,OAAA,CAAQ,MAAM,kBAAkB,MAAA,EAAQ,MAAA,CAAO,UAAU,KAAK,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAC9E","file":"omp.js","sourcesContent":["import type { WorkspacePlugin } from \"../plugin.js\";\n\n// ── Extension source generator (STATELESS) ──────────────────────────────────\n// This function generates the .omp/extensions/skaile.ts file content.\n// It is stateless — takes only projectDir, does not require a booted plugin.\n// OMP tool set in the generated file is intentionally a reduced subset\n// (high-frequency tools only) — the full set is available via the MCP adapter.\n\n/**\n * Generate the `.omp/extensions/skaile.ts` file content for a given project.\n *\n * Stateless — accepts only `projectDir` and embeds it as a JSON string\n * literal in the generated TypeScript source. No `boot()` or plugin instance\n * is required; this function is safe to call from install commands.\n *\n * The generated file exports `onInit`, `tools`, and `slashCommands` as\n * required by the OMP extension API.\n *\n * @param projectDir - Absolute path to the skaile project root (embedded in\n * the generated source).\n * @returns A TypeScript source string ready to be written to\n * `.omp/extensions/skaile.ts`.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport function buildOmpExtensionSource(projectDir: string): string {\n const escaped = JSON.stringify(projectDir);\n return `// .omp/extensions/skaile.ts\n// Generated by: skaile plugin install --driver omp\n// or: skaile repl --driver omp (ephemeral — removed on exit)\n// Re-generate: skaile plugin install --driver omp --project-dir ${projectDir}\nimport { WorkspacePlugin } from \"@skaile/workspaces/workspace-plugin\";\n\nconst plugin = new WorkspacePlugin({ projectDir: ${escaped}, bootOwned: true });\n\nexport async function onInit() {\n await plugin.boot();\n return { systemPromptAppend: plugin.buildSystemPromptSection() };\n}\n\nexport function tools() {\n return plugin.buildOmpToolSet();\n}\n\nexport const slashCommands = [\n {\n name: \"/flow\",\n description: \"Flow inspection: /flow list | show <id> | sessions | session <runId>\",\n handler: (args: string[]) => plugin.handleSlashCommand(\"flow\", args),\n },\n {\n name: \"/connector\",\n description: \"Connector CRUD: /connector list | read <id> <path> | exec <id> <op> [json-args] | describe <id>\",\n handler: (args: string[]) => plugin.handleSlashCommand(\"connector\", args),\n },\n {\n name: \"/skill\",\n description: \"Skill catalog: /skill list | show <id> | search <query> | run <id>\",\n handler: (args: string[]) => plugin.handleSlashCommand(\"skill\", args),\n },\n {\n name: \"/mounts\",\n description: \"Mount management: /mounts list | sync <id> | status <id>\",\n handler: (args: string[]) => plugin.handleSlashCommand(\"mounts\", args),\n },\n {\n name: \"/validate\",\n description: \"Validate workspace config (skaile.yaml)\",\n handler: () => plugin.handleSlashCommand(\"validate\", []),\n },\n];\n`;\n}\n\n// ── OMP tool set builder ──────────────────────────────────────────────────────\n// OMP tool definition shape: { name, description, parameters, handler }\n// This is a reduced subset of the MCP tool surface (high-frequency tools only).\n\n/**\n * Build the OMP-native tool set for a booted `WorkspacePlugin`.\n *\n * Returns 13 tool objects in OMP's `{ name, description, parameters, handler }`\n * shape — a high-frequency subset of the 27 MCP tools. The full tool surface\n * is available via the MCP adapter.\n *\n * Included tools: `mount_list`, `mount_sync`, `flow_list`, `flow_list_sessions`,\n * `skill_list`, `skill_search`, `skill_show`, `connector_list`, `connector_read`,\n * `connector_exec`, `session_list`, `workspace_validate`, `workspace_info`.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns Array of OMP tool definition objects.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport function buildOmpToolSet(plugin: WorkspacePlugin): unknown[] {\n return [\n {\n name: \"mount_list\",\n description: \"List all mounts declared in skaile.yaml with their mount status.\",\n parameters: {},\n handler: async () => {\n const { mountList } = await import(\"../tools/connectors.js\");\n return (await mountList(plugin.connectorManager)).content[0].text;\n },\n },\n {\n name: \"mount_sync\",\n description: \"Sync a mount (pull latest from remote).\",\n parameters: { mount_id: { type: \"string\" } },\n handler: async ({ mount_id }: { mount_id: string }) => {\n const { mountSync } = await import(\"../tools/connectors.js\");\n return (await mountSync(plugin.connectorManager, mount_id)).content[0].text;\n },\n },\n {\n name: \"flow_list\",\n description: \"List all available flow definitions from ai-assets.\",\n parameters: {},\n handler: async () => {\n const { flowList } = await import(\"../tools/flows.js\");\n return (await flowList(plugin.projectDir)).content[0].text;\n },\n },\n {\n name: \"flow_list_sessions\",\n description: \"List past flow run sessions for this workspace.\",\n parameters: {},\n handler: async () => {\n const { flowListSessions } = await import(\"../tools/flows.js\");\n return (await flowListSessions(plugin.projectDir)).content[0].text;\n },\n },\n {\n name: \"skill_list\",\n description: \"List all skills in the ai-assets catalog.\",\n parameters: {},\n handler: async () => {\n const { skillList } = await import(\"../tools/skills.js\");\n return (await skillList(plugin.projectDir)).content[0].text;\n },\n },\n {\n name: \"skill_search\",\n description: \"Search skills by name, description, or keywords.\",\n parameters: { query: { type: \"string\" } },\n handler: async ({ query }: { query: string }) => {\n const { skillSearch } = await import(\"../tools/skills.js\");\n return (await skillSearch(plugin.projectDir, query)).content[0].text;\n },\n },\n {\n name: \"skill_show\",\n description: \"Show the full SKILL.md content for a skill.\",\n parameters: { skill_id: { type: \"string\" } },\n handler: async ({ skill_id }: { skill_id: string }) => {\n const { skillShow } = await import(\"../tools/skills.js\");\n return (await skillShow(plugin.projectDir, skill_id)).content[0].text;\n },\n },\n {\n name: \"connector_list\",\n description:\n \"List connectors declared in skaile.yaml as {connected, failed}. `failed` holds connectors that did not connect this session, with the failure reason — their mount paths are dead directories, not synced workspaces.\",\n parameters: {},\n handler: async () => {\n const { connectorList } = await import(\"../tools/connectors.js\");\n return (await connectorList(plugin.connectorManager)).content[0].text;\n },\n },\n {\n name: \"connector_read\",\n description: \"Read content from a connector by path.\",\n parameters: { connector_id: { type: \"string\" }, path: { type: \"string\" } },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) => {\n const { connectorRead } = await import(\"../tools/connectors.js\");\n return (await connectorRead(plugin.connectorManager, connector_id, path)).content[0].text;\n },\n },\n {\n name: \"connector_exec\",\n description: \"Execute a custom operation on a connector.\",\n parameters: {\n connector_id: { type: \"string\" },\n operation: { type: \"string\" },\n args: { type: \"object\", optional: true },\n },\n handler: async ({\n connector_id,\n operation,\n args,\n }: {\n connector_id: string;\n operation: string;\n args?: Record<string, unknown>;\n }) => {\n const { connectorExec } = await import(\"../tools/connectors.js\");\n return (await connectorExec(plugin.connectorManager, connector_id, operation, args ?? {}))\n .content[0].text;\n },\n },\n {\n name: \"session_list\",\n description: \"List past agent run sessions.\",\n parameters: {},\n handler: async () => {\n const { sessionList } = await import(\"../tools/sessions.js\");\n return (await sessionList(plugin.projectDir)).content[0].text;\n },\n },\n {\n name: \"workspace_validate\",\n description: \"Run a full health check on the workspace config.\",\n parameters: {},\n handler: async () => {\n const { workspaceValidate } = await import(\"../tools/validator.js\");\n return (await workspaceValidate(plugin, plugin.driver ?? \"omp\")).content[0].text;\n },\n },\n {\n name: \"workspace_info\",\n description: \"Show workspace configuration (driver, model, resource counts).\",\n parameters: {},\n handler: async () => {\n const { workspaceInfo } = await import(\"../tools/validator.js\");\n return (await workspaceInfo(plugin, plugin.driver ?? \"omp\", plugin.model)).content[0].text;\n },\n },\n ];\n}\n\n// ── Slash command dispatcher ──────────────────────────────────────────────────\n\n/**\n * Dispatch an OMP slash command to the appropriate tool group.\n *\n * Routes the command group string to the corresponding tool functions.\n * Supported groups: `\"flow\"`, `\"connector\"`, `\"skill\"`, `\"mounts\"`,\n * `\"validate\"`. Returns a human-readable string for display in the OMP\n * terminal.\n *\n * Sub-commands per group:\n * - `flow`: `list` | `show <id>` | `sessions` | `session <runId>`\n * - `connector`: `list` | `read <id> <path>` | `exec <id> <op> [json-args]` | `describe <id>`\n * - `skill`: `list` | `show <id>` | `search <query>` | `run <id>`\n * - `mounts`: `list` | `sync <id>` | `status <id>`\n * - `validate`: (no sub-commands)\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @param group - Slash command group name (without the leading `/`).\n * @param args - Tokenised arguments following the group name.\n * @returns Plain-text result string for the OMP terminal.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function handleSlashCommand(\n plugin: WorkspacePlugin,\n group: string,\n args: string[],\n): Promise<string> {\n const sub = args[0];\n const rest = args.slice(1);\n\n try {\n switch (group) {\n case \"flow\":\n return await handleFlowCommand(plugin, sub, rest);\n case \"connector\":\n return await handleConnectorCommand(plugin, sub, rest);\n case \"skill\":\n return await handleSkillCommand(plugin, sub, rest);\n case \"mounts\":\n return await handleMountsCommand(plugin, sub, rest);\n case \"validate\":\n return await handleValidateCommand(plugin);\n default:\n return `Unknown group '${group}'`;\n }\n } catch (e: unknown) {\n return `Error: ${e instanceof Error ? e.message : String(e)}`;\n }\n}\n\nasync function handleFlowCommand(\n plugin: WorkspacePlugin,\n sub: string | undefined,\n rest: string[],\n): Promise<string> {\n const { flowList, flowShow, flowListSessions, flowGetSession } = await import(\n \"../tools/flows.js\"\n );\n if (!sub || sub === \"list\") return (await flowList(plugin.projectDir)).content[0].text;\n if (sub === \"show\" && rest[0])\n return (await flowShow(plugin.projectDir, rest[0])).content[0].text;\n if (sub === \"sessions\") return (await flowListSessions(plugin.projectDir)).content[0].text;\n if (sub === \"session\" && rest[0])\n return (await flowGetSession(plugin.projectDir, rest[0])).content[0].text;\n return \"Usage: /flow list | show <id> | sessions | session <runId>\";\n}\n\nasync function handleConnectorCommand(\n plugin: WorkspacePlugin,\n sub: string | undefined,\n rest: string[],\n): Promise<string> {\n const { connectorList, connectorRead, connectorExec, connectorDescribe } = await import(\n \"../tools/connectors.js\"\n );\n if (!sub || sub === \"list\") return (await connectorList(plugin.connectorManager)).content[0].text;\n if (sub === \"read\" && rest[0] && rest[1])\n return (await connectorRead(plugin.connectorManager, rest[0], rest[1])).content[0].text;\n if (sub === \"exec\" && rest[0] && rest[1]) {\n let args: Record<string, unknown> = {};\n if (rest[2]) {\n try {\n args = JSON.parse(rest.slice(2).join(\" \"));\n } catch {\n /* best-effort parse */\n }\n }\n return (await connectorExec(plugin.connectorManager, rest[0], rest[1], args)).content[0].text;\n }\n if (sub === \"describe\" && rest[0])\n return (await connectorDescribe(plugin.connectorManager, rest[0])).content[0].text;\n return \"Usage: /connector list | read <id> <path> | exec <id> <op> [json-args] | describe <id>\";\n}\n\nasync function handleSkillCommand(\n plugin: WorkspacePlugin,\n sub: string | undefined,\n rest: string[],\n): Promise<string> {\n const { skillList, skillShow, skillSearch } = await import(\"../tools/skills.js\");\n if (sub === \"run\" && rest[0])\n return (await skillShow(plugin.projectDir, rest[0])).content[0].text;\n if (!sub || sub === \"list\") return (await skillList(plugin.projectDir)).content[0].text;\n if (sub === \"show\" && rest[0])\n return (await skillShow(plugin.projectDir, rest[0])).content[0].text;\n if (sub === \"search\" && rest[0])\n return (await skillSearch(plugin.projectDir, rest.join(\" \"))).content[0].text;\n return \"Usage: /skill list | show <id> | search <query> | run <id>\";\n}\n\nasync function handleMountsCommand(\n plugin: WorkspacePlugin,\n sub: string | undefined,\n rest: string[],\n): Promise<string> {\n const { mountList, mountSync, mountStatus } = await import(\"../tools/connectors.js\");\n if (!sub || sub === \"list\") return (await mountList(plugin.connectorManager)).content[0].text;\n if (sub === \"sync\" && rest[0])\n return (await mountSync(plugin.connectorManager, rest[0])).content[0].text;\n if (sub === \"status\" && rest[0])\n return (await mountStatus(plugin.connectorManager, rest[0])).content[0].text;\n return \"Usage: /mounts list | sync <id> | status <id>\";\n}\n\nasync function handleValidateCommand(plugin: WorkspacePlugin): Promise<string> {\n const { workspaceValidate } = await import(\"../tools/validator.js\");\n return (await workspaceValidate(plugin, plugin.driver ?? \"omp\")).content[0].text;\n}\n"]}
1
+ {"version":3,"sources":["../../../workspace-plugin/src/adapters/omp.ts"],"names":[],"mappings":"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","file":"omp.js","sourcesContent":["import type { WorkspacePlugin } from \"../plugin.js\";\n\n// ── Extension source generator (STATELESS) ──────────────────────────────────\n// This function generates the .omp/extensions/skaile.ts file content.\n// It is stateless — takes only projectDir, does not require a booted plugin.\n// OMP tool set in the generated file is intentionally a reduced subset\n// (high-frequency tools only) — the full set is available via the MCP adapter.\n\n/**\n * Generate the `.omp/extensions/skaile.ts` file content for a given project.\n *\n * Stateless — accepts only `projectDir` and embeds it as a JSON string\n * literal in the generated TypeScript source. No `boot()` or plugin instance\n * is required; this function is safe to call from install commands.\n *\n * The generated file exports `onInit`, `tools`, and `slashCommands` as\n * required by the OMP extension API.\n *\n * @param projectDir - Absolute path to the skaile project root (embedded in\n * the generated source).\n * @returns A TypeScript source string ready to be written to\n * `.omp/extensions/skaile.ts`.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport function buildOmpExtensionSource(projectDir: string): string {\n const escaped = JSON.stringify(projectDir);\n return `// .omp/extensions/skaile.ts\n// Generated by: skaile plugin install --driver omp\n// or: skaile repl --driver omp (ephemeral — removed on exit)\n// Re-generate: skaile plugin install --driver omp --project-dir ${projectDir}\nimport { WorkspacePlugin } from \"@skaile/workspaces/workspace-plugin\";\n\nconst plugin = new WorkspacePlugin({ projectDir: ${escaped}, bootOwned: true });\n\nexport async function onInit() {\n await plugin.boot();\n return { systemPromptAppend: plugin.buildSystemPromptSection() };\n}\n\nexport function tools() {\n return plugin.buildOmpToolSet();\n}\n\nexport const slashCommands = [\n {\n name: \"/flow\",\n description: \"Flow inspection: /flow list | show <id> | sessions | session <runId>\",\n handler: (args: string[]) => plugin.handleSlashCommand(\"flow\", args),\n },\n {\n name: \"/connector\",\n description: \"Connector CRUD: /connector list | read <id> <path> | exec <id> <op> [json-args] | describe <id>\",\n handler: (args: string[]) => plugin.handleSlashCommand(\"connector\", args),\n },\n {\n name: \"/skill\",\n description: \"Skill catalog: /skill list | show <id> | search <query> | run <id>\",\n handler: (args: string[]) => plugin.handleSlashCommand(\"skill\", args),\n },\n {\n name: \"/mounts\",\n description: \"Mount management: /mounts list | sync <id> | status <id>\",\n handler: (args: string[]) => plugin.handleSlashCommand(\"mounts\", args),\n },\n {\n name: \"/validate\",\n description: \"Validate workspace config (skaile.yaml)\",\n handler: () => plugin.handleSlashCommand(\"validate\", []),\n },\n];\n`;\n}\n\n// ── OMP tool set builder ──────────────────────────────────────────────────────\n// OMP tool definition shape: { name, description, parameters, handler }\n// This is a reduced subset of the MCP tool surface (high-frequency tools only).\n\n/**\n * Build the OMP-native tool set for a booted `WorkspacePlugin`.\n *\n * Returns 13 tool objects in OMP's `{ name, description, parameters, handler }`\n * shape — a high-frequency subset of the 27 MCP tools. The full tool surface\n * is available via the MCP adapter.\n *\n * Included tools: `mount_list`, `mount_sync`, `flow_list`, `flow_list_sessions`,\n * `skill_list`, `skill_search`, `skill_show`, `connector_list`, `connector_read`,\n * `connector_exec`, `session_list`, `workspace_validate`, `workspace_info`.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns Array of OMP tool definition objects.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport function buildOmpToolSet(plugin: WorkspacePlugin): unknown[] {\n return [\n {\n name: \"mount_list\",\n description: \"List all mounts declared in skaile.yaml with their mount status.\",\n parameters: {},\n handler: async () => {\n const { mountList } = await import(\"../tools/connectors.js\");\n return (await mountList(plugin.connectorManager)).content[0].text;\n },\n },\n {\n name: \"mount_sync\",\n description: \"Sync a mount (pull latest from remote).\",\n parameters: { mount_id: { type: \"string\" } },\n handler: async ({ mount_id }: { mount_id: string }) => {\n const { mountSync } = await import(\"../tools/connectors.js\");\n return (await mountSync(plugin.connectorManager, mount_id)).content[0].text;\n },\n },\n {\n name: \"flow_list\",\n description: \"List all available flow definitions from ai-assets.\",\n parameters: {},\n handler: async () => {\n const { flowList } = await import(\"../tools/flows.js\");\n return (await flowList(plugin.projectDir)).content[0].text;\n },\n },\n {\n name: \"flow_list_sessions\",\n description: \"List past flow run sessions for this workspace.\",\n parameters: {},\n handler: async () => {\n const { flowListSessions } = await import(\"../tools/flows.js\");\n return (await flowListSessions(plugin.projectDir)).content[0].text;\n },\n },\n {\n name: \"skill_list\",\n description: \"List all skills in the ai-assets catalog.\",\n parameters: {},\n handler: async () => {\n const { skillList } = await import(\"../tools/skills.js\");\n return (await skillList(plugin.projectDir)).content[0].text;\n },\n },\n {\n name: \"skill_search\",\n description: \"Search skills by name, description, or keywords.\",\n parameters: { query: { type: \"string\" } },\n handler: async ({ query }: { query: string }) => {\n const { skillSearch } = await import(\"../tools/skills.js\");\n return (await skillSearch(plugin.projectDir, query)).content[0].text;\n },\n },\n {\n name: \"skill_show\",\n description: \"Show the full SKILL.md content for a skill.\",\n parameters: { skill_id: { type: \"string\" } },\n handler: async ({ skill_id }: { skill_id: string }) => {\n const { skillShow } = await import(\"../tools/skills.js\");\n return (await skillShow(plugin.projectDir, skill_id)).content[0].text;\n },\n },\n {\n name: \"connector_list\",\n description:\n \"List connectors declared in skaile.yaml as {connected, failed, notice?}. A host-managed mount in `connected` carries `health` {status: ok|stale|failed, errorClass, checkedAt}; if it is not ok, tell the user and do not write to it. `failed` holds connectors that did not connect this session, with the failure reason — their mount paths are dead directories, not synced workspaces.\",\n parameters: {},\n handler: async () => {\n const { connectorList } = await import(\"../tools/connectors.js\");\n return (await connectorList(plugin.connectorManager)).content[0].text;\n },\n },\n {\n name: \"connector_read\",\n description: \"Read content from a connector by path.\",\n parameters: { connector_id: { type: \"string\" }, path: { type: \"string\" } },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) => {\n const { connectorRead } = await import(\"../tools/connectors.js\");\n return (await connectorRead(plugin.connectorManager, connector_id, path)).content[0].text;\n },\n },\n {\n name: \"connector_exec\",\n description: \"Execute a custom operation on a connector.\",\n parameters: {\n connector_id: { type: \"string\" },\n operation: { type: \"string\" },\n args: { type: \"object\", optional: true },\n },\n handler: async ({\n connector_id,\n operation,\n args,\n }: {\n connector_id: string;\n operation: string;\n args?: Record<string, unknown>;\n }) => {\n const { connectorExec } = await import(\"../tools/connectors.js\");\n return (await connectorExec(plugin.connectorManager, connector_id, operation, args ?? {}))\n .content[0].text;\n },\n },\n {\n name: \"session_list\",\n description: \"List past agent run sessions.\",\n parameters: {},\n handler: async () => {\n const { sessionList } = await import(\"../tools/sessions.js\");\n return (await sessionList(plugin.projectDir)).content[0].text;\n },\n },\n {\n name: \"workspace_validate\",\n description: \"Run a full health check on the workspace config.\",\n parameters: {},\n handler: async () => {\n const { workspaceValidate } = await import(\"../tools/validator.js\");\n return (await workspaceValidate(plugin, plugin.driver ?? \"omp\")).content[0].text;\n },\n },\n {\n name: \"workspace_info\",\n description: \"Show workspace configuration (driver, model, resource counts).\",\n parameters: {},\n handler: async () => {\n const { workspaceInfo } = await import(\"../tools/validator.js\");\n return (await workspaceInfo(plugin, plugin.driver ?? \"omp\", plugin.model)).content[0].text;\n },\n },\n ];\n}\n\n// ── Slash command dispatcher ──────────────────────────────────────────────────\n\n/**\n * Dispatch an OMP slash command to the appropriate tool group.\n *\n * Routes the command group string to the corresponding tool functions.\n * Supported groups: `\"flow\"`, `\"connector\"`, `\"skill\"`, `\"mounts\"`,\n * `\"validate\"`. Returns a human-readable string for display in the OMP\n * terminal.\n *\n * Sub-commands per group:\n * - `flow`: `list` | `show <id>` | `sessions` | `session <runId>`\n * - `connector`: `list` | `read <id> <path>` | `exec <id> <op> [json-args]` | `describe <id>`\n * - `skill`: `list` | `show <id>` | `search <query>` | `run <id>`\n * - `mounts`: `list` | `sync <id>` | `status <id>`\n * - `validate`: (no sub-commands)\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @param group - Slash command group name (without the leading `/`).\n * @param args - Tokenised arguments following the group name.\n * @returns Plain-text result string for the OMP terminal.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function handleSlashCommand(\n plugin: WorkspacePlugin,\n group: string,\n args: string[],\n): Promise<string> {\n const sub = args[0];\n const rest = args.slice(1);\n\n try {\n switch (group) {\n case \"flow\":\n return await handleFlowCommand(plugin, sub, rest);\n case \"connector\":\n return await handleConnectorCommand(plugin, sub, rest);\n case \"skill\":\n return await handleSkillCommand(plugin, sub, rest);\n case \"mounts\":\n return await handleMountsCommand(plugin, sub, rest);\n case \"validate\":\n return await handleValidateCommand(plugin);\n default:\n return `Unknown group '${group}'`;\n }\n } catch (e: unknown) {\n return `Error: ${e instanceof Error ? e.message : String(e)}`;\n }\n}\n\nasync function handleFlowCommand(\n plugin: WorkspacePlugin,\n sub: string | undefined,\n rest: string[],\n): Promise<string> {\n const { flowList, flowShow, flowListSessions, flowGetSession } = await import(\n \"../tools/flows.js\"\n );\n if (!sub || sub === \"list\") return (await flowList(plugin.projectDir)).content[0].text;\n if (sub === \"show\" && rest[0])\n return (await flowShow(plugin.projectDir, rest[0])).content[0].text;\n if (sub === \"sessions\") return (await flowListSessions(plugin.projectDir)).content[0].text;\n if (sub === \"session\" && rest[0])\n return (await flowGetSession(plugin.projectDir, rest[0])).content[0].text;\n return \"Usage: /flow list | show <id> | sessions | session <runId>\";\n}\n\nasync function handleConnectorCommand(\n plugin: WorkspacePlugin,\n sub: string | undefined,\n rest: string[],\n): Promise<string> {\n const { connectorList, connectorRead, connectorExec, connectorDescribe } = await import(\n \"../tools/connectors.js\"\n );\n if (!sub || sub === \"list\") return (await connectorList(plugin.connectorManager)).content[0].text;\n if (sub === \"read\" && rest[0] && rest[1])\n return (await connectorRead(plugin.connectorManager, rest[0], rest[1])).content[0].text;\n if (sub === \"exec\" && rest[0] && rest[1]) {\n let args: Record<string, unknown> = {};\n if (rest[2]) {\n try {\n args = JSON.parse(rest.slice(2).join(\" \"));\n } catch {\n /* best-effort parse */\n }\n }\n return (await connectorExec(plugin.connectorManager, rest[0], rest[1], args)).content[0].text;\n }\n if (sub === \"describe\" && rest[0])\n return (await connectorDescribe(plugin.connectorManager, rest[0])).content[0].text;\n return \"Usage: /connector list | read <id> <path> | exec <id> <op> [json-args] | describe <id>\";\n}\n\nasync function handleSkillCommand(\n plugin: WorkspacePlugin,\n sub: string | undefined,\n rest: string[],\n): Promise<string> {\n const { skillList, skillShow, skillSearch } = await import(\"../tools/skills.js\");\n if (sub === \"run\" && rest[0])\n return (await skillShow(plugin.projectDir, rest[0])).content[0].text;\n if (!sub || sub === \"list\") return (await skillList(plugin.projectDir)).content[0].text;\n if (sub === \"show\" && rest[0])\n return (await skillShow(plugin.projectDir, rest[0])).content[0].text;\n if (sub === \"search\" && rest[0])\n return (await skillSearch(plugin.projectDir, rest.join(\" \"))).content[0].text;\n return \"Usage: /skill list | show <id> | search <query> | run <id>\";\n}\n\nasync function handleMountsCommand(\n plugin: WorkspacePlugin,\n sub: string | undefined,\n rest: string[],\n): Promise<string> {\n const { mountList, mountSync, mountStatus } = await import(\"../tools/connectors.js\");\n if (!sub || sub === \"list\") return (await mountList(plugin.connectorManager)).content[0].text;\n if (sub === \"sync\" && rest[0])\n return (await mountSync(plugin.connectorManager, rest[0])).content[0].text;\n if (sub === \"status\" && rest[0])\n return (await mountStatus(plugin.connectorManager, rest[0])).content[0].text;\n return \"Usage: /mounts list | sync <id> | status <id>\";\n}\n\nasync function handleValidateCommand(plugin: WorkspacePlugin): Promise<string> {\n const { workspaceValidate } = await import(\"../tools/validator.js\");\n return (await workspaceValidate(plugin, plugin.driver ?? \"omp\")).content[0].text;\n}\n"]}
@@ -1,4 +1,4 @@
1
- export { PluginStore, WorkspacePlugin, buildClaudePluginFiles, resolveProjectDir } from '../chunk-TVYLXZTT.js';
1
+ export { PluginStore, WorkspacePlugin, buildClaudePluginFiles, resolveProjectDir } from '../chunk-G47EV3V6.js';
2
2
  export { err, ok, okJson } from '../chunk-X5YPJV4N.js';
3
3
  import '../chunk-JMKB7IB4.js';
4
4
  import '../chunk-C3CAXQMA.js';
@@ -1,4 +1,4 @@
1
- import type { ConnectorManager } from "@skaile/workspaces/connectors";
1
+ import { type ConnectorManager } from "@skaile/workspaces/connectors";
2
2
  import type { ToolResult } from "../types.js";
3
3
  /**
4
4
  * List all mountable (filesystem-face) connectors declared in `skaile.yaml`
@@ -1 +1 @@
1
- {"version":3,"file":"connectors.d.ts","sourceRoot":"","sources":["../../../../workspace-plugin/src/tools/connectors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgD9C;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAOrF;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC,CASrB;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAUrB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAUzF;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CASrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,UAAU,CAAC,CAUrB"}
1
+ {"version":3,"file":"connectors.d.ts","sourceRoot":"","sources":["../../../../workspace-plugin/src/tools/connectors.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6B,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgD9C;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAOrF;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC,CASrB;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAUrB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAQzF;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CASrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,UAAU,CAAC,CAUrB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skaile/workspaces",
3
- "version": "5.0.0",
3
+ "version": "5.1.0",
4
4
  "description": "Skaile workspaces runtime — types, core, bridge, runner, store, connectors, and supporting layers as one publishable package",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.9",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../cli/src/asset-feeds.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAkEA,eAAe,aAAA,GAGZ;AACD,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,CAAC,EAAE,kBAAA,EAAmB,EAAG,EAAE,iBAAA,EAAmB,eAAA,EAAiB,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,MACzF,OAAO,4BAAmB,CAAA;AAAA,MAC1B,OAAO,iBAAyB;AAAA,KACjC,CAAA;AACD,IAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,MAAM,kBAAA,EAAmB;AACpD,IAAA,IAAI;AAIF,MAAA,MAAM,UAAU,iBAAA,EAAkB;AAClC,MAAA,MAAM,UAAA,GAAkB,IAAA,CAAA,IAAA,CAAK,eAAA,EAAgB,EAAG,SAAS,CAAA;AACzD,MAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,OAAA,CAAQ,aAAA,EAAc,EAAG,MAAA;AAAA,QAC3C,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,IAAK,CAAC,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,UAAU;AAAA,OACrE;AACA,MAAA,MAAM,UAAyB,EAAC;AAChC,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AAC3B,QAAA,MAAM,UAAA,GAAa,CAAC,GAAI,MAAM,SAAS,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,IAAI,CAAE,CAAA;AAC3D,QAAA,KAAA,MAAW,KAAA,IAAS,UAAA,EAAY,OAAA,CAAQ,IAAA,CAAK,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,GAAA,CAAI,IAAA,EAAM,CAAA;AAAA,MAC5F;AACA,MAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,IAC1B,CAAA,SAAE;AACA,MAAA,KAAA,EAAM;AAAA,IACR;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,WAAA;AAAA,MACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,KACzD,CAAA;AACD,IAAA,OAAO,EAAE,OAAA,EAAS,EAAC,EAAG,KAAA,EAAM;AAAA,EAC9B;AACF;AAYA,eAAe,YAAY,UAAA,EAGxB;AACD,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,MAAM,OAAO,4BAAmB,CAAA;AACjE,IAAA,MAAM,EAAE,QAAQ,KAAA,EAAM,GAAI,MAAM,oBAAA,CAAqB,EAAE,YAAY,CAAA;AACnE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,UAAA,EAAW;AACvC,MAAA,MAAM,OAAA,GAA0B,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACjD,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,IAAA,EAAO,EAAE,IAAA,IAAsB,OAAA;AAAA,QAC/B,WAAA,EAAa,EAAE,WAAA,IAAe,EAAA;AAAA,QAC9B,MAAA,EAAQ,CAAA,QAAA,EAAW,CAAA,CAAE,EAAE,CAAA,CAAA;AAAA,QACvB,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,UAAU,EAAC;AAAA,QACX,cAAc;AAAC,OACjB,CAAE,CAAA;AACF,MAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,IAC1B,CAAA,SAAE;AACA,MAAA,KAAA,EAAM;AAAA,IACR;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAG3D,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,EAAG;AACvB,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,KAAK,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,EAAC,EAAG,KAAA,EAAM;AAAA,EAC9B;AACF;AAaA,eAAe,aAAa,EAAA,EAA8C;AAIxE,EAAA,MAAM,eAAA,GAAkB,iBAAA,EAAkB,CAAE,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,QAAA,CAAc,IAAA,CAAA,GAAG,CAAA,GAAI,CAAA,GAAI,CAAA,GAAS,IAAA,CAAA,GAAI,CAAA;AAChG,EAAA,MAAM,gBAAgB,CAAC,CAAA,KACrB,eAAA,CAAgB,IAAA,CAAK,CAAC,EAAA,KAAO,CAAA,KAAM,EAAA,CAAG,KAAA,CAAM,GAAG,EAAE,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,EAAE,CAAC,CAAA;AAExE,EAAA,MAAM,GAAA,GAAA,CAAO,MAAM,EAAA,CAAG,MAAA,EAAO,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,aAAA,CAAc,CAAA,CAAE,MAAM,CAAC,CAAA;AACtE,EAAA,MAAM,UAAyB,EAAC;AAMhC,EAAA,KAAA,MAAW,EAAE,QAAA,EAAU,IAAA,EAAK,IAAK,EAAA,CAAG,iBAAgB,EAAG;AACrD,IAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACzB,IAAA,MAAM,SAAS,IAAA,CAAK,QAAA,CAAc,IAAA,CAAA,GAAG,CAAA,GAAI,OAAO,IAAA,GAAY,IAAA,CAAA,GAAA;AAC5D,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,IAAA,IAAQ,CAAA,CAAE,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AAChF,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,aAAa,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,QAAA;AAChD,IAAA,KAAA,MAAW,KAAA,IAAS,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,EAAE,QAAQ,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,EACxF;AACA,EAAA,OAAO,OAAA;AACT;AAUA,eAAe,aAAA,GAGZ;AACD,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,IAAA,IAAQ,mBAAkB,EAAG;AACtC,MAAA,OAAA,CAAQ,KAAK,GAAI,MAAM,QAAA,CAAS,IAAA,EAAM,gBAAgB,CAAE,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,EAC1B,SAAS,GAAA,EAAK;AACZ,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,SAAA;AAAA,MACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,KACzD,CAAA;AACD,IAAA,OAAO,EAAE,OAAA,EAAS,EAAC,EAAG,KAAA,EAAM;AAAA,EAC9B;AACF;AAGA,SAAS,GAAA,CAAI,QAAqB,OAAA,EAAwC;AACxE,EAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,WAAW,EAAE,MAAA,EAAQ,OAAM,CAAE,CAAA;AACnD;AASA,eAAsB,gBAAA,CACpB,IACA,UAAA,EAC0B;AAC1B,EAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,aAAA,EAAc,EAAG,WAAA,CAAY,UAAU,CAAC,CAAC,CAAA;AAClF,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,EAAc;AACpC,EAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,EAAE,CAAA;AACjC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,GAAG,GAAA;AAAA,MACH,GAAG,IAAA,CAAK,OAAA;AAAA,MACR,GAAG,GAAA,CAAI,SAAA,EAAW,OAAA,CAAQ,OAAO,CAAA;AAAA,MACjC,GAAG,GAAA,CAAI,OAAA,EAAS,KAAA,CAAM,OAAO;AAAA,KAC/B;AAAA,IACA,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,KAAA,CAAM,KAAA,EAAO,GAAG,OAAA,CAAQ,KAAK;AAAA,GACzD;AACF","file":"asset-feeds-HIWT4DVT.js","sourcesContent":["/**\n * asset-feeds.ts — gather installable assets from every feed the manage TUI\n * surfaces.\n *\n * Four feeds, normalized into `CatalogEntry`:\n * - **Project sources** — `skaile.yaml` `sources:` entries (scanned via\n * `AssetManager.search()`; the new `sources:` field is merged into the\n * legacy repositories map in `AssetManager.loadConfig`).\n * - **Local libraries** — user authoring places from `LocalIndex` (filesystem\n * scan of each library's `path`).\n * - **Factory assets** — the bundled first-party `factory-assets` tree\n * (`factoryAssetRoots()`), scanned from disk. Always present; no network.\n * - **Remote store** — the configured catalog source when `catalog.url` is\n * not `local`. Failures are non-fatal — they surface as notes.\n */\n\nimport { existsSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n type AssetKind,\n type CatalogEntry,\n factoryAssetRoots,\n scanRepo,\n} from \"@skaile/workspaces/core\";\n\n/** One non-fatal note returned to the caller for surfacing in the UI. */\nexport interface FeedNote {\n feed: \"sources\" | \"libraries\" | \"store\" | \"factory\";\n message: string;\n}\n\n/**\n * Which feed an asset came from. This is the top-level grouping axis in the\n * manage TUI (\"where is this skill coming from?\") and is intentionally distinct\n * from `publisher` (asset-intrinsic identity): the same publisher can legitimately\n * appear under more than one origin (e.g. a github repo you added as a `source`\n * that is also listed in the remote `store`).\n */\nexport type AssetOrigin = \"source\" | \"library\" | \"factory\" | \"store\";\n\n/** A catalog entry tagged with the feed it was gathered from. */\nexport interface OriginEntry {\n origin: AssetOrigin;\n entry: CatalogEntry;\n /**\n * Second-level grouping label for the manage tree. Defaults (when unset) to the\n * entry's `publisher`; the source feed sets it to the source's short repo name\n * so the Sources band groups by source — \"which repo did this come from\" — not\n * by the asset-intrinsic publisher.\n */\n group?: string;\n}\n\nexport interface AssetFeedResult {\n entries: OriginEntry[];\n notes: FeedNote[];\n}\n\n/**\n * Pull assets from local libraries (the authoring places under\n * `~/.skaile/libraries/<name>/`, not the `~/.skaile/cache/sources/` cache). Each\n * library's `path` is scanned with `scanRepo` and grouped under the bare library\n * name (`group: <name>`) so the manage TUI shows a clean `<name>` band — no\n * `library:` prefix (mirrors the source feed). Plugin grouping (`entry.plugin`)\n * is stamped by `scanRepo`.\n */\nasync function libraryAssets(): Promise<{\n entries: OriginEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const [{ openLibraryManager }, { getGlobalCacheDir, globalSkaileDir }] = await Promise.all([\n import(\"./open-library.ts\"),\n import(\"@skaile/workspaces/core\"),\n ]);\n const { manager, close } = await openLibraryManager();\n try {\n // Authoring libraries are the rows that are NOT source clones. index.db\n // rows predating the cache migration still carry the legacy\n // ~/.skaile/sources path, so exclude both roots.\n const newRoot = getGlobalCacheDir();\n const legacyRoot = path.join(globalSkaileDir(), \"sources\");\n const libs = (await manager.listLibraries()).filter(\n (l) => !l.path.startsWith(newRoot) && !l.path.startsWith(legacyRoot),\n );\n const entries: OriginEntry[] = [];\n for (const lib of libs) {\n if (!existsSync(lib.path)) continue;\n const libEntries = [...(await scanRepo(lib.path, lib.name))];\n for (const entry of libEntries) entries.push({ origin: \"library\", entry, group: lib.name });\n }\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n notes.push({\n feed: \"libraries\",\n message: err instanceof Error ? err.message : String(err),\n });\n return { entries: [], notes };\n }\n}\n\n/**\n * Pull a (best-effort) snapshot of the connected remote store catalog.\n *\n * - Returns no entries when the resolved catalog is local-only or the host\n * is unreachable (the failure becomes a note, not an exception).\n * - Maps `CatalogAsset` → `CatalogEntry`, carrying `publisher`, `repo`, and\n * `category` straight through and using `source = \"store://<id>\"`; per-file\n * `source` paths are not available for remote assets so the canonical ref is\n * a stable placeholder.\n */\nasync function storeAssets(projectDir: string): Promise<{\n entries: CatalogEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const { resolveCatalogSource } = await import(\"./open-library.ts\");\n const { source, close } = await resolveCatalogSource({ projectDir });\n try {\n const assets = await source.listAssets();\n const entries: CatalogEntry[] = assets.map((a) => ({\n name: a.name,\n kind: (a.kind as AssetKind) ?? \"skill\",\n description: a.description ?? \"\",\n source: `store://${a.id}`,\n publisher: a.publisher,\n repo: a.repo,\n plugin: a.plugin,\n category: a.category,\n version: a.version,\n requires: [],\n dependencies: [],\n }));\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // Local-only catalog throws a recognizable message — silence it; absence\n // is the user's choice, not an error.\n if (!/local/i.test(msg)) {\n notes.push({ feed: \"store\", message: msg });\n }\n return { entries: [], notes };\n }\n}\n\n/** The slice of `AssetManager` the source feed needs (kept narrow for tests). */\ninterface AssetManagerLike {\n search: () => Promise<CatalogEntry[]>;\n searchRepoRoots: () => { repoName: string; root: string }[];\n}\n\n/**\n * Project-source feed: leans on `AssetManager.search()`, which merges\n * `skaile.yaml`'s `sources:` field into the repositories map. Plugin grouping\n * (`entry.plugin`) is stamped by the scanner, so entries pass through as-is.\n */\nasync function sourceAssets(am: AssetManagerLike): Promise<OriginEntry[]> {\n // The bundled factory tree is injected into the repositories map as an implicit\n // source, so `am.search()` returns it too. It has its own `factory` origin band,\n // so drop it here — otherwise the same first-party skills list twice under Sources.\n const factoryPrefixes = factoryAssetRoots().map((r) => (r.endsWith(path.sep) ? r : r + path.sep));\n const isFactoryPath = (p: string) =>\n factoryPrefixes.some((fp) => p === fp.slice(0, -1) || p.startsWith(fp));\n\n const all = (await am.search()).filter((e) => !isFactoryPath(e.source));\n const entries: OriginEntry[] = [];\n // Group each source's entries under the source node (its short repo name), not\n // the publisher: under Sources the navigational question is \"which repo did\n // this come from\". Each entry's `source` (absolute manifest path) lives under\n // exactly one declared root, so group by prefix. The cache slug is\n // URL-keyed `github.com/<org>/<repo>` — take the trailing segment.\n for (const { repoName, root } of am.searchRepoRoots()) {\n if (isFactoryPath(root)) continue;\n const prefix = root.endsWith(path.sep) ? root : root + path.sep;\n const owned = all.filter((e) => e.source === root || e.source.startsWith(prefix));\n if (owned.length === 0) continue;\n const sourceName = repoName.split(\"/\").pop() || repoName;\n for (const entry of owned) entries.push({ origin: \"source\", entry, group: sourceName });\n }\n return entries;\n}\n\n/**\n * Factory-asset feed: scan the bundled first-party `factory-assets` tree(s)\n * resolved by `factoryAssetRoots()` (the `SKAILE_FACTORY_ASSETS_DIR` override\n * layer ahead of the bundled tree). Local disk only, no network — the entries are\n * the built-in skills / connectors / bundles that ship with `@skaile/workspaces`.\n * `factoryAssetRoots()` already dedupes, so the env override pointing at the\n * bundled dir collapses to one root.\n */\nasync function factoryAssets(): Promise<{\n entries: CatalogEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const entries: CatalogEntry[] = [];\n for (const root of factoryAssetRoots()) {\n entries.push(...(await scanRepo(root, \"skaile-factory\")));\n }\n return { entries, notes };\n } catch (err) {\n notes.push({\n feed: \"factory\",\n message: err instanceof Error ? err.message : String(err),\n });\n return { entries: [], notes };\n }\n}\n\n/** Tag a flat entry list with a single origin. */\nfunction tag(origin: AssetOrigin, entries: CatalogEntry[]): OriginEntry[] {\n return entries.map((entry) => ({ origin, entry }));\n}\n\n/**\n * Run all feeds and return a single normalized result.\n *\n * Feeds run in parallel where possible — the store fetch is the slow one\n * (one HTTP call) and is fired alongside the local library walk. The factory\n * scan is local disk only, so it runs inline.\n */\nexport async function gatherAssetFeeds(\n am: AssetManagerLike,\n projectDir: string,\n): Promise<AssetFeedResult> {\n const [libs, store] = await Promise.all([libraryAssets(), storeAssets(projectDir)]);\n const factory = await factoryAssets();\n const src = await sourceAssets(am);\n return {\n entries: [\n ...src,\n ...libs.entries,\n ...tag(\"factory\", factory.entries),\n ...tag(\"store\", store.entries),\n ],\n notes: [...libs.notes, ...store.notes, ...factory.notes],\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../cli/src/commands/project.ts"],"names":["spinner","confirm"],"mappings":"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","file":"chunk-32DMH2GD.js","sourcesContent":["import path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { AssetManager } from \"@skaile/workspaces/asset-manager\";\nimport {\n type DriverTarget,\n parseAssetRef,\n readLock,\n SUPPORTED_DRIVER_TARGETS,\n} from \"@skaile/workspaces/core\";\nimport type { InstallManifest } from \"@skaile/workspaces/types\";\nimport { Command } from \"commander\";\nimport { colorRef, formatSoftDepHint, logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\n\n/**\n * Canonical asset-ref shape accepted by `skaile install <ref>`:\n * `kind:@<publisher>/<name>#<version>` (the `#` version sigil). Validated via\n * `parseAssetRef` so the CLI shares the single canonical grammar; the legacy\n * trailing-`@version` shape is rejected.\n */\nconst REF_HINT = \"kind:@<publisher>/<name>#<version> (e.g. skill:@skaile/use-exa#1.0.0)\";\n\n/** True when `ref` parses as a canonical asset ref. */\nfunction isValidAssetRef(ref: string): boolean {\n try {\n parseAssetRef(ref);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Minimal catalog-source surface the pointer-only install path needs.\n * `RemoteCatalogSource` satisfies this — narrowing keeps {@link runPointerOnlyInstall}\n * testable with a hand-rolled stub.\n */\nexport interface InstallManifestSource {\n getInstallManifest(ref: string): Promise<InstallManifest>;\n}\n\n/**\n * Capability check: is this catalog source able to serve install manifests?\n *\n * `openCatalogSource` returns a `RemoteCatalogSource | RestCatalogSource`.\n * Only the tRPC-framed `RemoteCatalogSource` implements `getInstallManifest`;\n * the REST-framed `RestCatalogSource` (the default for any catalog URL other\n * than `https://skaile.store`) does not. Calling it unconditionally would be a\n * runtime `TypeError`, so the pointer-only install path must capability-detect\n * first and fail with a clear, actionable message.\n */\nexport function supportsInstallManifest(source: unknown): source is InstallManifestSource {\n return (\n typeof (source as { getInstallManifest?: unknown } | null | undefined)?.getInstallManifest ===\n \"function\"\n );\n}\n\n/**\n * Minimal library surface the pointer-only install path needs.\n * `LocalIndex` satisfies this.\n */\nexport interface InstallLibrary {\n install(manifest: InstallManifest): Promise<{ installPath: string }>;\n}\n\n/**\n * Result of a pointer-only catalog install.\n */\nexport interface PointerOnlyInstallResult {\n /** Absolute path the verified asset bytes were written to. */\n installPath: string;\n /** The pinned upstream commit SHA the asset was fetched at. */\n commitSha: string;\n /** Number of files in the install manifest. */\n fileCount: number;\n}\n\n/**\n * Pointer-only catalog install — the `skaile install <ref>` code path.\n *\n * 1. Resolves the pointer-only {@link InstallManifest} from the Catalog.\n * 2. Hands it to the library, which fetches each file's bytes directly from\n * the upstream repo at the pinned commit, verifies every per-file SHA256\n * plus the composite SHA256, and only then writes the verified files.\n *\n * Both dependencies are injected so the function is unit-testable without a\n * network round-trip. In production the CLI passes a `RemoteCatalogSource`\n * and a `LocalIndex`.\n *\n * @param ref - Canonical asset ref (`kind:@<publisher>/<name>#<version>`).\n * @param deps - Injected catalog source + library.\n * @returns The install path, pinned commit SHA, and file count.\n * @throws When the ref is malformed, the manifest cannot be resolved, or any\n * hash verification fails. The underlying error message is surfaced as-is.\n */\nexport async function runPointerOnlyInstall(\n ref: string,\n deps: { catalog: InstallManifestSource; library: InstallLibrary },\n): Promise<PointerOnlyInstallResult> {\n let requested: ReturnType<typeof parseAssetRef>;\n try {\n requested = parseAssetRef(ref);\n } catch (e) {\n throw new Error(\n `malformed asset ref '${ref}' — expected ${REF_HINT}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n const manifest = await deps.catalog.getInstallManifest(ref);\n // [M1] Identity check: the catalog must not install a different asset than\n // requested. Compare the PARSED refs (kind/publisher/name/pin) so equivalent\n // spellings (optional `kind:`, default `skill`) are treated as the same ref.\n const got = parseAssetRef(manifest.ref);\n if (\n got.kind !== requested.kind ||\n got.publisher !== requested.publisher ||\n got.name !== requested.name ||\n got.pin !== requested.pin\n ) {\n throw new Error(\n `catalog identity mismatch: requested '${ref}' but the catalog returned a manifest for '${manifest.ref}'`,\n );\n }\n const { installPath } = await deps.library.install(manifest);\n return {\n installPath,\n commitSha: manifest.source.commitSha,\n fileCount: manifest.files.length,\n };\n}\n\n/**\n * Creates the `skaile install` command.\n *\n * Two modes, selected by argument shape:\n *\n * - `skaile install` (no positional arg) — reads `skaile.yaml` and deploys all\n * declared assets (and their transitive dependencies) to the configured\n * driver target directory. Supports `--locked` for CI-mode install from a\n * lock file.\n * - `skaile install kind:@<publisher>/<name>#<version>` — pointer-only catalog\n * install: resolves the pointer-only install manifest from the configured\n * Catalog, fetches each file's bytes directly from the upstream repo at the\n * pinned commit, verifies every per-file + the composite SHA256, then writes\n * the verified files into the local Library.\n *\n * @returns Configured {@link Command} ready for `program.addCommand()`.\n * @docLink cli/commands/project#make-install-command\n */\nexport function makeInstallCommand(): Command {\n return new Command(\"install\")\n .description(`Install dependencies from skaile.yaml, or a single asset by ref (${REF_HINT})`)\n .argument(\"[ref]\", `Asset ref to install from the Catalog (${REF_HINT})`)\n .option(\"--locked\", \"Install from lock file (CI mode — fails on drift)\")\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .option(\"--target <agent>\", \"Agent framework\", \"claude-code\")\n .option(\n \"--global\",\n \"Install the global SSOT (~/.skaile/skaile.yaml), fanning out to every global harness\",\n )\n .option(\n \"--harness <ids>\",\n \"Comma-separated global harnesses to install into (default: all resolved); implies --global\",\n )\n .option(\n \"--link\",\n \"symlink local-path assets instead of copying (dev loop; machine-local, not for committing)\",\n )\n .action(runInstallCommand);\n}\n\n/** Options shape accepted by the `skaile install` command action. */\ninterface InstallCommandOptions {\n locked?: boolean;\n projectDir: string;\n target: string;\n global?: boolean;\n harness?: string;\n link?: boolean;\n}\n\n/**\n * Parse a `--harness a,b` value into validated {@link DriverTarget}s, exiting on\n * an unknown id. Returns `undefined` when the flag is absent (resolve the full\n * global set instead).\n */\nfunction parseHarnessFilter(raw: string | undefined): DriverTarget[] | undefined {\n if (!raw) return undefined;\n const ids = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n const out: DriverTarget[] = [];\n for (const id of ids) {\n if (!(SUPPORTED_DRIVER_TARGETS as string[]).includes(id)) {\n logErr(`unknown harness '${id}' — expected one of: ${SUPPORTED_DRIVER_TARGETS.join(\", \")}`);\n process.exit(1);\n }\n out.push(id as DriverTarget);\n }\n return out.length > 0 ? out : undefined;\n}\n\n/**\n * `skaile install` action body. Dispatches by argument shape:\n * a positional `ref` selects pointer-only catalog install, otherwise the\n * legacy `skaile.yaml` install path runs.\n */\nasync function runInstallCommand(\n ref: string | undefined,\n opts: InstallCommandOptions,\n): Promise<void> {\n // ── Pointer-only catalog install: `skaile install <ref>` ──────────────\n if (ref !== undefined) {\n await runRefInstall(ref, opts);\n return;\n }\n\n // ── Legacy install: `skaile install` reads skaile.yaml ────────────────\n await runYamlInstall(opts);\n}\n\n/** Pointer-only catalog install path for `skaile install <ref>`. */\nasync function runRefInstall(ref: string, opts: InstallCommandOptions): Promise<void> {\n if (!isValidAssetRef(ref)) {\n logErr(`malformed asset ref '${ref}' — expected ${REF_HINT}`);\n process.exit(1);\n }\n const spinner = p.spinner();\n spinner.start(`Installing ${ref}`);\n try {\n const { openCatalogSource, openLibrary } = await import(\"../open-library.ts\");\n const catalog = await openCatalogSource({ projectDir: path.resolve(opts.projectDir) });\n // [H2] REST-framed catalogs (the default for any catalog URL other\n // than https://skaile.store) cannot serve install manifests. Detect\n // and fail clearly rather than throwing a runtime TypeError.\n if (!supportsInstallManifest(catalog)) {\n throw new Error(\n \"pointer-only install (skaile install <ref>) requires a tRPC-framed Catalog. \" +\n \"The configured catalog uses REST framing, which does not serve install \" +\n \"manifests. Set catalog.url to https://skaile.store, or catalog.framing: trpc, \" +\n \"in ~/.skaile/config.yaml.\",\n );\n }\n const library = await openLibrary();\n try {\n const result = await runPointerOnlyInstall(ref, { catalog, library });\n spinner.stop(\"Done\");\n logOk(`Installed ${colorRef(ref)}`);\n logInfo(`Path: ${S.dim(result.installPath)}`);\n logInfo(`Commit: ${S.dim(result.commitSha)}`);\n logInfo(`Files: ${S.dim(String(result.fileCount))}`);\n logInfo(\n S.dim(\n `Installed globally (see Path above) — use \\`skaile add ${ref}\\` to deploy into this project.`,\n ),\n );\n } finally {\n library.close();\n }\n } catch (err) {\n spinner.stop(\"Failed\");\n const msg = err instanceof Error ? err.message : String(err);\n if (/unreachable/i.test(msg)) {\n logErr(`asset uninstallable — source commit no longer available (${msg})`);\n } else {\n logErr(msg);\n }\n process.exit(1);\n }\n}\n\n/** Legacy install path for bare `skaile install` (reads skaile.yaml). */\nasync function runYamlInstall(opts: InstallCommandOptions): Promise<void> {\n const projectDir = path.resolve(opts.projectDir);\n\n const harnesses = parseHarnessFilter(opts.harness);\n // `--harness` implies `--global`.\n if (opts.global || harnesses) {\n await runGlobalInstall(opts, harnesses);\n return;\n }\n\n // Hydrate sources declared in skaile.yaml before resolving assets, so\n // freshly checked-out projects pull their source clones automatically.\n try {\n const { ensureSourcesCloned } = await import(\"../ensure-sources.ts\");\n const hydrate = ensureSourcesCloned(projectDir, { quiet: true });\n if (hydrate.cloned.length > 0) {\n logOk(`Cloned source(s): ${hydrate.cloned.join(\", \")}`);\n }\n if (hydrate.failed.length > 0) {\n logErr(`Failed to clone source(s): ${hydrate.failed.join(\", \")}`);\n }\n } catch (err) {\n logWarn(`source hydration skipped: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n const am = new AssetManager({\n projectDir,\n driverTarget: opts.target as DriverTarget,\n });\n const spinner = p.spinner();\n spinner.start(opts.locked ? \"Installing from lock file\" : \"Installing dependencies\");\n try {\n const result = await am.install({ locked: opts.locked, link: opts.link });\n spinner.stop(\"Done\");\n if (result.deployed.length > 0) {\n for (const d of result.deployed) logOk(d);\n }\n if (result.removed.length > 0) {\n for (const r of result.removed) logWarn(`Removed: ${r}`);\n }\n if (result.deployed.length === 0 && result.removed.length === 0) {\n logInfo(\"Nothing to install (already up to date).\");\n }\n if (result.missing.length > 0) {\n for (const m of result.missing) logErr(`Missing: ${m}`);\n // Partial-miss must fail the process — CI can't otherwise distinguish a\n // clean install from \"half the assets never resolved\".\n process.exitCode = 1;\n }\n if (result.lockWritten) {\n logInfo(`Lock file written: ${S.dim(\"skaile.lock.yaml\")}`);\n }\n // Report-only: surface soft deps the declared assets reference but aren't\n // present. Never a prompt — install is a batch/CI path. Skipped under\n // --locked: that mode is \"restore exactly\", so an `add` nudge would jar.\n if (!opts.locked) await reportInstalledSoftDeps(am);\n } catch (err) {\n spinner.stop(\"Failed\");\n logErr(String(err));\n process.exit(1);\n }\n}\n\n/**\n * Report (never prompt) the body-link soft deps that the declared assets\n * reference but that aren't in the project — the `install` counterpart to the\n * `add`-time soft-dep surface. `install` is a batch/CI path (often non-TTY), so\n * it only ever prints a hint: pulling stays an explicit `skaile add`. Best-effort\n * — `reportSoftDeps` swallows any index failure and returns `[]`.\n */\nexport async function reportInstalledSoftDeps(\n am: Pick<AssetManager, \"listDeclared\" | \"reportSoftDeps\">,\n onHint: (line: string) => void = (l) => logInfo(S.dim(l)),\n): Promise<void> {\n try {\n const declared = (await am.listDeclared()).map((d) => d.ref);\n if (declared.length === 0) return;\n const edges = await am.reportSoftDeps(declared);\n for (const edge of edges) onHint(formatSoftDepHint(edge));\n } catch {\n // Best-effort: a soft-dep report must never fail an install that succeeded.\n }\n}\n\n/**\n * Global cross-harness install: deploy every dep declared in the global SSOT\n * (`~/.skaile/skaile.yaml`) into each resolved global harness's dir under `~`,\n * write the global lock (`~/.skaile/skaile.lock.yaml`), then print per-harness\n * state. `harnesses` is the `--harness` filter (omit for the full resolved set).\n */\nasync function runGlobalInstall(\n opts: InstallCommandOptions,\n harnesses: DriverTarget[] | undefined,\n): Promise<void> {\n const am = new AssetManager({\n projectDir: path.resolve(opts.projectDir),\n global: true,\n harnesses,\n });\n const spinner = p.spinner();\n spinner.start(\"Installing global dependencies\");\n try {\n const result = await am.install({ locked: opts.locked, link: opts.link });\n spinner.stop(\"Done\");\n if (result.deployed.length > 0) for (const d of result.deployed) logOk(d);\n if (result.removed.length > 0) for (const r of result.removed) logWarn(`Removed: ${r}`);\n if (result.deployed.length === 0 && result.removed.length === 0)\n logInfo(\"Nothing to install (already up to date).\");\n if (result.missing.length > 0) {\n for (const m of result.missing) logErr(`Missing: ${m}`);\n process.exitCode = 1;\n }\n if (result.lockWritten) logInfo(`Global lock written: ${S.dim(\"~/.skaile/skaile.lock.yaml\")}`);\n\n // Per-harness reconciliation summary so a partial fan-out is visible.\n const state = am.globalState({});\n const byHarness = new Map<string, number>();\n for (const s of state)\n if (s.state === \"installed\") byHarness.set(s.harness, (byHarness.get(s.harness) ?? 0) + 1);\n for (const [harness, n] of byHarness) logInfo(`${harness}: ${n} installed`);\n } catch (err) {\n spinner.stop(\"Failed\");\n logErr(String(err));\n process.exit(1);\n }\n}\n\n/**\n * Creates the `skaile check` command.\n *\n * Scans all deployed assets for unmet dependency requirements **and** the\n * declared set for deps that resolved into the lock but never materialized, and\n * exits with code 1 if either is found. `doctor()` alone only walks *deployed*\n * assets' `requires`, so a declared dep whose bytes never landed (e.g. a\n * store-sourced `mcp-server`) used to report \"satisfied\" (#462).\n *\n * @returns Configured {@link Command} ready for `program.addCommand()`.\n * @docLink cli/commands/project#make-check-command\n */\nexport function makeCheckCommand(): Command {\n return new Command(\"check\")\n .description(\"Check for unmet requirements\")\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .action(async (opts) => {\n const am = new AssetManager({ projectDir: path.resolve(opts.projectDir) });\n const issues = await am.doctor();\n // A project with no (or an unreadable) skaile.yaml has no declared set to\n // reconcile — treat it as drift-free so `check` behaves as it always has.\n let drifted: Awaited<ReturnType<typeof am.listDeclared>> = [];\n try {\n drifted = (await am.listDeclared()).filter((d) => d.state === \"drift\");\n } catch {\n // ignored — doctor() below is still authoritative for deployed assets.\n }\n if (issues.length === 0 && drifted.length === 0) {\n logOk(\"All dependencies satisfied.\");\n } else {\n for (const i of issues) {\n logErr(\n `${i.assetKind}:${i.assetName} requires ${i.depKind}:${i.depName} (${i.inRepos ? \"fixable\" : \"not found\"})`,\n );\n }\n for (const d of drifted) {\n logErr(`${d.ref} is declared and locked but not materialized — run \\`skaile install\\``);\n }\n process.exit(1);\n }\n });\n}\n\n/**\n * Creates the `skaile clean` command.\n *\n * Removes all skaile-managed assets tracked in `skaile.lock.yaml` from the\n * workspace. With `--all` also removes history, patches, repos, and the lock\n * file itself. Preserves unmanaged (manually placed) assets.\n *\n * @returns Configured {@link Command} ready for `program.addCommand()`.\n * @docLink cli/commands/project#make-clean-command\n */\nexport function makeCleanCommand(): Command {\n return new Command(\"clean\")\n .description(\"Remove all skaile-managed assets from the workspace\")\n .option(\"--all\", \"Full reset: also remove history, patches, repos, and lock file\")\n .option(\"--dry-run\", \"Show what would be removed without doing it\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .option(\"--target <agent>\", \"Agent framework\", \"claude-code\")\n .action(async (opts) => {\n const am = new AssetManager({\n projectDir: path.resolve(opts.projectDir),\n driverTarget: opts.target as DriverTarget,\n });\n\n // Preview: load lock file to show what will be cleaned\n const lock = readLock(path.resolve(opts.projectDir, \"skaile.lock.yaml\"));\n\n if (!lock || Object.keys(lock.assets).length === 0) {\n logInfo(\"Nothing to clean (no skaile-managed assets found).\");\n return;\n }\n\n const assetRefs = Object.keys(lock.assets);\n console.log();\n console.log(` ${S.heading(\"Assets to remove:\")} ${S.dim(`(${assetRefs.length})`)}`);\n for (const ref of assetRefs) {\n console.log(` ${colorRef(ref)}`);\n }\n\n if (opts.all) {\n console.log();\n console.log(` ${S.heading(\"Also removing:\")}`);\n console.log(` ${S.dim(\".skaile/history.yaml\")}`);\n console.log(` ${S.dim(\".skaile/patches/\")}`);\n console.log(` ${S.dim(\"skaile.lock.yaml\")}`);\n }\n\n if (opts.dryRun) {\n console.log();\n logInfo(\"Dry run — no changes made.\");\n return;\n }\n\n if (!opts.yes) {\n const confirm = await p.confirm({ message: \"Proceed?\" });\n if (p.isCancel(confirm) || !confirm) {\n logInfo(\"Cancelled.\");\n return;\n }\n }\n\n const result = am.clean({ all: opts.all });\n\n console.log();\n for (const r of result.removed) {\n logOk(`Removed ${r}`);\n }\n for (const s of result.skipped) {\n logWarn(`Skipped ${s.ref}: ${s.reason}`);\n }\n if (result.unmanaged.length > 0) {\n console.log();\n logInfo(`Kept ${result.unmanaged.length} unmanaged asset(s):`);\n for (const u of result.unmanaged) {\n console.log(` ${S.dim(u)}`);\n }\n }\n if (opts.all) {\n console.log();\n logOk(\"Full reset complete.\");\n }\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../workspace-plugin/src/tools/connectors.ts"],"names":[],"mappings":"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","file":"chunk-35G4M33T.js","sourcesContent":["// src/tools/connectors.ts\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { ConnectorManager } from \"@skaile/workspaces/connectors\";\nimport type { ToolResult } from \"../types.js\";\nimport { err, ok, okJson } from \"../types.js\";\n\n// ── Mountable-connector helpers ──────────────────────────────────────────────\n//\n// The unified ConnectorManager owns mountable (filesystem-face) connectors too.\n// A connector is mountable when its `listConnectors()` summary carries a\n// `mountPath`. The `mount*` helpers below project that subset for the legacy\n// `mount_*` tool surface.\n\n/**\n * A connector summary that carries a projected filesystem path. Unlike the raw\n * `listConnectors()` summary, `mountPath` is non-optional here — `listMountable()`\n * runtime-filters to exactly those entries before narrowing to this type.\n */\ntype MountableConnector = ReturnType<ConnectorManager[\"listConnectors\"]>[number] & {\n mountPath: string;\n};\n\n/** Return the mountable (filesystem-face) connectors from a manager. */\nfunction listMountable(manager: ConnectorManager): MountableConnector[] {\n return manager\n .listConnectors()\n .filter((c): c is MountableConnector => typeof c.mountPath === \"string\");\n}\n\n/**\n * A mountable connector as reported to the agent, with an optional `reason`.\n *\n * A fleet-managed mount whose path is gone reports `status: \"error\"` plus a\n * `reason`, even though the connector handle still reads `connected`. One whose\n * probe timed out keeps its cached status and gains a `reason` saying it is\n * unverified: a slow cloud mount is not reported dead.\n */\ntype MountView = MountableConnector & { reason?: string };\n\n/** Overlay a live re-check on the cached connect-time status where one applies. */\nasync function withLiveness(\n manager: ConnectorManager,\n mount: MountableConnector,\n): Promise<MountView> {\n // Optional call: the tool tests' manager doubles omit the method.\n const liveness = await manager.checkMountLiveness?.(mount.id);\n if (!liveness || liveness.state === \"live\") return mount;\n if (liveness.state === \"dead\") return { ...mount, status: \"error\", reason: liveness.reason };\n return { ...mount, reason: liveness.reason };\n}\n\n/**\n * List all mountable (filesystem-face) connectors declared in `skaile.yaml`\n * with their current mount status.\n *\n * @param manager - Active `ConnectorManager` or `null` when not configured.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function mountList(manager: ConnectorManager | null): Promise<ToolResult> {\n if (!manager) return err(\"No connectors configured in skaile.yaml\");\n try {\n return okJson(await Promise.all(listMountable(manager).map((m) => withLiveness(manager, m))));\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Sync a mountable connector — pull the latest content from its remote source.\n *\n * @param manager - Active `ConnectorManager` or `null`.\n * @param mountId - Connector ID declared in `skaile.yaml`.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function mountSync(\n manager: ConnectorManager | null,\n mountId: string,\n): Promise<ToolResult> {\n if (!manager) return err(\"No connectors configured in skaile.yaml\");\n try {\n const result = await manager.sync(mountId);\n return okJson(result);\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Get the current status and metadata for a single mountable connector.\n *\n * @param manager - Active `ConnectorManager` or `null`.\n * @param mountId - Connector ID declared in `skaile.yaml`.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function mountStatus(\n manager: ConnectorManager | null,\n mountId: string,\n): Promise<ToolResult> {\n if (!manager) return err(\"No connectors configured in skaile.yaml\");\n try {\n const mount = listMountable(manager).find((v) => v.id === mountId);\n if (!mount) return err(`Mount not found: \"${mountId}\"`);\n return okJson(await withLiveness(manager, mount));\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Read a file from within a mountable connector's projected directory by its\n * relative path.\n *\n * @param manager - Active `ConnectorManager` or `null`.\n * @param mountId - Connector ID declared in `skaile.yaml`.\n * @param filePath - Relative path within the projected mount directory.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function mountRead(\n manager: ConnectorManager | null,\n mountId: string,\n filePath: string,\n): Promise<ToolResult> {\n if (!manager) return err(\"No connectors configured in skaile.yaml\");\n try {\n const mount = listMountable(manager).find((v) => v.id === mountId);\n if (!mount) return err(`Mount not found: \"${mountId}\"`);\n const content = await readFile(join(mount.mountPath, filePath), \"utf-8\");\n return ok(content);\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * List all connectors registered with the `ConnectorManager`.\n *\n * Returns `{ connected, failed }` — `connected` from `manager.listConnectors()`,\n * `failed` from `manager.listFailedConnectors()`. A connector that threw during\n * `connect()` never enters the active map, so it is absent from the first list\n * entirely; without the second one an agent driven through MCP or OMP has no\n * way to learn that a mount it is about to write into is dead. Returns an error\n * result when no manager is configured (i.e. `skaile.yaml` has no `connectors`\n * section).\n *\n * @param manager - Active `ConnectorManager` or `null` when not configured.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function connectorList(manager: ConnectorManager | null): Promise<ToolResult> {\n if (!manager) return err(\"No connectors configured in skaile.yaml\");\n try {\n // Defensive: a host may pass an older manager or a test double.\n const failed =\n typeof manager.listFailedConnectors === \"function\" ? manager.listFailedConnectors() : [];\n return okJson({ connected: manager.listConnectors(), failed });\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Read content from a connector at the given path.\n *\n * Delegates to `manager.read(id, path)`. Returns an error result when the\n * path yields `null` (not found) or the manager is absent.\n *\n * @param manager - Active `ConnectorManager` or `null`.\n * @param id - Connector ID declared in `skaile.yaml`.\n * @param path - Resource path within the connector (connector-specific format).\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function connectorRead(\n manager: ConnectorManager | null,\n id: string,\n path: string,\n): Promise<ToolResult> {\n if (!manager) return err(\"No connectors configured in skaile.yaml\");\n try {\n const content = await manager.read(id, path);\n if (content === null) return err(`No content at path \"${path}\" in connector \"${id}\"`);\n return okJson(content);\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Write string content to a connector at the given path.\n *\n * Delegates to `manager.write(id, path, { data: content })`.\n *\n * @param manager - Active `ConnectorManager` or `null`.\n * @param id - Connector ID declared in `skaile.yaml`.\n * @param path - Destination path within the connector.\n * @param content - String payload to write.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function connectorWrite(\n manager: ConnectorManager | null,\n id: string,\n path: string,\n content: string,\n): Promise<ToolResult> {\n if (!manager) return err(\"No connectors configured in skaile.yaml\");\n try {\n await manager.write(id, path, { data: content });\n return ok(`Written to \"${path}\" in connector \"${id}\"`);\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Search a connector's data using a query string.\n *\n * Delegates to `manager.search(id, query)` and returns the result set as JSON.\n *\n * @param manager - Active `ConnectorManager` or `null`.\n * @param id - Connector ID declared in `skaile.yaml`.\n * @param query - Free-text or structured query (connector-specific format).\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function connectorSearch(\n manager: ConnectorManager | null,\n id: string,\n query: string,\n): Promise<ToolResult> {\n if (!manager) return err(\"No connectors configured in skaile.yaml\");\n try {\n const results = await manager.search(id, query);\n return okJson(results);\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Execute a named operation on a connector.\n *\n * Delegates to `manager.executeOp(id, operation, args)`. Operations and\n * their argument shapes are connector-specific; use {@link connectorDescribe}\n * to discover what operations a connector supports.\n *\n * @param manager - Active `ConnectorManager` or `null`.\n * @param id - Connector ID declared in `skaile.yaml`.\n * @param operation - Operation name (from the connector's `RuntimeSkillDescriptor`).\n * @param args - Named arguments for the operation.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function connectorExec(\n manager: ConnectorManager | null,\n id: string,\n operation: string,\n args: Record<string, unknown>,\n): Promise<ToolResult> {\n if (!manager) return err(\"No connectors configured in skaile.yaml\");\n try {\n const result = await manager.executeOp(id, operation, args);\n return ok(result);\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Load the rendered skill body for a connector.\n *\n * Delegates to `manager.loadSkill(id)` and returns the skill content as\n * plain text. Useful when the agent needs the connector's operations and\n * usage instructions injected as prompt context.\n *\n * @param manager - Active `ConnectorManager` or `null`.\n * @param id - Connector ID declared in `skaile.yaml`.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function connectorLoadSkill(\n manager: ConnectorManager | null,\n id: string,\n): Promise<ToolResult> {\n if (!manager) return err(\"No connectors configured in skaile.yaml\");\n try {\n const skill = manager.loadSkill(id);\n return ok(skill);\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n/**\n * Describe a connector's capabilities via its `RuntimeSkillDescriptor`.\n *\n * Finds the matching skill descriptor from `manager.listSkills()` and returns\n * it as JSON. The descriptor includes the connector's operations, argument\n * shapes, and usage instructions.\n *\n * @param manager - Active `ConnectorManager` or `null`.\n * @param id - Connector ID declared in `skaile.yaml`.\n *\n * @docLink packages/workspace-plugin/concepts#tool-delivery\n */\nexport async function connectorDescribe(\n manager: ConnectorManager | null,\n id: string,\n): Promise<ToolResult> {\n if (!manager) return err(\"No connectors configured in skaile.yaml\");\n try {\n const skills = manager.listSkills();\n const descriptor = skills.find((s) => s.id === id);\n if (!descriptor) return err(`No skill descriptor for connector \"${id}\"`);\n return okJson(descriptor);\n } catch (e: unknown) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n"]}