@mokuyoaxis/dsh-iris 0.2.0 → 0.2.2
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/.dsh/skills/iris-compose-media/SKILL.md +10 -5
- package/.dsh/skills/iris-compose-media/references/workflows.md +7 -1
- package/.dsh/skills/iris-verify-ui/SKILL.md +2 -1
- package/CHANGELOG.md +69 -2
- package/README.en.md +67 -31
- package/README.md +67 -31
- package/bin/dsh-iris.js +222 -21
- package/docs/AGENT_QUICKSTART.md +10 -6
- package/docs/ARCHITECTURE.md +34 -19
- package/docs/ARTIFACT_LIBRARY.md +5 -5
- package/docs/ARTIFACT_MANIFEST.md +1 -1
- package/docs/CLI_MANAGEMENT.md +183 -0
- package/docs/COMPOSITE_VISION.md +35 -0
- package/docs/CORE_RUNTIME_CONTRACT.md +16 -7
- package/docs/DSH_CORE_MIGRATION.md +48 -19
- package/docs/DSH_RC2_ADAPTATION.md +4 -2
- package/docs/FAULT_INJECTION.md +21 -2
- package/docs/HEADLESS_CLI.md +15 -7
- package/docs/HOST_ADAPTER_CONTRACT.md +10 -10
- package/docs/HOST_DOCTOR.md +3 -3
- package/docs/MODEL_PORT_CONTRACT.md +21 -14
- package/docs/OCR_MODEL.md +39 -0
- package/docs/PROMPT_OPTIMIZER.md +77 -0
- package/docs/PROVIDER_ADAPTER_CONTRACT.md +15 -5
- package/docs/PROVIDER_HEALTH.md +22 -5
- package/docs/PROVIDER_RUNTIME_HARNESS.md +1 -1
- package/docs/PROVIDER_SUBMISSION_CONTRACT.md +2 -2
- package/docs/ROADMAP.md +37 -19
- package/docs/SECURITY.md +5 -5
- package/docs/TASK_SEMANTICS.md +2 -2
- package/docs/VISION_CLI.md +132 -0
- package/docs/VISION_MODEL.md +51 -0
- package/docs/WORKBENCH_ARTIFACTS.md +67 -0
- package/docs/file-access-across-environments.md +8 -5
- package/docs/releases/0.2.1.md +56 -0
- package/docs/releases/0.2.2.md +31 -0
- package/lib/actions.js +199 -286
- package/lib/adapters.js +216 -41
- package/lib/api.js +49 -7
- package/lib/capability.js +23 -16
- package/lib/chromium-browser.js +117 -0
- package/lib/client.js +933 -117
- package/lib/command-service.js +121 -7
- package/lib/composite-vision-routing.js +42 -0
- package/lib/config.js +102 -14
- package/lib/core-artifact-store.js +45 -13
- package/lib/core-lease-recovery.js +64 -92
- package/lib/core-maintenance.js +213 -0
- package/lib/core-runtime.js +45 -47
- package/lib/core-tasks.js +12 -5
- package/lib/core-user-projection.js +1 -0
- package/lib/core-writer-lease.js +134 -0
- package/lib/dsh-core-adapter.js +63 -9
- package/lib/dsh-text-model-adapter.js +222 -0
- package/lib/dsh-vision-model-adapter.js +75 -0
- package/lib/generation-input.js +36 -5
- package/lib/headless-vision.js +181 -0
- package/lib/host-runtime.js +1 -0
- package/lib/http-vision-model-adapter.js +187 -0
- package/lib/image-edit-input.js +34 -0
- package/lib/index.js +205 -175
- package/lib/locate.js +86 -28
- package/lib/media-probe.js +2 -1
- package/lib/model-call-runtime.js +45 -0
- package/lib/model-invoker.js +4 -2
- package/lib/model-port-contract.js +13 -5
- package/lib/models.js +29 -42
- package/lib/ocr-model-routing.js +26 -0
- package/lib/ocr.js +110 -64
- package/lib/prompt-optimizer-config.js +21 -10
- package/lib/prompt-optimizer-core.js +247 -0
- package/lib/prompt-optimizer.js +37 -193
- package/lib/provider-adapters.js +87 -10
- package/lib/provider-catalog.js +19 -7
- package/lib/provider-config-service.js +235 -0
- package/lib/provider-contract.js +3 -2
- package/lib/provider-health.js +80 -1
- package/lib/provider-protocol.js +84 -0
- package/lib/provider-task-runner.js +63 -19
- package/lib/summarize.js +31 -20
- package/lib/summary-input.js +52 -0
- package/lib/task-wait.js +40 -0
- package/lib/video-input.js +30 -0
- package/lib/vision-core.js +42 -0
- package/lib/vision-image-input.js +83 -0
- package/lib/vision-input.js +31 -0
- package/lib/vision-model-routing.js +180 -0
- package/lib/vision.js +3 -2
- package/lib/workbench-artifacts.js +52 -0
- package/lib/workbench-management.js +151 -0
- package/lib/workbench-zip.js +39 -0
- package/package.json +1 -1
- package/user_guide.md +74 -30
|
@@ -35,11 +35,13 @@ Do not add an analysis, transcription, or review step merely because a tool exis
|
|
|
35
35
|
|
|
36
36
|
## Resolve media inputs
|
|
37
37
|
|
|
38
|
-
-
|
|
38
|
+
- For edits to an existing Core image, pass its ID as `source_artifact_id` to `iris_edit_image` with the requested change. This creates a new Task and Artifact while keeping the source intact; it requires a configured chat image model.
|
|
39
|
+
- PNG, JPEG and WebP can be used directly; do not convert a generated PNG to JPEG merely to call vision or OCR. Core IDs and host paths remain separate inputs.
|
|
40
|
+
- Use `iris_look_at_image` for a host-visible absolute `image_path` or an existing Core image `artifact_id` (choose one).
|
|
39
41
|
- Use `iris_relook_attachment` for an image attachment already present in the session or produced by Iris.
|
|
40
|
-
- Use `iris_long_ocr` when exact text from an image matters more than a visual description.
|
|
41
|
-
- Video and audio
|
|
42
|
-
- Keep every returned attachment ID, task ID, and output path that a later step needs.
|
|
42
|
+
- Use `iris_long_ocr` when exact text from an image matters more than a visual description; choose exactly one of `image_path`, Core `artifact_id`, or session `attachment_id`. `iris_locate` accepts the same three sources for original-pixel bounding boxes.
|
|
43
|
+
- Video and audio file inputs require host-visible absolute `video_path` or `audio_path` values. Video summaries can instead consume existing Core `frame_artifact_ids`. A browser-local path, `content://` URI, or ordinary web URL is not a host path; request an upload or exported host path.
|
|
44
|
+
- Keep every returned Core Artifact ID, attachment ID, task ID, and output path that a later step needs. Core `artifact_id` and session `attachment_id` are distinct; do not use either as a file path or invent identifiers.
|
|
43
45
|
|
|
44
46
|
An attachment returned by `iris_draw_image` can be passed as `first_frame_attachment_id` to `iris_generate_video`. An existing host image uses `first_frame_path`. The local path returned by `iris_speak_text` can be passed as `audio_path` for S2V.
|
|
45
47
|
|
|
@@ -48,6 +50,7 @@ An attachment returned by `iris_draw_image` can be passed as `first_frame_attach
|
|
|
48
50
|
Choose the minimum chain, then read only the matching section of [references/workflows.md](references/workflows.md):
|
|
49
51
|
|
|
50
52
|
- inspect an image, then draw: `iris_look_at_image` or `iris_relook_attachment` → `iris_draw_image`;
|
|
53
|
+
- edit a Core image, then inspect: `iris_edit_image` → `iris_look_at_image` using the new Artifact ID;
|
|
51
54
|
- generate/reuse a still, then animate: optional `iris_draw_image` → `iris_generate_video`;
|
|
52
55
|
- summarize a video, then narrate: `iris_media_summarize` → `iris_speak_text`;
|
|
53
56
|
- create an S2V talking video: resolve a first frame and audio → `iris_generate_video`;
|
|
@@ -55,6 +58,8 @@ Choose the minimum chain, then read only the matching section of [references/wor
|
|
|
55
58
|
|
|
56
59
|
Use `iris_video_frames` only for explicit frame extraction or a custom frame-level workflow. Do not load every workflow section when one route is sufficient.
|
|
57
60
|
|
|
61
|
+
If frames are already saved by `iris_video_frames`, pass its returned `frame_artifact_ids` to `iris_media_summarize` instead of extracting again. This reads the original timestamps and frame order without the video file or ffmpeg. Omit `video_path`, `max_frames`, `target_width`, and `transcribe:true`; supply existing speech as `transcribe_text` when available.
|
|
62
|
+
|
|
58
63
|
## Control cost and iteration
|
|
59
64
|
|
|
60
65
|
- Create one new Iris generation **Task** per requested artifact by default. A Provider Attempt is an internal candidate submission inside that Task; do not count failover attempts as user-authorized new Tasks.
|
|
@@ -72,7 +77,7 @@ When a generation tool returns a Task, or the user asks to retry, recover, cance
|
|
|
72
77
|
- Observation failure resumes observation; delivery failure resumes delivery. Neither authorizes regeneration. If that recovery action is available only in the Iris workbench, say so and preserve the Task ID.
|
|
73
78
|
- If the user cancels, stop the chain and do not launch downstream generation. Cancellation requested or unknown is not proof that no provider work occurred.
|
|
74
79
|
- Preserve partial outputs. Report which step succeeded, which failed or became uncertain, and whether accepted work may remain active.
|
|
75
|
-
- If an attachment is missing, request a re-upload or host path. If `ffmpeg`/`ffprobe` is unavailable,
|
|
80
|
+
- If an attachment is missing, request a re-upload or host path. If `ffmpeg`/`ffprobe` is unavailable, new video frame extraction cannot run; summaries can still use existing Core frame IDs.
|
|
76
81
|
- If vision is unavailable but the creation prompt is complete, skip source analysis only when the requested result still remains valid.
|
|
77
82
|
|
|
78
83
|
## Report the result
|
|
@@ -9,6 +9,12 @@ Read only the section matching the chosen workflow. Keep paid steps bounded by t
|
|
|
9
9
|
3. Call `iris_draw_image` once for each requested artifact.
|
|
10
10
|
4. Inspect the result only when verification or iteration was requested. A mismatch is evidence to report, not automatic permission to regenerate.
|
|
11
11
|
|
|
12
|
+
## Edit a Core image, then inspect
|
|
13
|
+
|
|
14
|
+
1. Resolve the source Core Artifact ID; one static PNG, JPEG or WebP image up to 20 MiB is supported.
|
|
15
|
+
2. Call `iris_edit_image` with `source_artifact_id` and a focused modification prompt, optionally an explicit model. The original stays intact and the edited Artifact records its source.
|
|
16
|
+
3. Inspect the new Artifact ID only when review is requested. Preserve the Task ID if acceptance or delivery is uncertain; do not repeat the edit automatically.
|
|
17
|
+
|
|
12
18
|
## Generate or reuse a still, then animate
|
|
13
19
|
|
|
14
20
|
1. Create a still with `iris_draw_image`, reuse an Iris-produced first-frame attachment, or obtain a host-visible path. Do not pass an ordinary session attachment as `first_frame_attachment_id`.
|
|
@@ -18,7 +24,7 @@ Read only the section matching the chosen workflow. Keep paid steps bounded by t
|
|
|
18
24
|
|
|
19
25
|
## Summarize a video, then narrate
|
|
20
26
|
|
|
21
|
-
1. Call `iris_media_summarize` with `transcribe=true` unless the user wants visual-only analysis.
|
|
27
|
+
1. Call `iris_media_summarize` with `video_path` and `transcribe=true` unless the user wants visual-only analysis. If Core frames already exist, use their `frame_artifact_ids` instead and optionally provide `transcribe_text`; omit `transcribe=true` and sampling options for existing frames.
|
|
22
28
|
2. Do not also call `iris_video_frames` or `iris_transcribe_audio` by default; the summary action already samples frames and can transcribe audio.
|
|
23
29
|
3. Write narration for the requested audience and length without presenting inference as visible fact.
|
|
24
30
|
4. Call `iris_speak_text`; return the summary, contact-sheet attachment, and saved audio path.
|
|
@@ -22,6 +22,7 @@ Ask one concise question only when a missing reference, target state, theme, or
|
|
|
22
22
|
## Prepare the inputs
|
|
23
23
|
|
|
24
24
|
1. Identify each image source:
|
|
25
|
+
- Existing Core image: pass `artifact_id` to look/locate/OCR. Crop and pixel diff still need a supported path or attachment; export the Artifact explicitly if those steps require it.
|
|
25
26
|
- Host absolute path: pass `image_path`.
|
|
26
27
|
- Current-session or Iris-produced attachment: pass `attachment_id`.
|
|
27
28
|
- Browser-local path, `content://` URI, or ordinary web URL: do not assume the host can read it. Ask for an upload or a host-accessible file.
|
|
@@ -45,7 +46,7 @@ When raw HTML needs capture, call `iris_html_screenshot` with the same HTML wrap
|
|
|
45
46
|
|
|
46
47
|
### 2. Inspect semantics
|
|
47
48
|
|
|
48
|
-
Inspect the current and reference images separately. Call `iris_look_at_image` for a host path and `iris_relook_attachment` for an attachment.
|
|
49
|
+
Inspect the current and reference images separately. Call `iris_look_at_image` for a Core Artifact ID or host path and `iris_relook_attachment` for an attachment.
|
|
49
50
|
|
|
50
51
|
Each vision call sees only one image. Ask the same structured questions for both images:
|
|
51
52
|
|
package/CHANGELOG.md
CHANGED
|
@@ -4,7 +4,72 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
后续未归入版本的变更在此记录。
|
|
8
|
+
|
|
9
|
+
## [0.2.2] - 2026-10-11
|
|
10
|
+
|
|
11
|
+
0.2.2 的重点是**可控提示词编辑与媒体运行可靠性**:一般功能支持忠实整理、明确改写和独立建议,Core 保留中断恢复证据,生图错误区分本地未受理与网络/正文故障。功能候选来自明确配置或可信能力元数据。Node.js ≥ 22.0.0、DSH `0.2.0-rc.2`、配置版本和生产依赖保持;详见 [0.2.2 发布说明](docs/releases/0.2.2.md)。
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- 功能候选池只采用明确模型标签、旧能力字段绑定或供应商返回的能力元数据;移除裸 DashScope 账号全能力和默认模型目录兜底,模型名称不再自动赋能。已有明确配置(含空标签)优先,分配顺序、安全 failover、复合模型身份和已受理任务绑定保持。
|
|
16
|
+
- 工作台与 CLI 发现保留未标注模型供手动设置,省略能力的手动添加保持未标注;工作台新增“设置功能”入口,将模型明确加入画图、视频、语音、转写或视觉功能池。未来未知能力不会被名称或通用模态推断误归入已有功能。
|
|
17
|
+
- Core writer 创建前原子发布 owner 意图,释放时整体退役目录,显式恢复保留可续办的记录链与原始审计证据;强杀中断不再让新租约丢失 PID。普通 writer 不自动抢占,活跃/未知/损坏或旧无 owner 的现场仍拒绝,CLI 参数与业务存储版本保持。
|
|
18
|
+
- 视频、音频及文本交付复用 Artifact 文件接收和分块哈希,减少 staging 到落库的整文件内存读入;本地复制失败继续保留远端成功,重交付不重新生成。
|
|
19
|
+
- 提示词优化系统的一般功能使用可折叠卡片,提供通用、画图、改图、视频与数字人用途、草稿预览和指令查看;默认 Prompt 按 Skills 的目标/输入/约束/输出组织。新增 `image-edit` 目标,修正 S2V 内置模板误写为首尾帧的语义;旧自定义 v1 配置保留,新目标只在内存补缺,特殊功能后续安排。
|
|
20
|
+
- 真实文本模型补测后强化原稿细节/否定条件保留及“只编辑、不执行”的指令;拒绝原稿和明确规则未授权的新链接、媒体 data URL 或 Markdown 媒体输出,不再作为成功预览,原文保留且不自动重试。已有合法引用、含网址的文字指令与原样组装保持。
|
|
21
|
+
- 一般功能默认“忠实整理”:原文片段完整、固定顺序分组,由程序拼回;明确选择“改写表达”才执行改写规则。补充建议与待确认项单独获取,默认不进入正文,支持逐条选择、采纳及撤回;手动编辑与迟到/取消保护保持。补齐正文混入媒体链接的拒绝,保留已有合法引用;旧 API 文字协议与 v1 配置兼容,模型路由不变。
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- 生图尺寸按当前协议归一分隔符;DashScope 多模态按已确认的总像素范围校验,合法长边尺寸不再被单边上限误拒绝。本地尺寸错误明确为未受理,避免未发 HTTP 却提示受理未知。
|
|
26
|
+
- 生图请求和响应正文读取的网络异常保留阶段与可用的底层错误码,区分 DNS、TLS、连接/响应超时和正文中断;原生取消/超时保持原异常类型,HTTP 鉴权/参数/额度保持各自分类,DSH 即时错误显示脱敏原因。受理未知仍禁止自动重提,不凭连接报错推断长连接或擅自建议切换模型。
|
|
27
|
+
- 租约强杀和文件交付回归采用对应平台的退出结果与路径分隔符,避免 POSIX 假设导致 Windows CI 误判。
|
|
28
|
+
- 修正租约中断夹具以未规范化路径匹配 Runtime 真实路径的问题,覆盖根目录别名并统一 owner 文件名判定,避免 Windows 短路径/分隔符导致断点漏触发。
|
|
29
|
+
|
|
30
|
+
## [0.2.1] - 2026-10-09
|
|
31
|
+
|
|
32
|
+
0.2.1 的更新重点是 **完成 OpenAI 兼容图片与视觉工作流**:生成图片 → Core Artifact → 按 ID 看图/OCR → 聊天改图 → 新 Artifact,CLI 与 DSH 工作台共用同一链路。模型发现与能力分类、模型级图片协议、视觉输入和作品管理共同支持这套流程。要求仍为 Node.js ≥ 22.0.0,DSH 插件仅支持 `0.2.0-rc.2`;包名、配置版本和生产依赖保持不变。完整范围见 [0.2.1 发布说明](docs/releases/0.2.1.md)。
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
|
|
36
|
+
- 生图模型可独立设置 `imageProtocol`,分别选择 DashScope、OpenAI Images、聊天生图或 Responses 生图;省略或 `auto` 时继承账号默认。同账号的模型可使用不同接口,生成、实测和恢复按实际协议绑定,不扫描接口或自动探测。
|
|
37
|
+
- 聊天生图兼容非流式 Chat Completions 图片消息;Responses 支持同步单图、已完成的 `image_generation_call` 及网关图片消息。生成结果按真实字节保存为 PNG/JPEG/WebP Core Artifact,MIME、后缀和内容哈希一致。纯文字 200、缺图或未完成响应不会宣称成功或自动重提。
|
|
38
|
+
- Artifact ID 聊天改图:DSH `iris_edit_image`、Core 图片卡“改图”与 CLI `run image` 的 `source_artifact_id` 共用 `openai-chat-images`。修改版另存为新 Artifact,记录 `derived-from` 及来源引用,原图保留;编辑池只选择聊天生图模型。详见 [Artifact 聊天改图](docs/CLI_MANAGEMENT.md#artifact-聊天改图)。
|
|
39
|
+
- 独立视觉 CLI:`vision look / locate / ocr / summarize`,支持严格显式模型选择、JSON/文本、结果文件和摘要拼图输出;DSH 与 CLI 复用共享视觉业务。纯视觉不创建 Task/Artifact,主动音轨转写使用 Core。
|
|
40
|
+
- 看图、定位和 OCR 支持 `artifact_id`;视频摘要支持 `frame_artifact_ids`。只读核验 Core 原字节、MIME 和哈希,不要求原文件或临时导出;已有视频帧无需再次抽帧或 ffmpeg。
|
|
41
|
+
- 账号与模型可配置 `visionInput.maxBytes/maxDimension`,模型逐字段覆盖账号,默认发送预算 8 MiB。工作台和 CLI `models vision-input` 可设置或恢复继承;看图、OCR 分块、定位和聊天改图按实际候选准备发送副本,Core 原图、下载与哈希不变。
|
|
42
|
+
- 工作台统一 Core/旧版图片、视频、音频和文本,每页 24 项,支持媒体、来源和产物类型过滤、真实匹配计数。Core 图片卡直接看图/OCR/改图,识别结果可取消、复制和下载,并明确 OCR 部分完成。
|
|
43
|
+
- 作品详情、显式跨页选择、ID 复制与混合来源 ZIP 下载,单次最多 200 项、下载上限 128 MiB。Core 删除先预览,再确认移入可恢复回收区;恢复不覆盖冲突文件。详见 [工作台作品管理](docs/WORKBENCH_ARTIFACTS.md)。
|
|
44
|
+
- CLI 补齐 S2V 数字人视频、HTML 截图、账号/模型/能力分配管理、模型发现与显式实测、有界 `task wait`、分页过滤、批量查询/导出,以及 JSON 文件和 stdin 输入。
|
|
45
|
+
- CLI `core delete/cleanup/transactions/restore` 提供默认预览、引用和活跃任务保护、明确选择后的隔离、哈希核对恢复及失败补偿;不提供永久 purge。
|
|
46
|
+
- 对话泡泡增加本次改写规则、原样前缀/后缀、“只组装”、可编辑结果和原文/改动对照。规则按次传入,v1 配置保持不变;未扩展后续独立提示词优化系统。
|
|
47
|
+
|
|
48
|
+
### Changed
|
|
49
|
+
|
|
50
|
+
- 提示词优化、单图看图/重看、OCR、定位、视频拼图摘要及生成后自述迁入共享 Text/Vision Model Ports。准备与候选共用整体预算,严格检查正常终态;取消、超时、截断或协议错误停止后续生成,超长正文明确失败。
|
|
51
|
+
- OCR 整次操作最多 32 块、64 次生成、120 秒;先按转正后的长图切片,再按候选预算处理每块,记录实际发送尺寸与字节数,缩小时提示细字风险,区分完成、部分完成和失败。
|
|
52
|
+
- 定位显式要求模型返回 0–1000 归一化坐标,依据实际发送尺寸和 EXIF 方向换算回原图像素,向外取整供裁剪;接受经核验的 DSH 附件规范化,不猜测返回坐标域。
|
|
53
|
+
- 模型路由区分短时限流和明确耗尽。短时 429 按 `Retry-After`(默认 60 秒)冷却,以琥珀色显示;到期只恢复候选资格,不自动验证。明确免费额度或预算耗尽以红色持续停用至手动实测成功,重启后仍跳过。DSH、CLI、OCR 共用账号 × 模型规则。
|
|
54
|
+
- S2V 首帧与音频迁入共享 Core Attempt 上传链,各候选使用自己的账号;HTML 截图经独立 Chromium Browser Port 或 DSH 宿主保存 Core PNG。配置写入使用私有备份、原子替换和竞争写保护。
|
|
55
|
+
- 修改模型图片协议只使对应生图验证失效,不解除限流或耗尽停用;发现保留手工能力、协议覆盖和输入预算。原图引用参与 Core 删除与清理保护。
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
|
|
59
|
+
- 修复 4K 生图响应的 base64 校验触发调用栈溢出,保留原字节交付与字符、padding 校验。
|
|
60
|
+
- 修复视觉探针图片过小造成的能力误判,改用 128×128 红色 PNG。
|
|
61
|
+
- 修复 OCR 显式 `overlap: 0` 被入口默认值覆盖,以及失败块导致后续原段号丢失。
|
|
62
|
+
- 修复视频摘要时间戳标签未绘制、十帧以上按文件名字典序排列造成的时序错乱;交付与模型输入使用同一张拼图。
|
|
63
|
+
- 保护提示词写回时的新草稿、忙碌状态和结构化引用,旧请求迟到结果不覆盖新操作;不支持的显式 reasoning effort 在生成前拒绝。
|
|
64
|
+
- 修正跨平台 CLI 测试的文件 URL、路径、权限与信号断言;缺少可选 ffmpeg/ffprobe 时只跳过相应视频段。
|
|
65
|
+
|
|
66
|
+
### 已知限制
|
|
67
|
+
- 浏览器/移动端完整作品管理,以及真实异步任务重启后的 CLI 接管尚未完成验收;已有本地测试和 rc.2 服务隔离检查不替代这些验证。
|
|
68
|
+
- Responses 当前仅同步单图;聊天改图不支持 mask、多参考图或连续编辑历史。独立 Images 编辑与原生 Gemini/Fal 协议未在本版接入。
|
|
69
|
+
|
|
70
|
+
### 后续方向
|
|
71
|
+
|
|
72
|
+
- 继续适配其他协议,并规划 Music 音乐生成功能;均属于后续工作,不纳入 0.2.1。详见 [路线图](docs/ROADMAP.md#后续功能方向)。
|
|
8
73
|
|
|
9
74
|
## [0.2.0] - 2026-10-01
|
|
10
75
|
|
|
@@ -223,7 +288,9 @@ Iris 0.2.0 要求 Node.js ≥ 22.0.0,DSH 插件仅支持 `0.2.0-rc.2`;旧宿
|
|
|
223
288
|
- 上传采用流式限额、临时 `.part` 文件和原子落盘,失败时会清理未完成文件。
|
|
224
289
|
- 修改状态的路由拒绝明确的跨站请求,媒体文件继续使用随机能力令牌访问。
|
|
225
290
|
|
|
226
|
-
[Unreleased]: https://github.com/mokuyoaxis/dsh-iris/compare/v0.2.
|
|
291
|
+
[Unreleased]: https://github.com/mokuyoaxis/dsh-iris/compare/v0.2.2...HEAD
|
|
292
|
+
[0.2.2]: https://github.com/mokuyoaxis/dsh-iris/compare/v0.2.1...v0.2.2
|
|
293
|
+
[0.2.1]: https://github.com/mokuyoaxis/dsh-iris/compare/v0.2.0...v0.2.1
|
|
227
294
|
[0.2.0]: https://github.com/mokuyoaxis/dsh-iris/compare/v0.1.4...v0.2.0
|
|
228
295
|
[0.1.4]: https://github.com/mokuyoaxis/dsh-iris/compare/v0.1.3...v0.1.4
|
|
229
296
|
[0.1.3]: https://github.com/mokuyoaxis/dsh-iris/compare/v0.1.2...v0.1.3
|
package/README.en.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
<h1 align="center">Iris Media for DSH</h1>
|
|
10
10
|
|
|
11
|
-
<p align="center"><strong>A multimodal media production runtime ·
|
|
11
|
+
<p align="center"><strong>A multimodal media production runtime · DSH plugin and standalone CLI</strong></p>
|
|
12
12
|
|
|
13
13
|
<p align="center">
|
|
14
14
|
<a href="#deepseek-harness-adaptation"><img alt="DeepSeek Harness compatible" src="https://img.shields.io/badge/DeepSeek%20Harness-compatible-4D6BFE.svg?style=flat-square"></a>
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
<a href="LICENSE"><img alt="MIT License" src="https://img.shields.io/badge/license-MIT-1689FF.svg?style=flat-square"></a>
|
|
19
19
|
</p>
|
|
20
20
|
|
|
21
|
-
dsh-iris gives agents
|
|
21
|
+
dsh-iris gives agents, the Iris workbench and a standalone CLI image, video, speech and visual understanding capabilities. Each image model can use DashScope, OpenAI Images, chat image generation or Responses. Shared Core Artifacts connect generation, vision, OCR and chat editing. The DSH workbench provides configuration and task management, while the 🫧 bubble offers draft optimization in the composer.
|
|
22
22
|
|
|
23
23
|
## A real generation example
|
|
24
24
|
|
|
@@ -44,18 +44,32 @@ These captures come from an Android browser connected to DSH under Termux/PRoot
|
|
|
44
44
|
|
|
45
45
|
The project is at an early stage; interfaces and configuration formats may still change between releases.
|
|
46
46
|
|
|
47
|
-
Iris
|
|
47
|
+
Iris 0.2.2 provides a DSH plugin and a headless CLI sharing tasks, artifacts and model routing, adding controlled prompt editing and reliable media execution while retaining the OpenAI-compatible image and vision workflow. Core internals have not been frozen as a public SDK.
|
|
48
48
|
|
|
49
|
-
> Version support: Iris `0.2.
|
|
49
|
+
> Version support: Iris `0.2.x` requires Node.js `>=22.0.0` and its DSH plugin supports only the exact host version `0.2.0-rc.2`. Older DSH hosts should pin `@mokuyoaxis/dsh-iris@0.1.4` as described below instead of following npm latest. Iris and DSH have independent version numbers.
|
|
50
|
+
|
|
51
|
+
## What's new in 0.2.2
|
|
52
|
+
|
|
53
|
+
**Controlled prompt editing and reliable media execution**, building on the existing OpenAI-compatible image and vision workflow.
|
|
54
|
+
|
|
55
|
+
- **General prompt editor:** five collapsible targets and editable comparisons; faithful grouping by default, explicit rewriting and separately requested/adopted suggestions.
|
|
56
|
+
- **Explicit function pools:** capabilities come from configuration or trusted metadata; bare accounts and model names do not grant capabilities. Ordered candidates and explicit labels remain.
|
|
57
|
+
- **Core recovery and delivery:** retain writer intent and interrupted recovery evidence; use file adoption and chunked hashes for non-image media without automatic lease takeover or regeneration.
|
|
58
|
+
- **Image diagnostics:** normalize size separators, accept valid long edges and identify local rejection before HTTP; distinguish network/body failures, cancellation/timeouts and complete HTTP errors.
|
|
59
|
+
- **Portable regressions:** match interruption checkpoints using physical root paths and native filename handling.
|
|
60
|
+
|
|
61
|
+
See the [0.2.2 release notes](docs/releases/0.2.2.md) and [CHANGELOG](CHANGELOG.md) for scope and validation boundaries.
|
|
62
|
+
|
|
63
|
+
Future work includes additional protocol adapters and **music generation**; see the [roadmap](docs/ROADMAP.md#后续功能方向).
|
|
50
64
|
|
|
51
65
|
## Two ways to use Iris
|
|
52
66
|
|
|
53
|
-
| | Path A: DSH plugin
|
|
67
|
+
| | Path A: DSH plugin | Path B: Headless CLI |
|
|
54
68
|
|---|---|---|
|
|
55
69
|
| Who it's for | DeepSeek Harness users who want agent tools, the workbench, and in-chat prompt optimization | Users who want media generation, task tracking, and artifact export from the command line without DSH |
|
|
56
70
|
| Entry point | Choose a pinned release under "Quickest start" below | `dsh-iris run ...` — see [Headless CLI](docs/HEADLESS_CLI.md) |
|
|
57
71
|
| Data location | `$DSH_HOME/iris/v1/` (Core data root `core-v0`) | Any absolute path passed via `--data-root` |
|
|
58
|
-
| Automatic observation | Yes (bounded DSH host ticks + restart takeover) |
|
|
72
|
+
| Automatic observation | Yes (bounded DSH host ticks + restart takeover) | Explicit `task observe`; 0.2.2 also offers bounded `task wait` |
|
|
59
73
|
| Dependencies | DSH `0.2.0-rc.2` and Node.js ≥ 22 | Node.js ≥ 22 and `sharp` only (`ffmpeg` for video frames) |
|
|
60
74
|
|
|
61
75
|
Both paths read and write the same Core Task/Artifact facts: point the CLI at the `core-v0` data root of a DSH profile to inspect/export DSH-generated artifacts, and vice versa. Only one writer is allowed per data root.
|
|
@@ -74,7 +88,7 @@ Check the host with `dsh --version` and ensure `pnpm` is on your PATH. Iris and
|
|
|
74
88
|
|
|
75
89
|
| Your DSH | Iris choice | Source |
|
|
76
90
|
|---|---|---|
|
|
77
|
-
| `0.2.0-rc.2` | `0.2.
|
|
91
|
+
| `0.2.0-rc.2` | `0.2.2` | Pinned npm release |
|
|
78
92
|
| `>=0.1.2-rc.1 <0.1.3-0` or `0.1.5-rc.1` | Stable `0.1.4` | Pinned npm release |
|
|
79
93
|
| Other versions | No current support claim | Check host adaptation before installing |
|
|
80
94
|
|
|
@@ -95,24 +109,33 @@ npm pack @mokuyoaxis/dsh-iris@0.1.4
|
|
|
95
109
|
|
|
96
110
|
This writes a `.tgz` to the current directory. Use `npm install @mokuyoaxis/dsh-iris@0.1.4` if you only want a regular npm dependency; that does not add a DSH profile layer. Pinning `@0.1.4` keeps selecting the old stable release after latest changes. See [npm pack](https://docs.npmjs.com/cli/v11/commands/npm-pack/). Version 0.1.4 does not contain the 0.2.0 Core media CLI or the later DSH rc.2 adaptation.
|
|
97
111
|
|
|
98
|
-
### DSH 0.2.0-rc.2: install 0.2.
|
|
112
|
+
### DSH 0.2.0-rc.2: install 0.2.2
|
|
99
113
|
|
|
100
|
-
Install the pinned
|
|
114
|
+
Install the pinned release into your Web profile:
|
|
101
115
|
|
|
102
116
|
```bash
|
|
103
|
-
dsh plugin --profile web add @mokuyoaxis/dsh-iris@0.2.
|
|
117
|
+
dsh plugin --profile web add @mokuyoaxis/dsh-iris@0.2.2
|
|
104
118
|
dsh web
|
|
105
119
|
```
|
|
106
120
|
|
|
107
|
-
The plugin loads the next
|
|
121
|
+
The plugin loads on the next DSH start. The web UI defaults to `http://127.0.0.1:3080`; open the complete URL if startup output includes authentication parameters. Reload the backend and refresh the web client after updating.
|
|
122
|
+
|
|
123
|
+
### Standalone CLI: install 0.2.2
|
|
124
|
+
|
|
125
|
+
Install in your own project without DSH:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npm install @mokuyoaxis/dsh-iris@0.2.2
|
|
129
|
+
npx dsh-iris --help
|
|
130
|
+
```
|
|
108
131
|
|
|
109
132
|
### Choosing a version in dsh-market
|
|
110
133
|
|
|
111
|
-
The marketplace entry should resolve to the full package name `@mokuyoaxis/dsh-iris`. Check both its displayed Iris version and your local `dsh --version` before installing: 0.2.
|
|
134
|
+
The marketplace entry should resolve to the full package name `@mokuyoaxis/dsh-iris`. Check both its displayed Iris version and your local `dsh --version` before installing: 0.2.2 is for DSH rc.2; older hosts should use the pinned `@0.1.4` commands above. Catalog and npm information may be cached. The actual npm package's `dsh.engines.dsh` and Node engines determine its declared requirements; a visible listing does not imply support for every DSH release.
|
|
112
135
|
|
|
113
136
|
> The unscoped `dsh-iris` on npm belongs to a different plugin. Always keep the fully scoped name `@mokuyoaxis/dsh-iris` when installing or updating Iris Media.
|
|
114
137
|
|
|
115
|
-
After the first start, open "Settings → Iris workbench → + Add provider", enter your
|
|
138
|
+
After the first start, open "Settings → Iris workbench → + Add provider", enter your provider base URL and API key, then click "Discover models". A single provider can start with automatic capability assignment. Full steps, image protocol selection, and failover notes are in the [user guide](user_guide.md) (Chinese).
|
|
116
139
|
|
|
117
140
|
Once configured, minimal instructions can be as simple as:
|
|
118
141
|
|
|
@@ -142,26 +165,27 @@ For a copyable installation and usage prompt, see [Agent quickstart prompt](docs
|
|
|
142
165
|
|
|
143
166
|
## Prerequisites
|
|
144
167
|
|
|
145
|
-
- A Node.js version that satisfies your DeepSeek Harness release's requirement; Iris 0.2.
|
|
168
|
+
- A Node.js version that satisfies your DeepSeek Harness release's requirement; Iris 0.2.2 requires at least 22.0.0, while the published npm 0.1.4 historically requires 20.10.0
|
|
146
169
|
- A working DeepSeek Harness environment with `pnpm` on the PATH
|
|
147
170
|
- At least one supported media or vision provider
|
|
148
|
-
- `ffmpeg` and `ffprobe`
|
|
171
|
+
- `ffmpeg` and `ffprobe` for extracting frames or summarizing a video file; summaries of existing Core frames need neither
|
|
149
172
|
|
|
150
173
|
After installing the plugin, add a provider in the Iris workbench and assign models to the capabilities you need. Provider keys are kept in Iris's host-side configuration; on POSIX systems, Iris's own directories and files are tightened to `0700` and `0600` respectively, and neither the UI nor the API ever returns full keys. On Windows, file modes are not equivalent to ACLs — keep relying on your user directory and system account permissions.
|
|
151
174
|
|
|
152
175
|
## DeepSeek Harness adaptation
|
|
153
176
|
|
|
154
|
-
dsh-iris remains a native DSH plugin.
|
|
177
|
+
dsh-iris remains a native DSH plugin. Iris 0.2.2 server registers 15 agent tools, including image editing, and uses host-provided routing, attachment, model, and lifecycle services. The web client contributes settings, composer, and global-overlay UI. Iris does not start another service or listen on an extra port.
|
|
155
178
|
|
|
156
179
|
| Iris version | DSH range | Verification |
|
|
157
180
|
|---|---|---|
|
|
158
181
|
| Published stable `0.1.4` | `>=0.1.2-rc.1 <0.1.3-0` | Historical clean and daily Web profiles on Linux ARM64 |
|
|
159
182
|
| Published stable `0.1.4` | `0.1.5-rc.1` | Historical daily Android/Linux profile checks |
|
|
160
183
|
| `0.2.0` | Only `0.2.0-rc.2` | Installed-service isolation checks, Core diff, and SlotRegistry; user demonstration reported successful, with detailed browser actions and asynchronous restart/rollback verification continuing |
|
|
184
|
+
| `0.2.2` | Only `0.2.0-rc.2` | Installed-service checks cover 15 tools and 31 boundaries; complete browser/mobile and real asynchronous restart acceptance remain pending |
|
|
161
185
|
|
|
162
186
|
See the [rc.2 adaptation notes](docs/DSH_RC2_ADAPTATION.md) for scope. The published npm 0.1.4 package does not contain these later changes.
|
|
163
187
|
|
|
164
|
-
Iris 0.2.
|
|
188
|
+
Iris 0.2.x no longer claims older DSH support; historical validation does not automatically cover this version. DSH `0.2.0` stable and other rc versions are also outside its support range. Automated checks cover server loading, tool and Skill registration, routes, the client bundle, and UI slots separately so Doctor can identify which boundary failed.
|
|
165
189
|
|
|
166
190
|
Core and the DSH Adapter are being separated: DSH keeps loading the same npm package, while the Adapter maps host capabilities into Core. A DSH API change should require an Adapter or client-bridge fix, not a rewrite of Task or Artifact semantics. Version 0.2.0 includes the headless CLI. The `dsh` prefix will be removed after a second real Host Adapter is implemented and accepted, with a new npm package at that point; see the [roadmap](docs/ROADMAP.md).
|
|
167
191
|
|
|
@@ -172,6 +196,7 @@ Core and the DSH Adapter are being separated: DSH keeps loading the same npm pac
|
|
|
172
196
|
| Tool | Purpose |
|
|
173
197
|
|---|---|
|
|
174
198
|
| `iris_draw_image` | Generate images from a prompt |
|
|
199
|
+
| `iris_edit_image` | Edit a source Artifact into a new image with a chat image model, preserving provenance |
|
|
175
200
|
| `iris_generate_video` | Text-to-video, image-to-video, or S2V digital-human video |
|
|
176
201
|
| `iris_speak_text` | Synthesize speech from text |
|
|
177
202
|
| `iris_transcribe_audio` | Transcribe audio to text |
|
|
@@ -198,6 +223,12 @@ Core and the DSH Adapter are being separated: DSH keeps loading the same npm pac
|
|
|
198
223
|
|
|
199
224
|
## File inputs
|
|
200
225
|
|
|
226
|
+
Look, locate and OCR accept a local path, session attachment or Core image `artifact_id`; summaries can reuse `frame_artifact_ids`. Artifact inputs are read-only and checked against their MIME type and content hash. PNG/JPEG/WebP inputs need no manual JPEG conversion. See [vision CLI](docs/VISION_CLI.md).
|
|
227
|
+
|
|
228
|
+
Look, OCR chunks, locate and chat editing prepare sending copies using account/model budgets, with an 8 MiB default. Core originals, downloaded dimensions and hashes stay intact. OCR reports resizing and small-text risk; locate returns source-pixel coordinates. See [input budgets](docs/CLI_MANAGEMENT.md#看图输入预算).
|
|
229
|
+
|
|
230
|
+
Chat editing uses a source Artifact ID and saves a linked new image; it requires a model configured for chat image generation. See [Artifact editing](docs/CLI_MANAGEMENT.md#artifact-聊天改图) and [workbench management](docs/WORKBENCH_ARTIFACTS.md) for filtering, selection, downloads and recovery.
|
|
231
|
+
|
|
201
232
|
Iris accepts three file sources, in the recommended order:
|
|
202
233
|
|
|
203
234
|
1. **Browser upload** — best for local files and cross-environment access; 64 MB per file.
|
|
@@ -208,13 +239,17 @@ Uploads are stored under `$DSH_HOME/iris/v1/uploads/` and kept for 7 days by def
|
|
|
208
239
|
|
|
209
240
|
## Conversation prompt optimization
|
|
210
241
|
|
|
211
|
-
|
|
242
|
+
Version 0.2.2 extends per-operation rules, assembly without a model call and editable comparisons. It groups general, image creation, image editing, video and S2V targets in a collapsible section. The interface defaults to faithful grouping of original text in its original order; rewriting requires an explicit choice, and optional suggestions are fetched and adopted separately. Default instructions follow the project's Skills; custom v1 configuration and the existing text API remain compatible. Rules are not persisted and no standalone prompt CLI is added. See the [prompt optimizer guide](docs/PROMPT_OPTIMIZER.md).
|
|
243
|
+
|
|
244
|
+
Iris adds a borderless, text-free “🫧” control directly to the DSH composer, so the workbench does not need to be open. It opens a translucent glass panel with background blur and soft depth; on narrow screens and Android browsers it becomes a safe-area-aware, internally scrollable bottom sheet. It reads only the current unsent plain-text draft. The result is previewed first and is written back only after confirmation; Iris never sends it automatically. Drafts containing structured `@` or `/` references are left untouched for now so their identities are not lost.
|
|
212
245
|
|
|
213
246
|
By default, the optimizer uses the model selected for the current session and falls back to DSH's default model when the session has none. The request carries no chat history, tools, attachments, or workspace content—only the current draft and target template. To prevent reasoning tokens from exhausting the generation budget before visible text is complete, `generation.reasoningEffort` defaults to `off-if-supported`: reasoning is disabled only when DSH model metadata explicitly advertises such an effort; otherwise the provider default is used, and the session High/Low setting is not inherited. JSON may select `provider-default`, `inherit`, or an exact effort ID advertised by the model. For predictable cost and latency, use a `fixed` route with a lightweight non-reasoning model. You can also export `prompt-optimizer.json`, change `route.mode` to `fixed`, name another `provider` and `model` already registered in DSH, and import it again. “Reset to defaults” restores Iris's built-in prompt, target templates, session-model routing, and generation settings. The composer control can be disabled independently and re-enabled from the Iris workbench; disabling it does not stop the workbench, agent tools, or task runtime. An optimization call may incur charges from the selected text model.
|
|
214
247
|
|
|
215
248
|
## Model assignment and failover
|
|
216
249
|
|
|
217
|
-
Capability
|
|
250
|
+
Iris organizes ordered model candidates by function. Capability assignments identify each executor with `providerId::modelId`; the same model name from a different provider or account is a separate option. Alibaba Cloud media calls may use a separate Workspace `mediaBaseUrl`.
|
|
251
|
+
|
|
252
|
+
Version 0.2.2 uses explicit function labels, legacy capability bindings, or provider capability metadata. Bare accounts and model names no longer grant capabilities. Discovery retains unlabelled models; assign their functions in the workbench or with CLI `models caps`. Existing explicit labels, assignment order and safe failover are preserved. Earlier 0.2.1 inference no longer grants capabilities to bare accounts or model names.
|
|
218
253
|
|
|
219
254
|
Generation capabilities accept multiple candidate models. Every request starts at the head of the ordered list; this is safe failover, not round-robin. Iris tries the next candidate only when the provider explicitly proves that the request was not accepted. A 500 response, timeout, disconnect, missing response, polling failure, or local persistence failure never authorizes automatic resubmission. Once accepted, Iris may only resume observation or delivery.
|
|
220
255
|
|
|
@@ -226,9 +261,9 @@ Transcription is a separate `transcribe` capability and does not consume the TTS
|
|
|
226
261
|
|
|
227
262
|
## Capability health and model verification
|
|
228
263
|
|
|
229
|
-
The workbench and main bubble
|
|
264
|
+
The workbench and main bubble show gray for unconfigured, blue for unverified, green for success within seven days, and muted red for authentication or permission failures. The 0.2.2 also shows amber for temporary 429 cooldown and bright red for confirmed free quota or budget exhaustion, with a reason and recovery condition.
|
|
230
265
|
|
|
231
|
-
Iris performs no background probes.
|
|
266
|
+
Iris performs no background probes. Temporary 429 responses use `Retry-After`, or a 60-second default cooldown. Expiry restores candidate eligibility without a verification request. Confirmed free quota or budget exhaustion persists across restarts until an explicit model test succeeds; test buttons remain available. Vision, image, and TTS have built-in test samples; video and transcription tests require real input through the CLI. Network errors, 5xx responses, content-safety failures, cancellation, and unknown acceptance do not overwrite recent success evidence. Host Doctor only checks loading and host ports. See [Provider and capability health](docs/PROVIDER_HEALTH.md).
|
|
232
267
|
|
|
233
268
|
## Offline diagnostics
|
|
234
269
|
|
|
@@ -241,7 +276,7 @@ npx @mokuyoaxis/dsh-iris doctor --json
|
|
|
241
276
|
|
|
242
277
|
The installed binary is `dsh-iris`. Exit code `0` is healthy, `1` means warnings, and `2` means hard errors. Offline Doctor checks Node.js, sharp, ffmpeg/ffprobe, a real but cleaned-up storage write probe, configuration, models/assignments, task semantics, temporary files, and orphaned or missing artifacts.
|
|
243
278
|
|
|
244
|
-
A running DSH instance also provides a “Host diagnostics” card in the Iris workbench and exposes the authenticated `/iris/api/doctor` JSON. It checks the DSH version, plugin,
|
|
279
|
+
A running DSH instance also provides a “Host diagnostics” card in the Iris workbench and exposes the authenticated `/iris/api/doctor` JSON. It checks the DSH version, plugin, current tools, two Skills, four route groups, Browser/attachment/model capabilities, client version, and four UI Slots. It reads only safe snapshots and registration evidence; it never calls Browser, models, or providers. See [Host Doctor](docs/HOST_DOCTOR.md).
|
|
245
280
|
|
|
246
281
|
## Composed workflow example
|
|
247
282
|
|
|
@@ -259,18 +294,19 @@ Runtime data lives under `$DSH_HOME/iris/v1/` by default:
|
|
|
259
294
|
|---|---|
|
|
260
295
|
| `providers.json` | Providers, capability assignments, and redacted health evidence; file mode 0600 |
|
|
261
296
|
| `prompt-optimizer.json` | Imported optimizer prompt, target templates, model route, and generation settings; file mode 0600 |
|
|
262
|
-
| `
|
|
263
|
-
| `
|
|
264
|
-
| `
|
|
297
|
+
| `core-v0/` | New tasks, attempts, Artifact objects, manifests and recoverable quarantine transactions |
|
|
298
|
+
| `tasks.json` | Legacy task metadata and attachment indexes; up to 500 records |
|
|
299
|
+
| `artifacts.json` | Legacy work-library index and random access tokens; no prompt, provider, or task relationship |
|
|
300
|
+
| `outputs/` | Legacy generated and processed media |
|
|
265
301
|
| `uploads/` | Temporary copies of browser uploads |
|
|
266
302
|
|
|
267
303
|
On first load, 0.1.1 tightens POSIX permissions across an existing `$DSH_HOME/iris/v1/` tree without modifying file contents or following symlinks. Large media downloads stream to a private temporary file and are moved into place atomically, instead of loading a whole video into memory.
|
|
268
304
|
|
|
269
305
|
Asynchronous tasks are polled in the background. After a plugin restart, Iris can re-adopt tasks that are still running remotely. Cancellation signals propagate through local waits and polling; whether the remote computation itself can be cancelled depends on the provider's API.
|
|
270
306
|
|
|
271
|
-
The work library has its own lifecycle: clearing terminal task history does not delete works, and older media can be recovered by re-indexing `outputs/`.
|
|
307
|
+
The work library has its own lifecycle: clearing terminal task history does not delete works, and older media can be recovered by re-indexing `outputs/`. Legacy deletion removes actual files with separate confirmation; see [Work library v0](docs/ARTIFACT_LIBRARY.md). Core deletion uses preview and recoverable quarantine; see [workbench management](docs/WORKBENCH_ARTIFACTS.md). Favorites, tags and search remain future work.
|
|
272
308
|
|
|
273
|
-
|
|
309
|
+
Legacy media links carry random capability tokens. Core media uses random Artifact IDs and host/browser origin guards. Images are, wherever possible, also saved as DSH durable attachments so they stay usable in the conversation.
|
|
274
310
|
|
|
275
311
|
## Security notes
|
|
276
312
|
|
|
@@ -280,13 +316,13 @@ Audio and video are served through Iris media links that carry random capability
|
|
|
280
316
|
- `IRIS_TRUSTED_HOSTS` is not an authentication mechanism. When exposing DSH to the public internet or an untrusted network, configure authentication and HTTPS at the reverse proxy or host layer.
|
|
281
317
|
- Paid model probes run one capability at a time and always confirm before a real provider call; video and transcription never submit empty-sample paid probes automatically.
|
|
282
318
|
- HTML screenshots render inside a sandboxed page without same-origin privileges; scripts and external network access are disabled by default.
|
|
283
|
-
-
|
|
319
|
+
- Legacy media links use random capability tokens; Core media reads verify Artifact content hashes. A host allowlist does not replace user authentication.
|
|
284
320
|
- Iris provides no account system of its own; multi-user isolation and access control are the responsibility of the DeepSeek Harness deployment.
|
|
285
321
|
|
|
286
322
|
## Known limitations
|
|
287
323
|
|
|
288
324
|
- `sharp` bundles native components; glibc Linux, Windows, and macOS are the primary targets. Non-standard environments such as bare Termux may need extra work.
|
|
289
|
-
- Video frame extraction and
|
|
325
|
+
- Video-file frame extraction and summaries require system-installed `ffmpeg` and `ffprobe`; summaries of existing Core frames need neither.
|
|
290
326
|
- HTML screenshots load no remote scripts, fonts, or images; inline the resources you need first.
|
|
291
327
|
- Under WSL, containers, and remote deployments, browser paths usually cannot be handed to the host directly — prefer uploading files.
|
|
292
328
|
- Provider model lists are candidate sets only; whether a model truly supports a capability is settled by real calls.
|
|
@@ -300,7 +336,7 @@ When the plugin is enabled, it automatically registers the two bundled skills th
|
|
|
300
336
|
| [`iris-verify-ui`](.dsh/skills/iris-verify-ui/SKILL.md) | Combine screenshots, semantic inspection, element grounding, cropping, and pixel comparison into evidence-based UI acceptance |
|
|
301
337
|
| [`iris-compose-media`](.dsh/skills/iris-compose-media/SKILL.md) | Chain two or more Iris tools into media workflows: inspect-then-draw, image-to-video, video summary with narration, S2V, and more |
|
|
302
338
|
|
|
303
|
-
From 0.1.2, as long as the host provides the DSH skill registry, regular npm installs can discover and load both skills from any project directory — no need to clone this repository or configure a skill search path. When the project directory contains same-name skills, DSH's native precedence keeps using the project versions; if the skill registry is unavailable, the
|
|
339
|
+
From 0.1.2, as long as the host provides the DSH skill registry, regular npm installs can discover and load both skills from any project directory — no need to clone this repository or configure a skill search path. When the project directory contains same-name skills, DSH's native precedence keeps using the project versions; if the skill registry is unavailable, the Iris tools still load on their own.
|
|
304
340
|
|
|
305
341
|
For deterministic selection, invoke either skill with DSH's `/name` form:
|
|
306
342
|
|
|
@@ -322,7 +358,7 @@ Tests cover config merging, model identity, task lifecycle, generation actions,
|
|
|
322
358
|
|
|
323
359
|
The test scheduler runs on Node.js, launching one process per file and stopping at the first failure — no Bash involved. Temporary directories use system APIs and are cleaned up on exit. GitHub Actions defines a Linux/Windows × Node.js 22.0.0/latest 22.x matrix, with repeated natural-exit checks on the minimum version, and a pre-release hook re-runs the full suite. DSH host smoke tests on native Windows/WSL are still pending real-machine verification.
|
|
324
360
|
|
|
325
|
-
Releases are triggered by `v*` tags through `.github/workflows/release.yml`: the full test suite runs first, then the tarball is packaged, a GitHub Release is created with the workflow's built-in `GITHUB_TOKEN` (tarball attached; release notes taken from the matching CHANGELOG section), and npm publish happens when an `NPM_TOKEN` secret is configured. No local GitHub credentials are needed.
|
|
361
|
+
Releases are triggered by `v*` tags through `.github/workflows/release.yml`: the full test suite runs first, then the tarball is packaged, a GitHub Release is created with the workflow's built-in `GITHUB_TOKEN` (tarball attached; release notes taken first from `docs/releases/<version>.md`, otherwise from the matching CHANGELOG section), and npm publish happens when an `NPM_TOKEN` secret is configured. No local GitHub credentials are needed.
|
|
326
362
|
|
|
327
363
|
## Documentation
|
|
328
364
|
|