@turmind/halo 0.1.9

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 (296) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +143 -0
  3. package/admin-out/404.html +1 -0
  4. package/admin-out/_next/static/IBP_mwBDf-cPwZSZZGpi8/_buildManifest.js +1 -0
  5. package/admin-out/_next/static/IBP_mwBDf-cPwZSZZGpi8/_ssgManifest.js +1 -0
  6. package/admin-out/_next/static/chunks/1d2d5650-810a3ca1ae20cab5.js +18 -0
  7. package/admin-out/_next/static/chunks/200.3b8f8a74f005a134.js +1 -0
  8. package/admin-out/_next/static/chunks/220.3dc41cd6269b88e6.js +1 -0
  9. package/admin-out/_next/static/chunks/298-d6b224b569da4de0.js +1 -0
  10. package/admin-out/_next/static/chunks/304eda7d.b1ee7f523653e027.js +1 -0
  11. package/admin-out/_next/static/chunks/330.3b784cf0dcd69163.js +1 -0
  12. package/admin-out/_next/static/chunks/442.f4302087bddb1ec1.js +1 -0
  13. package/admin-out/_next/static/chunks/443.d1b289781793f8de.js +25 -0
  14. package/admin-out/_next/static/chunks/503-7c6d9935df6e0cea.js +1 -0
  15. package/admin-out/_next/static/chunks/533.5f2d4bfe3d076095.js +1 -0
  16. package/admin-out/_next/static/chunks/579.a2718ddd395a2f3a.js +1 -0
  17. package/admin-out/_next/static/chunks/635-3dd0043ed0520b9d.js +1 -0
  18. package/admin-out/_next/static/chunks/65.859665ba6717967a.js +1 -0
  19. package/admin-out/_next/static/chunks/661.a4fe93f3f2a5e871.js +1 -0
  20. package/admin-out/_next/static/chunks/688.4e014ac6cfc7e152.js +1 -0
  21. package/admin-out/_next/static/chunks/868.0c95dfe283400a00.js +1 -0
  22. package/admin-out/_next/static/chunks/app/_not-found/page-8e35399c8fd5016d.js +1 -0
  23. package/admin-out/_next/static/chunks/app/layout-58f773336e6fce61.js +1 -0
  24. package/admin-out/_next/static/chunks/app/page-cc8043335282d745.js +1 -0
  25. package/admin-out/_next/static/chunks/db534642.09d3c650ff587175.js +1 -0
  26. package/admin-out/_next/static/chunks/fb4ec4d6-3fa44f69484f91b9.js +1 -0
  27. package/admin-out/_next/static/chunks/framework-c3031ae54a63fe16.js +1 -0
  28. package/admin-out/_next/static/chunks/main-14b48e3c2588354f.js +1 -0
  29. package/admin-out/_next/static/chunks/main-app-483b436873410ddc.js +1 -0
  30. package/admin-out/_next/static/chunks/pages/_app-b2fc6e5f920d1b1a.js +1 -0
  31. package/admin-out/_next/static/chunks/pages/_error-f3696a8f3d67d150.js +1 -0
  32. package/admin-out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  33. package/admin-out/_next/static/chunks/webpack-8bd7ef88a6527feb.js +1 -0
  34. package/admin-out/_next/static/css/659eccb5db697b76.css +1 -0
  35. package/admin-out/_next/static/css/8fce4e1a54dac12a.css +3 -0
  36. package/admin-out/_next/static/media/19cfc7226ec3afaa-s.woff2 +0 -0
  37. package/admin-out/_next/static/media/21350d82a1f187e9-s.woff2 +0 -0
  38. package/admin-out/_next/static/media/8e9860b6e62d6359-s.woff2 +0 -0
  39. package/admin-out/_next/static/media/ba9851c3c22cd980-s.woff2 +0 -0
  40. package/admin-out/_next/static/media/c5fe6dc8356a8c31-s.woff2 +0 -0
  41. package/admin-out/_next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
  42. package/admin-out/_next/static/media/e4af272ccee01ff0-s.p.woff2 +0 -0
  43. package/admin-out/favicon.ico +0 -0
  44. package/admin-out/icon.svg +18 -0
  45. package/admin-out/index.html +1 -0
  46. package/admin-out/index.txt +23 -0
  47. package/admin-out/monaco/vs/_commonjsHelpers-CT9FvmAN.js +1 -0
  48. package/admin-out/monaco/vs/abap-D-t0cyap.js +1 -0
  49. package/admin-out/monaco/vs/apex-CcIm7xu6.js +1 -0
  50. package/admin-out/monaco/vs/assets/css.worker-HnVq6Ewq.js +93 -0
  51. package/admin-out/monaco/vs/assets/editor.worker-Be8ye1pW.js +26 -0
  52. package/admin-out/monaco/vs/assets/html.worker-B51mlPHg.js +470 -0
  53. package/admin-out/monaco/vs/assets/json.worker-DKiEKt88.js +58 -0
  54. package/admin-out/monaco/vs/assets/ts.worker-CMbG-7ft.js +67731 -0
  55. package/admin-out/monaco/vs/azcli-BA0tQDCg.js +1 -0
  56. package/admin-out/monaco/vs/basic-languages/monaco.contribution.js +1 -0
  57. package/admin-out/monaco/vs/bat-C397hTD6.js +1 -0
  58. package/admin-out/monaco/vs/bicep-DF5aW17k.js +2 -0
  59. package/admin-out/monaco/vs/cameligo-plsz8qhj.js +1 -0
  60. package/admin-out/monaco/vs/clojure-Y2auQMzK.js +1 -0
  61. package/admin-out/monaco/vs/coffee-Bu45yuWE.js +1 -0
  62. package/admin-out/monaco/vs/cpp-CkKPQIni.js +1 -0
  63. package/admin-out/monaco/vs/csharp-CX28MZyh.js +1 -0
  64. package/admin-out/monaco/vs/csp-D8uWnyxW.js +1 -0
  65. package/admin-out/monaco/vs/css-CaeNmE3S.js +3 -0
  66. package/admin-out/monaco/vs/cssMode-CjiAH6dQ.js +1 -0
  67. package/admin-out/monaco/vs/cypher-DVThT8BS.js +1 -0
  68. package/admin-out/monaco/vs/dart-CmGfCvrO.js +1 -0
  69. package/admin-out/monaco/vs/dockerfile-CZqqYdch.js +1 -0
  70. package/admin-out/monaco/vs/ecl-30fUercY.js +1 -0
  71. package/admin-out/monaco/vs/editor/editor.main.css +1 -0
  72. package/admin-out/monaco/vs/editor/editor.main.js +5 -0
  73. package/admin-out/monaco/vs/editor.api-CalNCsUg.js +903 -0
  74. package/admin-out/monaco/vs/elixir-xjPaIfzF.js +1 -0
  75. package/admin-out/monaco/vs/flow9-DqtmStfK.js +1 -0
  76. package/admin-out/monaco/vs/freemarker2-Cz_sV6Md.js +3 -0
  77. package/admin-out/monaco/vs/fsharp-BOMdg4U1.js +1 -0
  78. package/admin-out/monaco/vs/go-D_hbi-Jt.js +1 -0
  79. package/admin-out/monaco/vs/graphql-CKUU4kLG.js +1 -0
  80. package/admin-out/monaco/vs/handlebars-OwglfO-1.js +1 -0
  81. package/admin-out/monaco/vs/hcl-DTaboeZW.js +1 -0
  82. package/admin-out/monaco/vs/html-Pa1xEWsY.js +1 -0
  83. package/admin-out/monaco/vs/htmlMode-Bz67EXwp.js +1 -0
  84. package/admin-out/monaco/vs/ini-CsNwO04R.js +1 -0
  85. package/admin-out/monaco/vs/java-CI4ZMsH9.js +1 -0
  86. package/admin-out/monaco/vs/javascript-PczUCGdz.js +1 -0
  87. package/admin-out/monaco/vs/jsonMode-DULH5oaX.js +7 -0
  88. package/admin-out/monaco/vs/julia-BwzEvaQw.js +1 -0
  89. package/admin-out/monaco/vs/kotlin-IUYPiTV8.js +1 -0
  90. package/admin-out/monaco/vs/language/css/monaco.contribution.js +1 -0
  91. package/admin-out/monaco/vs/language/html/monaco.contribution.js +1 -0
  92. package/admin-out/monaco/vs/language/json/monaco.contribution.js +1 -0
  93. package/admin-out/monaco/vs/language/typescript/monaco.contribution.js +1 -0
  94. package/admin-out/monaco/vs/less-C0eDYdqa.js +2 -0
  95. package/admin-out/monaco/vs/lexon-iON-Kj97.js +1 -0
  96. package/admin-out/monaco/vs/liquid-DqKjdPGy.js +1 -0
  97. package/admin-out/monaco/vs/loader.js +1368 -0
  98. package/admin-out/monaco/vs/lspLanguageFeatures-kM9O9rjY.js +4 -0
  99. package/admin-out/monaco/vs/lua-DtygF91M.js +1 -0
  100. package/admin-out/monaco/vs/m3-CsR4AuFi.js +1 -0
  101. package/admin-out/monaco/vs/markdown-C_rD0bIw.js +1 -0
  102. package/admin-out/monaco/vs/mdx-DEWtB1K5.js +1 -0
  103. package/admin-out/monaco/vs/mips-CiYP61RB.js +1 -0
  104. package/admin-out/monaco/vs/monaco.contribution-D2OdxNBt.js +1 -0
  105. package/admin-out/monaco/vs/monaco.contribution-DO3azKX8.js +1 -0
  106. package/admin-out/monaco/vs/monaco.contribution-EcChJV6a.js +1 -0
  107. package/admin-out/monaco/vs/monaco.contribution-qLAYrEOP.js +1 -0
  108. package/admin-out/monaco/vs/msdax-C38-sJlp.js +1 -0
  109. package/admin-out/monaco/vs/mysql-CdtbpvbG.js +1 -0
  110. package/admin-out/monaco/vs/nls.messages-loader.js +1 -0
  111. package/admin-out/monaco/vs/nls.messages.cs.js.js +17 -0
  112. package/admin-out/monaco/vs/nls.messages.de.js.js +17 -0
  113. package/admin-out/monaco/vs/nls.messages.es.js.js +17 -0
  114. package/admin-out/monaco/vs/nls.messages.fr.js.js +15 -0
  115. package/admin-out/monaco/vs/nls.messages.it.js.js +15 -0
  116. package/admin-out/monaco/vs/nls.messages.ja.js.js +17 -0
  117. package/admin-out/monaco/vs/nls.messages.js.js +10 -0
  118. package/admin-out/monaco/vs/nls.messages.ko.js.js +25 -0
  119. package/admin-out/monaco/vs/nls.messages.pl.js.js +17 -0
  120. package/admin-out/monaco/vs/nls.messages.pt-br.js.js +6 -0
  121. package/admin-out/monaco/vs/nls.messages.ru.js.js +17 -0
  122. package/admin-out/monaco/vs/nls.messages.tr.js.js +15 -0
  123. package/admin-out/monaco/vs/nls.messages.zh-cn.js.js +17 -0
  124. package/admin-out/monaco/vs/nls.messages.zh-tw.js.js +15 -0
  125. package/admin-out/monaco/vs/objective-c-CntZFaHX.js +1 -0
  126. package/admin-out/monaco/vs/pascal-r6kuqfl_.js +1 -0
  127. package/admin-out/monaco/vs/pascaligo-BiXoTmXh.js +1 -0
  128. package/admin-out/monaco/vs/perl-DABw_TcH.js +1 -0
  129. package/admin-out/monaco/vs/pgsql-me_jFXeX.js +1 -0
  130. package/admin-out/monaco/vs/php-D_kh-9LK.js +1 -0
  131. package/admin-out/monaco/vs/pla-VfZjczW0.js +1 -0
  132. package/admin-out/monaco/vs/postiats-BBSzz8Pk.js +1 -0
  133. package/admin-out/monaco/vs/powerquery-Dt-g_2cc.js +1 -0
  134. package/admin-out/monaco/vs/powershell-B-7ap1zc.js +1 -0
  135. package/admin-out/monaco/vs/protobuf-BmtuEB1A.js +2 -0
  136. package/admin-out/monaco/vs/pug-BRpRNeEb.js +1 -0
  137. package/admin-out/monaco/vs/python-Cr0UkIbn.js +1 -0
  138. package/admin-out/monaco/vs/qsharp-BzsFaUU9.js +1 -0
  139. package/admin-out/monaco/vs/r-f8dDdrp4.js +1 -0
  140. package/admin-out/monaco/vs/razor-BYAHOTkz.js +1 -0
  141. package/admin-out/monaco/vs/redis-fvZQY4PI.js +1 -0
  142. package/admin-out/monaco/vs/redshift-45Et0LQi.js +1 -0
  143. package/admin-out/monaco/vs/restructuredtext-C7UUFKFD.js +1 -0
  144. package/admin-out/monaco/vs/ruby-CZO8zYTz.js +1 -0
  145. package/admin-out/monaco/vs/rust-Bfetafyc.js +1 -0
  146. package/admin-out/monaco/vs/sb-3GYllVck.js +1 -0
  147. package/admin-out/monaco/vs/scala-foMgrKo1.js +1 -0
  148. package/admin-out/monaco/vs/scheme-CHdMtr7p.js +1 -0
  149. package/admin-out/monaco/vs/scss-C1cmLt9V.js +3 -0
  150. package/admin-out/monaco/vs/shell-ClXCKCEW.js +1 -0
  151. package/admin-out/monaco/vs/solidity-MZ6ExpPy.js +1 -0
  152. package/admin-out/monaco/vs/sophia-DWkuSsPQ.js +1 -0
  153. package/admin-out/monaco/vs/sparql-AUGFYSyk.js +1 -0
  154. package/admin-out/monaco/vs/sql-32GpJSV2.js +1 -0
  155. package/admin-out/monaco/vs/st-CuDFIVZ_.js +1 -0
  156. package/admin-out/monaco/vs/swift-n-2HociN.js +3 -0
  157. package/admin-out/monaco/vs/systemverilog-Ch4vA8Yt.js +1 -0
  158. package/admin-out/monaco/vs/tcl-D74tq1nH.js +1 -0
  159. package/admin-out/monaco/vs/tsMode-CZz1Umrk.js +11 -0
  160. package/admin-out/monaco/vs/twig-C6taOxMV.js +1 -0
  161. package/admin-out/monaco/vs/typescript-DfOrAzoV.js +1 -0
  162. package/admin-out/monaco/vs/typespec-D-PIh9Xw.js +1 -0
  163. package/admin-out/monaco/vs/vb-Dyb2648j.js +1 -0
  164. package/admin-out/monaco/vs/wgsl-BhLXMOR0.js +298 -0
  165. package/admin-out/monaco/vs/workers-DcJshg-q.js +1 -0
  166. package/admin-out/monaco/vs/xml-CdsdnY8S.js +1 -0
  167. package/admin-out/monaco/vs/yaml-DYGvmE88.js +1 -0
  168. package/bin/halo.js +9 -0
  169. package/bundled-docs/design/agent.md +145 -0
  170. package/bundled-docs/design/architecture.md +270 -0
  171. package/bundled-docs/design/background-dispatch.md +151 -0
  172. package/bundled-docs/design/command.md +58 -0
  173. package/bundled-docs/design/cron.md +88 -0
  174. package/bundled-docs/design/evolution.md +383 -0
  175. package/bundled-docs/design/express-self.md +145 -0
  176. package/bundled-docs/design/feishu.md +224 -0
  177. package/bundled-docs/design/halo-city.md +112 -0
  178. package/bundled-docs/design/prompt-system.md +411 -0
  179. package/bundled-docs/design/session.md +321 -0
  180. package/bundled-docs/design/slack.md +212 -0
  181. package/bundled-docs/design/storage.md +578 -0
  182. package/bundled-docs/design/telegram.md +161 -0
  183. package/bundled-docs/design/web.md +222 -0
  184. package/bundled-docs/design/wechat.md +146 -0
  185. package/bundled-docs/design/ws.md +144 -0
  186. package/bundled-docs/dev/acp-adapter.md +337 -0
  187. package/bundled-docs/dev/add-channel.md +376 -0
  188. package/bundled-docs/dev/add-model-provider.md +386 -0
  189. package/bundled-docs/dev/api.md +686 -0
  190. package/bundled-docs/dev/deploy.md +198 -0
  191. package/bundled-docs/dev/desktop-packaging.md +327 -0
  192. package/bundled-docs/dev/env.md +158 -0
  193. package/bundled-docs/dev/logging.md +85 -0
  194. package/bundled-docs/dev/previews.md +225 -0
  195. package/bundled-docs/dev/tools.md +331 -0
  196. package/bundled-docs/guide/README.md +29 -0
  197. package/bundled-docs/guide/agents.md +264 -0
  198. package/bundled-docs/guide/channels/README.md +62 -0
  199. package/bundled-docs/guide/channels/acp.md +150 -0
  200. package/bundled-docs/guide/channels/feishu.md +154 -0
  201. package/bundled-docs/guide/channels/slack.md +156 -0
  202. package/bundled-docs/guide/channels/telegram.md +112 -0
  203. package/bundled-docs/guide/channels/web.md +149 -0
  204. package/bundled-docs/guide/channels/wechat.md +110 -0
  205. package/bundled-docs/guide/chat.md +112 -0
  206. package/bundled-docs/guide/cli.md +197 -0
  207. package/bundled-docs/guide/getting-started.md +93 -0
  208. package/bundled-docs/guide/secrets-and-credentials.md +161 -0
  209. package/bundled-docs/guide/sessions.md +104 -0
  210. package/bundled-docs/guide/skills.md +302 -0
  211. package/bundled-docs/guide/testing-agents-and-skills.md +136 -0
  212. package/bundled-docs/guide/workspace.md +131 -0
  213. package/bundled-docs/plans/cron-tasks.md +362 -0
  214. package/bundled-docs/plans/design-suggestions.md +203 -0
  215. package/bundled-docs/plans/issue-session-deep-nesting.md +208 -0
  216. package/bundled-docs/plans/launch-plan.md +111 -0
  217. package/bundled-docs/plans/md-and-agent-refactor.md +197 -0
  218. package/bundled-docs/plans/remote-mac-worker.md +196 -0
  219. package/bundled-docs/plans/roadmap.md +40 -0
  220. package/bundled-docs/plans/self-evolution.md +1379 -0
  221. package/bundled-docs/plans/todo.md +32 -0
  222. package/bundled-docs/plans/weixin-channel.md +255 -0
  223. package/bundled-docs/requirements/agent.md +92 -0
  224. package/bundled-docs/requirements/chat.md +81 -0
  225. package/bundled-docs/requirements/command.md +130 -0
  226. package/bundled-docs/requirements/editor.md +82 -0
  227. package/bundled-docs/requirements/explorer.md +89 -0
  228. package/bundled-docs/requirements/overview.md +62 -0
  229. package/bundled-docs/requirements/session.md +73 -0
  230. package/bundled-docs/requirements/settings.md +224 -0
  231. package/bundled-docs/requirements/skill.md +125 -0
  232. package/bundled-docs/requirements/source-control.md +82 -0
  233. package/bundled-docs/requirements/terminal.md +118 -0
  234. package/bundled-docs/requirements/workspace.md +80 -0
  235. package/bundled-docs/test/docs-seeding.md +101 -0
  236. package/bundled-docs/test/session.md +374 -0
  237. package/dist/index.js +26750 -0
  238. package/package.json +67 -0
  239. package/templates/INSTRUCTIONS.md +25 -0
  240. package/templates/agents/__apply_agent__/AGENT.md +229 -0
  241. package/templates/agents/__apply_agent__/agent.yaml +30 -0
  242. package/templates/agents/__evo_agent__/AGENT.md +323 -0
  243. package/templates/agents/__evo_agent__/agent.yaml +29 -0
  244. package/templates/agents/__score__/AGENT.md +177 -0
  245. package/templates/agents/__score__/agent.yaml +29 -0
  246. package/templates/agents/deep-executor/AGENT.md +60 -0
  247. package/templates/agents/deep-executor/agent.yaml +25 -0
  248. package/templates/agents/default/AGENT.md +38 -0
  249. package/templates/agents/default/agent.yaml +51 -0
  250. package/templates/agents/executor/AGENT.md +38 -0
  251. package/templates/agents/executor/agent.yaml +25 -0
  252. package/templates/aliases.yaml +26 -0
  253. package/templates/canvas/self.html +660 -0
  254. package/templates/config.yaml +69 -0
  255. package/templates/models/anthropic.yaml +47 -0
  256. package/templates/models/aws-bedrock-claude-invoke.yaml +156 -0
  257. package/templates/models/aws-bedrock-mantle.yaml +89 -0
  258. package/templates/models/deepseek.yaml +62 -0
  259. package/templates/models/doubao.yaml +137 -0
  260. package/templates/models/hunyuan.yaml +56 -0
  261. package/templates/models/kimi.yaml +41 -0
  262. package/templates/models/mimo-token-plan-china.yaml +61 -0
  263. package/templates/models/minimax.yaml +80 -0
  264. package/templates/models/openai.yaml +51 -0
  265. package/templates/models/qwen.yaml +78 -0
  266. package/templates/optional-skills/tavily-web-search/SKILL.md +91 -0
  267. package/templates/optional-skills/tavily-web-search/config.yaml +10 -0
  268. package/templates/prompts/all/TOOL_GUIDELINES.md +35 -0
  269. package/templates/prompts/all/TOOL_SHELL.md +4 -0
  270. package/templates/prompts/all/TOOL_SHELL.windows.md +7 -0
  271. package/templates/prompts/bootstrap/BOOTSTRAP.md +26 -0
  272. package/templates/prompts/root/WORKSPACE_MEMORY.md +11 -0
  273. package/templates/schema.sql +30 -0
  274. package/templates/skills/acp/SKILL.md +236 -0
  275. package/templates/skills/acp/templates/SKILL.md.tmpl +74 -0
  276. package/templates/skills/acp/templates/ask.py +176 -0
  277. package/templates/skills/acp/templates/config.yaml.tmpl +33 -0
  278. package/templates/skills/agent/SKILL.md +128 -0
  279. package/templates/skills/aws-knowledge/SKILL.md +82 -0
  280. package/templates/skills/aws-knowledge/scripts/aws_kb.py +61 -0
  281. package/templates/skills/cron/SKILL.md +217 -0
  282. package/templates/skills/cron/manage-cron.py +434 -0
  283. package/templates/skills/halo/SKILL.md +98 -0
  284. package/templates/skills/nova-web-search/SKILL.md +65 -0
  285. package/templates/skills/self/SKILL.md +139 -0
  286. package/templates/skills/send-file/SKILL.md +28 -0
  287. package/templates/skills/send-file/feishu.md +16 -0
  288. package/templates/skills/send-file/slack.md +7 -0
  289. package/templates/skills/send-file/telegram.md +9 -0
  290. package/templates/skills/send-file/web.md +6 -0
  291. package/templates/skills/send-file/wechat.md +8 -0
  292. package/templates/skills/skill/SKILL.md +131 -0
  293. package/templates/skills/workspace/SKILL.md +28 -0
  294. package/templates/skills/workspace/setup-tidy.md +265 -0
  295. package/templates/skills/workspace/share.md +187 -0
  296. package/templates/skills/workspace/stage.py +487 -0
@@ -0,0 +1,82 @@
1
+ ---
2
+ name: aws-knowledge
3
+ description: Query the official AWS Knowledge MCP server for up-to-date AWS documentation, API references, best practices, troubleshooting guides, CDK/CloudFormation examples, What's New announcements, and regional availability. Activate when the user asks any AWS question — services, APIs, errors, architecture, new features, regional support, or "how do I do X on AWS". Always prefer this over general knowledge for AWS topics.
4
+ user-invocable: false
5
+ ---
6
+ # AWS Knowledge
7
+
8
+ Wraps `https://knowledge-mcp.global.api.aws` — official AWS MCP server. No auth, no dependencies.
9
+
10
+ ## Script
11
+
12
+ ```bash
13
+ python3 ~/.halo/global/skills/aws-knowledge/scripts/aws_kb.py <command> [args]
14
+ ```
15
+
16
+ ## Commands
17
+
18
+ ### search — use this first for almost everything
19
+
20
+ ```bash
21
+ python3 ~/.halo/global/skills/aws-knowledge/scripts/aws_kb.py search "<phrase>" \
22
+ [--topics TOPIC1 TOPIC2] [--limit N]
23
+ ```
24
+
25
+ **Topic selection (up to 3):**
26
+
27
+ | Query type | Topic |
28
+ |---|---|
29
+ | API / SDK / CLI code | `reference_documentation` |
30
+ | New features / announcements | `current_awareness` |
31
+ | Errors / debugging | `troubleshooting` |
32
+ | Amplify apps | `amplify_docs` |
33
+ | CDK concepts / API / CLI | `cdk_docs` |
34
+ | CDK code samples / patterns | `cdk_constructs` |
35
+ | CloudFormation templates | `cloudformation` |
36
+ | Architecture / best practices / blogs | `general` |
37
+
38
+ Default topic: `general`. Include service name + language in phrase for best results.
39
+
40
+ ### read — fetch a full doc page as markdown
41
+
42
+ ```bash
43
+ python3 ~/.halo/global/skills/aws-knowledge/scripts/aws_kb.py read "<url>" \
44
+ [--start N] [--max-length N]
45
+ ```
46
+
47
+ For long docs, paginate with `--start <char_index>`.
48
+
49
+ ### recommend — related pages
50
+
51
+ ```bash
52
+ python3 ~/.halo/global/skills/aws-knowledge/scripts/aws_kb.py recommend "<docs.aws.amazon.com url>"
53
+ ```
54
+
55
+ ### availability — check if service/API/CFN resource is in a region
56
+
57
+ ```bash
58
+ # product (service or feature)
59
+ python3 ~/.halo/global/skills/aws-knowledge/scripts/aws_kb.py availability product \
60
+ --filters "AWS Lambda" "Amazon Bedrock" [--region ap-northeast-1]
61
+
62
+ # API operation
63
+ python3 ~/.halo/global/skills/aws-knowledge/scripts/aws_kb.py availability api \
64
+ --filters "Lambda+InvokeFunction"
65
+
66
+ # CloudFormation resource
67
+ python3 ~/.halo/global/skills/aws-knowledge/scripts/aws_kb.py availability cfn \
68
+ --filters "AWS::Lambda::Function"
69
+ ```
70
+
71
+ ### regions
72
+
73
+ ```bash
74
+ python3 ~/.halo/global/skills/aws-knowledge/scripts/aws_kb.py regions
75
+ ```
76
+
77
+ ## Workflow
78
+
79
+ 1. **search** → get URLs and summaries
80
+ 2. **read** top URL for full content
81
+ 3. **recommend** to explore related pages
82
+ 4. **availability** for "is X available in region Y" questions
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env python3
2
+ """AWS Knowledge MCP Server CLI — wraps https://knowledge-mcp.global.api.aws"""
3
+ import sys, json, argparse, urllib.request, urllib.error
4
+
5
+ MCP_URL = "https://knowledge-mcp.global.api.aws"
6
+
7
+ def call_mcp(method, params):
8
+ payload = json.dumps({"jsonrpc":"2.0","id":1,"method":method,"params":params}).encode()
9
+ req = urllib.request.Request(MCP_URL, data=payload,
10
+ headers={"Content-Type":"application/json","Accept":"application/json"}, method="POST")
11
+ with urllib.request.urlopen(req, timeout=30) as r:
12
+ return json.loads(r.read())
13
+
14
+ def text(result):
15
+ content = result.get("result",{}).get("content",[])
16
+ parts = [c["text"] for c in content if c.get("type")=="text"]
17
+ return "\n".join(parts) if parts else json.dumps(result.get("result",result), indent=2)
18
+
19
+ def main():
20
+ p = argparse.ArgumentParser(description="AWS Knowledge CLI")
21
+ sub = p.add_subparsers(dest="cmd", required=True)
22
+
23
+ s = sub.add_parser("search")
24
+ s.add_argument("query"); s.add_argument("--topics", nargs="+"); s.add_argument("--limit", type=int, default=5)
25
+
26
+ r = sub.add_parser("read")
27
+ r.add_argument("url"); r.add_argument("--start", type=int); r.add_argument("--max-length", type=int, dest="max_length")
28
+
29
+ rc = sub.add_parser("recommend"); rc.add_argument("url")
30
+ sub.add_parser("regions")
31
+
32
+ av = sub.add_parser("availability")
33
+ av.add_argument("resource_type", choices=["product","api","cfn"])
34
+ av.add_argument("--filters", nargs="+"); av.add_argument("--region")
35
+
36
+ args = p.parse_args()
37
+ try:
38
+ if args.cmd == "search":
39
+ params = {"search_phrase": args.query}
40
+ if args.topics: params["topics"] = args.topics
41
+ if args.limit: params["limit"] = args.limit
42
+ print(text(call_mcp("tools/call",{"name":"aws___search_documentation","arguments":params})))
43
+ elif args.cmd == "read":
44
+ params = {"url": args.url}
45
+ if args.start: params["start_index"] = args.start
46
+ if args.max_length: params["max_length"] = args.max_length
47
+ print(text(call_mcp("tools/call",{"name":"aws___read_documentation","arguments":params})))
48
+ elif args.cmd == "recommend":
49
+ print(text(call_mcp("tools/call",{"name":"aws___recommend","arguments":{"url":args.url}})))
50
+ elif args.cmd == "regions":
51
+ print(text(call_mcp("tools/call",{"name":"aws___list_regions","arguments":{}})))
52
+ elif args.cmd == "availability":
53
+ params = {"resource_type": args.resource_type}
54
+ if args.filters: params["filters"] = args.filters
55
+ if args.region: params["region"] = args.region
56
+ print(text(call_mcp("tools/call",{"name":"aws___get_regional_availability","arguments":params})))
57
+ except urllib.error.URLError as e:
58
+ print(f"Error: {e}", file=sys.stderr); sys.exit(1)
59
+
60
+ if __name__ == "__main__":
61
+ main()
@@ -0,0 +1,217 @@
1
+ ---
2
+ name: cron
3
+ description: Manage scheduled cron jobs that run a halo agent on a schedule and optionally push the result to a chat channel (telegram / wechat / slack / feishu). Activate when the user asks to add / list / edit / pause / delete a recurring agent task.
4
+ command: /cron
5
+ requiresAccess: full
6
+ verbs:
7
+ - { name: create, desc: Create a scheduled job }
8
+ - { name: list, desc: List scheduled jobs }
9
+ - { name: update, desc: Edit a job (schedule / prompt / targets) }
10
+ - { name: enable, desc: Resume a paused job }
11
+ - { name: disable, desc: Pause a job }
12
+ - { name: delete, desc: Delete a job }
13
+ ---
14
+
15
+ # cron
16
+
17
+ The requested action is **`$1`** (full args: `$ARGUMENTS`); with
18
+ natural-language activation, infer it from the request. All verbs run through
19
+ this body — map them onto the helper script's subcommands below.
20
+
21
+ Halo runs a global cron daemon that executes user-defined agent prompts on a schedule and
22
+ optionally pushes the resulting text to a chat (telegram / wechat / slack / feishu). Use the
23
+ `manage-cron.py` helper script (sibling of this file) for every operation — it handles id
24
+ generation, JSON encoding for `targets`, timestamps, and so on, so you don't end up
25
+ handcrafting SQL.
26
+
27
+ The server's runner picks up changes within ~10 seconds (it polls the db on a reconcile
28
+ loop). No restart needed after edits.
29
+
30
+ ## Steps
31
+
32
+ ### 1. Confirm the user intent
33
+
34
+ - **list / show / view** → `list` (all) or `list --chat-id {{channel.chat_id}}`
35
+ (only jobs that push to this chat — use this from inside a channel where
36
+ the user means "my crons", not the global list) or `get <id>` for one job
37
+ - **add / create** → `create`. From inside a channel, default to pinning
38
+ the result back to the current chat with `{{channel.chat_id}}` — the user
39
+ almost always means "send it to me here"
40
+ - **edit / pause / resume** → `update`, `enable`, `disable`
41
+ - **delete / remove** → `delete`. From inside a channel the user won't
42
+ know the cron `id`; first run `list --chat-id {{channel.chat_id}}` to find
43
+ the matching job, confirm which one, then delete by id
44
+ - **history / runs** → `runs <jobId>`
45
+
46
+ When important fields are unclear (workspace, agent, exact schedule, channels), ask once.
47
+ Sensible defaults if user didn't say:
48
+
49
+ | Field | Default |
50
+ |------------|----------------------------------------------------------------|
51
+ | workspace | the user's current workspace (`pwd` / `/workspace` output) |
52
+ | agent | `default` |
53
+ | timezone | leave unset (host time) |
54
+ | targets | none (log only — the run shows in admin Cron tab) |
55
+ | label | summarize from prompt + schedule |
56
+
57
+ ### 2. Translate the schedule
58
+
59
+ **Recurring (default)** — standard 5-field cron `minute hour day-of-month month day-of-week`:
60
+
61
+ | Spoken | Cron |
62
+ |--------------------------------------|--------------------|
63
+ | every day at 9am | `0 9 * * *` |
64
+ | every Monday at 10am | `0 10 * * 1` |
65
+ | every 15 minutes | `*/15 * * * *` |
66
+ | every Sunday 8pm in Asia/Shanghai | `0 20 * * 0` + tz `Asia/Shanghai` |
67
+ | first day of every month at noon | `0 12 1 * *` |
68
+
69
+ **One-shot (at-mode)** — pass `--run-at` instead of `--schedule`. The job
70
+ fires once at that instant and auto-disables. Useful for "remind me at 3pm
71
+ today" or "send the report next Monday morning".
72
+
73
+ | Spoken | Flag |
74
+ |-----------------------------------|-------------------------------------------|
75
+ | at 3pm today | `--run-at 2026-05-23T15:00` |
76
+ | next Monday at 9 | `--run-at 2026-05-25T09:00` |
77
+ | in 2 hours | `--run-at <iso-of-now+2h>` |
78
+
79
+ Ambiguous time ("morning")? Ask once for the exact hour.
80
+
81
+ ### 3. Channels (only when delivery is wanted)
82
+
83
+ Run `channels` first to see what's available:
84
+
85
+ ```bash
86
+ shell_exec: python3 <skill-dir>/manage-cron.py channels
87
+ ```
88
+
89
+ Output is a JSON array `[{channelType, accountId, label, ready}, ...]`.
90
+
91
+ #### Pinning the chatId — REQUIRED for telegram / slack / feishu
92
+
93
+ The cron dispatcher used to fall back to "whoever last messaged the bot"
94
+ when no chatId was given, but in practice that always pushed to a stranger.
95
+ **As of the current build, telegram / slack / feishu cron pushes require
96
+ an explicit chatId.** WeChat is the exception — it has a QR-bound owner
97
+ that's a stable single recipient.
98
+
99
+ The current chat context is injected as `{{channel.type}}`,
100
+ `{{channel.account_id}}`, `{{channel.chat_id}}` — when invoked from a
101
+ chat, you have these for free; just substitute them into `--targets`.
102
+
103
+ Format per channel:
104
+
105
+ | Channel | Target syntax | chatId shape |
106
+ |----------|-------------------------------------------------|-----------------------------------------|
107
+ | wechat | `wechat:<accountId>` (chatId optional) | `o-…` open id (if explicit) |
108
+ | telegram | `telegram:<accountId>:<chatId>` | numeric (Telegram private-chat id) |
109
+ | slack | `slack:<accountId>:<chatId>` | `D…` (DM), `C…` (channel top), `C…:<thread_ts>` (thread) |
110
+ | feishu | `feishu:<accountId>:<chatId>` | `oc_…` chat_id |
111
+
112
+ Comma-separated for multiple targets:
113
+
114
+ ```
115
+ --targets telegram:halo_agent_bot:{{channel.chat_id}},slack:T01234:{{channel.chat_id}}
116
+ ```
117
+
118
+ **Pinning to the current chat (the common case).** When the user inside
119
+ telegram/slack/feishu/wechat asks "remind me at X" / "send me a daily
120
+ digest", construct the target with `{{channel.chat_id}}`:
121
+
122
+ ```
123
+ --targets {{channel.type}}:{{channel.account_id}}:{{channel.chat_id}}
124
+ ```
125
+
126
+ **Admin-UI cron jobs.** When invoked from the admin web UI there's no
127
+ chat context (`{{channel.*}}` is empty). Either:
128
+ - Tell the user "the cron will run silently — its result shows up in
129
+ the cron log but won't be pushed anywhere. Add a target if you want
130
+ a notification."
131
+ - Or ask for a chatId explicitly and pass it as a target.
132
+
133
+ ### 4. Apply the change
134
+
135
+ Helper script lives in this skill's directory; agents invoking from elsewhere should
136
+ substitute the right path (often `~/.halo/global/skills/manage-cron-jobs/manage-cron.py`).
137
+
138
+ **Create (from inside a chat — pin the result back to that chat):**
139
+ ```bash
140
+ shell_exec: python3 ~/.halo/global/skills/manage-cron-jobs/manage-cron.py create \
141
+ --label "Daily status digest" \
142
+ --workspace /home/ubuntu/sa-agent \
143
+ --agent default \
144
+ --prompt "Summarize today's commits and open PRs." \
145
+ --schedule "0 9 * * *" \
146
+ --timezone Asia/Shanghai \
147
+ --targets {{channel.type}}:{{channel.account_id}}:{{channel.chat_id}}
148
+ ```
149
+
150
+ **Create (silent — no push, just appears in the cron log):**
151
+ ```bash
152
+ shell_exec: python3 ~/.halo/global/skills/manage-cron-jobs/manage-cron.py create \
153
+ --label "Nightly index rebuild" \
154
+ --workspace /home/ubuntu/sa-agent \
155
+ --prompt "Rebuild the search index." \
156
+ --schedule "0 3 * * *"
157
+ ```
158
+
159
+ **Update (change schedule or any other field):**
160
+ ```bash
161
+ shell_exec: python3 ~/.halo/global/skills/manage-cron-jobs/manage-cron.py update <id> \
162
+ --schedule "0 10 * * 1"
163
+ ```
164
+
165
+ **Pause / unpause:**
166
+ ```bash
167
+ shell_exec: python3 ~/.halo/global/skills/manage-cron-jobs/manage-cron.py disable <id>
168
+ shell_exec: python3 ~/.halo/global/skills/manage-cron-jobs/manage-cron.py enable <id>
169
+ ```
170
+
171
+ **Delete:**
172
+ ```bash
173
+ shell_exec: python3 ~/.halo/global/skills/manage-cron-jobs/manage-cron.py delete <id>
174
+ ```
175
+
176
+ **List:**
177
+ ```bash
178
+ shell_exec: python3 ~/.halo/global/skills/manage-cron-jobs/manage-cron.py list
179
+ ```
180
+
181
+ **List jobs that push to the current chat (use this from inside a channel
182
+ when the user asks "what crons do I have?" / "remove the one I subscribed to earlier"):**
183
+ ```bash
184
+ shell_exec: python3 ~/.halo/global/skills/manage-cron-jobs/manage-cron.py list --chat-id {{channel.chat_id}}
185
+ ```
186
+
187
+ The user inside a chat doesn't know the cron `id` — they think in terms of
188
+ "the daily digest I set up here". Use `list --chat-id {{channel.chat_id}}`
189
+ to find the matching job(s), confirm with the user which one, then call
190
+ `delete <id>` / `disable <id>`.
191
+
192
+ **One job's run history (paginated, latest first):**
193
+ ```bash
194
+ shell_exec: python3 ~/.halo/global/skills/manage-cron-jobs/manage-cron.py runs <jobId> --limit 20
195
+ shell_exec: python3 ~/.halo/global/skills/manage-cron-jobs/manage-cron.py runs <jobId> --limit 20 --before <oldestRunIdFromPrev>
196
+ ```
197
+
198
+ ### 5. Confirm and summarize
199
+
200
+ After a successful write, summarize what changed in 1-2 sentences and mention the runner
201
+ picks it up within ~10s. Example:
202
+
203
+ > Created cron job `cron-mphsy-abc123`: runs the `default` agent every day at 9am,
204
+ > output will be pushed to this chat. The runner picks it up within ~10s.
205
+
206
+ ## Patterns that go sideways
207
+
208
+ - **telegram / slack / feishu target without a chatId** — every fire errors with
209
+ `… cron target requires an explicit chatId …`. From inside a chat, use the
210
+ `{{channel.chat_id}}` template; from the admin UI, ask the user for the chatId
211
+ (or accept that the cron will run silently with no push target).
212
+ - **Picking a wechat target with `ready: false`** — no QR-bound owner means there's
213
+ nowhere to deliver the cron output. Tell the user to scan the QR first.
214
+ - **Setting `enabled=0` and calling it "delete"** — pause and delete are different.
215
+ Delete also drops cron_runs history.
216
+ - **Trying to use channel `web`** — web is SSE-only and reactive; cron has nowhere to
217
+ push to. The dispatcher will record the run as failed-with-reason rather than swallowing.