@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.
- package/LICENSE +21 -0
- package/README.md +143 -0
- package/admin-out/404.html +1 -0
- package/admin-out/_next/static/IBP_mwBDf-cPwZSZZGpi8/_buildManifest.js +1 -0
- package/admin-out/_next/static/IBP_mwBDf-cPwZSZZGpi8/_ssgManifest.js +1 -0
- package/admin-out/_next/static/chunks/1d2d5650-810a3ca1ae20cab5.js +18 -0
- package/admin-out/_next/static/chunks/200.3b8f8a74f005a134.js +1 -0
- package/admin-out/_next/static/chunks/220.3dc41cd6269b88e6.js +1 -0
- package/admin-out/_next/static/chunks/298-d6b224b569da4de0.js +1 -0
- package/admin-out/_next/static/chunks/304eda7d.b1ee7f523653e027.js +1 -0
- package/admin-out/_next/static/chunks/330.3b784cf0dcd69163.js +1 -0
- package/admin-out/_next/static/chunks/442.f4302087bddb1ec1.js +1 -0
- package/admin-out/_next/static/chunks/443.d1b289781793f8de.js +25 -0
- package/admin-out/_next/static/chunks/503-7c6d9935df6e0cea.js +1 -0
- package/admin-out/_next/static/chunks/533.5f2d4bfe3d076095.js +1 -0
- package/admin-out/_next/static/chunks/579.a2718ddd395a2f3a.js +1 -0
- package/admin-out/_next/static/chunks/635-3dd0043ed0520b9d.js +1 -0
- package/admin-out/_next/static/chunks/65.859665ba6717967a.js +1 -0
- package/admin-out/_next/static/chunks/661.a4fe93f3f2a5e871.js +1 -0
- package/admin-out/_next/static/chunks/688.4e014ac6cfc7e152.js +1 -0
- package/admin-out/_next/static/chunks/868.0c95dfe283400a00.js +1 -0
- package/admin-out/_next/static/chunks/app/_not-found/page-8e35399c8fd5016d.js +1 -0
- package/admin-out/_next/static/chunks/app/layout-58f773336e6fce61.js +1 -0
- package/admin-out/_next/static/chunks/app/page-cc8043335282d745.js +1 -0
- package/admin-out/_next/static/chunks/db534642.09d3c650ff587175.js +1 -0
- package/admin-out/_next/static/chunks/fb4ec4d6-3fa44f69484f91b9.js +1 -0
- package/admin-out/_next/static/chunks/framework-c3031ae54a63fe16.js +1 -0
- package/admin-out/_next/static/chunks/main-14b48e3c2588354f.js +1 -0
- package/admin-out/_next/static/chunks/main-app-483b436873410ddc.js +1 -0
- package/admin-out/_next/static/chunks/pages/_app-b2fc6e5f920d1b1a.js +1 -0
- package/admin-out/_next/static/chunks/pages/_error-f3696a8f3d67d150.js +1 -0
- package/admin-out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/admin-out/_next/static/chunks/webpack-8bd7ef88a6527feb.js +1 -0
- package/admin-out/_next/static/css/659eccb5db697b76.css +1 -0
- package/admin-out/_next/static/css/8fce4e1a54dac12a.css +3 -0
- package/admin-out/_next/static/media/19cfc7226ec3afaa-s.woff2 +0 -0
- package/admin-out/_next/static/media/21350d82a1f187e9-s.woff2 +0 -0
- package/admin-out/_next/static/media/8e9860b6e62d6359-s.woff2 +0 -0
- package/admin-out/_next/static/media/ba9851c3c22cd980-s.woff2 +0 -0
- package/admin-out/_next/static/media/c5fe6dc8356a8c31-s.woff2 +0 -0
- package/admin-out/_next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
- package/admin-out/_next/static/media/e4af272ccee01ff0-s.p.woff2 +0 -0
- package/admin-out/favicon.ico +0 -0
- package/admin-out/icon.svg +18 -0
- package/admin-out/index.html +1 -0
- package/admin-out/index.txt +23 -0
- package/admin-out/monaco/vs/_commonjsHelpers-CT9FvmAN.js +1 -0
- package/admin-out/monaco/vs/abap-D-t0cyap.js +1 -0
- package/admin-out/monaco/vs/apex-CcIm7xu6.js +1 -0
- package/admin-out/monaco/vs/assets/css.worker-HnVq6Ewq.js +93 -0
- package/admin-out/monaco/vs/assets/editor.worker-Be8ye1pW.js +26 -0
- package/admin-out/monaco/vs/assets/html.worker-B51mlPHg.js +470 -0
- package/admin-out/monaco/vs/assets/json.worker-DKiEKt88.js +58 -0
- package/admin-out/monaco/vs/assets/ts.worker-CMbG-7ft.js +67731 -0
- package/admin-out/monaco/vs/azcli-BA0tQDCg.js +1 -0
- package/admin-out/monaco/vs/basic-languages/monaco.contribution.js +1 -0
- package/admin-out/monaco/vs/bat-C397hTD6.js +1 -0
- package/admin-out/monaco/vs/bicep-DF5aW17k.js +2 -0
- package/admin-out/monaco/vs/cameligo-plsz8qhj.js +1 -0
- package/admin-out/monaco/vs/clojure-Y2auQMzK.js +1 -0
- package/admin-out/monaco/vs/coffee-Bu45yuWE.js +1 -0
- package/admin-out/monaco/vs/cpp-CkKPQIni.js +1 -0
- package/admin-out/monaco/vs/csharp-CX28MZyh.js +1 -0
- package/admin-out/monaco/vs/csp-D8uWnyxW.js +1 -0
- package/admin-out/monaco/vs/css-CaeNmE3S.js +3 -0
- package/admin-out/monaco/vs/cssMode-CjiAH6dQ.js +1 -0
- package/admin-out/monaco/vs/cypher-DVThT8BS.js +1 -0
- package/admin-out/monaco/vs/dart-CmGfCvrO.js +1 -0
- package/admin-out/monaco/vs/dockerfile-CZqqYdch.js +1 -0
- package/admin-out/monaco/vs/ecl-30fUercY.js +1 -0
- package/admin-out/monaco/vs/editor/editor.main.css +1 -0
- package/admin-out/monaco/vs/editor/editor.main.js +5 -0
- package/admin-out/monaco/vs/editor.api-CalNCsUg.js +903 -0
- package/admin-out/monaco/vs/elixir-xjPaIfzF.js +1 -0
- package/admin-out/monaco/vs/flow9-DqtmStfK.js +1 -0
- package/admin-out/monaco/vs/freemarker2-Cz_sV6Md.js +3 -0
- package/admin-out/monaco/vs/fsharp-BOMdg4U1.js +1 -0
- package/admin-out/monaco/vs/go-D_hbi-Jt.js +1 -0
- package/admin-out/monaco/vs/graphql-CKUU4kLG.js +1 -0
- package/admin-out/monaco/vs/handlebars-OwglfO-1.js +1 -0
- package/admin-out/monaco/vs/hcl-DTaboeZW.js +1 -0
- package/admin-out/monaco/vs/html-Pa1xEWsY.js +1 -0
- package/admin-out/monaco/vs/htmlMode-Bz67EXwp.js +1 -0
- package/admin-out/monaco/vs/ini-CsNwO04R.js +1 -0
- package/admin-out/monaco/vs/java-CI4ZMsH9.js +1 -0
- package/admin-out/monaco/vs/javascript-PczUCGdz.js +1 -0
- package/admin-out/monaco/vs/jsonMode-DULH5oaX.js +7 -0
- package/admin-out/monaco/vs/julia-BwzEvaQw.js +1 -0
- package/admin-out/monaco/vs/kotlin-IUYPiTV8.js +1 -0
- package/admin-out/monaco/vs/language/css/monaco.contribution.js +1 -0
- package/admin-out/monaco/vs/language/html/monaco.contribution.js +1 -0
- package/admin-out/monaco/vs/language/json/monaco.contribution.js +1 -0
- package/admin-out/monaco/vs/language/typescript/monaco.contribution.js +1 -0
- package/admin-out/monaco/vs/less-C0eDYdqa.js +2 -0
- package/admin-out/monaco/vs/lexon-iON-Kj97.js +1 -0
- package/admin-out/monaco/vs/liquid-DqKjdPGy.js +1 -0
- package/admin-out/monaco/vs/loader.js +1368 -0
- package/admin-out/monaco/vs/lspLanguageFeatures-kM9O9rjY.js +4 -0
- package/admin-out/monaco/vs/lua-DtygF91M.js +1 -0
- package/admin-out/monaco/vs/m3-CsR4AuFi.js +1 -0
- package/admin-out/monaco/vs/markdown-C_rD0bIw.js +1 -0
- package/admin-out/monaco/vs/mdx-DEWtB1K5.js +1 -0
- package/admin-out/monaco/vs/mips-CiYP61RB.js +1 -0
- package/admin-out/monaco/vs/monaco.contribution-D2OdxNBt.js +1 -0
- package/admin-out/monaco/vs/monaco.contribution-DO3azKX8.js +1 -0
- package/admin-out/monaco/vs/monaco.contribution-EcChJV6a.js +1 -0
- package/admin-out/monaco/vs/monaco.contribution-qLAYrEOP.js +1 -0
- package/admin-out/monaco/vs/msdax-C38-sJlp.js +1 -0
- package/admin-out/monaco/vs/mysql-CdtbpvbG.js +1 -0
- package/admin-out/monaco/vs/nls.messages-loader.js +1 -0
- package/admin-out/monaco/vs/nls.messages.cs.js.js +17 -0
- package/admin-out/monaco/vs/nls.messages.de.js.js +17 -0
- package/admin-out/monaco/vs/nls.messages.es.js.js +17 -0
- package/admin-out/monaco/vs/nls.messages.fr.js.js +15 -0
- package/admin-out/monaco/vs/nls.messages.it.js.js +15 -0
- package/admin-out/monaco/vs/nls.messages.ja.js.js +17 -0
- package/admin-out/monaco/vs/nls.messages.js.js +10 -0
- package/admin-out/monaco/vs/nls.messages.ko.js.js +25 -0
- package/admin-out/monaco/vs/nls.messages.pl.js.js +17 -0
- package/admin-out/monaco/vs/nls.messages.pt-br.js.js +6 -0
- package/admin-out/monaco/vs/nls.messages.ru.js.js +17 -0
- package/admin-out/monaco/vs/nls.messages.tr.js.js +15 -0
- package/admin-out/monaco/vs/nls.messages.zh-cn.js.js +17 -0
- package/admin-out/monaco/vs/nls.messages.zh-tw.js.js +15 -0
- package/admin-out/monaco/vs/objective-c-CntZFaHX.js +1 -0
- package/admin-out/monaco/vs/pascal-r6kuqfl_.js +1 -0
- package/admin-out/monaco/vs/pascaligo-BiXoTmXh.js +1 -0
- package/admin-out/monaco/vs/perl-DABw_TcH.js +1 -0
- package/admin-out/monaco/vs/pgsql-me_jFXeX.js +1 -0
- package/admin-out/monaco/vs/php-D_kh-9LK.js +1 -0
- package/admin-out/monaco/vs/pla-VfZjczW0.js +1 -0
- package/admin-out/monaco/vs/postiats-BBSzz8Pk.js +1 -0
- package/admin-out/monaco/vs/powerquery-Dt-g_2cc.js +1 -0
- package/admin-out/monaco/vs/powershell-B-7ap1zc.js +1 -0
- package/admin-out/monaco/vs/protobuf-BmtuEB1A.js +2 -0
- package/admin-out/monaco/vs/pug-BRpRNeEb.js +1 -0
- package/admin-out/monaco/vs/python-Cr0UkIbn.js +1 -0
- package/admin-out/monaco/vs/qsharp-BzsFaUU9.js +1 -0
- package/admin-out/monaco/vs/r-f8dDdrp4.js +1 -0
- package/admin-out/monaco/vs/razor-BYAHOTkz.js +1 -0
- package/admin-out/monaco/vs/redis-fvZQY4PI.js +1 -0
- package/admin-out/monaco/vs/redshift-45Et0LQi.js +1 -0
- package/admin-out/monaco/vs/restructuredtext-C7UUFKFD.js +1 -0
- package/admin-out/monaco/vs/ruby-CZO8zYTz.js +1 -0
- package/admin-out/monaco/vs/rust-Bfetafyc.js +1 -0
- package/admin-out/monaco/vs/sb-3GYllVck.js +1 -0
- package/admin-out/monaco/vs/scala-foMgrKo1.js +1 -0
- package/admin-out/monaco/vs/scheme-CHdMtr7p.js +1 -0
- package/admin-out/monaco/vs/scss-C1cmLt9V.js +3 -0
- package/admin-out/monaco/vs/shell-ClXCKCEW.js +1 -0
- package/admin-out/monaco/vs/solidity-MZ6ExpPy.js +1 -0
- package/admin-out/monaco/vs/sophia-DWkuSsPQ.js +1 -0
- package/admin-out/monaco/vs/sparql-AUGFYSyk.js +1 -0
- package/admin-out/monaco/vs/sql-32GpJSV2.js +1 -0
- package/admin-out/monaco/vs/st-CuDFIVZ_.js +1 -0
- package/admin-out/monaco/vs/swift-n-2HociN.js +3 -0
- package/admin-out/monaco/vs/systemverilog-Ch4vA8Yt.js +1 -0
- package/admin-out/monaco/vs/tcl-D74tq1nH.js +1 -0
- package/admin-out/monaco/vs/tsMode-CZz1Umrk.js +11 -0
- package/admin-out/monaco/vs/twig-C6taOxMV.js +1 -0
- package/admin-out/monaco/vs/typescript-DfOrAzoV.js +1 -0
- package/admin-out/monaco/vs/typespec-D-PIh9Xw.js +1 -0
- package/admin-out/monaco/vs/vb-Dyb2648j.js +1 -0
- package/admin-out/monaco/vs/wgsl-BhLXMOR0.js +298 -0
- package/admin-out/monaco/vs/workers-DcJshg-q.js +1 -0
- package/admin-out/monaco/vs/xml-CdsdnY8S.js +1 -0
- package/admin-out/monaco/vs/yaml-DYGvmE88.js +1 -0
- package/bin/halo.js +9 -0
- package/bundled-docs/design/agent.md +145 -0
- package/bundled-docs/design/architecture.md +270 -0
- package/bundled-docs/design/background-dispatch.md +151 -0
- package/bundled-docs/design/command.md +58 -0
- package/bundled-docs/design/cron.md +88 -0
- package/bundled-docs/design/evolution.md +383 -0
- package/bundled-docs/design/express-self.md +145 -0
- package/bundled-docs/design/feishu.md +224 -0
- package/bundled-docs/design/halo-city.md +112 -0
- package/bundled-docs/design/prompt-system.md +411 -0
- package/bundled-docs/design/session.md +321 -0
- package/bundled-docs/design/slack.md +212 -0
- package/bundled-docs/design/storage.md +578 -0
- package/bundled-docs/design/telegram.md +161 -0
- package/bundled-docs/design/web.md +222 -0
- package/bundled-docs/design/wechat.md +146 -0
- package/bundled-docs/design/ws.md +144 -0
- package/bundled-docs/dev/acp-adapter.md +337 -0
- package/bundled-docs/dev/add-channel.md +376 -0
- package/bundled-docs/dev/add-model-provider.md +386 -0
- package/bundled-docs/dev/api.md +686 -0
- package/bundled-docs/dev/deploy.md +198 -0
- package/bundled-docs/dev/desktop-packaging.md +327 -0
- package/bundled-docs/dev/env.md +158 -0
- package/bundled-docs/dev/logging.md +85 -0
- package/bundled-docs/dev/previews.md +225 -0
- package/bundled-docs/dev/tools.md +331 -0
- package/bundled-docs/guide/README.md +29 -0
- package/bundled-docs/guide/agents.md +264 -0
- package/bundled-docs/guide/channels/README.md +62 -0
- package/bundled-docs/guide/channels/acp.md +150 -0
- package/bundled-docs/guide/channels/feishu.md +154 -0
- package/bundled-docs/guide/channels/slack.md +156 -0
- package/bundled-docs/guide/channels/telegram.md +112 -0
- package/bundled-docs/guide/channels/web.md +149 -0
- package/bundled-docs/guide/channels/wechat.md +110 -0
- package/bundled-docs/guide/chat.md +112 -0
- package/bundled-docs/guide/cli.md +197 -0
- package/bundled-docs/guide/getting-started.md +93 -0
- package/bundled-docs/guide/secrets-and-credentials.md +161 -0
- package/bundled-docs/guide/sessions.md +104 -0
- package/bundled-docs/guide/skills.md +302 -0
- package/bundled-docs/guide/testing-agents-and-skills.md +136 -0
- package/bundled-docs/guide/workspace.md +131 -0
- package/bundled-docs/plans/cron-tasks.md +362 -0
- package/bundled-docs/plans/design-suggestions.md +203 -0
- package/bundled-docs/plans/issue-session-deep-nesting.md +208 -0
- package/bundled-docs/plans/launch-plan.md +111 -0
- package/bundled-docs/plans/md-and-agent-refactor.md +197 -0
- package/bundled-docs/plans/remote-mac-worker.md +196 -0
- package/bundled-docs/plans/roadmap.md +40 -0
- package/bundled-docs/plans/self-evolution.md +1379 -0
- package/bundled-docs/plans/todo.md +32 -0
- package/bundled-docs/plans/weixin-channel.md +255 -0
- package/bundled-docs/requirements/agent.md +92 -0
- package/bundled-docs/requirements/chat.md +81 -0
- package/bundled-docs/requirements/command.md +130 -0
- package/bundled-docs/requirements/editor.md +82 -0
- package/bundled-docs/requirements/explorer.md +89 -0
- package/bundled-docs/requirements/overview.md +62 -0
- package/bundled-docs/requirements/session.md +73 -0
- package/bundled-docs/requirements/settings.md +224 -0
- package/bundled-docs/requirements/skill.md +125 -0
- package/bundled-docs/requirements/source-control.md +82 -0
- package/bundled-docs/requirements/terminal.md +118 -0
- package/bundled-docs/requirements/workspace.md +80 -0
- package/bundled-docs/test/docs-seeding.md +101 -0
- package/bundled-docs/test/session.md +374 -0
- package/dist/index.js +26750 -0
- package/package.json +67 -0
- package/templates/INSTRUCTIONS.md +25 -0
- package/templates/agents/__apply_agent__/AGENT.md +229 -0
- package/templates/agents/__apply_agent__/agent.yaml +30 -0
- package/templates/agents/__evo_agent__/AGENT.md +323 -0
- package/templates/agents/__evo_agent__/agent.yaml +29 -0
- package/templates/agents/__score__/AGENT.md +177 -0
- package/templates/agents/__score__/agent.yaml +29 -0
- package/templates/agents/deep-executor/AGENT.md +60 -0
- package/templates/agents/deep-executor/agent.yaml +25 -0
- package/templates/agents/default/AGENT.md +38 -0
- package/templates/agents/default/agent.yaml +51 -0
- package/templates/agents/executor/AGENT.md +38 -0
- package/templates/agents/executor/agent.yaml +25 -0
- package/templates/aliases.yaml +26 -0
- package/templates/canvas/self.html +660 -0
- package/templates/config.yaml +69 -0
- package/templates/models/anthropic.yaml +47 -0
- package/templates/models/aws-bedrock-claude-invoke.yaml +156 -0
- package/templates/models/aws-bedrock-mantle.yaml +89 -0
- package/templates/models/deepseek.yaml +62 -0
- package/templates/models/doubao.yaml +137 -0
- package/templates/models/hunyuan.yaml +56 -0
- package/templates/models/kimi.yaml +41 -0
- package/templates/models/mimo-token-plan-china.yaml +61 -0
- package/templates/models/minimax.yaml +80 -0
- package/templates/models/openai.yaml +51 -0
- package/templates/models/qwen.yaml +78 -0
- package/templates/optional-skills/tavily-web-search/SKILL.md +91 -0
- package/templates/optional-skills/tavily-web-search/config.yaml +10 -0
- package/templates/prompts/all/TOOL_GUIDELINES.md +35 -0
- package/templates/prompts/all/TOOL_SHELL.md +4 -0
- package/templates/prompts/all/TOOL_SHELL.windows.md +7 -0
- package/templates/prompts/bootstrap/BOOTSTRAP.md +26 -0
- package/templates/prompts/root/WORKSPACE_MEMORY.md +11 -0
- package/templates/schema.sql +30 -0
- package/templates/skills/acp/SKILL.md +236 -0
- package/templates/skills/acp/templates/SKILL.md.tmpl +74 -0
- package/templates/skills/acp/templates/ask.py +176 -0
- package/templates/skills/acp/templates/config.yaml.tmpl +33 -0
- package/templates/skills/agent/SKILL.md +128 -0
- package/templates/skills/aws-knowledge/SKILL.md +82 -0
- package/templates/skills/aws-knowledge/scripts/aws_kb.py +61 -0
- package/templates/skills/cron/SKILL.md +217 -0
- package/templates/skills/cron/manage-cron.py +434 -0
- package/templates/skills/halo/SKILL.md +98 -0
- package/templates/skills/nova-web-search/SKILL.md +65 -0
- package/templates/skills/self/SKILL.md +139 -0
- package/templates/skills/send-file/SKILL.md +28 -0
- package/templates/skills/send-file/feishu.md +16 -0
- package/templates/skills/send-file/slack.md +7 -0
- package/templates/skills/send-file/telegram.md +9 -0
- package/templates/skills/send-file/web.md +6 -0
- package/templates/skills/send-file/wechat.md +8 -0
- package/templates/skills/skill/SKILL.md +131 -0
- package/templates/skills/workspace/SKILL.md +28 -0
- package/templates/skills/workspace/setup-tidy.md +265 -0
- package/templates/skills/workspace/share.md +187 -0
- 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.
|