@turmind/halo 0.2.1 → 0.2.3
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/README.md +109 -46
- package/admin-out/404.html +1 -1
- package/admin-out/_next/static/chunks/app/page-f6e0adceb730c1a7.js +1 -0
- package/admin-out/index.html +1 -1
- package/admin-out/index.txt +2 -2
- package/bundled-docs/design/agentcore.md +97 -0
- package/bundled-docs/design/evolution.md +2 -2
- package/bundled-docs/design/halo-city.md +18 -5
- package/bundled-docs/design/storage.md +4 -4
- package/bundled-docs/design/web.md +10 -8
- package/bundled-docs/dev/api.md +3 -1
- package/bundled-docs/dev/deploy.md +10 -0
- package/bundled-docs/dev/env.md +3 -2
- package/bundled-docs/dev/tools.md +4 -3
- package/bundled-docs/guide/channels/web.md +2 -0
- package/bundled-docs/requirements/explorer.md +1 -0
- package/bundled-docs/requirements/settings.md +10 -3
- package/dist/index.js +986 -341
- package/package.json +1 -1
- package/admin-out/_next/static/chunks/app/page-31317ef1fb0ba31f.js +0 -1
- /package/admin-out/_next/static/{iSrc6429pyTB0lK-EE5oH → NE1IhKMHm2l1nBV-EMjhV}/_buildManifest.js +0 -0
- /package/admin-out/_next/static/{iSrc6429pyTB0lK-EE5oH → NE1IhKMHm2l1nBV-EMjhV}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -6,49 +6,119 @@
|
|
|
6
6
|
|
|
7
7
|
[English](README.md) | [中文](README.zh-CN.md)
|
|
8
8
|
|
|
9
|
-
**
|
|
9
|
+
**Throw in an idea. A team of agents builds it.**
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Halo is a multi-agent workspace you drive in plain language. A primary agent reads your intent, breaks the work down, and fans it out to sub-agents that run in parallel — while every reasoning step and tool call streams by live, and you interrupt, redirect, or take over whenever you like. Everything the team knows and produces is plain files in a workspace you can read, edit, `git clone`, and share. No hidden memory. No opaque state.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+

|
|
14
|
+
<p align="center"><sub>One prompt — <i>“Build a landing page for our coffee roastery… split the sections across sub-agents in parallel, then assemble.”</i> Executors fan out, report back, and the assembled page previews in Canvas, all in one browser tab.</sub></p>
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
## Install
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g @turmind/halo # one binary, all subcommands
|
|
20
|
+
halo setup # interactive: password / port / model keys / optional skills
|
|
21
|
+
halo server start # → open http://localhost:9527
|
|
22
|
+
```
|
|
20
23
|
|
|
21
|
-
|
|
24
|
+
> [!IMPORTANT]
|
|
25
|
+
> **First message fails with `Could not load credentials from any providers`?** API keys entered during `halo setup` are stored but **not auto-bound to any agent** — the built-in `default` agent initially points at AWS Bedrock. Open **Agents → default** in the admin and switch its model provider to the one you configured. (Bedrock users with a working AWS credential chain are unaffected.) Details in [Quick Start](#quick-start).
|
|
22
26
|
|
|
23
|
-
|
|
27
|
+
## Why Halo
|
|
24
28
|
|
|
25
|
-
|
|
29
|
+
### 🧬 It rewrites its own prompts — and you review the diff
|
|
26
30
|
|
|
27
|
-
|
|
31
|
+
Halo learns from its own conversations. Run `/evo` (or let pre-compact trigger it): an internal evolution agent analyzes the session, drafts a patch to the workspace's own prompt files, dry-runs the patched agent in a sandbox against the original scenario, and a scoring agent grades the outcome. You approve or reject in the **Evolution** tab; approved patches merge back into the workspace. Real file diffs reviewed by you — not silent fine-tuning.
|
|
28
32
|
|
|
29
|
-
|
|
33
|
+

|
|
34
|
+
<p align="center"><sub>A real run awaiting review: lint / behavior / scope scores, the grader's reasoning, and the patch itself — one click merges it into the workspace.</sub></p>
|
|
30
35
|
|
|
31
|
-
|
|
36
|
+
### 📁 The whole agent team is one folder
|
|
32
37
|
|
|
33
|
-
|
|
38
|
+
Personas, skills, knowledge, session history — the entire agent team lives under `.halo/` as plain files:
|
|
34
39
|
|
|
35
|
-
```bash
|
|
36
|
-
npm install -g @turmind/halo
|
|
37
|
-
halo setup # interactive: password / port / model keys / optional skills
|
|
38
|
-
halo server start # launch on :9527 (default)
|
|
39
40
|
```
|
|
41
|
+
my-project/
|
|
42
|
+
├─ .halo/
|
|
43
|
+
│ ├─ agents/ # who's on the team — persona, model, tools per agent
|
|
44
|
+
│ ├─ skills/ # what they can do — markdown, injected on demand
|
|
45
|
+
│ ├─ docs/ # what they've learned — knowledge they read & write
|
|
46
|
+
│ ├─ memory/ # dated decision notes
|
|
47
|
+
│ └─ sessions/ # every conversation, replayable
|
|
48
|
+
└─ src/ … # your actual project
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
`git clone` the workspace and the recipient gets a complete, runnable agent team — not an export, the real thing. It's also what makes self-evolution possible: the evolution agent edits real files, and you review real diffs.
|
|
52
|
+
|
|
53
|
+
### 🌐 One workspace, every screen
|
|
54
|
+
|
|
55
|
+
Kick off a build in the browser, check progress from WeChat on the metro, drop a follow-up in Telegram or Slack, finish in the terminal. Every channel connects to the *same* workspace and session — channels are doors, the workspace is the room.
|
|
56
|
+
|
|
57
|
+
<p align="center">
|
|
58
|
+
<img src="assets/wechat-phone.jpg" alt="Halo in WeChat" width="270" />
|
|
59
|
+
|
|
60
|
+
<img src="assets/telegram-phone.jpg" alt="Halo in Telegram" width="270" />
|
|
61
|
+
</p>
|
|
62
|
+
<p align="center"><sub>The same workspace, continued from WeChat and Telegram on a phone.</sub></p>
|
|
63
|
+
|
|
64
|
+
### 👁 Watch it think
|
|
65
|
+
|
|
66
|
+
Every reasoning step, tool call, and file change streams in real time — including inside sub-agents. Interrupts are graceful (conversation repair, not a hard kill), and sub-agents report back when done. You stay in the loop instead of running and praying.
|
|
67
|
+
|
|
68
|
+

|
|
69
|
+
<p align="center"><sub>The primary agent fans out three executors in parallel — every <code>start_session</code> and tool call visible as it happens.</sub></p>
|
|
70
|
+
|
|
71
|
+
And when you'd rather have ambience than logs: [Halo City](#halo-city) renders the same runtime as a living pixel town.
|
|
72
|
+
|
|
73
|
+
## Also in the box
|
|
74
|
+
|
|
75
|
+
- **11 model providers, one runtime** — provider and model set per-agent: Claude on Bedrock for the heavy lifting, a cheap regional model for routine sub-tasks. No code changes.
|
|
76
|
+
- **IDE-grade admin** — chat + Monaco editor + file explorer + git panel + terminal (xterm.js) in one browser tab.
|
|
77
|
+
- **Skills** — markdown skill definitions injected into prompts on demand; workspace-scoped or global, no code required.
|
|
78
|
+
- **Cron tasks** — scheduled agent runs (recurring or one-shot) whose output fans out to your chat channels.
|
|
79
|
+
- **Permission isolation** — `full` / `workspace` / `readonly` access levels enforced by a bubblewrap sandbox (filesystem only — see [Status & Limitations](#status--limitations)).
|
|
80
|
+
- **ACP adapter** — plug a halo workspace into Claude Code as a native ACP agent, or let one halo delegate to another.
|
|
81
|
+
- **Structured sessions** — hierarchical parent ↔ child sessions with async coordination and auto-reports on completion.
|
|
40
82
|
|
|
41
|
-
|
|
83
|
+
## New in v0.2.1
|
|
42
84
|
|
|
43
|
-
- **
|
|
85
|
+
- 🎨 **Four UI themes** — dark, light, midnight, warm; synced server-side so every browser gets your pick.
|
|
86
|
+
- ⌨️ **TUI overhaul** — reworked input, verbose mode, and persistent history in the standalone terminal client.
|
|
87
|
+
- 🏙 **Halo City performance** — viewport culling + offscreen skyline; smooth on busy servers.
|
|
88
|
+
- 📊 **PPTX speaker-notes sidebar** — the slide preview now shows the notes lane alongside slides.
|
|
89
|
+
- ✂️ **Graceful interrupts, fully surfaced** — interrupted tool calls are repaired and shown in the session UI instead of vanishing.
|
|
90
|
+
|
|
91
|
+

|
|
92
|
+
|
|
93
|
+
## Quick Start
|
|
94
|
+
|
|
95
|
+
Published on npm as [`@turmind/halo`](https://www.npmjs.com/package/@turmind/halo) — one binary, all subcommands. After the three install commands above, open **http://localhost:9527**.
|
|
96
|
+
|
|
97
|
+
| Prerequisite | Notes |
|
|
98
|
+
|---|---|
|
|
99
|
+
| Node.js >= 22 | the only hard system requirement |
|
|
100
|
+
| An API key for any supported model provider | entered during `halo setup`; AWS Bedrock users can leave keys unset and use the standard credential chain (env / `~/.aws` / instance role) instead |
|
|
101
|
+
| pnpm >= 9 | source builds only |
|
|
102
|
+
|
|
103
|
+
- **Bind your provider to the agent**: `halo setup` stores keys; agents choose providers. The built-in `default` agent ships pointing at AWS Bedrock, so if you configured a different provider, switch it once in **Agents → default → model provider** — your first conversation will thank you.
|
|
104
|
+
- **Upgrade**: `halo upgrade && halo server restart`. The startup check refreshes bundled docs / agents / skills automatically when the on-disk template version is behind.
|
|
44
105
|
- **Docker / CI**: `halo setup --non-interactive` and supply credentials via the `HALO_PASSWORD` env var.
|
|
45
106
|
- **From source**: `pnpm install && pnpm build`.
|
|
46
107
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
108
|
+
### Talk to it from curl
|
|
109
|
+
|
|
110
|
+
Every workspace can expose a token-authenticated HTTP + SSE endpoint — the Web channel, aka the "build your own UI" channel:
|
|
111
|
+
|
|
112
|
+
1. In the admin, open **Channels → Web → Add Account**, pick a workspace and access level, and copy the token (shown once).
|
|
113
|
+
2. Stream a conversation:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
curl -N -H "x-token: $TOKEN" -H "Content-Type: application/json" \
|
|
117
|
+
-d '{"message":"What files are in this workspace?"}' \
|
|
118
|
+
http://localhost:9527/api/web/chat
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The response is SSE frames — `session` / `thinking` / `tool_call` / `stream` / `complete` — full protocol in [`.halo/docs/guide/channels/web.md`](.halo/docs/guide/channels/web.md).
|
|
52
122
|
|
|
53
123
|
## Models
|
|
54
124
|
|
|
@@ -63,6 +133,7 @@ Configured per-agent through one provider-agnostic runtime. AWS Bedrock Claude i
|
|
|
63
133
|
| DeepSeek | |
|
|
64
134
|
| Kimi (Moonshot AI) | |
|
|
65
135
|
| MiniMax | |
|
|
136
|
+
| Mimo (Xiaomi) | Anthropic-compatible gateway, 1M context |
|
|
66
137
|
| Qwen (Aliyun) | |
|
|
67
138
|
| Hunyuan (Tencent) | |
|
|
68
139
|
| Doubao (Volcengine) | |
|
|
@@ -76,7 +147,7 @@ Every channel shares the same workspace and session state. Onboarding guides liv
|
|
|
76
147
|
| Channel | Transport | Notes |
|
|
77
148
|
|---|---|---|
|
|
78
149
|
| **Admin** | WebSocket | Full-featured browser UI |
|
|
79
|
-
| **Web** | HTTP + SSE | Token-authenticated API, independently deployable |
|
|
150
|
+
| **Web** | HTTP + SSE | Token-authenticated API, independently deployable — see [curl example](#talk-to-it-from-curl) |
|
|
80
151
|
| **CLI / TUI** | local | Standalone terminal client, embedded agent loop (no server required) |
|
|
81
152
|
| **Telegram** | Bot API | Long polling |
|
|
82
153
|
| **Slack** | Socket Mode | No public webhook required |
|
|
@@ -84,30 +155,21 @@ Every channel shares the same workspace and session state. Onboarding guides liv
|
|
|
84
155
|
| **WeChat** | QR bind | Scan to bind, mobile access |
|
|
85
156
|
| **ACP adapter** | stdio JSON-RPC | Bridges ACP clients (Claude Code, etc.) onto the Web channel |
|
|
86
157
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
<img src="assets/telegram-phone.jpg" alt="Halo in Telegram" width="270" />
|
|
91
|
-
</p>
|
|
92
|
-
<p align="center"><sub>Same workspace, driven from WeChat and Telegram on a phone.</sub></p>
|
|
93
|
-
|
|
94
|
-
## More Capabilities
|
|
158
|
+

|
|
159
|
+
<p align="center"><sub>The TUI runs the same agent loop in your terminal — here delegating to an executor and consolidating its report, no server needed.</sub></p>
|
|
95
160
|
|
|
96
|
-
|
|
97
|
-
- **Workspace tools** — `file_read` / `file_write` / `file_edit`, sandboxed `shell_exec`, `grep` / `glob`, `web_fetch`, `view_image`, plus session tools (`start_session`, `query_session`, `interrupt_session`, …) for multi-agent control.
|
|
98
|
-
- **Skills system** — Markdown-based skill definitions injected into agent prompts on demand; workspace-scoped or global, extensible without code changes.
|
|
99
|
-
- **Cron tasks** — scheduled agent runs (recurring or one-shot) that fan output out to bound channel accounts.
|
|
100
|
-
- **Halo City** — a read-only pixel **city block** that visualizes a server's runtime: each workspace is a building, each session an animal citizen at a desk, click anyone to inspect their live session log. Pure client-side canvas, zero model tokens. Lives at [`halo-city/`](halo-city/) — see [design notes](.halo/docs/design/halo-city.md).
|
|
161
|
+
## Halo City
|
|
101
162
|
|
|
102
|
-
|
|
163
|
+
A read-only pixel city that visualizes a live halo server: each workspace is a building, each session an animal citizen — at a desk when working, grabbing coffee or hitting the arcade when idle. Click any citizen to inspect the real thing: live session log, delegation chain, last tool call, token usage. Pure client-side canvas on a single polling endpoint — **zero model tokens burned**.
|
|
103
164
|
|
|
104
|
-

|
|
166
|
+
<p align="center"><sub>Street level: three sub-agent citizens heads-down in the <code>aurora-cafe</code> building; the inspector shows one executor's live log and delegation chain.</sub></p>
|
|
105
167
|
|
|
106
|
-
|
|
168
|
+
Lives at [`halo-city/`](halo-city/) (plain static files, no build) — see the [design notes](.halo/docs/design/halo-city.md).
|
|
107
169
|
|
|
108
170
|
## Tech Stack
|
|
109
171
|
|
|
110
|
-
- **Monorepo**: pnpm workspace (`
|
|
172
|
+
- **Monorepo**: pnpm workspace (`core`, `server`, `admin`, `cli`, `desktop`, `acp-adapter`, `web-demo`)
|
|
111
173
|
- **Backend**: Hono + WebSocket, single Node.js process on port 9527
|
|
112
174
|
- **Frontend**: Next.js 15 static export, served directly by Hono
|
|
113
175
|
- **Agent**: custom orchestration loop, provider-agnostic `ModelRuntime` interface
|
|
@@ -120,17 +182,18 @@ Every channel shares the same workspace and session state. Onboarding guides liv
|
|
|
120
182
|
- [`.halo/docs/requirements/overview.md`](.halo/docs/requirements/overview.md) — product concept
|
|
121
183
|
- [`.halo/docs/design/architecture.md`](.halo/docs/design/architecture.md) — backend architecture
|
|
122
184
|
- [`.halo/docs/design/evolution.md`](.halo/docs/design/evolution.md) — self-evolution design
|
|
185
|
+
- [`.halo/docs/guide/channels/`](.halo/docs/guide/channels/) — per-channel onboarding guides
|
|
123
186
|
- [`.halo/docs/dev/deploy.md`](.halo/docs/dev/deploy.md) — deployment (systemd / Nginx)
|
|
124
187
|
- [`.halo/docs/dev/env.md`](.halo/docs/dev/env.md) — env vars, build commands
|
|
125
188
|
- [`CLAUDE.md`](CLAUDE.md) — development instructions for Claude Code
|
|
126
189
|
|
|
127
190
|
## Status & Limitations
|
|
128
191
|
|
|
129
|
-
Halo is young
|
|
192
|
+
Halo is young — treat it as an early-stage project:
|
|
130
193
|
|
|
131
194
|
- **Sandbox isolates the filesystem, not the network.** The bubblewrap sandbox covers access levels and filesystem reach (host paths, `~/.aws`/`~/.ssh` masked), but does **not** isolate the network — code running inside it can still make outbound connections. The threat model is accidental damage and path escape by a trusted agent, **not** containment of a deliberately malicious skill exfiltrating data. Network isolation is on the roadmap.
|
|
132
|
-
- **
|
|
133
|
-
- **
|
|
195
|
+
- **Test coverage is unit/regression-level, not end-to-end.** 345 tests across the four packages (core, server, cli, admin) run on every push via CI, covering core logic — path-boundary checks, session repair, channel message formatting, the TUI engine, and more. There's no end-to-end or integration suite yet.
|
|
196
|
+
- **APIs and on-disk formats may still change between versions.** Expect rough edges while things stabilize.
|
|
134
197
|
|
|
135
198
|
If you hit something broken or surprising, please open an issue — early feedback is genuinely useful right now.
|
|
136
199
|
|
package/admin-out/404.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--NE1IhKMHm2l1nBV_EMjhV--><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/66df341f99220f5c.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-47520cdc55be63e7.js"/><script src="/_next/static/chunks/fb4ec4d6-3fa44f69484f91b9.js" async=""></script><script src="/_next/static/chunks/635-3dd0043ed0520b9d.js" async=""></script><script src="/_next/static/chunks/main-app-483b436873410ddc.js" async=""></script><script src="/_next/static/chunks/212-170855bed19f67f3.js" async=""></script><script src="/_next/static/chunks/app/layout-c2fa8035998e48d5.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><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_f367f3 font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>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)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-47520cdc55be63e7.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[59391,[\"212\",\"static/chunks/212-170855bed19f67f3.js\",\"177\",\"static/chunks/app/layout-c2fa8035998e48d5.js\"],\"ThemeProvider\"]\n3:I[26967,[\"212\",\"static/chunks/212-170855bed19f67f3.js\",\"177\",\"static/chunks/app/layout-c2fa8035998e48d5.js\"],\"AppI18nProvider\"]\n4:I[66048,[],\"\"]\n5:I[29926,[],\"\"]\n6:I[11789,[],\"OutletBoundary\"]\n8:I[21528,[],\"AsyncMetadataOutlet\"]\na:I[11789,[],\"ViewportBoundary\"]\nc:I[11789,[],\"MetadataBoundary\"]\nd:\"$Sreact.suspense\"\nf:I[79836,[],\"\"]\n:HL[\"/_next/static/media/e4af272ccee01ff0-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/66df341f99220f5c.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"NE1IhKMHm2l1nBV-EMjhV\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/66df341f99220f5c.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_f367f3 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\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"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.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$L7\",[\"$\",\"$L8\",null,{\"promise\":\"$@9\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$d\",null,{\"fallback\":null,\"children\":\"$Le\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n7:null\n"])</script><script>self.__next_f.push([1,"10:I[89592,[],\"IconMark\"]\n9:{\"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\"}],[\"$\",\"$L10\",\"4\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"e:\"$9:metadata\"\n"])</script></body></html>
|