@turmind/halo 2.0.8 → 2.1.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 (41) hide show
  1. package/admin-out/404.html +1 -1
  2. package/admin-out/_next/static/chunks/{241-75bac3bb8e7aca1b.js → 398-9a8be186767b4504.js} +1 -1
  3. package/admin-out/_next/static/chunks/989-71c38d29c6672b27.js +1 -0
  4. package/admin-out/_next/static/chunks/app/page-67334fcd2175c7ad.js +1 -0
  5. package/admin-out/_next/static/css/3467b854242306b8.css +1 -0
  6. package/admin-out/index.html +1 -1
  7. package/admin-out/index.txt +5 -5
  8. package/bundled-docs/design/agentcore.md +1 -1
  9. package/bundled-docs/design/architecture.md +5 -3
  10. package/bundled-docs/design/canvas-extensions.md +1 -1
  11. package/bundled-docs/design/node.md +98 -0
  12. package/bundled-docs/design/prompt-system.md +2 -0
  13. package/bundled-docs/design/storage.md +4 -4
  14. package/bundled-docs/design/ws.md +8 -7
  15. package/bundled-docs/dev/api.md +21 -0
  16. package/bundled-docs/dev/env.md +2 -2
  17. package/bundled-docs/dev/tools.md +58 -1
  18. package/bundled-docs/guide/README.md +4 -0
  19. package/bundled-docs/guide/agents.md +1 -1
  20. package/bundled-docs/guide/cli.md +23 -0
  21. package/bundled-docs/guide/delegation-and-access.md +2 -2
  22. package/bundled-docs/guide/node.md +86 -0
  23. package/bundled-docs/guide/workspace.md +6 -3
  24. package/bundled-docs/requirements/agent.md +1 -1
  25. package/bundled-docs/requirements/terminal.md +76 -44
  26. package/bundled-docs/requirements/workspace.md +12 -1
  27. package/dist/evo-wrapper.js +7 -5
  28. package/dist/index.js +1997 -844
  29. package/package.json +3 -1
  30. package/templates/agents/default/agent.yaml +2 -0
  31. package/templates/config.yaml +0 -6
  32. package/templates/models/aws-bedrock-mantle.yaml +44 -4
  33. package/templates/models/aws-bedrock-openai.yaml +44 -4
  34. package/templates/models/doubao.yaml +97 -7
  35. package/templates/models/kimi.yaml +41 -3
  36. package/templates/models/minimax.yaml +35 -4
  37. package/admin-out/_next/static/chunks/989-af7e27a2004069ac.js +0 -1
  38. package/admin-out/_next/static/chunks/app/page-2af2482b39d6ec64.js +0 -1
  39. package/admin-out/_next/static/css/2e6b00182ac44ae1.css +0 -1
  40. /package/admin-out/_next/static/{pBIsb2BS3McG20ieKaTDx → 0cRHmPZfENhrU7Hb0w3n_}/_buildManifest.js +0 -0
  41. /package/admin-out/_next/static/{pBIsb2BS3McG20ieKaTDx → 0cRHmPZfENhrU7Hb0w3n_}/_ssgManifest.js +0 -0
@@ -67,6 +67,17 @@ Two tabs:
67
67
 
68
68
  Current tab stored in `editorStore.bottomTab`.
69
69
 
70
+ The middle of the tab bar shows the current tab's title — the session title on Chat ("New session" for a draft, "Untitled session" until it has one), the active terminal's name on Terminal. It is truncated with an ellipsis when it doesn't fit (full text on hover) and hidden when the bar is too narrow.
71
+
72
+ ### Split view
73
+ A split button (split-square icon, left of maximize) shows Chat and Terminal at once; pressing it again returns to the single view:
74
+ - **Layout**: side by side (Chat left, Terminal right) when the panel's content is at least 720px wide; stacked (Chat on top) when it's narrower — e.g. the 480-wide floating window. The direction follows the width live
75
+ - **Divider**: drag to resize; each pane keeps at least 20%. The ratio is remembered separately for side-by-side and stacked (`localStorage` `halo_bottom_split_ratio_row` / `_column`)
76
+ - **Tab bar**: both tabs show as selected; clicking either one leaves the split and shows just that tab. The centred title reads `<chat title> · <terminal name>`, dropping an empty half
77
+ - **Terminal** mounts as soon as the split opens (it's otherwise mounted on first visit to the Terminal tab)
78
+ - **Persisted** in `localStorage` (`editorStore.bottomSplit`, key `halo_bottom_split`) — survives a refresh. Works docked, maximized and floating
79
+ - Switching single ↔ split or flipping the direction never remounts Chat or Terminal — the chat keeps its state and terminals their scroll buffers
80
+
70
81
  ### Floating mode
71
82
  The tab bar has a maximize button and, at the far right, a float button. Toggling the float button detaches the panel into a draggable window:
72
83
  - **Default position/size**: bottom-right corner, 480×640 with a 24px margin
@@ -84,7 +95,7 @@ The tab bar has a maximize button and, at the far right, a float button. Togglin
84
95
  |---|---|
85
96
  | Cmd/Ctrl + P | Quick Open (fuzzy file search) |
86
97
  | Cmd/Ctrl + S | Save current file |
87
- | Cmd/Ctrl + ` | Toggle the bottom panel between Chat and Terminal |
98
+ | Cmd/Ctrl + ` | Toggle the bottom panel between Chat and Terminal (does nothing in split view) |
88
99
  | Alt + W | Close current tab (Cmd+W cannot be overridden in browsers; the desktop app uses Cmd/Ctrl + W) |
89
100
 
90
101
  ## Auth
@@ -211,6 +211,9 @@ function cleanChildEnv() {
211
211
  const env = { ...process.env };
212
212
  delete env.HALO_PASSWORD;
213
213
  delete env.HALO_JWT_SECRET;
214
+ delete env.HALO_NODE_RELAY_URL;
215
+ delete env.HALO_NODE_RELAY_TOKEN;
216
+ delete env.HALO_NODE_TOKEN;
214
217
  for (const key of settingsOtelEnvKeys)
215
218
  delete env[key];
216
219
  return env;
@@ -885,7 +888,7 @@ function generalSection() {
885
888
  { key: "limits.tool_result_render_chars", type: "int", globalOnly: true, description: 'Per-tool-result cap on the content fed back to the LLM. Larger results are truncated (with a "[Content truncated]" marker telling the model to re-run with narrower scope) to protect the context window and prompt cache. The UI/admin chat panel shows a far larger slice \u2014 see tool_result_ui_chars.', description_zh: "\u6BCF\u6761 tool result \u56DE\u4F20\u7ED9 LLM \u7684\u5185\u5BB9\u957F\u5EA6\u4E0A\u9650\u3002\u8D85\u51FA\u90E8\u5206\u4F1A\u88AB\u622A\u65AD\uFF08\u5E76\u9644 [Content truncated] \u6807\u8BB0\u63D0\u793A\u6A21\u578B\u7F29\u5C0F\u8303\u56F4\u91CD\u67E5\uFF09\uFF0C\u4EE5\u4FDD\u62A4\u4E0A\u4E0B\u6587\u7A97\u53E3\u548C\u63D0\u793A\u8BCD\u7F13\u5B58\u3002UI/admin \u804A\u5929\u9762\u677F\u5C55\u793A\u7684\u5185\u5BB9\u4E0A\u9650\u8981\u5927\u5F97\u591A\uFF0C\u89C1 tool_result_ui_chars\u3002", default: "8000" },
886
889
  { key: "limits.tool_result_ui_chars", type: "int", globalOnly: true, description: "Per-tool-result cap on the content stored for UI display (admin/web chat panel). Far larger than the LLM cap so the full output of a normal command stays visible, but bounded so a multi-MB `cat` does not bloat the session file, the WS payload, or the browser render. Output past this is truncated with a marker pointing at file_read for the complete content.", description_zh: "\u6BCF\u6761 tool result \u5B58\u7ED9 UI \u5C55\u793A\uFF08admin/web \u804A\u5929\u9762\u677F\uFF09\u7684\u5185\u5BB9\u957F\u5EA6\u4E0A\u9650\u3002\u8FDC\u5927\u4E8E LLM \u4E0A\u9650\uFF0C\u4FDD\u8BC1\u666E\u901A\u547D\u4EE4\u7684\u5B8C\u6574\u8F93\u51FA\u90FD\u80FD\u770B\u5230\uFF1B\u4F46\u4ECD\u6709\u754C\uFF0C\u907F\u514D cat \u4E2A\u51E0 MB \u7684\u6587\u4EF6\u6491\u7206\u4F1A\u8BDD\u6587\u4EF6\u3001WS \u4F20\u8F93\u548C\u6D4F\u89C8\u5668\u6E32\u67D3\u3002\u8D85\u51FA\u90E8\u5206\u622A\u65AD\u5E76\u9644\u6807\u8BB0\uFF0C\u63D0\u793A\u7528 file_read \u770B\u5B8C\u6574\u5185\u5BB9\u3002", default: String(64 * 1024) },
887
890
  { key: "limits.auto_report_chars", type: "int", globalOnly: true, description: "Cap on the auto-report a finished sub-agent delivers to its parent. Longer reports are truncated with a pointer to get_session_output for the full text.", description_zh: "\u5B50\u4F1A\u8BDD\u5B8C\u6210\u540E\u81EA\u52A8\u4E0A\u62A5\u7ED9\u7236\u4F1A\u8BDD\u7684\u5185\u5BB9\u957F\u5EA6\u4E0A\u9650\u3002\u8D85\u51FA\u622A\u65AD\uFF0C\u5E76\u63D0\u793A\u7528 get_session_output \u53D6\u5168\u6587\u3002", default: "8192" },
888
- { key: "limits.terminal_scrollback_bytes", type: "int", globalOnly: true, description: "Off-screen scrollback bytes retained per persistent terminal while detached.", description_zh: "\u7EC8\u7AEF\u65AD\u5F00\u671F\u95F4\u4FDD\u7559\u7684\u56DE\u6EDA\u7F13\u51B2\u5B57\u8282\u6570\u3002", default: "50000" }
891
+ { key: "limits.terminal_scrollback_lines", type: "int", globalOnly: true, description: "Scrollback lines the server keeps per terminal, restored to every page that attaches (reconnect, another browser or device). Applies to terminals opened after the change.", description_zh: "\u670D\u52A1\u7AEF\u4E3A\u6BCF\u4E2A\u7EC8\u7AEF\u4FDD\u7559\u7684\u56DE\u6EDA\u884C\u6570\uFF0C\u4EFB\u4F55\u9875\u9762\u63A5\u5165\uFF08\u91CD\u8FDE\u3001\u6362\u6D4F\u89C8\u5668\u6216\u8BBE\u5907\uFF09\u65F6\u6062\u590D\u3002\u4FEE\u6539\u540E\u5BF9\u65B0\u5F00\u7684\u7EC8\u7AEF\u751F\u6548\u3002", default: "5000" }
889
892
  ].map((f) => ({
890
893
  ...f,
891
894
  kind: "param",
@@ -1352,8 +1355,7 @@ var config = {
1352
1355
  // fragments, SSE comments included), so for them it is an idle timeout — a
1353
1356
  // long but live stream is never cut off.
1354
1357
  modelRequest: systemInt("HALO_MODEL_TIMEOUT", "timeout.model_request", 10 * 6e4),
1355
- sessionGrace: systemInt("HALO_SESSION_GRACE", "timeout.session_grace", 5 * 6e4),
1356
- terminalGrace: systemInt("HALO_TERMINAL_GRACE", "timeout.terminal_grace", 5 * 6e4)
1358
+ sessionGrace: systemInt("HALO_SESSION_GRACE", "timeout.session_grace", 5 * 6e4)
1357
1359
  },
1358
1360
  // Runtime caps — read live from settings.yaml on every access. Getters
1359
1361
  // (not literals) so a settings reload takes effect on the next tool
@@ -1378,8 +1380,8 @@ var config = {
1378
1380
  get autoReportMax() {
1379
1381
  return settingsInt("general.limits.auto_report_chars", 8192);
1380
1382
  },
1381
- get terminalOutputBuffer() {
1382
- return settingsInt("general.limits.terminal_scrollback_bytes", 5e4);
1383
+ get terminalScrollbackLines() {
1384
+ return settingsInt("general.limits.terminal_scrollback_lines", 5e3);
1383
1385
  }
1384
1386
  },
1385
1387
  compact: {