@anweat/dsh-browser 0.1.8 → 0.1.10

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 (55) hide show
  1. package/README.md +56 -6
  2. package/lib/approval-policy.js +19 -0
  3. package/lib/approval-policy.js.map +1 -1
  4. package/lib/auth-profiles.js +10 -1
  5. package/lib/auth-profiles.js.map +1 -1
  6. package/lib/automation-assets-rpc.d.ts +5 -0
  7. package/lib/automation-assets-rpc.js +63 -0
  8. package/lib/automation-assets-rpc.js.map +1 -0
  9. package/lib/automation-assets.d.ts +139 -0
  10. package/lib/automation-assets.js +372 -0
  11. package/lib/automation-assets.js.map +1 -0
  12. package/lib/automation-development.d.ts +13 -0
  13. package/lib/automation-development.js +37 -0
  14. package/lib/automation-development.js.map +1 -0
  15. package/lib/automation-execution.d.ts +14 -0
  16. package/lib/automation-execution.js +55 -0
  17. package/lib/automation-execution.js.map +1 -0
  18. package/lib/browser-service.d.ts +5 -0
  19. package/lib/browser-service.js +66 -14
  20. package/lib/browser-service.js.map +1 -1
  21. package/lib/client/SettingsCard.js +50 -2
  22. package/lib/client/SettingsCard.js.map +1 -1
  23. package/lib/client/automation-assets-client.d.ts +38 -0
  24. package/lib/client/automation-assets-client.js +83 -0
  25. package/lib/client/automation-assets-client.js.map +1 -0
  26. package/lib/client/form.d.ts +1 -1
  27. package/lib/client/form.js +26 -0
  28. package/lib/client/form.js.map +1 -1
  29. package/lib/client/index.d.ts +11 -0
  30. package/lib/client/index.js +11 -1
  31. package/lib/client/index.js.map +1 -1
  32. package/lib/client/locales.d.ts +28 -0
  33. package/lib/client/locales.js +10 -0
  34. package/lib/client/locales.js.map +1 -1
  35. package/lib/client/styles.d.ts +11 -0
  36. package/lib/client/styles.js +4 -1
  37. package/lib/client/styles.js.map +1 -1
  38. package/lib/client.js +533 -4
  39. package/lib/client.js.map +1 -1
  40. package/lib/config.d.ts +4 -0
  41. package/lib/config.js +21 -0
  42. package/lib/config.js.map +1 -1
  43. package/lib/freedom.d.ts +4 -1
  44. package/lib/freedom.js +10 -0
  45. package/lib/freedom.js.map +1 -1
  46. package/lib/index.d.ts +3 -1
  47. package/lib/index.js +7 -2
  48. package/lib/index.js.map +1 -1
  49. package/lib/scripts.d.ts +1 -1
  50. package/lib/scripts.js +3 -2
  51. package/lib/scripts.js.map +1 -1
  52. package/lib/tools.d.ts +2 -1
  53. package/lib/tools.js +149 -12
  54. package/lib/tools.js.map +1 -1
  55. package/package.json +1 -1
package/README.md CHANGED
@@ -14,17 +14,17 @@ dsh plugin --profile web add ./dsh-browser
14
14
  dsh --profile web
15
15
  ```
16
16
 
17
- > 依赖 `@deepseek-ai/*` 已发布到 npm(`^0.1.0-rc.6`)。
18
- > 若你的 harness 是本地源码 checkout(如 `0.1.0-rc.5`),版本号可能有出入——用
17
+ > 依赖 `@deepseek-ai/*` 已发布到 npm(当前适配基线为 `^0.1.1-rc.2`)。
18
+ > 若你的 harness 是包含未发布提交的本地源码 checkout,版本号可能有出入——用
19
19
  > `dsh plugin --profile web add ./<path>` 并在 profile 的 `pnpm-workspace.yaml`
20
20
  > 里对齐版本后重装即可。
21
21
 
22
22
  ## 从旧版本升级
23
23
 
24
- Web Search Pro 与浏览器插件应同步升级;`dsh-web-search-pro >= 0.1.8` 需要 `@anweat/dsh-browser >= 0.1.8`。本版修正了 `web_snapshot screenshot=false` 仍写入 PNG 的问题,并让同一 `automationMode` 同时管辖 Web Search Pro 的缓存、规则和依赖安装操作。
24
+ Web Search Pro 与浏览器插件应同步升级;`dsh-web-search-pro >= 0.1.8` 需要 `@anweat/dsh-browser >= 0.1.8`。0.1.10 修复工具描述被 DSH 误解析为 prompt 变量、补齐独立开发环境的 DSH peer 安装;0.1.9 新增受治理的可复用 Recipe / UserScript 草稿,要求真实浏览器回放通过后才能手工激活,同时修正 Chromium 就绪探测、服务禁用开关和持久登录态校验。
25
25
 
26
26
  ```bash
27
- dsh plugin --profile web add @anweat/dsh-browser@^0.1.8 dsh-web-search-pro@^0.1.8
27
+ dsh plugin --profile web add @anweat/dsh-browser@^0.1.10 dsh-web-search-pro@^0.1.11
28
28
  ```
29
29
 
30
30
  升级后完整停止并重启 Web profile,再调用 `browser_status`、`browser_opencli_status` 和 `web_backend_status`;仅刷新网页不会重新加载插件服务或 Web Search Pro 配置面板。尤其不要只升级 Web Search Pro:新的工具目录、Patchright 运行时和调用缓冲都来自浏览器插件。
@@ -92,7 +92,7 @@ export function apply(ctx: Context) {
92
92
 
93
93
  `unrestricted` 会允许模型直接运行外部脚本、通用 CLI 和安装命令,只应在隔离的测试 profile 或明确授权的自动化环境中使用;日常 profile 保持 `standard`。它只取消人工确认,**不会取消 `usagePolicy` 的并发、突发、页数、深度、重试与冷却保护**。模式改变后需要重启 DSH profile,工具目录才会按新配置重新注册。
94
94
 
95
- ## 工具(最多 18 个)
95
+ ## 工具(最多 21 个)
96
96
 
97
97
  | 工具 | 作用 |
98
98
  |---|---|
@@ -110,11 +110,43 @@ export function apply(ctx: Context) {
110
110
  | `browser_script_run_builtin` | 在独立 Playwright context 中运行内置只读脚本 |
111
111
  | `browser_userscript_run` | 运行外部 UserScript;强制域名匹配,审批策略由模式决定 |
112
112
  | `browser_recipe_run` | 最多 25 步 Playwright Recipe;支持等待、定位、表单、键盘、提取、断言和截图 |
113
+ | `browser_automation_search` | 只有显式关键词调用才检索;可限定 active/draft/all、域名和类型,最多返回 `retrievalTopK` 条摘要 |
114
+ | `browser_automation_develop` | 按确切 ID 读取源码,或显式保存、静态校验、真实回放草稿;永远不能激活资产 |
115
+ | `browser_automation_run` | 按 ID 运行已激活资产;再次执行限域和输入大小校验,审批由 `automationMode` 决定 |
113
116
  | `browser_opencli_status` | 实际运行 OpenCLI doctor,报告 daemon/extension/profile 连通性 |
114
117
  | `browser_opencli_catalog` | 对 OpenCLI 大目录按 query/site/access/strategy 过滤,单次最多返回 100 条 |
115
118
  | `browser_opencli_run` | 通用 OpenCLI argv 网关;除 `unrestricted` 外触发 DSH 原生一次性审批 |
116
119
  | `browser_crawl` | 匿名、有限广度遍历;默认同源,强制使用全局调用缓冲和单次页数/深度预算 |
117
120
 
121
+ ## 可复用自动化资产(实验性)
122
+
123
+ > **Experimental:** Recipe/UserScript 的积累、模型开发、检索和复用接口仍可能调整。建议先在隔离 profile 中启用,审阅草稿并完成真实浏览器回放后再手动激活;不要把它作为无人监管的生产写操作入口。
124
+
125
+ 自动化执行自由度与资产持久化是两套独立开关。`automationMode: unrestricted` 只影响执行审批,不会让 Agent 自动保存脚本;默认 `automationAssets.persistenceMode: suggest` 仅对成功的 `browser_recipe_run` 记录脱敏语义步骤。具体输入会替换为 `{{input}}` / `{{secret}}`,会话 ID 只保存短哈希,不保存页面正文、cookie、token、密码或聊天记录。
126
+
127
+ 默认在 14 天窗口内,同一域名和步骤指纹至少成功 3 次、来自至少 2 个会话且成功率达到 80%,面板才出现“是否总结”候选。每天最多提示 2 次;候选、草稿和已激活资产均有数量上限。推荐流程是:
128
+
129
+ 1. 候选达到阈值后,在“浏览器自动化 → 可复用自动化资产”选择“总结为草稿”或“暂不总结”。
130
+ 2. 在脚本列表点选草稿;只有此时前端才按 ID 读取完整 recipe / UserScript。编辑器支持 recipe 和带 `@match`、`@grant none` 的 UserScript。UserScript 可从只读对象 `__DSH_INPUTS__` 读取 `inputNames` 声明的运行时输入,输入不会写入资产文件。
131
+ 3. 保存后先做静态校验,再填写测试 URL/输入执行真实浏览器回放。只有真实回放成功才可手动激活;已激活版本不可原地编辑,避免后台行为静默漂移。
132
+ 4. Agent 用 `browser_automation_search` 获取有界摘要,再用 `browser_automation_run` 按 ID 调用。检索默认 top 5、目录预算约 800 tokens,源码不会进入模型上下文。
133
+
134
+ `persistenceMode` 可选 `off | manual | suggest | auto-draft`。日常使用建议 `suggest`;`auto-draft` 只适合隔离测试 profile,并且仍不会自动激活。`activationMode` 当前默认并推荐 `manual`;`auto-tested` 作为后续真实沙箱回放策略的保留配置,不会把一次静态校验当成生产激活依据。
135
+
136
+ ### 模型显式开发 recipe / UserScript
137
+
138
+ 模型目录不会预载任何 recipe 或源码。需要批量索引等强指向自动化时,模型按以下顺序显式访问:
139
+
140
+ 1. 调用 `browser_automation_search(query="batch-index issues", status="draft|active", kind="recipe")`,仅得到 ID、名称、标签、域名、输入名和运行统计。
141
+ 2. 确认要修改某项后,调用 `browser_automation_develop(action="get", id="...")`;只有这一步会把单个资产的完整 recipe/源码带入当前上下文。
142
+ 3. `action="save"` 可直接声明新的 recipe,或保存带 `@match` / `@grant none` 的 UserScript;只能生成/更新 draft。默认每个模型会话最多写 3 次,仍受全局 `maxDrafts` 限制。
143
+ 4. `action="validate"` 只做结构与 UserScript 元数据校验,不提供激活资格;`action="test"` 必须给 URL 和声明输入,执行真实 Playwright 回放,成功后才标记 `passed`。
144
+ 5. 激活、归档和回滚只在可视化面板完成,模型开发工具没有对应动作。
145
+
146
+ recipe 建议把检索意图固化在 `name`、`description` 和 `tags`,例如 `batch-index`、`issues`、`community-search`。检索采用小规模确定性关键词评分和 token 预算,不自动把整个资产库升级成模型工具,也不使用隐藏的全量 prompt 注入。
147
+
148
+ `modelDevelopmentEnabled: false` 会在重启后直接从模型工具目录移除开发入口;`standard` 保存草稿和真实回放均需审批,`autonomous` 可直接保存草稿但真实回放仍需审批,只有 `unrestricted` 才会跳过回放审批。所有模式仍执行域名、UserScript 元数据、输入、源码大小和使用频率限制。
149
+
118
150
  ## 使用策略:防止过度调用的缓冲
119
151
 
120
152
  `usagePolicy` 是资源与站点压力保护,不是审批系统。所有模式共用同一个进程内 Governor:
@@ -203,6 +235,23 @@ Recipe 适合让模型生成可审计、可复现的多步操作,不必生成
203
235
  retryLimit: 2
204
236
  backoffBaseMs: 1000
205
237
  cooldownMs: 30000
238
+ automationAssets:
239
+ enabled: true
240
+ persistenceMode: suggest # off | manual | suggest | auto-draft
241
+ activationMode: manual # 当前推荐值;不会因静态校验自动激活
242
+ minSuccessfulRuns: 3
243
+ minDistinctSessions: 2
244
+ successWindowDays: 14
245
+ minSuccessRate: 0.8
246
+ maxCandidates: 20
247
+ candidateTtlDays: 14
248
+ maxSuggestionsPerDay: 2
249
+ maxDrafts: 10
250
+ maxActiveAssets: 50
251
+ retrievalTopK: 5
252
+ catalogTokenBudget: 800
253
+ modelDevelopmentEnabled: true
254
+ maxModelDraftWritesPerSession: 3
206
255
  storageStatePath: '' # Playwright 登录态 JSON(复用已登录会话)
207
256
  authProfiles:
208
257
  forum:
@@ -221,7 +270,7 @@ Recipe 适合让模型生成可审计、可复现的多步操作,不必生成
221
270
  verbose: false
222
271
  ```
223
272
 
224
- 这些字段同时进入 Host settings 命名空间和专用可视化卡片:打开 `设置 → 插件 → 插件配置 → 浏览器自动化`,可调整工具自由度、Playwright/Patchright、OpenCLI、`usagePolicy` 与限域登录态。保存后需要重启 profile。若没有看到“浏览器自动化”卡片,先确认 `@anweat/dsh-browser` 已同步升级,再完整重启,而不是只刷新 Web Search Pro 页面。
273
+ 这些字段同时进入 Host settings 命名空间和专用可视化卡片:打开 `设置 → 插件 → 插件配置 → 浏览器自动化`,可调整工具自由度、Playwright/Patchright、OpenCLI、`usagePolicy`、自动化资产策略与限域登录态;同一卡片包含候选提示、脚本列表、JSON 编辑器、测试、激活和归档操作。保存运行时配置后需要重启 profile;资产 CRUD 通过 loopback-only Host RPC 即时落盘。若没有看到卡片,先确认浏览器插件已同步升级并完整重启,而不是只刷新 Web Search Pro 页面。
225
274
 
226
275
  ### Patchright 可选内核
227
276
 
@@ -296,6 +345,7 @@ opencli doctor
296
345
  pnpm install # 装依赖(playwright / patchright / opencli / @deepseek-ai/*)
297
346
  pnpm test
298
347
  pnpm run build # tsc → lib/
348
+ pnpm run verify # typecheck → build → real-browser tests → client bundle check
299
349
  node scripts/install-browser.mjs # 安装 chromium 内核(发布前验证,可选)
300
350
  ```
301
351
 
@@ -59,6 +59,25 @@ export function browserPolicyDecision(name, args, mode = 'standard') {
59
59
  return { kind: 'ask', reason: 'Run a multi-step Playwright recipe with page mutations: ' + actions.join(', ') };
60
60
  }
61
61
  }
62
+ if (name === 'browser_automation_run') {
63
+ if (mode === 'read-only')
64
+ return { kind: 'deny', reason: `Reusable automation execution is disabled by automationMode=${mode}` };
65
+ if (mode === 'autonomous' || mode === 'unrestricted')
66
+ return { kind: 'allow' };
67
+ return { kind: 'ask', reason: 'Run an active reusable browser automation asset' };
68
+ }
69
+ if (name === 'browser_automation_develop') {
70
+ const action = String(args?.action ?? '');
71
+ if (['get', 'validate'].includes(action))
72
+ return { kind: 'allow' };
73
+ if (mode === 'read-only')
74
+ return { kind: 'deny', reason: `Automation draft writes are disabled by automationMode=${mode}` };
75
+ if (action === 'test' && mode !== 'unrestricted')
76
+ return { kind: 'ask', reason: 'Replay a reusable automation draft in a real browser context' };
77
+ if (mode === 'standard')
78
+ return { kind: 'ask', reason: 'Save a bounded local reusable automation draft' };
79
+ return { kind: 'allow' };
80
+ }
62
81
  if (name === 'web_deps' && args?.action === 'install') {
63
82
  if (mode === 'read-only')
64
83
  return { kind: 'deny', reason: `Dependency installation is disabled by automationMode=${mode}` };
@@ -1 +1 @@
1
- {"version":3,"file":"approval-policy.js","sourceRoot":"","sources":["../src/approval-policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"approval-policy.js","sourceRoot":"","sources":["../src/approval-policy.ts"],"names":[],"mappings":"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"}
@@ -19,10 +19,19 @@ export class AuthProfileStore {
19
19
  throw new Error('auth profile ' + id + ' is not allowed for ' + url.hostname);
20
20
  if (!profile.storageStatePath?.trim())
21
21
  throw new Error('auth profile ' + id + ' has no storageStatePath');
22
- return { id, ...profile, persistState: profile.persistState ?? false };
22
+ const persistState = profile.persistState ?? false;
23
+ if (!fs.existsSync(profile.storageStatePath)) {
24
+ if (!persistState)
25
+ throw new Error('auth profile ' + id + ' storageState file does not exist: ' + profile.storageStatePath);
26
+ }
27
+ else if (!fs.statSync(profile.storageStatePath).isFile()) {
28
+ throw new Error('auth profile ' + id + ' storageState path is not a file: ' + profile.storageStatePath);
29
+ }
30
+ return { id, ...profile, persistState };
23
31
  }
24
32
  list() {
25
33
  return Object.entries(this.profiles).sort(([a], [b]) => a.localeCompare(b)).map(([id, profile]) => ({ id, allowedDomains: [...(profile.allowedDomains ?? [])], persistState: profile.persistState ?? false }));
26
34
  }
27
35
  }
36
+ import fs from 'node:fs';
28
37
  //# sourceMappingURL=auth-profiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-profiles.js","sourceRoot":"","sources":["../src/auth-profiles.ts"],"names":[],"mappings":"AAYA,SAAS,WAAW,CAAC,QAAgB,EAAE,OAA0B;IAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACtD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACjF,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,WAA8C,EAAE;QAAhD,aAAQ,GAAR,QAAQ,CAAwC;IAAG,CAAC;IAEjF,OAAO,CAAC,EAAU,EAAE,SAAiB;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAA;QAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,sBAAsB,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC3I,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,0BAA0B,CAAC,CAAA;QACzG,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK,EAAE,CAAA;IACxE,CAAC;IAED,IAAI;QACF,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC,CAAC,CAAA;IAChN,CAAC;CACF"}
1
+ {"version":3,"file":"auth-profiles.js","sourceRoot":"","sources":["../src/auth-profiles.ts"],"names":[],"mappings":"AAYA,SAAS,WAAW,CAAC,QAAgB,EAAE,OAA0B;IAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACtD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACjF,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,WAA8C,EAAE;QAAhD,aAAQ,GAAR,QAAQ,CAAwC;IAAG,CAAC;IAEjF,OAAO,CAAC,EAAU,EAAE,SAAiB;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAA;QAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,sBAAsB,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC3I,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,0BAA0B,CAAC,CAAA;QACzG,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK,CAAA;QAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,qCAAqC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAC7H,CAAC;aAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,oCAAoC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;QACzG,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,CAAA;IACzC,CAAC;IAED,IAAI;QACF,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC,CAAC,CAAA;IAChN,CAAC;CACF;AACD,OAAO,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,5 @@
1
+ /** Loopback-only Host RPC for the automation asset review UI. */
2
+ import type { Context } from '@deepseek-ai/cordis';
3
+ import type { AutomationAssetStore } from './automation-assets.ts';
4
+ import type { BrowserService } from './browser-service.ts';
5
+ export declare function registerAutomationAssetRpc(ctx: Context, store: AutomationAssetStore, service: BrowserService): void;
@@ -0,0 +1,63 @@
1
+ /** Loopback-only Host RPC for the automation asset review UI. */
2
+ import { executeAutomationAsset } from "./automation-execution.js";
3
+ const CHANNEL = '/dsh-browser-assets';
4
+ function record(payload) {
5
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload))
6
+ throw new Error('request payload must be an object');
7
+ if (JSON.stringify(payload).length > 100_000)
8
+ throw new Error('request payload exceeds 100000 characters');
9
+ return payload;
10
+ }
11
+ function stringField(payload, name) {
12
+ const value = payload[name];
13
+ if (typeof value !== 'string' || value.length < 1 || value.length > 200)
14
+ throw new Error(`${name} must be a non-empty string`);
15
+ return value;
16
+ }
17
+ export function registerAutomationAssetRpc(ctx, store, service) {
18
+ ctx.inject(['connection'], (connectionCtx) => {
19
+ const connection = connectionCtx.connection;
20
+ const dispose = connection.rpc.handle(CHANNEL, async (endpoint, rawPayload) => {
21
+ try {
22
+ const payload = record(rawPayload);
23
+ let value;
24
+ switch (endpoint) {
25
+ case 'snapshot':
26
+ value = store.snapshot();
27
+ break;
28
+ case 'get':
29
+ value = store.get(stringField(payload, 'id')) ?? null;
30
+ break;
31
+ case 'save':
32
+ value = store.saveDraft(payload.asset);
33
+ break;
34
+ case 'summarize':
35
+ value = store.summarizeCandidate(stringField(payload, 'id'));
36
+ break;
37
+ case 'dismiss':
38
+ store.dismissCandidate(stringField(payload, 'id'));
39
+ value = store.snapshot();
40
+ break;
41
+ case 'validate':
42
+ value = store.validate(stringField(payload, 'id'));
43
+ break;
44
+ case 'test': {
45
+ const result = await executeAutomationAsset(service, store, stringField(payload, 'id'), stringField(payload, 'url'), payload.inputs, 'draft');
46
+ value = result.asset;
47
+ break;
48
+ }
49
+ case 'status':
50
+ value = store.setStatus(stringField(payload, 'id'), stringField(payload, 'status'));
51
+ break;
52
+ default: return { ok: false, error: { code: 'not-found', message: `unknown automation asset endpoint: ${endpoint}` } };
53
+ }
54
+ return { ok: true, value };
55
+ }
56
+ catch (error) {
57
+ return { ok: false, error: { code: 'bad-request', message: String(error instanceof Error ? error.message : error).slice(0, 500) } };
58
+ }
59
+ }, { authority: 'loopback' });
60
+ connectionCtx.effect(() => dispose, 'dsh-browser: automation asset RPC');
61
+ });
62
+ }
63
+ //# sourceMappingURL=automation-assets-rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation-assets-rpc.js","sourceRoot":"","sources":["../src/automation-assets-rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ /** Bounded, local automation-asset lifecycle and retrieval. */
2
+ import type { BrowserRecipeStep } from './automation.ts';
3
+ export declare const ASSET_PERSISTENCE_MODES: readonly ["off", "manual", "suggest", "auto-draft"];
4
+ export type AssetPersistenceMode = typeof ASSET_PERSISTENCE_MODES[number];
5
+ export declare const ASSET_ACTIVATION_MODES: readonly ["manual", "auto-tested"];
6
+ export type AssetActivationMode = typeof ASSET_ACTIVATION_MODES[number];
7
+ export type AutomationAssetKind = 'recipe' | 'userscript';
8
+ export type AutomationAssetStatus = 'draft' | 'active' | 'archived';
9
+ export interface AutomationAssetPolicyInput {
10
+ enabled?: boolean;
11
+ directory?: string;
12
+ persistenceMode?: AssetPersistenceMode;
13
+ activationMode?: AssetActivationMode;
14
+ minSuccessfulRuns?: number;
15
+ minDistinctSessions?: number;
16
+ successWindowDays?: number;
17
+ minSuccessRate?: number;
18
+ maxCandidates?: number;
19
+ candidateTtlDays?: number;
20
+ maxSuggestionsPerDay?: number;
21
+ maxDrafts?: number;
22
+ maxActiveAssets?: number;
23
+ retrievalTopK?: number;
24
+ catalogTokenBudget?: number;
25
+ modelDevelopmentEnabled?: boolean;
26
+ maxModelDraftWritesPerSession?: number;
27
+ }
28
+ export interface AutomationAssetPolicy {
29
+ enabled: boolean;
30
+ directory: string;
31
+ persistenceMode: AssetPersistenceMode;
32
+ activationMode: AssetActivationMode;
33
+ minSuccessfulRuns: number;
34
+ minDistinctSessions: number;
35
+ successWindowDays: number;
36
+ minSuccessRate: number;
37
+ maxCandidates: number;
38
+ candidateTtlDays: number;
39
+ maxSuggestionsPerDay: number;
40
+ maxDrafts: number;
41
+ maxActiveAssets: number;
42
+ retrievalTopK: number;
43
+ catalogTokenBudget: number;
44
+ modelDevelopmentEnabled: boolean;
45
+ maxModelDraftWritesPerSession: number;
46
+ }
47
+ export interface AutomationCandidate {
48
+ id: string;
49
+ fingerprint: string;
50
+ domain: string;
51
+ title: string;
52
+ steps: BrowserRecipeStep[];
53
+ successfulRuns: number;
54
+ failedRuns: number;
55
+ sessionIds: string[];
56
+ firstSeenAt: string;
57
+ lastSeenAt: string;
58
+ suggestedAt?: string;
59
+ dismissedAt?: string;
60
+ }
61
+ export interface AutomationAsset {
62
+ id: string;
63
+ kind: AutomationAssetKind;
64
+ status: AutomationAssetStatus;
65
+ name: string;
66
+ description: string;
67
+ domains: string[];
68
+ tags: string[];
69
+ inputNames: string[];
70
+ recipe?: BrowserRecipeStep[];
71
+ source?: string;
72
+ revision: number;
73
+ testStatus: 'untested' | 'passed' | 'failed';
74
+ testMessage?: string;
75
+ successCount: number;
76
+ failureCount: number;
77
+ createdAt: string;
78
+ updatedAt: string;
79
+ lastRunAt?: string;
80
+ }
81
+ export interface AutomationAssetSummary {
82
+ id: string;
83
+ kind: AutomationAssetKind;
84
+ status: AutomationAssetStatus;
85
+ name: string;
86
+ description: string;
87
+ domains: string[];
88
+ tags: string[];
89
+ inputNames: string[];
90
+ revision: number;
91
+ testStatus: AutomationAsset['testStatus'];
92
+ successCount: number;
93
+ failureCount: number;
94
+ updatedAt: string;
95
+ lastRunAt?: string;
96
+ }
97
+ export interface AutomationCandidateSummary {
98
+ id: string;
99
+ domain: string;
100
+ title: string;
101
+ successfulRuns: number;
102
+ failedRuns: number;
103
+ distinctSessions: number;
104
+ firstSeenAt: string;
105
+ lastSeenAt: string;
106
+ suggestedAt?: string;
107
+ dismissedAt?: string;
108
+ }
109
+ export interface AutomationAssetSnapshot {
110
+ policy: Omit<AutomationAssetPolicy, 'directory'>;
111
+ candidates: AutomationCandidateSummary[];
112
+ assets: AutomationAssetSummary[];
113
+ }
114
+ export declare function defaultAutomationAssetDirectory(): string;
115
+ export declare function resolveAutomationAssetPolicy(input?: AutomationAssetPolicyInput): AutomationAssetPolicy;
116
+ /** Remove concrete form values and non-semantic output from a successful recipe. */
117
+ export declare function normalizeRecipeForCandidate(steps: BrowserRecipeStep[]): BrowserRecipeStep[];
118
+ export declare class AutomationAssetStore {
119
+ readonly policy: AutomationAssetPolicy;
120
+ private readonly statePath;
121
+ private state;
122
+ constructor(policy: AutomationAssetPolicy);
123
+ snapshot(): AutomationAssetSnapshot;
124
+ get(id: string): AutomationAsset | undefined;
125
+ recordRecipe(url: string, steps: BrowserRecipeStep[], sessionId: string, ok: boolean, now?: number): AutomationCandidate | undefined;
126
+ summarizeCandidate(id: string): AutomationAsset;
127
+ dismissCandidate(id: string): void;
128
+ saveDraft(input: Partial<AutomationAsset> & Pick<AutomationAsset, 'kind' | 'name'>): AutomationAsset;
129
+ validate(id: string): AutomationAsset;
130
+ setStatus(id: string, status: AutomationAssetStatus): AutomationAsset;
131
+ search(query: string, domain?: string, status?: AutomationAssetStatus | 'all', kind?: AutomationAssetKind): AutomationAssetSummary[];
132
+ noteRun(id: string, ok: boolean): void;
133
+ noteTestResult(id: string, ok: boolean, url: string): void;
134
+ assertTarget(asset: AutomationAsset, url: string): void;
135
+ private requireAsset;
136
+ private prune;
137
+ private read;
138
+ private write;
139
+ }