@mokuyoaxis/dsh-iris 0.1.2 → 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 (54) 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 +57 -2
  8. package/README.en.md +43 -7
  9. package/README.md +43 -7
  10. package/bin/dsh-iris.js +23 -0
  11. package/docs/ARCHITECTURE.md +95 -0
  12. package/docs/ARTIFACT_LIBRARY.md +24 -0
  13. package/docs/FAULT_INJECTION.md +26 -0
  14. package/docs/HOST_ADAPTER_CONTRACT.md +86 -0
  15. package/docs/HOST_DOCTOR.md +47 -0
  16. package/docs/PROVIDER_ADAPTER_CONTRACT.md +97 -0
  17. package/docs/PROVIDER_HEALTH.md +39 -0
  18. package/docs/PROVIDER_SUBMISSION_CONTRACT.md +60 -0
  19. package/docs/ROADMAP.md +21 -11
  20. package/docs/SECURITY.md +57 -0
  21. package/docs/TASK_SEMANTICS.md +148 -0
  22. package/docs/assets/diagrams/iris-architecture.png +0 -0
  23. package/docs/assets/diagrams/iris-architecture.svg +5 -5
  24. package/docs/releases/0.1.4.md +59 -0
  25. package/lib/actions.js +860 -290
  26. package/lib/adapters.js +7 -7
  27. package/lib/api.js +110 -18
  28. package/lib/artifacts.js +239 -0
  29. package/lib/bundled-skills.js +5 -5
  30. package/lib/client.js +478 -68
  31. package/lib/config.js +192 -9
  32. package/lib/doctor.js +414 -0
  33. package/lib/dsh-host-adapter.js +189 -0
  34. package/lib/host-contract.js +131 -0
  35. package/lib/host-runtime.js +156 -0
  36. package/lib/index.js +142 -157
  37. package/lib/locate.js +1 -1
  38. package/lib/media.js +16 -6
  39. package/lib/prompt-optimizer.js +10 -20
  40. package/lib/provider-adapter.js +371 -0
  41. package/lib/provider-adapters.js +279 -0
  42. package/lib/provider-contract.js +234 -0
  43. package/lib/provider-health.js +59 -0
  44. package/lib/render.js +43 -12
  45. package/lib/task-semantics.js +209 -0
  46. package/lib/tasks.js +500 -32
  47. package/lib/vision.js +23 -49
  48. package/package.json +19 -8
  49. package/user_guide.md +62 -2
  50. package/docs/assets/diagrams/iris-architecture.drawio +0 -1
  51. package/docs/assets/diagrams/iris-task-lifecycle.drawio +0 -1
  52. package/docs/assets/diagrams/iris-workflow-compose.drawio +0 -1
  53. package/docs/releases/0.1.1.md +0 -51
  54. package/docs/releases/0.1.2.md +0 -26
@@ -0,0 +1,148 @@
1
+ # Iris Task/Attempt v2 语义契约
2
+
3
+ 状态:**v0.1.3 已实现;v0.1.4 Host/Provider Adapter、Host Doctor 与作品库 v0 已接入。** Task v2 已覆盖图片、视频、转写与 TTS,包括同步/异步、上传/提交、混合协议候选、工作台稳定用户态、状态流防倒退、重新观察、重新交付、提醒已读/恢复和知情人工重试。作品库 v0 只分离本地作品生命周期;正式 Artifact Manifest 仍属于后续工作。
4
+
5
+ ## 1. 为什么需要 v2
6
+
7
+ 媒体生成可能在供应商侧产生费用。网络断开并不能证明请求没有被受理,轮询失败也不能证明远端任务失败,下载失败更不能抹掉已经成功的生成结果。Iris 必须分别记录“有没有提交”“供应商是否受理”“远端结果是什么”“是否仍在观察”“产物是否已取回”和“取消是否得到确认”。
8
+
9
+ 本契约使用以下规范词:**必须**表示不可违反的安全或事实约束;**应该**表示除非有记录充分的理由,否则需要遵守;**可以**表示可选行为。
10
+
11
+ ## 2. 核心对象
12
+
13
+ - **Task**:一次用户意图。无论尝试过多少供应商,一个用户请求只能创建一个 Task。
14
+ - **Attempt**:Task 针对一个 `providerId::modelId` 的一次提交尝试。Attempt 必须在可能发送计费请求前持久化。
15
+ - **受理证据**:远端任务 ID、同步成功响应,或供应商明确声明已受理的其他稳定标识。
16
+ - **观察**:对已受理远端任务进行轮询或恢复接管,不等同于再次提交。
17
+ - **交付**:把远端结果下载、校验并原子保存为 Iris 本地产物。
18
+
19
+ Task 与 Attempt 使用稳定 ID。Attempt 的 `model` 与 Task 的权威 `modelRef` 必须保存复合身份 `providerId::modelId`;迁移期 Task 仍可额外保留裸 `model` 供 v0.1.2 UI 读取,但新逻辑不得以该兼容字段判断模型身份。
20
+
21
+ ## 3. 正交状态
22
+
23
+ Task v2 至少包含以下事实轴;字段值采用可序列化的 snake_case 英文枚举:
24
+
25
+ | 字段 | 值 | 含义 |
26
+ |---|---|---|
27
+ | `phase` | `queued` · `submitting` · `accepted` · `running` · `terminal` | Iris 当前是否还会自动推进该任务 |
28
+ | `acceptance` | `none` · `not_accepted` · `accepted` · `unknown` | 当前/最终 Attempt 的远端受理事实 |
29
+ | `watchState` | `idle` · `active` · `suspended` · `exhausted` | Iris 是否仍在观察远端任务 |
30
+ | `outcome` | `none` · `succeeded` · `failed` · `canceled` · `unknown` | 远端生成或确定性本地动作的结果 |
31
+ | `deliveryState` | `none` · `pending` · `downloading` · `ready` · `failed` | 成功结果是否已经可靠落成本地产物 |
32
+ | `cancelState` | `none` · `requested` · `remote_confirmed` · `local_confirmed` · `unknown` | 取消请求及其确认边界 |
33
+
34
+ `status` 仅为旧消费者保留,不再是真相来源。新代码必须读取上述字段。
35
+
36
+ ### 3.1 旧 `status` 的保守派生
37
+
38
+ | v2 事实 | 旧 `status` |
39
+ |---|---|
40
+ | `outcome=succeeded` 且 `deliveryState=ready` | `succeeded` |
41
+ | `outcome=failed` | `failed` |
42
+ | `outcome=canceled` 且取消已由远端或确定性本地动作确认 | `canceled` |
43
+ | 其余,包括受理未知、观察耗尽和交付失败 | `running` |
44
+
45
+ 四态旧字段无法无损表达“需要人工处理”。派生时宁可保持非终态,也不得伪造失败、成功或取消。现代 UI 必须使用 v2 事实轴。
46
+
47
+ ## 4. 受理与自动 failover
48
+
49
+ 自动 failover 的许可只由受理事实决定:
50
+
51
+ | `acceptance` | 允许自动切换 Provider | 说明 |
52
+ |---|---:|---|
53
+ | `none` | 否 | 尚未形成最终分类,必须先收敛为明确状态 |
54
+ | `not_accepted` | 是 | 已确认计费/生成请求没有被供应商受理 |
55
+ | `accepted` | 否 | 已有受理证据,再次提交可能重复计费 |
56
+ | `unknown` | 否 | 请求可能已经被受理,必须保守停止 |
57
+
58
+ 以下信息都**不能**单独授权自动 failover:`retryable=true`、HTTP 429/500、超时、连接重置、JSON 解析失败、轮询失败、下载失败、本地持久化失败或事件发布失败。
59
+
60
+ ### 4.1 分类规则
61
+
62
+ - 本地参数校验失败、请求发送前明确中止,或供应商明确拒绝且确认未创建任务:`not_accepted`。
63
+ - 收到远端任务 ID、同步成功响应或等价证据:`accepted`。
64
+ - 请求可能已经离开本机,但响应在获得受理证据前丢失:`unknown`。
65
+ - 无法证明“未受理”时,必须选择 `unknown`,不得为了可用性猜测 `not_accepted`。
66
+
67
+ 如果供应商支持幂等键,Attempt 应记录并复用该键;幂等能力可以帮助查询或安全恢复,但在未经合约证明前,不能把“发了幂等键”等同于“可以随意重试”。
68
+
69
+ 最小 Provider 返回结构、写前/写后 Hook 和错误字段详见[Provider 提交契约 v0](PROVIDER_SUBMISSION_CONTRACT.md)。
70
+
71
+ ## 5. Attempt 写前记录
72
+
73
+ 每次 Attempt 必须在可能发送生成请求前至少保存:
74
+
75
+ ```json
76
+ {
77
+ "id": "attempt_...",
78
+ "ordinal": 1,
79
+ "providerId": "provider-a",
80
+ "model": "provider-a::model-a",
81
+ "acceptance": "none",
82
+ "stage": "preparing",
83
+ "idempotencyKey": "optional-provider-key",
84
+ "startedAt": "2026-09-06T00:00:00.000Z"
85
+ }
86
+ ```
87
+
88
+ 上传临时输入与提交生成任务必须是不同 stage。上传成功并不等于生成请求已受理;但上传、提交和响应解析的错误证据都必须保留为脱敏分类,而不是一段不可机读的字符串。
89
+
90
+ ## 6. 远端结果与产物交付
91
+
92
+ - 远端返回成功后立即记录 `outcome=succeeded`,然后进入 `deliveryState=pending/downloading`。
93
+ - 下载、校验或本地落盘失败时,保持 `outcome=succeeded`,写入 `deliveryState=failed`。
94
+ - 交付失败只允许重新下载/落盘,不允许重新生成。
95
+ - 只有本地产物完成原子落盘并可读后,才写 `deliveryState=ready`。
96
+ - 供应商明确返回生成失败时才写 `outcome=failed`。
97
+ - 任务历史与本地作品是两个生命周期:删除终态任务不得隐式删除作品,删除作品也不得改写任务事实;媒体是否仍可访问由作品库单独呈现。
98
+
99
+ ## 7. 观察、超时与恢复
100
+
101
+ - 单次或连续轮询失败只改变观察事实;不得据此写 `outcome=failed`。
102
+ - 达到本地盯守上限时写 `watchState=exhausted`,结果通常为 `outcome=unknown`。
103
+ - 插件关闭或进程退出导致观察停止时,应保留可恢复信息;重启只能恢复观察,不能重新提交已受理或受理未知的 Attempt。
104
+ - `accepted` 的异步 Attempt 若供应商配置暂不可用,应进入 `watchState=suspended` 并给出修复建议,不能伪造远端失败。
105
+ - `unknown` 且没有远端任务 ID 时,只能等待供应商查询能力、幂等查询或用户知情决策。
106
+
107
+ ## 8. 取消
108
+
109
+ - 用户请求取消时先写 `cancelState=requested`。
110
+ - 供应商明确确认取消后,写 `cancelState=remote_confirmed` 与 `outcome=canceled`。
111
+ - 纯本地、尚未产生远端副作用的动作确定停止后,可以写 `cancelState=local_confirmed` 与 `outcome=canceled`。
112
+ - 仅停止本地轮询不等于远端取消。
113
+ - 取消请求超时、断网、供应商不支持取消或结果无法确认时,写 `cancelState=unknown`;`outcome` 也不得伪造为 `canceled`。
114
+
115
+ ## 9. 错误与隐私
116
+
117
+ 结构化错误至少应区分 stage、category、HTTP 状态、供应商错误码、受理状态和可安全展示的信息。任务、Attempt、事件与日志不得保存 API Key、Authorization 头、完整请求体、私有绝对路径或带临时签名的结果 URL。
118
+
119
+ 错误是否“可重试”与是否“允许自动重新提交”是两个不同问题。前者描述技术性质,后者只能由 `acceptance=not_accepted` 授权。
120
+
121
+ ## 10. 事件与 UI
122
+
123
+ - 每次 Task v2 持久化变更得到单调递增的 Task `revision`。完整状态快照另带进程 `stateEpoch/stateRevision`;客户端拒绝同一 epoch 内迟到的旧快照,SSE 重连后以持久化全量快照收敛。
124
+ - SSE 慢消费者进入背压时只保留最新待发快照,避免旧状态排队造成内存增长或视觉倒退。
125
+ - UI 应把事实映射成“排队中、运行中、观察暂停、需要确认、结果待取回、已完成、明确失败、已取消”等人类状态,不应在手机界面直接堆叠所有内部字段。
126
+ - `acceptance=unknown`、`cancelState=unknown` 和 `deliveryState=failed` 必须提供明确的人工接管入口;任何可能再次计费的操作都需要单独确认。
127
+ - 提醒处置与任务事实正交:标为已读只把任务移出主动提醒队列,恢复提醒只重新开放该队列;两者都不得修改受理、观察、结果、交付或取消事实。
128
+ - 知情重试创建并关联新 Task 后,原提醒自动记录为“已通过重试处理”。原任务保留原始未知事实和审计记录,但不继续产生重复角标;用户可从历史详情恢复提醒。
129
+
130
+ ## 11. 兼容与迁移
131
+
132
+ - v0.1.x 只允许向现有 JSON 记录增加字段,不执行破坏性批量迁移,不顺带引入 SQLite/JSONL。
133
+ - 旧记录缺少 v2 字段时,由纯兼容规范化器生成内存视图:既有成功记录保留成功证据;转存失败映射为远端成功但交付失败;轮询失败、无远端 ID 的运行记录和旧取消记录映射到 `unknown`,不能猜测失败、未受理或远端已取消。
134
+ - 读取旧任务不应立即重写整个文件;只有真实更新发生时才按原子写规则保存扩展后的记录。
135
+ - 在 v2 UI 和消费者完成迁移前继续输出派生 `status`。
136
+
137
+ ## 12. 必须通过的故障证据
138
+
139
+ 故障注入至少覆盖:请求发送前失败、提交响应丢失、获得远端 ID 后本地落盘失败、轮询 429/500/超时、远端成功后下载失败、取消响应丢失,以及 `submitting/accepted/running` 阶段的进程退出与恢复。
140
+
141
+ 每个场景必须同时断言最终事实字段和供应商提交调用次数。对于 `accepted` 或 `unknown`,自动重复提交次数必须为 **0**。
142
+
143
+ ## 13. 本版非目标
144
+
145
+ - 不在语义冻结阶段重写全部任务存储或 UI。
146
+ - 不新增 Gemini、Fal、Replicate 等供应商分支。
147
+ - v0.1.3 包含零网络、可独立运行的离线 Doctor v0 与最薄 CLI;v0.1.4 已接入 Host/Provider Adapter、Host Doctor 和不含谱系的作品库 v0。完整 Artifact Manifest 仍属于后续版本。
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>
@@ -0,0 +1,59 @@
1
+ ## Iris Media for DSH 0.1.4
2
+
3
+ Iris 0.1.4 is an architecture and operability release. It puts explicit host and provider boundaries around the plugin, deepens the two bundled agent Skills, and adds compatibility diagnostics for a running DSH instance. It does not add a new media provider and it does not introduce a standalone server.
4
+
5
+ ### Highlights
6
+
7
+ - Adds an internal Host Adapter v0 with nine named ports for tools, routes, client slots, Skills, attachments, sessions, Browser, text models, and vision models. Core candidates and shared commands no longer receive a raw DSH context.
8
+ - Adds deterministic Local Host fixtures that run local image operations and Task recovery flows without installing DSH, and that fail predictably when a port is missing.
9
+ - Adds Provider Adapter v0 for the full lifecycle: discovery, submission, acceptance, polling, cancellation, download, and error mapping. DashScope and the OpenAI Images compatibility path pass the same zero-network conformance runner, and every operation is explicitly supported or unsupported.
10
+ - Adds Host Doctor to the Iris workbench and to the authenticated `GET /iris/api/doctor` endpoint. It reports the DSH version, plugin identity, 14 tools, two Skills, four route groups, optional host capabilities, server and client versions, and four UI slots without leaving the process.
11
+ - Adds persistent provider x model x capability health evidence. Gray means unconfigured, blue means configured but unverified or stale, green means a success within the last seven days, and muted red is reserved for explicit authentication or permission failures.
12
+ - Treats real task success and explicit per-model probes as the same evidence source, shows the evidence time, invalidates evidence on critical configuration or model-capability changes, and aggregates ordered failover paths conservatively. Aggregate timestamps come only from the candidates that determine the displayed state.
13
+ - Adds Work Library v0. New media is indexed independently of task history, existing `outputs/` are adopted on upgrade, the workbench shows a paginated mobile-friendly grid, and the floating bubble reads recent works from the same durable index.
14
+ - Separates cleanup semantics: clearing terminal tasks keeps works visible, re-indexing recovers local media, and deleting one work, clearing the library, and purging true orphan files remain three distinct confirmed actions.
15
+ - Deepens the bundled `iris-verify-ui` and `iris-compose-media` Skills with an explicit user and model invocation policy, DSH slash-command examples, progressive references, Task v2 stopping rules, and ten zero-cost behavioral contracts.
16
+ - Tightens the floating bubble for narrow mobile viewports, handles pointer cancellation, and adds a runtime component-tree smoke test that mounts the workbench, the progress dock, and the bubble.
17
+ - Adds a restricted same-origin client handshake that reports only plugin, version, protocol, and slot scalars. Concurrent slot reports are merged monotonically so out-of-order requests cannot produce false missing-slot errors.
18
+ - Detects the running DSH version through the real npm/npx CLI target, including symbolic links, and reports unknown or unsupported hosts with actionable guidance.
19
+ - Publishes the Host Adapter, Provider Adapter, Host Doctor, artifact library, health, architecture, and updated user documentation.
20
+
21
+ ### Safety notes
22
+
23
+ - Host Doctor does not invoke host ports, open Browser, inspect attachments or sessions, call text or vision models, or contact providers.
24
+ - Health tracking performs no scheduled provider probes. Rate limits, network errors, 5xx responses, content-safety failures, cancellation, and unknown acceptance never overwrite a recent success and never trigger hidden cost.
25
+ - Provider and host conformance tests are deterministic fixtures. They never submit billable media requests.
26
+ - Automatic provider failover remains limited to explicit `not_accepted` results. Accepted or unknown work is never resubmitted automatically.
27
+ - Unverified remote cancellation is reported as explicitly unsupported instead of being guessed from private provider APIs.
28
+ - The client handshake is diagnostic evidence only. It does not grant capabilities, participate in authentication, or accept API keys, prompts, sessions, or attachment data.
29
+ - `artifacts.json` stores only a random ID, an access token, a basename, a MIME type, a size, and a timestamp. It deliberately excludes prompts, provider and model identity, task relationships, credentials, and absolute paths. Work URLs still require an unguessable capability token.
30
+ - The work library is not a backup. Deleting a work removes the underlying file after explicit confirmation, so important media should be copied elsewhere.
31
+
32
+ ### Compatibility
33
+
34
+ - DeepSeek Harness: `>=0.1.2-rc.1 <0.1.3-0` or `0.1.5-rc.1` (the only two verified windows)
35
+ - Node.js: `>=20.10.0`
36
+ - `ffmpeg` and `ffprobe` are optional and are needed only for video frame extraction and video summaries.
37
+
38
+ DSH is still a developer preview. These are the only two windows that passed a host canary; other preview versions, including 0.1.4 and a released 0.1.5, are not claimed as compatible until their own canary passes.
39
+
40
+ ### Install or update
41
+
42
+ ```bash
43
+ dsh plugin --profile web add @mokuyoaxis/dsh-iris@0.1.4
44
+ dsh web
45
+ ```
46
+
47
+ Open the complete authentication URL printed by `dsh web`; a bare `http://127.0.0.1:3080` URL may be rejected.
48
+
49
+ ### Verification
50
+
51
+ - All 56 test files pass, and the structural lint guard covers every JS and MJS file in `lib/`, `tests/`, and `scripts/`.
52
+ - Isolated source-link and packed-tarball canaries run on DSH `0.1.2-rc.1` with Node.js 22: the authenticated application bundle registers 14 tools, two Skills, and four route groups, and the client handshake reports four UI slots.
53
+ - Host Doctor reports zero hard errors on the canary host. A missing `dsh-builtin-browser` is the only expected warning.
54
+ - The daily Android/Linux host on DSH `0.1.5-rc.1` with Node.js 22 loads all 14 tools, two Skills, four route groups, and four UI slots, and Host Doctor accepts the second verified window.
55
+ - The packed tarball is scanned for credentials, host-specific absolute paths, and internal records before release.
56
+
57
+ Image, video, speech, transcription, and model verification requests may consume provider quota or incur charges.
58
+
59
+ Full changelog: https://github.com/mokuyoaxis/dsh-iris/compare/v0.1.3...v0.1.4