@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,61 @@
1
+ id: mimo-token-plan-china
2
+ displayName: Mimo Token Plan (China)
3
+ displayName_zh: Mimo Token Plan(中国)
4
+ description: Mimo Token Plan — Xiaomi's Anthropic-compatible gateway for MiMo models in China. Supports 1M context window.
5
+ description_zh: Mimo Token Plan — 小米中国区 Anthropic 兼容网关,支持 MiMo 模型,1M 上下文窗口。
6
+ defaultEndpoint: https://token-plan-cn.xiaomimimo.com/anthropic
7
+ defaultModelId: mimo-v2.5
8
+ endpointPresets:
9
+ - https://token-plan-cn.xiaomimimo.com/anthropic
10
+
11
+ secrets:
12
+ - key: api_key
13
+ description: Mimo Token Plan API Key. Format starts with tp-.
14
+ description_zh: Mimo Token Plan API Key,tp- 开头
15
+ default: <<MIMO_API_KEY>>
16
+ secret: true
17
+
18
+ models:
19
+ - id: mimo-v2.5-pro
20
+ displayName: MiMo v2.5 Pro
21
+ maxOutputTokens: 131072
22
+ capabilities:
23
+ image: false
24
+ video: false
25
+ audio: false
26
+ promptCaching:
27
+ default: 1h
28
+ ttlPresets:
29
+ - { value: 5m, label: 5min }
30
+ - { value: 1h, label: 1hour }
31
+ thinking:
32
+ mode: adaptive
33
+ defaultEnabled: true
34
+ default: high
35
+ effortPresets:
36
+ - { value: low, label: Low }
37
+ - { value: medium, label: Medium }
38
+ - { value: high, label: High }
39
+ - { value: max, label: Max }
40
+
41
+ - id: mimo-v2.5
42
+ displayName: MiMo v2.5
43
+ maxOutputTokens: 131072
44
+ capabilities:
45
+ image: true
46
+ video: false
47
+ audio: false
48
+ promptCaching:
49
+ default: 1h
50
+ ttlPresets:
51
+ - { value: 5m, label: 5min }
52
+ - { value: 1h, label: 1hour }
53
+ thinking:
54
+ mode: adaptive
55
+ defaultEnabled: true
56
+ default: high
57
+ effortPresets:
58
+ - { value: low, label: Low }
59
+ - { value: medium, label: Medium }
60
+ - { value: high, label: High }
61
+ - { value: max, label: Max }
@@ -0,0 +1,80 @@
1
+ id: minimax
2
+ displayName: MiniMax
3
+ displayName_zh: MiniMax
4
+ description: MiniMax M2.7 family via the Anthropic-compatible Messages API
5
+ description_zh: MiniMax M2.7 系列,通过 Anthropic 兼容的 Messages API 调用
6
+ defaultEndpoint: https://api.minimaxi.com/anthropic
7
+ defaultModelId: MiniMax-M2.7
8
+
9
+ secrets:
10
+ - key: api_key
11
+ description: MiniMax API Key. Get from https://platform.minimaxi.com/user-center/basic-information/interface-key
12
+ description_zh: MiniMax API Key。从 https://platform.minimaxi.com/user-center/basic-information/interface-key 获取
13
+ default: <<MINIMAX_API_KEY>>
14
+ secret: true
15
+
16
+ # Capability notes for MiniMax M2.7 family — verified against
17
+ # platform.minimaxi.com/docs/api-reference/text-anthropic-api on 2026-05-26
18
+ # plus live probes against MiniMax-M2.7:
19
+ # - image / video / audio: documented as not supported
20
+ # - thinking: forced on — `thinking:{type:'disabled'}` and omitting the
21
+ # field both still produce thinking blocks; only budget_tokens influences
22
+ # output. So we don't expose an off toggle.
23
+ # - cache_control: both models support caching. Doc says TTL is 5min,
24
+ # refreshing automatically on each hit. cache_control:{type:'ephemeral'}
25
+ # is the only shape — no longer-TTL knob exposed by MiniMax.
26
+ # - MiniMax-M2.7-highspeed: turn 1 reports cache_creation_input_tokens=N,
27
+ # turn 2 reports cache_read_input_tokens=N. Standard Anthropic shape.
28
+ # - MiniMax-M2.7: turn 1 reports cache_creation=0 (write happens
29
+ # implicitly without surfacing the count); turn 2 still reports
30
+ # cache_read_input_tokens=N. Read badge will appear after the first
31
+ # repeat, but the "write" badge never shows on M2.7 — quirk of
32
+ # MiniMax's reporting, not a Halo bug. Verified 2026-05-26.
33
+ # Cache is per-model (no cross-model sharing observed).
34
+ # - effort presets: pure Halo-side abstraction. `low` (1024 budget) was
35
+ # observed to truncate the run with stop=max_tokens before any thinking
36
+ # completes — leaving it out of the preset list. medium/high are safe.
37
+ models:
38
+ - id: MiniMax-M2.7
39
+ displayName: MiniMax M2.7
40
+ maxOutputTokens: 16384
41
+ capabilities:
42
+ image: false
43
+ video: false
44
+ audio: false
45
+ promptCaching:
46
+ default: 5m
47
+ ttlPresets:
48
+ - { value: 5m, label: 5min }
49
+ thinking:
50
+ # MiniMax thinking is always-on — there's no off switch. We still
51
+ # surface a Thinking control because budget_tokens shapes output
52
+ # length / latency. `effortPresets` are pure Halo-side labels;
53
+ # minimax-agent.ts maps them via effortToBudget() before sending.
54
+ mode: manual
55
+ defaultEnabled: true
56
+ default: medium
57
+ defaultBudgetTokens: 8192
58
+ effortPresets:
59
+ - { value: medium, label: Medium }
60
+ - { value: high, label: High }
61
+
62
+ - id: MiniMax-M2.7-highspeed
63
+ displayName: MiniMax M2.7 Highspeed
64
+ maxOutputTokens: 16384
65
+ capabilities:
66
+ image: false
67
+ video: false
68
+ audio: false
69
+ promptCaching:
70
+ default: 5m
71
+ ttlPresets:
72
+ - { value: 5m, label: 5min }
73
+ thinking:
74
+ mode: manual
75
+ defaultEnabled: true
76
+ default: medium
77
+ defaultBudgetTokens: 8192
78
+ effortPresets:
79
+ - { value: medium, label: Medium }
80
+ - { value: high, label: High }
@@ -0,0 +1,51 @@
1
+ id: openai
2
+ displayName: OpenAI (Generic)
3
+ displayName_zh: OpenAI(通用)
4
+ description: Generic OpenAI-compatible chat completions. Use for native OpenAI or any third-party OpenAI-compatible gateway. Capabilities are exposed openly — the user is expected to know what their endpoint supports.
5
+ description_zh: 通用 OpenAI 兼容协议。可用于原生 OpenAI 或任何第三方 OpenAI 兼容网关。能力字段开放给用户自选——由用户对端点能力自行负责。
6
+ defaultEndpoint: https://api.openai.com/v1
7
+ defaultModelId: gpt-4o
8
+ endpointPresets:
9
+ - https://api.openai.com/v1
10
+
11
+ secrets:
12
+ - key: api_key
13
+ description: API key for the chosen OpenAI-compatible endpoint. Format depends on provider (sk-... for OpenAI, ark-... for Volcengine, etc.)
14
+ description_zh: 所选 OpenAI 兼容端点的 API Key。前缀格式因厂商而异(OpenAI 是 sk-、火山方舟是 ark- 等)
15
+ default: <<OPENAI_API_KEY>>
16
+ secret: true
17
+
18
+ # This provider is a "user-fills-everything" placeholder. The single
19
+ # placeholder model below exists so the registry has something to render
20
+ # in the form's model dropdown — replace its id/endpoint with whatever
21
+ # you actually want to call. capabilities here are deliberately
22
+ # permissive (image/video/audio all true, full thinking + caching
23
+ # presets) so the form doesn't lock anything; if your real endpoint
24
+ # doesn't support, e.g., audio, just don't send audio.
25
+ #
26
+ # Custom model ids (anything not listed under `models:`) are treated as
27
+ # fully-permissive in the admin form — the user can flip image/video/
28
+ # audio toggles, pick caching TTL, and set thinking effort or budget.
29
+ models:
30
+ - id: gpt-4o
31
+ displayName: GPT-4o (placeholder)
32
+ maxOutputTokens: 16384
33
+ capabilities:
34
+ image: true
35
+ video: true
36
+ audio: true
37
+ promptCaching:
38
+ default: 5m
39
+ ttlPresets:
40
+ - { value: 5m, label: 5min }
41
+ - { value: 1h, label: 1hour }
42
+ thinking:
43
+ mode: manual
44
+ defaultEnabled: false
45
+ default: medium
46
+ defaultBudgetTokens: 8192
47
+ effortPresets:
48
+ - { value: low, label: Low }
49
+ - { value: medium, label: Medium }
50
+ - { value: high, label: High }
51
+ - { value: max, label: Max }
@@ -0,0 +1,78 @@
1
+ id: qwen
2
+ displayName: Qwen (Aliyun)
3
+ displayName_zh: 通义千问(阿里云)
4
+ description: Qwen3 family on Aliyun Bailian via the Anthropic-compatible Messages API
5
+ description_zh: 阿里云百炼通义千问,通过 Anthropic 兼容的 Messages API 调用
6
+ defaultEndpoint: https://dashscope.aliyuncs.com/apps/anthropic
7
+ defaultModelId: qwen3.7-max
8
+ endpointPresets:
9
+ - https://dashscope.aliyuncs.com/apps/anthropic # Beijing
10
+ - https://dashscope-intl.aliyuncs.com/apps/anthropic # Singapore
11
+ - https://dashscope-us.aliyuncs.com/apps/anthropic # Virginia
12
+
13
+ secrets:
14
+ - key: api_key
15
+ description: Aliyun Bailian (DashScope) API Key. Get from https://bailian.console.aliyun.com
16
+ description_zh: 阿里云百炼 API Key。从 https://bailian.console.aliyun.com 获取
17
+ default: <<DASHSCOPE_API_KEY>>
18
+ secret: true
19
+
20
+ # Capability notes for Qwen — verified end-to-end on 2026-05-26 against
21
+ # help.aliyun.com/zh/model-studio/anthropic-api-messages plus live probes:
22
+ # - cache_control: ephemeral (5min default per doc) — verified by sending
23
+ # same long system twice; turn1 reports cache_creation_input_tokens=N,
24
+ # turn2 reports cache_read_input_tokens=N. Standard Anthropic shape.
25
+ # Doc only mentions 5m; no 1h variant — qwen-agent.ts deliberately
26
+ # omits the `ttl` attribute.
27
+ # - thinking: honored both ways. type=enabled emits a thinking block,
28
+ # type=disabled really suppresses it (unlike MiniMax which forces it on).
29
+ # - image: probed live — qwen3.6-plus correctly identified colors (works
30
+ # despite docs saying a vision-specific model is required);
31
+ # qwen3.7-max returned `Unexpected item type in content` (not
32
+ # supported). So image:false on max, image:true on plus.
33
+ # - effort presets: pure Halo-side abstraction. Same effort→budget
34
+ # table as bedrock-agent.ts via qwen-agent.ts's effortToBudget().
35
+ # - temperature range: doc says [0, 2) instead of Anthropic's [0, 1] —
36
+ # doesn't affect Halo since we don't expose temperature in the form.
37
+ models:
38
+ - id: qwen3.7-max
39
+ displayName: Qwen3.7 Max
40
+ maxOutputTokens: 16384
41
+ capabilities:
42
+ image: false
43
+ video: false
44
+ audio: false
45
+ promptCaching:
46
+ default: 5m
47
+ ttlPresets:
48
+ - { value: 5m, label: 5min }
49
+ thinking:
50
+ # Anthropic legacy/manual shape: thinking:{type:'enabled', budget_tokens:N}.
51
+ # qwen-agent.ts maps effort labels via effortToBudget().
52
+ mode: manual
53
+ defaultEnabled: true
54
+ default: medium
55
+ defaultBudgetTokens: 8192
56
+ effortPresets:
57
+ - { value: medium, label: Medium }
58
+ - { value: high, label: High }
59
+
60
+ - id: qwen3.6-plus
61
+ displayName: Qwen3.6 Plus
62
+ maxOutputTokens: 16384
63
+ capabilities:
64
+ image: true
65
+ video: false
66
+ audio: false
67
+ promptCaching:
68
+ default: 5m
69
+ ttlPresets:
70
+ - { value: 5m, label: 5min }
71
+ thinking:
72
+ mode: manual
73
+ defaultEnabled: true
74
+ default: medium
75
+ defaultBudgetTokens: 8192
76
+ effortPresets:
77
+ - { value: medium, label: Medium }
78
+ - { value: high, label: High }
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: Tavily Web Search
3
+ description: Real-time web search using Tavily Search API. Use this skill when the user asks about current events, news, latest updates, prices, or any real-time information that requires up-to-date web results.
4
+ ---
5
+
6
+ # Tavily Web Search
7
+
8
+ Perform real-time web search via [Tavily Search API](https://docs.tavily.com/documentation/api-reference/endpoint/search). Returns structured results with content snippets and source URLs.
9
+
10
+ ## How to Use
11
+
12
+ Call `shell_exec` with the command below. Only change the query string in `-d`; keep `{{params.api_key}}` exactly as-is (the system substitutes it at runtime).
13
+
14
+ ```bash
15
+ curl -s -X POST https://api.tavily.com/search \
16
+ -H "Content-Type: application/json" \
17
+ -H "Authorization: Bearer {{params.api_key}}" \
18
+ -d '{"query":"your natural language query here","max_results":5,"include_answer":true}' \
19
+ | python3 -c "
20
+ import sys,json
21
+ r=json.load(sys.stdin)
22
+ if r.get('answer'): print('Answer:',r['answer'],'\n')
23
+ for x in r.get('results',[]):
24
+ print(f\"- [{x['title']}]({x['url']})\")
25
+ print(f\" {x['content'][:300]}\n\")
26
+ "
27
+ ```
28
+
29
+ For news queries, add `"topic":"news"` to `-d`. For deeper search, use `"search_depth":"advanced"` (costs 2 credits instead of 1).
30
+
31
+ ## Query Formulation
32
+
33
+ Use **natural language questions**.
34
+
35
+ ### Language choice — important
36
+
37
+ Tavily's index is dominated by English-language sources for international topics. Pick the query language by topic, not by the user's input language:
38
+
39
+ | Topic | Use English query | Use Chinese query |
40
+ |---|---|---|
41
+ | International sports / celebrities (e.g. Lionel Messi, Taylor Swift) | ✅ | ❌ Chinese hits niche aggregators only |
42
+ | International tech / products / pricing (e.g. iPhone, RTX 5080) | ✅ | ❌ |
43
+ | Global news / politics / finance | ✅ (or both) | Often weak |
44
+ | Domestic Chinese topics (A 股, 国内政策, 中文媒体) | ❌ | ✅ |
45
+ | Chinese tech ecosystem (e.g. 字节跳动, 小米) | Either | ✅ |
46
+
47
+ If the user asks in Chinese about an international topic, **translate the entity to its English form first**: 「梅西最新消息」→ `"Lionel Messi latest news"`. Don't pass `"梅西最新消息"` directly to the API for non-Chinese topics — you'll mostly miss ESPN / Bleacher Report / Reuters etc.
48
+
49
+ ### Time-sensitive queries: prefer `time_range`, not year keywords
50
+
51
+ Don't bake the year into the query string. Two reasons:
52
+ 1. You may be wrong about the current year. (The skill itself doesn't see today's date.)
53
+ 2. The index is fresher than your knowledge cutoff — pinning a year filters out the most relevant recent results.
54
+
55
+ **Use `time_range` instead**: add `"time_range":"day" | "week" | "month" | "year"` to `-d`. For breaking news, `"week"` is usually right; for a monthly review, `"month"`.
56
+
57
+ If the user explicitly anchors to a past year ("how was Apple's 2023?"), then a year keyword is correct.
58
+
59
+ ### Templates
60
+
61
+ | User Intent | Query template |
62
+ |---|---|
63
+ | Latest news on a person/product | `"<English entity name> latest news"` + `time_range: "week"` |
64
+ | Current product/pricing/specs | `"Tell me about <X>, including specs, price, and latest updates."` |
65
+ | Domestic Chinese news | `"<中文实体> 最新动态"` + `time_range: "week"` |
66
+ | General reference question | `"Search for information about X."` |
67
+
68
+ **Examples**:
69
+ - ✅ `"Lionel Messi latest news"` + `time_range: "week"`
70
+ - ✅ `"梅西最新动态"` (only if specifically targeting Chinese-language sources)
71
+ - ❌ `"梅西最新新闻 2025"` — wrong language for international topic *and* hard-coded year
72
+ - ❌ `"Messi news"` — too terse, no recency hint
73
+
74
+ ## Optional Parameters
75
+
76
+ Add these fields to the JSON body as needed:
77
+
78
+ | Parameter | Default | Description |
79
+ |---|---|---|
80
+ | `max_results` | 5 | Number of results (1–20) |
81
+ | `include_answer` | false | AI-generated summary answer (`true`, `"basic"`, or `"advanced"`) |
82
+ | `search_depth` | `"basic"` | `"basic"` / `"advanced"` (2 credits, higher relevance) |
83
+ | `topic` | `"general"` | `"news"` for time-sensitive queries |
84
+ | `time_range` | null | `"day"`, `"week"`, `"month"`, `"year"` |
85
+ | `include_raw_content` | false | Full page content (`true`, `"markdown"`, `"text"`) |
86
+ | `include_domains` | [] | Restrict to specific domains |
87
+ | `exclude_domains` | [] | Exclude specific domains |
88
+
89
+ ## Requirements
90
+
91
+ - API key configured at `tavily-web-search.params.api_key` in `~/.halo/secrets/settings.yaml`, or set env var `TAVILY_API_KEY`. Set it from the Settings page → Skills → Tavily Web Search.
@@ -0,0 +1,10 @@
1
+ displayName_zh: Tavily 联网搜索
2
+ description: Real-time web search via Tavily Search API.
3
+ description_zh: 通过 Tavily 搜索 API 进行实时联网搜索。
4
+
5
+ params:
6
+ - key: api_key
7
+ description: Tavily Search API Key. Get one at https://app.tavily.com.
8
+ description_zh: Tavily 搜索 API Key。从 https://app.tavily.com 获取。
9
+ default: <<TAVILY_API_KEY>>
10
+ secret: true
@@ -0,0 +1,35 @@
1
+ ## Tool Usage Guidelines
2
+
3
+ ### Tool Choice
4
+
5
+ Default priority:
6
+ - **Search content** → `grep` over shelling out (`grep` / `rg` / `find` in `shell_exec`)
7
+ - **Find files by name/pattern** → `glob` over `file_list` walking
8
+ - **Edit a file** → `file_edit` (targeted) over `file_write` (only for new files or full rewrites)
9
+ - **Read a large file** → `grep` first to locate the section, then `file_read` with `offset`/`limit`
10
+
11
+ Worked examples (query → tool):
12
+ - "Rename function `foo` everywhere" → `grep` for callers across the repo, then `file_edit` each hit.
13
+ - "Where does config X get loaded?" → `grep` the symbol, not a directory walk.
14
+ - "List all yaml under `.halo/agents`" → `glob({ pattern: "**/*.yaml", path: ".halo/agents" })`.
15
+ - "Find TODOs in the API layer" → `grep({ pattern: "TODO", path: "src/api", include: "*.ts" })`.
16
+
17
+ ### glob / grep — narrow the scope first
18
+ Both walk every file under their `path`. Pick the narrowest `path` that contains what you want, and use `include` (grep) or a specific pattern (glob) to filter further. Unsure where a file is? `file_list` a likely parent first to figure out the right subdirectory, then `glob` inside it.
19
+
20
+ ### Output
21
+ - Don't dump whole files — grep or summarize
22
+ - For >100 lines, focus on errors, stack traces, status codes
23
+
24
+ ### When a Tool Fails
25
+ - Read the error, don't blind-retry
26
+ - After 2 same-approach failures, change approach
27
+ - Common causes: wrong path (use `glob` to verify), stale content (re-read), `file_edit` mismatch (re-read first to copy `old_string` exactly)
28
+
29
+ ### file_edit staleness — re-read between edits to the same file
30
+ After any successful `file_edit`, your earlier `file_read` of that file is **stale**. Don't reach for `old_string` from memory or from an old read; the bytes have shifted. Re-read the relevant range, then build the next `old_string` from that fresh read. The same applies after any external change to a file (another agent, a build step, a shell command).
31
+
32
+ ### Execution
33
+ - If asked to do something, do it — don't just describe
34
+ - Text-only reply when tools fit the task = incomplete
35
+ - Report concrete results (files changed, commands run, output seen), not "done"
@@ -0,0 +1,4 @@
1
+ ### Shell
2
+ - `shell_exec` runs via the system shell (bash/sh) and has unrestricted access — install missing tools yourself (`apt`, `pip`/`pip3`, `npm`, `brew`, etc.). Missing tools / libraries are install problems, not refusal triggers — provision your own runtime (ffmpeg / pandoc / imagemagick for media, the right packages for ML/data work).
3
+ - Chain with `&&`; check exit status before continuing
4
+ - Unix conventions apply: `~/` for home, `/tmp` for scratch, forward-slash paths, `python3` for Python
@@ -0,0 +1,7 @@
1
+ ### Shell (Windows)
2
+ - Running on **Windows** — `shell_exec` runs commands through `cmd.exe`, not bash. Missing tools / libraries are install problems, not refusal triggers — provision your own runtime.
3
+ - Use Windows commands, not unix ones: `dir` (not `ls`), `type` (not `cat`), `findstr` (not `grep`), `del` (not `rm`), `copy`/`xcopy` (not `cp`), `move` (not `mv`), `mkdir` works but `mkdir -p` does not.
4
+ - Chain commands with `&&`; check `%ERRORLEVEL%` before continuing. (Prefer the `grep`/`glob`/`file_*` tools over shelling out — they're cross-platform.)
5
+ - **Paths**: home is `%USERPROFILE%` (not `~/`); scratch dir is `%TEMP%` (not `/tmp`). Backslash `\` is the separator, though forward slashes usually work inside quoted strings — prefer forward slashes for cross-platform tools.
6
+ - **Python**: the interpreter is usually `python` (sometimes the `py` launcher), not `python3`. When a skill's docs show `python3 …`, run `python …` instead.
7
+ - **Skill scripts**: some built-in skills ship `.py` helpers (e.g. cron, workspace, acp) and assume unix. If `python` isn't found, install Python first; the workspace skill's `stage.py` additionally needs `pip install pyyaml`. Skip any `chmod +x` step — it's a no-op on Windows.
@@ -0,0 +1,26 @@
1
+ ## First Conversation — Getting to Know You
2
+
3
+ No user profile exists yet. Before doing anything else, have a brief, warm getting-to-know-you exchange:
4
+
5
+ 1. Greet the user naturally
6
+ 2. Ask what they'd like to call you (your name as the AI)
7
+ 3. Ask how you should address them (their name or nickname)
8
+ 4. Ask about their preferred communication style — casual/formal, humor level, language preference, or anything else that matters to them
9
+
10
+ Keep it natural and conversational — 2-3 exchanges, not a form. The 4 items above are topics, not a questionnaire; weave them in as the conversation flows, don't ask them one by one. Adapt to whatever language the user responds in.
11
+
12
+ After collecting enough info, use `file_write` to create `~/.halo/global/USER.md` (global user profile, shared across all projects):
13
+
14
+ ```markdown
15
+ ---
16
+ user_name: [their name]
17
+ ai_name: [the name they chose for you]
18
+ lang: [preferred language, e.g. zh-CN, en]
19
+ ---
20
+
21
+ ## Communication Style
22
+
23
+ [Their preferences — humor, formality, etc.]
24
+ ```
25
+
26
+ Once USER.md is saved, naturally transition to helping with whatever the user needs. Do not mention this bootstrap process explicitly — just be friendly and curious.
@@ -0,0 +1,11 @@
1
+ ## Workspace Long-Term Memory
2
+
3
+ Each workspace has a `.halo/` directory whose persistent files outlive any single session — this is how the workspace remembers across conversations:
4
+
5
+ | File | Purpose | When to write |
6
+ |------|---------|---------------|
7
+ | `.halo/INSTRUCTIONS.md` | Project conventions | When writing normative rules |
8
+ | `.halo/INDEX.md` | Project documentation index | After project changes — remind the user to sync |
9
+ | `.halo/memory/YYYY-MM-DD.md` | Past work worth keeping | When something should outlive this session |
10
+
11
+ **New workspace has no INDEX.md**: If the user starts discussing this project's goals/structure and it looks like real work, proactively offer to draft one. Don't ask for casual browsing.
@@ -0,0 +1,30 @@
1
+ CREATE TABLE IF NOT EXISTS sessions (
2
+ id TEXT PRIMARY KEY,
3
+ title TEXT NOT NULL DEFAULT '',
4
+ messages TEXT NOT NULL,
5
+ message_count INTEGER NOT NULL DEFAULT 0,
6
+ created_at INTEGER NOT NULL,
7
+ updated_at INTEGER NOT NULL
8
+ );
9
+
10
+ CREATE TABLE IF NOT EXISTS agent_sessions (
11
+ id TEXT PRIMARY KEY,
12
+ parent_id TEXT,
13
+ agent_id TEXT NOT NULL,
14
+ agent_name TEXT NOT NULL DEFAULT '',
15
+ description TEXT NOT NULL DEFAULT '',
16
+ working_dir TEXT,
17
+ access_level TEXT,
18
+ created_at INTEGER NOT NULL,
19
+ updated_at INTEGER NOT NULL,
20
+ stopped_at INTEGER,
21
+ archived_at INTEGER
22
+ );
23
+
24
+ CREATE TABLE IF NOT EXISTS disabled_items (
25
+ item_type TEXT NOT NULL CHECK(item_type IN ('agent', 'skill')),
26
+ item_id TEXT NOT NULL,
27
+ scope TEXT NOT NULL CHECK(scope IN ('global', 'workspace')),
28
+ disabled_at INTEGER NOT NULL,
29
+ PRIMARY KEY (item_type, item_id, scope)
30
+ );