@turmind/halo 0.2.5 → 1.0.0

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 (44) hide show
  1. package/README.md +5 -5
  2. package/admin-out/404.html +1 -1
  3. package/admin-out/_next/static/chunks/212-e217e00ce6cc2bdc.js +1 -0
  4. package/admin-out/_next/static/chunks/397-fc5a406d80d46ca7.js +1 -0
  5. package/admin-out/_next/static/chunks/app/page-635d9668d47a2b9e.js +1 -0
  6. package/admin-out/_next/static/css/57622245d7724ee0.css +3 -0
  7. package/admin-out/index.html +1 -1
  8. package/admin-out/index.txt +5 -5
  9. package/bundled-docs/design/agent.md +12 -2
  10. package/bundled-docs/design/cron.md +16 -3
  11. package/bundled-docs/design/goal-mode.md +141 -0
  12. package/bundled-docs/design/session.md +25 -0
  13. package/bundled-docs/design/ws.md +34 -3
  14. package/bundled-docs/dev/add-model-provider.md +17 -9
  15. package/bundled-docs/dev/api.md +27 -1
  16. package/bundled-docs/dev/deploy.md +4 -8
  17. package/bundled-docs/dev/desktop-packaging.md +20 -0
  18. package/bundled-docs/dev/env.md +10 -5
  19. package/bundled-docs/dev/tools.md +60 -4
  20. package/bundled-docs/guide/cli.md +3 -2
  21. package/bundled-docs/requirements/chat.md +9 -0
  22. package/bundled-docs/requirements/command.md +12 -1
  23. package/dist/index.js +2371 -1254
  24. package/package.json +1 -1
  25. package/templates/agents/goal/AGENT.md +165 -0
  26. package/templates/agents/goal/agent.yaml +34 -0
  27. package/templates/models/anthropic.yaml +1 -0
  28. package/templates/models/aws-bedrock-claude-invoke.yaml +7 -0
  29. package/templates/models/aws-bedrock-mantle.yaml +51 -11
  30. package/templates/models/deepseek.yaml +2 -0
  31. package/templates/models/doubao.yaml +4 -0
  32. package/templates/models/hunyuan.yaml +1 -0
  33. package/templates/models/kimi.yaml +49 -13
  34. package/templates/models/mimo-token-plan-china.yaml +2 -0
  35. package/templates/models/minimax.yaml +37 -5
  36. package/templates/models/openai.yaml +1 -0
  37. package/templates/models/qwen.yaml +2 -0
  38. package/templates/schema.sql +3 -1
  39. package/admin-out/_next/static/chunks/212-170855bed19f67f3.js +0 -1
  40. package/admin-out/_next/static/chunks/307-d7a99f9a4a436ec3.js +0 -1
  41. package/admin-out/_next/static/chunks/app/page-96fce52cfe97cc9b.js +0 -1
  42. package/admin-out/_next/static/css/6f53bae6f1952300.css +0 -3
  43. /package/admin-out/_next/static/{P60h_WmaPcXYhIabUg6I2 → gzvax-Lg7K157j0rQJHje}/_buildManifest.js +0 -0
  44. /package/admin-out/_next/static/{P60h_WmaPcXYhIabUg6I2 → gzvax-Lg7K157j0rQJHje}/_ssgManifest.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@turmind/halo",
3
- "version": "0.2.5",
3
+ "version": "1.0.0",
4
4
  "description": "Halo — multi-agent collaborative workspace. CLI + TUI + HTTP/WS server in one package.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -0,0 +1,165 @@
1
+ # Goal (`goal`)
2
+
3
+ You are the judge + dispatcher of a goal loop. `/goal create` bound you
4
+ to one **worker session** (W). You never do the work yourself — you
5
+ define the contract, dispatch work orders to W, verify its round
6
+ reports with evidence you reproduce yourself, and decide what happens
7
+ next. The platform (not you) counts rounds, enforces caps, and revokes
8
+ your dispatch edge when a guardrail trips.
9
+
10
+ **Always start by calling `goal_context`** — at the beginning of every
11
+ conversation and after any `[goal-mode]` platform nudge. It tells you
12
+ the binding (worker id, goal dir, spec path, caps, status, counters);
13
+ during intake it also embeds `workerRecent` — the worker's recent
14
+ dialogue — for scene seeding.
15
+
16
+ ## Your tools
17
+
18
+ - `goal_context` — read the binding + counters. Call first, always.
19
+ - `goal_attach` — the hinge from intake to loop. Once, after the user
20
+ confirms the contract and you've written GOAL_SPEC.md.
21
+ - `goal_decide` — record a delegated decision BEFORE relaying it.
22
+ Capped at 5 per goal; at the cap, park the question to the user.
23
+ - `goal_finish` — final acceptance. Only when your own evidence shows
24
+ every criterion passing.
25
+ - `query_session` — send a work order (or relayed answer / steering
26
+ update) to W. Only W is reachable. Revoked in code on halt/pause.
27
+ - `get_session_output` — full latest-turn output of W or any session in
28
+ its subtree (round reports are truncated; pull the rest here).
29
+ - File/shell tools — for intake seeding, spec writing, and **evidence
30
+ reproduction** (verification commands only; every command you run
31
+ must be listed in your verdict).
32
+
33
+ ## Phase 1 — Intake
34
+
35
+ `/goal create` starts a conversation with the user. Your job here:
36
+
37
+ 1. Read `workerRecent` from `goal_context` for scene — the worker's
38
+ last user/assistant exchanges (`workerMessageCount` tells you how
39
+ much history exists beyond it). What has the user been doing? Don't
40
+ make them re-explain. Never parse session JSON files yourself.
41
+ 2. Converse until the goal is a **contract**: outcome, acceptance
42
+ criteria (each one mechanically checkable — a command + expected
43
+ result, a file that must exist, a metric threshold), explicit
44
+ non-goals, and any decision policy ("what may you decide for me?").
45
+ 3. Write `GOAL_SPEC.md` to the goal dir (path from `goal_context`).
46
+ Structure: `## Outcome`, `## Acceptance criteria` (numbered,
47
+ checkable), `## Non-goals`, `## Decision policy`.
48
+ 4. Ask the user to confirm. In that same confirmation message, state
49
+ the current default caps as a standing step (not only if asked):
50
+ read them from `goal_context`'s `caps` and say e.g. "Default caps:
51
+ N rounds / X hours / no token budget — want to adjust any before we
52
+ start?" so the user can pin overrides now instead of discovering a
53
+ limit mid-run. On an explicit go-ahead ("OK, go", "开始"), call
54
+ `goal_attach` with the round-1 kickoff work order. Never attach
55
+ without confirmation; never attach twice.
56
+
57
+ Cap overrides (rounds / hours / token budget) pinned during intake go
58
+ in `goal_attach`'s `caps` argument. Omitted fields keep the defaults
59
+ you reported from `goal_context`.
60
+
61
+ ## Phase 2 — The loop
62
+
63
+ Round reports arrive as messages headed
64
+ `[Goal round N/cap · elapsed … · no-progress k/3]`. For each:
65
+
66
+ **Judge — evidence, not testimony.** The report has dual evidentiary
67
+ status:
68
+
69
+ - For "**is the task done**": the report is a **claim list**. Accept no
70
+ claim without evidence you reproduced yourself — command + exit code,
71
+ file content, diff. "The worker said tests pass" is not evidence;
72
+ `pnpm test → exit 0` that YOU ran is. Run verification commands only;
73
+ list every command in the verdict.
74
+ - For "**is the worker malfunctioning**": the report **is** first-hand
75
+ evidence — an `Error:`-shaped report, malformed output, or an empty
76
+ round is a symptom to diagnose, not a claim to verify.
77
+
78
+ **Verdict shape** — write this as your working notes each round:
79
+
80
+ ```markdown
81
+ ---
82
+ pass: false
83
+ worker_fault: config # absent | transient | config
84
+ ---
85
+ ## Evidence
86
+ - ran `pnpm --filter @turmind/halo-core coverage` → exit 1 (74.2% < 80%)
87
+ - report claimed "added git-manager tests" — verified: diff shows
88
+ git-manager.test.ts +190 lines. True.
89
+ ## Missing
90
+ - git-manager.ts 41% → 80%: uncovered = push-failure branch (L210-247)
91
+ - workspace.ts 68% → 80%: resolveWorkspace symlink branch untested
92
+ ```
93
+
94
+ - **Missing is a work order, not a review.** Every item must be
95
+ actionable enough to paste into the next dispatch. "Overall quality
96
+ needs improvement" is banned.
97
+ - **`worker_fault` triage**: `transient` (one-off glitch — re-kick with
98
+ the same order) vs `config` (invalid API key, persistently malformed
99
+ tool use — do NOT burn rounds re-kicking; park with a diagnosis to
100
+ the user).
101
+
102
+ **Dispatch.** Not done → `query_session` to W with the Missing list as
103
+ the next work order. Include in every work order: "if you hit a genuine
104
+ fork you cannot resolve from the spec, stop and end your reply with
105
+ `<NEED_INPUT>` followed by the question." Done → verify every
106
+ acceptance criterion once more, `goal_finish`, then write the final
107
+ report (see below).
108
+
109
+ **Semantic no-progress.** The code breaker only catches byte-identical
110
+ reports. If the Missing list hasn't materially changed for 2 rounds, or
111
+ the diff is empty while the worker claims progress, change strategy:
112
+ decompose differently, narrow the order to one criterion, or park to
113
+ the user with your diagnosis. Don't re-send the same order a third time.
114
+
115
+ ## Question-stops (`<NEED_INPUT>`)
116
+
117
+ A report containing `<NEED_INPUT>` arrives with a question-stop header
118
+ (round counter unchanged). Triage:
119
+
120
+ - **Answerable from GOAL_SPEC + scene** → answer it yourself: call
121
+ `goal_decide` (records `decision-<n>.md`, counts against the cap of
122
+ 5), then relay the answer to W via `query_session`.
123
+ - **A genuine user-sovereignty fork** (spend money, delete data,
124
+ contradicts the spec, taste calls the spec doesn't settle) → park:
125
+ write the question as your reply — it reaches the user through the
126
+ chat surface. When their answer arrives as a normal message, fold it
127
+ into GOAL_SPEC.md (append, don't rewrite history) and resume via
128
+ `query_session`.
129
+
130
+ **Missed-marker backstop**: a round report that ends in an unanswered
131
+ question is a question-stop even without the marker. Treat it as one.
132
+
133
+ ## Steering, pause, restart
134
+
135
+ - **User messages mid-run are steering.** Fold durable changes into
136
+ GOAL_SPEC.md (append a `## Steering` entry) and relay via the next
137
+ work order. Never let steering bypass the spec — the spec is the
138
+ contract, and the platform hashes it (your appends via goal_attach's
139
+ protocol are fine; the hash is stamped at attach and verified against
140
+ tampering by OTHERS — you must not edit the spec after attach, use
141
+ decision files and work orders instead).
142
+ - **Paused** (`/goal pause`): you're stopped too. On `/goal resume` you
143
+ get a nudge — re-read the spec and your transcript (the user may have
144
+ changed things manually), then re-dispatch.
145
+ - **Server restart**: same nudge protocol. Counters survived in the db;
146
+ the in-flight round did not. Re-dispatch the current work order.
147
+
148
+ ## Halt
149
+
150
+ A `[Goal HALTED: …]` header means a guardrail tripped in code and your
151
+ dispatch edge is **revoked** — `query_session` will be rejected. Do not
152
+ fight it. Write the halt diagnosis as your reply: which cap tripped,
153
+ the last Missing list, what you'd try next, and how to restart cleanly
154
+ (`/goal clear` then a fresh `/goal create`, or `/goal resume` where
155
+ applicable).
156
+
157
+ ## Final report
158
+
159
+ After `goal_finish`, your reply is the user's receipt. It MUST contain:
160
+
161
+ 1. Outcome vs. the acceptance criteria — each criterion with the
162
+ evidence command + result you verified it by.
163
+ 2. **Every delegated decision** ("I made these N calls for you"), from
164
+ your `decision-<n>.md` files.
165
+ 3. Rounds used / elapsed, and anything left deliberately out of scope.
@@ -0,0 +1,34 @@
1
+ name: Goal
2
+ description: Goal-mode judge + dispatcher. Runs the intake conversation, writes GOAL_SPEC.md, then drives the bound worker session round by round until the acceptance criteria pass. Hidden from rosters; created only by /goal create.
3
+ internal: true
4
+ priority: -1
5
+ model:
6
+ provider: aws-bedrock-claude-invoke
7
+ id: global.anthropic.claude-opus-4-8
8
+ endpoint: https://bedrock-runtime.us-east-1.amazonaws.com
9
+ promptCaching: 5m
10
+ thinking:
11
+ enabled: true
12
+ effort: xhigh
13
+ system_prompt: >
14
+ You are Halo's goal-mode judge and dispatcher. A user bound you to a worker
15
+ session via /goal. You run the intake conversation, write GOAL_SPEC.md,
16
+ attach with goal_attach, then judge every round report with evidence you
17
+ reproduce yourself and dispatch the next work order via query_session. The
18
+ platform enforces round caps, wall time, and no-progress in code at the
19
+ delivery point — your job is verdict quality. See AGENT.md for the full
20
+ discipline.
21
+ context:
22
+ maxTokens: 200000
23
+ compressAt: 0.8
24
+ tools:
25
+ - file_read
26
+ - view_image
27
+ - file_write
28
+ - file_edit
29
+ - file_list
30
+ - shell_exec
31
+ - grep
32
+ - glob
33
+ - web_fetch
34
+ skills: []
@@ -27,6 +27,7 @@ models:
27
27
  - id: claude-sonnet-4-6
28
28
  displayName: Claude Sonnet 4.6 (placeholder)
29
29
  maxOutputTokens: 64000
30
+ contextWindow: 1000000
30
31
  capabilities:
31
32
  image: true
32
33
  video: false
@@ -38,6 +38,7 @@ models:
38
38
  - id: global.anthropic.claude-fable-5
39
39
  displayName: Claude Fable 5
40
40
  maxOutputTokens: 128000
41
+ contextWindow: 1000000
41
42
  capabilities:
42
43
  image: true
43
44
  video: false
@@ -65,6 +66,7 @@ models:
65
66
  - id: global.anthropic.claude-sonnet-4-6
66
67
  displayName: Claude Sonnet 4.6
67
68
  maxOutputTokens: 64000
69
+ contextWindow: 1000000
68
70
  capabilities:
69
71
  image: true
70
72
  video: false
@@ -91,6 +93,7 @@ models:
91
93
  - id: global.anthropic.claude-sonnet-5
92
94
  displayName: Claude Sonnet 5
93
95
  maxOutputTokens: 64000
96
+ contextWindow: 1000000
94
97
  capabilities:
95
98
  image: true
96
99
  video: false
@@ -117,6 +120,7 @@ models:
117
120
  - id: global.anthropic.claude-opus-4-6-v1
118
121
  displayName: Claude Opus 4.6
119
122
  maxOutputTokens: 128000
123
+ contextWindow: 1000000
120
124
  capabilities:
121
125
  image: true
122
126
  video: false
@@ -139,6 +143,7 @@ models:
139
143
  - id: global.anthropic.claude-opus-4-7
140
144
  displayName: Claude Opus 4.7
141
145
  maxOutputTokens: 128000
146
+ contextWindow: 1000000
142
147
  capabilities:
143
148
  image: true
144
149
  video: false
@@ -162,6 +167,7 @@ models:
162
167
  - id: global.anthropic.claude-opus-4-8
163
168
  displayName: Claude Opus 4.8
164
169
  maxOutputTokens: 128000
170
+ contextWindow: 1000000
165
171
  capabilities:
166
172
  image: true
167
173
  video: false
@@ -187,6 +193,7 @@ models:
187
193
  - id: global.anthropic.claude-haiku-4-5-20251001-v1:0
188
194
  displayName: Claude Haiku 4.5
189
195
  maxOutputTokens: 64000
196
+ contextWindow: 200000
190
197
  capabilities:
191
198
  image: true
192
199
  video: false
@@ -1,16 +1,17 @@
1
1
  id: aws-bedrock-mantle
2
2
  displayName: AWS Bedrock Mantle (OpenAI GPT-5.x)
3
3
  displayName_zh: AWS Bedrock Mantle(OpenAI GPT-5.x)
4
- description: OpenAI GPT-5.5 / 5.4 on Amazon Bedrock via the bedrock-mantle endpoint (OpenAI Responses API only — not Converse/InvokeModel). us-east-2 only.
5
- description_zh: 通过 Bedrock Mantle 端点调用 OpenAI GPT-5.5 / 5.4(仅 OpenAI Responses API,不支持 Converse/InvokeModel)。仅 us-east-2。
4
+ description: OpenAI GPT-5.6 (Sol / Terra / Luna) on Amazon Bedrock via the bedrock-mantle endpoint (OpenAI Responses API only — not Converse/InvokeModel).
5
+ description_zh: 通过 Bedrock Mantle 端点调用 OpenAI GPT-5.6(Sol / Terra / Luna)(仅 OpenAI Responses API,不支持 Converse/InvokeModel)。
6
6
  # Mantle is a distinct endpoint from bedrock-runtime; the OpenAI surface lives
7
- # under /openai/v1. GPT-5.5 is us-east-2 only (GPT-5.4 also allows us-west-2,
8
- # but we ship the us-east-2 endpoint that serves both).
7
+ # under /openai/v1. Regions: us-east-2 serves ALL models below; us-west-2
8
+ # additionally serves Terra / Luna but NOT Sol. We ship the us-east-2
9
+ # endpoint that covers everything.
9
10
  defaultEndpoint: https://bedrock-mantle.us-east-2.api.aws/openai/v1
10
11
  endpointPresets:
11
12
  - https://bedrock-mantle.us-east-2.api.aws/openai/v1
12
13
 
13
- defaultModelId: openai.gpt-5.5
14
+ defaultModelId: openai.gpt-5.6-sol
14
15
 
15
16
  # Auth: a Bedrock long-term API key passed as a Bearer token. Generate at
16
17
  # console → Bedrock → API keys → long-term. The default placeholder reads the
@@ -30,11 +31,19 @@ secrets:
30
31
  # is sent and there's no 1h option — single 5m preset reflects reality, the
31
32
  # runtime never writes cache control, it only reads cached_tokens back.
32
33
  # - thinking: adaptive via reasoning.effort = low|medium|high (no budget_tokens
33
- # mode; xhigh/max would be mapped down to high by the runtime).
34
+ # mode; xhigh/max would be mapped down to high by the runtime). Note: Mantle
35
+ # never surfaces reasoning summaries — output[].reasoning.summary stays empty
36
+ # even with reasoning.summary=detailed (verified against the live endpoint;
37
+ # reasoning_tokens > 0 proves thinking runs). So no thinking text is shown in
38
+ # the UI; that's upstream behavior, not a parsing gap.
39
+ # - maxOutputTokens for the 5.6 variants: not disclosed in the 5.6 model card —
40
+ # conservatively carried over from GPT-5.5's 64000.
34
41
  models:
35
- - id: openai.gpt-5.5
36
- displayName: GPT-5.5
42
+ # GPT-5.6 flagship.
43
+ - id: openai.gpt-5.6-sol
44
+ displayName: GPT-5.6 Sol
37
45
  maxOutputTokens: 64000
46
+ contextWindow: 272000
38
47
  capabilities:
39
48
  image: true
40
49
  video: false
@@ -61,9 +70,11 @@ models:
61
70
  - { value: medium, label: Medium }
62
71
  - { value: high, label: High }
63
72
 
64
- - id: openai.gpt-5.4
65
- displayName: GPT-5.4
73
+ # GPT-5.6 balanced — official line: GPT-5.5-level performance at half the price.
74
+ - id: openai.gpt-5.6-terra
75
+ displayName: GPT-5.6 Terra
66
76
  maxOutputTokens: 64000
77
+ contextWindow: 272000
67
78
  capabilities:
68
79
  image: true
69
80
  video: false
@@ -80,7 +91,36 @@ models:
80
91
  - { value: low, label: Low }
81
92
  - { value: medium, label: Medium }
82
93
  - { value: high, label: High }
83
- # See GPT-5.5 above — final-answer length, default low, per-agent overridable.
94
+ # See GPT-5.6 Sol above — final-answer length, default low, per-agent overridable.
95
+ verbosity:
96
+ default: low
97
+ presets:
98
+ - { value: low, label: Low }
99
+ - { value: medium, label: Medium }
100
+ - { value: high, label: High }
101
+
102
+ # GPT-5.6 fast / low-cost.
103
+ - id: openai.gpt-5.6-luna
104
+ displayName: GPT-5.6 Luna
105
+ maxOutputTokens: 64000
106
+ contextWindow: 272000
107
+ capabilities:
108
+ image: true
109
+ video: false
110
+ audio: false
111
+ promptCaching:
112
+ default: 5m
113
+ ttlPresets:
114
+ - { value: 5m, label: 5min }
115
+ thinking:
116
+ mode: adaptive
117
+ defaultEnabled: true
118
+ default: medium
119
+ effortPresets:
120
+ - { value: low, label: Low }
121
+ - { value: medium, label: Medium }
122
+ - { value: high, label: High }
123
+ # See GPT-5.6 Sol above — final-answer length, default low, per-agent overridable.
84
124
  verbosity:
85
125
  default: low
86
126
  presets:
@@ -22,6 +22,7 @@ models:
22
22
  - id: deepseek-v4-pro
23
23
  displayName: DeepSeek V4 Pro
24
24
  maxOutputTokens: 65536
25
+ contextWindow: 1000000
25
26
  capabilities:
26
27
  image: false
27
28
  video: false
@@ -43,6 +44,7 @@ models:
43
44
  - id: deepseek-v4-flash
44
45
  displayName: DeepSeek V4 Flash
45
46
  maxOutputTokens: 65536
47
+ contextWindow: 1000000
46
48
  capabilities:
47
49
  image: false
48
50
  video: false
@@ -40,6 +40,7 @@ models:
40
40
  - id: doubao-seed-2-0-pro-260215
41
41
  displayName: Doubao Seed 2.0 Pro
42
42
  maxOutputTokens: 16384
43
+ contextWindow: 256000
43
44
  capabilities:
44
45
  image: false
45
46
  video: false
@@ -67,6 +68,7 @@ models:
67
68
  - id: doubao-seed-2-0-lite-260428
68
69
  displayName: Doubao Seed 2.0 Lite
69
70
  maxOutputTokens: 16384
71
+ contextWindow: 256000
70
72
  capabilities:
71
73
  image: false
72
74
  video: false
@@ -91,6 +93,7 @@ models:
91
93
  - id: doubao-seed-2-0-mini-260428
92
94
  displayName: Doubao Seed 2.0 Mini
93
95
  maxOutputTokens: 16384
96
+ contextWindow: 256000
94
97
  capabilities:
95
98
  image: false
96
99
  video: false
@@ -115,6 +118,7 @@ models:
115
118
  - id: doubao-seed-2-0-code-preview-260215
116
119
  displayName: Doubao Seed 2.0 Code Preview
117
120
  maxOutputTokens: 16384
121
+ contextWindow: 256000
118
122
  capabilities:
119
123
  image: false
120
124
  video: false
@@ -33,6 +33,7 @@ models:
33
33
  - id: hy3-preview
34
34
  displayName: Hunyuan Hy3 Preview
35
35
  maxOutputTokens: 16384
36
+ contextWindow: 256000
36
37
  capabilities:
37
38
  image: false
38
39
  video: false
@@ -1,8 +1,8 @@
1
1
  id: kimi
2
2
  displayName: Kimi (Moonshot AI)
3
3
  displayName_zh: Kimi(月之暗面)
4
- description: Kimi K2.6 via OpenAI-compatible chat completions API
5
- description_zh: Kimi K2.6,通过 OpenAI 兼容的 chat completions API 调用
4
+ description: Kimi K3 / K2.6 via OpenAI-compatible chat completions API
5
+ description_zh: Kimi K3 / K2.6,通过 OpenAI 兼容的 chat completions API 调用
6
6
  defaultEndpoint: https://api.moonshot.cn/v1
7
7
 
8
8
  secrets:
@@ -12,18 +12,53 @@ secrets:
12
12
  default: <<KIMI_API_KEY>>
13
13
  secret: true
14
14
 
15
- # Capabilities verified 2026-05-27 via live probes. Kimi-k2.6 returns
16
- # "prepare image failed" on image_url blocks despite past docs claiming
17
- # vision — set image:false until/unless a vision-specific model id is
18
- # tested here. reasoning_effort accepts { minimal, low, medium, high };
19
- # `max` errors with explicit message listing the four valid values.
20
- # Caching is automatic; cached_tokens shows up reliably from turn 2 once
21
- # the prompt is long enough (~2K+).
15
+ # Capability notes (per-model specifics live on each entry):
16
+ # - Caching is automatic on both models; cached_tokens shows up reliably
17
+ # from turn 2 once the prompt is long enough (~2K+).
18
+ # - Thinking control is TWO separate mechanisms depending on generation:
19
+ # K3 uses the top-level `reasoning_effort` field (enum currently only
20
+ # "max" per the official OpenAPI schema); K2.x uses the
21
+ # `thinking:{type:'enabled'|'disabled'}` toggle and has NO
22
+ # reasoning_effort field at all (OpenAPI marks it unsupported for
23
+ # k2.6). An earlier comment here claiming K2.6 accepts
24
+ # reasoning_effort { minimal, low, medium, high } was wrong.
22
25
  models:
26
+ - id: kimi-k3
27
+ displayName: Kimi K3
28
+ # Official default output cap; the model can go up to 1M but we don't max out.
29
+ maxOutputTokens: 131072
30
+ contextWindow: 1048576
31
+ capabilities:
32
+ # K3 itself also supports video input, but Halo has no video upload
33
+ # path yet — keep video:false until one exists. Image input is
34
+ # base64-only (public URLs are not supported); kimi-agent happens to
35
+ # send only base64 data URLs, so it's naturally compatible.
36
+ image: true
37
+ video: false
38
+ audio: false
39
+ promptCaching:
40
+ # Automatic caching, hint-only (prompt_cache_key) — same as K2.6.
41
+ default: 5m
42
+ ttlPresets:
43
+ - { value: 5m, label: 5min }
44
+ thinking:
45
+ # K3 thinking is ALWAYS ON server-side — there is no off switch.
46
+ # The only knob is the top-level `reasoning_effort` field, whose
47
+ # enum currently contains just "max" (confirmed in the official
48
+ # OpenAPI schema). Do NOT send the K2.x `thinking` parameter to K3.
49
+ defaultEnabled: true
50
+ default: max
51
+ effortPresets:
52
+ - { value: max, label: Max }
53
+
23
54
  - id: kimi-k2.6
24
55
  displayName: Kimi K2.6
25
56
  maxOutputTokens: 32768
57
+ contextWindow: 262144
26
58
  capabilities:
59
+ # Verified 2026-05-27 via live probes: kimi-k2.6 returns "prepare
60
+ # image failed" on image_url blocks despite past docs claiming
61
+ # vision — keep image:false.
27
62
  image: false
28
63
  video: false
29
64
  audio: false
@@ -32,10 +67,11 @@ models:
32
67
  ttlPresets:
33
68
  - { value: 5m, label: 5min }
34
69
  thinking:
70
+ # K2.6 has NO reasoning_effort field — its only reasoning control is
71
+ # the top-level `thinking:{type:'enabled'|'disabled'}` on/off toggle.
72
+ # The effort label below is Halo-side only (doubao precedent):
73
+ # kimi-agent just maps enabled → omit / disabled → thinking:disabled.
35
74
  defaultEnabled: true
36
75
  default: medium
37
76
  effortPresets:
38
- - { value: minimal, label: Minimal }
39
- - { value: low, label: Low }
40
- - { value: medium, label: Medium }
41
- - { value: high, label: High }
77
+ - { value: medium, label: On }
@@ -19,6 +19,7 @@ models:
19
19
  - id: mimo-v2.5-pro
20
20
  displayName: MiMo v2.5 Pro
21
21
  maxOutputTokens: 131072
22
+ contextWindow: 1048576
22
23
  capabilities:
23
24
  image: false
24
25
  video: false
@@ -41,6 +42,7 @@ models:
41
42
  - id: mimo-v2.5
42
43
  displayName: MiMo v2.5
43
44
  maxOutputTokens: 131072
45
+ contextWindow: 1048576
44
46
  capabilities:
45
47
  image: true
46
48
  video: false
@@ -1,10 +1,10 @@
1
1
  id: minimax
2
2
  displayName: MiniMax
3
3
  displayName_zh: MiniMax
4
- description: MiniMax M2.7 family via the Anthropic-compatible Messages API
5
- description_zh: MiniMax M2.7 系列,通过 Anthropic 兼容的 Messages API 调用
4
+ description: MiniMax M3 / M2.7 family via the Anthropic-compatible Messages API
5
+ description_zh: MiniMax M3 / M2.7 系列,通过 Anthropic 兼容的 Messages API 调用
6
6
  defaultEndpoint: https://api.minimaxi.com/anthropic
7
- defaultModelId: MiniMax-M2.7
7
+ defaultModelId: MiniMax-M3
8
8
 
9
9
  secrets:
10
10
  - key: api_key
@@ -16,11 +16,12 @@ secrets:
16
16
  # Capability notes for MiniMax M2.7 family — verified against
17
17
  # platform.minimaxi.com/docs/api-reference/text-anthropic-api on 2026-05-26
18
18
  # plus live probes against MiniMax-M2.7:
19
- # - image / video / audio: documented as not supported
19
+ # - image / video / audio: documented as not supported (M2.x; M3 differs —
20
+ # see its entry)
20
21
  # - thinking: forced on — `thinking:{type:'disabled'}` and omitting the
21
22
  # field both still produce thinking blocks; only budget_tokens influences
22
23
  # output. So we don't expose an off toggle.
23
- # - cache_control: both models support caching. Doc says TTL is 5min,
24
+ # - cache_control: both M2.7 models support caching. Doc says TTL is 5min,
24
25
  # refreshing automatically on each hit. cache_control:{type:'ephemeral'}
25
26
  # is the only shape — no longer-TTL knob exposed by MiniMax.
26
27
  # - MiniMax-M2.7-highspeed: turn 1 reports cache_creation_input_tokens=N,
@@ -35,9 +36,39 @@ secrets:
35
36
  # observed to truncate the run with stop=max_tokens before any thinking
36
37
  # completes — leaving it out of the preset list. medium/high are safe.
37
38
  models:
39
+ - id: MiniMax-M3
40
+ displayName: MiniMax M3
41
+ # Official recommended value; hard cap is 524288 but we don't max out.
42
+ maxOutputTokens: 131072
43
+ contextWindow: 1000000
44
+ capabilities:
45
+ # M3 also supports video input, but Halo has no video upload path yet —
46
+ # keep video:false until one exists. Image rides the Anthropic-compatible
47
+ # API's standard image blocks; minimax-agent passes this.messages
48
+ # straight through, so no agent code change is needed.
49
+ image: true
50
+ video: false
51
+ audio: false
52
+ # No promptCaching key on purpose: both official caching docs agree
53
+ # that explicit caching (cache_control) is only supported on the
54
+ # M2.7/M2.5/M2.1/M2 families — NOT M3. M3 only has passive automatic
55
+ # caching (no parameter; usage reports cache_read, which the agent
56
+ # already reads). Omitting the key keeps the UI toggle away so users
57
+ # can't configure the unsupported M3+cache_control combination.
58
+ thinking:
59
+ # M3 thinking is off by default; enabling sends
60
+ # thinking:{type:'adaptive'} — no low/medium/high grading and no
61
+ # budget_tokens. This is the opposite of M2.x's manual+budget scheme.
62
+ mode: adaptive
63
+ defaultEnabled: true
64
+ default: adaptive
65
+ effortPresets:
66
+ - { value: adaptive, label: Adaptive }
67
+
38
68
  - id: MiniMax-M2.7
39
69
  displayName: MiniMax M2.7
40
70
  maxOutputTokens: 16384
71
+ contextWindow: 204800
41
72
  capabilities:
42
73
  image: false
43
74
  video: false
@@ -62,6 +93,7 @@ models:
62
93
  - id: MiniMax-M2.7-highspeed
63
94
  displayName: MiniMax M2.7 Highspeed
64
95
  maxOutputTokens: 16384
96
+ contextWindow: 204800
65
97
  capabilities:
66
98
  image: false
67
99
  video: false
@@ -30,6 +30,7 @@ models:
30
30
  - id: gpt-4o
31
31
  displayName: GPT-4o (placeholder)
32
32
  maxOutputTokens: 16384
33
+ contextWindow: 128000
33
34
  capabilities:
34
35
  image: true
35
36
  video: true
@@ -38,6 +38,7 @@ models:
38
38
  - id: qwen3.7-max
39
39
  displayName: Qwen3.7 Max
40
40
  maxOutputTokens: 16384
41
+ contextWindow: 1000000
41
42
  capabilities:
42
43
  image: false
43
44
  video: false
@@ -60,6 +61,7 @@ models:
60
61
  - id: qwen3.6-plus
61
62
  displayName: Qwen3.6 Plus
62
63
  maxOutputTokens: 16384
64
+ contextWindow: 1000000
63
65
  capabilities:
64
66
  image: true
65
67
  video: false
@@ -18,7 +18,9 @@ CREATE TABLE IF NOT EXISTS agent_sessions (
18
18
  created_at INTEGER NOT NULL,
19
19
  updated_at INTEGER NOT NULL,
20
20
  stopped_at INTEGER,
21
- archived_at INTEGER
21
+ archived_at INTEGER,
22
+ goal TEXT,
23
+ goal_session_id TEXT
22
24
  );
23
25
 
24
26
  CREATE TABLE IF NOT EXISTS disabled_items (