Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,17 @@
(`parent` or sender), not `F(sender)`. Channel pairing and ack treat
`msg_N` as per-family; HTTP ack is bound to the URL family, and CLI
`line ack` fail-closes when the same id exists in more than one family.
- Console P3: overlay artifact rail on the existing workspace-detail
channel/event panes. Authority is
`.dyro/families/<parent>/artifacts.jsonl` plus jailed
`artifacts/<id>` bytes. Images are same-origin bearer `fetch` then
`blob:` URLs (`img-src 'self' blob:`). Video is a card with a
copyable `--dry-run` open command; no `<video>` and no `media-src`.
Artifact HTTP is GET only. Inspection worker stays read-only and
cannot write artifacts. Planted path, URL, or credential titles are
blanked on read; artifact ids reject a `..` substring. Unpaired
channel logs are no longer hidden as unread 0; `msg_N` page keys
stay `(family, id)`. Version stays `0.7.7`.
- User slash Skill `dyro-line-family` (`/dyro-line-family`) preflights
`line spawn` / `line merge` / `line sync` and prints one `--yes` command
for the human. It does not execute the mutation, invent `--push`, or
Expand Down
10 changes: 6 additions & 4 deletions docs/designs/console-v2-live-family-signals.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ operator 每个家族组的固定成员

hash 只保存安全 alias 与当前 tab:`#w/<alias>`、`#w/<alias>/family`、`#w/<alias>/events`、`#w/<alias>/channel`。不把 bearer、路径或消息正文写入 URL。

详情里已有的线 / 任务 / 目标清单、独立 Proof inspect 和关闭按钮不变。点击任务仍进入既有 Task 摘要,不新开「任务工作室」。产物栏是频道 / 事件上的 overlay,不是第四个一级 tab;P3 才渲染,P1 / P2 只保留占位文案「产物尚未开放」。
详情里已有的线 / 任务 / 目标清单、独立 Proof inspect 和关闭按钮不变。点击任务仍进入既有 Task 摘要,不新开「任务工作室」。产物栏是频道 / 事件上的 overlay,不是第四个一级 tab;P1 / P2 只保留占位文案「产物尚未开放」,P3 已落地并按能力渲染

---

Expand Down Expand Up @@ -219,7 +219,7 @@ dyro --workspace example --dry-run line sync core_pay

## 6. 产物栏

P3 才实现。P1 / P2 的频道行若带 `artifact` kind,只显示「产物尚未开放」和安全 id,不取文件。
P3 已落地。P1 / P2 的频道行若带 `artifact` kind,只显示「产物尚未开放」和安全 id,不取文件。

权威位置是 overlay,不是产品 git worktree,也不是 Proof store:

Expand Down Expand Up @@ -369,7 +369,7 @@ dyro --workspace example line ack <id>

其它字段、未知 kind、`to` 落在家族外、空 body 的 `decision` / `contract`,全部拒绝。成功响应是统一 Console 封套,`data` 只含新行 id 与 seq。该 POST 走既有 session、Host、Origin、Content-Length、并发和 10 秒 deadline;body 上限 4 KiB。

meta `surfaces` 增加 `events`(P1)`families`(P2)。页面按能力拉取,overview 轮询仍不带这些列表。
meta `surfaces` 增加 `events`(P1)`families`(P2)与 `artifacts`(P3)。页面按能力拉取,overview 轮询仍不带这些列表。

---

Expand All @@ -395,7 +395,7 @@ meta `surfaces` 增加 `events`(P1)与 `families`(P2)。页面按能力

### P1 · 事件 + 图

P1 已在本 PR 落地(事件尾、`parent` 投影、一层家族图、SSE `after=`)。P3 仍未实现
P1 已在本列车落地(事件尾、`parent` 投影、一层家族图、SSE `after=`)。P3 已落地

- 写入并读取 `.dyro/events.jsonl`。
- line DTO 投影 `parent`。
Expand All @@ -417,6 +417,8 @@ P2 已落地:`channel.jsonl` / `acks`、`line post|inbox|ack`、`next family_u

### P3 · 产物

P3 已落地:overlay 清单与同源图像(bearer `fetch` 后赋 `blob:` URL),视频只出卡片,不扫描 harness home 或 sidecar 输出目录。

- overlay 产物清单与同源图像。
- 视频只出卡片。
- 不扫描 harness home,不把 sidecar 输出目录当成家族产物。
Expand Down
2 changes: 2 additions & 0 deletions src/dyro/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,8 @@ def _print_family_unacked_attention(config: Config) -> None:
payload = _family_unacked_fields(config)["family_unacked"]
if isinstance(payload, dict) and payload.get("count"):
print("家族频道有未读信号")
if isinstance(payload, dict) and payload.get("inconsistent_families"):
print("家族频道日志不一致")


def _inbox_viewer(config: Config) -> str:
Expand Down
7 changes: 7 additions & 0 deletions src/dyro/console/_inspect_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,13 @@ def main(argv: list[str] | None = None) -> int:
service_arguments["registry_loader"] = lambda: target_registry
service = ConsoleOverviewService(**service_arguments)
operation = request.get("op")
if operation in {
"post_channel",
"artifact_write",
"artifacts_write",
"put_artifact",
}:
raise ConsoleOverviewError("OVERVIEW_UNAVAILABLE")
if operation == "overview":
payload = service.page(
cursor=request.get("cursor"),
Expand Down
8 changes: 4 additions & 4 deletions src/dyro/console/assets.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ class ConsoleAsset:
),
"app.js": (
"text/javascript; charset=utf-8",
"194ca77cdfac96539dd391f43d6d14a5e15bf594ec21a280c886a21536124c23",
60441,
"643f02fdf319179cca0d8ce91caa6b97a7dbf41d789bc7cc242ad88ffb6a1b1d",
68786,
),
"styles.css": (
"text/css; charset=utf-8",
"810b196f7e72418d7253c1f2aa490f82fbd51a98a12d2db2d51e8303b4632f07",
15492,
"b17091b8edb7b64b19f079d5c2a37a83aaead4de9ce0f2ba0cbf0d2002208728",
16056,
),
}

Expand Down
Loading