@seqyuan/ennote 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -13
- package/bin/ennote.js +539 -28
- package/out/404.html +1 -1
- package/out/__next.__PAGE__.txt +4 -4
- package/out/__next._full.txt +16 -16
- package/out/__next._head.txt +4 -4
- package/out/__next._index.txt +8 -8
- package/out/__next._tree.txt +4 -4
- package/out/_next/static/chunks/{0l9f15ts9g8~w.css → 042svogz3qv71.css} +3 -2
- package/out/_next/static/chunks/05rc5pno5-uub.js +8 -0
- package/out/_next/static/chunks/0_yt3a8a9j1yd.js +1 -0
- package/out/_next/static/chunks/0gee9kb6nwlbz.js +1 -0
- package/out/_next/static/chunks/{0j5eflqzx5_i2.css → 0k-~g5-_lbznv.css} +1 -1
- package/out/_next/static/chunks/0r3uxu723bo0o.css +4 -0
- package/out/_not-found/__next._full.txt +14 -14
- package/out/_not-found/__next._head.txt +4 -4
- package/out/_not-found/__next._index.txt +8 -8
- package/out/_not-found/__next._not-found.__PAGE__.txt +2 -2
- package/out/_not-found/__next._not-found.txt +3 -3
- package/out/_not-found/__next._tree.txt +3 -3
- package/out/_not-found.html +1 -1
- package/out/_not-found.txt +14 -14
- package/out/graphs/__next._full.txt +16 -16
- package/out/graphs/__next._head.txt +4 -4
- package/out/graphs/__next._index.txt +8 -8
- package/out/graphs/__next._tree.txt +4 -4
- package/out/graphs/__next.graphs.__PAGE__.txt +4 -4
- package/out/graphs/__next.graphs.txt +3 -3
- package/out/graphs.html +1 -1
- package/out/graphs.txt +16 -16
- package/out/index.html +2 -2
- package/out/index.txt +16 -16
- package/out/roles/__next._full.txt +16 -16
- package/out/roles/__next._head.txt +4 -4
- package/out/roles/__next._index.txt +8 -8
- package/out/roles/__next._tree.txt +4 -4
- package/out/roles/__next.roles.__PAGE__.txt +4 -4
- package/out/roles/__next.roles.txt +3 -3
- package/out/roles.html +1 -1
- package/out/roles.txt +16 -16
- package/package.json +29 -5
- package/skills/bio-workspace/SKILL.md +11 -0
- package/skills/bio-workspace/skill.json +7 -0
- package/skills/skill-creator/SKILL.md +87 -0
- package/skills/skill-creator/skill.json +7 -0
- package/out/_next/static/chunks/0qavlry.eoeqb.js +0 -1
- package/out/_next/static/chunks/0uuaelr0o3sep.css +0 -4
- package/out/_next/static/chunks/0yuqqoxr67j_q.js +0 -8
- /package/out/_next/static/{Mlvju0_auR3eZP02RZD1- → 1IULeStFBlnqxNnZLaKnI}/_buildManifest.js +0 -0
- /package/out/_next/static/{Mlvju0_auR3eZP02RZD1- → 1IULeStFBlnqxNnZLaKnI}/_clientMiddlewareManifest.js +0 -0
- /package/out/_next/static/{Mlvju0_auR3eZP02RZD1- → 1IULeStFBlnqxNnZLaKnI}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
# Ennote
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本地优先、可审计的 Agent 运行时,核心能力是 **Agent Flow**。
|
|
4
|
+
|
|
5
|
+
Ennote 把长任务编排成可恢复的 Agent Flow:Task 图、Role 绑定、预算、审批、
|
|
6
|
+
checkpoint 和恢复状态都持久化在本地 SQLite 中。它不依赖账号或云端即可启动、
|
|
7
|
+
计算和保存结果;生信是参考工作流,而不是平台承诺。
|
|
8
|
+
|
|
9
|
+
## 核心特点
|
|
10
|
+
|
|
11
|
+
### Agent Flow
|
|
12
|
+
|
|
13
|
+
- 用 Task 图表达依赖、分支、收敛和只读 fan-out,而不是把复杂流程塞进一条提示词。
|
|
14
|
+
- Agent Flow 是不可变版本;每次运行冻结 Role、Skill、模型和权限配置。
|
|
15
|
+
- 每个 Task 是独立子 Run,带自己的预算、审批和输出契约。
|
|
16
|
+
- Task 的 `writes` 声明只影响调度(reader/writer lane 与 disjoint writers),**不是沙箱隔离边界**。
|
|
17
|
+
- 串行执行、checkpoint 续跑、取消与恢复都已落地,并经过真实 Provider 验证。
|
|
18
|
+
- Graph 编辑器、版本校验、导入/导出共用同一套文件格式。
|
|
19
|
+
|
|
20
|
+
### 可审计执行
|
|
21
|
+
|
|
22
|
+
- append-only Run 事件、commit-before-publish、durable SQLite 历史。
|
|
23
|
+
- 危险工具调用走审批;支持 standing grants 与冻结的策略快照。
|
|
24
|
+
- 失败/中断 Run 可恢复,Session 可 rewind 和 branch,不覆盖已有历史。
|
|
25
|
+
- 每个请求、Run、审批和 Artifact 都有稳定的本地标识,便于回溯“谁在什么时候做了什么”。
|
|
26
|
+
|
|
27
|
+
### 本地优先
|
|
28
|
+
|
|
29
|
+
- `ennoworker` 只监听 loopback,`ennogate` 负责认证、静态 UI 和进程监督。
|
|
30
|
+
- 没有账号、Relay 或 Connect Token 也能完整使用 localhost/LAN Web。
|
|
31
|
+
- 云端不可用只会影响远程访问,不会停止 Worker、取消 Run 或删除数据。
|
|
32
|
+
- LAN 访问默认关闭;需要显式开启,并优先使用 TLS。
|
|
33
|
+
|
|
34
|
+
### 可组合
|
|
35
|
+
|
|
36
|
+
- 不可变 Role、Skills、MCP 工具、typed Artifact 和托管委托。
|
|
37
|
+
- 生信示例(`skills/bio-workspace`)展示如何把本地数据、shell 工具和 Agent Flow 组合起来。
|
|
4
38
|
|
|
5
39
|
## 架构
|
|
6
40
|
|
|
@@ -9,9 +43,12 @@ AI-native bioinformatics agent workspace.
|
|
|
9
43
|
```
|
|
10
44
|
Browser → ennogate (Go, :45131) → ennoworker (Go, :0, loopback)
|
|
11
45
|
守门人 劳动者
|
|
12
|
-
认证 / 代理 / 静态文件
|
|
46
|
+
认证 / 代理 / 静态文件 SQLite / Agent Flow / 审批 / 工具 / Skill
|
|
13
47
|
```
|
|
14
48
|
|
|
49
|
+
Worker 是 Project、Session、Message、Run、Attention、审批、Role/模型配置、
|
|
50
|
+
Workspace、Artifact 和委托状态的唯一权威。Web UI 只是同一套 Worker API 的客户端。
|
|
51
|
+
|
|
15
52
|
## 快速开始
|
|
16
53
|
|
|
17
54
|
```bash
|
|
@@ -32,7 +69,66 @@ ennote start
|
|
|
32
69
|
- npm 包(`@seqyuan/ennote`)只包含 CLI 脚本和编译后的静态前端(约 12 MB)。
|
|
33
70
|
- 首次 `ennote start` 时,CLI 会从本仓库([seqyuan/ennote](https://github.com/seqyuan/ennote))的 GitHub Release 按当前平台/架构下载 Go 二进制(ennogate + ennoworker),缓存到 `~/.ennote/bin/`,后续启动不再下载。
|
|
34
71
|
- 支持平台:linux-x64 / linux-arm64 / darwin-x64 / darwin-arm64。
|
|
35
|
-
- 发布流程:打版本 tag(`vX.Y.Z`)后,[release workflow](.github/workflows/release.yml)
|
|
72
|
+
- 发布流程:打版本 tag(`vX.Y.Z`)后,[release workflow](.github/workflows/release.yml) 运行测试、构建四平台二进制、验证 npm 版本已生效,最后创建 GitHub Release。
|
|
73
|
+
|
|
74
|
+
### 审查 Agent Pack
|
|
75
|
+
|
|
76
|
+
`ennote pack inspect` 调用正在运行的 Worker 做只读审查:不安装、不执行、不验证签名、不写磁盘。
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
ennote pack inspect ~/Downloads/cell-qc.enpack # 归档
|
|
80
|
+
ennote pack inspect ~/src/cell-qc # 目录包(需含 pack.yaml)
|
|
81
|
+
ennote pack inspect ~/Downloads/cell-qc.enpack --json # 原始 inspect 结果
|
|
82
|
+
ennote pack inspect ~/Downloads/cell-qc.enpack --documents # 附带 flow/role/skill 正文
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
输出包含 `manifestDigest`(`pack.yaml` 原始字节)和 `packDigest`(排序后的 payload 行,排除顶层 `pack.sig`)、flow/role/skill 摘要、能力信封与 warnings。`format: flow` 与 `format: graph` 会如实标注,不会被悄悄降级。Worker 未启动时命令直接失败并提示 `ennote start`,不做离线降级。
|
|
86
|
+
|
|
87
|
+
### 安装 / 列出 / 卸载 Agent Pack
|
|
88
|
+
|
|
89
|
+
安装同样只通过 loopback Worker 落盘,CLI 自己不做解析或写盘。
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
ennote pack install ~/Downloads/cell-qc.enpack --dry-run # 只出计划,不写任何文件
|
|
93
|
+
ennote pack install ~/Downloads/cell-qc.enpack # 正式安装(可传目录包)
|
|
94
|
+
ennote pack install ~/src/cell-qc --as-flow qc-review=cell-qc-review
|
|
95
|
+
ennote pack list # 已安装 Pack 摘要
|
|
96
|
+
ennote pack remove seqyuan/cell-qc-review # 卸载
|
|
97
|
+
ennote pack remove seqyuan/cell-qc-review --force # 覆盖本地编辑 / 共享 Role 的拒绝
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
安装支持三种形态:Role-only Pack(每个 Role 变成 Worker 全局 Role 并发布 revision)、`format: graph` Flow Pack(未发布 revision 的 Graph draft + 其私有 Role/Skill)、以及 `format: flow` Agent Flow Pack(未发布 revision 的完整 FlowDefinition draft + 其 flow-local Role/Skill;安装前用真实 `agentflow.Validator` 校验 check/fan-out/terminal/next,不会降级成 graph)。非空 `mcp`、非空 `requires` 仍会被明确拒绝并返回稳定错误码,不会降级安装。dry-run 恒返回计划(含 blockers),正式安装遇到 blocker/冲突返回 422。
|
|
101
|
+
|
|
102
|
+
安装后的 source 默认不可运行:`format: graph` 需要发布 Graph revision;`format: flow` 需要 `POST /v1/flows/{id}/publish` 发布 revision,再由 Project GraphBinding 显式启用。安装器永远不会自动发布或自动启用。
|
|
103
|
+
|
|
104
|
+
### 从 v0.1.x 升级
|
|
105
|
+
|
|
106
|
+
v0.1.x 的旧数据库(`data/ennote.db`)不再被读取,但也不会被删除:升级后首次启动会把它(含 `-wal`/`-shm`)原子移动到 `data/legacy-v1/` 并打印一条 `archived legacy V1 database` 警告。迁移完成后再次启动不会改动该归档。需要找回旧数据时,从 `data/legacy-v1/` 手动复制即可。
|
|
107
|
+
|
|
108
|
+
### 局域网访问
|
|
109
|
+
|
|
110
|
+
默认只监听 `127.0.0.1`。需要从局域网打开时:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# 推荐:TLS 终止在 ennogate,cookie 带 Secure
|
|
114
|
+
ENNOTE_HOSTNAME=0.0.0.0 ENNOTE_ALLOW_LAN=1 \
|
|
115
|
+
ENNOTE_TLS_CERT=/path/cert.pem ENNOTE_TLS_KEY=/path/key.pem ennogate
|
|
116
|
+
|
|
117
|
+
# 不推荐:显式接受明文风险(密码和 7 天 cookie 会明文过网)
|
|
118
|
+
ENNOTE_HOSTNAME=0.0.0.0 ENNOTE_ALLOW_LAN=1 ENNOTE_ALLOW_INSECURE_LAN=1 ennogate
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
非 loopback 地址在缺少 `ENNOTE_ALLOW_LAN=1` 时会拒绝启动;缺少 TLS 且没有 `ENNOTE_ALLOW_INSECURE_LAN=1` 时同样拒绝启动。
|
|
122
|
+
|
|
123
|
+
ennogate 对每个请求校验 `Host` 头(防 DNS rebinding):`localhost`、loopback 地址和任意 IP 字面量始终放行;用主机名(含反向代理、自定义 DNS 名)访问时必须显式列入 `ENNOTE_GATE_ALLOWED_HOSTS`(逗号分隔),否则返回 403,请改用 IP 或 `127.0.0.1` 访问:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
ENNOTE_HOSTNAME=0.0.0.0 ENNOTE_ALLOW_LAN=1 \
|
|
127
|
+
ENNOTE_GATE_ALLOWED_HOSTS=ennote.example \
|
|
128
|
+
ENNOTE_TLS_CERT=/path/cert.pem ENNOTE_TLS_KEY=/path/key.pem ennogate
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
未设置 `ENNOTE_GATE_ALLOWED_HOSTS` 时,主机名访问(包括 `myhost.local` 这类 mDNS 名)一律 403:攻击者可以让自己的域名解析到 127.0.0.1,但无法让浏览器在 `Host` 头里写入一个未经授权的主机名。
|
|
36
132
|
|
|
37
133
|
## 目录
|
|
38
134
|
|
|
@@ -46,33 +142,40 @@ ennoworker/
|
|
|
46
142
|
config/ 配置与环境变量
|
|
47
143
|
domain/ 领域类型和状态机
|
|
48
144
|
events/ Durable EventWriter + 订阅 Hub
|
|
145
|
+
graphrun/ Agent Flow 执行与恢复
|
|
49
146
|
llm/ Provider 接口、OpenAI-compatible、fake
|
|
50
147
|
runs/ Run Coordinator(并发、取消、恢复)
|
|
51
148
|
skills/ Skill bundle 加载与 per-run 快照
|
|
52
|
-
store/ SQLite
|
|
53
|
-
tools/
|
|
149
|
+
store/ SQLite、Repository
|
|
150
|
+
tools/ 文件/Shell/审批工具 + registry
|
|
54
151
|
workspace/ Path jail、bubblewrap 沙箱
|
|
55
|
-
|
|
56
|
-
|
|
152
|
+
sessionmigrations/ Session SQL 版本化迁移
|
|
153
|
+
catalogmigrations/ Catalog 投影迁移
|
|
154
|
+
usagemigrations/ Usage 投影迁移
|
|
57
155
|
app/ Next.js 前端(React + SSE 消费)
|
|
58
156
|
contracts/ OpenAPI 3.1 契约
|
|
59
157
|
skills/ 内置 Skill bundle
|
|
60
|
-
docs/ 设计与实施计划
|
|
61
158
|
```
|
|
62
159
|
|
|
63
|
-
##
|
|
160
|
+
## 当前重点
|
|
64
161
|
|
|
65
|
-
|
|
162
|
+
- Agent Flow 的可观测性、恢复语义和实际采用,而不是继续扩张产品表面。
|
|
163
|
+
- Run 的可审计性、审批体验和本地留痕。
|
|
164
|
+
- 本地优先与沙箱边界(bwrap 网络隔离、SandboxNone 的凭据保护)。
|
|
165
|
+
- 生信作为参考工作流维护,不承诺 Warm Kernel、Notebook 或 Publication 工作台。
|
|
66
166
|
|
|
67
167
|
## 开发
|
|
68
168
|
|
|
69
169
|
```bash
|
|
70
170
|
make dev # 启动 ennogate + ennoworker
|
|
71
|
-
make test-go # Go
|
|
171
|
+
make test-go # Go 测试(go test ./...)
|
|
72
172
|
make test # JS 测试
|
|
73
|
-
make lint # ESLint
|
|
173
|
+
make lint # ESLint + design token guard
|
|
74
174
|
make typecheck # tsc --noEmit
|
|
75
175
|
make build # 构建静态前端和本机 Go 产物
|
|
176
|
+
npm run test:e2e # Playwright
|
|
76
177
|
npm run release:prepare # 构建四个平台的发布包并检查 tarball
|
|
77
|
-
npm run smoke:installed
|
|
178
|
+
npm run smoke:installed # 安装临时 tarball 并验证双进程生命周期
|
|
78
179
|
```
|
|
180
|
+
|
|
181
|
+
CI 会在 Go 测试矩阵里额外运行 `-race`。
|