agim-cli 1.2.45 → 1.2.49

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 (434) hide show
  1. package/CHANGELOG.md +340 -0
  2. package/README.md +40 -6
  3. package/README.zh-CN.md +40 -6
  4. package/dist/cli-ui/config-wizard.js +16 -2
  5. package/dist/cli-ui/config-wizard.js.map +1 -1
  6. package/dist/cli-ui/diag.d.ts +29 -0
  7. package/dist/cli-ui/diag.d.ts.map +1 -0
  8. package/dist/cli-ui/diag.js +135 -0
  9. package/dist/cli-ui/diag.js.map +1 -0
  10. package/dist/cli-ui/i18n.d.ts +38 -0
  11. package/dist/cli-ui/i18n.d.ts.map +1 -1
  12. package/dist/cli-ui/i18n.js +101 -0
  13. package/dist/cli-ui/i18n.js.map +1 -1
  14. package/dist/cli-ui/setup-llm.d.ts +30 -0
  15. package/dist/cli-ui/setup-llm.d.ts.map +1 -0
  16. package/dist/cli-ui/setup-llm.js +460 -0
  17. package/dist/cli-ui/setup-llm.js.map +1 -0
  18. package/dist/cli-ui/setup-mcp.d.ts +19 -0
  19. package/dist/cli-ui/setup-mcp.d.ts.map +1 -0
  20. package/dist/cli-ui/setup-mcp.js +308 -0
  21. package/dist/cli-ui/setup-mcp.js.map +1 -0
  22. package/dist/cli-ui/token-menu.js +2 -2
  23. package/dist/cli-ui/token-menu.js.map +1 -1
  24. package/dist/cli.js +121 -22
  25. package/dist/cli.js.map +1 -1
  26. package/dist/core/access-token.d.ts +16 -5
  27. package/dist/core/access-token.d.ts.map +1 -1
  28. package/dist/core/access-token.js +82 -13
  29. package/dist/core/access-token.js.map +1 -1
  30. package/dist/core/agent-cwd.d.ts.map +1 -1
  31. package/dist/core/agent-cwd.js +74 -0
  32. package/dist/core/agent-cwd.js.map +1 -1
  33. package/dist/core/approval-bus.d.ts +22 -0
  34. package/dist/core/approval-bus.d.ts.map +1 -1
  35. package/dist/core/approval-bus.js +93 -0
  36. package/dist/core/approval-bus.js.map +1 -1
  37. package/dist/core/ask-user-router.d.ts +24 -0
  38. package/dist/core/ask-user-router.d.ts.map +1 -0
  39. package/dist/core/ask-user-router.js +84 -0
  40. package/dist/core/ask-user-router.js.map +1 -0
  41. package/dist/core/ask-user-rpc.d.ts +80 -0
  42. package/dist/core/ask-user-rpc.d.ts.map +1 -0
  43. package/dist/core/ask-user-rpc.js +388 -0
  44. package/dist/core/ask-user-rpc.js.map +1 -0
  45. package/dist/core/audit-log.d.ts +1 -1
  46. package/dist/core/audit-log.d.ts.map +1 -1
  47. package/dist/core/audit-log.js.map +1 -1
  48. package/dist/core/commands/builtin.d.ts.map +1 -1
  49. package/dist/core/commands/builtin.js +21 -5
  50. package/dist/core/commands/builtin.js.map +1 -1
  51. package/dist/core/commands/goal.d.ts +3 -0
  52. package/dist/core/commands/goal.d.ts.map +1 -0
  53. package/dist/core/commands/goal.js +240 -0
  54. package/dist/core/commands/goal.js.map +1 -0
  55. package/dist/core/commands/heartbeat.d.ts +3 -0
  56. package/dist/core/commands/heartbeat.d.ts.map +1 -0
  57. package/dist/core/commands/heartbeat.js +219 -0
  58. package/dist/core/commands/heartbeat.js.map +1 -0
  59. package/dist/core/commands/router-compare.d.ts +3 -0
  60. package/dist/core/commands/router-compare.d.ts.map +1 -0
  61. package/dist/core/commands/router-compare.js +81 -0
  62. package/dist/core/commands/router-compare.js.map +1 -0
  63. package/dist/core/commands/router.d.ts.map +1 -1
  64. package/dist/core/commands/router.js +9 -1
  65. package/dist/core/commands/router.js.map +1 -1
  66. package/dist/core/commands/skill.d.ts +3 -0
  67. package/dist/core/commands/skill.d.ts.map +1 -0
  68. package/dist/core/commands/skill.js +91 -0
  69. package/dist/core/commands/skill.js.map +1 -0
  70. package/dist/core/config-schema.d.ts +28 -0
  71. package/dist/core/config-schema.d.ts.map +1 -1
  72. package/dist/core/config-schema.js +124 -0
  73. package/dist/core/config-schema.js.map +1 -1
  74. package/dist/core/goals.d.ts +81 -0
  75. package/dist/core/goals.d.ts.map +1 -0
  76. package/dist/core/goals.js +361 -0
  77. package/dist/core/goals.js.map +1 -0
  78. package/dist/core/heartbeat-store.d.ts +90 -0
  79. package/dist/core/heartbeat-store.d.ts.map +1 -0
  80. package/dist/core/heartbeat-store.js +302 -0
  81. package/dist/core/heartbeat-store.js.map +1 -0
  82. package/dist/core/heartbeat.d.ts +35 -0
  83. package/dist/core/heartbeat.d.ts.map +1 -0
  84. package/dist/core/heartbeat.js +332 -0
  85. package/dist/core/heartbeat.js.map +1 -0
  86. package/dist/core/intent-llm.d.ts +9 -0
  87. package/dist/core/intent-llm.d.ts.map +1 -1
  88. package/dist/core/intent-llm.js +77 -32
  89. package/dist/core/intent-llm.js.map +1 -1
  90. package/dist/core/llm/agent-loop.d.ts +112 -0
  91. package/dist/core/llm/agent-loop.d.ts.map +1 -0
  92. package/dist/core/llm/agent-loop.js +313 -0
  93. package/dist/core/llm/agent-loop.js.map +1 -0
  94. package/dist/core/llm/anthropic-provider.d.ts +53 -0
  95. package/dist/core/llm/anthropic-provider.d.ts.map +1 -0
  96. package/dist/core/llm/anthropic-provider.js +339 -0
  97. package/dist/core/llm/anthropic-provider.js.map +1 -0
  98. package/dist/core/llm/auto-compact.d.ts +35 -0
  99. package/dist/core/llm/auto-compact.d.ts.map +1 -0
  100. package/dist/core/llm/auto-compact.js +149 -0
  101. package/dist/core/llm/auto-compact.js.map +1 -0
  102. package/dist/core/llm/builtin-dispatcher.d.ts +21 -0
  103. package/dist/core/llm/builtin-dispatcher.d.ts.map +1 -0
  104. package/dist/core/llm/builtin-dispatcher.js +196 -0
  105. package/dist/core/llm/builtin-dispatcher.js.map +1 -0
  106. package/dist/core/llm/imhub-dispatcher.d.ts +27 -0
  107. package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -0
  108. package/dist/core/llm/imhub-dispatcher.js +308 -0
  109. package/dist/core/llm/imhub-dispatcher.js.map +1 -0
  110. package/dist/core/llm/index.d.ts +11 -0
  111. package/dist/core/llm/index.d.ts.map +1 -0
  112. package/dist/core/llm/index.js +16 -0
  113. package/dist/core/llm/index.js.map +1 -0
  114. package/dist/core/llm/introspection.d.ts +73 -0
  115. package/dist/core/llm/introspection.d.ts.map +1 -0
  116. package/dist/core/llm/introspection.js +90 -0
  117. package/dist/core/llm/introspection.js.map +1 -0
  118. package/dist/core/llm/mcp-client.d.ts +80 -0
  119. package/dist/core/llm/mcp-client.d.ts.map +1 -0
  120. package/dist/core/llm/mcp-client.js +270 -0
  121. package/dist/core/llm/mcp-client.js.map +1 -0
  122. package/dist/core/llm/mcp-registry.d.ts +57 -0
  123. package/dist/core/llm/mcp-registry.d.ts.map +1 -0
  124. package/dist/core/llm/mcp-registry.js +155 -0
  125. package/dist/core/llm/mcp-registry.js.map +1 -0
  126. package/dist/core/llm/openai-compat-provider.d.ts +65 -0
  127. package/dist/core/llm/openai-compat-provider.d.ts.map +1 -0
  128. package/dist/core/llm/openai-compat-provider.js +451 -0
  129. package/dist/core/llm/openai-compat-provider.js.map +1 -0
  130. package/dist/core/llm/policy-approval-gate.d.ts +30 -0
  131. package/dist/core/llm/policy-approval-gate.d.ts.map +1 -0
  132. package/dist/core/llm/policy-approval-gate.js +86 -0
  133. package/dist/core/llm/policy-approval-gate.js.map +1 -0
  134. package/dist/core/llm/provider-base.d.ts +302 -0
  135. package/dist/core/llm/provider-base.d.ts.map +1 -0
  136. package/dist/core/llm/provider-base.js +222 -0
  137. package/dist/core/llm/provider-base.js.map +1 -0
  138. package/dist/core/llm/registry.d.ts +44 -0
  139. package/dist/core/llm/registry.d.ts.map +1 -0
  140. package/dist/core/llm/registry.js +160 -0
  141. package/dist/core/llm/registry.js.map +1 -0
  142. package/dist/core/llm/secrets.d.ts +46 -0
  143. package/dist/core/llm/secrets.d.ts.map +1 -0
  144. package/dist/core/llm/secrets.js +157 -0
  145. package/dist/core/llm/secrets.js.map +1 -0
  146. package/dist/core/llm/tool-dispatcher.d.ts +37 -0
  147. package/dist/core/llm/tool-dispatcher.d.ts.map +1 -0
  148. package/dist/core/llm/tool-dispatcher.js +85 -0
  149. package/dist/core/llm/tool-dispatcher.js.map +1 -0
  150. package/dist/core/memory-consolidate.d.ts.map +1 -1
  151. package/dist/core/memory-consolidate.js +38 -23
  152. package/dist/core/memory-consolidate.js.map +1 -1
  153. package/dist/core/memory-distill.d.ts.map +1 -1
  154. package/dist/core/memory-distill.js +51 -25
  155. package/dist/core/memory-distill.js.map +1 -1
  156. package/dist/core/memory-rpc.d.ts.map +1 -1
  157. package/dist/core/memory-rpc.js +6 -0
  158. package/dist/core/memory-rpc.js.map +1 -1
  159. package/dist/core/message-sink.d.ts.map +1 -1
  160. package/dist/core/message-sink.js +76 -0
  161. package/dist/core/message-sink.js.map +1 -1
  162. package/dist/core/notification-evaluator.d.ts +49 -0
  163. package/dist/core/notification-evaluator.d.ts.map +1 -0
  164. package/dist/core/notification-evaluator.js +232 -0
  165. package/dist/core/notification-evaluator.js.map +1 -0
  166. package/dist/core/onboarding.d.ts.map +1 -1
  167. package/dist/core/onboarding.js +10 -0
  168. package/dist/core/onboarding.js.map +1 -1
  169. package/dist/core/persona.d.ts +10 -0
  170. package/dist/core/persona.d.ts.map +1 -1
  171. package/dist/core/persona.js +28 -14
  172. package/dist/core/persona.js.map +1 -1
  173. package/dist/core/push-rpc.d.ts +8 -0
  174. package/dist/core/push-rpc.d.ts.map +1 -1
  175. package/dist/core/push-rpc.js +41 -1
  176. package/dist/core/push-rpc.js.map +1 -1
  177. package/dist/core/registry.d.ts.map +1 -1
  178. package/dist/core/registry.js +11 -0
  179. package/dist/core/registry.js.map +1 -1
  180. package/dist/core/render-router.d.ts.map +1 -1
  181. package/dist/core/render-router.js +23 -6
  182. package/dist/core/render-router.js.map +1 -1
  183. package/dist/core/router-compare.d.ts +76 -0
  184. package/dist/core/router-compare.d.ts.map +1 -0
  185. package/dist/core/router-compare.js +253 -0
  186. package/dist/core/router-compare.js.map +1 -0
  187. package/dist/core/router.d.ts.map +1 -1
  188. package/dist/core/router.js +25 -1
  189. package/dist/core/router.js.map +1 -1
  190. package/dist/core/skills/builtin/agim-self/SKILL.md +81 -0
  191. package/dist/core/skills/loader.d.ts +120 -0
  192. package/dist/core/skills/loader.d.ts.map +1 -0
  193. package/dist/core/skills/loader.js +577 -0
  194. package/dist/core/skills/loader.js.map +1 -0
  195. package/dist/core/skills-rpc.d.ts +44 -0
  196. package/dist/core/skills-rpc.d.ts.map +1 -0
  197. package/dist/core/skills-rpc.js +71 -0
  198. package/dist/core/skills-rpc.js.map +1 -0
  199. package/dist/core/types.d.ts +35 -0
  200. package/dist/core/types.d.ts.map +1 -1
  201. package/dist/core/util/format-age.d.ts +20 -0
  202. package/dist/core/util/format-age.d.ts.map +1 -0
  203. package/dist/core/util/format-age.js +86 -0
  204. package/dist/core/util/format-age.js.map +1 -0
  205. package/dist/plugins/agents/acp/acp-adapter.d.ts +3 -0
  206. package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -1
  207. package/dist/plugins/agents/acp/acp-adapter.js +12 -0
  208. package/dist/plugins/agents/acp/acp-adapter.js.map +1 -1
  209. package/dist/plugins/agents/antigravity/index.d.ts +1 -0
  210. package/dist/plugins/agents/antigravity/index.d.ts.map +1 -1
  211. package/dist/plugins/agents/antigravity/index.js +1 -0
  212. package/dist/plugins/agents/antigravity/index.js.map +1 -1
  213. package/dist/plugins/agents/claude-code/index.d.ts +1 -0
  214. package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
  215. package/dist/plugins/agents/claude-code/index.js +1 -0
  216. package/dist/plugins/agents/claude-code/index.js.map +1 -1
  217. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +22 -0
  218. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
  219. package/dist/plugins/agents/claude-code/mcp-approval-server.js +157 -0
  220. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
  221. package/dist/plugins/agents/codex/index.d.ts +1 -0
  222. package/dist/plugins/agents/codex/index.d.ts.map +1 -1
  223. package/dist/plugins/agents/codex/index.js +1 -0
  224. package/dist/plugins/agents/codex/index.js.map +1 -1
  225. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts +43 -0
  226. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts.map +1 -0
  227. package/dist/plugins/agents/cursor/ensure-mcp-config.js +99 -0
  228. package/dist/plugins/agents/cursor/ensure-mcp-config.js.map +1 -0
  229. package/dist/plugins/agents/cursor/index.d.ts +28 -0
  230. package/dist/plugins/agents/cursor/index.d.ts.map +1 -0
  231. package/dist/plugins/agents/cursor/index.js +290 -0
  232. package/dist/plugins/agents/cursor/index.js.map +1 -0
  233. package/dist/plugins/agents/native/index.d.ts +34 -0
  234. package/dist/plugins/agents/native/index.d.ts.map +1 -0
  235. package/dist/plugins/agents/native/index.js +598 -0
  236. package/dist/plugins/agents/native/index.js.map +1 -0
  237. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +1 -0
  238. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
  239. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +1 -0
  240. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
  241. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +4 -0
  242. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
  243. package/dist/plugins/messengers/wechat/ilink-adapter.js +26 -1
  244. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
  245. package/dist/web/agim-skills-api.d.ts +4 -0
  246. package/dist/web/agim-skills-api.d.ts.map +1 -0
  247. package/dist/web/agim-skills-api.js +150 -0
  248. package/dist/web/agim-skills-api.js.map +1 -0
  249. package/dist/web/background-tasks-api.d.ts +7 -0
  250. package/dist/web/background-tasks-api.d.ts.map +1 -0
  251. package/dist/web/background-tasks-api.js +225 -0
  252. package/dist/web/background-tasks-api.js.map +1 -0
  253. package/dist/web/llm-api.d.ts +8 -0
  254. package/dist/web/llm-api.d.ts.map +1 -0
  255. package/dist/web/llm-api.js +300 -0
  256. package/dist/web/llm-api.js.map +1 -0
  257. package/dist/web/mcp-api.d.ts +8 -0
  258. package/dist/web/mcp-api.d.ts.map +1 -0
  259. package/dist/web/mcp-api.js +205 -0
  260. package/dist/web/mcp-api.js.map +1 -0
  261. package/dist/web/public/assets/{a2a-Cdl8iY0e.js → a2a-06bnQicA.js} +3 -3
  262. package/dist/web/public/assets/{a2a-Cdl8iY0e.js.map → a2a-06bnQicA.js.map} +1 -1
  263. package/dist/web/public/assets/{activity-DXahuK1C.js → activity-Bhc6Esfy.js} +2 -2
  264. package/dist/web/public/assets/{activity-DXahuK1C.js.map → activity-Bhc6Esfy.js.map} +1 -1
  265. package/dist/web/public/assets/{admins-C8fJsuHC.js → admins-BVpnOw3o.js} +3 -3
  266. package/dist/web/public/assets/{admins-C8fJsuHC.js.map → admins-BVpnOw3o.js.map} +1 -1
  267. package/dist/web/public/assets/agents-Cn7D3UMz.js +7 -0
  268. package/dist/web/public/assets/agents-Cn7D3UMz.js.map +1 -0
  269. package/dist/web/public/assets/{approvals-CpyL90ef.js → approvals-BJiLyoLf.js} +3 -3
  270. package/dist/web/public/assets/{approvals-CpyL90ef.js.map → approvals-BJiLyoLf.js.map} +1 -1
  271. package/dist/web/public/assets/asks-C7gKbna1.js +7 -0
  272. package/dist/web/public/assets/asks-C7gKbna1.js.map +1 -0
  273. package/dist/web/public/assets/{audit-DDqpiC3z.js → audit-DgWZD8l5.js} +2 -2
  274. package/dist/web/public/assets/{audit-DDqpiC3z.js.map → audit-DgWZD8l5.js.map} +1 -1
  275. package/dist/web/public/assets/bell-pWZT2wlM.js +7 -0
  276. package/dist/web/public/assets/bell-pWZT2wlM.js.map +1 -0
  277. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js → bgjobs-DkAJdzHf.js} +2 -2
  278. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js.map → bgjobs-DkAJdzHf.js.map} +1 -1
  279. package/dist/web/public/assets/{brain-CJyZe3Oa.js → brain-B0mM-ro_.js} +2 -2
  280. package/dist/web/public/assets/{brain-CJyZe3Oa.js.map → brain-B0mM-ro_.js.map} +1 -1
  281. package/dist/web/public/assets/{briefcase-DcLbQF2I.js → briefcase-CUQlj33_.js} +2 -2
  282. package/dist/web/public/assets/{briefcase-DcLbQF2I.js.map → briefcase-CUQlj33_.js.map} +1 -1
  283. package/dist/web/public/assets/{chevron-right-BhKELKvM.js → chevron-right-CJuDP_fx.js} +2 -2
  284. package/dist/web/public/assets/{chevron-right-BhKELKvM.js.map → chevron-right-CJuDP_fx.js.map} +1 -1
  285. package/dist/web/public/assets/{circle-check-D1qST9RS.js → circle-check-CYse8LRx.js} +2 -2
  286. package/dist/web/public/assets/{circle-check-D1qST9RS.js.map → circle-check-CYse8LRx.js.map} +1 -1
  287. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js → circle-check-big-9NpJLA1Z.js} +2 -2
  288. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js.map → circle-check-big-9NpJLA1Z.js.map} +1 -1
  289. package/dist/web/public/assets/{circle-x-DtePUX5x.js → circle-x-BxZ24SVG.js} +2 -2
  290. package/dist/web/public/assets/{circle-x-DtePUX5x.js.map → circle-x-BxZ24SVG.js.map} +1 -1
  291. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js → confirm-dialog-CmHeZ7ei.js} +2 -2
  292. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js.map → confirm-dialog-CmHeZ7ei.js.map} +1 -1
  293. package/dist/web/public/assets/{data-table-BRLUxacD.js → data-table-tu4BIahS.js} +5 -5
  294. package/dist/web/public/assets/{data-table-BRLUxacD.js.map → data-table-tu4BIahS.js.map} +1 -1
  295. package/dist/web/public/assets/{dialog-By4YA8bm.js → dialog-D8QAkLhI.js} +3 -3
  296. package/dist/web/public/assets/{dialog-By4YA8bm.js.map → dialog-D8QAkLhI.js.map} +1 -1
  297. package/dist/web/public/assets/{download-CiTB2sCh.js → download-DBS0ZPTh.js} +2 -2
  298. package/dist/web/public/assets/{download-CiTB2sCh.js.map → download-DBS0ZPTh.js.map} +1 -1
  299. package/dist/web/public/assets/{email-H-b2AExg.js → email-DgbAEEvZ.js} +3 -3
  300. package/dist/web/public/assets/{email-H-b2AExg.js.map → email-DgbAEEvZ.js.map} +1 -1
  301. package/dist/web/public/assets/{empty-state-DZJTUlvz.js → empty-state-B1S_EYNJ.js} +2 -2
  302. package/dist/web/public/assets/{empty-state-DZJTUlvz.js.map → empty-state-B1S_EYNJ.js.map} +1 -1
  303. package/dist/web/public/assets/{external-link-CfU6Rttn.js → external-link-Dkmwlv6p.js} +2 -2
  304. package/dist/web/public/assets/{external-link-CfU6Rttn.js.map → external-link-Dkmwlv6p.js.map} +1 -1
  305. package/dist/web/public/assets/{eye-BvWcd0pJ.js → eye-Ch0DLviZ.js} +4 -4
  306. package/dist/web/public/assets/{eye-BvWcd0pJ.js.map → eye-Ch0DLviZ.js.map} +1 -1
  307. package/dist/web/public/assets/{facts-BRDbQLSI.js → facts-C3YV1Mkp.js} +2 -2
  308. package/dist/web/public/assets/{facts-BRDbQLSI.js.map → facts-C3YV1Mkp.js.map} +1 -1
  309. package/dist/web/public/assets/goals-DEt5gGry.js +17 -0
  310. package/dist/web/public/assets/goals-DEt5gGry.js.map +1 -0
  311. package/dist/web/public/assets/{health-DJPFOiKw.js → health-DuB9uNiZ.js} +2 -2
  312. package/dist/web/public/assets/{health-DJPFOiKw.js.map → health-DuB9uNiZ.js.map} +1 -1
  313. package/dist/web/public/assets/heart-pulse-CD8xNAGs.js +7 -0
  314. package/dist/web/public/assets/heart-pulse-CD8xNAGs.js.map +1 -0
  315. package/dist/web/public/assets/heartbeat-DbR8VwmG.js +7 -0
  316. package/dist/web/public/assets/heartbeat-DbR8VwmG.js.map +1 -0
  317. package/dist/web/public/assets/hot-izk3vGQB.js +17 -0
  318. package/dist/web/public/assets/hot-izk3vGQB.js.map +1 -0
  319. package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
  320. package/dist/web/public/assets/index-BY1vfCja.js +166 -0
  321. package/dist/web/public/assets/index-BY1vfCja.js.map +1 -0
  322. package/dist/web/public/assets/installed-BXB3-YIy.js +31 -0
  323. package/dist/web/public/assets/installed-BXB3-YIy.js.map +1 -0
  324. package/dist/web/public/assets/{jobs-DdWaBgOh.js → jobs-DkbM4mIQ.js} +2 -2
  325. package/dist/web/public/assets/{jobs-DdWaBgOh.js.map → jobs-DkbM4mIQ.js.map} +1 -1
  326. package/dist/web/public/assets/{layout-Dr12u0W_.js → layout-5ePj6Bek.js} +2 -2
  327. package/dist/web/public/assets/{layout-Dr12u0W_.js.map → layout-5ePj6Bek.js.map} +1 -1
  328. package/dist/web/public/assets/layout-B5Dzy_Zc.js +2 -0
  329. package/dist/web/public/assets/layout-B5Dzy_Zc.js.map +1 -0
  330. package/dist/web/public/assets/layout-BZpbNQFb.js +2 -0
  331. package/dist/web/public/assets/layout-BZpbNQFb.js.map +1 -0
  332. package/dist/web/public/assets/layout-DY9Xq34u.js +2 -0
  333. package/dist/web/public/assets/layout-DY9Xq34u.js.map +1 -0
  334. package/dist/web/public/assets/{layout-BybpkTy0.js → layout-DxzBaeTv.js} +2 -2
  335. package/dist/web/public/assets/{layout-BybpkTy0.js.map → layout-DxzBaeTv.js.map} +1 -1
  336. package/dist/web/public/assets/llm-Dg4W7eRM.js +7 -0
  337. package/dist/web/public/assets/llm-Dg4W7eRM.js.map +1 -0
  338. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js → loader-circle-pGNYdPoE.js} +2 -2
  339. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js.map → loader-circle-pGNYdPoE.js.map} +1 -1
  340. package/dist/web/public/assets/{map-pin-B8hea8yW.js → map-pin-D1UX9mg7.js} +2 -2
  341. package/dist/web/public/assets/{map-pin-B8hea8yW.js.map → map-pin-D1UX9mg7.js.map} +1 -1
  342. package/dist/web/public/assets/mcp-uoOzu4_J.js +7 -0
  343. package/dist/web/public/assets/mcp-uoOzu4_J.js.map +1 -0
  344. package/dist/web/public/assets/{memos-C0_I1Uzt.js → memos-CAWASHg5.js} +2 -2
  345. package/dist/web/public/assets/{memos-C0_I1Uzt.js.map → memos-CAWASHg5.js.map} +1 -1
  346. package/dist/web/public/assets/{messengers-DuS5_JlE.js → messengers-B1-mZms8.js} +3 -3
  347. package/dist/web/public/assets/{messengers-DuS5_JlE.js.map → messengers-B1-mZms8.js.map} +1 -1
  348. package/dist/web/public/assets/native-agent-UuVvvzsW.js +7 -0
  349. package/dist/web/public/assets/native-agent-UuVvvzsW.js.map +1 -0
  350. package/dist/web/public/assets/{network-CpkocMHV.js → network-DpjSgAwW.js} +2 -2
  351. package/dist/web/public/assets/{network-CpkocMHV.js.map → network-DpjSgAwW.js.map} +1 -1
  352. package/dist/web/public/assets/{outbox-mGqTV2Ex.js → outbox-DeAgiXkY.js} +3 -3
  353. package/dist/web/public/assets/{outbox-mGqTV2Ex.js.map → outbox-DeAgiXkY.js.map} +1 -1
  354. package/dist/web/public/assets/{pagination-BAYvy11u.js → pagination-5GD_he3L.js} +3 -3
  355. package/dist/web/public/assets/{pagination-BAYvy11u.js.map → pagination-5GD_he3L.js.map} +1 -1
  356. package/dist/web/public/assets/{persona-CM0TLPJa.js → persona-BhkDCmeB.js} +2 -2
  357. package/dist/web/public/assets/{persona-CM0TLPJa.js.map → persona-BhkDCmeB.js.map} +1 -1
  358. package/dist/web/public/assets/{play-DMgMpe7N.js → play-B7o6cJ8W.js} +2 -2
  359. package/dist/web/public/assets/{play-DMgMpe7N.js.map → play-B7o6cJ8W.js.map} +1 -1
  360. package/dist/web/public/assets/plus-C5d4C6Zp.js +7 -0
  361. package/dist/web/public/assets/plus-C5d4C6Zp.js.map +1 -0
  362. package/dist/web/public/assets/policy-Ct_sKm3Y.js +2 -0
  363. package/dist/web/public/assets/{policy-Ch-xirrA.js.map → policy-Ct_sKm3Y.js.map} +1 -1
  364. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js → refresh-ccw-BlXMN3UX.js} +2 -2
  365. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js.map → refresh-ccw-BlXMN3UX.js.map} +1 -1
  366. package/dist/web/public/assets/{reminders-Dbe7Rc4h.js → reminders-gb1Y0S3t.js} +4 -9
  367. package/dist/web/public/assets/reminders-gb1Y0S3t.js.map +1 -0
  368. package/dist/web/public/assets/{save-1aALBaZc.js → save-DAFuApnY.js} +2 -2
  369. package/dist/web/public/assets/{save-1aALBaZc.js.map → save-DAFuApnY.js.map} +1 -1
  370. package/dist/web/public/assets/{schedules-BBQ2wcnS.js → schedules-CtFumT2B.js} +3 -3
  371. package/dist/web/public/assets/{schedules-BBQ2wcnS.js.map → schedules-CtFumT2B.js.map} +1 -1
  372. package/dist/web/public/assets/{search-DDYjsJ7-.js → search-BWuZE0YD.js} +2 -2
  373. package/dist/web/public/assets/{search-DDYjsJ7-.js.map → search-BWuZE0YD.js.map} +1 -1
  374. package/dist/web/public/assets/{service-DMp11TKF.js → service-lah7RWEc.js} +3 -3
  375. package/dist/web/public/assets/{service-DMp11TKF.js.map → service-lah7RWEc.js.map} +1 -1
  376. package/dist/web/public/assets/{status-badge-Cvj81JKi.js → status-badge-BgmFa_8z.js} +2 -2
  377. package/dist/web/public/assets/{status-badge-Cvj81JKi.js.map → status-badge-BgmFa_8z.js.map} +1 -1
  378. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js → subtasks-CgqrOGhl.js} +3 -3
  379. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js.map → subtasks-CgqrOGhl.js.map} +1 -1
  380. package/dist/web/public/assets/{table-B6nK6k3L.js → table-BhDzIBvB.js} +2 -2
  381. package/dist/web/public/assets/{table-B6nK6k3L.js.map → table-BhDzIBvB.js.map} +1 -1
  382. package/dist/web/public/assets/{topn-BwFh2jKv.js → topn-DXgTCdM_.js} +3 -3
  383. package/dist/web/public/assets/{topn-BwFh2jKv.js.map → topn-DXgTCdM_.js.map} +1 -1
  384. package/dist/web/public/assets/{trash-2-CqpMjbu5.js → trash-2-i4F_Rzh3.js} +3 -3
  385. package/dist/web/public/assets/{trash-2-CqpMjbu5.js.map → trash-2-i4F_Rzh3.js.map} +1 -1
  386. package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js +2 -0
  387. package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js.map +1 -0
  388. package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js +2 -0
  389. package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js.map +1 -0
  390. package/dist/web/public/assets/{use-memory-jxZdt-RL.js → use-memory-B_RQWQyG.js} +2 -2
  391. package/dist/web/public/assets/{use-memory-jxZdt-RL.js.map → use-memory-B_RQWQyG.js.map} +1 -1
  392. package/dist/web/public/assets/{use-observability-9TDgLO9y.js → use-observability-CCTN-a71.js} +2 -2
  393. package/dist/web/public/assets/{use-observability-9TDgLO9y.js.map → use-observability-CCTN-a71.js.map} +1 -1
  394. package/dist/web/public/assets/{use-settings-DFB_c2pr.js → use-settings-D4EdDLiK.js} +2 -2
  395. package/dist/web/public/assets/{use-settings-DFB_c2pr.js.map → use-settings-D4EdDLiK.js.map} +1 -1
  396. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js → use-workspace-BhTEp_QH.js} +2 -2
  397. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js.map → use-workspace-BhTEp_QH.js.map} +1 -1
  398. package/dist/web/public/assets/useQuery-DmoWKLw3.js +2 -0
  399. package/dist/web/public/assets/{useQuery-rLmHxFp4.js.map → useQuery-DmoWKLw3.js.map} +1 -1
  400. package/dist/web/public/assets/{vector-D9UqmLi6.js → vector-By-cheMu.js} +2 -2
  401. package/dist/web/public/assets/{vector-D9UqmLi6.js.map → vector-By-cheMu.js.map} +1 -1
  402. package/dist/web/public/assets/{viewer-_OpObeWr.js → viewer-CJNrz2iw.js} +3 -3
  403. package/dist/web/public/assets/{viewer-_OpObeWr.js.map → viewer-CJNrz2iw.js.map} +1 -1
  404. package/dist/web/public/assets/{workspace-DSHRdspq.js → workspace-DvYlIAhu.js} +4 -4
  405. package/dist/web/public/assets/{workspace-DSHRdspq.js.map → workspace-DvYlIAhu.js.map} +1 -1
  406. package/dist/web/public/assets/{workspaces-CsBdhbXz.js → workspaces-2pn73O-K.js} +3 -3
  407. package/dist/web/public/assets/{workspaces-CsBdhbXz.js.map → workspaces-2pn73O-K.js.map} +1 -1
  408. package/dist/web/public/assets/{x-D1re-vBd.js → x-5Z_de5zo.js} +2 -2
  409. package/dist/web/public/assets/{x-D1re-vBd.js.map → x-5Z_de5zo.js.map} +1 -1
  410. package/dist/web/public/index.html +2 -2
  411. package/dist/web/server.d.ts.map +1 -1
  412. package/dist/web/server.js +45 -0
  413. package/dist/web/server.js.map +1 -1
  414. package/package.json +2 -2
  415. package/dist/web/public/assets/agents-lrzFDGgX.js +0 -12
  416. package/dist/web/public/assets/agents-lrzFDGgX.js.map +0 -1
  417. package/dist/web/public/assets/hot-CFGHGkqL.js +0 -17
  418. package/dist/web/public/assets/hot-CFGHGkqL.js.map +0 -1
  419. package/dist/web/public/assets/index-C4hk1i67.js +0 -166
  420. package/dist/web/public/assets/index-C4hk1i67.js.map +0 -1
  421. package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
  422. package/dist/web/public/assets/installed-UONWfKHS.js +0 -7
  423. package/dist/web/public/assets/installed-UONWfKHS.js.map +0 -1
  424. package/dist/web/public/assets/layout-C8_IQRGM.js +0 -2
  425. package/dist/web/public/assets/layout-C8_IQRGM.js.map +0 -1
  426. package/dist/web/public/assets/layout-CxRHLqvi.js +0 -2
  427. package/dist/web/public/assets/layout-CxRHLqvi.js.map +0 -1
  428. package/dist/web/public/assets/layout-LC5zjw1h.js +0 -2
  429. package/dist/web/public/assets/layout-LC5zjw1h.js.map +0 -1
  430. package/dist/web/public/assets/policy-Ch-xirrA.js +0 -2
  431. package/dist/web/public/assets/reminders-Dbe7Rc4h.js.map +0 -1
  432. package/dist/web/public/assets/use-skills-OZKB5x-S.js +0 -2
  433. package/dist/web/public/assets/use-skills-OZKB5x-S.js.map +0 -1
  434. package/dist/web/public/assets/useQuery-rLmHxFp4.js +0 -2
@@ -0,0 +1,577 @@
1
+ // skills/loader — agim-owned SKILL.md loader (Stage 3 / P0 #3).
2
+ //
3
+ // What a "skill" is, in agim:
4
+ // - A directory containing exactly one `SKILL.md` file
5
+ // - YAML-ish frontmatter with `name`, `description`, optional `always`
6
+ // and `metadata.agim.requires.{bins,env}`
7
+ // - A markdown body the agent reads on-demand (tier 2)
8
+ // - Optional `scripts/` / `references/` / `assets/` subdirs the body
9
+ // can refer to (tier 3)
10
+ //
11
+ // Three-tier progressive disclosure (modelled on nanobot):
12
+ //
13
+ // tier 1: name + description, injected into every system prompt as a
14
+ // "skills available" block. Cheap (~30-50 tokens per skill).
15
+ // tier 2: full SKILL.md body, fetched on-demand via the
16
+ // mcp__imhub__read_skill MCP tool when the agent decides the
17
+ // description matches the user's intent.
18
+ // tier 3: any file inside scripts/ / references/ / assets/ — read
19
+ // via the model's existing file-read tool when the body
20
+ // references the path.
21
+ //
22
+ // Discovery scope (Stage 3 cut):
23
+ //
24
+ // * `~/.agim/skills/<name>/SKILL.md` — operator-owned (highest priority)
25
+ // * `<agim-dist>/skills/builtin/<name>/SKILL.md` — packaged with agim
26
+ //
27
+ // Name shadowing: workspace skills replace built-ins with the same name.
28
+ // This matches nanobot's behaviour and gives operators a clean override
29
+ // path without touching the install tree.
30
+ //
31
+ // Stage-3 limits:
32
+ // - YAML parsing is intentionally minimal (regex-only). Skills using
33
+ // fancy YAML features (nested objects beyond `metadata`, multi-line
34
+ // strings without quotes) will fall back to a graceful "ignore that
35
+ // field" instead of crashing. Real YAML lands when we hit a skill
36
+ // that needs it.
37
+ // - We do NOT discover skills inside the user's per-agent workspace
38
+ // (`~/.agim-workspaces/<agent>/skills/`); those are managed by the
39
+ // CLI agent itself (Claude Code et al). This loader is exclusively
40
+ // for the agim-injected skills that ALL agents see.
41
+ import { existsSync, readdirSync, readFileSync, statSync, writeFileSync, mkdirSync, rmSync } from 'node:fs';
42
+ import { join, resolve, dirname } from 'node:path';
43
+ import { fileURLToPath } from 'node:url';
44
+ import { logger as rootLogger } from '../logger.js';
45
+ import { AGIM_HOME } from '../agim-paths.js';
46
+ const log = rootLogger.child({ component: 'skills-loader' });
47
+ /** Hard cap on the SKILL.md size we'll read. Skills longer than this
48
+ * almost always indicate a misconfigured doc dropped into the skills
49
+ * dir; we ignore the body to keep injection cheap and audit-able. */
50
+ export const MAX_SKILL_BODY_CHARS = 32_000;
51
+ /** Tier-1 description hard cap. Long descriptions inflate the system
52
+ * prompt budget for every turn; truncate with "…" so the operator
53
+ * immediately notices when the cap was hit. */
54
+ export const MAX_DESCRIPTION_CHARS = 400;
55
+ /** Maximum skills we'll inject into a single system prompt block.
56
+ * Above this, the agent is better served by a `/skill list` overview
57
+ * + on-demand `read_skill` than a wall of text. */
58
+ export const MAX_INJECTED_SKILLS = 32;
59
+ let cache = null;
60
+ /** Default cache TTL — skills don't change often, but we re-scan
61
+ * every 5 minutes so operators don't have to `/skill refresh` after
62
+ * dropping a new SKILL.md on disk. */
63
+ const CACHE_TTL_MS = 5 * 60 * 1000;
64
+ /** Resolve the agim-owned workspace skills directory. This is the
65
+ * WRITE target: writeSkillFile / deleteSkill / the web editor all
66
+ * land files here regardless of what extra read-only roots are
67
+ * configured. Override via env for tests / custom deployments. */
68
+ function workspaceSkillsDir() {
69
+ const override = process.env.IMHUB_SKILLS_WORKSPACE_DIR;
70
+ if (override)
71
+ return override;
72
+ return join(AGIM_HOME, 'skills');
73
+ }
74
+ /** Resolve operator's skill discovery mode. See loadSkillsRoots(). */
75
+ function currentSkillsMode() {
76
+ const raw = (process.env.IMHUB_SKILLS_MODE || 'auto').trim().toLowerCase();
77
+ if (raw === 'agim-only' || raw === 'agim_only')
78
+ return 'agim-only';
79
+ if (raw === 'custom')
80
+ return 'custom';
81
+ return 'auto';
82
+ }
83
+ /** Helper: convert ~ to $HOME and resolve to absolute. */
84
+ function expandHome(p) {
85
+ if (!p)
86
+ return p;
87
+ if (p === '~')
88
+ return process.env.HOME || p;
89
+ if (p.startsWith('~/'))
90
+ return join(process.env.HOME || '~', p.slice(2));
91
+ return p;
92
+ }
93
+ /** Parse a `:` or `,` separated list of paths from env, expanding ~. */
94
+ function parseRootsList(raw) {
95
+ if (!raw)
96
+ return [];
97
+ return raw
98
+ .split(/[:,]/)
99
+ .map((s) => s.trim())
100
+ .filter(Boolean)
101
+ .map(expandHome);
102
+ }
103
+ /**
104
+ * Resolve the ordered list of skill discovery roots (highest priority
105
+ * first). The agim-owned `workspaceSkillsDir()` is ALWAYS at index 0
106
+ * — it's the write target and must shadow same-named entries in
107
+ * inherited roots so operator-installed skills can override defaults.
108
+ *
109
+ * Modes:
110
+ * - `auto` (default): workspace + ~/.claude/skills + ~/.config/opencode/skills
111
+ * + ~/.codex/skills. Reflects the typical "I installed all three
112
+ * CLI agents and they share via symlink" layout — agim sees
113
+ * 100+ shared skills out of the box without extra config.
114
+ * Honors IMHUB_SKILLS_EXTRA_ROOTS for adding more.
115
+ * - `agim-only`: only the workspace dir. For deployments that want
116
+ * isolation from per-user CLI agent directories.
117
+ * - `custom`: workspace + IMHUB_SKILLS_ROOTS (explicit operator list).
118
+ *
119
+ * The builtin dir is NOT included here — it's tier-0 (bundled with agim)
120
+ * and scanned separately as a last resort in doScan().
121
+ */
122
+ export function resolveSkillsRoots() {
123
+ const ws = workspaceSkillsDir();
124
+ const mode = currentSkillsMode();
125
+ const extra = parseRootsList(process.env.IMHUB_SKILLS_EXTRA_ROOTS);
126
+ if (mode === 'agim-only')
127
+ return [ws];
128
+ if (mode === 'custom') {
129
+ const explicit = parseRootsList(process.env.IMHUB_SKILLS_ROOTS);
130
+ return Array.from(new Set([ws, ...explicit, ...extra]));
131
+ }
132
+ // auto: workspace + common CLI agent skill dirs (read-only inherit).
133
+ const home = process.env.HOME || '/root';
134
+ const autoExtras = [
135
+ join(home, '.claude', 'skills'),
136
+ join(home, '.config', 'opencode', 'skills'),
137
+ join(home, '.codex', 'skills'),
138
+ ];
139
+ return Array.from(new Set([ws, ...autoExtras, ...extra]));
140
+ }
141
+ /** Public describe-only API for the web admin / diagnostics. Returns
142
+ * a snapshot of the active mode + the roots that will be scanned. */
143
+ export function describeSkillsConfig() {
144
+ return {
145
+ mode: currentSkillsMode(),
146
+ writeRoot: workspaceSkillsDir(),
147
+ readRoots: resolveSkillsRoots(),
148
+ builtinRoot: builtinSkillsDir(),
149
+ };
150
+ }
151
+ /** Resolve the bundled-builtin skills directory. We look next to the
152
+ * current module file (after build → dist/core/skills/) then walk up
153
+ * to find `skills/builtin`. Falls back to the src tree during dev. */
154
+ function builtinSkillsDir() {
155
+ const override = process.env.IMHUB_SKILLS_BUILTIN_DIR;
156
+ if (override)
157
+ return override;
158
+ // import.meta.url works in both dev (tsx / bun) and built dist (esm).
159
+ const thisDir = dirname(fileURLToPath(import.meta.url));
160
+ // Most likely locations relative to this module:
161
+ // dev: /workspace/src/core/skills/loader.ts → /workspace/src/core/skills/builtin
162
+ // built: /workspace/dist/core/skills/loader.js → /workspace/dist/core/skills/builtin
163
+ const localCandidate = resolve(thisDir, 'builtin');
164
+ if (existsSync(localCandidate))
165
+ return localCandidate;
166
+ // Fall back to repo root (rare; happens when tests resolve from /tmp).
167
+ const repoCandidate = resolve(thisDir, '..', '..', '..', 'src', 'core', 'skills', 'builtin');
168
+ if (existsSync(repoCandidate))
169
+ return repoCandidate;
170
+ return localCandidate; // path may not exist; that's fine — scan handles it
171
+ }
172
+ // ─── Public API ──────────────────────────────────────────────────────
173
+ /** Force a fresh disk scan on next call. Returned by /skill refresh. */
174
+ export function invalidateSkillsCache() {
175
+ cache = null;
176
+ }
177
+ /**
178
+ * Write (create-or-overwrite) a workspace SKILL.md (P1 web editor).
179
+ *
180
+ * - Lands at <workspaceSkillsDir>/<name>/SKILL.md (operator path,
181
+ * not builtin) so subsequent scans pick it up and it shadows any
182
+ * same-named builtin.
183
+ * - name is sanitized to safe filesystem chars (no '..', no
184
+ * leading dots, no slashes). Returns null on invalid name.
185
+ * - Body MUST already include the YAML frontmatter; we validate
186
+ * it parses + has a description before writing so the editor
187
+ * can't ship a broken SKILL.md. Returns the parsed SkillMeta
188
+ * on success.
189
+ * - Invalidates the cache so listSkills() picks up the new file
190
+ * on next call.
191
+ */
192
+ export function writeSkillFile(name, body) {
193
+ const safe = sanitizeSkillName(name);
194
+ if (!safe)
195
+ return null;
196
+ const probe = parseSkill({ name: safe, dir: '<probe>', source: 'workspace', body });
197
+ if (!probe)
198
+ return null;
199
+ if (body.length > MAX_SKILL_BODY_CHARS) {
200
+ log.warn({ event: 'skills.write.too_long', name: safe, len: body.length });
201
+ return null;
202
+ }
203
+ const dir = join(workspaceSkillsDir(), safe);
204
+ try {
205
+ mkdirSync(dir, { recursive: true });
206
+ writeFileSync(join(dir, 'SKILL.md'), body, 'utf-8');
207
+ }
208
+ catch (err) {
209
+ log.warn({ event: 'skills.write.failed', name: safe, err: String(err) });
210
+ return null;
211
+ }
212
+ invalidateSkillsCache();
213
+ return getSkillByName(safe);
214
+ }
215
+ /**
216
+ * Delete a workspace skill. Builtin (bundled) skills can't be
217
+ * deleted — operators have to shadow them with a workspace entry
218
+ * (which writeSkillFile does for them). Returns true iff a file
219
+ * was actually unlinked.
220
+ */
221
+ export function deleteSkill(name) {
222
+ const safe = sanitizeSkillName(name);
223
+ if (!safe)
224
+ return false;
225
+ const path = join(workspaceSkillsDir(), safe, 'SKILL.md');
226
+ if (!existsSync(path))
227
+ return false;
228
+ try {
229
+ rmSync(join(workspaceSkillsDir(), safe), { recursive: true, force: true });
230
+ }
231
+ catch (err) {
232
+ log.warn({ event: 'skills.delete.failed', name: safe, err: String(err) });
233
+ return false;
234
+ }
235
+ invalidateSkillsCache();
236
+ return true;
237
+ }
238
+ /** Sanitize a skill name for filesystem use. */
239
+ function sanitizeSkillName(raw) {
240
+ const trimmed = raw.trim();
241
+ if (!trimmed || trimmed.length > 64)
242
+ return '';
243
+ if (trimmed === '.' || trimmed === '..')
244
+ return '';
245
+ if (trimmed.startsWith('.'))
246
+ return '';
247
+ if (!/^[A-Za-z0-9._-]+$/.test(trimmed))
248
+ return '';
249
+ return trimmed;
250
+ }
251
+ /** Read-only access to the loaded skill list. Triggers a scan on first
252
+ * call or when the cache has expired. Never throws — disk errors yield
253
+ * the partial list discovered up to that point. */
254
+ export function listSkills() {
255
+ return ensureCache().skills;
256
+ }
257
+ /** Look up one skill by name (case-insensitive). Returns null when
258
+ * unknown; caller decides whether to surface "no such skill" to the
259
+ * agent or the operator. */
260
+ export function getSkillByName(name) {
261
+ return ensureCache().byName.get(name.toLowerCase()) ?? null;
262
+ }
263
+ /** Read the full SKILL.md body for a known skill. Returns null on
264
+ * unknown name OR read failure. Honors the MAX_SKILL_BODY_CHARS cap;
265
+ * oversize files come back truncated with a `[truncated …]` footer. */
266
+ export function readSkillBody(name) {
267
+ const skill = getSkillByName(name);
268
+ if (!skill)
269
+ return null;
270
+ const path = join(skill.dir, 'SKILL.md');
271
+ try {
272
+ const raw = readFileSync(path, 'utf-8');
273
+ if (raw.length <= MAX_SKILL_BODY_CHARS)
274
+ return raw;
275
+ return `${raw.slice(0, MAX_SKILL_BODY_CHARS)}\n\n[truncated to ${MAX_SKILL_BODY_CHARS} chars by agim skills loader]`;
276
+ }
277
+ catch (err) {
278
+ log.warn({ event: 'skills.body_read_failed', name, err: String(err) });
279
+ return null;
280
+ }
281
+ }
282
+ /**
283
+ * Build the tier-1 system-prompt block. Injected once per turn by the
284
+ * router. Returns '' when no skills are configured (router drops empty
285
+ * blocks). Bounded to MAX_INJECTED_SKILLS rows; above the cap we keep
286
+ * the first N alphabetically and append a one-line "+ N more (call
287
+ * /skill list to see)" note.
288
+ *
289
+ * Format (kept close to nanobot's so models trained on its docs feel
290
+ * at home):
291
+ *
292
+ * [agim skills available — read full body with mcp__imhub__read_skill(name)]
293
+ * - skill-a: one-line description
294
+ * - skill-b: one-line description (unavailable: missing bin `foo`)
295
+ * - skill-c: one-line description
296
+ * …
297
+ */
298
+ export function buildSkillsSummary() {
299
+ const all = listSkills();
300
+ if (all.length === 0)
301
+ return '';
302
+ const sorted = all.slice().sort((a, b) => a.name.localeCompare(b.name));
303
+ const lines = ['[agim skills available — read full body with mcp__imhub__read_skill(name)]'];
304
+ const visible = sorted.slice(0, MAX_INJECTED_SKILLS);
305
+ for (const s of visible) {
306
+ const reason = s.available ? '' : ` (unavailable: ${s.unavailableReason ?? 'requires not met'})`;
307
+ const flag = s.always ? ' [always]' : '';
308
+ lines.push(`- ${s.name}: ${s.description}${reason}${flag}`);
309
+ }
310
+ if (sorted.length > visible.length) {
311
+ lines.push(`… and ${sorted.length - visible.length} more (use /skill list to see them all)`);
312
+ }
313
+ // Inline `always: true` skills' full bodies. Cheap when few; we bound
314
+ // by injected count above so the agent's prompt budget can't explode.
315
+ const alwaysOn = visible.filter((s) => s.always && s.available);
316
+ for (const s of alwaysOn) {
317
+ const body = readSkillBody(s.name);
318
+ if (!body)
319
+ continue;
320
+ lines.push('');
321
+ lines.push(`### Always-on skill: ${s.name}`);
322
+ lines.push(body);
323
+ }
324
+ return `${lines.join('\n')}\n`;
325
+ }
326
+ // ─── Scanning ────────────────────────────────────────────────────────
327
+ function ensureCache() {
328
+ if (cache && Date.now() - cache.scannedAt < CACHE_TTL_MS)
329
+ return cache;
330
+ cache = doScan();
331
+ return cache;
332
+ }
333
+ function doScan() {
334
+ const discovered = [];
335
+ // 1. Walk the configured roots in priority order. The first root is
336
+ // always the agim-owned workspace dir, so any operator-installed
337
+ // skill shadows same-named entries from inherited CLI agent dirs.
338
+ const roots = resolveSkillsRoots();
339
+ const seen = new Set();
340
+ for (const root of roots) {
341
+ const found = [];
342
+ scanDir(root, 'workspace', found);
343
+ for (const f of found) {
344
+ if (seen.has(f.name))
345
+ continue;
346
+ seen.add(f.name);
347
+ discovered.push(f);
348
+ }
349
+ }
350
+ // 2. built-in tier 0; skip names already taken by any root above.
351
+ const builtinDir = builtinSkillsDir();
352
+ const builtinFound = [];
353
+ scanDir(builtinDir, 'builtin', builtinFound);
354
+ for (const b of builtinFound) {
355
+ if (seen.has(b.name))
356
+ continue;
357
+ seen.add(b.name);
358
+ discovered.push(b);
359
+ }
360
+ const skills = [];
361
+ for (const d of discovered) {
362
+ const meta = parseSkill(d);
363
+ if (meta)
364
+ skills.push(meta);
365
+ }
366
+ const byName = new Map();
367
+ for (const s of skills)
368
+ byName.set(s.name.toLowerCase(), s);
369
+ log.info({
370
+ event: 'skills.scanned',
371
+ mode: currentSkillsMode(),
372
+ roots,
373
+ builtinDir,
374
+ total: skills.length,
375
+ available: skills.filter((s) => s.available).length,
376
+ });
377
+ return { scannedAt: Date.now(), skills, byName };
378
+ }
379
+ function scanDir(dir, source, out) {
380
+ if (!dir || !existsSync(dir))
381
+ return;
382
+ let entries = [];
383
+ try {
384
+ entries = readdirSync(dir);
385
+ }
386
+ catch (err) {
387
+ log.debug({ event: 'skills.scan.readdir_failed', dir, err: String(err) });
388
+ return;
389
+ }
390
+ for (const name of entries) {
391
+ if (name.startsWith('.'))
392
+ continue;
393
+ const skillDir = join(dir, name);
394
+ let st;
395
+ try {
396
+ st = statSync(skillDir);
397
+ }
398
+ catch {
399
+ continue;
400
+ }
401
+ if (!st.isDirectory())
402
+ continue;
403
+ const md = join(skillDir, 'SKILL.md');
404
+ if (!existsSync(md))
405
+ continue;
406
+ let body = '';
407
+ try {
408
+ const raw = readFileSync(md, 'utf-8');
409
+ body = raw.length > MAX_SKILL_BODY_CHARS
410
+ ? raw.slice(0, MAX_SKILL_BODY_CHARS)
411
+ : raw;
412
+ }
413
+ catch (err) {
414
+ log.warn({ event: 'skills.scan.read_failed', dir: skillDir, err: String(err) });
415
+ continue;
416
+ }
417
+ out.push({ name, dir: skillDir, source, body });
418
+ }
419
+ }
420
+ /**
421
+ * Parse a discovered SKILL.md into a SkillMeta. Returns null when the
422
+ * frontmatter is missing required fields — we don't load corrupt
423
+ * skills, but we DO log a warning so the operator notices.
424
+ */
425
+ function parseSkill(d) {
426
+ const front = extractFrontmatter(d.body);
427
+ if (!front) {
428
+ log.warn({ event: 'skills.parse.no_frontmatter', name: d.name, dir: d.dir });
429
+ return null;
430
+ }
431
+ const name = (front.name || d.name).trim();
432
+ if (!name)
433
+ return null;
434
+ const description = (front.description || '').trim().slice(0, MAX_DESCRIPTION_CHARS);
435
+ if (!description) {
436
+ log.warn({ event: 'skills.parse.no_description', name, dir: d.dir });
437
+ return null;
438
+ }
439
+ const always = parseBool(front.always);
440
+ const requiresBins = parseRequiresList(front, 'bins');
441
+ const requiresEnv = parseRequiresList(front, 'env');
442
+ let available = true;
443
+ let unavailableReason;
444
+ const missingBins = requiresBins.filter((b) => !isBinOnPath(b));
445
+ if (missingBins.length > 0) {
446
+ available = false;
447
+ unavailableReason = `missing bin${missingBins.length === 1 ? '' : 's'} ${missingBins.map((b) => `\`${b}\``).join(', ')}`;
448
+ }
449
+ else {
450
+ const missingEnv = requiresEnv.filter((e) => !process.env[e]);
451
+ if (missingEnv.length > 0) {
452
+ available = false;
453
+ unavailableReason = `missing env ${missingEnv.map((e) => `\`${e}\``).join(', ')}`;
454
+ }
455
+ }
456
+ return {
457
+ name,
458
+ description,
459
+ source: d.source,
460
+ dir: d.dir,
461
+ always,
462
+ requiresBins,
463
+ requiresEnv,
464
+ available,
465
+ unavailableReason,
466
+ };
467
+ }
468
+ /**
469
+ * Extract the YAML-ish frontmatter (between `---` delimiters at the
470
+ * top of the file). Returns null when missing.
471
+ *
472
+ * Limited parser — handles:
473
+ * key: value
474
+ * key: "quoted value"
475
+ * metadata: '{"agim":{"requires":{"bins":["x"],"env":["Y"]}}}'
476
+ *
477
+ * Doesn't handle multi-line strings, nested block mappings (other than
478
+ * the metadata JSON shortcut), or list literals beyond simple
479
+ * comma-separated `[a, b, c]` inside the metadata JSON. Skills that
480
+ * need richer YAML can wait for a real parser.
481
+ */
482
+ function extractFrontmatter(body) {
483
+ if (!body.startsWith('---'))
484
+ return null;
485
+ // Find the closing delimiter; tolerate \r\n.
486
+ const closeIdx = body.indexOf('\n---', 3);
487
+ if (closeIdx === -1)
488
+ return null;
489
+ const raw = body.slice(3, closeIdx).trim();
490
+ const front = {};
491
+ for (const line of raw.split('\n')) {
492
+ const m = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*:\s*(.*)$/);
493
+ if (!m)
494
+ continue;
495
+ const key = m[1];
496
+ const value = stripQuotes(m[2].trim());
497
+ if (key === 'name')
498
+ front.name = value;
499
+ else if (key === 'description')
500
+ front.description = value;
501
+ else if (key === 'always')
502
+ front.always = value;
503
+ else if (key === 'metadata')
504
+ front.metadataJson = value;
505
+ }
506
+ return front;
507
+ }
508
+ function stripQuotes(s) {
509
+ if (s.length >= 2 && ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'")))) {
510
+ return s.slice(1, -1);
511
+ }
512
+ return s;
513
+ }
514
+ function parseBool(raw) {
515
+ if (!raw)
516
+ return false;
517
+ const v = raw.toLowerCase();
518
+ return v === 'true' || v === 'yes' || v === '1';
519
+ }
520
+ /**
521
+ * Pull `bins` or `env` out of the metadata JSON shortcut. Format:
522
+ *
523
+ * metadata: '{"agim":{"requires":{"bins":["x"],"env":["Y"]}}}'
524
+ *
525
+ * Also accepts the legacy `openclaw` key (nanobot's name) for
526
+ * compatibility with skills written for nanobot.
527
+ */
528
+ function parseRequiresList(front, which) {
529
+ if (!front.metadataJson)
530
+ return [];
531
+ let obj;
532
+ try {
533
+ obj = JSON.parse(front.metadataJson);
534
+ }
535
+ catch {
536
+ return [];
537
+ }
538
+ const nestedAgim = (obj.agim && typeof obj.agim === 'object') ? obj.agim : null;
539
+ const nestedOpenclaw = (obj.openclaw && typeof obj.openclaw === 'object') ? obj.openclaw : null;
540
+ const nested = nestedAgim ?? nestedOpenclaw;
541
+ if (!nested)
542
+ return [];
543
+ const requires = (nested.requires && typeof nested.requires === 'object') ? nested.requires : null;
544
+ if (!requires)
545
+ return [];
546
+ const arr = requires[which];
547
+ if (!Array.isArray(arr))
548
+ return [];
549
+ return arr.filter((v) => typeof v === 'string' && v.length > 0);
550
+ }
551
+ function isBinOnPath(bin) {
552
+ // Cheap synchronous PATH probe. Doesn't follow symlinks; that's fine
553
+ // for a "is this binary likely to work?" hint.
554
+ if (!bin || bin.includes('/')) {
555
+ // If the skill declared an absolute path, just check existence.
556
+ return existsSync(bin);
557
+ }
558
+ const pathEnv = process.env.PATH || '';
559
+ const sep = process.platform === 'win32' ? ';' : ':';
560
+ const exts = process.platform === 'win32'
561
+ ? (process.env.PATHEXT || '.COM;.EXE;.BAT;.CMD').split(';').map((e) => e.toLowerCase())
562
+ : [''];
563
+ for (const dir of pathEnv.split(sep)) {
564
+ if (!dir)
565
+ continue;
566
+ for (const ext of exts) {
567
+ const candidate = join(dir, ext ? `${bin}${ext}` : bin);
568
+ try {
569
+ if (existsSync(candidate))
570
+ return true;
571
+ }
572
+ catch { /* ignore */ }
573
+ }
574
+ }
575
+ return false;
576
+ }
577
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/skills/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export interface SkillsPayload {
2
+ op?: unknown;
3
+ name?: unknown;
4
+ }
5
+ export type SkillsResult = {
6
+ ok: true;
7
+ result: {
8
+ op: 'read';
9
+ name: string;
10
+ body: string;
11
+ available: boolean;
12
+ unavailableReason?: string;
13
+ } | {
14
+ op: 'list';
15
+ skills: Array<{
16
+ name: string;
17
+ description: string;
18
+ source: string;
19
+ available: boolean;
20
+ always: boolean;
21
+ }>;
22
+ } | {
23
+ op: 'refresh';
24
+ total: number;
25
+ };
26
+ } | {
27
+ ok: false;
28
+ error: string;
29
+ };
30
+ /**
31
+ * Single entry point — the bus picks `op` and we dispatch. Three ops
32
+ * supported in this initial cut:
33
+ *
34
+ * - 'read' (default): return one skill's full body. Agent uses this
35
+ * when its tier-1 summary description matches user intent.
36
+ * - 'list': return the full skill roster. Useful when the
37
+ * agent wants to introspect what's available without scrolling the
38
+ * entire system prompt.
39
+ * - 'refresh': force a disk re-scan. Operator-only in spirit;
40
+ * we don't enforce, but the operation is cheap enough that abuse
41
+ * just wastes the calling agent's iteration budget.
42
+ */
43
+ export declare function handleSkillsOp(payload: SkillsPayload): Promise<SkillsResult>;
44
+ //# sourceMappingURL=skills-rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-rpc.d.ts","sourceRoot":"","sources":["../../src/core/skills-rpc.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,MAAM,YAAY,GACpB;IACE,EAAE,EAAE,IAAI,CAAA;IACR,MAAM,EACF;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1F;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,OAAO,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,GACzH;QAAE,EAAE,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CACrC,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhC;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA2ClF"}