@mortiseai/stem 0.0.8 → 0.0.9

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 CHANGED
@@ -66,7 +66,8 @@ stem --model BaiLian:glm-5.2 # 会话默认模型(platform:model 完
66
66
  stem --model glm-5.2 # 裸模型 id(目录唯一命中,否则落默认平台)
67
67
  stem --lang ja --model BaiLian:glm-5.2 # 组合使用
68
68
  stem --resume <sessionId> # 恢复历史会话(续写同一份会话日志)
69
- stem --tenant acme # 租户模式:全部落盘状态按 tenants/acme 隔离
69
+ stem --tenant acme # 租户模式:全部落盘状态按 tenant/acme 隔离
70
+ stem --tenant acme --user 1000 # 租户内再按用户隔离存储数据:存储根 tenant/acme/1000
70
71
  echo "一句话问答" | stem --bare # SIMPLE 模式:stdin → 单次回答(non-TTY)
71
72
  ```
72
73
 
@@ -222,29 +223,68 @@ Stem 的三种核心业务模式:
222
223
  - **租户码**:1–64 字符,小写字母/数字开头,允许 `.` `_` `-`(拒绝大写与路径
223
224
  分隔符);非法直接报错退出。
224
225
 
225
- 目录布局(H = 租户段 `tenants/<code>`):
226
+ 目录布局(H = 租户段 `tenant/<code>`):
226
227
 
227
228
  | 数据 | 无租户 | 租户模式 |
228
229
  |---|---|---|
229
- | 存储(session/causal/distill/evolve) | `<cwd>/mstem-storage/<kind>/` | `<cwd>/mstem-storage/H/<kind>/` |
230
- | 家目录状态(projects/history/plans/keybindings/memory/plugins/skills/mcp/hooks/llms/workflows/agents) | `~/.mstem/...` | `~/.mstem/H/...` |
230
+ | Group 数据(session/causal/distill/evolve) | `<cwd>/.mstem/platform/<kind>/` | `<cwd>/.mstem/H/<kind>/` |
231
+ | 用户空间(--user 时的全部数据,见下节) | `<cwd>/mstem-storage/platform/<user>/` | `<cwd>/mstem-storage/H/<user>/` |
232
+ | 家目录状态(projects/plans/keybindings/memory/plugins/skills/mcp/hooks/llms/workflows/agents;输入历史为进程内内存,不落盘) | `~/.mstem/...` | `~/.mstem/H/...` |
231
233
  | 用户 settings | `~/.mstem.json` | `~/.mstem/H/settings.json` |
232
- | 项目配置(settings/skills/plugins/agents/workflows/hooks/mcp/llms/memory) | `<cwd>/.mstem/...` | `<cwd>/.mstem/H/...` |
233
- | debug 日志 | `<cwd>/logs/` | `<cwd>/logs/H/` |
234
+ | 项目配置(settings/skills/plugins/agents/workflows/hooks/mcp/llms/memory) | `<cwd>/.mstem/platform/...` | `<cwd>/.mstem/H/...` |
235
+ | debug 日志 | `<cwd>/logs/` | `<cwd>/logs/`(统一,不分目录;sessionId 唯一) |
234
236
 
235
- - **env 覆盖 × 租户**:目录形 env(`STEM_STORAGE_DIR` / `STEM_SESSION_DIR` 等)
236
- 即使显式设置,租户段照插(如 `STEM_STORAGE_DIR=/data` + `--tenant acme` →
237
- `/data/tenants/acme/...`)— 隔离是边界,不随根重定向失效。文件形显式指针
237
+ - **env 覆盖 × 租户**:目录形根只有两个 env(`STEM_STORAGE_DIR` 重定向存储根、
238
+ `STEM_DIR` 重定向项目配置根;不再有逐 kind 的独立重定向)。即使显式
239
+ 设置,租户段照插(如 `STEM_STORAGE_DIR=/data` + `--tenant acme`
240
+ `/data/tenant/acme/...`)— 隔离是边界,不随根重定向失效。文件形显式指针
238
241
  env(`STEM_SETTINGS_PATH` / `STEM_CMD_LOG` / `STEM_LLMS_PATH` /
239
242
  `STEM_HOOKS_PATH` / `STEM_MCP_CONFIG_PATH` / `STEM_PLUGINS_DIR`)按字面生效。
240
243
  - **首启为空 + 自动建空间**:租户首次以正常路径启动(TUI / daemon run /
241
244
  mcp serve;`--help` 等 fast-echo 不算)时自动创建其目录骨架
242
- (`.mstem/tenants/<code>/`、存储四目录、`logs/tenants/<code>/`、
243
- `~/.mstem/tenants/<code>/projects/`),但**不播种任何配置** — 新租户的
245
+ (`.mstem/tenant/<code>/` 及其 kind 四目录、
246
+ `~/.mstem/tenant/<code>/projects/`),但**不播种任何配置** — 新租户的
244
247
  settings/llms/mcp/skills 全部独立,需逐租户放入(llms.json 凭据不跨租户
245
248
  共享是特性,不是缺陷;想共享凭据可用字面生效的 `STEM_LLMS_PATH`)。
246
249
  - 租户会话与个人历史互不可见:`/resume` 在租户模式下只枚举该租户自己的会话。
247
250
 
251
+ ### 用户隔离 · `--user`
252
+
253
+ `--user <id>`(或 `--user=<id>`)在 platform 或 tenant 作用域基础上再追加一层
254
+ **用户隔离**,`--tenant` 有没有传都生效。四个作用域(平台 / 平台+用户 /
255
+ 租户 / 租户+用户)**两两绝对隔离**:每个用户拥有独立的用户空间
256
+ `<存储根>/platform/<id>/` 或 `<存储根>/tenant/<code>/<id>/`,`.mstem` 配置根
257
+ 本身不含任何用户段:
258
+
259
+ - 用户数据落用户空间;不传 `--user` 时数据属 Group 维度,落 STEM_DIR
260
+ (`.mstem/<scope>/<kind>/`),`mstem-storage` 只承载用户空间。会话数据的
261
+ 口径是完整的:会话/洞察四目录、task 快照与
262
+ workflow 日志(`projects/`)、plan 文件(`plans/`)、洞察报告与洞察记忆
263
+ —— 用户会话的全部落盘都在自己空间内,Group 与其他用户不可见。
264
+ (debug 日志例外:统一落 `<cwd>/logs/`,按唯一 sessionId 区分文件。)
265
+ - 五类资源(workflows / skills / plugins / memory / agents)同样绝对隔离:
266
+ `--user` 会话**只读**自己用户空间下的对应子目录(如
267
+ `mstem-storage/platform/<id>/skills/`),不读 Group 的 `.mstem`/家目录层;
268
+ Group 会话也看不到用户空间的资源。
269
+ - `llms.json`、`settings.json`、`settings.local.json`(以及 mcp/hooks 等配置
270
+ 文件)仅存在于平台/租户目录 —— 模型与 settings 只能按 Group(平台/租户)
271
+ 设置,用户维度没有自己的配置副本,`--user` 会话读到的是所属 Group 的配置。
272
+ - **Group 配置对用户会话只读**:`--user` 会话里的一切设置写入(`/model`、
273
+ `/config`、技能/插件开关等)都落进程内的 session 临时层 —— 会话内立即生效、
274
+ 优先级最高,但不落盘,退出即消失,Group 的配置文件一个字节都不会被改。
275
+ - 用户码格式与租户码相同(1–64 字符,小写字母/数字开头,允许 `.` `_` `-`);
276
+ 非法直接报错退出,与 `--tenant` 是否合法/是否传入无关。
277
+ - **不做 npm 中继**(与 `--tenant` 的 `npm_config_tenant` 中继不同):
278
+ `npm_config_user`/`npm_config_group` 是 npm 自身的历史遗留 unix 权限配置
279
+ 键,复用有语义碰撞风险。npm 脚本下需要 `--user` 时用
280
+ `npm run dev -- --user <id>` 透传。
281
+
282
+ 举例:`stem --user 1000` → 用户空间 `<cwd>/mstem-storage/platform/1000/`
283
+ (会话/洞察/skills/agents/workflows/memory/plugins 全部在内),llms/settings
284
+ 读 `<cwd>/.mstem/platform/`;`stem --tenant acme --user 1000` → 用户空间
285
+ `<cwd>/mstem-storage/tenant/acme/1000/`,llms/settings 读
286
+ `<cwd>/.mstem/tenant/acme/`。
287
+
248
288
  ### 图片粘贴 · 图文混合理解(macOS)
249
289
 
250
290
  对齐 Claude Code:剪贴板里有图片(如 Cmd+Shift+Ctrl+4 截图)时按 **Ctrl+V**,输入框插入 `[Image #N]` 占位;提交后文本与图片按占位位置交错组成混合消息发给模型。模型也可以直接 `Read` 图片文件(png/jpg/gif/webp)"看到"内容。
@@ -309,14 +349,18 @@ CLI 的全部运行时开关统一放 settings 级联的 **`env` 段**(不再使
309
349
  | `STEM_WEBSEARCH_ENABLED` / `STEM_WEBSEARCH_PROVIDER` | web_search 总开关 / provider(`auto\|duckduckgo\|brave-web`) |
310
350
  | `STEM_TELEMETRY` | `1` = 无头模式开启 telemetry 观测帧(`--sdk-telemetry` 的 env 形式) |
311
351
  | `STEM_TELEMETRY_WS` | telemetry WS tap 地址 |
312
- | `STEM_STORAGE_DIR` | 统一存储根(缺省 `<cwd>/mstem-storage`;优先于 settings `storage.dir`;租户模式下自动追加 `tenants/<code>` ) |
313
- | `STEM_SESSION_DIR` | 会话聊天 JSONL 目录(缺省 `<存储根>/session`;租户段同上) |
314
- | `STEM_CAUSAL_DIR` / `STEM_DISTILL_DIR` / `STEM_EVOLVE_DIR` | 各洞察模式数据目录(缺省 `<存储根>/<mode>`;租户段同上) |
352
+ | `STEM_STORAGE_DIR` | 用户空间根(缺省 `<cwd>/mstem-storage`;优先于 settings `storage.dir`;自动追加作用域+用户段 —— `platform/<user>`,租户模式下 `tenant/<code>/<user>`)。只承载 `--user` 用户空间;Group 数据(session/causal/distill/evolve) STEM_DIR 项目配置根,跟随 `STEM_DIR` 重定向 |
353
+ | `STEM_DIR` | 项目配置根(缺省 `<cwd>/.mstem`;取值形态与作用域追加规则同 `STEM_STORAGE_DIR`) |
315
354
  | `STEM_TENANT` | **内部通道,勿手工设置** — 只由 `--tenant` flag 写入,env 段里的值会被入口忽略 |
316
-
317
- 存储目录 env 的取值支持三种形态:`~/...`(home 展开)、绝对路径、相对路径
318
- (相对 cwd 解析)。会话聊天文件默认落 `<cwd>/mstem-storage/session/<sessionId>.jsonl`;
319
- 升级前写在 `~/.mstem/projects/<项目>/` 的历史会话仍可被 `/resume` 找到并续写原文件。
355
+ | `STEM_USER` | **内部通道,勿手工设置** — 只由 `--user` flag 写入,env 段里的值会被入口忽略 |
356
+
357
+ `STEM_STORAGE_DIR` / `STEM_DIR` 的取值支持两种形态:绝对路径、相对路径
358
+ (相对当前工程路径 cwd 解析)——**不做 `~` home 展开**,`~/...` 不会被特殊
359
+ 处理,直接按相对路径拼接。会话聊天文件默认落
360
+ `<cwd>/.mstem/platform/session/<sessionId>.jsonl`(`--user` 时落用户空间
361
+ `<cwd>/mstem-storage/platform/<user>/session/`);升级前写在
362
+ `~/.mstem/projects/<项目>/` 或 `mstem-storage/<scope>/common/` 的历史会话
363
+ 经惰性迁移仍可被 `/resume` 找到并续写原文件。
320
364
 
321
365
  ---
322
366