@turmind/halo 1.6.6 → 1.6.7

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.
@@ -1 +1 @@
1
- <!DOCTYPE html><!--Yc05ORrVk5IE9P1Gd8Ojh--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/e4af272ccee01ff0-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/7b736202f0b1dbfd.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/e890aa0d13e94290.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/659eccb5db697b76.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-74f577c1b094f942.js"/><script src="/_next/static/chunks/1b86ba38-c29611e086b2ce25.js" async=""></script><script src="/_next/static/chunks/698-19872069fed27164.js" async=""></script><script src="/_next/static/chunks/main-app-340a5b58ed229c4d.js" async=""></script><script src="/_next/static/chunks/989-066a874961bd519f.js" async=""></script><script src="/_next/static/chunks/app/layout-ea161287d934ba96.js" async=""></script><script src="/_next/static/chunks/1d2d5650-d8d130c85727fdbb.js" async=""></script><script src="/_next/static/chunks/87-6a2716c98a819c4e.js" async=""></script><script src="/_next/static/chunks/app/page-812bcbb46db628b6.js" async=""></script><meta name="next-size-adjust" content=""/><title>Halo - Multi-Agent Workspace</title><meta name="description" content="Multi-agent collaboration workspace for complex project delivery"/><link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="16x16"/><link rel="icon" href="/icon.svg?3a6863548daca964" type="image/svg+xml" sizes="any"/><script>try{var t=localStorage.getItem('halo_theme');if(t==='light'||t==='midnight'||t==='warm')document.documentElement.dataset.theme=t}catch(e){}</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_d8ebd1 font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-screen w-screen items-center justify-center bg-[var(--background)]"><div class="text-sm text-[var(--muted-foreground)]">Loading...</div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-74f577c1b094f942.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[58321,[\"989\",\"static/chunks/989-066a874961bd519f.js\",\"177\",\"static/chunks/app/layout-ea161287d934ba96.js\"],\"ThemeProvider\"]\n3:I[24554,[\"989\",\"static/chunks/989-066a874961bd519f.js\",\"177\",\"static/chunks/app/layout-ea161287d934ba96.js\"],\"AppI18nProvider\"]\n4:I[63693,[],\"\"]\n5:I[74713,[],\"\"]\n6:I[5444,[],\"ClientPageRoot\"]\n7:I[3124,[\"560\",\"static/chunks/1d2d5650-d8d130c85727fdbb.js\",\"87\",\"static/chunks/87-6a2716c98a819c4e.js\",\"989\",\"static/chunks/989-066a874961bd519f.js\",\"974\",\"static/chunks/app/page-812bcbb46db628b6.js\"],\"default\"]\na:I[23632,[],\"OutletBoundary\"]\nc:I[86889,[],\"AsyncMetadataOutlet\"]\ne:I[23632,[],\"ViewportBoundary\"]\n10:I[23632,[],\"MetadataBoundary\"]\n11:\"$Sreact.suspense\"\n13:I[1935,[],\"\"]\n:HL[\"/_next/static/media/e4af272ccee01ff0-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/7b736202f0b1dbfd.css\",\"style\"]\n:HL[\"/_next/static/css/e890aa0d13e94290.css\",\"style\"]\n:HL[\"/_next/static/css/659eccb5db697b76.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Yc05ORrVk5IE9P1Gd8Ojh\",\"p\":\"\",\"c\":[\"\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/7b736202f0b1dbfd.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/e890aa0d13e94290.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"try{var t=localStorage.getItem('halo_theme');if(t==='light'||t==='midnight'||t==='warm')document.documentElement.dataset.theme=t}catch(e){}\"}}]}],[\"$\",\"body\",null,{\"className\":\"__variable_d8ebd1 font-sans antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{\"Component\":\"$7\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@8\",\"$@9\"]}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/659eccb5db697b76.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"$La\",null,{\"children\":[\"$Lb\",[\"$\",\"$Lc\",null,{\"promise\":\"$@d\"}]]}]]}],{},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Le\",null,{\"children\":\"$Lf\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$L10\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$11\",null,{\"fallback\":null,\"children\":\"$L12\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$13\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:{}\n9:\"$0:f:0:1:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"f:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nb:null\n"])</script><script>self.__next_f.push([1,"14:I[88809,[],\"IconMark\"]\nd:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Halo - Multi-Agent Workspace\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Multi-agent collaboration workspace for complex project delivery\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\",\"sizes\":\"16x16\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/icon.svg?3a6863548daca964\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$L14\",\"4\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"12:\"$d:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--x5jl6YGvzL0Ys4lxsHVg1--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/e4af272ccee01ff0-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/7b736202f0b1dbfd.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/e890aa0d13e94290.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/659eccb5db697b76.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-74f577c1b094f942.js"/><script src="/_next/static/chunks/1b86ba38-c29611e086b2ce25.js" async=""></script><script src="/_next/static/chunks/698-19872069fed27164.js" async=""></script><script src="/_next/static/chunks/main-app-340a5b58ed229c4d.js" async=""></script><script src="/_next/static/chunks/989-cb287787a4aca288.js" async=""></script><script src="/_next/static/chunks/app/layout-ea161287d934ba96.js" async=""></script><script src="/_next/static/chunks/1d2d5650-d8d130c85727fdbb.js" async=""></script><script src="/_next/static/chunks/87-6a2716c98a819c4e.js" async=""></script><script src="/_next/static/chunks/app/page-3584adfe2f9a0913.js" async=""></script><meta name="next-size-adjust" content=""/><title>Halo - Multi-Agent Workspace</title><meta name="description" content="Multi-agent collaboration workspace for complex project delivery"/><link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="16x16"/><link rel="icon" href="/icon.svg?3a6863548daca964" type="image/svg+xml" sizes="any"/><script>try{var t=localStorage.getItem('halo_theme');if(t==='light'||t==='midnight'||t==='warm')document.documentElement.dataset.theme=t}catch(e){}</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_d8ebd1 font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-screen w-screen items-center justify-center bg-[var(--background)]"><div class="text-sm text-[var(--muted-foreground)]">Loading...</div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-74f577c1b094f942.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[58321,[\"989\",\"static/chunks/989-cb287787a4aca288.js\",\"177\",\"static/chunks/app/layout-ea161287d934ba96.js\"],\"ThemeProvider\"]\n3:I[24554,[\"989\",\"static/chunks/989-cb287787a4aca288.js\",\"177\",\"static/chunks/app/layout-ea161287d934ba96.js\"],\"AppI18nProvider\"]\n4:I[63693,[],\"\"]\n5:I[74713,[],\"\"]\n6:I[5444,[],\"ClientPageRoot\"]\n7:I[3124,[\"560\",\"static/chunks/1d2d5650-d8d130c85727fdbb.js\",\"87\",\"static/chunks/87-6a2716c98a819c4e.js\",\"989\",\"static/chunks/989-cb287787a4aca288.js\",\"974\",\"static/chunks/app/page-3584adfe2f9a0913.js\"],\"default\"]\na:I[23632,[],\"OutletBoundary\"]\nc:I[86889,[],\"AsyncMetadataOutlet\"]\ne:I[23632,[],\"ViewportBoundary\"]\n10:I[23632,[],\"MetadataBoundary\"]\n11:\"$Sreact.suspense\"\n13:I[1935,[],\"\"]\n:HL[\"/_next/static/media/e4af272ccee01ff0-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/7b736202f0b1dbfd.css\",\"style\"]\n:HL[\"/_next/static/css/e890aa0d13e94290.css\",\"style\"]\n:HL[\"/_next/static/css/659eccb5db697b76.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"x5jl6YGvzL0Ys4lxsHVg1\",\"p\":\"\",\"c\":[\"\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/7b736202f0b1dbfd.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/e890aa0d13e94290.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"try{var t=localStorage.getItem('halo_theme');if(t==='light'||t==='midnight'||t==='warm')document.documentElement.dataset.theme=t}catch(e){}\"}}]}],[\"$\",\"body\",null,{\"className\":\"__variable_d8ebd1 font-sans antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{\"Component\":\"$7\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@8\",\"$@9\"]}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/659eccb5db697b76.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"$La\",null,{\"children\":[\"$Lb\",[\"$\",\"$Lc\",null,{\"promise\":\"$@d\"}]]}]]}],{},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Le\",null,{\"children\":\"$Lf\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$L10\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$11\",null,{\"fallback\":null,\"children\":\"$L12\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$13\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:{}\n9:\"$0:f:0:1:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"f:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nb:null\n"])</script><script>self.__next_f.push([1,"14:I[88809,[],\"IconMark\"]\nd:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Halo - Multi-Agent Workspace\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Multi-agent collaboration workspace for complex project delivery\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\",\"sizes\":\"16x16\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/icon.svg?3a6863548daca964\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$L14\",\"4\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"12:\"$d:metadata\"\n"])</script></body></html>
@@ -1,10 +1,10 @@
1
1
  1:"$Sreact.fragment"
2
- 2:I[58321,["989","static/chunks/989-066a874961bd519f.js","177","static/chunks/app/layout-ea161287d934ba96.js"],"ThemeProvider"]
3
- 3:I[24554,["989","static/chunks/989-066a874961bd519f.js","177","static/chunks/app/layout-ea161287d934ba96.js"],"AppI18nProvider"]
2
+ 2:I[58321,["989","static/chunks/989-cb287787a4aca288.js","177","static/chunks/app/layout-ea161287d934ba96.js"],"ThemeProvider"]
3
+ 3:I[24554,["989","static/chunks/989-cb287787a4aca288.js","177","static/chunks/app/layout-ea161287d934ba96.js"],"AppI18nProvider"]
4
4
  4:I[63693,[],""]
5
5
  5:I[74713,[],""]
6
6
  6:I[5444,[],"ClientPageRoot"]
7
- 7:I[3124,["560","static/chunks/1d2d5650-d8d130c85727fdbb.js","87","static/chunks/87-6a2716c98a819c4e.js","989","static/chunks/989-066a874961bd519f.js","974","static/chunks/app/page-812bcbb46db628b6.js"],"default"]
7
+ 7:I[3124,["560","static/chunks/1d2d5650-d8d130c85727fdbb.js","87","static/chunks/87-6a2716c98a819c4e.js","989","static/chunks/989-cb287787a4aca288.js","974","static/chunks/app/page-3584adfe2f9a0913.js"],"default"]
8
8
  a:I[23632,[],"OutletBoundary"]
9
9
  c:I[86889,[],"AsyncMetadataOutlet"]
10
10
  e:I[23632,[],"ViewportBoundary"]
@@ -15,7 +15,7 @@ e:I[23632,[],"ViewportBoundary"]
15
15
  :HL["/_next/static/css/7b736202f0b1dbfd.css","style"]
16
16
  :HL["/_next/static/css/e890aa0d13e94290.css","style"]
17
17
  :HL["/_next/static/css/659eccb5db697b76.css","style"]
18
- 0:{"P":null,"b":"Yc05ORrVk5IE9P1Gd8Ojh","p":"","c":["",""],"i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/7b736202f0b1dbfd.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/e890aa0d13e94290.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"dark","suppressHydrationWarning":true,"children":[["$","head",null,{"children":["$","script",null,{"dangerouslySetInnerHTML":{"__html":"try{var t=localStorage.getItem('halo_theme');if(t==='light'||t==='midnight'||t==='warm')document.documentElement.dataset.theme=t}catch(e){}"}}]}],["$","body",null,{"className":"__variable_d8ebd1 font-sans antialiased","children":["$","$L2",null,{"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L6",null,{"Component":"$7","searchParams":{},"params":{},"promises":["$@8","$@9"]}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/659eccb5db697b76.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","$La",null,{"children":["$Lb",["$","$Lc",null,{"promise":"$@d"}]]}]]}],{},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Le",null,{"children":"$Lf"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$L10",null,{"children":["$","div",null,{"hidden":true,"children":["$","$11",null,{"fallback":null,"children":"$L12"}]}]}]]}],false]],"m":"$undefined","G":["$13",[]],"s":false,"S":true}
18
+ 0:{"P":null,"b":"x5jl6YGvzL0Ys4lxsHVg1","p":"","c":["",""],"i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/7b736202f0b1dbfd.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/e890aa0d13e94290.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"dark","suppressHydrationWarning":true,"children":[["$","head",null,{"children":["$","script",null,{"dangerouslySetInnerHTML":{"__html":"try{var t=localStorage.getItem('halo_theme');if(t==='light'||t==='midnight'||t==='warm')document.documentElement.dataset.theme=t}catch(e){}"}}]}],["$","body",null,{"className":"__variable_d8ebd1 font-sans antialiased","children":["$","$L2",null,{"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L6",null,{"Component":"$7","searchParams":{},"params":{},"promises":["$@8","$@9"]}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/659eccb5db697b76.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","$La",null,{"children":["$Lb",["$","$Lc",null,{"promise":"$@d"}]]}]]}],{},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Le",null,{"children":"$Lf"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$L10",null,{"children":["$","div",null,{"hidden":true,"children":["$","$11",null,{"fallback":null,"children":"$L12"}]}]}]]}],false]],"m":"$undefined","G":["$13",[]],"s":false,"S":true}
19
19
  8:{}
20
20
  9:"$0:f:0:1:2:children:1:props:children:0:props:params"
21
21
  f:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
@@ -279,6 +279,14 @@ An extension can ship agent skills next to its viewer: `~/.halo/global/extension
279
279
  - **Read from disk**: the server, CLI / TUI and cron children all scan the extensions root on every read, never the in-memory registry, so every process sees the same set. In the admin, the `extension:changed` frame also bumps the skill bus, so the Skills sidebar and the agent form's skill picker refetch. Uninstalling removes the skills at once (next read finds no folder, no restart). The watcher is non-recursive, so editing files inside an installed extension's `skills/` pushes nothing. Reinstalling the extension is the way to publish a change.
280
280
  - **Sandbox**: `~/.halo/global/extensions/**` is outside the sandbox hidden lists, so workspace- and readonly-access sessions can read the skill's resources, and a workspace-access `shell_exec` can run its scripts. `activate_skill` names the skill's absolute directory in its resources header, so the agent knows where they are.
281
281
 
282
+ ### Extension docs
283
+
284
+ An extension documents itself; nothing it ships is injected into prompts or INDEX (per-turn tokens, and INDEX has a 12K-character budget).
285
+
286
+ - **Agent-facing instructions** → an extension skill (above). Opt-in per agent like any skill; an install never enables one by itself.
287
+ - **Human-facing docs** → `README.md` at the extension root (every halo-hub extension has one), plus `DESIGN.md` for internals. They ship in the zip and sit at `~/.halo/global/extensions/<id>/` once installed.
288
+ - **How agents find them** → the built-in `halo` skill (Platform Documentation, since `TEMPLATE_VERSION` 104) tells the agent to `file_read` that README when asked about an installed extension. The core repo's docs cover only what the core implements (protocol, capabilities, server proxies), not a hub extension's behavior.
289
+
282
290
  ## `extension` skill and halo-hub
283
291
 
284
292
  Built-in skill `templates/skills/extension/` (in `BUILTIN_SKILL_IDS`; `TEMPLATE_VERSION` bumped to 69 in the same change): object command `/extension install|list|remove|models` (`models` = model provider configs, see the end of this section), `requiresAccess: full`. The built-in `default` agent lists it in `skills:` (since `TEMPLATE_VERSION` 81), so `/extension` shows in the command popup wherever the default agent is the built-in one. The payload reaches the body as `$ARGUMENTS`; when it names a source the agent installs right away without confirming, and it mentions the hub only when asked what exists or when an install fails. Everything goes through `templates/ext.sh` (curl + unzip + node, + git for tag-based hubs; no `gh`). `ext.sh install <id|zip|url>`: a zip path / URL is used as given, an id is fetched from the hub (below); then the same pre-check + six-step atomic replace as the server. It never talks to the server — the watcher picks the rename up within ~300 ms. The `halo` skill has a one-line pointer.
@@ -830,7 +830,8 @@ Resolves declared schema (from `models/<id>.yaml` `secrets:`, `skills/<id>/confi
830
830
  "value": "AK****ST", // already masked when secret:true; null = unset
831
831
  "hasValue": true, // any layer has a non-empty value
832
832
  "source": "global", // 'workspace' | 'global' | 'unset'
833
- "inheritedFromGlobal": false // true when scope=workspace + value came from global
833
+ "inheritedFromGlobal": false, // true when scope=workspace + value came from global
834
+ "envMissing": [] // names of <<X>> placeholders in the effective value whose env var is unset in the server process; names only, never values
834
835
  }
835
836
  ]
836
837
  }
@@ -841,7 +842,7 @@ Resolves declared schema (from `models/<id>.yaml` `secrets:`, `skills/<id>/confi
841
842
  }
842
843
  ```
843
844
 
844
- `<<ENV_NAME>>` references in stored values are returned **as literals** (the browser never sees the resolved env var). Secret values are masked (`AK****ST`); env-var refs pass through unmasked since they're not real secrets.
845
+ `<<ENV_NAME>>` references in stored values are returned **as literals** (the browser never sees the resolved env var). Secret values are masked (`AK****ST`); env-var refs pass through unmasked since they're not real secrets. `envMissing` lists the referenced variables that are unset in the server's `process.env` (empty when all are set or the value has no placeholder); the Settings page shows a warning for them.
845
846
 
846
847
  ### PATCH `/api/settings`
847
848
 
@@ -105,12 +105,24 @@ env vars (process.env.X) > workspace settings.yaml > global settings.yaml > sche
105
105
 
106
106
  ## Missing env var
107
107
 
108
- If `process.env.EXAMPLE_KEY` is unset and the value at `caption-image.params.api_key` is `<<EXAMPLE_KEY>>`:
109
- - The agent sees the literal `<<EXAMPLE_KEY>>` in the rendered skill body
110
- - The server logs `[MdVars] Env var "EXAMPLE_KEY" not set — keeping <<EXAMPLE_KEY>> literal`
111
- - API calls the agent makes will fail with a clear error (usually HTTP 401) and the error message will reveal the literal, so the user can tell what to fix
108
+ An unset variable is never replaced with an empty string. The `<<NAME>>` literal is kept, and Halo reports it where it can:
112
109
 
113
- This is intentional: empty strings hide the misconfiguration; literals make it visible.
110
+ - **Model provider credentials** (`<provider>.secrets.api_key`, `access_key_id` / `secret_access_key`): the request is never sent. Each turn ends at once with one error in the chat (and on channels), with no retries. The error names the provider, the field and the variable, e.g. `minimax api_key uses <<MINIMAX_API_KEY>>, but MINIMAX_API_KEY is not set in the Halo server's environment. …`, and says how to fix it. You can still open the session, list it and read its history. Only calling the model fails.
111
+ - **Settings page**: a field whose value names an unset variable shows an amber warning under the input naming the variable. The check runs against the server process's environment, not your shell's.
112
+ - **Skill / AGENT.md placeholders** (`{{caption-image.params.api_key}}` → `<<EXAMPLE_KEY>>`): the agent sees the literal `<<EXAMPLE_KEY>>` in the rendered body, and the server logs `[MdVars] Env var "EXAMPLE_KEY" not set — keeping <<EXAMPLE_KEY>> literal`. Any request the agent makes with it fails on the far side, and don't count on that error naming the variable. A provider usually just answers 401 (MiniMax: `login fail: Please carry the API secret key…`).
113
+
114
+ ## Where the server reads environment variables
115
+
116
+ `<<NAME>>` resolves against the **Halo server process's** environment, not your login shell's. An `export` in `~/.bashrc` / `~/.zshrc` only reaches a server started from a shell that read it:
117
+
118
+ | How the server runs | Where its environment comes from | After adding a variable |
119
+ |---|---|---|
120
+ | Foreground `halo server start` | The terminal you started it in | Restart it from a terminal that has the variable |
121
+ | `halo server start -d` on Linux (systemd user unit) | `~/.halo/secrets/server.env`, a snapshot of your shell's environment written by `start -d` / `halo server restart`. Run inside the server (an agent's shell, the admin terminal), `restart` keeps the existing snapshot | Open a new terminal (so it has the variable) and run `halo server restart`. Or edit `server.env` and restart |
122
+ | System unit (`/etc/systemd/system/*.service`) | Only the unit's `Environment=` / `EnvironmentFile=` lines; `~/.bashrc` is never read | Add the variable there, `sudo systemctl daemon-reload`, then restart the unit |
123
+ | Desktop app (macOS) opened from the Dock / Finder | launchd's environment; `~/.zshrc` is never read | Enter the key in Settings, or start the app binary from a terminal that has the variable (`/Applications/Halo.app/Contents/MacOS/Halo`) |
124
+
125
+ If in doubt, put the key itself in Settings: it works the same under every launcher.
114
126
 
115
127
  ## Placeholder rules
116
128
 
@@ -167,6 +167,9 @@ Values can carry `<<ENV_NAME>>` placeholders. They're expanded:
167
167
 
168
168
  Env var unset → the `<<ENV_NAME>>` literal stays verbatim, plus `[MdVars] Env var "X" not set — keeping <<X>> literal` in the server log. The Settings UI returns the literal too — the browser never sees the real env value.
169
169
 
170
+ - **Settings page hint**: each field in the `GET /api/settings` response carries `envMissing`, the names of `<<X>>` placeholders in its effective value whose variable is unset in the server process (names only, never values). The page shows an amber warning under that field's input naming the variables, and explains that background servers and the desktop app don't read `~/.bashrc` / `~/.zshrc`. The check runs against the server's `process.env`, not the user's shell.
171
+ - **Model provider credentials** (`api_key`, `access_key_id` / `secret_access_key`): an unset placeholder is never sent as the key. Every model call in that session fails before the request with one `account`-class error naming the provider, field and variable, with no retries; opening and reading the session still work. A variable added while the session is in memory takes effect once the session's agent is rebuilt. See [guide/secrets-and-credentials.md → Missing env var](../guide/secrets-and-credentials.md#missing-env-var).
172
+
170
173
  ## Agent visibility
171
174
 
172
175
  Placeholder syntax in MD bodies (SKILL.md / AGENT.md):
package/dist/index.js CHANGED
@@ -2227,6 +2227,7 @@ __export(config_exports, {
2227
2227
  getServerParam: () => getServerParam,
2228
2228
  getServerSecret: () => getServerSecret,
2229
2229
  invalidateModelsRegistry: () => invalidateModelsRegistry,
2230
+ missingEnvRefs: () => missingEnvRefs,
2230
2231
  modelSupportsAudio: () => modelSupportsAudio,
2231
2232
  modelSupportsImage: () => modelSupportsImage,
2232
2233
  modelSupportsVideo: () => modelSupportsVideo,
@@ -2410,6 +2411,9 @@ function expandEnv(raw) {
2410
2411
  return "";
2411
2412
  return raw.replace(ENV_PATTERN2, (m, name) => process.env[name] ?? m);
2412
2413
  }
2414
+ function missingEnvRefs(raw) {
2415
+ return [...new Set([...raw.matchAll(ENV_PATTERN2)].map((m) => m[1]))].filter((name) => process.env[name] === void 0);
2416
+ }
2413
2417
  function getWorkspaceSettings(workspaceRoot) {
2414
2418
  const p = path11.join(workspaceRoot, ".halo", "settings.yaml");
2415
2419
  let mtimeMs = 0;
@@ -2900,6 +2904,8 @@ function classifyKind(msg, errName, httpStatus) {
2900
2904
  if (msg.includes("too many input tokens") || msg.includes("prompt_too_long") || msg.includes("ContextWindowOverflow") || msg.includes("Input is too long")) {
2901
2905
  return "context_overflow";
2902
2906
  }
2907
+ if (errName === "MissingEnvCredentialError")
2908
+ return "account";
2903
2909
  const isAccountError = httpStatus !== void 0 ? httpStatus === 401 || httpStatus === 402 || httpStatus === 403 : msg.includes("insufficient balance") || msg.includes("suspended") || msg.includes("invalid api key") || msg.includes("Invalid API Key") || msg.includes("Unauthorized") || msg.includes("authentication");
2904
2910
  if (isAccountError) {
2905
2911
  return "account";
@@ -2924,9 +2930,13 @@ function classifyKind(msg, errName, httpStatus) {
2924
2930
  }
2925
2931
  return "fatal";
2926
2932
  }
2933
+ var MissingEnvCredentialError;
2927
2934
  var init_model_error = __esm({
2928
2935
  "../server/dist/agents/model-error.js"() {
2929
2936
  "use strict";
2937
+ MissingEnvCredentialError = class extends Error {
2938
+ name = "MissingEnvCredentialError";
2939
+ };
2930
2940
  }
2931
2941
  });
2932
2942
 
@@ -4149,7 +4159,7 @@ var init_init = __esm({
4149
4159
  path14.resolve(__dirname, "..", "bundled-docs"),
4150
4160
  path14.resolve(__dirname, "..", "..", "..", ".halo", "docs")
4151
4161
  ];
4152
- TEMPLATE_VERSION = 103;
4162
+ TEMPLATE_VERSION = 105;
4153
4163
  VERSION_FILE = ".template-version";
4154
4164
  SKIP_NAMES = /* @__PURE__ */ new Set([".DS_Store", "schema.sql", "__pycache__", ".pytest_cache"]);
4155
4165
  BUILTIN_AGENT_IDS = /* @__PURE__ */ new Set([
@@ -13708,6 +13718,7 @@ var init_session_agent_builder = __esm({
13708
13718
  init_system_prompts();
13709
13719
  init_md_loader();
13710
13720
  init_config();
13721
+ init_model_error();
13711
13722
  init_agent_loader();
13712
13723
  init_db();
13713
13724
  init_skill_sources();
@@ -14023,6 +14034,16 @@ ${roster}`;
14023
14034
  apiKey,
14024
14035
  sessionId
14025
14036
  });
14037
+ const unresolved = [
14038
+ ...apiKey ? [{ key: "api_key", value: apiKey }] : [],
14039
+ ...awsCreds2 ? [{ key: "access_key_id", value: awsCreds2.accessKeyId }, { key: "secret_access_key", value: awsCreds2.secretAccessKey }] : []
14040
+ ].map((f) => ({ key: f.key, names: missingEnvRefs(f.value) })).filter((f) => f.names.length > 0);
14041
+ if (unresolved.length > 0) {
14042
+ const names = [...new Set(unresolved.flatMap((f) => f.names))];
14043
+ const message = `${providerId} ${unresolved.map((f) => `${f.key} uses ${f.names.map((n) => `<<${n}>>`).join(" ")}`).join(", ")}, but ${names.join(", ")} ${names.length > 1 ? "are" : "is"} not set in the Halo server's environment. Background servers (systemd, \`halo server start -d\`) and the desktop app opened from the Dock don't read ~/.bashrc / ~/.zshrc \u2014 enter the key in Settings, or add the variable to the server's environment and restart it (from a new terminal: \`halo server restart\`).`;
14044
+ const run = agent.run.bind(agent);
14045
+ agent.run = (input, options) => run(input, { ...options, beforeCallModel: () => Promise.reject(new MissingEnvCredentialError(message)) });
14046
+ }
14026
14047
  const thinkingEffort = thinkingConfig?.enabled ? thinkingConfig.effort ?? thinkingConfig.budget ?? (thinkingConfig.budget_tokens != null ? `${thinkingConfig.budget_tokens}` : "medium") : "off";
14027
14048
  return { agent, thinkingEffort, contextConfig };
14028
14049
  }
@@ -14303,7 +14324,7 @@ async function initObservability(haloProcess = "server") {
14303
14324
  return true;
14304
14325
  }
14305
14326
  const { registerSdk: registerSdk2 } = await Promise.resolve().then(() => (init_otel_sdk(), otel_sdk_exports));
14306
- providers = await registerSdk2(process.env.OTEL_SERVICE_NAME, "1.6.6", haloProcess);
14327
+ providers = await registerSdk2(process.env.OTEL_SERVICE_NAME, "1.6.7", haloProcess);
14307
14328
  console.log(`[Observability] OTLP export \u2192 ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT} (service.name=${process.env.OTEL_SERVICE_NAME}, halo.process=${haloProcess}, capture_content=${config.observability.captureContent})`);
14308
14329
  return true;
14309
14330
  }
@@ -23792,7 +23813,8 @@ function fieldFor(section, f, globalTree, workspaceTree) {
23792
23813
  value,
23793
23814
  hasValue: raw !== void 0,
23794
23815
  source,
23795
- inheritedFromGlobal
23816
+ inheritedFromGlobal,
23817
+ envMissing: raw === void 0 ? [] : missingEnvRefs(raw)
23796
23818
  };
23797
23819
  }
23798
23820
  function detectOrphans(tree, declared) {
@@ -23953,6 +23975,7 @@ var init_settings = __esm({
23953
23975
  "use strict";
23954
23976
  init_settings_schema();
23955
23977
  init_workspace_path();
23978
+ init_config();
23956
23979
  GLOBAL_SETTINGS_PATH2 = path64.join(homedir22(), ".halo", "secrets", "settings.yaml");
23957
23980
  _changeListeners = [];
23958
23981
  }
@@ -28154,7 +28177,9 @@ function setupWebSocketHandler(deps) {
28154
28177
  sendJson(ws, { type: "error", error: "No workspace context for delete", sessionId: delSessionId });
28155
28178
  return;
28156
28179
  }
28157
- await sm.deleteSession(delSessionId);
28180
+ for (const id of await sm.deleteSession(delSessionId)) {
28181
+ await findAndDeleteSessionFile(id, sm.workspaceRoot);
28182
+ }
28158
28183
  client.subscriptions.get(delSessionId)?.();
28159
28184
  client.subscriptions.delete(delSessionId);
28160
28185
  sendJson(ws, { type: "session:deleted", sessionId: delSessionId });
@@ -28971,7 +28996,7 @@ function buildCard(workspace, interfaceUrl, caps) {
28971
28996
  return {
28972
28997
  name: raw.name,
28973
28998
  description: raw.description,
28974
- version: typeof raw.version === "string" ? raw.version : "1.6.6",
28999
+ version: typeof raw.version === "string" ? raw.version : "1.6.7",
28975
29000
  supportedInterfaces: [{ url: interfaceUrl, protocolBinding: "JSONRPC", protocolVersion: A2A_VERSION }],
28976
29001
  capabilities: { streaming: caps.streaming, pushNotifications: true, extendedAgentCard: false },
28977
29002
  ...caps.tokenAuth === false ? {} : {
@@ -37238,7 +37263,7 @@ var init_dist2 = __esm({
37238
37263
  init_git_ssh();
37239
37264
  __dirname3 = path87.dirname(fileURLToPath3(import.meta.url));
37240
37265
  PORT = config.server.port;
37241
- HALO_VERSION = "1.6.6";
37266
+ HALO_VERSION = "1.6.7";
37242
37267
  PROJECT_ROOT = findProjectRoot();
37243
37268
  HALO_HOME4 = path87.join(homedir25(), ".halo");
37244
37269
  GIT_SHA = readGitSha();
@@ -38848,7 +38873,7 @@ function installUserUnit(opts, run = runCommand) {
38848
38873
  }
38849
38874
 
38850
38875
  // src/index.ts
38851
- var VERSION = "1.6.6";
38876
+ var VERSION = "1.6.7";
38852
38877
  var HELP_TOP = `Usage: halo <command> [options]
38853
38878
 
38854
38879
  Commands:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@turmind/halo",
3
- "version": "1.6.6",
3
+ "version": "1.6.7",
4
4
  "description": "Halo — multi-agent collaborative workspace. CLI + TUI + HTTP/WS server in one package.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -95,6 +95,8 @@ What's bundled (and what's not):
95
95
 
96
96
  Questions outside these rows aren't in the bundled docs (backend internals, REST API reference, design specs live in the Halo source repo). Read the code or tell the user you don't know.
97
97
 
98
+ Installed extensions carry their own docs: `file_read` `~/.halo/global/extensions/<id>/README.md` (and `DESIGN.md` when present) for questions about one; `file_list ~/.halo/global/extensions/` shows what is installed.
99
+
98
100
  ## Skills
99
101
 
100
102
  Skills are referenced by id from an agent's `agent.yaml`. The system prompt shows each skill's name + description; the full body is loaded on demand via `activate_skill`.