@turmind/halo 1.6.0 → 1.6.2

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 (59) hide show
  1. package/admin-out/404.html +1 -1
  2. package/admin-out/_next/static/chunks/58.d26b1c4f14404226.js +1 -0
  3. package/admin-out/_next/static/chunks/989-ddba0eb72566da23.js +1 -0
  4. package/admin-out/_next/static/chunks/app/page-1d27029caba48956.js +1 -0
  5. package/admin-out/_next/static/chunks/webpack-74f577c1b094f942.js +1 -0
  6. package/admin-out/_next/static/css/3b4dcd0ac6b8eae8.css +1 -0
  7. package/admin-out/index.html +1 -1
  8. package/admin-out/index.txt +5 -5
  9. package/bundled-docs/design/agent.md +6 -4
  10. package/bundled-docs/design/canvas-extensions.md +30 -4
  11. package/bundled-docs/design/cron.md +24 -11
  12. package/bundled-docs/design/prompt-system.md +10 -5
  13. package/bundled-docs/design/session.md +4 -1
  14. package/bundled-docs/design/storage.md +36 -11
  15. package/bundled-docs/design/ws.md +7 -5
  16. package/bundled-docs/dev/add-model-provider.md +17 -11
  17. package/bundled-docs/dev/api.md +25 -12
  18. package/bundled-docs/dev/deploy.md +3 -0
  19. package/bundled-docs/dev/desktop-packaging.md +11 -5
  20. package/bundled-docs/dev/env.md +1 -1
  21. package/bundled-docs/dev/previews.md +26 -0
  22. package/bundled-docs/guide/agents.md +6 -6
  23. package/bundled-docs/guide/cli.md +5 -4
  24. package/bundled-docs/guide/skills.md +12 -6
  25. package/bundled-docs/guide/workspace.md +1 -1
  26. package/bundled-docs/requirements/agent.md +5 -0
  27. package/bundled-docs/requirements/chat.md +9 -5
  28. package/bundled-docs/requirements/command.md +4 -0
  29. package/bundled-docs/requirements/editor.md +20 -6
  30. package/bundled-docs/requirements/session.md +1 -1
  31. package/bundled-docs/requirements/skill.md +15 -9
  32. package/dist/index.js +2332 -1348
  33. package/package.json +1 -1
  34. package/templates/models/anthropic.yaml +109 -13
  35. package/templates/models/aws-bedrock-claude-invoke.yaml +39 -13
  36. package/templates/models/aws-bedrock-mantle.yaml +60 -28
  37. package/templates/models/aws-bedrock-openai.yaml +52 -29
  38. package/templates/models/deepseek.yaml +19 -10
  39. package/templates/models/doubao.yaml +72 -20
  40. package/templates/models/hunyuan.yaml +79 -15
  41. package/templates/models/kimi.yaml +63 -3
  42. package/templates/models/mimo-token-plan-china.yaml +9 -1
  43. package/templates/models/minimax.yaml +9 -3
  44. package/templates/models/openai.yaml +120 -17
  45. package/templates/models/qwen.yaml +103 -6
  46. package/templates/models/zhipu.yaml +9 -1
  47. package/templates/schema.sql +1 -1
  48. package/templates/skills/cron/SKILL.md +40 -3
  49. package/templates/skills/cron/manage-cron.py +140 -15
  50. package/templates/skills/skill/SKILL.md +22 -11
  51. package/templates/skills/workspace/share.md +5 -2
  52. package/templates/skills/workspace/stage.py +51 -14
  53. package/admin-out/_next/static/chunks/220.7566bc89f3d98993.js +0 -1
  54. package/admin-out/_next/static/chunks/989-a7f752480eaaa2dc.js +0 -1
  55. package/admin-out/_next/static/chunks/app/page-8173112f256bc483.js +0 -1
  56. package/admin-out/_next/static/chunks/webpack-dc73047e0279979b.js +0 -1
  57. package/admin-out/_next/static/css/981c9e5610ce535a.css +0 -1
  58. /package/admin-out/_next/static/{_F_Fkyh9PainUNY82EEjY → VgAe62AuGEiYrF4JQ7WQe}/_buildManifest.js +0 -0
  59. /package/admin-out/_next/static/{_F_Fkyh9PainUNY82EEjY → VgAe62AuGEiYrF4JQ7WQe}/_ssgManifest.js +0 -0
@@ -1,10 +1,10 @@
1
1
  id: kimi
2
2
  runtime: kimi
3
- revision: 2026100501
3
+ revision: 2026101004
4
4
  displayName: Kimi (Moonshot AI)
5
5
  displayName_zh: Kimi(月之暗面)
6
- description: Kimi K3 / K2.6 via OpenAI-compatible chat completions API
7
- description_zh: Kimi K3 / K2.6,通过 OpenAI 兼容的 chat completions API 调用
6
+ description: Kimi K3 / K2.7 Code / K2.6 via OpenAI-compatible chat completions API
7
+ description_zh: Kimi K3 / K2.7 Code / K2.6,通过 OpenAI 兼容的 chat completions API 调用
8
8
  defaultEndpoint: https://api.moonshot.cn/v1
9
9
 
10
10
  secrets:
@@ -30,6 +30,8 @@ models:
30
30
  # Official default output cap; the model can go up to 1M but we don't max out.
31
31
  maxOutputTokens: 131072
32
32
  contextWindow: 272000
33
+ maxContextWindow: 1000000
34
+ compressAt: 0.9
33
35
  capabilities:
34
36
  # K3 itself also supports video input, but Halo has no video upload
35
37
  # path yet — keep video:false until one exists. Image input is
@@ -53,10 +55,68 @@ models:
53
55
  effortPresets:
54
56
  - { value: max, label: Max }
55
57
 
58
+ - id: kimi-k2.7-code
59
+ displayName: Kimi K2.7 Code
60
+ # Official quickstart: 256K context, max_tokens default 32768.
61
+ maxOutputTokens: 32768
62
+ contextWindow: 262144
63
+ maxContextWindow: 262144
64
+ compressAt: 0.9
65
+ capabilities:
66
+ # Live probe 2026-10-10: named a red 64×64 PNG correctly (base64 data URL).
67
+ # Video input exists upstream but Halo has no video path (see K3).
68
+ image: true
69
+ video: false
70
+ audio: false
71
+ promptCaching:
72
+ # Automatic (prompt_cache_key hint) — probe: turn 2 cached 5376/5622.
73
+ default: 5m
74
+ ttlPresets:
75
+ - { value: 5m, label: 5min }
76
+ thinking:
77
+ # Thinking is MANDATORY: thinking:{type:'disabled'} → 400 "only
78
+ # type=enabled is allowed for this model". kimi-agent's K2.x branch only
79
+ # sends `disabled` for effort 'disabled', so toggling Off in the form
80
+ # just omits the field and the model still thinks.
81
+ defaultEnabled: true
82
+ default: medium
83
+ effortPresets:
84
+ - { value: medium, label: On }
85
+
86
+ - id: kimi-k2.7-code-highspeed
87
+ displayName: Kimi K2.7 Code (highspeed)
88
+ # Same model as kimi-k2.7-code at ~5-6x output speed (official quickstart:
89
+ # "与 Kimi K2.7 Code 是同一个模型", 256K context, no non-thinking mode;
90
+ # capacity "偶有波动"). /v1/models: context_length 262144, image in.
91
+ maxOutputTokens: 32768
92
+ contextWindow: 262144
93
+ maxContextWindow: 262144
94
+ compressAt: 0.9
95
+ capabilities:
96
+ # Live probe 2026-10-10: red 64×64 PNG → "Red"; tool call → tool_calls;
97
+ # max_tokens 32768 OK. Video: no Halo path (see K3).
98
+ image: true
99
+ video: false
100
+ audio: false
101
+ promptCaching:
102
+ # Automatic (prompt_cache_key hint) — probe: turn 2 cached 7016/7016.
103
+ default: 5m
104
+ ttlPresets:
105
+ - { value: 5m, label: 5min }
106
+ thinking:
107
+ # MANDATORY, as on kimi-k2.7-code: thinking:{type:'disabled'} → 400
108
+ # "only type=enabled is allowed for this model".
109
+ defaultEnabled: true
110
+ default: medium
111
+ effortPresets:
112
+ - { value: medium, label: On }
113
+
56
114
  - id: kimi-k2.6
57
115
  displayName: Kimi K2.6
58
116
  maxOutputTokens: 32768
59
117
  contextWindow: 262144
118
+ maxContextWindow: 262144
119
+ compressAt: 0.9
60
120
  capabilities:
61
121
  # Verified 2026-05-27 via live probes: kimi-k2.6 returns "prepare
62
122
  # image failed" on image_url blocks despite past docs claiming
@@ -1,6 +1,6 @@
1
1
  id: mimo-token-plan-china
2
2
  runtime: anthropic-messages
3
- revision: 2026100501
3
+ revision: 2026101002
4
4
  displayName: Xiaomi MiMo
5
5
  displayName_zh: 小米 MiMo
6
6
  description: Xiaomi MiMo via its Anthropic-compatible gateway — Token Plan (China / Singapore / Europe clusters) or pay-as-you-go. Supports 1M context window.
@@ -40,6 +40,8 @@ models:
40
40
  displayName: MiMo v2.6 Pro
41
41
  maxOutputTokens: 131072
42
42
  contextWindow: 272000
43
+ maxContextWindow: 1000000
44
+ compressAt: 0.9
43
45
  capabilities:
44
46
  image: true
45
47
  video: false
@@ -63,6 +65,8 @@ models:
63
65
  displayName: MiMo v2.6 Flash
64
66
  maxOutputTokens: 131072
65
67
  contextWindow: 272000
68
+ maxContextWindow: 1000000
69
+ compressAt: 0.9
66
70
  capabilities:
67
71
  image: true
68
72
  video: false
@@ -87,6 +91,8 @@ models:
87
91
  displayName: MiMo v2.5 Pro (deprecated 2026-10-21)
88
92
  maxOutputTokens: 131072
89
93
  contextWindow: 272000
94
+ maxContextWindow: 1000000
95
+ compressAt: 0.9
90
96
  capabilities:
91
97
  image: false
92
98
  video: false
@@ -110,6 +116,8 @@ models:
110
116
  displayName: MiMo v2.5 (deprecated 2026-10-21)
111
117
  maxOutputTokens: 131072
112
118
  contextWindow: 272000
119
+ maxContextWindow: 1000000
120
+ compressAt: 0.9
113
121
  capabilities:
114
122
  image: true
115
123
  video: false
@@ -1,6 +1,6 @@
1
1
  id: minimax
2
2
  runtime: minimax
3
- revision: 2026100501
3
+ revision: 2026101002
4
4
  displayName: MiniMax
5
5
  displayName_zh: MiniMax
6
6
  description: MiniMax M3 / M2.7 family via the Anthropic-compatible Messages API
@@ -43,6 +43,8 @@ models:
43
43
  # Official recommended value; hard cap is 524288 but we don't max out.
44
44
  maxOutputTokens: 131072
45
45
  contextWindow: 272000
46
+ maxContextWindow: 1000000
47
+ compressAt: 0.9
46
48
  capabilities:
47
49
  # M3 also supports video input, but Halo has no video upload path yet —
48
50
  # keep video:false until one exists. Image rides the Anthropic-compatible
@@ -71,6 +73,8 @@ models:
71
73
  displayName: MiniMax M2.7
72
74
  maxOutputTokens: 16384
73
75
  contextWindow: 204800
76
+ maxContextWindow: 204800
77
+ compressAt: 0.9
74
78
  capabilities:
75
79
  image: false
76
80
  video: false
@@ -86,7 +90,7 @@ models:
86
90
  # minimax-agent.ts maps them via effortToBudget() before sending.
87
91
  mode: manual
88
92
  defaultEnabled: true
89
- default: medium
93
+ default: high
90
94
  defaultBudgetTokens: 8192
91
95
  effortPresets:
92
96
  - { value: medium, label: Medium }
@@ -96,6 +100,8 @@ models:
96
100
  displayName: MiniMax M2.7 Highspeed
97
101
  maxOutputTokens: 16384
98
102
  contextWindow: 204800
103
+ maxContextWindow: 204800
104
+ compressAt: 0.9
99
105
  capabilities:
100
106
  image: false
101
107
  video: false
@@ -107,7 +113,7 @@ models:
107
113
  thinking:
108
114
  mode: manual
109
115
  defaultEnabled: true
110
- default: medium
116
+ default: high
111
117
  defaultBudgetTokens: 8192
112
118
  effortPresets:
113
119
  - { value: medium, label: Medium }
@@ -1,51 +1,154 @@
1
1
  id: openai
2
2
  runtime: openai-chat
3
- revision: 2026100501
3
+ revision: 2026101005
4
4
  displayName: OpenAI (Generic)
5
5
  displayName_zh: OpenAI(通用)
6
6
  description: Generic OpenAI-compatible chat completions. Use for native OpenAI or any third-party OpenAI-compatible gateway. Capabilities are exposed openly — the user is expected to know what their endpoint supports.
7
7
  description_zh: 通用 OpenAI 兼容协议。可用于原生 OpenAI 或任何第三方 OpenAI 兼容网关。能力字段开放给用户自选——由用户对端点能力自行负责。
8
- defaultEndpoint: https://api.openai.com/v1
9
- defaultModelId: gpt-4o
8
+ defaultEndpoint: https://bedrock-mantle.us-east-1.api.aws/openai/v1
9
+ defaultModelId: openai.gpt-5.5
10
10
  endpointPresets:
11
+ - https://bedrock-mantle.us-east-1.api.aws/openai/v1
12
+ - https://bedrock-mantle.us-west-2.api.aws/openai/v1
11
13
  - https://api.openai.com/v1
12
14
 
13
15
  secrets:
14
16
  - key: api_key
15
- description: API key for the chosen OpenAI-compatible endpoint. Format depends on provider (sk-... for OpenAI, ark-... for Volcengine, etc.)
16
- description_zh: 所选 OpenAI 兼容端点的 API Key。前缀格式因厂商而异(OpenAI 是 sk-、火山方舟是 ark- 等)
17
+ description: API key of the chosen endpoint, sent as a Bearer token — e.g. a Bedrock API key for the Bedrock Mantle presets, or the key your OpenAI-compatible gateway issued (sk-... for OpenAI, ark-... for Volcengine, etc.).
18
+ description_zh: 所选端点的 API Key(以 Bearer 令牌发送)——例如 Bedrock Mantle 端点用 Bedrock API Key,其他 OpenAI 兼容网关用该网关签发的 Key(OpenAI 是 sk-、火山方舟是 ark- 等)。
17
19
  default: <<OPENAI_API_KEY>>
18
20
  secret: true
19
21
 
20
- # This provider is a "user-fills-everything" placeholder. The single
21
- # placeholder model below exists so the registry has something to render
22
- # in the form's model dropdown — replace its id/endpoint with whatever
23
- # you actually want to call. capabilities here are deliberately
24
- # permissive (image/video/audio all true, full thinking + caching
25
- # presets) so the form doesn't lock anything; if your real endpoint
26
- # doesn't support, e.g., audio, just don't send audio.
22
+ # Placeholder provider — point it at any OpenAI-compatible endpoint and type
23
+ # the model id that endpoint serves. Custom model ids (anything not listed
24
+ # under `models:`) are treated as fully-permissive in the admin form — the
25
+ # user can flip image/video/audio toggles, pick caching TTL, and set thinking
26
+ # effort or budget. The models census skips this provider; new GPT models are
27
+ # tracked through the aws-bedrock-* providers.
27
28
  #
28
- # Custom model ids (anything not listed under `models:`) are treated as
29
- # fully-permissive in the admin form — the user can flip image/video/
30
- # audio toggles, pick caching TTL, and set thinking effort or budget.
29
+ # The listed models (bar the legacy placeholder at the end) are callable out of
30
+ # the box with a Bedrock API key — the default endpoint is Mantle us-east-1:
31
+ # Amazon Bedrock's bedrock-mantle endpoint serves Chat Completions (Bearer
32
+ # auth — what OpenAIAgent sends; the runtime appends /chat/completions).
33
+ # The path prefix is per model: GPT-5.x lives under /openai/v1, gpt-oss under
34
+ # /v1; the wrong one 400s "model ... isn't supported on this route".
35
+ # Source: docs.aws.amazon.com/bedrock/latest/userguide/inference-chat-completions.html
36
+ # and each model card's Programmatic Access table.
37
+ #
38
+ # GPT on Mantle Chat Completions /openai/v1, in-Region (live GET /v1/models
39
+ # 2026-10-10, matches the models-region-compatibility.html bedrock-mantle
40
+ # column), probed through OpenAIAgent 2026-10-10:
41
+ #
42
+ # us-east-1 us-west-2 via OpenAIAgent
43
+ # gpt-6.1-sol ✓ - 400 (max_tokens)
44
+ # gpt-6-sol / luna ✓ - 400 (max_tokens)
45
+ # gpt-6-astra ✓ ✓ 400 (max_tokens)
46
+ # gpt-5.6-sol ✓ - 400 (max_tokens)
47
+ # gpt-5.6-terra/luna ✓ ✓ 400 (max_tokens)
48
+ # gpt-5.5 ✓ - OK
49
+ # gpt-5.4 ✓ ✓ OK
50
+ #
51
+ # GPT-6.x / 5.6 reject `max_tokens` ("Unsupported parameter ... not supported
52
+ # with this model"; they take max_completion_tokens), which OpenAIAgent always
53
+ # sends — use them through aws-bedrock-mantle / aws-bedrock-openai (Responses
54
+ # API) instead. Each model below carries its own `endpoints:`.
55
+ #
56
+ # Capability notes (Mantle Chat Completions):
57
+ # - promptCaching: automatic (cached_tokens come back, nothing to send, TTL
58
+ # undisclosed) — the single 5m preset is a form hint only.
59
+ # - thinking: reasoning_effort. The validation error lists none / minimal /
60
+ # low / medium / high / xhigh / max, but `max` 400s "not supported with
61
+ # this model" on both models, so the presets stop at xhigh. Reasoning
62
+ # tokens are counted (xhigh 1.4–2x low on the same prompt) but the reply
63
+ # carries no reasoning text, so no thinking is shown in the UI.
64
+ # - verbosity: not declared — OpenAIAgent doesn't send it.
31
65
  models:
66
+ # Live-probed 2026-10-10 through OpenAIAgent on us-east-1: tool call →
67
+ # result → reply OK; us-west-2 → 404 "does not exist". Red PNG → "Red".
68
+ # Model card: 1,050,000 context / 128,000 output (max_tokens 128001 is
69
+ # accepted too, so the cap is the card's figure, not a probe). Long-context
70
+ # rates apply to the whole request past 272K input — hence contextWindow
71
+ # 272000; maxContextWindow is the real limit.
72
+ - id: openai.gpt-5.5
73
+ displayName: GPT-5.5 (Bedrock Mantle)
74
+ endpoints:
75
+ - https://bedrock-mantle.us-east-1.api.aws/openai/v1
76
+ maxOutputTokens: 128000
77
+ contextWindow: 272000
78
+ maxContextWindow: 1050000
79
+ compressAt: 0.9
80
+ capabilities:
81
+ image: true
82
+ video: false
83
+ audio: false
84
+ promptCaching:
85
+ default: 5m
86
+ ttlPresets:
87
+ - { value: 5m, label: 5min }
88
+ thinking:
89
+ mode: adaptive
90
+ defaultEnabled: true
91
+ default: xhigh
92
+ effortPresets:
93
+ - { value: low, label: Low }
94
+ - { value: medium, label: Medium }
95
+ - { value: high, label: High }
96
+ - { value: xhigh, label: XHigh }
97
+
98
+ # Same surface as GPT-5.5 (probe and model card: 1,050,000 / 128,000), and
99
+ # the only GPT-5 that OpenAIAgent can drive on us-west-2 — tool round-trip
100
+ # OK on both regions 2026-10-10.
101
+ - id: openai.gpt-5.4
102
+ displayName: GPT-5.4 (Bedrock Mantle)
103
+ endpoints:
104
+ - https://bedrock-mantle.us-east-1.api.aws/openai/v1
105
+ - https://bedrock-mantle.us-west-2.api.aws/openai/v1
106
+ maxOutputTokens: 128000
107
+ contextWindow: 272000
108
+ maxContextWindow: 1050000
109
+ compressAt: 0.9
110
+ capabilities:
111
+ image: true
112
+ video: false
113
+ audio: false
114
+ promptCaching:
115
+ default: 5m
116
+ ttlPresets:
117
+ - { value: 5m, label: 5min }
118
+ thinking:
119
+ mode: adaptive
120
+ defaultEnabled: true
121
+ default: xhigh
122
+ effortPresets:
123
+ - { value: low, label: Low }
124
+ - { value: medium, label: Medium }
125
+ - { value: high, label: High }
126
+ - { value: xhigh, label: XHigh }
127
+
128
+ # Legacy placeholder (pre-1.6.1): the default model before the Bedrock Mantle
129
+ # entries above, kept so agents created on it still resolve their caps and
130
+ # context. Official API only.
32
131
  - id: gpt-4o
33
132
  displayName: GPT-4o (placeholder)
133
+ endpoints:
134
+ - https://api.openai.com/v1
34
135
  maxOutputTokens: 16384
35
136
  contextWindow: 128000
137
+ maxContextWindow: 128000
138
+ compressAt: 0.9
36
139
  capabilities:
37
140
  image: true
38
141
  video: true
39
142
  audio: true
40
143
  promptCaching:
41
- default: 5m
144
+ default: 1h
42
145
  ttlPresets:
43
146
  - { value: 5m, label: 5min }
44
147
  - { value: 1h, label: 1hour }
45
148
  thinking:
46
149
  mode: manual
47
150
  defaultEnabled: false
48
- default: medium
151
+ default: high
49
152
  defaultBudgetTokens: 8192
50
153
  effortPresets:
51
154
  - { value: low, label: Low }
@@ -1,12 +1,12 @@
1
1
  id: qwen
2
2
  runtime: qwen
3
- revision: 2026100501
3
+ revision: 2026101101
4
4
  displayName: Qwen (Aliyun)
5
5
  displayName_zh: 通义千问(阿里云)
6
6
  description: Qwen3 family on Aliyun Bailian via the Anthropic-compatible Messages API
7
7
  description_zh: 阿里云百炼通义千问,通过 Anthropic 兼容的 Messages API 调用
8
8
  defaultEndpoint: https://dashscope.aliyuncs.com/apps/anthropic
9
- defaultModelId: qwen3.7-max
9
+ defaultModelId: qwen3.8-max
10
10
  endpointPresets:
11
11
  - https://dashscope.aliyuncs.com/apps/anthropic # Beijing
12
12
  - https://dashscope-intl.aliyuncs.com/apps/anthropic # Singapore
@@ -32,15 +32,110 @@ secrets:
32
32
  # despite docs saying a vision-specific model is required);
33
33
  # qwen3.7-max returned `Unexpected item type in content` (not
34
34
  # supported). So image:false on max, image:true on plus.
35
- # - effort presets: pure Halo-side abstraction. Same effort→budget
36
- # table as bedrock-agent.ts via qwen-agent.ts's effortToBudget().
35
+ # - effort presets on the manual (3.7 / 3.6) models: pure Halo-side
36
+ # abstraction. Same effort→budget table as bedrock-agent.ts via
37
+ # qwen-agent.ts's effortToBudget().
37
38
  # - temperature range: doc says [0, 2) instead of Anthropic's [0, 1] —
38
39
  # doesn't affect Halo since we don't expose temperature in the form.
40
+ # 2026-10-10 census (help.aliyun.com/zh/model-studio/anthropic-api-messages +
41
+ # the text-generation model guide, both list 3.8-max / 3.8-flash / 3.7-plus as
42
+ # current, 1M context): live-probed on the Anthropic endpoint — manual
43
+ # thinking.budget_tokens still accepted (the doc marks it "即将废弃" in favour
44
+ # of output_config.effort — see 2026-10-11 below), thinking
45
+ # disabled honored, tool_use OK, image OK, cache_control ephemeral hit on
46
+ # turn 2. `ttl: '1h'` is accepted but the entry is still written as
47
+ # ephemeral_5m, so 5m stays the only TTL preset. Max output isn't published
48
+ # per model on these pages — maxOutputTokens stays 16384. 3.7-max / 3.6-plus
49
+ # are not on the deprecation page, kept below the new generation.
50
+ # 2026-10-11 (help.aliyun.com/zh/model-studio/anthropic-api-messages,
51
+ # `output_config.effort`): the doc lists effort values for qwen3.8-max /
52
+ # qwen3.8-flash only — xhigh (default) / medium / low, with max and high
53
+ # folded onto xhigh by the API. So 3.8 is `mode: adaptive`: qwen-agent sends
54
+ # thinking:{type:'enabled'} + output_config.effort. An agent.yaml that already
55
+ # carries an explicit budget_tokens keeps sending it (still accepted). For 3.8
56
+ # the same doc says max_tokens caps reply + thinking together. The 3.7 / 3.6
57
+ # models have no documented effort values → they stay `mode: manual`
58
+ # (budget_tokens). Thinking-field omitted = thinking on for every model here,
59
+ # so off is always sent as type:'disabled'.
39
60
  models:
61
+ - id: qwen3.8-max
62
+ displayName: Qwen3.8 Max
63
+ maxOutputTokens: 16384
64
+ contextWindow: 272000
65
+ maxContextWindow: 1000000
66
+ compressAt: 0.9
67
+ capabilities:
68
+ # Live probe 2026-10-10: named a red 64×64 PNG correctly (3.7-max could not).
69
+ image: true
70
+ video: false
71
+ audio: false
72
+ promptCaching:
73
+ default: 5m
74
+ ttlPresets:
75
+ - { value: 5m, label: 5min }
76
+ thinking:
77
+ mode: adaptive
78
+ defaultEnabled: true
79
+ default: xhigh
80
+ effortPresets:
81
+ - { value: low, label: Low }
82
+ - { value: medium, label: Medium }
83
+ - { value: xhigh, label: XHigh }
84
+
85
+ - id: qwen3.7-plus
86
+ displayName: Qwen3.7 Plus
87
+ maxOutputTokens: 16384
88
+ contextWindow: 272000
89
+ maxContextWindow: 1000000
90
+ compressAt: 0.9
91
+ capabilities:
92
+ # Live probe 2026-10-10: named a red 64×64 PNG correctly.
93
+ image: true
94
+ video: false
95
+ audio: false
96
+ promptCaching:
97
+ default: 5m
98
+ ttlPresets:
99
+ - { value: 5m, label: 5min }
100
+ thinking:
101
+ mode: manual
102
+ defaultEnabled: true
103
+ default: high
104
+ defaultBudgetTokens: 8192
105
+ effortPresets:
106
+ - { value: medium, label: Medium }
107
+ - { value: high, label: High }
108
+
109
+ - id: qwen3.8-flash
110
+ displayName: Qwen3.8 Flash
111
+ maxOutputTokens: 16384
112
+ contextWindow: 272000
113
+ maxContextWindow: 1000000
114
+ compressAt: 0.9
115
+ capabilities:
116
+ # Live probe 2026-10-10: named a red 64×64 PNG correctly.
117
+ image: true
118
+ video: false
119
+ audio: false
120
+ promptCaching:
121
+ default: 5m
122
+ ttlPresets:
123
+ - { value: 5m, label: 5min }
124
+ thinking:
125
+ mode: adaptive
126
+ defaultEnabled: true
127
+ default: xhigh
128
+ effortPresets:
129
+ - { value: low, label: Low }
130
+ - { value: medium, label: Medium }
131
+ - { value: xhigh, label: XHigh }
132
+
40
133
  - id: qwen3.7-max
41
134
  displayName: Qwen3.7 Max
42
135
  maxOutputTokens: 16384
43
136
  contextWindow: 272000
137
+ maxContextWindow: 1000000
138
+ compressAt: 0.9
44
139
  capabilities:
45
140
  image: false
46
141
  video: false
@@ -54,7 +149,7 @@ models:
54
149
  # qwen-agent.ts maps effort labels via effortToBudget().
55
150
  mode: manual
56
151
  defaultEnabled: true
57
- default: medium
152
+ default: high
58
153
  defaultBudgetTokens: 8192
59
154
  effortPresets:
60
155
  - { value: medium, label: Medium }
@@ -64,6 +159,8 @@ models:
64
159
  displayName: Qwen3.6 Plus
65
160
  maxOutputTokens: 16384
66
161
  contextWindow: 272000
162
+ maxContextWindow: 1000000
163
+ compressAt: 0.9
67
164
  capabilities:
68
165
  image: true
69
166
  video: false
@@ -75,7 +172,7 @@ models:
75
172
  thinking:
76
173
  mode: manual
77
174
  defaultEnabled: true
78
- default: medium
175
+ default: high
79
176
  defaultBudgetTokens: 8192
80
177
  effortPresets:
81
178
  - { value: medium, label: Medium }
@@ -1,6 +1,6 @@
1
1
  id: zhipu
2
2
  runtime: zhipu
3
- revision: 2026100501
3
+ revision: 2026101002
4
4
  displayName: Zhipu AI (GLM)
5
5
  displayName_zh: 智谱 AI(GLM)
6
6
  description: Zhipu GLM-5.x family on open.bigmodel.cn, OpenAI-compatible chat completions
@@ -38,6 +38,8 @@ models:
38
38
  displayName: GLM-5.3
39
39
  maxOutputTokens: 131072
40
40
  contextWindow: 272000
41
+ maxContextWindow: 1000000
42
+ compressAt: 0.9
41
43
  capabilities:
42
44
  image: false
43
45
  video: false
@@ -59,6 +61,8 @@ models:
59
61
  displayName: GLM-5.3 Flash
60
62
  maxOutputTokens: 131072
61
63
  contextWindow: 272000
64
+ maxContextWindow: 1000000
65
+ compressAt: 0.9
62
66
  capabilities:
63
67
  image: true
64
68
  video: false
@@ -79,6 +83,8 @@ models:
79
83
  displayName: GLM-5.3 FlashX
80
84
  maxOutputTokens: 131072
81
85
  contextWindow: 272000
86
+ maxContextWindow: 1000000
87
+ compressAt: 0.9
82
88
  capabilities:
83
89
  image: true
84
90
  video: false
@@ -99,6 +105,8 @@ models:
99
105
  displayName: GLM-5.2
100
106
  maxOutputTokens: 131072
101
107
  contextWindow: 272000
108
+ maxContextWindow: 1000000
109
+ compressAt: 0.9
102
110
  capabilities:
103
111
  image: false
104
112
  video: false
@@ -25,7 +25,7 @@ CREATE TABLE IF NOT EXISTS agent_sessions (
25
25
  CREATE TABLE IF NOT EXISTS disabled_items (
26
26
  item_type TEXT NOT NULL CHECK(item_type IN ('agent', 'skill')),
27
27
  item_id TEXT NOT NULL,
28
- scope TEXT NOT NULL CHECK(scope IN ('global', 'workspace')),
28
+ scope TEXT NOT NULL CHECK(scope IN ('global', 'workspace', 'extension')),
29
29
  disabled_at INTEGER NOT NULL,
30
30
  PRIMARY KEY (item_type, item_id, scope)
31
31
  );
@@ -61,6 +61,8 @@ Sensible defaults if user didn't say:
61
61
  | label | summarize from prompt + schedule |
62
62
  | timeout | leave unset (3600s) — see `--timeout-sec` below |
63
63
  | session | leave unset (the job's own session) — see `--session` below |
64
+ | folder | leave unset (workspace root) — see `--dir` below |
65
+ | stateless | off (one session that accumulates) — see `--stateless` below |
64
66
  | prompt | pass the user's task as-is — the runner prepends an "unattended run, don't ask questions" notice to every fire, so don't add one yourself |
65
67
 
66
68
  ### 2. Translate the schedule
@@ -77,7 +79,8 @@ Sensible defaults if user didn't say:
77
79
 
78
80
  **One-shot (at-mode)** — pass `--run-at` instead of `--schedule`. The job
79
81
  fires once at that instant and auto-disables. Useful for "remind me at 3pm
80
- today" or "send the report next Monday morning".
82
+ today" or "send the report next Monday morning". On `update`, passing one
83
+ of the two switches the job's mode and clears the other; never pass both.
81
84
 
82
85
  | Spoken | Flag |
83
86
  |-----------------------------------|-------------------------------------------|
@@ -100,8 +103,8 @@ job accumulates its own session (same id as the job; older jobs keep the
100
103
  Pass `--session <rootSessionId>`
101
104
  only when the user wants the runs to continue a specific conversation (the
102
105
  agent then sees that session's history). Rules the user should hear once:
103
- - the session keeps **its own agent and access level** — `--agent` only
104
- applies if the session doesn't exist yet;
106
+ - the session keeps **its own agent and access level** — `--agent` must
107
+ match an existing session's agent (the helper refuses otherwise);
105
108
  - a fire is **skipped** while a turn is already running in that session;
106
109
  - if the user chats in that session while a run is in flight, one of the two
107
110
  turns may be missing from its history afterwards.
@@ -112,6 +115,29 @@ pass `--session ""` to go back to the job's own session (for an older job
112
115
  pinned to `cron-cron-…` that starts a fresh session — leave it alone unless
113
116
  the user asks).
114
117
 
118
+ **Agent of a stateful job** — once the job's session exists (after its
119
+ first run, or a picked existing session), the job's agent is fixed to that
120
+ session's: `update --agent` to a different one is refused with
121
+ `session <id> already runs agent <A>; …`. To change it, either delete that
122
+ session (admin → Sessions) or switch the job to `--stateless on`. Tell the
123
+ user which; don't pick for them.
124
+
125
+ **Stateless (`--stateless`, optional)** — a **new session every run**
126
+ (`cron-<id>-<suffix>`), so nothing carries over between runs. Use it for
127
+ tasks that don't need memory ("每天抓一次行情发给我", a fixed report).
128
+ Excludes `--session`. On `update`: `--stateless on` / `--stateless off`
129
+ (clear `--session ""` first if one is set). Old per-run sessions are kept and
130
+ stay reviewable in the Sessions tab. `get` / `list` show
131
+ `effective_session_id: null` for a stateless job.
132
+
133
+ **Folder (`--dir`, optional)** — the run focuses on a workspace sub-folder:
134
+ its `.halo/INSTRUCTIONS.md` chain joins the prompt and the prompt names the
135
+ working directory (file / shell paths still start at the workspace root).
136
+ Relative to the workspace or absolute; must be an existing directory inside
137
+ it. Applies on every run, including runs that resume the job's session. On
138
+ `update`, `--dir ""` goes back to the workspace root. A folder deleted later
139
+ makes each run fail with `folder not found: …`.
140
+
115
141
  **Active window (`--active-from` / `--active-until`, optional, recurring
116
142
  jobs only)** — the schedule fires only inside `[from, until)`; fires outside
117
143
  it are skipped silently (no run recorded). "Run now" ignores the window.
@@ -220,6 +246,17 @@ shell_exec: python3 ~/.halo/global/skills/cron/manage-cron.py update <id> \
220
246
  --schedule "0 10 * * 1"
221
247
  ```
222
248
 
249
+ **Stateless job focused on a sub-folder:**
250
+ ```bash
251
+ shell_exec: python3 ~/.halo/global/skills/cron/manage-cron.py create \
252
+ --label "Daily market snapshot" \
253
+ --workspace /home/ubuntu/sa-agent \
254
+ --dir reports/market \
255
+ --stateless \
256
+ --prompt "Fetch today's index closes and write the summary." \
257
+ --schedule "0 16 * * 1-5"
258
+ ```
259
+
223
260
  **Pause / unpause (no end date in mind):**
224
261
  ```bash
225
262
  shell_exec: python3 ~/.halo/global/skills/cron/manage-cron.py disable <id>