min-agent 0.4.0 → 0.5.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.
- package/README.md +169 -284
- package/dist/agent.js +36 -22
- package/dist/cli/commands/chat.js +3 -0
- package/dist/cli/commands/exec.js +3 -0
- package/dist/cli/commands/index.js +22 -5
- package/dist/cli/commands/memory.js +33 -15
- package/dist/cli/commands/think.js +12 -0
- package/dist/cli/commands/write-config.js +22 -0
- package/dist/cli/option-helpers.js +13 -1
- package/dist/cli/program.js +50 -13
- package/dist/code-mode.js +1 -1
- package/dist/config.js +41 -0
- package/dist/context-window.js +8 -28
- package/dist/memory-cli.js +33 -0
- package/dist/memory.js +127 -46
- package/dist/model-catalog.js +285 -0
- package/dist/permission-cli.js +1 -4
- package/dist/provider.js +4 -1
- package/dist/reasoning-stream.js +158 -0
- package/dist/sandbox-cli.js +1 -4
- package/dist/scope.js +23 -0
- package/dist/serve/common.js +22 -1
- package/dist/serve/routes-chat.js +21 -1
- package/dist/serve/routes-memory.js +31 -2
- package/dist/serve/routes-meta.js +34 -6
- package/dist/think-cli.js +36 -0
- package/dist/thinking-wire.js +228 -0
- package/dist/thinking.js +142 -0
- package/dist/token-display.js +10 -7
- package/dist/tools/todo.js +22 -8
- package/dist/tui/App.js +36 -8
- package/dist/tui/InputBar.js +109 -36
- package/dist/tui/MessageList.js +53 -22
- package/dist/tui/StatusBar.js +7 -3
- package/dist/tui/ThinkPicker.js +77 -0
- package/dist/tui/bracketed-paste.js +37 -0
- package/dist/tui/caret-pos.js +10 -8
- package/dist/tui/index.js +7 -1
- package/dist/tui/layout.js +17 -0
- package/dist/tui/overlay-input.js +12 -0
- package/dist/tui/paste-draft.js +173 -0
- package/dist/tui/selection.js +8 -2
- package/dist/tui/slash-commands.js +18 -1
- package/dist/tui/slash-handler.js +61 -17
- package/dist/tui/text-width.js +6 -6
- package/dist/tui-chat.js +63 -7
- package/docs/API.md +50 -4
- package/docs/superpowers/plans/2026-08-23-input-paste-attachments.md +475 -0
- package/docs/superpowers/plans/2026-08-23-thinking-wire-profile.md +450 -0
- package/docs/superpowers/specs/2026-08-23-input-paste-attachments-design.md +174 -0
- package/docs/superpowers/specs/2026-08-23-thinking-wire-profile-design.md +140 -0
- package/package.json +1 -1
- package/skills/self-config/SKILL.md +5 -4
- package/skills/self-config/reference.md +10 -5
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# 思考线协议适配 — 设计文档
|
|
2
|
+
|
|
3
|
+
**日期:** 2026-08-23
|
|
4
|
+
**状态:** 已批准(启发式 + 400 改参重试并缓存)
|
|
5
|
+
|
|
6
|
+
## 问题
|
|
7
|
+
|
|
8
|
+
用户配置是统一的 `off | low | medium | high | max`,但上游 chat 请求的思考字段因模型和网关而异。min-agent 目前一律发送:
|
|
9
|
+
|
|
10
|
+
```json
|
|
11
|
+
{ "reasoning_effort": "<档位>", "thinking": { "type": "enabled" | "disabled" } }
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
MiniMax-M3(经 Console Go 等网关)只接受 `thinking.type` 为 `adaptive` 或 `disabled`,收到 `enabled` 会 400。官方 OpenAI 则可能根本不认 `thinking` 对象。
|
|
15
|
+
|
|
16
|
+
模型目录(`models.lonae.com`)只提供上下文窗口和 effort 列表,**不提供** `thinking.type` 的合法取值。MiniMax-M3 的 `reasoningOptions` 甚至是空数组,目录查找成功也无法避免这次 400。
|
|
17
|
+
|
|
18
|
+
## 目标
|
|
19
|
+
|
|
20
|
+
1. 用户侧配置、`/think`、CLI `--think`、HTTP `/v1/thinking` 仍只用五档英文强度,不暴露 `adaptive` / `enabled` / `xhigh`
|
|
21
|
+
2. 发出请求前按 `(providerHost, modelId)` 选择线协议:启发式先发对
|
|
22
|
+
3. 若仍 400 且错误可解析为思考字段约束,静默改 profile、**同一请求只重试一次**,并把学到的 profile 写入本地缓存
|
|
23
|
+
4. 目录继续只负责窗口和档位列表;线协议与目录解耦
|
|
24
|
+
|
|
25
|
+
## 不做
|
|
26
|
+
|
|
27
|
+
- 不扩展 Lonae catalog schema
|
|
28
|
+
- 不把 `adaptive` 放进 `/think` 选择器或配置值
|
|
29
|
+
- 不为 MiniMax-M3 把选择器收成「开/关」(非 `off` 一律当开思考;档位无深度时仍发对应 `reasoning_effort`,由上游忽略)
|
|
30
|
+
- 不重试非思考类 400,不二次以上重试
|
|
31
|
+
- 不把 wire profile 写入 `config.json`
|
|
32
|
+
- 不改变 compaction、reasoning 流式折叠、TUI 思考块展示
|
|
33
|
+
|
|
34
|
+
## 设计决策
|
|
35
|
+
|
|
36
|
+
| 决策 | 结论 |
|
|
37
|
+
|------|------|
|
|
38
|
+
| 用户配置 | 仍是 `off\|low\|medium\|high\|max`;`thinkingEnabled = thinking !== "off"` |
|
|
39
|
+
| 线协议层 | 独立 wire profile,不塞进 Lonae 缓存条目 |
|
|
40
|
+
| 解析顺序 | 学习缓存 → 启发式 → 默认 `enabled-disabled` + `reasoning_effort` |
|
|
41
|
+
| 注入点 | 现有 `modelFetch` / `withThinkingBody`,可读写 URL 与 JSON body |
|
|
42
|
+
| 400 | 仅当 body 可解析为思考字段约束时改 profile 并重试一次;对用户静默 |
|
|
43
|
+
| 缓存文件 | `~/.min-agent/thinking-wire-cache.json`(`MIN_AGENT_CONFIG_DIR` 下同路径),TTL 7 天 |
|
|
44
|
+
| OpenAI 官方 | `provider.type === "openai"` → 不发 `thinking` 对象 |
|
|
45
|
+
| MiniMax | `modelId` 或 hostname 含 `minimax`(大小写不敏感)→ `adaptive-disabled` |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 1. Wire profile
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
type ThinkingTypeMode = "enabled-disabled" | "adaptive-disabled" | "omit"
|
|
53
|
+
type EffortMode = "reasoning_effort" | "omit"
|
|
54
|
+
|
|
55
|
+
interface ThinkingWireProfile {
|
|
56
|
+
version: 1
|
|
57
|
+
thinkingType: ThinkingTypeMode
|
|
58
|
+
effort: EffortMode
|
|
59
|
+
timestamp: number
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`applyThinkingToChatBody(body, spec, profile)`:
|
|
64
|
+
|
|
65
|
+
- `effort === "reasoning_effort"`:写 `reasoning_effort`(现有 `toWireEffort` 结果);`omit` 则删除该键
|
|
66
|
+
- `thinkingType === "omit"`:删除 `thinking`
|
|
67
|
+
- 否则写 `thinking.type`:开思考时 `enabled` 或 `adaptive`,关思考时 `disabled`
|
|
68
|
+
|
|
69
|
+
`ThinkingRequestBody` 仍表示用户意图(`reasoningEffort` + `thinkingEnabled`),不把 profile 放进 ALS。fetch 时用请求 URL 的 host 和 body 里的 `model` 解析 profile。
|
|
70
|
+
|
|
71
|
+
缓存键:`${hostname.toLowerCase()}::${modelId.toLowerCase()}`。hostname 从请求 URL 取;取不到则只用 `modelId`。
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 2. 启发式
|
|
76
|
+
|
|
77
|
+
在学习缓存未命中时:
|
|
78
|
+
|
|
79
|
+
1. `modelId` 或 hostname 包含 `minimax` → `{ thinkingType: "adaptive-disabled", effort: "reasoning_effort" }`
|
|
80
|
+
2. 当前 provider `type === "openai"` → `{ thinkingType: "omit", effort: "reasoning_effort" }`
|
|
81
|
+
3. 否则 → `{ thinkingType: "enabled-disabled", effort: "reasoning_effort" }`
|
|
82
|
+
|
|
83
|
+
启发式结果不写磁盘。只有 400 学到的 profile 才持久化,以便覆盖错误启发式。
|
|
84
|
+
|
|
85
|
+
`toWireEffort` 规则不变:`off` → `none`;`max` 仍按目录/`openai` 映射 `xhigh`。
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 3. 400 探测
|
|
90
|
+
|
|
91
|
+
仅处理 chat completions 的 JSON body 请求。流程:
|
|
92
|
+
|
|
93
|
+
1. 按当前 profile 注入后 `fetch`
|
|
94
|
+
2. 若 `response.ok` 或状态不是 400:原样返回(仍走现有 `foldReasoningInChatResponse`)
|
|
95
|
+
3. 读 400 body(`text()`)。用纯函数 `parseThinkingWireHint(text)` 得到对 profile 的补丁
|
|
96
|
+
4. 补丁相对当前 profile **有变化** 才更新内存+磁盘,用新 profile 重写 body,**重试一次**
|
|
97
|
+
5. 第二次无论成败都不再为思考字段重试;失败则把第二次响应交给 SDK(若第二次未发出,把第一次 400 用已读文本重建 `Response`)
|
|
98
|
+
|
|
99
|
+
`parseThinkingWireHint` 识别:
|
|
100
|
+
|
|
101
|
+
| 错误文本形态 | 补丁 |
|
|
102
|
+
|--------------|------|
|
|
103
|
+
| `thinking.type` 且 `allowed` 列表含 `adaptive` 与 `disabled` | `thinkingType: "adaptive-disabled"` |
|
|
104
|
+
| `thinking.type` 且 `allowed` 含 `enabled` 与 `disabled` | `thinkingType: "enabled-disabled"` |
|
|
105
|
+
| `Unknown parameter` / `unknown parameter` 指向 `thinking` | `thinkingType: "omit"` |
|
|
106
|
+
| 同上指向 `reasoning_effort` | `effort: "omit"` |
|
|
107
|
+
|
|
108
|
+
列表解析忽略大小写与空白。无法识别或补丁无变化 → 不重试。
|
|
109
|
+
|
|
110
|
+
并发:两个请求可能同时 400 再各写一次缓存,可接受,不引入锁。内存 Map + 磁盘与 `model-catalog` 相同模式。TTL 7 天;过期条目当未命中,可再次学习。`version !== 1` 的条目忽略。
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 4. 错误与界面
|
|
115
|
+
|
|
116
|
+
重试对用户不可见:没有「改参」「adaptive」提示。两次都失败时沿用现有 `AI_APICallError` 展示。
|
|
117
|
+
|
|
118
|
+
`/think`、状态栏「思考 high」、HTTP `GET/POST /v1/thinking` 的字段与文案不变。
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 5. 文档与测试
|
|
123
|
+
|
|
124
|
+
同步:
|
|
125
|
+
|
|
126
|
+
- `skills/self-config/SKILL.md`:请求按模型/网关映射 `thinking` / `reasoning_effort`,并提及学习缓存文件;不写探测实现细节
|
|
127
|
+
- `skills/self-config/reference.md`:环境变量表旁可注明缓存文件名(若该文件已列目录缓存)
|
|
128
|
+
- `docs/API.md`:用户可见 thinking 枚举不变;不必描述 wire 字段
|
|
129
|
+
- `README.md`:不增加线协议说明
|
|
130
|
+
- `/help`:不改
|
|
131
|
+
|
|
132
|
+
测试(纯函数 + fetch 包装):
|
|
133
|
+
|
|
134
|
+
- `applyThinkingToChatBody` 三种 `thinkingType` × 开/关、`effort` omit
|
|
135
|
+
- 启发式:minimax 模型名、minimax host、openai type、默认
|
|
136
|
+
- `parseThinkingWireHint`:本次 MiniMax 原文、unknown parameter、无法识别
|
|
137
|
+
- fetch:400 可解析 → 第二次请求 body 已改且只发两次;不可解析 → 只发一次
|
|
138
|
+
- 缓存读写、过期、version 不匹配
|
|
139
|
+
|
|
140
|
+
实现落点:`src/thinking.ts` 扩展拼 body 与 hint 解析;新建 `src/thinking-wire.ts`(profile 解析、启发式、缓存)以免 `thinking.ts` 再膨胀;`src/provider.ts` 的 `modelFetch` 接 400 重试。测试放 `tests/thinking.test.ts` 与 `tests/thinking-wire.test.ts`。
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: self-config
|
|
3
3
|
description: >
|
|
4
4
|
Configures min-agent itself: providers, MCP servers, skills, rules, memory,
|
|
5
|
-
permission, sandbox, plugins, and files under ~/.min-agent/ and .min-agent/.
|
|
5
|
+
permission, sandbox, thinking intensity, plugins, and files under ~/.min-agent/ and .min-agent/.
|
|
6
6
|
Use when the user asks to install, enable, disable, or change min-agent settings.
|
|
7
7
|
always-load: true
|
|
8
8
|
version: 1.0.0
|
|
@@ -28,7 +28,7 @@ Config files are **strict JSON** (no comments). Read the file before editing. Pr
|
|
|
28
28
|
| Goal | File | Notes |
|
|
29
29
|
|------|------|--------|
|
|
30
30
|
| Providers, keys, search backends, pricing, extra instruction paths, global skill disables | `~/.min-agent/config.json` | Keys only here |
|
|
31
|
-
| Project skill toggles; overlay `activeProvider` / `defaultModel` / `sampling` / `budget` / `permission` / `sandbox` / `compaction` / `agent` | `.min-agent/config.json` | Overlay is field-by-field; `sampling`/`budget`/`sandbox`/`compaction`/`agent` merge keys |
|
|
31
|
+
| Project skill toggles; overlay `activeProvider` / `defaultModel` / `sampling` / `budget` / `permission` / `thinking` / `memory` / `sandbox` / `compaction` / `agent` | `.min-agent/config.json` | Overlay is field-by-field; `sampling`/`budget`/`sandbox`/`compaction`/`agent` merge keys |
|
|
32
32
|
| MCP servers | `~/.min-agent/mcp.json` or `.min-agent/mcp.json` | Merge by server **name**; project replaces the same name |
|
|
33
33
|
| Memories | `memory.json` in the same dirs | Prefer `memory_save` / `memory_search` tools over editing the file |
|
|
34
34
|
| Global rules | `~/.min-agent/rules.md` | Always loaded |
|
|
@@ -76,11 +76,12 @@ Instructions...
|
|
|
76
76
|
|
|
77
77
|
`description` may be a YAML `|` / `>` block. Optional: `version`, `allowed-tools`, `always-load`, `metadata.requires.bins`. Do not disable `self-config` unless the user explicitly asks.
|
|
78
78
|
|
|
79
|
-
## Rules, memory, permission, sandbox
|
|
79
|
+
## Rules, memory, permission, sandbox, thinking
|
|
80
80
|
|
|
81
81
|
- Rules: edit the files in the table above. `/reload` reloads rules only, not MCP.
|
|
82
|
-
- Memory:
|
|
82
|
+
- Memory: **off** by default. Config `memory` is `on` | `off` (`true`/`enable` → on, `false`/`disable` → off). Project overlays global; writing `memory` globally also removes a project `memory` overlay. When off, memories are not injected and `memory_save` / `memory_search` / `memory_delete` are not registered (takes effect next turn after you change the file). CLI `min-agent memory on|off` / `--memory` follow the same write-vs-this-run rule as permission. `/memory on|off` writes **global** by default (and clears a project overlay); `/memory --project` writes only the project file. `/memory` lists the switch plus stored entries; `/memory <text>` still writes `memory.json` even when off. Default save scope is project when `.min-agent/` exists. Shape: `{ "content": string, "tags": string[], "created": ISO string }` array. When on, memories are injected each turn as background reference, not as work to resume. Do not store secrets or API keys. HTTP: `GET/POST /v1/memory/mode`, chat body `memory`, and `GET /v1/memory` include `memory` / `source` / `label`.
|
|
83
83
|
- Permission: `ask` (default) | `accept-edits` | `allow-all` in config `permission`. CLI `min-agent permission …` / `--permission` without a message writes config and exits; with a message it is this session only. `--yes` is this session only and does not write config.
|
|
84
|
+
- Thinking intensity: `off` | `low` | `medium` | `high` | `max` in config `thinking`. Omit the field to use **medium**, then clamp to levels the current model actually exposes (from the model catalog). `/think` opens an interactive picker of those English levels and writes **global** config; that also clears a project `thinking` overlay so a leftover project `off` cannot hide the new value after restart. `/think --project` writes only the project file. Typed `/think off|low|medium|high|max` still works when the model supports that value. `min-agent think …` / `--think` follow the same write-vs-this-run rule as permission. `xhigh` / `extra-high` / `none` are accepted as aliases (`xhigh` → `max`, `none` → `off`). Each request maps that intensity onto the current model and gateway (MiniMax uses `adaptive`/`disabled`; official OpenAI omits `thinking` and maps `max` to `xhigh`). Learned mappings are cached in `~/.min-agent/thinking-wire-cache.json` for 7 days. Per-model context window and supported effort values are loaded from the model catalog (`https://models.lonae.com`, override with `MIN_AGENT_MODELS_API_URL`) and cached in `~/.min-agent/model-catalog-cache.json` for 7 days after a successful lookup. When the provider host is unknown, effort levels are the majority across offerings that actually list efforts (toggle-only rows do not vote), so a single gateway cannot invent `medium`.
|
|
84
85
|
- Sandbox default is **off**. `mode`: `off` | `workspace` | `strict`. Optional `network`, `extraWriteRoots`, `extraReadRoots`. Isolation is independent of permission. `--sandbox` / `--network` without a message write config and exit.
|
|
85
86
|
|
|
86
87
|
## Providers
|
|
@@ -24,6 +24,8 @@ Read this when you need exact keys. Files are strict JSON.
|
|
|
24
24
|
"instructions": ["./docs/rules.md"],
|
|
25
25
|
"disabledSkills": [],
|
|
26
26
|
"permission": "ask",
|
|
27
|
+
"thinking": "max",
|
|
28
|
+
"memory": "on",
|
|
27
29
|
"sandbox": {
|
|
28
30
|
"mode": "off",
|
|
29
31
|
"network": "allow",
|
|
@@ -54,6 +56,8 @@ Read this when you need exact keys. Files are strict JSON.
|
|
|
54
56
|
}
|
|
55
57
|
```
|
|
56
58
|
|
|
59
|
+
- `thinking`: `off` | `low` | `medium` | `high` | `max`; omit to use medium. A project `thinking` value overlays global; writing thinking globally removes the project overlay so the chosen level is what later sessions use. `/think --project` writes only the project file.
|
|
60
|
+
- `memory`: `on` | `off`; omit to keep **off**. When off, stored `memory.json` entries are not injected and memory tools are unavailable. A project `memory` value overlays global; writing memory globally removes the project overlay. `/memory --project` writes only the project file.
|
|
57
61
|
- `contextWindow`: tokens; omit to query the API, then 512k fallback.
|
|
58
62
|
- `agent.autoContinue` omitted → uses `compaction.autoContinue` (default true).
|
|
59
63
|
- `agent.maxSteps` omitted → no tool-step ceiling.
|
|
@@ -71,9 +75,9 @@ Read this when you need exact keys. Files are strict JSON.
|
|
|
71
75
|
|
|
72
76
|
Allowed keys (no `providers`, no API keys, no search secrets):
|
|
73
77
|
|
|
74
|
-
`disabledSkills`, `enabledSkills`, `activeProvider`, `defaultModel`, `sampling`, `budget`, `permission`, `sandbox`, `compaction`, `agent`.
|
|
78
|
+
`disabledSkills`, `enabledSkills`, `activeProvider`, `defaultModel`, `sampling`, `budget`, `permission`, `thinking`, `memory`, `sandbox`, `compaction`, `agent`.
|
|
75
79
|
|
|
76
|
-
Present keys overlay the global file. Nested objects `sampling` / `budget` / `sandbox` / `compaction` / `agent` merge per field. `defaultModel` overrides the active provider's model without copying keys.
|
|
80
|
+
Present keys overlay the global file. Nested objects `sampling` / `budget` / `sandbox` / `compaction` / `agent` merge per field. `defaultModel` overrides the active provider's model without copying keys. Writing `thinking` or `memory` to global config also removes the matching project overlay.
|
|
77
81
|
|
|
78
82
|
## `mcp.json`
|
|
79
83
|
|
|
@@ -127,16 +131,17 @@ Default: confirm before run. `readOnly: true` or `dangerous: false` skips confir
|
|
|
127
131
|
|
|
128
132
|
## Memory `memory.json`
|
|
129
133
|
|
|
130
|
-
Array of `{ "content": string, "tags": string[], "created": string }`. Prefer memory tools.
|
|
134
|
+
Array of `{ "content": string, "tags": string[], "created": string }`. Prefer memory tools when `memory` is `on`. Injected as background reference each turn only when enabled, not as pending work. Do not store secrets or API keys. The enable switch lives in config (`memory`), not in this file.
|
|
131
135
|
|
|
132
136
|
## Environment overrides
|
|
133
137
|
|
|
134
138
|
| Variable | Role |
|
|
135
139
|
|----------|------|
|
|
136
|
-
| `MIN_AGENT_CONFIG_DIR` | Replaces `~/.min-agent` |
|
|
140
|
+
| `MIN_AGENT_CONFIG_DIR` | Replaces `~/.min-agent` (includes `model-catalog-cache.json`, `thinking-wire-cache.json`) |
|
|
137
141
|
| `MIN_AGENT_SKILLS_DIRS` | Replaces user skill roots (path-delimiter separated) |
|
|
138
142
|
| `MIN_AGENT_NO_BUILTIN_SKILLS` | `1` / `true` skips packaged skills |
|
|
139
143
|
| `MIN_AGENT_SANDBOX` / `MIN_AGENT_SANDBOX_NETWORK` | Isolation |
|
|
144
|
+
| `MIN_AGENT_MODELS_API_URL` | Model catalog base (default `https://models.lonae.com`) |
|
|
140
145
|
| `MIN_AGENT_SERPER_API_KEY` | Overrides `serperApiKey` |
|
|
141
146
|
| `MIN_AGENT_SEARXNG_URL` | Overrides `webSearchURL` (SearXNG instead of Serper) |
|
|
142
147
|
| `MIN_AGENT_SEARXNG_FALLBACK_ENGINES` | Default `google,bing`; empty string disables retry |
|
|
@@ -146,4 +151,4 @@ Array of `{ "content": string, "tags": string[], "created": string }`. Prefer me
|
|
|
146
151
|
|
|
147
152
|
## HTTP (only if the user is running `min-agent serve`)
|
|
148
153
|
|
|
149
|
-
Skills: `GET /v1/skills`, `GET /v1/skills/:name`, `POST /v1/skills/reload`, `POST /v1/skills/:name/enable|disable` with `{ "scope": "project"|"global" }`. MCP enable/disable similarly. Full list is `docs/API.md` in the min-agent package; do not treat that file as this skill's replacement.
|
|
154
|
+
Skills: `GET /v1/skills`, `GET /v1/skills/:name`, `POST /v1/skills/reload`, `POST /v1/skills/:name/enable|disable` with `{ "scope": "project"|"global" }`. MCP enable/disable similarly. Thinking: `GET/POST /v1/thinking`. Memory switch: `GET/POST /v1/memory/mode`. Full list is `docs/API.md` in the min-agent package; do not treat that file as this skill's replacement.
|