@turmind/halo 1.5.5 → 1.5.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.
- package/admin-out/404.html +1 -1
- package/admin-out/_next/static/chunks/989-e0faeff1c4a0b0b9.js +1 -0
- package/admin-out/_next/static/chunks/app/page-44f707ea8dad57da.js +1 -0
- package/admin-out/_next/static/css/b8c87b919758c52b.css +3 -0
- package/admin-out/index.html +1 -1
- package/admin-out/index.txt +5 -5
- package/bundled-docs/design/agent.md +14 -12
- package/bundled-docs/design/architecture.md +12 -11
- package/bundled-docs/design/canvas-extensions.md +19 -4
- package/bundled-docs/design/session.md +2 -2
- package/bundled-docs/design/storage.md +15 -12
- package/bundled-docs/dev/add-model-provider.md +33 -24
- package/bundled-docs/dev/api.md +4 -1
- package/bundled-docs/dev/deploy.md +1 -1
- package/bundled-docs/dev/desktop-packaging.md +4 -3
- package/bundled-docs/dev/env.md +14 -11
- package/bundled-docs/dev/tools.md +2 -2
- package/bundled-docs/guide/agents.md +2 -2
- package/bundled-docs/guide/cli.md +5 -4
- package/bundled-docs/guide/delegation-and-access.md +1 -1
- package/bundled-docs/guide/getting-started.md +1 -1
- package/bundled-docs/guide/skills.md +3 -3
- package/bundled-docs/guide/workspace.md +2 -2
- package/bundled-docs/requirements/editor.md +3 -2
- package/bundled-docs/requirements/settings.md +17 -8
- package/dist/index.js +9671 -9631
- package/package.json +1 -1
- package/templates/agents/default/agent.yaml +1 -0
- package/templates/models/anthropic.yaml +1 -0
- package/templates/models/aws-bedrock-claude-invoke.yaml +1 -0
- package/templates/models/aws-bedrock-mantle.yaml +1 -0
- package/templates/models/aws-bedrock-openai.yaml +1 -0
- package/templates/models/deepseek.yaml +1 -0
- package/templates/models/doubao.yaml +1 -0
- package/templates/models/hunyuan.yaml +1 -0
- package/templates/models/kimi.yaml +1 -0
- package/templates/models/mimo-token-plan-china.yaml +1 -0
- package/templates/models/minimax.yaml +1 -0
- package/templates/models/openai.yaml +1 -0
- package/templates/models/qwen.yaml +1 -0
- package/templates/models/zhipu.yaml +1 -0
- package/templates/skills/extension/SKILL.md +25 -14
- package/templates/skills/extension/config.yaml +9 -0
- package/templates/skills/extension/templates/ext.sh +166 -34
- package/templates/skills/web-search/SKILL.md +20 -6
- package/templates/skills/web-search/config.yaml +13 -0
- package/templates/skills/web-search/search.py +27 -6
- package/admin-out/_next/static/chunks/989-bc743317498d3fbc.js +0 -1
- package/admin-out/_next/static/chunks/app/page-0a390059f1914664.js +0 -1
- package/admin-out/_next/static/css/b53542687ebd4c65.css +0 -3
- /package/admin-out/_next/static/{cuVcldfdg1PXevaQMQSzb → rTD3zkMvzwtqUwzhz6QJH}/_buildManifest.js +0 -0
- /package/admin-out/_next/static/{cuVcldfdg1PXevaQMQSzb → rTD3zkMvzwtqUwzhz6QJH}/_ssgManifest.js +0 -0
|
@@ -17,8 +17,8 @@ general: # built-in declarer (server itself)
|
|
|
17
17
|
max_summary_input: 15000
|
|
18
18
|
...
|
|
19
19
|
sandbox:
|
|
20
|
-
hidden_dirs: "~/.
|
|
21
|
-
hidden_files: "~/.
|
|
20
|
+
hidden_dirs: "~/.kube" # extras — appended to the built-in list, never replace it
|
|
21
|
+
hidden_files: "~/.pgpass" # extras — appended to the built-in list, never replace it
|
|
22
22
|
writable_dirs: "" # e.g. ~/.kiro,~/.local/share/kiro-cli — rw bind-mounts in bwrap; ignored for readonly sessions
|
|
23
23
|
logging:
|
|
24
24
|
level: warn
|
|
@@ -62,7 +62,8 @@ Schema lives **inside the package**, alongside its other files:
|
|
|
62
62
|
### Provider secrets — `models/<provider-id>.yaml`
|
|
63
63
|
|
|
64
64
|
```yaml
|
|
65
|
-
id: aws-bedrock-claude-invoke
|
|
65
|
+
id: aws-bedrock-claude-invoke # provider identity — also the settings namespace below
|
|
66
|
+
runtime: bedrock-invoke # implementation class; not part of the settings schema
|
|
66
67
|
displayName: AWS Bedrock Claude (Invoke API)
|
|
67
68
|
defaultEndpoint: https://bedrock-runtime.us-west-2.amazonaws.com
|
|
68
69
|
|
|
@@ -91,15 +92,17 @@ params:
|
|
|
91
92
|
secrets: []
|
|
92
93
|
```
|
|
93
94
|
|
|
95
|
+
Built-in skills declare theirs the same way — today `extension`, with a plain `hub_repo` param (the hub `/extension install <id>` pulls from; empty = turmind/halo-hub), and `web-search`, with plain `fast_region` / `deep_region` params (AWS regions for its two Bedrock gears; empty = us-east-1 fast, us-west-2 deep / us-east-1 for sol). `halo setup` asks only for built-in skills' `secret: true` params; plain params are configured in Settings → Skills only.
|
|
96
|
+
|
|
94
97
|
Global agents declare theirs the same way in `agents/<agent-id>/agent-config.yaml` (same `params:` / `secrets:` lists; shown under Settings → Agents).
|
|
95
98
|
|
|
96
99
|
### General — built-in
|
|
97
100
|
|
|
98
|
-
Declared in [packages/server/src/settings-schema.ts](../../../packages/server/src/settings-schema.ts) `generalSection()`. The server itself is the implicit declarer. Keys: `language`, `theme`, `agent
|
|
101
|
+
Declared in [packages/server/src/settings-schema.ts](../../../packages/server/src/settings-schema.ts) `generalSection()`. The server itself is the implicit declarer. Keys: `language`, `theme`, `agent.max_retries`, `server.*`, `session.*`, `compact.*`, `sandbox.*`, `logging.*`, `observability.*` (read once at boot — restart to apply), `evolution.*`, `limits.*`. All `general.*` keys are `globalOnly`: `config.ts` resolves them through `settingsValue()` against `~/.halo/secrets/settings.yaml` only, so a workspace `settings.yaml` cannot override them. Per-workspace layering applies to namespaced `params` / `secrets` (`getServerSecret(ns, key, workspaceRoot)`, `substituteSecrets`).
|
|
99
102
|
|
|
100
103
|
`server.trust_proxy` (boolean, default `false`, `globalOnly`): whether the brute-force rate limiter (`middleware/brute-force.ts` `getClientIp`) trusts the `x-forwarded-for` header for client IP resolution. Direct-connect deployments leave it `false` and get the socket address. Behind a reverse proxy (nginx / Cloudflare / etc.), set it to `true` so the real client IP is honored instead of the proxy's — but only when that proxy is one you control and rewrites the header itself, otherwise a client can forge XFF to dodge lockouts.
|
|
101
104
|
|
|
102
|
-
`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).
|
|
105
|
+
`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).
|
|
103
106
|
|
|
104
107
|
`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).
|
|
105
108
|
|
|
@@ -112,7 +115,11 @@ general:
|
|
|
112
115
|
|
|
113
116
|
The value is read once at process start, so unlike other settings it is **not** picked up by the mtime-watching reload.
|
|
114
117
|
|
|
115
|
-
|
|
118
|
+
There is no "default provider" setting: a newly created agent's `model:` is a copy of the **default agent's** `model:` mapping — for workspace scope `<project>/.halo/agents/default/agent.yaml` when it exists, else the global `~/.halo/global/agents/default/agent.yaml`; for global scope the global one. When that file is missing or has no `model` mapping, the scaffold falls back to the provider registry (`aws-bedrock-claude-invoke` if installed, else the first provider on disk), deriving model id / endpoint / prompt caching / thinking from that provider's YAML. Only `model` is copied; `context` stays the scaffold default. Existing agents are not retroactively touched. A leftover `general.agent.default_provider` in `settings.yaml` is ignored. Implementation: [packages/server/src/routes/agent-configs.ts](../../../packages/server/src/routes/agent-configs.ts) `scaffoldModelBlock()`.
|
|
119
|
+
|
|
120
|
+
**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()`).
|
|
121
|
+
|
|
122
|
+
**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). 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.
|
|
116
123
|
|
|
117
124
|
### Field attributes
|
|
118
125
|
|
|
@@ -123,8 +130,10 @@ The value is read once at process start, so unlike other settings it is **not**
|
|
|
123
130
|
| `options` / `optionLabels` | no | For `type: enum`: the allowed values, and optional display labels parallel to them |
|
|
124
131
|
| `description` | no | English description rendered as help text |
|
|
125
132
|
| `description_zh` | no | Chinese description (UI picks based on lang) |
|
|
126
|
-
| `default` | no | Placeholder shown when the value is unset; supports `<<ENV
|
|
133
|
+
| `default` | no | Placeholder shown when the value is unset; supports `<<ENV>>`. For provider / skill / agent fields it is display-only: an unset param's `{{<id>.params.<key>}}` stays literal at substitution, so the consumer applies its own fallback (the `extension` skill's `ext.sh` treats `{{…}}` as "use the default hub"; `web-search`'s `search.py` as "use the default region") |
|
|
127
134
|
| `secret` | no | `true` → masked in API responses + password input in UI |
|
|
135
|
+
| `restartRequired` | no | `true` → read once at server start; the Settings page shows a restart notice after saving it. Built-in `general` section only |
|
|
136
|
+
| `advanced` | no | `true` → rendered in the collapsed "Advanced" area. Built-in `general` section only (every field except `language` / `theme`) |
|
|
128
137
|
| `globalOnly` | no | `true` → read from global settings only; workspace overrides are ignored at runtime. UI disables the workspace input and shows a "global only" hint; `PUT` / `PATCH` / `DELETE` of such a key at workspace scope is rejected with 400. Set by the built-in `general` section only — provider / skill / agent yaml declarations don't read it |
|
|
129
138
|
|
|
130
139
|
## Scope: global vs. workspace
|
|
@@ -249,4 +258,4 @@ The admin UI is bilingual (en/zh). Field descriptions are localized via `descrip
|
|
|
249
258
|
|
|
250
259
|
## Config caching
|
|
251
260
|
|
|
252
|
-
`config.ts` reads `settings.yaml` lazily with mtime-watching: every read stats the file and reparses if the mtime has changed. UI saves bump the mtime, so the server picks up new secrets on the next
|
|
261
|
+
`config.ts` reads `settings.yaml` lazily with mtime-watching: every read stats the file and reparses if the mtime has changed. UI saves bump the mtime, so the server picks up new secrets, params and most General keys on the next read without a restart. The exceptions are the `restartRequired` General keys (see General above) and `general.goal_mode_enabled`, which are read once at boot — those need a server restart. See [packages/server/src/config.ts](../../../packages/server/src/config.ts) `getSettings()`.
|