e10-ebuilder-prototype 0.5.5 → 0.5.7

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 (46) hide show
  1. package/README.md +45 -13
  2. package/dist/archive.d.ts +1 -1
  3. package/dist/archive.js +3 -0
  4. package/dist/capture.js +1 -1
  5. package/dist/common.d.ts +2 -1
  6. package/dist/common.js +24 -4
  7. package/dist/form-behavior-runtime.d.mts +1 -0
  8. package/dist/form-behavior-runtime.mjs +681 -0
  9. package/dist/form-behavior.d.ts +11 -0
  10. package/dist/form-behavior.js +169 -0
  11. package/dist/form-context.d.ts +4 -0
  12. package/dist/form-context.js +7 -5
  13. package/dist/form-generation.d.ts +24 -0
  14. package/dist/form-generation.js +367 -0
  15. package/dist/form-runtime.mjs +11 -2
  16. package/dist/host-ledger.d.ts +23 -0
  17. package/dist/host-ledger.js +183 -0
  18. package/dist/host-watch.d.ts +102 -0
  19. package/dist/host-watch.js +112 -0
  20. package/dist/html-handoff.d.ts +1 -0
  21. package/dist/html-handoff.js +30 -2
  22. package/dist/html-inspect.d.ts +2 -2
  23. package/dist/html-inspect.js +23 -51
  24. package/dist/html-interact.d.ts +36 -0
  25. package/dist/html-interact.js +216 -0
  26. package/dist/html-review-budget.d.ts +9 -0
  27. package/dist/html-review-budget.js +47 -0
  28. package/dist/html.d.ts +77 -5
  29. package/dist/html.js +155 -41
  30. package/dist/index.js +119 -44
  31. package/dist/model.d.ts +2 -1
  32. package/dist/offline-render.d.ts +11 -0
  33. package/dist/offline-render.js +71 -0
  34. package/dist/offline-store.mjs +10 -0
  35. package/dist/runtime-support.d.mts +29 -1
  36. package/dist/runtime-support.mjs +55 -5
  37. package/dist/site.js +66 -51
  38. package/dist/store.js +18 -4
  39. package/dist/templates/form-guide.md +6 -20
  40. package/dist/templates/form-task-core.md +45 -5
  41. package/dist/templates/index.html +5 -3
  42. package/dist/templates/workflow-guide.md +4 -2
  43. package/dist/vendor/environment-auth.d.ts +1 -0
  44. package/dist/vendor/environment-auth.js +4 -4
  45. package/docs/PROTOCOL.md +341 -39
  46. package/package.json +1 -1
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # e10-ebuilder-prototype
2
2
 
3
3
  根据 E10 **应用 ID 或后台应用地址生成应用原型,包含已发布菜单中的页面、建模列表和流程页面**。
4
- 版本 0.5.5,默认并发 6。保持我们的 TypeScript CLI 为主:CLI 管登录、菜单发现、配置采集、截图、任务队列、校验、恢复与打包;宿主 AI 根据完整截图或建模配置生成独立 HTML。CLI 不调用 LLM,不要求额外模型 API Key,也不调用 ui-code-agent 生成。
4
+ 版本 0.5.7;WorkBuddy Skill 新任务默认显式使用并发 8,直接调用 CLI 省略参数时仍默认 6。保持我们的 TypeScript CLI 为主:CLI 管用户所提供登录态的接入、菜单发现、配置采集、截图、任务队列、校验、恢复与打包;宿主 AI 根据完整截图或建模配置生成独立 HTML。CLI 不调用 LLM,不要求额外模型 API Key,也不调用 ui-code-agent 生成。
5
5
 
6
6
  ## 范围与交付
7
7
 
@@ -31,14 +31,15 @@ ZIP 名为 `应用页面-<appId>.zip`,位于任务目录 artifacts/;本地
31
31
  需要 Node >=22.5、npm 和已安装 Google Chrome,playwright-core 固定 1.62.1,不下载浏览器。
32
32
 
33
33
  ```sh
34
- npm install -g e10-ebuilder-prototype@0.5.4 --registry=https://registry.npmjs.org/
34
+ npm install -g e10-ebuilder-prototype@0.5.7 --registry=https://registry.npmmirror.com
35
35
  e10-ebuilder-prototype auth set --base-url https://your-e10.example.com --eteamsid-stdin
36
- e10-ebuilder-prototype run --app-id 1234567890123456789 --dir ./work/app-demo --json
36
+ e10-ebuilder-prototype run --app-id 1234567890123456789 --dir ./work/app-demo --concurrency 8 --json
37
37
  # 或使用后台应用地址:
38
- e10-ebuilder-prototype run --app-url "https://your-e10.example.com/sp/ebdapp/detail/1234567890123456789" --dir ./work/app-demo --json
38
+ e10-ebuilder-prototype run --app-url "https://your-e10.example.com/sp/ebdapp/detail/1234567890123456789" --dir ./work/app-demo --concurrency 8 --json
39
39
  ```
40
40
 
41
41
  登录值从标准输入传入并加密保存;支持 auth status / auth status --local / auth profile list|current|use NAME。
42
+ `ETEAMSID` 由用户取得并提供;工具负责接收、校验、加密保存,并注入任务专用浏览器和源站请求。用户已提供新值时直接通过 `auth set --base-url <环境地址> --eteamsid-stdin` 接入,成功后继续任务。缺失或失效且没有新值时停止并索取,不代用户登录、不使用账号密码或调用登录桥接 Skill。保留原任务目录,已有失败源按 `sourceRecovery` 重试。`auth status --local` 仅检查本地配置,不证明服务端登录态有效;凭据不在回复或日志中回显。
42
43
  地址会解析 ID 并核对环境,已有任务还绑定用户与租户。ID 保持字符串,不转成浮点数。
43
44
  状态目录 `.e10-page-capture` 与 E10_PAGE_CAPTURE_HOME/CHROME 等设置沿用,既有登录无需迁移。
44
45
 
@@ -50,10 +51,10 @@ e10-ebuilder-prototype html next --dir ./work/app-demo --brief --json
50
51
  e10-ebuilder-prototype html inspect --dir ./work/app-demo --kind page --page-id "<ID>" --token "<TOKEN>" --json
51
52
  e10-ebuilder-prototype html accept --dir ./work/app-demo --kind page --page-id "<ID>" --token "<TOKEN>" --refill --brief --json
52
53
  e10-ebuilder-prototype html accept --dir ./work/app-demo --kind form --page-id "<菜单键>" --token "<TOKEN>" --json
53
- e10-ebuilder-prototype pack --dir ./work/app-demo --json
54
+ e10-ebuilder-prototype pack --dir ./work/app-demo --concurrency 8 --json
54
55
  ```
55
56
 
56
- 同一个生成队列默认最多 6 个任务,可按用户需求 --concurrency 1..8。page 输入 screenshotPath;form 输入 sourcePath,附带 contextPath 分片索引、guidePath 当前页面类型的精简规范及 referenceGuidePath 按需参考手册、runtimePath 固定存储脚本及 navigationPath 已发布目标映射。一个协调者串行 accept/fail/next,任务只写自己的草稿;宿主支持且允许并行时补位执行,否则如实采用顺序生成。
57
+ 同一个生成队列默认最多 6 个任务,可按用户需求 --concurrency 1..8。page 输入 screenshotPath;form 输入 sourcePath,附带 generationPath 去重生成视图和 contextPath 原始分片回退索引、guidePath 当前页面类型的精简规范及 referenceGuidePath 按需参考手册、runtimePath 固定存储脚本及 navigationPath 已发布目标映射。一个协调者串行 accept/fail/next,任务只写自己的草稿;宿主支持且允许并行时补位执行,否则如实采用顺序生成。
57
58
 
58
59
  生成文件为真实 DOM、内联 CSS/JS/SVG,无外部资源或后台调用。页面忠实还原视觉结构,空数据用一致 Mock 内容填充。表单按当前模式/字段/选项/按钮及布局依据生成,固定种子约 20 条主记录、明细每条 2–5 行;所有统计由数据推导。完整规范随 CLI 打包,不能用“能打开表格”代替验收。
59
60
 
@@ -108,7 +109,7 @@ npm run test:package
108
109
  npm run pack:skill
109
110
  ```
110
111
 
111
- artifacts/ 生成 npm tarball、本地版 Skill ZIP、registry 四文件版 Skill ZIP。本地版含本产品 tarball 及散列,依赖从公网 npm 安装;registry 版从公网 npm 安装固定版本,要求对应版本先发布。打包命令不会自动发布 npm 或上传 Skill。
112
+ artifacts/ 生成 npm tarball、本地版 Skill ZIP、registry 四文件版 Skill ZIP。本地版含本产品 tarball 及散列,依赖从淘宝 npm 镜像安装;registry 版从 https://registry.npmmirror.com 安装固定版本,与 WorkBuddy 中 ui-code-agent 对齐,要求对应版本已在官方 npm 发布并同步镜像。npm 发布使用 https://registry.npmjs.org/。打包命令不会自动发布 npm 或上传 Skill。
112
113
 
113
114
  WorkBuddy 推荐提示词和执行流程见 [Skill](integrations/workbuddy-skill/SKILL.md),迁入能力对应关系见 [表单能力核对](docs/FORM-PARITY.md),协议见 [PROTOCOL](docs/PROTOCOL.md)。
114
115
 
@@ -125,23 +126,54 @@ Windows 使用原生 Node,无需 Bash/WSL/Python;支持 WorkBuddy 内置 npm
125
126
 
126
127
  ## WorkBuddy 生成效率(0.5.5)
127
128
 
128
- 首次 status 未就绪时仅提示“首次使用需要初始化工作环境,大概需要几分钟,完成后自动继续。”
129
+ 先执行 status 检查智能体团队。0.5.6 候选在未开启或无法确认时返回 `blocked=true`、
130
+ `WAITING_HOST` 和固定 `userMessage`,WorkBuddy 必须立即向用户展示并等待开启、重启和复查;
131
+ 安装、认证写入、采集、生成和打包均被阻止,不提供串行降级。`ready` 仅表示运行时已安装,
132
+ `taskReady` 才同时反映宿主前置条件。已有任务和产物保留,复查通过后从原目录继续。
133
+
134
+ 宿主检查通过、首次 status 运行时未就绪时仅提示“首次使用需要初始化工作环境,大概需要几分钟,完成后自动继续。”
129
135
  ensure 保留后台进度与耗时,成功后自动继续,后续正常使用不再提示初始化或依赖名称。不要给 CLI 命令附加 tail 或吞掉退出码。
130
136
 
131
137
  页面先看完整原图再写完整首版,不要求逐像素测量。html inspect 统一生成离线校对截图,
132
- 相同源码与完整截图可复用;宿主实际看图并集中修正,最多两轮视觉微调。业务缺项或运行错误仍需处理。
138
+ 相同源码与完整截图可复用;宿主实际看图并集中修正,最多两轮视觉微调。CLI 按 token 记录不同 HTML 版本;首版加两轮之后,具体业务缺项或运行错误修复需追加 `--repair-reason "具体问题"` 并留痕。不能因预算用完就跳过 ready 验证。
133
139
 
134
- WorkBuddy 子任务显式使用主任务当前实际模型,保留可继承的思考配置,不写死某个模型。
135
- 后台生成完成一个接收一个;协调者在 html next / accept/fail --refill 时传
136
- `--host-active-tokens`,把所有尚未确认原生终态的 token(包含已 accepted 的 worker)计入额度,
137
- 只派发返回的 host.dispatchTokens。首次无存量任务时传 JSON 数组 `[]`。子任务 ready 后直接
140
+ WorkBuddy 子任务模型按用户指定或宿主配置选择,无需与主任务一致;未指定时使用宿主默认配置。
141
+ 后台生成完成一个接收一个;新任务首次用 html next --host-events '[]' 启用持久登记,
142
+ 随后只提交原生 started/terminal 增量事件,CLI 保留未确认退出的额度。旧任务继续
143
+ --host-active-tokens 快照协议,不混用。只派发 host.dispatchTokens。子任务 ready 后直接
138
144
  最终回复并结束,不提前 SendMessage 报完成;有原生任务退出未确认时保留槽位,全部终态后才打包。
139
145
  promptPath 将页面细节留在对应子任务。连接失败确认旧写者已退出后恢复一次,已有草稿可继续;持续失败明确报告。
140
146
  并发额度不是实际活跃数,也不保证线性提速,结论以同输入同模型的实际验收计时为准。
141
147
 
148
+ 0.5.6 候选为协调者增加 `host.reconcile` 和只读 `html watch`:本批仅一个后台 Bash 检查,
149
+ 回执变化或 60 秒到期后唤醒宿主核对原生状态;超时和 ready 均不自动释放名额。
150
+ `activeCount` 明确为已派发未确认退出数,已交付待退出和异常状态分别报告。
151
+ `--brief` 配合原生活跃 token 快照时,已派发任务只返回身份字段,减少反复复制完整描述。
152
+ 底层取消后自动重试必须确认写者已退出;CLI 检查通过不等于桌面宿主通知链路已验证。
153
+
142
154
  0.5.5 返回宿主后台能力预检、实际生效参数与失败源的直接恢复命令;
143
155
  续跑参数冲突明确报错,截图仍维持默认 10 秒上限。WorkBuddy 设置 → 智能体 →
144
156
  智能体团队管理应处于启用状态,并确认原生 Agent 返回后台任务编号和独立完成事件。
145
157
  表单校对一次处理 1440/390 两个视口,共用一次 Chrome 启动;不变的产物继续复用。
146
158
  macOS 受控 Chrome 关闭自动更新使用的临时应用克隆,不修改宿主文件保护。
147
159
  生成任务只读当前页面类型的精简指南,完整手册按需查阅;不为多截状态反复改写成品。
160
+
161
+ 0.5.6 候选的表单/流程 worker 先读 `generationPath`:重复配置以引用或明确差异保留,
162
+ 未知属性、按钮条件/完整动作链与模式差异都保留,并由 CLI 校验还原完整性。
163
+ 参考 HTML 提取字段父子结构和主明细绑定,脚本/样式/真实记录不再整份必读;
164
+ 原始 `contextPath` 留作无法识别部分的定向回退。业务表单本身仍由宿主 AI 生成,
165
+ 此改动不代表固定渲染器,也不代表所有业务交互已经通过验收。
166
+ 离线输入体积与预处理耗时见 `docs/acceptance/worker-context-0.5.6-20260917.md`。
167
+
168
+
169
+ 0.5.6 本地候选补充:新 WorkBuddy 任务用 `html next --host-events '[]'` 启用轻量任务登记,
170
+ 后续只提交真实原生 started/terminal 事件,不重复手抄整个活跃 token 数组。已有任务保留原协议。
171
+ 表单严格沿用原包功能范围;固定 `E10FormUI` 接管常见字段、筛选排序分页和配置允许的草稿事务,
172
+ AI 决定布局与有来源的映射;暂未覆盖的原包能力仍需按原规范模拟/披露,不能默认删掉。
173
+ 校对和打包共用 file URL 加载,打包失败保留具体诊断以便定向修复。上述改动尚不代表新一轮
174
+ 整应用生成提速实测,也不代表已经全面固定实现原包所有控件/动作。
175
+
176
+ 0.5.6 候选的 CLI 已按命令分支加载实现;状态、认证、队列和宿主前置拦截不再提前初始化
177
+ 浏览器和打包依赖。playwright-core 仅在实际启动 Chrome 时加载,校对缓存命中也不加载。
178
+ 每条命令仍是独立 Node 进程,bootstrap 的运行时文件摘要与固定依赖检查继续执行;
179
+ 此项优化减少启动开销,源站请求、截图、离线渲染和 AI 生成耗时仍取决于实际工作量。
package/dist/archive.d.ts CHANGED
@@ -56,7 +56,7 @@ export declare function pack(store: Store, s: TaskState): Promise<{
56
56
  file: string | undefined;
57
57
  status: "running" | "succeeded" | "failed" | "pending";
58
58
  sourceSha256: string;
59
- promptVersion: 1 | 2 | 12 | 6 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | 11;
59
+ promptVersion: 1 | 2 | 12 | 16 | 6 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 17;
60
60
  startedAt: string;
61
61
  finishedAt: string | undefined;
62
62
  error: {
package/dist/archive.js CHANGED
@@ -5,7 +5,10 @@ import { pipeline } from 'node:stream/promises';
5
5
  import { ZipFile } from 'yazl';
6
6
  import { atomicJson, CaptureError, fileDigest } from './common.js';
7
7
  import { buildSite } from './site.js';
8
+ import { activeHostWorkers } from './host-ledger.js';
8
9
  export async function pack(store, s) {
10
+ if ((await activeHostWorkers(store))?.length)
11
+ throw new CaptureError('HOST_WORKER_ACTIVE', '后台执行尚未确认退出,先核对原生终态并登记');
9
12
  const status = await store.status(s);
10
13
  if (!s.pages ||
11
14
  status.pending ||
package/dist/capture.js CHANGED
@@ -2,7 +2,6 @@ import fs from 'node:fs/promises';
2
2
  import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import { chromeExecutable, cleanupOwnedDirectory, terminateProcessTree, processAlive, renameWithRetry, environmentValue, } from './runtime-support.mjs';
5
- import { chromium } from 'playwright-core';
6
5
  import { bounded, CaptureError, digest, errorInfo, sleep } from './common.js';
7
6
  import { filenames } from './store.js';
8
7
  import { Monitor, ready, sample, lazyScroll } from './readiness.js';
@@ -31,6 +30,7 @@ const macDisabledFeatures = [
31
30
  'MacAppCodeSignClone',
32
31
  ];
33
32
  export async function launchChrome() {
33
+ const { chromium } = await import('playwright-core');
34
34
  const env = { ...process.env };
35
35
  if (process.platform === 'win32') {
36
36
  const local = environmentValue(env, 'LOCALAPPDATA') || path.join(os.homedir(), 'AppData', 'Local');
package/dist/common.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const VERSION = "0.5.5";
1
+ export declare const VERSION = "0.5.7";
2
2
  export declare class CaptureError extends Error {
3
3
  code: string;
4
4
  details?: unknown | undefined;
@@ -18,3 +18,4 @@ export declare function errorInfo(error: unknown, secret?: string): {
18
18
  code: string;
19
19
  message: string;
20
20
  };
21
+ export declare function cleanupFailure(operation: unknown, cleanup: unknown, phase: string, operationCompleted: boolean): CaptureError;
package/dist/common.js CHANGED
@@ -3,7 +3,7 @@ import { renameWithRetry } from './runtime-support.mjs';
3
3
  import { createReadStream } from 'node:fs';
4
4
  import path from 'node:path';
5
5
  import { createHash, randomUUID } from 'node:crypto';
6
- export const VERSION = '0.5.5';
6
+ export const VERSION = '0.5.7';
7
7
  export class CaptureError extends Error {
8
8
  code;
9
9
  details;
@@ -42,8 +42,14 @@ export async function atomicJson(filename, value) {
42
42
  await fs.writeFile(temp, JSON.stringify(value, null, 2) + '\n', { flag: 'wx', mode: 0o600 });
43
43
  await renameWithRetry(temp, filename);
44
44
  }
45
- finally {
46
- await fs.rm(temp, { force: true });
45
+ catch (error) {
46
+ try {
47
+ await fs.rm(temp, { force: true });
48
+ }
49
+ catch (cleanup) {
50
+ throw cleanupFailure(error, cleanup, 'atomic-write', false);
51
+ }
52
+ throw error;
47
53
  }
48
54
  }
49
55
  export async function readJson(filename) {
@@ -79,9 +85,23 @@ export function id(value, label = 'id') {
79
85
  export function errorInfo(error, secret = '') {
80
86
  const e = error;
81
87
  const clean = (v) => (secret ? v.replaceAll(secret, '[REDACTED]') : v);
88
+ const guard = /\[safe-delete\]\[(SAFE_DELETE_BULK_CONFIRM_REQUIRED|SAFE_DELETE_BULK_REJECTED)\]/.exec(e.message || '')?.[1];
82
89
  return {
83
- code: e.code || (e.name === 'TimeoutError' ? 'OPERATION_TIMEOUT' : 'UNEXPECTED_ERROR'),
90
+ code: guard || e.code || (e.name === 'TimeoutError' ? 'OPERATION_TIMEOUT' : 'UNEXPECTED_ERROR'),
84
91
  message: clean(e.message || String(error)),
85
92
  ...(e.details ? { details: JSON.parse(clean(JSON.stringify(e.details))) } : {}),
86
93
  };
87
94
  }
95
+ export function cleanupFailure(operation, cleanup, phase, operationCompleted) {
96
+ const cleanupError = errorInfo(cleanup);
97
+ const operationError = operation === undefined ? undefined : errorInfo(operation);
98
+ const primary = cleanupError.code.startsWith('SAFE_DELETE_BULK_')
99
+ ? cleanupError
100
+ : operationError || cleanupError;
101
+ return new CaptureError(primary.code, primary.message, {
102
+ phase,
103
+ operationCompleted,
104
+ operationError,
105
+ cleanupError,
106
+ });
107
+ }
@@ -0,0 +1 @@
1
+ export function installFormBehavior(contract: any): void;