@coralai/sps-cli 0.65.86 → 0.65.91

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 (130) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/commands/cardMarkComplete.js +2 -2
  3. package/dist/commands/cardMarkComplete.js.map +1 -1
  4. package/dist/console/index.d.ts.map +1 -1
  5. package/dist/console/index.js +2 -0
  6. package/dist/console/index.js.map +1 -1
  7. package/dist/console/lib/artPaths.d.ts +5 -5
  8. package/dist/console/lib/artPaths.d.ts.map +1 -1
  9. package/dist/console/lib/artPaths.js +8 -26
  10. package/dist/console/lib/artPaths.js.map +1 -1
  11. package/dist/console/routes/skills.d.ts.map +1 -1
  12. package/dist/console/routes/skills.js +30 -6
  13. package/dist/console/routes/skills.js.map +1 -1
  14. package/dist/console/routes/storage.d.ts +21 -0
  15. package/dist/console/routes/storage.d.ts.map +1 -0
  16. package/dist/console/routes/storage.js +115 -0
  17. package/dist/console/routes/storage.js.map +1 -0
  18. package/dist/console/routes/templates.d.ts.map +1 -1
  19. package/dist/console/routes/templates.js +104 -18
  20. package/dist/console/routes/templates.js.map +1 -1
  21. package/dist/console/routes/workers.d.ts.map +1 -1
  22. package/dist/console/routes/workers.js +9 -4
  23. package/dist/console/routes/workers.js.map +1 -1
  24. package/dist/core/agents/AgentBackend.d.ts +1 -1
  25. package/dist/core/agents/AgentBackend.js +1 -1
  26. package/dist/core/agents/resolveBackend.d.ts +1 -1
  27. package/dist/core/agents/resolveBackend.js +1 -1
  28. package/dist/core/agents/resolveBackend.js.map +1 -1
  29. package/dist/core/intel/agentsConfig.d.ts.map +1 -1
  30. package/dist/core/intel/agentsConfig.js +5 -3
  31. package/dist/core/intel/agentsConfig.js.map +1 -1
  32. package/dist/core/pathFence.d.ts +20 -0
  33. package/dist/core/pathFence.d.ts.map +1 -0
  34. package/dist/core/pathFence.js +60 -0
  35. package/dist/core/pathFence.js.map +1 -0
  36. package/dist/core/skills/policy.js +1 -1
  37. package/dist/core/templates/templatePackage.d.ts +55 -0
  38. package/dist/core/templates/templatePackage.d.ts.map +1 -1
  39. package/dist/core/templates/templatePackage.js +97 -2
  40. package/dist/core/templates/templatePackage.js.map +1 -1
  41. package/dist/daemon/sessionDaemon.d.ts +1 -0
  42. package/dist/daemon/sessionDaemon.d.ts.map +1 -1
  43. package/dist/daemon/sessionDaemon.js +6 -0
  44. package/dist/daemon/sessionDaemon.js.map +1 -1
  45. package/dist/daemon/storageSyncLoop.d.ts +9 -0
  46. package/dist/daemon/storageSyncLoop.d.ts.map +1 -0
  47. package/dist/daemon/storageSyncLoop.js +70 -0
  48. package/dist/daemon/storageSyncLoop.js.map +1 -0
  49. package/dist/engines/StageEngine.d.ts.map +1 -1
  50. package/dist/engines/StageEngine.js +4 -4
  51. package/dist/engines/StageEngine.js.map +1 -1
  52. package/dist/main.js +6 -0
  53. package/dist/main.js.map +1 -1
  54. package/dist/providers/art/artEvents.d.ts +5 -0
  55. package/dist/providers/art/artEvents.d.ts.map +1 -1
  56. package/dist/providers/art/artEvents.js +30 -1
  57. package/dist/providers/art/artEvents.js.map +1 -1
  58. package/dist/providers/art/atlas.d.ts +0 -2
  59. package/dist/providers/art/atlas.d.ts.map +1 -1
  60. package/dist/providers/art/atlas.js +4 -14
  61. package/dist/providers/art/atlas.js.map +1 -1
  62. package/dist/providers/art/withinDir.d.ts.map +1 -1
  63. package/dist/providers/art/withinDir.js +20 -0
  64. package/dist/providers/art/withinDir.js.map +1 -1
  65. package/dist/providers/storage/FakeStorage.d.ts +14 -0
  66. package/dist/providers/storage/FakeStorage.d.ts.map +1 -0
  67. package/dist/providers/storage/FakeStorage.js +33 -0
  68. package/dist/providers/storage/FakeStorage.js.map +1 -0
  69. package/dist/providers/storage/MinioBackend.d.ts +31 -0
  70. package/dist/providers/storage/MinioBackend.d.ts.map +1 -0
  71. package/dist/providers/storage/MinioBackend.js +60 -0
  72. package/dist/providers/storage/MinioBackend.js.map +1 -0
  73. package/dist/providers/storage/StorageBackend.d.ts +43 -0
  74. package/dist/providers/storage/StorageBackend.d.ts.map +1 -0
  75. package/dist/providers/storage/StorageBackend.js +29 -0
  76. package/dist/providers/storage/StorageBackend.js.map +1 -0
  77. package/dist/providers/storage/keys.d.ts +33 -0
  78. package/dist/providers/storage/keys.d.ts.map +1 -0
  79. package/dist/providers/storage/keys.js +52 -0
  80. package/dist/providers/storage/keys.js.map +1 -0
  81. package/dist/providers/storage/scanWorkspace.d.ts +56 -0
  82. package/dist/providers/storage/scanWorkspace.d.ts.map +1 -0
  83. package/dist/providers/storage/scanWorkspace.js +205 -0
  84. package/dist/providers/storage/scanWorkspace.js.map +1 -0
  85. package/dist/providers/storage/storageConfig.d.ts +46 -0
  86. package/dist/providers/storage/storageConfig.d.ts.map +1 -0
  87. package/dist/providers/storage/storageConfig.js +94 -0
  88. package/dist/providers/storage/storageConfig.js.map +1 -0
  89. package/dist/providers/storage/syncProject.d.ts +67 -0
  90. package/dist/providers/storage/syncProject.d.ts.map +1 -0
  91. package/dist/providers/storage/syncProject.js +136 -0
  92. package/dist/providers/storage/syncProject.js.map +1 -0
  93. package/dist/providers/storage/syncRunner.d.ts +59 -0
  94. package/dist/providers/storage/syncRunner.d.ts.map +1 -0
  95. package/dist/providers/storage/syncRunner.js +119 -0
  96. package/dist/providers/storage/syncRunner.js.map +1 -0
  97. package/dist/providers/storage/syncScope.d.ts +25 -0
  98. package/dist/providers/storage/syncScope.d.ts.map +1 -0
  99. package/dist/providers/storage/syncScope.js +68 -0
  100. package/dist/providers/storage/syncScope.js.map +1 -0
  101. package/dist/providers/storage/syncable.d.ts +47 -0
  102. package/dist/providers/storage/syncable.d.ts.map +1 -0
  103. package/dist/providers/storage/syncable.js +84 -0
  104. package/dist/providers/storage/syncable.js.map +1 -0
  105. package/dist/services/LogService.d.ts +0 -12
  106. package/dist/services/LogService.d.ts.map +1 -1
  107. package/dist/services/LogService.js +2 -61
  108. package/dist/services/LogService.js.map +1 -1
  109. package/dist/services/SkillService.d.ts +15 -1
  110. package/dist/services/SkillService.d.ts.map +1 -1
  111. package/dist/services/SkillService.js +19 -3
  112. package/dist/services/SkillService.js.map +1 -1
  113. package/package.json +11 -2
  114. package/skills/web-smoke/SKILL.md +145 -0
  115. package/dist/core/agents/workerOutputSink.d.ts +0 -4
  116. package/dist/core/agents/workerOutputSink.d.ts.map +0 -1
  117. package/dist/core/agents/workerOutputSink.js +0 -39
  118. package/dist/core/agents/workerOutputSink.js.map +0 -1
  119. package/dist/runtime/stub/NoopBackend.d.ts +0 -29
  120. package/dist/runtime/stub/NoopBackend.d.ts.map +0 -1
  121. package/dist/runtime/stub/NoopBackend.js +0 -56
  122. package/dist/runtime/stub/NoopBackend.js.map +0 -1
  123. package/dist/runtime/stub/NoopService.d.ts +0 -23
  124. package/dist/runtime/stub/NoopService.d.ts.map +0 -1
  125. package/dist/runtime/stub/NoopService.js +0 -136
  126. package/dist/runtime/stub/NoopService.js.map +0 -1
  127. package/dist/runtime/stub/index.d.ts +0 -8
  128. package/dist/runtime/stub/index.d.ts.map +0 -1
  129. package/dist/runtime/stub/index.js +0 -8
  130. package/dist/runtime/stub/index.js.map +0 -1
@@ -0,0 +1,145 @@
1
+ ---
2
+ name: web-smoke
3
+ description: 网页/游戏产物的运行时自检手册——用 headless 浏览器真跑一遍,抓 console error / pageerror / 资源加载失败,判"画面到底出来没有";配环境错 vs 产物错的归因协议。
4
+ category: workflow
5
+ audience: worker
6
+ tags: [web, testing, game, canvas]
7
+ keywords: [烟测, smoke, 自检, headless, playwright, chromium, 控制台报错, 白屏, 渲染]
8
+ whenToUse: 交付一个能在浏览器里跑的产物(游戏/网页/H5)之前,自己先跑一遍确认它真的能打开、不白屏、控制台不报错。
9
+ insteadUse: 只是取网页文字内容→web-reach;判画面美术质量是否达标→visual-rubric;确定性图像运算→art-chain。
10
+ ---
11
+
12
+ # 网页产物运行时自检(烟测)
13
+
14
+ **"我改完了"不等于"它能跑"。** 交付前自己跑一遍,比让审核replay你的 bug 便宜得多。
15
+
16
+ ---
17
+
18
+ ## 1. 先看项目有没有**自带**烟测脚本 —— 有就用它,别自己写
19
+
20
+ ```bash
21
+ cat template.json 2>/dev/null | head -30 # 看有没有 "smoke" 声明
22
+ ls scripts/smoke.mjs scripts/smoke-checks/ 2>/dev/null
23
+ ```
24
+
25
+ `template.json` 里若有:
26
+
27
+ ```json
28
+ "smoke": { "script": "scripts/smoke.mjs", "checks": "gameforge", "quickFlag": "--quick" }
29
+ ```
30
+
31
+ 就按它跑:
32
+
33
+ ```bash
34
+ node scripts/smoke.mjs . --checks=gameforge # 收尾:全量
35
+ node scripts/smoke.mjs . --checks=gameforge --quick # 中途回归:快速档
36
+ ```
37
+
38
+ 🔴 **有脚本时不要自己另写一套。** 那套脚本里装着"这个产品算不算合格"的判据(比如游戏要
39
+ `window.game` 起来、要有渲染面、要没有加载失败的资源),那是产品知识 —— 你自己写的版本
40
+ 只会漏判,而**漏判的表现是"全绿",不是报错**。
41
+
42
+ ### 档位怎么选
43
+
44
+ | 时机 | 档位 | 理由 |
45
+ |---|---|---|
46
+ | 中途改了一处想确认没搞坏 | `--quick`(~10s) | 只保硬门禁,跳过压测/探针/逐页截图 |
47
+ | **交付前收尾** | **全量**(不带 `--quick`) | 截图、探针、压测都要跑 —— 审核看的就是这些 |
48
+
49
+ ---
50
+
51
+ ## 2. 没有自带脚本时,自己跑 —— 最小可用的一套
52
+
53
+ 项目里没有烟测脚本(比如临时的网页产物),按这个顺序做,**别跳过第 1 步**:
54
+
55
+ ```bash
56
+ # ① 先确认能装、能起 —— 装不上就没必要往下走
57
+ npm i -D playwright-core 2>&1 | tail -3
58
+
59
+ # ② 起一个本地静态服务(别用 file://,相对路径和 CORS 行为都不一样)
60
+ npx --yes http-server -p 0 . & # 或 python3 -m http.server 0
61
+
62
+ # ③ 用 playwright 打开、抓错、截图
63
+ ```
64
+
65
+ 最小脚本(存成 `smoke.mjs`,跑完删掉或留下都行):
66
+
67
+ ```js
68
+ import { chromium } from 'playwright-core';
69
+ const url = process.argv[2];
70
+ const problems = [];
71
+ const b = await chromium.launch();
72
+ const p = await b.newPage();
73
+ p.on('console', (m) => m.type() === 'error' && problems.push(`console: ${m.text()}`));
74
+ p.on('pageerror', (e) => problems.push(`pageerror: ${e.message}`));
75
+ p.on('requestfailed', (r) => problems.push(`load failed: ${r.url()}`));
76
+ await p.goto(url, { waitUntil: 'networkidle', timeout: 30_000 });
77
+ await p.waitForTimeout(3000); // 给它跑几秒,很多错是延迟发生的
78
+ await p.screenshot({ path: '.smoke-shot.png' }); // 🔴 一定要截图 —— 审核靠它判
79
+ await b.close();
80
+ console.log(problems.length ? problems.join('\n') : 'OK');
81
+ process.exit(problems.length ? 1 : 0);
82
+ ```
83
+
84
+ 🔴 **必须截图。** "控制台没报错"和"画面出来了"是两回事 —— 一个 canvas 全黑的游戏
85
+ 不会报任何错。审核那侧有 `visual-rubric` 按截图评分,没截图它判不了。
86
+
87
+ ---
88
+
89
+ ## 3. 🔴 退出码非 0 ≠ 产物有问题 —— 先归因,再动手
90
+
91
+ **这是本手册最重要的一条。** 归错因的后果是:你去改产物代码,而问题在环境,于是**改不好**,
92
+ 一轮一轮试,最后归因成"这个需求做不出来"。
93
+
94
+ 先分清这三类:
95
+
96
+ ```
97
+ 环境错 浏览器装不上 / 版本不匹配 / 沙盒权限 / 端口占用 / 超时
98
+ ⇒ 症状:还没打开页面就失败,或错误里出现 chromium/launch/ENOENT/EACCES/timeout
99
+ ⇒ **不要改产物代码**。报告环境问题,或按下面的自检修环境
100
+
101
+ 产物错 页面打开了,但控制台报错 / 资源 404 / 画面空白
102
+ ⇒ 症状:goto 成功,problems 里是 console/pageerror/load failed
103
+ ⇒ 这才是你该修的
104
+
105
+ 判据错 脚本判"渲染面存在"的方式与本项目对不上(比如它找 canvas,而你做的是 DOM 页面)
106
+ ⇒ 症状:画面明明出来了,脚本却说没有
107
+ ⇒ 报告判据问题,别为了让它变绿去改产物
108
+ ```
109
+
110
+ ### 环境自检(怀疑是环境错时先跑这个)
111
+
112
+ ```bash
113
+ npx playwright --version # playwright 版本
114
+ ls ~/.cache/ms-playwright/ # 已装的浏览器 build
115
+ ```
116
+
117
+ ⚠️ **已知陷阱**:`~/.cache/ms-playwright/` 里如果出现 `chromium_headless_shell-XXXX -> chromium_headless_shell-YYYY`
118
+ 这样的**软链**,说明有人用软链把新版 playwright 指到了旧版浏览器上。它现在能跑,但浏览器
119
+ API 一变就会出错,而**症状会长得像"产物有问题"**。看到这种软链 ⇒ 归因成环境问题,
120
+ 正经装对应版本(`npx playwright install chromium`),不要去改产物。
121
+
122
+ ---
123
+
124
+ ## 4. 报告怎么写
125
+
126
+ 跑完把结论写清楚,三行就够,但**每行都要能被验证**:
127
+
128
+ ```
129
+ 跑法: node scripts/smoke.mjs . --checks=gameforge(全量)
130
+ 结论: 退出码 0 · 截图 .smoke-shot.png
131
+ 问题: 无 / 或逐条列 "console: xxx"(带原文,别转述)
132
+ ```
133
+
134
+ 🔴 **报"通过"要带跑法和产物**,不能只写"我测过了" —— 那是一句动作声明,不是状态。
135
+ 下一个人(或审核)要能照着你写的再跑一遍。
136
+
137
+ ---
138
+
139
+ ## 5. 几条踩过的
140
+
141
+ - **别用 `file://`**:相对路径解析、CORS、模块加载行为都和 http 不同,`file://` 下过了不代表线上过。
142
+ - **别只等 `load`**:很多游戏在 `load` 之后才初始化,错误发生在几秒后。要 `waitUntil: 'networkidle'` + 再等几秒。
143
+ - **别把 `--quick` 当收尾**:它跳过截图和探针,而那正是审核要看的东西。
144
+ - **超时放行必须说清楚**:如果你因为超时而放行,报告里要写"我是超时放行的" ——
145
+ 否则下次挂了会被归因成浏览器抖动,而真因是产物越来越慢。
@@ -1,4 +0,0 @@
1
- import type { WorkerOutputEvent } from './AgentBackend.js';
2
- /** 返回一个把事件追加到指定文件的 listener(供 backend.subscribe 用)。 */
3
- export declare function makeFileSink(file: string): (ev: WorkerOutputEvent) => void;
4
- //# sourceMappingURL=workerOutputSink.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workerOutputSink.d.ts","sourceRoot":"","sources":["../../../src/core/agents/workerOutputSink.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,iBAAiB,KAAK,IAAI,CAa1E"}
@@ -1,39 +0,0 @@
1
- /**
2
- * @module core/agents/workerOutputSink
3
- * @description 把 WorkerOutputEvent 落成 per-project 统一日志 `sps-sa-<project>-output.log`
4
- * (格式 `<ts> [kind] text`),供 workers 页 tail 一种格式——不再 per-backend 分支(§9)。
5
- * @layer core
6
- * @boundedContext agents
7
- */
8
- import { appendFileSync, mkdirSync } from 'node:fs';
9
- import { dirname } from 'node:path';
10
- import { localStamp } from '../../shared/localTime.js';
11
- /** 返回一个把事件追加到指定文件的 listener(供 backend.subscribe 用)。 */
12
- export function makeFileSink(file) {
13
- let inited = false;
14
- return (ev) => {
15
- try {
16
- if (!inited) {
17
- mkdirSync(dirname(file), { recursive: true });
18
- inited = true;
19
- }
20
- appendFileSync(file, `${localStamp()} ${formatEvent(ev)}\n`);
21
- }
22
- catch {
23
- /* 日志失败不阻塞 worker */
24
- }
25
- };
26
- }
27
- function formatEvent(ev) {
28
- switch (ev.kind) {
29
- case 'text':
30
- return `[text] ${ev.text.replace(/\s+/g, ' ').slice(0, 600)}`;
31
- case 'tool':
32
- return `[tool] ${ev.name} ${ev.phase}${ev.detail ? ` (${ev.detail})` : ''}`;
33
- case 'result':
34
- return `[result] ${ev.status} ${ev.text.replace(/\s+/g, ' ').slice(0, 600)}`;
35
- case 'usage':
36
- return `[usage] in=${ev.inputTokens} out=${ev.outputTokens}${ev.costUsd != null ? ` $${ev.costUsd}` : ''}`;
37
- }
38
- }
39
- //# sourceMappingURL=workerOutputSink.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workerOutputSink.js","sourceRoot":"","sources":["../../../src/core/agents/workerOutputSink.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGvD,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,OAAO,CAAC,EAAE,EAAE,EAAE;QACZ,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9C,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;YACD,cAAc,CAAC,IAAI,EAAE,GAAG,UAAU,EAAE,IAAI,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAqB;IACxC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAChE,KAAK,MAAM;YACT,OAAO,UAAU,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC9E,KAAK,QAAQ;YACX,OAAO,YAAY,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC/E,KAAK,OAAO;YACV,OAAO,cAAc,EAAE,CAAC,WAAW,QAAQ,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC/G,CAAC;AACH,CAAC"}
@@ -1,29 +0,0 @@
1
- /**
2
- * @module stub/NoopBackend
3
- * AgentBackend 的 no-op 实现(test double)。不连任何 SDK,用假数据把
4
- * ensure → dispatch → subscribe → result 这条事件链端到端走通,
5
- * 用于 P0 阶段验证契约形状可实现、可被消费者驱动。真实现见 P1 ClaudeBackend。
6
- */
7
- import type { AgentBackend, SessionConfig } from '../contract/AgentBackend.js';
8
- import type { WorkerOutputListener } from '../contract/events.js';
9
- import type { RunState, StopReason } from '../contract/lifecycle.js';
10
- export declare class NoopBackend implements AgentBackend {
11
- private readonly config;
12
- readonly kind: string;
13
- private readonly listeners;
14
- private sessionId;
15
- private _runState;
16
- constructor(config: SessionConfig);
17
- private emit;
18
- ensure(): Promise<{
19
- sessionId: string;
20
- resumed: boolean;
21
- resumeFailed?: 'session_lost' | 'not_found';
22
- }>;
23
- dispatch(prompt: string): Promise<void>;
24
- runState(): Promise<RunState>;
25
- cancel(): Promise<void>;
26
- stop(_reason?: StopReason): Promise<void>;
27
- subscribe(listener: WorkerOutputListener): () => void;
28
- }
29
- //# sourceMappingURL=NoopBackend.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NoopBackend.d.ts","sourceRoot":"","sources":["../../../src/runtime/stub/NoopBackend.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAIrE,qBAAa,WAAY,YAAW,YAAY;IAMlC,OAAO,CAAC,QAAQ,CAAC,MAAM;IALnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAC7D,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAoB;gBAER,MAAM,EAAE,aAAa;IAIlD,OAAO,CAAC,IAAI;IAIN,MAAM,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,cAAc,GAAG,WAAW,CAAA;KAAE,CAAC;IAUvG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAI7B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;CAMtD"}
@@ -1,56 +0,0 @@
1
- let counter = 0;
2
- export class NoopBackend {
3
- config;
4
- kind;
5
- listeners = new Set();
6
- sessionId = null;
7
- _runState = 'idle';
8
- constructor(config) {
9
- this.config = config;
10
- this.kind = config.backend;
11
- }
12
- emit(ev) {
13
- for (const l of this.listeners)
14
- l(ev);
15
- }
16
- async ensure() {
17
- // noop:有 resumeSessionId 即"重载成功"(真实 ClaudeBackend 会按 SDK 反馈填 resumeFailed)。
18
- const resumed = this.config.resumeSessionId != null;
19
- if (!this.sessionId) {
20
- this.sessionId = this.config.resumeSessionId ?? `noop-${this.config.backend}-${++counter}`;
21
- this.emit({ kind: 'session', sessionId: this.sessionId });
22
- }
23
- return { sessionId: this.sessionId, resumed };
24
- }
25
- async dispatch(prompt) {
26
- await this.ensure();
27
- this._runState = 'running';
28
- this.emit({ kind: 'text', text: `[noop] echo: ${prompt}` });
29
- this._runState = 'completed';
30
- this.emit({
31
- kind: 'result',
32
- status: 'completed',
33
- text: '[noop] done',
34
- usage: { inputTokens: 0, outputTokens: 0, costUsd: 0 },
35
- stopReason: 'end_turn',
36
- });
37
- }
38
- async runState() {
39
- return this._runState;
40
- }
41
- async cancel() {
42
- this._runState = 'cancelled';
43
- }
44
- async stop(_reason) {
45
- this._runState = 'idle';
46
- this.listeners.clear();
47
- this.sessionId = null;
48
- }
49
- subscribe(listener) {
50
- this.listeners.add(listener);
51
- return () => {
52
- this.listeners.delete(listener);
53
- };
54
- }
55
- }
56
- //# sourceMappingURL=NoopBackend.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NoopBackend.js","sourceRoot":"","sources":["../../../src/runtime/stub/NoopBackend.ts"],"names":[],"mappings":"AAUA,IAAI,OAAO,GAAG,CAAC,CAAC;AAEhB,MAAM,OAAO,WAAW;IAMO;IALpB,IAAI,CAAS;IACL,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IACrD,SAAS,GAAkB,IAAI,CAAC;IAChC,SAAS,GAAa,MAAM,CAAC;IAErC,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;QAChD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAEO,IAAI,CAAC,EAAqB;QAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS;YAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,MAAM;QACV,4EAA4E;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;YAC3F,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YACtD,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,SAAS,CAAC,QAA8B;QACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;CACF"}
@@ -1,23 +0,0 @@
1
- /**
2
- * @module stub/NoopService
3
- * AgentService 的 no-op 实现(test double)。每个 slot 背一个 NoopBackend,
4
- * 维护 SessionRecord、把后端事件扇出给 subscribe 的异步迭代器。
5
- * 用于 P0 验证服务契约形状端到端可用;真实现见 P2(in-process 内核 + agentd 外壳)。
6
- */
7
- import type { SessionConfig } from '../contract/AgentBackend.js';
8
- import type { AgentService, SessionRecord } from '../contract/service.js';
9
- import type { StopReason } from '../contract/lifecycle.js';
10
- import type { WorkerOutputEvent } from '../contract/events.js';
11
- export declare class NoopService implements AgentService {
12
- private readonly slots;
13
- ensureSession(slot: string, config: SessionConfig): Promise<SessionRecord>;
14
- startRun(slot: string, prompt: string): Promise<SessionRecord>;
15
- subscribe(slot: string): AsyncIterable<WorkerOutputEvent> & {
16
- cancel(): void;
17
- };
18
- cancelRun(slot: string): Promise<void>;
19
- stopSession(slot: string, reason?: StopReason): Promise<void>;
20
- inspect(slot?: string): Promise<SessionRecord[]>;
21
- private require;
22
- }
23
- //# sourceMappingURL=NoopService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NoopService.d.ts","sourceRoot":"","sources":["../../../src/runtime/stub/NoopService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAwB,MAAM,uBAAuB,CAAC;AAYrF,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4B;IAE5C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA4C1E,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IASpE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,iBAAiB,CAAC,GAAG;QAAE,MAAM,IAAI,IAAI,CAAA;KAAE;IAiDxE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7D,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAQtD,OAAO,CAAC,OAAO;CAKhB"}
@@ -1,136 +0,0 @@
1
- import { NoopBackend } from './NoopBackend.js';
2
- const nowIso = () => new Date().toISOString();
3
- export class NoopService {
4
- slots = new Map();
5
- async ensureSession(slot, config) {
6
- let entry = this.slots.get(slot);
7
- if (!entry) {
8
- const backend = new NoopBackend(config);
9
- const listeners = new Set();
10
- const ts = nowIso();
11
- const record = {
12
- slot,
13
- sessionId: '',
14
- backend: config.backend,
15
- model: config.model,
16
- cwd: config.cwd,
17
- // claude 有子进程(假装是本进程 pid),openai 纯 HTTP 无子进程。
18
- pid: config.backend === 'claude' ? process.pid : null,
19
- sessionState: 'launching',
20
- runState: 'idle',
21
- createdAt: ts,
22
- updatedAt: ts,
23
- lastOutputAt: null,
24
- usage: { inputTokens: 0, outputTokens: 0 },
25
- };
26
- // 后端事件 → 更新 record + 扇出给订阅者。
27
- const unsub = backend.subscribe((ev) => {
28
- record.updatedAt = nowIso();
29
- record.lastOutputAt = record.updatedAt;
30
- if (ev.kind === 'session')
31
- record.sessionId = ev.sessionId;
32
- if (ev.kind === 'result') {
33
- record.runState = ev.status === 'completed' ? 'completed' : 'failed';
34
- if (ev.usage)
35
- record.usage = ev.usage;
36
- }
37
- for (const l of listeners)
38
- l(ev);
39
- });
40
- entry = { backend, record, listeners, unsub };
41
- this.slots.set(slot, entry);
42
- }
43
- const { sessionId, resumed, resumeFailed } = await entry.backend.ensure();
44
- entry.record.sessionId = sessionId;
45
- entry.record.resumed = resumed;
46
- entry.record.resumeFailed = resumeFailed;
47
- entry.record.sessionState = 'idle';
48
- entry.record.updatedAt = nowIso();
49
- return { ...entry.record };
50
- }
51
- async startRun(slot, prompt) {
52
- const entry = this.require(slot);
53
- entry.record.sessionState = 'running';
54
- entry.record.runState = 'running';
55
- await entry.backend.dispatch(prompt);
56
- entry.record.sessionState = 'idle';
57
- return { ...entry.record };
58
- }
59
- subscribe(slot) {
60
- const entry = this.require(slot);
61
- const queue = [];
62
- let pending = null;
63
- let closed = false;
64
- const push = (ev) => {
65
- if (pending) {
66
- const r = pending;
67
- pending = null;
68
- r({ value: ev, done: false });
69
- }
70
- else {
71
- queue.push(ev);
72
- }
73
- };
74
- entry.listeners.add(push);
75
- const cancel = () => {
76
- if (closed)
77
- return;
78
- closed = true;
79
- entry.listeners.delete(push);
80
- if (pending) {
81
- const r = pending;
82
- pending = null;
83
- r({ value: undefined, done: true });
84
- }
85
- };
86
- const iterator = {
87
- next() {
88
- const head = queue.shift();
89
- if (head !== undefined)
90
- return Promise.resolve({ value: head, done: false });
91
- if (closed)
92
- return Promise.resolve({ value: undefined, done: true });
93
- return new Promise((resolve) => {
94
- pending = resolve;
95
- });
96
- },
97
- return() {
98
- cancel();
99
- return Promise.resolve({ value: undefined, done: true });
100
- },
101
- };
102
- return {
103
- [Symbol.asyncIterator]: () => iterator,
104
- cancel,
105
- };
106
- }
107
- async cancelRun(slot) {
108
- const entry = this.require(slot);
109
- await entry.backend.cancel();
110
- entry.record.runState = 'cancelled';
111
- entry.record.updatedAt = nowIso();
112
- }
113
- async stopSession(slot, reason) {
114
- const entry = this.slots.get(slot);
115
- if (!entry)
116
- return;
117
- await entry.backend.stop(reason);
118
- entry.unsub();
119
- entry.record.sessionState = 'dead';
120
- this.slots.delete(slot);
121
- }
122
- async inspect(slot) {
123
- if (slot !== undefined) {
124
- const entry = this.slots.get(slot);
125
- return entry ? [{ ...entry.record }] : [];
126
- }
127
- return [...this.slots.values()].map((e) => ({ ...e.record }));
128
- }
129
- require(slot) {
130
- const entry = this.slots.get(slot);
131
- if (!entry)
132
- throw new Error(`NoopService: unknown slot "${slot}" (call ensureSession first)`);
133
- return entry;
134
- }
135
- }
136
- //# sourceMappingURL=NoopService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NoopService.js","sourceRoot":"","sources":["../../../src/runtime/stub/NoopService.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * @module stub
3
- * 契约的 no-op test double(P0)。SDK 未接入前用它验证接口形状端到端可用,
4
- * 也可作为消费者写集成测试时的假后端。从 `runtime/stub` 导入。
5
- */
6
- export { NoopBackend } from './NoopBackend.js';
7
- export { NoopService } from './NoopService.js';
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/stub/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * @module stub
3
- * 契约的 no-op test double(P0)。SDK 未接入前用它验证接口形状端到端可用,
4
- * 也可作为消费者写集成测试时的假后端。从 `runtime/stub` 导入。
5
- */
6
- export { NoopBackend } from './NoopBackend.js';
7
- export { NoopService } from './NoopService.js';
8
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/stub/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}