@turmind/halo 2.1.6 → 2.2.1

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 (52) hide show
  1. package/admin-out/404.html +1 -1
  2. package/admin-out/_next/static/chunks/1607-bf227fc5e4db45b7.js +1 -0
  3. package/admin-out/_next/static/chunks/1989-3b2faa2731d973c4.js +1 -0
  4. package/admin-out/_next/static/chunks/5287.7ea08918388fa804.js +1 -0
  5. package/admin-out/_next/static/chunks/app/page-10a4afac9cbc27a2.js +1 -0
  6. package/admin-out/_next/static/chunks/{webpack-7f8156dbbdb54868.js → webpack-9532ec7f1fa9a757.js} +1 -1
  7. package/admin-out/_next/static/css/8fc43fce83e5ce5d.css +1 -0
  8. package/admin-out/index.html +1 -1
  9. package/admin-out/index.txt +5 -5
  10. package/bundled-docs/design/a2a.md +3 -3
  11. package/bundled-docs/design/agentcore.md +1 -1
  12. package/bundled-docs/design/architecture.md +3 -3
  13. package/bundled-docs/design/background-dispatch.md +2 -2
  14. package/bundled-docs/design/canvas-extensions.md +2 -2
  15. package/bundled-docs/design/cron.md +77 -53
  16. package/bundled-docs/design/evolution.md +111 -39
  17. package/bundled-docs/design/node.md +5 -12
  18. package/bundled-docs/design/observability.md +11 -11
  19. package/bundled-docs/design/prompt-system.md +1 -1
  20. package/bundled-docs/design/relay.md +2 -2
  21. package/bundled-docs/design/session.md +11 -9
  22. package/bundled-docs/design/slack.md +1 -1
  23. package/bundled-docs/design/storage.md +14 -11
  24. package/bundled-docs/design/telegram.md +1 -1
  25. package/bundled-docs/design/ws.md +9 -7
  26. package/bundled-docs/dev/api.md +17 -14
  27. package/bundled-docs/dev/env.md +2 -2
  28. package/bundled-docs/dev/logging.md +1 -1
  29. package/bundled-docs/dev/tools.md +2 -2
  30. package/bundled-docs/guide/agents.md +1 -1
  31. package/bundled-docs/guide/cli.md +3 -3
  32. package/bundled-docs/guide/delegation-and-access.md +1 -1
  33. package/bundled-docs/guide/workspace.md +1 -1
  34. package/bundled-docs/requirements/agent.md +1 -1
  35. package/bundled-docs/requirements/command.md +1 -1
  36. package/bundled-docs/requirements/settings.md +2 -2
  37. package/bundled-docs/requirements/workspace.md +4 -4
  38. package/dist/evo-wrapper.js +913 -201
  39. package/dist/index.js +2680 -1768
  40. package/package.json +1 -1
  41. package/templates/agents/__apply_agent__/AGENT.md +10 -6
  42. package/templates/agents/__evo_agent__/AGENT.md +15 -4
  43. package/templates/agents/__score__/AGENT.md +4 -0
  44. package/templates/skills/cron/SKILL.md +68 -16
  45. package/templates/skills/cron/manage-cron.py +91 -19
  46. package/admin-out/_next/static/chunks/1101-d2f818895a3aa32e.js +0 -1
  47. package/admin-out/_next/static/chunks/1989-c24411a5e971b8b9.js +0 -1
  48. package/admin-out/_next/static/chunks/5058.8514aa6d6a947cce.js +0 -1
  49. package/admin-out/_next/static/chunks/app/page-84ab8d21c70823c0.js +0 -1
  50. package/admin-out/_next/static/css/6da86a077e119a6c.css +0 -1
  51. /package/admin-out/_next/static/{xg-EvYXc8NEUDwTlmbWvy → j4QFRrUtg33DNMUIgg4ij}/_buildManifest.js +0 -0
  52. /package/admin-out/_next/static/{xg-EvYXc8NEUDwTlmbWvy → j4QFRrUtg33DNMUIgg4ij}/_ssgManifest.js +0 -0
@@ -114,7 +114,7 @@ Extra rules:
114
114
  | Channel account (Web / Telegram / Slack / Feishu / WeCom / WeChat, and the ACP adapter via its Web token) | The account's `accessLevel`: `full` → full, `workspace` → workspace, `readonly` and `observer` → readonly. New accounts default to **readonly**. | Re-applied on every inbound message. Changing an account's level takes effect on the next message. |
115
115
  | Channel `/session new` | The account's level | — |
116
116
  | `start_session` (sub-agent) | **Parent's level at creation time** | Kept. A later change on the parent doesn't reach existing children; start a new child to get the new level. |
117
- | Cron job | Full (the `halo cli` default) | Keeps its stored level (passed through as `--access`) |
117
+ | Cron job | Full | Keeps its stored level (the run passes none) |
118
118
  | `halo cli` / TUI | `--access`, default `full` | `--access` value (a different level is persisted) |
119
119
  | `relay_send` into another workspace | Full | Keeps its stored level |
120
120
  | A2A inbound (`/a2a/<path>`, a web-channel token bound to that workspace) | The token's `accessLevel`, mapped like a channel account. A `readonly` / `observer` token gets the fixed A2A read-only profile: `file_read` / `view_image` / `file_list` / `grep` / `glob` + `continue_task`, even with an OS sandbox — no shell, write or fetch, no delegation, no relay / a2a tools | Re-applied on every inbound message |
@@ -127,7 +127,7 @@ Common settings:
127
127
  - `general.session.max_nesting_depth` — max session nesting depth
128
128
  - `general.compact.keep_messages` — recent messages kept intact during compaction
129
129
  - `general.logging.level` — `debug` / `info` / `warn` / `error`
130
- - `general.observability.endpoint` — OTLP collector URL; leave empty to keep observability off. The server and every `halo cli` / `halo tui` run (cron and evolution runs included) export to it (see [design/observability.md](../design/observability.md))
130
+ - `general.observability.endpoint` — OTLP collector URL; leave empty to keep observability off. The server (cron runs included) and every `halo cli` / `halo tui` run (evolution runs included) export to it (see [design/observability.md](../design/observability.md))
131
131
  - `<provider-id>.secrets.api_key` — provider credentials (Kimi / DeepSeek bearer token)
132
132
  - `<provider-id>.secrets.access_key_id` / `.secret_access_key` — AWS Bedrock
133
133
  - `<skill-id>.params.<key>` — values an agent can inject into its own `shell_exec` via `{{<skill-id>.params.<key>}}`
@@ -93,6 +93,6 @@ API: `GET/PUT /api/agent-configs/:id/md/:fileType`, `GET /api/agent-configs/:id/
93
93
  - **Not rendered for internal agents** (`internal: true`) — they're delegated to by other agents, never driven directly
94
94
 
95
95
  ### Internal agents
96
- Agents flagged `internal: true` in agent.yaml (e.g. `__evo_agent__`, `__apply_agent__`, `__score__`) are platform tooling. They are hidden from every user-facing surface: the delegation roster, `/session new` default pick, the chat agent selector, the Cron job agent picker and `halo cli`'s agent list (`halo agents`) — and have no Test button. They stay editable in the management sidebar's collapsed **Internal** group.
96
+ Agents flagged `internal: true` in agent.yaml (e.g. `__evo_agent__`, `__apply_agent__`, `__score__`) are platform tooling. They are hidden from every user-facing surface: the delegation roster, `/session new` default pick, the chat agent selector, the Triggers (cron) job agent picker and `halo cli`'s agent list (`halo agents`) — and have no Test button. They stay editable in the management sidebar's collapsed **Internal** group.
97
97
 
98
98
  Replaces the old built-in test chat panel, giving a more realistic environment (full workspace tools + session persistence).
@@ -11,7 +11,7 @@ Top-level built-in slash commands: `/help` `/evo` `/session` `/agent` `/skill` `
11
11
  | Name | Slash | Type | Purpose |
12
12
  |---|---|---|---|
13
13
  | `help` | `/help` | server | List commands — object commands show only the verbs the user can run; a command is hidden entirely if no verb is runnable |
14
- | `evo` | `/evo [text]` | server | Flat command (no verbs), **full-only**. Trigger self-evolution on the current root session: snapshot the conversation + queue an evo run. Optional text becomes a hint for what to focus on. Works at every `general.evolution.level` (L0 = manual only; L1 also drafts automatically on pre-compact). Hidden from `/help` for non-full users. See [design/evolution.md](../design/evolution.md). |
14
+ | `evo` | `/evo [text]` | server | Flat command (no verbs), **full-only**. Trigger self-evolution on the current root session: snapshot the conversation + queue an evo run. Optional text becomes a hint for what to focus on. Works at every `general.evolution.level` (L0 = manual only; L1 also drafts automatically on pre-compact; L2 / L3 may also auto-apply the result — prompt-only / capability changes that pass the gates — then post one `chat:system` line in this session). Hidden from `/help` for non-full users. See [design/evolution.md](../design/evolution.md). |
15
15
 
16
16
  The rest are noun-verb **object commands**: `/<obj> <verb> [args]`. Some verbs are built-in deterministic code (`SUBCOMMAND_ROUTES`); the others fall through to the same-name skill (LLM, dispatched via `$1`). Bare `/<obj>` or `/<obj> help` lists the verbs available to the user (filtered by access level).
17
17
 
@@ -108,7 +108,7 @@ Declared in [packages/server/src/settings-schema.ts](../../../packages/server/sr
108
108
 
109
109
  `sandbox.hidden_dirs` / `sandbox.hidden_files` / `sandbox.writable_dirs` are `globalOnly` — they define the security boundary agents run inside, so a workspace `settings.yaml` cannot override them (a workspace overriding them could lift its own sandbox constraints). `hidden_dirs` / `hidden_files` hold **extra** entries: the effective list is the built-in default (`DEFAULT_HIDDEN_DIRS` / `DEFAULT_HIDDEN_FILES` in `tools/sandbox.ts`, the single source — `~/.halo/secrets`, `~/.aws`, `~/.ssh`, `~/.gnupg`, `~/.docker`, `~/.config/gh`, `~/.halo/global/internal-sessions`, `~/.halo/global/logs`; `~/.npmrc`, `~/.bash_history`, `~/.gitconfig`, `~/.git-credentials`, `~/.netrc`, the global `evo` / `cron` / `runs` databases + `-wal` / `-shm`) plus the user's entries, deduped (`config.ts` `resolveSandboxPaths()`, used by both the server and the CLI). A default entry cannot be removed from the list in settings. The lists apply only to workspace / readonly sessions (bwrap / Seatbelt, or `assertPathAllowed` without an OS sandbox); Full sessions, the admin file explorer (`validatePath`, workspace-bound only) and the terminal never consult them. The schema `default` is empty so the placeholder doesn't suggest copying the built-ins; the field description names them. `writable_dirs` is a plain list (no built-ins).
110
110
 
111
- `evolution.*` controls the self-evolution subsystem (see [design/evolution.md](../design/evolution.md)). All `evolution.*` keys are `globalOnly` — they live in `~/.halo/secrets/settings.yaml` only, not workspace settings. Notable knobs: `evolution.level` (`L0` = manual only: `/evo` drafts, a reviewer approves; `L1` = L0 plus automatic drafting on pre-compact), `evolution.max_concurrent_run` / `max_concurrent_apply` (wrapper concurrency caps), `evolution.run_timeout_minutes` / `apply_timeout_minutes` (heartbeat timeouts), `evolution.max_attempts` (per-row retry cap), `evolution.triggers.pre_compact` (snapshot session before compaction).
111
+ `evolution.*` controls the self-evolution subsystem (see [design/evolution.md](../design/evolution.md)). All `evolution.*` keys are `globalOnly` — they live in `~/.halo/secrets/settings.yaml` only, not workspace settings. Notable knobs: `evolution.level` (`L0` = manual only: `/evo` drafts, a reviewer approves; `L1` = L0 plus automatic drafting on pre-compact; `L2` = L1 plus auto-applying prompt-only changes that pass the gates; `L3` = L2 plus auto-applying capability changes — auto-applied changes still pass the regression check and can be rolled back from the Evolution tab; only changes learned from a `full`-access session auto-apply, never from one that took cron webhook events; a cron run's own turn never drafts on pre-compact), `evolution.auto_apply_threshold` (int 0–100, default 80 — minimum average score at L2/L3, on top of the fixed floors confidence high / behavior ≥ 70 / lint 100 / all sandbox checks; a save outside 0–100 is rejected with 400), `evolution.max_concurrent_run` / `max_concurrent_apply` (wrapper concurrency caps), `evolution.run_timeout_minutes` / `apply_timeout_minutes` (heartbeat timeouts), `evolution.max_attempts` (per-row retry cap), `evolution.triggers.pre_compact` (snapshot session before compaction).
112
112
 
113
113
  Goal mode's entry points are offline (the `/goal` command, admin banner and creation of new goal sessions are hidden). To reopen them, set `general.goal_mode_enabled` — a global-only boolean, default `false`, read from `~/.halo/secrets/settings.yaml` only (a workspace `settings.yaml` has no effect) and not shown in the Settings UI — then restart the Halo server and refresh the browser (existing goal bindings and history are not touched either way):
114
114
 
@@ -123,7 +123,7 @@ There is no "default provider" setting: a newly created agent's `model:` is a co
123
123
 
124
124
  **Advanced fold**: on the General page, `language` and `theme` are shown in the open; every other General field is in an "Advanced" area, collapsed by default (schema flag `advanced: true`, set in `generalSection()`).
125
125
 
126
- **Restart-required fields**: `agent.max_retries`, `session.max_queue_size`, `session.max_nesting_depth`, `compact.keep_messages`, `compact.max_summary_input`, `compact.max_message_slice`, `logging.level` and the four `observability.*` keys are read once at server start (object literals in `config.ts`; observability is mapped onto `OTEL_*` env by `initObservability()` at boot). For observability that applies to the server's own exporter only: cron / evolution runs are `halo cli` children that don't inherit those settings-derived `OTEL_*` vars (`cleanChildEnv()` strips them), so they use a new value on their next run — as the field descriptions say. They carry `restartRequired: true`; after a save or Reset of one of them the Settings page shows a notice above the section listing the saved keys and saying the Halo server must be restarted (dismissable; it stays until dismissed). Every other General key is read live.
126
+ **Restart-required fields**: `agent.max_retries`, `session.max_queue_size`, `session.max_nesting_depth`, `compact.keep_messages`, `compact.max_summary_input`, `compact.max_message_slice`, `logging.level` and the four `observability.*` keys are read once at server start (object literals in `config.ts`; observability is mapped onto `OTEL_*` env by `initObservability()` at boot). For observability that applies to the server's own exporter (cron runs included — they run in the server process) only: evolution runs are `halo cli` children that don't inherit those settings-derived `OTEL_*` vars (`cleanChildEnv()` strips them), so they use a new value on their next run — as the field descriptions say. They carry `restartRequired: true`; after a save or Reset of one of them the Settings page shows a notice above the section listing the saved keys and saying the Halo server must be restarted (dismissable; it stays until dismissed). Every other General key is read live.
127
127
 
128
128
  ### Field attributes
129
129
 
@@ -36,13 +36,13 @@ The Bottom Panel (Chat + Terminal) can also be **floated** into a draggable wind
36
36
  | Bot | Agents | — | Agent config editor + Test (full width) | — |
37
37
  | Zap | Skills | Skill list | SkillsMain (full height) | — |
38
38
  | MessageCircle | Channels | Channel list | Channel config editor | — |
39
- | Sparkles | Evolution | Run list + status filters | Evolution main (run/apply review) | — |
40
- | Clock | Cron | Job list | Cron job detail / form + run audit | — |
39
+ | Sparkles | Evolution | Run list + status / auto / observation filters | Evolution main (run/apply review, auto-apply verdict, rollback, observation → GitHub issue) | — |
40
+ | Clock | Triggers (触发器) | Job list | Cron job detail / form + run audit | — |
41
41
  | Settings2 | Settings | — | Settings panel | — |
42
42
 
43
- The Source Control entry is hidden in workspaces that are not git repos.
43
+ The Source Control entry is hidden in workspaces that are not git repos. The Triggers tab is the UI name for cron jobs (schedule, one-shot and webhook); code, API, routes and the `cron` skill keep the `cron` name.
44
44
 
45
- **Extension entries.** An installed [canvas extension](../design/canvas-extensions.md#activity-bar-entries) whose manifest declares `activity` adds one button after Cron (several sort by the manifest's `order`, then id; the built-in tabs never move). It uses the extension's icon (tinted like the built-in icons; a puzzle piece when it has none) and its title / description in the hover drawer, in the admin's language. Clicking it shows the extension's page full-width in the main area with no sidebar, like Agents / Settings; leaving the tab closes the page (anything it was playing or refreshing stops). The last-used page is restored after a reload; if that extension has been removed, or doesn't run on this device, the workspace opens on Explorer instead. With no such extension installed, the bar is unchanged.
45
+ **Extension entries.** An installed [canvas extension](../design/canvas-extensions.md#activity-bar-entries) whose manifest declares `activity` adds one button after Triggers (several sort by the manifest's `order`, then id; the built-in tabs never move). It uses the extension's icon (tinted like the built-in icons; a puzzle piece when it has none) and its title / description in the hover drawer, in the admin's language. Clicking it shows the extension's page full-width in the main area with no sidebar, like Agents / Settings; leaving the tab closes the page (anything it was playing or refreshing stops). The last-used page is restored after a reload; if that extension has been removed, or doesn't run on this device, the workspace opens on Explorer instead. With no such extension installed, the bar is unchanged.
46
46
 
47
47
  **Short windows.** When the window is too short for every view button, the upper group (built-in views + extension entries) scrolls (no visible scrollbar); Settings and the quick-toggles entry stay pinned at the bottom.
48
48