@turmind/halo 1.5.9 → 1.5.11
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/admin-out/404.html +1 -1
- package/admin-out/_next/static/chunks/{597-399e2e1de26aa747.js → 941-4719e7343b54b9bd.js} +1 -1
- package/admin-out/_next/static/chunks/989-86b0f677f69ccf3b.js +1 -0
- package/admin-out/_next/static/chunks/app/page-4792aa1c79f7e7f1.js +1 -0
- package/admin-out/_next/static/css/97f3ac570664d044.css +3 -0
- package/admin-out/index.html +1 -1
- package/admin-out/index.txt +5 -5
- package/bundled-docs/design/agent.md +7 -5
- package/bundled-docs/design/canvas-extensions.md +14 -2
- package/bundled-docs/design/express-self.md +4 -4
- package/bundled-docs/design/halo-city.md +6 -0
- package/bundled-docs/design/prompt-system.md +1 -1
- package/bundled-docs/design/relay.md +6 -6
- package/bundled-docs/design/session.md +12 -11
- package/bundled-docs/design/web.md +33 -5
- package/bundled-docs/dev/acp-adapter.md +59 -175
- package/bundled-docs/dev/api.md +5 -2
- package/bundled-docs/dev/deploy.md +1 -1
- package/bundled-docs/dev/desktop-packaging.md +14 -0
- package/bundled-docs/dev/env.md +2 -2
- package/bundled-docs/dev/tools.md +8 -8
- package/bundled-docs/guide/README.md +1 -1
- package/bundled-docs/guide/channels/README.md +3 -3
- package/bundled-docs/guide/channels/acp.md +67 -42
- package/bundled-docs/guide/channels/feishu.md +1 -1
- package/bundled-docs/guide/channels/slack.md +1 -1
- package/bundled-docs/guide/channels/telegram.md +1 -1
- package/bundled-docs/guide/channels/web.md +10 -8
- package/bundled-docs/guide/channels/wechat.md +1 -1
- package/bundled-docs/guide/channels/wecom.md +1 -1
- package/bundled-docs/guide/chat.md +0 -1
- package/bundled-docs/guide/cli.md +1 -2
- package/bundled-docs/guide/getting-started.md +1 -1
- package/bundled-docs/guide/skills.md +1 -2
- package/bundled-docs/requirements/chat.md +28 -8
- package/bundled-docs/requirements/command.md +1 -2
- package/bundled-docs/requirements/editor.md +1 -0
- package/bundled-docs/requirements/explorer.md +1 -0
- package/bundled-docs/requirements/terminal.md +15 -0
- package/dist/index.js +810 -333
- package/package.json +1 -1
- package/templates/agents/__score__/AGENT.md +1 -1
- package/templates/agents/default/agent.yaml +0 -1
- package/templates/prompts/all/TOOL_SHELL.windows.md +2 -1
- package/templates/skills/skill/SKILL.md +1 -1
- package/templates/skills/workspace/stage.py +1 -1
- package/admin-out/_next/static/chunks/989-c404f6f43c400911.js +0 -1
- package/admin-out/_next/static/chunks/app/page-59bfce35bbb30b05.js +0 -1
- package/admin-out/_next/static/css/27b44c85485eabb9.css +0 -3
- package/templates/skills/acp/SKILL.md +0 -243
- package/templates/skills/acp/templates/SKILL.md.tmpl +0 -75
- package/templates/skills/acp/templates/ask.py +0 -177
- package/templates/skills/acp/templates/config.yaml.tmpl +0 -38
- /package/admin-out/_next/static/{RD5w3FmDZ6HtyQGGaUb8t → GO2W5JoiC46FIxLjtFAXx}/_buildManifest.js +0 -0
- /package/admin-out/_next/static/{RD5w3FmDZ6HtyQGGaUb8t → GO2W5JoiC46FIxLjtFAXx}/_ssgManifest.js +0 -0
|
@@ -6,7 +6,7 @@ Unified command processing — all slash commands (built-in + skill) are dispatc
|
|
|
6
6
|
|
|
7
7
|
Source: [commands/index.ts](../../../packages/server/src/commands/index.ts) (descriptors) + [channels/shared/commands.ts](../../../packages/server/src/channels/shared/commands.ts) (execution)
|
|
8
8
|
|
|
9
|
-
Top-level built-in slash commands: `/help` `/evo` `/session` `/agent` `/skill` `/workspace`. (`/cron`
|
|
9
|
+
Top-level built-in slash commands: `/help` `/evo` `/session` `/agent` `/skill` `/workspace`. (`/cron` looks like a top-level command too but is provided by a same-name skill — see the verb table below; it isn't registered in `commands/index.ts` or `DISPATCH_COMMANDS`.)
|
|
10
10
|
|
|
11
11
|
| Name | Slash | Type | Purpose |
|
|
12
12
|
|---|---|---|---|
|
|
@@ -22,7 +22,6 @@ The rest are noun-verb **object commands**: `/<obj> <verb> [args]`. Some verbs a
|
|
|
22
22
|
| `/skill` | list / desc (built-in, no gate) · disable / enable (built-in, workspace) · delete (built-in, full) · create / update (skill verb, full) |
|
|
23
23
|
| `/workspace` | info (built-in, no gate) · switch (built-in, full) · setup / tidy (skill verb, workspace) · share (skill verb, full) — `/w` is a built-in alias (see [Command aliases](#command-aliases)) |
|
|
24
24
|
| `/cron` | create / list / update / enable / disable / delete — all skill verbs, full |
|
|
25
|
-
| `/acp` | kiro / claude (ask a local agent directly; question = rest of line) · add / list / remove (manage generated ask-* bindings) — all full |
|
|
26
25
|
|
|
27
26
|
Session lifecycle actions (`subscribe` / `unsubscribe`, `session:delete`) are handled inline by the WS handler, not as slash commands. In the admin, a bare `/session new` (and `/clear`) is handled client-side: it opens a new draft chat tab and sends nothing; `/session new <args>` still goes to the server. The WS `session:clear` frame was removed in 1.5.3-alpha.
|
|
28
27
|
|
|
@@ -62,6 +62,7 @@ File types without a built-in plugin can be handled by an **installed extension*
|
|
|
62
62
|
- **Open with** (header menu, shown only when there are >2 candidates counting *Open as text*): switches the current tab's viewer; the choice is per tab and not persisted
|
|
63
63
|
- **Fallback**: a file with no built-in plugin and no installed extension shows a static page — "no built-in preview for this type; extensions for more file types are on <hub> ↗", where `<hub>` is the extension skill's `hub_repo` (default halo-hub; a local path / ssh remote shows as text) — plus Open as text / Download. No online lookup
|
|
64
64
|
- **Editable extensions** (manifest `capabilities: ["save"]`): the iframe reports dirty → tab shows the dirty dot → header **Save** button (Ctrl/Cmd+S is *not* wired for extension tabs — Monaco isn't mounted) → `PUT /api/files/raw`. If the file changed on disk since it was loaded the save gets a 409 and the user is asked "changed on disk … Overwrite?". An external change while the tab is clean reloads it; while dirty, local edits are kept silently and the conflict surfaces at the next save
|
|
65
|
+
- **Export from an editable extension** (e.g. draw.io *File ▸ Export as*, Excalidraw main menu *Export PNG / SVG*): the extension iframe can't download files, so the exported image is saved **into the workspace, next to the open file** (`flow.drawio` → `flow.png`). If that file already exists the user is asked whether to overwrite it. On success a banner "Exported to <path>" appears above the preview with a **Download** link. Exporting never marks the tab modified and never changes the open file. Only on Halo builds newer than 1.5.9; on older hosts the extension shows no working export (drawio ≥ 1.1.0 / excalidraw ≥ 1.1.0 hide or fall back on their own)
|
|
65
66
|
- **Bundle extensions** (manifest `bundle: true`, e.g. the `htrans` meeting recorder): a *directory* named with the extension's suffix (`Standup.htrans/`) is one document. In the Explorer it shows a package icon; clicking the row (or Enter) opens it as a tab, and only its chevron expands it so the files inside stay browsable. Right-click → Open to the Side works on it. **New File** with a bundle suffix (`Standup.htrans`) creates the directory and opens it. The extension reads and writes only inside that directory. While it reports busy (e.g. recording) the tab shows the dirty dot, asks before closing, and stays mounted when you switch tabs. Ctrl/Cmd+S / Save do nothing on it. A bundle tab survives a reload while the extension is installed and supported here; otherwise the tab is dropped and the directory is an ordinary folder again
|
|
66
67
|
- **Platforms** (manifest `platforms`: `web` / `desktop-mac` / `desktop-win` / `desktop-linux`; omitted = everywhere): on an excluded platform (the Halo desktop app is detected by its user agent) the extension acts as if it were not installed. The fallback page says `"<name>" only runs on: <platforms>`, and Settings → Extensions shows a platforms badge plus a gray "not supported here" tag. Manifest capability `media` lets the extension use the microphone and screen capture
|
|
67
68
|
- **Install sources**: Settings → Extensions zip upload; `/extension install <id|zip|url>` (listed by the built-in `default` agent, full access), where an id comes from the hub in Settings → Skills → extension → `hub_repo` (default halo-hub; GitHub / Gitea / Forgejo / GitLab release zips, or tags of any other git repo); or a manual directory drop
|
|
@@ -21,6 +21,7 @@ Desktop app only — the browser has one tab per window natively.
|
|
|
21
21
|
- **Per-window workspace**: windows share the server origin, hence one localStorage, so a window tracks its own workspace via its URL `?folder=` (not localStorage, which would clobber across windows). Different windows can sit on different workspaces; the same workspace can be open in two windows.
|
|
22
22
|
- **Quit semantics** (platform split): on macOS, closing every window keeps the app in the Dock (only `Cmd+Q` truly exits) and clicking the Dock icon reopens a window; on Windows/Linux there's no Dock to resummon from, so closing the last window quits.
|
|
23
23
|
- **Quick toggles entry** (bottom of the activity bar, below Settings; browser and desktop): a gear with a thin segmented status bar under it — one segment per available item, in fixed order network → notify → pin → keep-awake (browser: network + notify, or network alone without the Web Notification API; desktop: all four). Network segment: emerald = fresh, pulsing amber = stale, red = down (the gear itself also turns red when down); notify / pin segments: primary when on; keep-awake: amber when on (it stops the screen locking, so it gets its own colour); off = dimmed muted grey. The native hover title lists every item's state. Clicking opens a panel (titled "Status & window") to the right of the entry: a read-only network row, then one switch row per toggle; switches apply immediately and the panel stays open; outside click, Esc or a second entry click closes it. Segments, rows and the hover summary all come from one item list (`useQuickToggleItems` in `features/workspace/quick-toggles.tsx`).
|
|
24
|
+
- **Right-click menu for page text**: Electron shows no menu by default, so the shell adds one where a browser would show its native menu — in an editable field (chat input, settings fields): Cut / Copy / Paste / Select all; on selected non-editable text: Copy; elsewhere: none. Menus the admin draws itself (file tree, editor tabs, terminal, Monaco) suppress it, so there's never a double menu. Labels follow the OS locale (zh → Chinese). Lives in `packages/desktop/src/main.cjs` (`buildContextMenuTemplate`), so it ships with the next desktop build.
|
|
24
25
|
- **Pin (always-on-top)** acts per-window — each window pins independently.
|
|
25
26
|
- **Keep screen awake** (desktop only) acts per-window and isn't persisted — a restart or a new window starts off, a reload keeps it. While any opted-in window is neither minimized nor hidden (merely covered by other windows still counts), the app holds one display-sleep blocker, so the screen won't dim or lock when you step away.
|
|
26
27
|
- **Activity awareness**: while the agent streams a reply the sidebar's workspace name carries an amber pulsing dot (emerald when idle) and the window title gains a `●` prefix (`● Halo — <name>` busy vs `Halo — <name>` idle) — both are plain web behaviour that Electron mirrors to the native title bar.
|
|
@@ -47,6 +47,19 @@ When the WS drops, the bottom panel remounts `TerminalPanel` (fresh key on `_dis
|
|
|
47
47
|
- Terminal type: `xterm-256color`
|
|
48
48
|
- Default size: 80 × 24 (resize requests override)
|
|
49
49
|
- Strips `npm_config_prefix` env (avoids nvm warnings when starting node)
|
|
50
|
+
- Font: JetBrains Mono 13px, line height 1 (no extra leading — box-drawing / TUI rows join up)
|
|
51
|
+
|
|
52
|
+
### Copy & paste
|
|
53
|
+
Keys depend on the client's OS (the keyboard in front of the user — the PTY is always the server's):
|
|
54
|
+
|
|
55
|
+
| Client | Copy | Paste |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| macOS | `Cmd+C` | `Cmd+V` |
|
|
58
|
+
| Windows / Linux | `Ctrl+C` **with a selection** (copies and clears the selection; no selection → `^C` / SIGINT as usual) · `Ctrl+Shift+C` | `Ctrl+V` · `Ctrl+Shift+V` (literal `^V` is given up) |
|
|
59
|
+
|
|
60
|
+
- Keyboard copy / paste ride the browser's native copy / paste events (paste stays bracketed), so they work on a plain-http origin too
|
|
61
|
+
- **Right-click menu** (inside the terminal): Copy (disabled with no selection) · Paste · Select all · Clear. Menu copy / paste use the async Clipboard API; when paste is refused (plain-http origin or no clipboard-read permission) the menu says to use the keyboard shortcut instead
|
|
62
|
+
- Key mapping: `terminalClipboardKey` in [packages/admin/src/features/terminal/terminal-clipboard.ts](../../../packages/admin/src/features/terminal/terminal-clipboard.ts); menu in `terminal-context-menu.tsx`
|
|
50
63
|
|
|
51
64
|
### Lifecycle
|
|
52
65
|
|
|
@@ -111,6 +124,8 @@ Defined in [packages/server/src/config.ts](../../../packages/server/src/config.t
|
|
|
111
124
|
| T6 | Open 3 tabs, close 1 explicitly | Other 2 keep their PTYs; closed one gets `terminal:exit` |
|
|
112
125
|
| T7 | `exit` from within shell | `terminal:exit` with the shell's exit code; the terminal prints `[Process exited]` and its tab stays until closed |
|
|
113
126
|
| T8 | Paste a 10 KB block | Sent as `terminal:input` without choking; shell echoes in chunks |
|
|
127
|
+
| T9 | Windows/Linux: select text → `Ctrl+C`; then `Ctrl+C` again with nothing selected | First copies and clears the selection; second sends `^C` (interrupts a running `sleep 30`) |
|
|
128
|
+
| T10 | Right-click in the terminal → Paste | Clipboard text inserted at the prompt (or the "use the shortcut" hint on a plain-http origin) |
|
|
114
129
|
|
|
115
130
|
Follows the pattern of [test/session.md](../test/session.md).
|
|
116
131
|
|