@mokuyoaxis/dsh-iris 0.1.3 → 0.1.4

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 (51) hide show
  1. package/.dsh/skills/iris-compose-media/SKILL.md +23 -49
  2. package/.dsh/skills/iris-compose-media/references/task-v2-recovery.md +30 -0
  3. package/.dsh/skills/iris-compose-media/references/workflows.md +38 -0
  4. package/.dsh/skills/iris-verify-ui/SKILL.md +3 -25
  5. package/.dsh/skills/iris-verify-ui/agents/openai.yaml +4 -0
  6. package/.dsh/skills/iris-verify-ui/references/verdict-and-degradation.md +31 -0
  7. package/CHANGELOG.md +24 -2
  8. package/README.en.md +29 -7
  9. package/README.md +29 -7
  10. package/docs/ARCHITECTURE.md +27 -13
  11. package/docs/ARTIFACT_LIBRARY.md +24 -0
  12. package/docs/HOST_ADAPTER_CONTRACT.md +86 -0
  13. package/docs/HOST_DOCTOR.md +47 -0
  14. package/docs/PROVIDER_ADAPTER_CONTRACT.md +97 -0
  15. package/docs/PROVIDER_HEALTH.md +39 -0
  16. package/docs/PROVIDER_SUBMISSION_CONTRACT.md +2 -2
  17. package/docs/ROADMAP.md +18 -8
  18. package/docs/SECURITY.md +6 -2
  19. package/docs/TASK_SEMANTICS.md +3 -2
  20. package/docs/assets/diagrams/iris-architecture.png +0 -0
  21. package/docs/assets/diagrams/iris-architecture.svg +5 -5
  22. package/docs/releases/0.1.4.md +59 -0
  23. package/lib/actions.js +357 -221
  24. package/lib/adapters.js +7 -7
  25. package/lib/api.js +30 -11
  26. package/lib/artifacts.js +239 -0
  27. package/lib/bundled-skills.js +5 -5
  28. package/lib/client.js +370 -55
  29. package/lib/config.js +192 -9
  30. package/lib/doctor.js +175 -4
  31. package/lib/dsh-host-adapter.js +189 -0
  32. package/lib/host-contract.js +131 -0
  33. package/lib/host-runtime.js +156 -0
  34. package/lib/index.js +97 -113
  35. package/lib/locate.js +1 -1
  36. package/lib/media.js +16 -6
  37. package/lib/prompt-optimizer.js +10 -20
  38. package/lib/provider-adapter.js +371 -0
  39. package/lib/provider-adapters.js +279 -0
  40. package/lib/provider-health.js +59 -0
  41. package/lib/render.js +43 -12
  42. package/lib/tasks.js +29 -5
  43. package/lib/vision.js +23 -49
  44. package/package.json +14 -8
  45. package/user_guide.md +42 -2
  46. package/docs/assets/diagrams/iris-architecture.drawio +0 -1
  47. package/docs/assets/diagrams/iris-task-lifecycle.drawio +0 -1
  48. package/docs/assets/diagrams/iris-workflow-compose.drawio +0 -1
  49. package/docs/releases/0.1.1.md +0 -51
  50. package/docs/releases/0.1.2.md +0 -26
  51. package/docs/releases/0.1.3.md +0 -30
@@ -1,6 +1,6 @@
1
1
  # Iris 架构与边界
2
2
 
3
- 状态:v0.1.3 当前实现。本文描述已经存在的代码边界,不把 0.2+ 规划写成现成功能。
3
+ 状态:v0.1.3 已发布实现;v0.1.4 已冻结 Host Adapter v0 契约,提供 test-only Local Host consumer,完成 DSH Adapter 消费者迁移与真实 DSH 隔离 canary,并实现 Provider Adapter v0 完整生命周期与 Host Doctor。
4
4
 
5
5
  ## 当前形态
6
6
 
@@ -12,6 +12,10 @@ DSH Host / Cordis
12
12
  ├─ Web slots / browser │
13
13
  └─ attachment/session ports │
14
14
  ▼
15
+ dsh-host-adapter.js
16
+ (能力探测 / DTO / 生命周期)
17
+ │ Host Adapter v0
18
+ ▼
15
19
  actions.runAction
16
20
  ├─ provider adapters
17
21
  ├─ Task / Attempt v2
@@ -21,10 +25,10 @@ DSH Host / Cordis
21
25
  ▼
22
26
  $DSH_HOME/iris/v1
23
27
  providers.json · tasks.json
24
- outputs/ · uploads/
28
+ artifacts.json · outputs/ · uploads/
25
29
  ```
26
30
 
27
- `lib/index.js` 是 DSH Host Adapter 的当前集中入口;`lib/client.js` 只消费同源 API 与 DSH UI Slot。`lib/api.js` 是工作台 HTTP 投影,不是真相来源。Task 的持久事实由 `lib/tasks.js` 管理。
31
+ `lib/index.js` 是 DSH 插件入口,`lib/dsh-host-adapter.js` 是服务端 DSH/Cordis 对象进入 Iris 的唯一映射边界;`lib/client.js` 内部用最小 client slot adapter 隔离 DSH UI Slot。`lib/api.js` 是工作台 HTTP 投影,不是真相来源。Task 的持久事实由 `lib/tasks.js` 管理。
28
32
 
29
33
  ## 已稳定的核心候选
30
34
 
@@ -32,29 +36,37 @@ DSH Host / Cordis
32
36
  |---|---|---:|
33
37
  | `task-semantics.js` | Task v2 枚举、旧状态与用户状态派生、自洽校验 | 无 |
34
38
  | `provider-contract.js` | 提交结果、受理边界、错误脱敏、候选调度 | 无 |
39
+ | `provider-adapter.js` | Provider v0 生命周期、canonical 结果与统一调用边界 | 无 |
40
+ | `provider-adapters.js` | DashScope / OpenAI Images 协议到 v0 的映射 | 无 |
35
41
  | `tasks.js` | Task/Attempt 持久化、观察、恢复与交付状态 | 无;数据根仍沿用 `DSH_HOME` |
36
- | `doctor.js` | 零网络离线环境与数据诊断 | 无 |
37
- | `actions.js` | GUI 与 Agent 共用动作 | 有宿主上下文参数,部分动作依赖 Browser/会话能力 |
42
+ | `artifacts.js` | 作品库 v0 的最小索引、分页、重建、删除与独立媒体授权 | 无;数据根仍沿用 `DSH_HOME` |
43
+ | `doctor.js` | 共用诊断结果模型;离线检查环境/数据,Host 模式检查安全能力快照与注册证据 | 无 |
44
+ | `host-runtime.js` | 服务端成功注册账本与受限浏览器握手;不保存 live object | 无 |
45
+ | `actions.js` | GUI 与 Agent 共用动作 | 只接收 Host Adapter;部分动作声明 Browser/会话端口 |
46
+ | `dsh-host-adapter.js` | DSH capability detection、DTO 与生命周期映射 | 有;唯一服务端 DSH 运行时映射边界 |
38
47
  | `index.js` | DSH 工具、路由、Skill 与生命周期注册 | 有 |
39
48
  | `client.js` | DSH Web Slot、工作台、泡泡和提示词入口 | 有 |
40
49
 
41
- 0.1.3 不声称已有完整独立 Core 或 Local Host Adapter。完整 Command Service、Host Port 接口和非 DSH 运行入口属于后续版本;本版先保证任务语义与离线 Doctor 不依赖 DSH 包即可执行。
50
+ 0.1.3 没有完整独立 Core 或 Local Host Adapter。0.1.4 先冻结并验证最小 Host Port、Local Host fixture 和 DSH capability detection;完整 Command Service 与非 DSH Provider 执行入口仍属于 0.2.0。
42
51
 
43
52
  ## Task、Attempt 与 Artifact
44
53
 
45
54
  - 一个用户意图对应一个 Task;每个候选供应商调用对应一个稳定 Attempt。
46
55
  - Attempt 必须在可能发送计费请求前落盘。只有明确 `not_accepted` 才允许自动 failover。
47
56
  - 生成结果与本地交付是两类事实。生成成功后下载失败仍保持 `outcome=succeeded`。
48
- - 当前 Artifact 仍由任务中的文件、媒体令牌和附件记录表示;正式 Artifact Manifest、内容哈希和谱系属于 0.2.0。
57
+ - 0.1.4 增加独立作品库 v0:`artifacts.json` 只保存文件、类型、大小、时间和随机令牌,因此清任务历史后仍可浏览作品;它不保存 Prompt、Provider、Model 或任务关系。
58
+ - 正式 Artifact Manifest、内容哈希、谱系、收藏、标签和搜索仍属于 0.2.0+;作品库 v0 不是该公共契约。
49
59
  - 每次 v2 任务变更递增 Task `revision`;完整状态快照另带进程 `stateEpoch/stateRevision`,客户端拒绝同一 epoch 中迟到的旧快照。
50
60
 
51
61
  详细状态机见 [Task/Attempt v2 语义契约](TASK_SEMANTICS.md),故障证据见 [故障注入矩阵](FAULT_INJECTION.md)。
52
62
 
53
63
  ## Provider 边界
54
64
 
55
- 现有 DashScope 与 OpenAI Images 兼容分支仍位于 `adapters.js`,尚未宣称完整 Provider SDK。0.1.3 已冻结供应商提交所需的最小契约:复合模型身份、写前 Hook、四类提交结果、受理证据和安全错误。新增 Provider 不应绕过该契约直接在失败时切换候选。
65
+ 0.1.4 已实现内部 Provider Adapter v0:`provider-adapter.js` 固定 discovery、submit、poll、cancel、download 与 error mapping 六类操作和 canonical 结果;`provider-adapters.js` 将 DashScope 与 OpenAI Images 映射到契约;`adapters.js` 只保留注入式低层 HTTP transport。动作、恢复、重新交付、模型发现与能力探测不再直接绕过该生命周期边界。
66
+
67
+ 每个操作必须明确声明 supported 或 unsupported。DashScope 的远端 cancel 尚无经过验证的实现,OpenAI Images 的同步路径没有 poll/cancel,它们均以能力事实公开,而不是在运行时以“方法不存在”失败。完整规则见 [Provider Adapter v0 生命周期契约](PROVIDER_ADAPTER_CONTRACT.md),四态受理规则见 [Provider 提交契约 v0](PROVIDER_SUBMISSION_CONTRACT.md)。
56
68
 
57
- 完整接口与 conformance runner 延后到 0.1.4+,见 [Provider 提交契约 v0](PROVIDER_SUBMISSION_CONTRACT.md)。
69
+ Provider 健康事实位于配置层,以 Provider × Model × Capability 为键保存最近成功、决定性认证失败和临时观察。动作层只在真实 Provider 生命周期结果或显式探针后写入;API 投影按当前 failover 候选汇总,客户端只渲染快照,不自行猜测可用性。成功与明确认证失败的有效窗口均为 7 天;429、网络、5xx、内容安全、取消和 unknown 不会推翻窗口内成功。详见 [Provider 与能力健康状态](PROVIDER_HEALTH.md)。
58
70
 
59
71
  ## Host Port 清单
60
72
 
@@ -67,15 +79,17 @@ DSH Host / Cordis
67
79
  | 会话附件与输入草稿 | DSH session/input ports | 退化为 Iris 自有产物或浏览器上传 |
68
80
  | Skills registry | DSH skills service | 随包 Skill 不自动注册;核心动作仍可用 |
69
81
 
70
- 这些依赖目前由 `index.js` 的可选注入和守卫集中处理。0.1.4 将把它们转成正式 Host Adapter 接口并增加 Local Host fixture。
82
+ 这些依赖由 `dsh-host-adapter.js` 映射为命名端口,`index.js` 只负责 DSH 插件装配和生命周期入口;客户端 Slot 探测留在 client bundle 的最小 adapter 内。Command、API、提示词优化和视觉后端不接收原始 `ctx`。test-only Local Host fixture 使用同一契约验证无 DSH 降级,但不等同于独立宿主。
71
83
 
72
84
  ## 事件与 UI
73
85
 
74
- 任务和配置写入会触发节流 SSE 快照。每份快照都有进程 epoch 与单调序号;慢消费者进入背压后只保留最新快照,重连仍通过持久化全量状态收敛。工作台只展示稳定人类状态,内部事实轴保留在 API 详情中供诊断和人工动作判断。
86
+ Host Doctor 通过已认证的 `/iris/api/doctor` 返回能力和装载证据;客户端只在 Slot 回调实际执行后向 `/iris/api/host-client` 回报插件版本、协议号和 Slot 名称。诊断不调用端口、Browser、模型或 Provider,详见 [Host Doctor](HOST_DOCTOR.md)。
87
+
88
+ 任务、配置和作品索引写入会触发节流 SSE 快照。每份快照都有进程 epoch 与单调序号;慢消费者进入背压后只保留最新快照,重连仍通过持久化全量状态收敛。工作台只展示稳定人类状态,内部事实轴保留在 API 详情中供诊断和人工动作判断。
75
89
 
76
90
  ## 非目标
77
91
 
78
- - 不在 0.1.3 启动独立常驻服务或复制 DSH 聊天界面。
92
+ - 不在 0.1.4 启动独立常驻服务或复制 DSH 聊天界面。
79
93
  - 不迁移到 SQLite/JSONL,不破坏旧任务读取。
80
- - 不新增 Gemini、Fal 或 Replicate 分支。
94
+ - 0.1.4 不新增 Gemini、Fal 或 Replicate 分支;Provider conformance 完成后仍保持版本范围。
81
95
  - 不把离线 Doctor 的成功等同于 DSH Host、浏览器或真实供应商已可用。
@@ -0,0 +1,24 @@
1
+ # Iris 作品库 v0
2
+
3
+ 状态:v0.1.4 候选实现。
4
+
5
+ 作品库解决“清除任务历史后仍能看到本地作品”的问题。任务记录描述执行过程;作品记录只负责本地媒体的发现、展示和访问。两者生命周期彼此独立。
6
+
7
+ ## 用户语义
8
+
9
+ - 新生成并成功落盘的图片、视频和音频会自动进入作品库。
10
+ - 首次升级到带作品库的版本时,Iris 会扫描现有 `outputs/` 并建立最小索引。
11
+ - “清空已完成”或“清理 7 天前”只删除终态任务记录,作品仍可从工作台和泡泡打开。
12
+ - “找回本地作品”会重新扫描 `outputs/`,补录受支持的普通媒体文件,并移除文件已经不存在的失效索引。
13
+ - 删除单件作品或清空作品库会删除实际媒体文件,需要独立确认;相关任务历史保留,但其中的旧媒体链接将无法再打开。
14
+ - “删除孤儿产物”不会删除已经纳入作品库的文件。
15
+
16
+ ## 数据与隐私
17
+
18
+ 最小索引保存在 `$DSH_HOME/iris/v1/artifacts.json`,POSIX 文件权限为 `0600`。每条记录只包含随机作品 ID、文件 basename、媒体类型、大小、时间和随机访问令牌,不保存 Prompt、Provider、Model、API Key、任务关系或宿主绝对路径。
19
+
20
+ 作品链接继续复用 `/iris/media`,使用 128-bit 随机能力令牌并只从索引解析文件。错误 ID、令牌、文件名或路径穿越输入统一返回 404。作品库不是备份:删除作品文件、删除整个 Iris 数据目录或存储损坏仍可能造成数据丢失,重要作品应另行备份。
21
+
22
+ ## 与未来 Artifact Manifest 的边界
23
+
24
+ v0 不是完整 Artifact Manifest:没有内容哈希、去重、旁车数据、来源/派生关系、引用图或跨宿主导出契约。完整 Manifest 完成崩溃一致性和安全评审后,再承载收藏、标签、搜索、筛选和批量导出等能力。
@@ -0,0 +1,86 @@
1
+ # Host Adapter v0 契约
2
+
3
+ 状态:**v0.1.4 内部契约与渐进迁移已完成,并通过真实 DSH 隔离 canary。** 本文固定真实消费者所需的最小边界;不宣称已经提供独立 Core、公开 Host SDK 或完整 Local Host。
4
+
5
+ ## 目标
6
+
7
+ Host Adapter 只负责把一个宿主的工具、路由、客户端、附件、会话、浏览器和模型能力映射为 Iris 端口。Command 接收 Iris 输入、`AbortSignal` 和所声明的 Host Port,**不得接收原始 `ctx`**。Task、Provider、文件持久化和成本语义不属于宿主。
8
+
9
+ 契约版本固定为 `0`。它在 0.1.x 内仍是内部接口;只有经过 DSH 与 Local Host 两个真实消费者验证后,才考虑成为公开 SDK。
10
+
11
+ ## 端口清单
12
+
13
+ | Host Port | 当前 DSH 来源 | 最小职责 | 缺失时 |
14
+ |---|---|---|---|
15
+ | `tools` | `ctx.tools` / `ctx.effect` | 注册 Agent 工具并随插件生命周期释放 | Agent 工具不可用;核心动作不应因此失效 |
16
+ | `routes` | `webServer` / `httpServer` | 挂载 API、媒体与渲染路由并可逆卸载 | 工作台 HTTP 与媒体链接不可用 |
17
+ | `clientSlots` | Web Client `ctx.slots` | 注册设置、输入区、dock 与 overlay 座位 | 服务端任务和 CLI 不受影响 |
18
+ | `skills` | `ctx.skills` | 注册随包 Skill,声明用户/模型调用策略 | 工具仍可直接调用;Doctor 给出降级原因 |
19
+ | `attachments` | `ctx.get('attachments')` | 保存/读取图片字节,返回 Iris 自有引用 DTO | DSH 图片投影或会话图片读取不可用 |
20
+ | `sessions` | `ctx.get('sessionQuery')` / Client sessions | 列出当前会话的受支持附件和最小模型选择信息 | 只使用 Iris 自有产物或显式上传 |
21
+ | `browser` | `ctx.get('browser')` | 将受限 HTML 渲染为图片;不向 Command 暴露 DSH page/session 对象 | HTML 截图不可用 |
22
+ | `textModel` | DSH LLM/default-model 服务 | 执行无工具的文本生成并解析当前/默认模型 | 对话框提示词优化不可用 |
23
+ | `visionModel` | DSH 全局视觉模型 | 作为 Iris 自持视觉 Provider 之外的可选后端 | 有自持视觉配置时降级;否则视觉动作失败 |
24
+
25
+ `ports` 只包含真实可调用的方法对象。缺失或版本不兼容的能力进入 `unavailable`,并提供 `kind` 与人类可读 `reason`;Doctor 与运行错误必须消费同一份事实。
26
+
27
+ ## Command × Host Port 矩阵
28
+
29
+ | Command/入口 | 必需端口 | 可选端口 | 说明 |
30
+ |---|---|---|---|
31
+ | `image` | 无 | `visionModel` | 生成与 Task 不依赖宿主;成功后的简短视觉描述可以降级 |
32
+ | `video`、`tts`、`transcribe` | 无 | 无 | Provider、Task 与产物落盘属于 Iris Core 候选 |
33
+ | `look`、`locate`、`ocr` | 无 | `visionModel` | 优先使用 Iris Provider;没有任何视觉后端才失败 |
34
+ | `crop`、`diff`、`video_frames` | 无 | 无 | 确定性本地动作 |
35
+ | `media_summarize` | 无 | `visionModel` | 帧提取是本地动作,理解阶段允许宿主视觉降级 |
36
+ | `html` | `browser` | 无 | Command 只调用语义级 `renderHtml` |
37
+ | `relook` | 条件必需 `attachments` + `sessions` | 无 | Iris 自有附件可直接解析;会话附件必须走宿主端口 |
38
+ | `attachments_list`、`attachment_export` | 条件必需 `attachments` + `sessions` | 无 | Iris 自有产物不依赖宿主;会话来源不得读取宿主私有文件 |
39
+ | Task 查询、观察、交付、提醒和知情重试 | 无 | 无 | 事实、费用确认和新旧 Task 关系归 Iris 所有 |
40
+ | Provider/模型/能力配置 | 无 | `visionModel` | 普通发现与配置不依赖宿主;视觉实测可选宿主后端且必须显式触发 |
41
+ | Prompt Optimize | `textModel` | `sessions` | 客户端可显式传模型;否则从宿主获取当前/默认选择 |
42
+ | DSH 工具结果投影 | `tools` | `attachments` | 注册与结果转为 DSH attachment 属于 DSH Adapter,不进入 Command |
43
+ | Workbench/API/媒体路由 | `routes` | `clientSlots` | HTTP/UI 只是投影,不是真相来源 |
44
+ | 随包 Skill | `skills` | 无 | Skill 不得绕过 Command、Task 或费用边界 |
45
+
46
+ ## 不可违反规则
47
+
48
+ 1. Core 候选、Command、Task 和 Provider 模块不得导入 DSH/Cordis 运行时,也不得通过任意字段重新取得原始 `ctx`。
49
+ 2. Host Adapter 只能映射宿主能力;不得复制业务校验、Provider 路由、Task 状态机、failover 或产物持久化。
50
+ 3. 宿主会话 ID 只能作为来源上下文,不能成为 Iris Task、Attempt 或未来 Artifact 的主键。
51
+ 4. Command 输入和结果只能包含 JSON、字节、稳定引用与受控错误;不得持久化 page、session、service 等 live Host 对象。
52
+ 5. 能力探测必须显式、可序列化且零计费。缺能力返回稳定分类和可执行说明,不得用异常吞噬后继续猜测私有 API。
53
+ 6. 调用方的 `AbortSignal` 必须传播到 Host 操作;断开、取消和超时不得被 Adapter 转换为自动重试。
54
+ 7. 工具、路由、Skill 与 UI 注册必须可逆,并随对应宿主生命周期释放。
55
+ 8. 可选端口只能执行文档规定的降级;必需端口缺失必须立即失败,不得伪造成功结果。
56
+ 9. Host capability check、Doctor 和 Local Host fixture **不得自动产生新的远端媒体提交**,也不得把读取供应商密钥作为诊断输出。
57
+ 10. DSH 版本差异只能存在于 DSH Adapter/capability detection 和兼容 fixture;不得扩散到 Task、Provider 或通用 Command。
58
+
59
+ ## 错误与能力快照
60
+
61
+ `lib/host-contract.js` 提供:
62
+
63
+ - `defineHostAdapter()`:验证并冻结适配器描述,拒绝未知端口和原始 `ctx` 字段;
64
+ - `requireHostPort()`:缺失时抛出 `HostCapabilityError`;
65
+ - `IRIS_HOST_CAPABILITY_UNAVAILABLE`:宿主未提供能力;
66
+ - `IRIS_HOST_CAPABILITY_INCOMPATIBLE`:宿主存在相关服务但版本/形状不兼容;
67
+ - `hostCapabilitySnapshot()`:只输出宿主身份、版本和每项能力状态,不输出 live object。
68
+
69
+ `lib/host-runtime.js` 另记 Iris 自身成功完成的工具、Skill 和路由注册,以及客户端版本/Slot 握手;它不保存 `ctx`、service、会话、附件或密钥。
70
+
71
+ ## 0.1.4 实现顺序
72
+
73
+ 1. 以本契约和测试冻结名称、依赖方向与错误分类。
74
+ 2. 提供 test-only Local Host fixture,先运行本地确定性动作、任务查询与确认流程。(已完成;不等同于 standalone Host。)
75
+ 3. 从 `actions.js` 的真实消费者逐项替换 `ctx.get()`,不一次性搬迁全部目录。(已完成服务端消费者迁移;lint 禁止重新扩散。)
76
+ 4. 将 DSH 工具、路由、附件、会话、Browser、模型和 Skill 映射集中进 DSH Adapter。(已完成;客户端 Slot 使用 client bundle 内的最小 adapter。)
77
+ 5. Host Doctor 消费同一能力快照、成功注册账本与受限客户端握手,验证真实 DSH profile 的服务端与客户端装载。(已完成;见 [Host Doctor](HOST_DOCTOR.md)。)
78
+
79
+ Local Host fixture 不能假装拥有 Browser、会话或附件能力;需要什么就显式注入什么,缺失路径也必须纳入测试。
80
+
81
+ ## 非目标
82
+
83
+ - 0.1.4 不拆分 npm 多包,不发布第三方 Host SDK。
84
+ - 不启动 standalone 服务,不复制 DSH 聊天界面。
85
+ - 不实现 Artifact Manifest、Recipe/Flow 或完整 headless 命令集。
86
+ - 不新增 Gemini、Fal、Replicate,也不为尚无消费者的能力预建端口。
@@ -0,0 +1,47 @@
1
+ # Host Doctor
2
+
3
+ Host Doctor 是 Iris 在运行中的 DSH 实例内提供的兼容性诊断。它与 `dsh-iris doctor` 共用 schema、检查状态和 0/1/2 严重度,但观察范围不同:
4
+
5
+ | 模式 | 入口 | 观察范围 |
6
+ |---|---|---|
7
+ | `offline` | `dsh-iris doctor [--json]` | Node、依赖、私有存储、配置、Task 与产物;不要求 DSH |
8
+ | `host` | 已认证 DSH 中的 `GET /iris/api/doctor` | DSH 版本和 Host Port、插件装载、14 个工具、2 项 Skill、4 组路由、Browser/附件/模型能力、客户端版本与 4 个 UI Slot |
9
+
10
+ 两种模式都默认零网络、零计费。Host Doctor 不调用任何 Host Port,不打开 Browser,不读取附件或会话,不调用文本/视觉模型,也不向 Provider 发送请求。它只读取:
11
+
12
+ 1. DSH Host Adapter 的可序列化能力快照;
13
+ 2. Iris 服务端本进程内记录的成功注册事实;
14
+ 3. DSH Web 客户端在 Slot 回调实际执行后发送的受限同源握手。
15
+
16
+ ## 使用
17
+
18
+ 在 Iris 工作台的“宿主诊断”卡片中可以直接查看、刷新并展开全部检查。需要原始 JSON 时,先通过 DSH 输出的认证 URL 打开 Web 页面,再在同一实例访问:
19
+
20
+ ```text
21
+ /iris/api/doctor
22
+ ```
23
+
24
+ 这是工作台路由下的 JSON 端点,继承 Iris 路由的 Host/认证边界。HTTP 200 表示诊断成功生成,不代表所有检查健康;应读取响应中的 `exitCode`:
25
+
26
+ - `0`:当前可观察项全部健康;
27
+ - `1`:存在可降级警告,例如页面尚未打开、可选 Browser 缺失;
28
+ - `2`:存在硬错误,例如工具/路由缺失、DSH 超出已验证范围、客户端和服务端版本不一致。
29
+
30
+ 如果刚安装、热更新或强制刷新,先等 Web 页面完成装载,再刷新诊断。未收到客户端握手时,Host Doctor 只报告警告,不会把“服务端已装载”冒充成“UI 已装载”。
31
+
32
+ ## 运行时证据
33
+
34
+ 服务端只登记成功完成的注册:
35
+
36
+ - 插件身份与 npm 版本;
37
+ - 14 个 Iris Agent 工具名;
38
+ - `iris-verify-ui`、`iris-compose-media`;
39
+ - `/iris/media`、`/iris/api`、`/iris/api/actions`、`/iris/render` 四组逻辑路由。
40
+
41
+ 客户端通过 `POST /iris/api/host-client` 回报插件 ID、静态客户端版本、协议版本和已执行的 Slot 名单。接口拒绝额外字段、未知 Slot、错误插件身份、空版本和无效协议号;同一前端版本的并发报告只做 Slot 单调并集,避免乱序请求把完整证据覆盖成部分证据。报告只保存在内存,不参与认证、任务执行或能力授权,也不接收 API Key、草稿、会话、附件或 Provider 数据。
42
+
43
+ ## 能力与降级
44
+
45
+ Host Adapter 将每项端口标记为 `available`、`unavailable` 或 `incompatible`,并给出同一份人类可读原因。工具注册与 Web 路由是 DSH 插件形态的硬要求;Skill、Browser、附件、会话以及宿主文本/视觉模型可按功能降级。
46
+
47
+ 客户端握手是当前浏览器实例的最后报告。关闭页面后报告不会立刻证明页面仍存活,因此它是装载兼容性证据,不是在线心跳。Host Doctor 也不替代真实 Provider 探针;任何可能计费的测试仍必须由用户显式触发。
@@ -0,0 +1,97 @@
1
+ # Provider Adapter v0 生命周期契约
2
+
3
+ 状态:**v0.1.4 内部契约已实现。** 这是 Iris Core 候选模块与供应商协议实现之间的稳定边界,不是面向第三方承诺兼容性的公开 SDK。当前 DashScope 与 OpenAI Images 兼容实现已经通过同一套零网络 conformance runner。
4
+
5
+ ## 目标与依赖方向
6
+
7
+ ```text
8
+ Action / Task watcher / recovery / model discovery
9
+ │ canonical operation/result
10
+ ▼
11
+ provider-adapter.js
12
+ │
13
+ provider-adapters.js
14
+ │ injected transport
15
+ ▼
16
+ adapters.js
17
+ ```
18
+
19
+ - Action、Task 恢复、重新交付、模型发现和能力实测不得直接调用供应商生命周期 HTTP 方法。
20
+ - Provider Adapter 不创建或修改 Iris Task,不读取 DSH `ctx`,也不承担工作台展示。
21
+ - `adapters.js` 保留为协议级 HTTP transport;凭据和 `baseUrl` 仅由具体 Adapter 的操作闭包捕获。
22
+ - Adapter 快照只包含稳定身份、协议、能力与 supported/unsupported 事实,不包含 API Key、Authorization、私有 URL、配置对象或 live transport。
23
+
24
+ ## 描述结构
25
+
26
+ `defineProviderAdapter()` 只接受以下顶层字段:
27
+
28
+ ```js
29
+ {
30
+ contractVersion: 0,
31
+ id: 'stable-provider-id',
32
+ protocol: 'dashscope',
33
+ capabilities: ['image', 'video', 'tts', 'transcribe'],
34
+ operations: { discover, submit, poll, download, mapError },
35
+ unsupported: { cancel: '经过验证的原因' }
36
+ }
37
+ ```
38
+
39
+ 六个操作必须**恰好**出现在 `operations` 或 `unsupported` 之一。方法缺失不能被解释为临时故障;调用显式不支持的方法会得到稳定的 `IRIS_PROVIDER_OPERATION_UNSUPPORTED`。v0 要求所有 Adapter 实现 `submit` 与 `mapError`,其余操作可根据协议事实显式声明不支持。
40
+
41
+ ## 生命周期操作
42
+
43
+ | 操作 | 输入职责 | canonical 结果 |
44
+ |---|---|---|
45
+ | `discover` | 可选 signal/timeout | `{ models: [{ id, capabilities? }] }`,去空并按 ID 去重 |
46
+ | `submit` | capability、model、规范化 input、signal | `completed / accepted / not_accepted / acceptance_unknown` |
47
+ | `poll` | capability、remoteTaskId、signal | `pending / succeeded / failed / canceled / unknown` |
48
+ | `cancel` | remoteTaskId、signal | `canceled / not_supported / unknown` |
49
+ | `download` | remote-url artifact、目标路径、signal | `{ bytes }` |
50
+ | `mapError` | 原始错误与 stage/acceptance 上下文 | 可持久化的脱敏错误记录 |
51
+
52
+ `accepted` 不是独立网络操作,而是异步 `submit` 的受理结果。它必须携带非空远端任务 ID;同步成功使用 `completed`。四态提交和自动 failover 规则继续以 [Provider 提交契约 v0](PROVIDER_SUBMISSION_CONTRACT.md) 为准。
53
+
54
+ ## poll、cancel 与交付事实
55
+
56
+ `poll` 的终态不能互相折叠:
57
+
58
+ - `failed` 需要供应商明确的失败证据;
59
+ - `canceled` 需要远端确认,Task 才能写入 `cancelState=remote_confirmed`;
60
+ - `unknown` 只停止当前盯守并保留 `acceptance=accepted`,不得伪造失败或重提;
61
+ - `succeeded` 可以携带 remote-url artifacts 或文本 value,生成成功先于本地下载事实落盘。
62
+
63
+ `download` 只交付已经确认成功的远端产物。下载失败只能改变交付状态,不能触发生成重提。OpenAI Images 当前同步返回图片,所以 `poll` 与 `cancel` 显式 unsupported;DashScope 当前没有经过验证的远端取消接口,因此 `cancel` 同样显式 unsupported,而不是伪装取消成功。
64
+
65
+ 上传临时输入仍属于提交前准备阶段,不是 v0 六操作之一。上传失败必须记录为 `stage=upload / acceptance=not_accepted`;只有随后真正调用 `submit` 才跨越可能计费的受理边界。未来如出现第二种上传协议,再以真实调用方证据决定是否扩展契约。
66
+
67
+ ## 错误与取消传播
68
+
69
+ 所有操作接收可选 `AbortSignal`。底层发现、轮询、下载和提交 transport 必须把外部 signal 与自己的超时合并。错误映射只保留受控字段:
70
+
71
+ - stage、category、acceptance、retryable;
72
+ - 可选安全的 HTTP status/provider code;
73
+ - 已移除密钥、认证头、绝对路径和签名查询的 `safeMessage`。
74
+
75
+ `submit` 抛错由统一调用器转换成保守四态;`cancel` 抛错转换为 `unknown`;`discover/poll/download` 抛出脱敏的 `ProviderContractError`,由各自调用方应用重试和事实规则。
76
+
77
+ ## 当前内置实现
78
+
79
+ | 协议 | discover | submit | poll | cancel | download | mapError |
80
+ |---|---:|---:|---:|---:|---:|---:|
81
+ | DashScope | 支持 | 图片/视频/TTS/转写 | 图片/视频/转写 | 显式不支持 | 支持 | 支持 |
82
+ | OpenAI Images 兼容 | 支持 | 同步图片 | 显式不支持 | 显式不支持 | 支持 | 支持 |
83
+
84
+ 本表只描述协议生命周期,不扩大 0.1.4 的供应商范围。Gemini、Fal 与 Replicate 仍在 0.2.x 路线中。
85
+
86
+ ## conformance runner
87
+
88
+ 零网络 runner 位于 `tests/fixtures/provider-conformance.mjs`,并由 `tests/provider-adapters-conformance.mjs` 对内置实现执行。它验证:
89
+
90
+ 1. 快照可序列化且不含凭据;
91
+ 2. 六个操作全部被 supported/unsupported 记账;
92
+ 3. 每个 supported 操作都有 fixture 场景;
93
+ 4. unsupported 调用返回稳定错误;
94
+ 5. mapError 会清除 synthetic secret 与本地路径;
95
+ 6. 提交四态、轮询五态、下载字节数和协议特定能力符合契约。
96
+
97
+ runner 本身不访问网络;具体 Adapter 构造时注入 fake transport。新增 Provider 前,必须先通过同一 runner,再进行用户明确授权的真实供应商短验。0.1.4 不发布 Provider SDK,也不把测试 runner 当成第三方兼容性承诺。
@@ -0,0 +1,39 @@
1
+ # Provider 与能力健康状态
2
+
3
+ 状态:v0.1.4 候选契约。
4
+
5
+ Iris 用持久化证据描述“当前配置是否存在、最近是否实际成功、是否出现明确凭据失败”。它不是后台监控,也不等同于 Host Doctor。
6
+
7
+ ## 四种状态
8
+
9
+ | 状态 | 颜色 | 含义 |
10
+ |---|---|---|
11
+ | `unconfigured` | 灰色 | 当前能力没有启用且带凭据的候选模型 |
12
+ | `configured` | 蓝色 | 已配置,但没有 7 天内的成功证据;旧证据过期后也回到此状态 |
13
+ | `verified` | 绿色 | 该 Provider × Model × Capability 在 7 天内通过显式实测或真实任务成功 |
14
+ | `failed` | 暗红色 | 最近的决定性证据是 401、403 或明确的认证/权限失败 |
15
+
16
+ 状态按 `Provider × Model × Capability` 记录,不因同名模型而合并。模型、Key、Base URL、协议或能力模型等关键配置变化会清空相关旧证据;移除模型或能力标签也会移除不再成立的记录。
17
+
18
+ ## 什么会改变状态
19
+
20
+ 显式“模型实测”和正常用户任务都会产生证据。视觉、图片和 TTS 可从模型池逐项实测;视频与转写不会发送空样本探针,应使用真实的视频生成或音频转写任务验证。成功受理、同步完成或视觉成功会刷新绿色及其成功时间。
21
+
22
+ Iris 不做定时后台探测,也不会为了让图标变绿而产生隐形请求或费用。429/额度限制、网络错误、5xx、内容安全、用户取消和受理未知属于临时或不确定事实:它们可以记录为最近观察,但不会把 7 天内的绿色覆盖成红色。只有明确认证或权限失败才会变暗红;移除 API Key 后回到灰色。
23
+
24
+ ## failover 与泡泡汇总
25
+
26
+ 每项能力按当前有序 failover 候选汇总:
27
+
28
+ 1. 任一路候选为绿色,能力为绿色;
29
+ 2. 否则任一路为蓝色,能力为蓝色;
30
+ 3. 只有所有已配置候选都为暗红时,能力才为暗红;
31
+ 4. 没有候选时为灰色。
32
+
33
+ 主泡泡再按五项能力使用同一保守规则汇总。汇总证据时间只从决定汇总颜色的候选中选择,例如绿色不会显示另一条较新蓝色临时观察的时间。界面同时显示文字和证据时间,不要求用户只凭颜色判断。
34
+
35
+ ## 与诊断的区别
36
+
37
+ Host Doctor 只检查 DSH、Iris 注册、Host Port、客户端版本和 UI Slot 是否装载;它零网络、零计费,不能证明 API Key 或具体模型可用。Provider 健康来自模型实测和真实业务请求,才回答供应商侧是否近期成功。离线 `dsh-iris doctor` 则检查本地运行时、配置、存储与任务一致性,三者不能互相替代。
38
+
39
+ 健康事实保存在 `$DSH_HOME/iris/v1/providers.json`,状态 API 仅返回脱敏标量。错误说明会移除 Authorization、Key、签名参数、私有路径和已配置的完整 API Key。
@@ -1,6 +1,6 @@
1
1
  # Iris Provider 提交契约 v0
2
2
 
3
- 状态:**v0.1.3 最小内部契约,已覆盖现有生成能力。** 图片、视频、转写与 TTS 均执行本契约;完整 discovery、poll、cancel、download conformance 留到 v0.1.4。
3
+ 状态:**v0.1.3 最小提交契约已实现;v0.1.4 已纳入完整 Provider Adapter v0。** 图片、视频、转写与 TTS 均执行本契约;discovery、poll、cancel、download 与 error mapping 见 [完整生命周期契约](PROVIDER_ADAPTER_CONTRACT.md)。
4
4
 
5
5
  ## 提交结果
6
6
 
@@ -57,4 +57,4 @@ Provider `submit()` 必须返回以下四种结构之一:
57
57
 
58
58
  429 等可证明未创建任务的明确 4xx 拒绝可进入下一候选;408、409、425、499、5xx、网络异常、超时和成功响应缺少必要结果一律停止并记录 `acceptance=unknown`。同步生成已经成功后,下载或落盘失败记录为 `outcome=succeeded / deliveryState=failed`,不会重新生成。
59
59
 
60
- 视频、转写与 TTS 也已使用相同边界:视频和转写分别持久化 `prepare/upload/submit` stage,上传失败只表示生成请求未受理;TTS 同步成功则先记 `completed/accepted` 再交付音频。工作台已经消费稳定的人类状态,并提供重新观察、重新交付、提醒已读/恢复和需确认费用的知情重试;v0.1.4 再完成 discovery、poll、cancel、download 等完整 Provider conformance。
60
+ 视频、转写与 TTS 也使用相同边界:视频和转写分别持久化 `prepare/upload/submit` stage,上传失败只表示生成请求未受理;TTS 同步成功则先记 `completed/accepted` 再交付音频。工作台消费稳定的人类状态,并提供重新观察、重新交付、提醒已读/恢复和需确认费用的知情重试。v0.1.4 已将 discovery、submit、poll、cancel、download 与 error mapping 收口到统一 Adapter,并由零网络 conformance runner 覆盖现有 DashScope/OpenAI Images 路径。
package/docs/ROADMAP.md CHANGED
@@ -14,10 +14,11 @@ dsh-iris 已具备媒体生成、视觉处理和任务管理主流程。长期
14
14
  - 多供应商模型池与复合模型身份
15
15
  - 浏览器上传、会话附件和宿主路径输入
16
16
  - 异步任务恢复、取消传播、SSE 状态更新和授权媒体链接
17
+ - 独立作品库 v0:清任务历史后仍可浏览媒体,并可重新索引旧 `outputs/`
17
18
  - 面向 Agent 与用户的统一视频生成实现
18
19
  - 两个随包 Agent Skills:UI 视觉验收与多步骤媒体编排;0.1.2 会在插件启用时自动注册
19
20
 
20
- 当前发布版本为 `v0.1.2`。0.1.1 完成配置独立、安全与工程收口,并把 Web loader 适配固定到已验证的 DSH `0.1.2-rc.1` 接口;更高预览版在进入支持范围前需要重新运行宿主 canary。
21
+ 当前发布版本为 `v0.1.3`。0.1.1 完成配置独立、安全与工程收口,并把 Web loader 适配固定到已验证的 DSH `0.1.2-rc.1` 接口;0.1.4 把已验证支持窗口扩展为 `>=0.1.2-rc.1 <0.1.3-0` 与 `0.1.5-rc.1`,其余预览版在进入支持范围前仍需重新运行宿主 canary。
21
22
 
22
23
  ## 已完成:0.1.1
23
24
 
@@ -45,18 +46,27 @@ dsh-iris 已具备媒体生成、视觉处理和任务管理主流程。长期
45
46
 
46
47
  ## 下一步
47
48
 
48
- ### 当前发行候选 0.1.3:可信任务与适配边界
49
+ ### 已完成:0.1.3 可信任务
49
50
 
50
- - 图片、视频、转写与 TTS 已区分未受理、已受理与受理未知,并使用一个 Task、多 Attempt、独立观察/交付/取消事实;规范见[Task/Attempt v2 语义契约](TASK_SEMANTICS.md)。
51
- - 零网络故障矩阵已覆盖提交响应丢失、受理后持久化失败、轮询耗尽、取消未知、各阶段重启、下载/落盘、上传残留、SSE 慢消费者与人工接管;证据见[故障注入矩阵](FAULT_INJECTION.md)。
52
- - 最小 Provider 提交契约和 Core 依赖守卫已冻结;完整 Host Adapter 和 Provider conformance 顺延到 0.1.4,避免把可靠性修复变成大重构。
53
- - 离线 `doctor()`、`dsh-iris doctor [--json]`、[架构](ARCHITECTURE.md)与[安全边界](SECURITY.md)已经提供;依赖 DSH 运行时的扩展诊断顺延到 0.1.4。
54
- - 在具备稳定录制条件后补充真实短视频证据;不以伪造或不稳定链接阻塞 0.1.2。
51
+ - 图片、视频、转写与 TTS 已接入 Task/Attempt v2;只有明确未受理才允许自动 failover。
52
+ - 零网络故障矩阵已覆盖受理未知、轮询耗尽、取消、重启、交付、SSE 与人工接管。
53
+ - 提供重新观察、重新交付、提醒已读/恢复和知情重试,并防止重复提醒与错误旧任务标记。
54
+ - 提供零网络离线 Doctor、公开任务/架构/安全契约,以及 Linux/Windows CI 与 Android 真机短验。
55
+
56
+ ### 当前开发:0.1.4 适配边界与 Agent 易用性
57
+
58
+ - 冻结 [Host Adapter v0](HOST_ADAPTER_CONTRACT.md) 与 Command × Host Port 矩阵,提供无 DSH 的 Local Host fixture;DSH Adapter 已收口工具、路由、附件、会话、Browser、模型、Skill 与客户端 Slot 消费者,并通过 `0.1.2-rc.1` 隔离 canary 与 `0.1.5-rc.1` 日常宿主实测。
59
+ - 已实现 [Provider Adapter v0 完整生命周期](PROVIDER_ADAPTER_CONTRACT.md) 和零网络 conformance runner;现有 DashScope/OpenAI Images 兼容实现、Task 恢复与重新交付均消费统一契约,本版不新增 Provider。
60
+ - 已实现 [Host Doctor](HOST_DOCTOR.md):观察插件、14 个工具、2 项 Skill、4 组路由、Browser/附件/模型能力、客户端版本与 UI Slot;只读取安全快照和注册证据,默认零网络、零计费。
61
+ - 已实现 [Provider 与能力健康状态](PROVIDER_HEALTH.md):按 Provider × Model × Capability 持久化实测/真实任务证据,以灰、蓝、绿、暗红四色及时间呈现,并按当前 failover 候选保守汇总;不增加后台探测。
62
+ - 深化现有 `iris-verify-ui`、`iris-compose-media` 两项 Skill:对齐 Task v2、增加显式调用示例、渐进资源与行为 eval;不以增加 Skill 数量为目标。
63
+ - 增加最小作品库索引,但继续采用渐进迁移;本版不引入完整 Artifact Manifest、standalone 服务、完整 headless 命令集或大规模目录重写。
55
64
 
56
65
  ### 0.2.0:独立 Core 与产物记录
57
66
 
58
67
  - 统一 Agent、工作台与 CLI 的命令执行核心,将 DSH 集成集中到宿主适配器。
59
- - 为产物保存内容哈希、来源和派生关系,支持检查与导出。
68
+ - 将作品库 v0 升级为经安全评审的 Artifact Manifest,为产物保存内容哈希、来源和派生关系,支持检查与导出。
69
+ - 在完整 Manifest 上增加收藏、标签、搜索、筛选和批量导出,不把这些字段塞回任务历史。
60
70
  - 在未安装 DSH 的干净环境完成本地动作和供应商任务验收。
61
71
  - 建立 Iris 正式产品视觉身份:以简约鸢尾花和泡泡为核心母题,完成可缩放 Logo、图标、单色版与深浅色适配,并替换临时字标。
62
72
  - 在统一 Provider Adapter 与 conformance 测试稳定后,依次接入 Gemini、Fal,并把 Replicate 排入后续 0.2.x。
package/docs/SECURITY.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Iris 安全边界
2
2
 
3
- 状态:v0.1.3 当前实现。安全目标是避免凭据泄露、路径越权、跨站写入和因错误重试造成重复计费;Iris 与 DSH 仍是本机同一信任域内的预览软件,不构成多租户安全边界。
3
+ 状态:v0.1.4 候选实现。安全目标是避免凭据泄露、路径越权、跨站写入和因错误重试造成重复计费;Iris 与 DSH 仍是本机同一信任域内的预览软件,不构成多租户安全边界。
4
4
 
5
5
  ## 信任模型
6
6
 
@@ -15,6 +15,8 @@
15
15
 
16
16
  API、SSE 和 Doctor 只返回凭据存在性或掩码提示。Provider 错误会移除 Bearer token、常见 Key、签名查询参数、堆栈和私有绝对路径。不要把 `providers.json`、环境变量或含签名的临时 URL 上传到 Issue。
17
17
 
18
+ 健康证据与供应商配置同存于 `providers.json`,只保存模型、能力、时间、来源、错误分类、可选 HTTP 状态和脱敏短说明;状态 API 不返回完整 Key。关键凭据、端点或协议变化会清空旧证据,避免把另一组配置的成功错误沿用为当前事实。
19
+
18
20
  `ai-paint` 是维护者未公开的本地前身,不是用户依赖。Iris 只有在用户显式设置 `IRIS_IMPORT_WORKBENCH_CONFIG` 为绝对路径且自身配置为空时才做一次性导入,不扫描其他项目,也不回写来源文件。
19
21
 
20
22
  ## 受理与费用安全
@@ -26,13 +28,15 @@ API、SSE 和 Doctor 只返回凭据存在性或掩码提示。Provider 错误
26
28
  - “知情重试”必须单独确认可能重复任务或重复计费,并创建带 `retryOf/manualRetries` 关系的新 Task。创建后只归档原提醒,不改写原任务的未知事实;当前只对能从安全记录无损重建的文生图和文生视频开放,文件型输入和截断文本要求用户从原始输入重新发起。
27
29
  - “标为已读/恢复提醒”只操作有界的本地 `attentionEvents` 审计元数据,不发送网络请求,也不把用户处置等同于供应商已经受理。
28
30
  - Iris 当前没有凭空假设 DashScope 的远端取消协议。停止本地观察后若远端结果无法确认,状态保持 unknown。
31
+ - Provider 健康不做后台探测。只有 401、403 或明确认证/权限分类可变为暗红;429、网络、5xx、内容安全、取消与未知受理不得覆盖近期成功或授权自动重提。
29
32
 
30
33
  ## 文件、上传与媒体访问
31
34
 
32
35
  - 浏览器上传使用大小上限、随机文件名、`.part` 临时文件和完成后的原子改名;中断时清理临时文件,过期副本按 TTL 回收。
33
36
  - 输出文件名由 Iris 生成或通过 `basename` 收口,API 不返回宿主绝对路径。
34
37
  - 媒体播放链接使用随机能力令牌。令牌应视为临时访问凭据,不应发布到公网。
35
- - 清理任务元数据默认不删除产物;删除孤儿产物需要独立确认。
38
+ - 清理任务元数据默认不删除作品;独立作品索引不保存 Prompt、Provider、Model 或任务关系。
39
+ - 删除单件作品、清空作品库或删除真正的孤儿文件都需要独立确认。作品删除会保留任务历史,但旧媒体链接将失效。
36
40
  - 符号链接不会被私有树权限收紧逻辑跟随。Doctor 会把 Iris 数据根为符号链接视为硬错误。
37
41
 
38
42
  ## Web 与渲染
@@ -1,6 +1,6 @@
1
1
  # Iris Task/Attempt v2 语义契约
2
2
 
3
- 状态:**v0.1.3 已实现。** Task v2 已覆盖图片、视频、转写与 TTS,包括同步/异步、上传/提交、混合协议候选、工作台稳定用户态、状态流防倒退、重新观察、重新交付、提醒已读/恢复和知情人工重试。正式 Artifact Manifest、完整 Provider/Host Adapter 和宿主扩展诊断仍属于后续版本。
3
+ 状态:**v0.1.3 已实现;v0.1.4 Host/Provider Adapter、Host Doctor 与作品库 v0 已接入。** Task v2 已覆盖图片、视频、转写与 TTS,包括同步/异步、上传/提交、混合协议候选、工作台稳定用户态、状态流防倒退、重新观察、重新交付、提醒已读/恢复和知情人工重试。作品库 v0 只分离本地作品生命周期;正式 Artifact Manifest 仍属于后续工作。
4
4
 
5
5
  ## 1. 为什么需要 v2
6
6
 
@@ -94,6 +94,7 @@ Task v2 至少包含以下事实轴;字段值采用可序列化的 snake_case
94
94
  - 交付失败只允许重新下载/落盘,不允许重新生成。
95
95
  - 只有本地产物完成原子落盘并可读后,才写 `deliveryState=ready`。
96
96
  - 供应商明确返回生成失败时才写 `outcome=failed`。
97
+ - 任务历史与本地作品是两个生命周期:删除终态任务不得隐式删除作品,删除作品也不得改写任务事实;媒体是否仍可访问由作品库单独呈现。
97
98
 
98
99
  ## 7. 观察、超时与恢复
99
100
 
@@ -143,5 +144,5 @@ Task v2 至少包含以下事实轴;字段值采用可序列化的 snake_case
143
144
 
144
145
  - 不在语义冻结阶段重写全部任务存储或 UI。
145
146
  - 不新增 Gemini、Fal、Replicate 等供应商分支。
146
- - v0.1.3 包含零网络、可独立运行的离线 Doctor v0 与最薄 CLI;依赖 DSH `ctx` 的宿主扩展诊断、完整 Host Adapter 和 Artifact Manifest 不属于本版。
147
+ - v0.1.3 包含零网络、可独立运行的离线 Doctor v0 与最薄 CLI;v0.1.4 已接入 Host/Provider Adapter、Host Doctor 和不含谱系的作品库 v0。完整 Artifact Manifest 仍属于后续版本。
147
148
  - 不用更多自动重试换取表面成功率。
@@ -31,8 +31,8 @@
31
31
  <text x="590" y="170" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="14.5" font-weight="600" fill="#1f2328">GUI 动作卡</text>
32
32
  <text x="590" y="190.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">会话内的 Iris 操作入口</text>
33
33
  <rect x="790" y="138" width="290" height="72" rx="9" fill="#f5f6f8" stroke="#b9c2ce" stroke-width="1.6"/>
34
- <text x="935" y="170" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="14.5" font-weight="600" fill="#1f2328">Iris 工作台(三座位)</text>
35
- <text x="935" y="190.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">设置 · 进度 · 悬浮泡泡</text>
34
+ <text x="935" y="170" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="14.5" font-weight="600" fill="#1f2328">Iris 工作台(四座位)</text>
35
+ <text x="935" y="190.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">设置 · 进度 · 悬浮泡泡 · 提示词优化</text>
36
36
  <rect x="200" y="268" width="540" height="74" rx="9" fill="#eef3ff" stroke="#4d6bfe" stroke-width="1.6"/>
37
37
  <text x="470" y="301" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="14.5" font-weight="600" fill="#1f2328">统一动作层 · lib/actions.js</text>
38
38
  <text x="470" y="321.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">参数校验 · 输入解析(上传 / 会话附件 / 宿主路径)· failover 编排</text>
@@ -46,8 +46,8 @@
46
46
  <text x="236" y="557" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="14.5" font-weight="600" fill="#1f2328">任务系统 · lib/tasks.js</text>
47
47
  <text x="236" y="577.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">异步轮询 · 重启恢复 · 取消传播</text>
48
48
  <rect x="430" y="524" width="300" height="74" rx="9" fill="#eaf7ef" stroke="#2e9e5b" stroke-width="1.6"/>
49
- <text x="580" y="557" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="14.5" font-weight="600" fill="#1f2328">文件与媒体 · lib/media.js</text>
50
- <text x="580" y="577.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">uploads/ outputs/ · 令牌媒体链接 · Range 流式</text>
49
+ <text x="580" y="557" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="14.5" font-weight="600" fill="#1f2328">媒体与作品 · media.js + artifacts.js</text>
50
+ <text x="580" y="577.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">独立索引 · 令牌链接 · Range 流式</text>
51
51
  <rect x="790" y="524" width="290" height="74" rx="9" fill="#eef3ff" stroke="#4d6bfe" stroke-width="1.6"/>
52
52
  <text x="935" y="557" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="14.5" font-weight="600" fill="#1f2328">Web 客户端 · lib/client.js</text>
53
53
  <text x="935" y="577.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">三座位 UI · 共享状态订阅 + SSE</text>
@@ -56,7 +56,7 @@
56
56
  <text x="935" y="321.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">随包注册 iris-verify-ui / iris-compose-media</text>
57
57
  <rect x="66" y="690" width="470" height="56" rx="8" fill="#ffffff" stroke="#b9c2ce" stroke-width="1.3" stroke-dasharray="5 4"/>
58
58
  <text x="301" y="714" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="14.5" font-weight="600" fill="#1f2328">本地数据 · $DSH_HOME/iris/v1/</text>
59
- <text x="301" y="734.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">providers.json · tasks.json · uploads/ · outputs/(POSIX 0700 / 0600)</text>
59
+ <text x="301" y="734.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">providers.json · tasks.json · artifacts.json · uploads/ · outputs/</text>
60
60
  <rect x="580" y="706" width="560" height="64" rx="9" fill="#f5f6f8" stroke="#b9c2ce" stroke-width="1.6"/>
61
61
  <text x="860" y="734" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="14.5" font-weight="600" fill="#1f2328">媒体 / 视觉服务商</text>
62
62
  <text x="860" y="754.5" text-anchor="middle" font-family="'PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Noto Sans SC','Microsoft YaHei',sans-serif" font-size="12" font-weight="400" fill="#5b6472">DashScope 百炼 · OpenAI Images 兼容服务(凭据只发往官方 HTTPS 域名)</text>