baxian 1.2.57 → 1.2.59

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 (156) hide show
  1. package/dist/agent/branch.d.ts +6 -1
  2. package/dist/agent/branch.d.ts.map +1 -1
  3. package/dist/agent/branch.js +45 -9
  4. package/dist/agent/branch.js.map +1 -1
  5. package/dist/agent/manager.d.ts +182 -5
  6. package/dist/agent/manager.d.ts.map +1 -1
  7. package/dist/agent/manager.js +2235 -147
  8. package/dist/agent/manager.js.map +1 -1
  9. package/dist/agent/phase-signal-watcher.d.ts +8 -1
  10. package/dist/agent/phase-signal-watcher.d.ts.map +1 -1
  11. package/dist/agent/phase-signal-watcher.js +66 -15
  12. package/dist/agent/phase-signal-watcher.js.map +1 -1
  13. package/dist/agent/phase-signal.d.ts +3 -1
  14. package/dist/agent/phase-signal.d.ts.map +1 -1
  15. package/dist/agent/phase-signal.js +27 -4
  16. package/dist/agent/phase-signal.js.map +1 -1
  17. package/dist/agent/tmux.d.ts +8 -1
  18. package/dist/agent/tmux.d.ts.map +1 -1
  19. package/dist/agent/tmux.js +61 -1
  20. package/dist/agent/tmux.js.map +1 -1
  21. package/dist/api/config.d.ts.map +1 -1
  22. package/dist/api/config.js +16 -4
  23. package/dist/api/config.js.map +1 -1
  24. package/dist/api/platform-guard.d.ts +7 -0
  25. package/dist/api/platform-guard.d.ts.map +1 -0
  26. package/dist/api/platform-guard.js +32 -0
  27. package/dist/api/platform-guard.js.map +1 -0
  28. package/dist/api/projects.d.ts.map +1 -1
  29. package/dist/api/projects.js +34 -6
  30. package/dist/api/projects.js.map +1 -1
  31. package/dist/config/normalizer.d.ts.map +1 -1
  32. package/dist/config/normalizer.js +1 -0
  33. package/dist/config/normalizer.js.map +1 -1
  34. package/dist/config/validator.d.ts +3 -1
  35. package/dist/config/validator.d.ts.map +1 -1
  36. package/dist/config/validator.js +104 -7
  37. package/dist/config/validator.js.map +1 -1
  38. package/dist/event/handlers.d.ts +1 -0
  39. package/dist/event/handlers.d.ts.map +1 -1
  40. package/dist/event/handlers.js +661 -89
  41. package/dist/event/handlers.js.map +1 -1
  42. package/dist/github/mapper.d.ts +1 -6
  43. package/dist/github/mapper.d.ts.map +1 -1
  44. package/dist/github/mapper.js.map +1 -1
  45. package/dist/github/poller.d.ts +3 -3
  46. package/dist/github/poller.d.ts.map +1 -1
  47. package/dist/github/poller.js +2 -11
  48. package/dist/github/poller.js.map +1 -1
  49. package/dist/github/resolver.js +1 -1
  50. package/dist/github/resolver.js.map +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +33 -2
  53. package/dist/index.js.map +1 -1
  54. package/dist/platform/body-digest.d.ts +4 -0
  55. package/dist/platform/body-digest.d.ts.map +1 -0
  56. package/dist/platform/body-digest.js +13 -0
  57. package/dist/platform/body-digest.js.map +1 -0
  58. package/dist/platform/command-renderer.d.ts +22 -0
  59. package/dist/platform/command-renderer.d.ts.map +1 -0
  60. package/dist/platform/command-renderer.js +82 -0
  61. package/dist/platform/command-renderer.js.map +1 -0
  62. package/dist/platform/comment-cursor.d.ts +36 -0
  63. package/dist/platform/comment-cursor.d.ts.map +1 -0
  64. package/dist/platform/comment-cursor.js +235 -0
  65. package/dist/platform/comment-cursor.js.map +1 -0
  66. package/dist/platform/driver-host.d.ts +7 -0
  67. package/dist/platform/driver-host.d.ts.map +1 -0
  68. package/dist/platform/driver-host.js +18 -0
  69. package/dist/platform/driver-host.js.map +1 -0
  70. package/dist/platform/driver-spec.d.ts +7 -0
  71. package/dist/platform/driver-spec.d.ts.map +1 -0
  72. package/dist/platform/driver-spec.js +475 -0
  73. package/dist/platform/driver-spec.js.map +1 -0
  74. package/dist/platform/feedback.d.ts +31 -0
  75. package/dist/platform/feedback.d.ts.map +1 -0
  76. package/dist/platform/feedback.js +85 -0
  77. package/dist/platform/feedback.js.map +1 -0
  78. package/dist/platform/field-mapper.d.ts +7 -0
  79. package/dist/platform/field-mapper.d.ts.map +1 -0
  80. package/dist/platform/field-mapper.js +117 -0
  81. package/dist/platform/field-mapper.js.map +1 -0
  82. package/dist/platform/git-driver.d.ts +55 -0
  83. package/dist/platform/git-driver.d.ts.map +1 -0
  84. package/dist/platform/git-driver.js +171 -0
  85. package/dist/platform/git-driver.js.map +1 -0
  86. package/dist/platform/manifest.d.ts +12 -0
  87. package/dist/platform/manifest.d.ts.map +1 -0
  88. package/dist/platform/manifest.js +57 -0
  89. package/dist/platform/manifest.js.map +1 -0
  90. package/dist/platform/markers.d.ts +46 -0
  91. package/dist/platform/markers.d.ts.map +1 -0
  92. package/dist/platform/markers.js +121 -0
  93. package/dist/platform/markers.js.map +1 -0
  94. package/dist/platform/platform-poller.d.ts +68 -0
  95. package/dist/platform/platform-poller.d.ts.map +1 -0
  96. package/dist/platform/platform-poller.js +605 -0
  97. package/dist/platform/platform-poller.js.map +1 -0
  98. package/dist/platform/plugin-registry.d.ts +31 -0
  99. package/dist/platform/plugin-registry.d.ts.map +1 -0
  100. package/dist/platform/plugin-registry.js +238 -0
  101. package/dist/platform/plugin-registry.js.map +1 -0
  102. package/dist/platform/plugin-roots.d.ts +3 -0
  103. package/dist/platform/plugin-roots.d.ts.map +1 -0
  104. package/dist/platform/plugin-roots.js +11 -0
  105. package/dist/platform/plugin-roots.js.map +1 -0
  106. package/dist/platform/plugins/github/baxian-plugin.json +8 -0
  107. package/dist/platform/plugins/github/driver.json +134 -0
  108. package/dist/platform/plugins/github/skills/baxian-cli-gh/SKILL.md +99 -0
  109. package/dist/platform/poller-health.d.ts +3 -0
  110. package/dist/platform/poller-health.d.ts.map +1 -0
  111. package/dist/platform/poller-health.js +12 -0
  112. package/dist/platform/poller-health.js.map +1 -0
  113. package/dist/platform/pr-binding.d.ts +22 -0
  114. package/dist/platform/pr-binding.d.ts.map +1 -0
  115. package/dist/platform/pr-binding.js +28 -0
  116. package/dist/platform/pr-binding.js.map +1 -0
  117. package/dist/platform/response-parser.d.ts +6 -0
  118. package/dist/platform/response-parser.d.ts.map +1 -0
  119. package/dist/platform/response-parser.js +92 -0
  120. package/dist/platform/response-parser.js.map +1 -0
  121. package/dist/platform/row-schema.d.ts +12 -0
  122. package/dist/platform/row-schema.d.ts.map +1 -0
  123. package/dist/platform/row-schema.js +127 -0
  124. package/dist/platform/row-schema.js.map +1 -0
  125. package/dist/platform/startup.d.ts +16 -0
  126. package/dist/platform/startup.d.ts.map +1 -0
  127. package/dist/platform/startup.js +52 -0
  128. package/dist/platform/startup.js.map +1 -0
  129. package/dist/platform/types.d.ts +62 -0
  130. package/dist/platform/types.d.ts.map +1 -0
  131. package/dist/platform/types.js +32 -0
  132. package/dist/platform/types.js.map +1 -0
  133. package/dist/platform/verdict-engine.d.ts +61 -0
  134. package/dist/platform/verdict-engine.d.ts.map +1 -0
  135. package/dist/platform/verdict-engine.js +134 -0
  136. package/dist/platform/verdict-engine.js.map +1 -0
  137. package/dist/shared/constants.d.ts +2 -0
  138. package/dist/shared/constants.d.ts.map +1 -1
  139. package/dist/shared/constants.js +3 -0
  140. package/dist/shared/constants.js.map +1 -1
  141. package/dist/shared/git-url.d.ts +8 -0
  142. package/dist/shared/git-url.d.ts.map +1 -1
  143. package/dist/shared/git-url.js +38 -0
  144. package/dist/shared/git-url.js.map +1 -1
  145. package/dist/shared/types.d.ts +52 -1
  146. package/dist/shared/types.d.ts.map +1 -1
  147. package/dist/shared/types.js.map +1 -1
  148. package/dist/state/agent-store.js +2 -0
  149. package/dist/state/agent-store.js.map +1 -1
  150. package/dist/state/task-store.d.ts.map +1 -1
  151. package/dist/state/task-store.js +91 -4
  152. package/dist/state/task-store.js.map +1 -1
  153. package/dist/web/assets/index-DskVWe7e.js +13 -0
  154. package/dist/web/index.html +1 -1
  155. package/package.json +1 -1
  156. package/dist/web/assets/index-3Ypk8Gfo.js +0 -13
@@ -0,0 +1,475 @@
1
+ import { PLACEHOLDERS, PREFLIGHT_PLACEHOLDERS, MAP_TARGET_FIELDS, ENV_KEY_PATTERN, PLACEHOLDERS_WITH_PAGE, PREFLIGHT_FIXMESSAGE_PLACEHOLDERS, SOURCE_KEY_PATTERN, SINGLE_RESOURCE_OPS, WRITE_OPS, } from './types.js';
2
+ import { classifyCommentSource } from './markers.js';
3
+ import { CONTROL_CHAR_RE, isRecord } from '../shared/index.js';
4
+ const PLACEHOLDER_TOKEN_RE = /\{([^{}]*)\}/g;
5
+ const VALID_PLACEHOLDER_NAME_RE = /^[a-zA-Z]+$/;
6
+ const ERROR_CLASS_RE = /^[A-Z][A-Z0-9_]*$/;
7
+ // driverSchema 1 加载期契约(spec §5.3 增量⑥):仅查「已声明字段合法」挡不住整键省略——
8
+ // 漏 sourceProjectId 会让 fork 防护恒等式静默成立,装机期拒载优于运行期静默失败。
9
+ const REQUIRED_OPS = ['listPrs', 'prView', 'projectView', 'listComments', 'merge', 'close', 'deleteBranch'];
10
+ // treatAsSuccess 的语义是「错误已证明目标状态达成」的幂等写——权威读取没有这种状态,
11
+ // 声明在读 op 上会把 404/权限失败折叠成空行集或截断页并以 ok 进完整性门。
12
+ const TREAT_AS_SUCCESS_LABEL = [...WRITE_OPS].join('/');
13
+ // 写 op 不消费作用域/原子保护占位符时 schema 照常通过,但 merge 会失去 REST sha 陈旧保护、
14
+ // close/deleteBranch 可指向固定资源——占位符消费纳入加载期契约(argv 与 env 值合并检查)。
15
+ const REQUIRED_OP_PLACEHOLDERS = [
16
+ ['merge', [['prNumber'], ['expectedHeadSha']]],
17
+ ['close', [['prNumber']]],
18
+ ['deleteBranch', [['branch', 'branchEncoded']]],
19
+ ['prView', [['prNumber']]],
20
+ ];
21
+ const REQUIRED_MAP_FIELDS = {
22
+ listPrs: [
23
+ 'prNumber', 'prUrl', 'branch', 'headSha', 'state', 'draft', 'mergedAt', 'updatedAt',
24
+ 'sourceProjectId', 'targetProjectId', 'targetBranch',
25
+ ],
26
+ prView: [
27
+ 'prUrl', 'branch', 'headSha', 'state', 'draft', 'mergedAt',
28
+ 'sourceProjectId', 'targetProjectId', 'targetBranch',
29
+ ],
30
+ projectView: ['defaultBranch'],
31
+ };
32
+ const REQUIRED_COMMENT_SOURCE_FIELDS = ['id', 'body'];
33
+ const RESERVED_ERROR_CLASSES = [
34
+ ['ACCESS_DENIED', 'core'], ['RATE_LIMIT', 'core'], ['NOT_FOUND', 'core'],
35
+ ['MERGE_BLOCKED', 'merge'], ['REF_NOT_FOUND', 'deleteBranch'],
36
+ ];
37
+ // Cf = 零宽空格/BOM/方向控制等不可见格式字符:trim() 不归一,肉眼与日志均不可见,键恒查不到。
38
+ const INVISIBLE_FORMAT_RE = /\p{Cf}/u;
39
+ export function parseDriverSpec(raw, pluginPath) {
40
+ const errors = [];
41
+ const err = (message) => errors.push({ pluginPath, message });
42
+ let obj;
43
+ try {
44
+ obj = JSON.parse(raw);
45
+ }
46
+ catch (e) {
47
+ err(`driver.json is not valid JSON: ${e instanceof Error ? e.message : String(e)}`);
48
+ return { errors };
49
+ }
50
+ if (!isRecord(obj)) {
51
+ err('driver.json must be a JSON object');
52
+ return { errors };
53
+ }
54
+ const spec = obj;
55
+ if (!isRecord(spec.ops)) {
56
+ err('ops must be an object');
57
+ return { errors };
58
+ }
59
+ // 先查 token 形状(防 {prNumber1} 等 typo 被"只认合法形状"的正则直接跳过),形状合法再查白名单。
60
+ const checkPlaceholders = (s, ctx, allowed) => {
61
+ for (const m of s.matchAll(PLACEHOLDER_TOKEN_RE)) {
62
+ const name = m[1];
63
+ if (!VALID_PLACEHOLDER_NAME_RE.test(name)) {
64
+ err(`${ctx}: malformed placeholder token {${name}}`);
65
+ continue;
66
+ }
67
+ if (!allowed.has(name))
68
+ err(`${ctx}: unknown placeholder {${name}}`);
69
+ }
70
+ // 不成对/嵌套的大括号不构成完整 token,上面的扫描不报、渲染时字面量直进命令行——单独拒绝。
71
+ const stripped = s.replace(PLACEHOLDER_TOKEN_RE, '');
72
+ if (stripped.includes('{') || stripped.includes('}')) {
73
+ err(`${ctx}: unbalanced '{' or '}' in '${s}' (placeholders must be complete {name} tokens)`);
74
+ }
75
+ };
76
+ // 段形态谓词单点定义(map 源路径与 op 级 flatten 共用):空段/空白段/残留方括号/不可见
77
+ // 格式字符/控制字符都会被取值器当普通键名查找而恒缺失——加载期拒绝。
78
+ const isMalformedSegment = (key) => key === '' || key.trim() !== key || key.includes('[') || key.includes(']')
79
+ || INVISIBLE_FORMAT_RE.test(key) || CONTROL_CHAR_RE.test(key);
80
+ const checkSourcePath = (src, ctxField) => {
81
+ if (src.trim() === '') {
82
+ err(`${ctxField}: source path must be non-empty`);
83
+ return;
84
+ }
85
+ const segments = src.split('.');
86
+ if (segments.filter(seg => seg.endsWith('[]')).length > 1) {
87
+ err(`${ctxField}: source path '${src}' has more than one '[]' level (single-level flatten only)`);
88
+ }
89
+ for (const seg of segments) {
90
+ const key = seg.endsWith('[]') ? seg.slice(0, -2) : seg;
91
+ if (isMalformedSegment(key)) {
92
+ err(`${ctxField}: source path '${src}' has a malformed segment '${seg}' (dot path with a single trailing '[]' only)`);
93
+ return;
94
+ }
95
+ }
96
+ };
97
+ const checkContainer = (value, ctxField) => {
98
+ if (value === undefined)
99
+ return undefined;
100
+ if (!isRecord(value)) {
101
+ err(`${ctxField} must be an object`);
102
+ return undefined;
103
+ }
104
+ return value;
105
+ };
106
+ const checkOptionalField = (value, ctxField) => {
107
+ if (value !== undefined && typeof value !== 'boolean')
108
+ err(`${ctxField}.optional must be a boolean`);
109
+ };
110
+ // argv/env 的形状规则在 ops 与 preflight 两个语境完全一致,仅占位符白名单不同——单点维护。
111
+ const checkArgv = (argv, ctx, allowed) => {
112
+ if (!Array.isArray(argv) || argv.length === 0 || argv.some(a => typeof a !== 'string')) {
113
+ err(`${ctx}.argv must be a non-empty string array`);
114
+ return false;
115
+ }
116
+ if (argv[0] !== '{binary}')
117
+ err(`${ctx}.argv[0] must be '{binary}'`);
118
+ for (const a of argv)
119
+ checkPlaceholders(a, `${ctx}.argv`, allowed);
120
+ return true;
121
+ };
122
+ const checkEnv = (env, ctx, allowed) => {
123
+ const container = checkContainer(env, `${ctx}.env`);
124
+ for (const [k, v] of Object.entries(container ?? {})) {
125
+ if (!ENV_KEY_PATTERN.test(k)) {
126
+ err(`${ctx}.env key must match ${ENV_KEY_PATTERN} (got ${k})`);
127
+ continue;
128
+ }
129
+ if (typeof v !== 'string') {
130
+ err(`${ctx}.env values must be strings`);
131
+ continue;
132
+ }
133
+ // env 值经 shellQuote 渲染为命令内联前缀,控制字符无合法用途,校验期拒绝(spec §4)。
134
+ if (CONTROL_CHAR_RE.test(v)) {
135
+ err(`${ctx}.env value for ${k} contains a control character`);
136
+ continue;
137
+ }
138
+ checkPlaceholders(v, `${ctx}.env`, allowed);
139
+ }
140
+ };
141
+ // errorClasses 先于 ops 校验:ops 的 treatAsSuccess 引用比对直接消费这里收集的合法类名,
142
+ // 免得再维护一份「宽松预收集」的第二定义(何为已声明的 class 只有一个答案)。
143
+ const errorClassNames = new Set();
144
+ if (!Array.isArray(spec.errorClasses)) {
145
+ err('errorClasses must be an array');
146
+ }
147
+ else {
148
+ spec.errorClasses.forEach((c, i) => {
149
+ if (!isRecord(c)) {
150
+ err(`errorClasses[${i}] must be an object`);
151
+ return;
152
+ }
153
+ if (typeof c.class !== 'string' || !ERROR_CLASS_RE.test(c.class)) {
154
+ err(`errorClasses[${i}].class must be UPPER_SNAKE`);
155
+ }
156
+ else if (errorClassNames.has(c.class)) {
157
+ // 匹配按声明序先到先得,重复类名让后者静默不可达且 treatAsSuccess 引用歧义。
158
+ err(`errorClasses[${i}].class duplicates '${c.class}'`);
159
+ }
160
+ else {
161
+ errorClassNames.add(c.class);
162
+ }
163
+ if (!Array.isArray(c.regex) || c.regex.length === 0)
164
+ err(`errorClasses[${i}].regex must be non-empty`);
165
+ else
166
+ c.regex.forEach((r, k) => {
167
+ if (typeof r !== 'string' || r.trim() === '') {
168
+ err(`errorClasses[${i}].regex[${k}] must be a non-empty string`);
169
+ }
170
+ else {
171
+ try {
172
+ // 恒匹配的正则必匹配空串('|'/'.*'/'^'/'(?:)'…)——错误分类必须锚定具体错误文本,
173
+ // 否则被 treatAsSuccess 引用时把权限/项目错误吞成幂等成功。
174
+ if (new RegExp(r).test(''))
175
+ err(`errorClasses[${i}].regex[${k}] matches the empty string (matches any stderr)`);
176
+ }
177
+ catch {
178
+ err(`errorClasses[${i}].regex[${k}] invalid`);
179
+ }
180
+ }
181
+ });
182
+ });
183
+ }
184
+ const checkOp = (opValue, ctx) => {
185
+ if (!isRecord(opValue)) {
186
+ err(`${ctx} must be an object`);
187
+ return false;
188
+ }
189
+ const op = opValue;
190
+ const allowed = op.parse === 'json-paged' ? PLACEHOLDERS_WITH_PAGE : PLACEHOLDERS;
191
+ // argv 坏只跳过依赖它的 {page} 检查(join 会在非数组上崩);env/map/flatten 不依赖 argv,照常单遍聚合校验(与下方 preflight 一致,作者不必多轮试错)。
192
+ const argvOk = checkArgv(op.argv, ctx, allowed);
193
+ checkEnv(op.env, ctx, allowed);
194
+ if (op.parse !== undefined && op.parse !== 'json' && op.parse !== 'json-paged') {
195
+ err(`${ctx}.parse must be 'json' | 'json-paged'`);
196
+ }
197
+ else if (op.parse === 'json-paged' && argvOk && !op.argv.join(' ').includes('{page}')) {
198
+ err(`${ctx}.argv must include a {page} token when parse is 'json-paged'`);
199
+ }
200
+ if (op.flatten !== undefined && (typeof op.flatten !== 'string' || op.flatten.trim() === '')) {
201
+ err(`${ctx}.flatten must be a non-empty string`);
202
+ }
203
+ else if (typeof op.flatten === 'string' && op.flatten.split('.').some(isMalformedSegment)) {
204
+ // op 级 flatten 是纯点路径(spec §5.3),[] 语法只属于 map source;getPath 按字面键查,
205
+ // 'notes[]'/空段会恒查不到而静默零行。
206
+ err(`${ctx}.flatten must be a dot path of non-empty segments without '[]' (got '${op.flatten}')`);
207
+ }
208
+ const mapContainer = checkContainer(op.map, `${ctx}.map`);
209
+ if (mapContainer) {
210
+ for (const [field, value] of Object.entries(mapContainer)) {
211
+ if (!MAP_TARGET_FIELDS.has(field))
212
+ err(`${ctx}.map.${field}: not in the closed target field set`);
213
+ const checkDiscussionRef = (src) => {
214
+ // '_discussion' 是保留的父引用前缀:裸用无语义;无 flatten 时 parent===element,
215
+ // 前缀会静默退化为对元素自身的取值——两种形态都按声明错误拒绝。
216
+ if (src === '_discussion' || src.startsWith('_discussion[]')) {
217
+ err(`${ctx}.map.${field}: '_discussion' is a reserved parent reference (use '_discussion.<field>')`);
218
+ }
219
+ else if (src.startsWith('_discussion.') && typeof op.flatten !== 'string') {
220
+ err(`${ctx}.map.${field}: '_discussion.' parent reference requires op.flatten`);
221
+ }
222
+ };
223
+ if (typeof value === 'string') {
224
+ checkSourcePath(value, `${ctx}.map.${field}`);
225
+ checkDiscussionRef(value);
226
+ }
227
+ else {
228
+ if (!isRecord(value)) {
229
+ err(`${ctx}.map.${field} must be a string or object`);
230
+ continue;
231
+ }
232
+ const v = value;
233
+ if (!Array.isArray(v.sources) || v.sources.length === 0 || v.sources.some(s => typeof s !== 'string')) {
234
+ err(`${ctx}.map.${field}.sources must be a non-empty string array`);
235
+ }
236
+ else {
237
+ for (const s of v.sources) {
238
+ checkSourcePath(s, `${ctx}.map.${field}.sources`);
239
+ checkDiscussionRef(s);
240
+ }
241
+ }
242
+ checkOptionalField(v.optional, `${ctx}.map.${field}`);
243
+ if (v.values !== undefined
244
+ && (!isRecord(v.values) || Object.values(v.values).some(t => typeof t !== 'string'))) {
245
+ err(`${ctx}.map.${field}.values must be a string-to-string record`);
246
+ }
247
+ }
248
+ }
249
+ }
250
+ checkOptionalField(op.optional, ctx);
251
+ if (op.treatAsSuccess !== undefined) {
252
+ if (!Array.isArray(op.treatAsSuccess) || op.treatAsSuccess.some(c => typeof c !== 'string')) {
253
+ err(`${ctx}.treatAsSuccess must be a string array`);
254
+ }
255
+ else {
256
+ for (const c of op.treatAsSuccess) {
257
+ if (!errorClassNames.has(c))
258
+ err(`${ctx}.treatAsSuccess references an undeclared error class '${c}'`);
259
+ }
260
+ }
261
+ }
262
+ return true;
263
+ };
264
+ const opAllText = (opValue) => {
265
+ const op = opValue;
266
+ const argvText = Array.isArray(op.argv) ? op.argv.filter(a => typeof a === 'string').join(' ') : '';
267
+ const envText = isRecord(op.env) ? Object.values(op.env).filter(v => typeof v === 'string').join(' ') : '';
268
+ return `${argvText} ${envText}`;
269
+ };
270
+ const requirePlaceholders = (opValue, ctx, groups) => {
271
+ if (!isRecord(opValue))
272
+ return;
273
+ const text = opAllText(opValue);
274
+ for (const group of groups) {
275
+ if (!group.some(name => text.includes(`{${name}}`))) {
276
+ err(`${ctx} must consume ${group.map(n => `{${n}}`).join(' or ')} (lifecycle scope/atomicity contract)`);
277
+ }
278
+ }
279
+ };
280
+ const rawOps = spec.ops;
281
+ for (const [opName, op] of Object.entries(rawOps)) {
282
+ if (opName === 'listComments')
283
+ continue;
284
+ checkOp(op, `ops.${opName}`);
285
+ }
286
+ const checkSourceKey = (value, ctx) => {
287
+ if (typeof value !== 'string' || !SOURCE_KEY_PATTERN.test(value)) {
288
+ err(`${ctx}.key must match ${SOURCE_KEY_PATTERN} (got ${JSON.stringify(value)})`);
289
+ return undefined;
290
+ }
291
+ return value;
292
+ };
293
+ // 声明层契约与 optional 值层无关:{sources, optional: true} 是合法声明,整键省略才拒载。
294
+ const requireDeclaredFields = (opValue, ctx, fields) => {
295
+ if (!isRecord(opValue))
296
+ return;
297
+ const rawMap = opValue.map;
298
+ const map = isRecord(rawMap) ? rawMap : rawMap === undefined ? {} : undefined;
299
+ if (map === undefined)
300
+ return; // 非法形状已由 checkContainer 报错
301
+ for (const field of fields) {
302
+ if (!(field in map))
303
+ err(`${ctx}.map.${field} must be declared (lifecycle-required mapping)`);
304
+ }
305
+ return map;
306
+ };
307
+ // core 以显式 {page} 循环驱动这些 op(spec §5.3 分页执行模型):非 paged 形态到运行期才会
308
+ // 以「重复页/页上限」误诊暴露,装机时报错优于运行期降级。
309
+ const requirePagedParse = (opValue, ctx) => {
310
+ if (isRecord(opValue) && opValue.parse !== 'json-paged') {
311
+ err(`${ctx}.parse must be 'json-paged'`);
312
+ }
313
+ };
314
+ const isOptionalDeclaration = (map, field) => {
315
+ const v = map[field];
316
+ return isRecord(v) && v.optional === true;
317
+ };
318
+ const checkCommentSourceContract = (src, ctx) => {
319
+ requirePagedParse(src, ctx);
320
+ requirePlaceholders(src, ctx, [['prNumber']]);
321
+ if (isRecord(src) && src.optional !== undefined) {
322
+ // 完整性门要求全部源当周期成功(spec §6 verdict ①),「可选源」与之矛盾。
323
+ err(`${ctx}.optional is not allowed on a comment source (completeness gate covers every source)`);
324
+ }
325
+ if (isRecord(src) && src.treatAsSuccess !== undefined) {
326
+ err(`${ctx}.treatAsSuccess is only allowed on ${TREAT_AS_SUCCESS_LABEL}`);
327
+ }
328
+ const map = requireDeclaredFields(src, ctx, REQUIRED_COMMENT_SOURCE_FIELDS);
329
+ if (!map)
330
+ return;
331
+ if (!('createdAt' in map) && !('updatedAt' in map)) {
332
+ err(`${ctx} must declare at least one of createdAt/updatedAt`);
333
+ }
334
+ // body/时间戳若声明成 optional,后端整键省略会静默折叠为「无正文/无时间戳」——反馈被吞而
335
+ // 健康度全绿(sourceProjectId 同型静默失败)。「值可空」用 null-as-present 表达即可(非
336
+ // optional 映射对 null 值不报错,GitHub 纯 APPROVED review 的 body: null 属值层)。body 对
337
+ // **全部**源禁 optional——豁免若按 reviews 类给,装饰性 reviewState 声明即可伪造类别绕开;
338
+ // 时间戳豁免限 reviews 类(PENDING 的 submitted_at 键可缺失——github OpenAPI 非 required,
339
+ // undated 行级跳过 + 一次性日志承接,spec §5.3 增量①),伪造类别换到的只是这份有界、
340
+ // 日志可见的降级,吞不掉带正文的反馈。
341
+ if ('body' in map && isOptionalDeclaration(map, 'body')) {
342
+ err(`${ctx}.map.body must not be optional (null-as-present already covers empty values)`);
343
+ }
344
+ if (classifyCommentSource({ map }) !== 'reviews') {
345
+ const timestamps = ['createdAt', 'updatedAt'].filter(f => f in map);
346
+ if (timestamps.length > 0 && timestamps.every(f => isOptionalDeclaration(map, f))) {
347
+ err(`${ctx} must declare at least one non-optional createdAt/updatedAt on a non-reviews source`);
348
+ }
349
+ }
350
+ };
351
+ const commentSources = [];
352
+ const rawListComments = rawOps.listComments;
353
+ if (Array.isArray(rawListComments)) {
354
+ // 空数组声明了 op 键却零源:裁决与反馈生命周期静默永久挂起,与整键省略同级拒载。
355
+ if (rawListComments.length === 0)
356
+ err('ops.listComments must declare at least one source');
357
+ const seenKeys = new Set();
358
+ rawListComments.forEach((src, i) => {
359
+ const ctx = `ops.listComments[${i}]`;
360
+ if (!checkOp(src, ctx))
361
+ return;
362
+ checkCommentSourceContract(src, ctx);
363
+ const key = checkSourceKey(src.key, ctx);
364
+ if (key === undefined)
365
+ return;
366
+ if (seenKeys.has(key)) {
367
+ err(`${ctx}.key duplicates '${key}'`);
368
+ return;
369
+ }
370
+ seenKeys.add(key);
371
+ commentSources.push({ ...src, key });
372
+ });
373
+ }
374
+ else if (rawListComments !== undefined && checkOp(rawListComments, 'ops.listComments')) {
375
+ checkCommentSourceContract(rawListComments, 'ops.listComments');
376
+ const rawKey = rawListComments.key;
377
+ const key = rawKey === undefined ? 'default' : checkSourceKey(rawKey, 'ops.listComments');
378
+ if (key !== undefined)
379
+ commentSources.push({ ...rawListComments, key });
380
+ }
381
+ for (const opName of REQUIRED_OPS) {
382
+ if (rawOps[opName] === undefined)
383
+ err(`ops.${opName} is required by driverSchema 1`);
384
+ }
385
+ if (rawOps.listPrs !== undefined)
386
+ requirePagedParse(rawOps.listPrs, 'ops.listPrs');
387
+ for (const [opName, fields] of Object.entries(REQUIRED_MAP_FIELDS)) {
388
+ if (rawOps[opName] !== undefined)
389
+ requireDeclaredFields(rawOps[opName], `ops.${opName}`, fields);
390
+ }
391
+ // parse 形态按 op 契约钉死:单资源读缺 parse 会恒零行、绕过基数检查静默停摆;
392
+ // 写 op 声明 json-paged 能通过装载、却在唯一执行入口 runOp 被拒——两个方向都装机期报错。
393
+ for (const opName of SINGLE_RESOURCE_OPS) {
394
+ const op = rawOps[opName];
395
+ if (op !== undefined && isRecord(op) && op.parse !== 'json') {
396
+ err(`ops.${opName}.parse must be 'json' (single-resource read)`);
397
+ }
398
+ }
399
+ for (const opName of WRITE_OPS) {
400
+ const op = rawOps[opName];
401
+ if (op !== undefined && isRecord(op) && op.parse === 'json-paged') {
402
+ err(`ops.${opName}.parse must not be 'json-paged' (write ops run through runOp, which has no page loop)`);
403
+ }
404
+ }
405
+ // treatAsSuccess 允许域覆盖全部声明 op(加载门必须与运行期折叠机制同覆盖面——只罩必需
406
+ // op 会让附加 op 的读失败照样被折叠);optional 禁令只针对生命周期必需 op(附加 op 可降级)。
407
+ const requiredOpSet = new Set(REQUIRED_OPS);
408
+ for (const [opName, opValue] of Object.entries(rawOps)) {
409
+ if (opName === 'listComments' || !isRecord(opValue))
410
+ continue;
411
+ const op = opValue;
412
+ if (requiredOpSet.has(opName) && op.optional === true) {
413
+ // 生命周期必需 op 声明 optional 是矛盾声明:调用方无从降级,运行期仍按必需失败。
414
+ err(`ops.${opName}.optional must not be true (lifecycle-required op)`);
415
+ }
416
+ if (!WRITE_OPS.has(opName) && op.treatAsSuccess !== undefined) {
417
+ err(`ops.${opName}.treatAsSuccess is only allowed on ${TREAT_AS_SUCCESS_LABEL}`);
418
+ }
419
+ }
420
+ for (const [opName, groups] of REQUIRED_OP_PLACEHOLDERS) {
421
+ if (rawOps[opName] !== undefined)
422
+ requirePlaceholders(rawOps[opName], `ops.${opName}`, groups);
423
+ }
424
+ for (const [cls, requiredBy] of RESERVED_ERROR_CLASSES) {
425
+ if (requiredBy !== 'core' && rawOps[requiredBy] === undefined)
426
+ continue;
427
+ if (!errorClassNames.has(cls))
428
+ err(`errorClasses must declare '${cls}' (reserved, required by ${requiredBy})`);
429
+ }
430
+ let visibilityLagSeconds = 5;
431
+ const rawLag = obj.visibilityLagSeconds;
432
+ if (rawLag !== undefined) {
433
+ if (typeof rawLag !== 'number' || !Number.isFinite(rawLag) || rawLag <= 0) {
434
+ err(`visibilityLagSeconds must be a positive number (got ${JSON.stringify(rawLag)})`);
435
+ }
436
+ else {
437
+ visibilityLagSeconds = rawLag;
438
+ }
439
+ }
440
+ if (!Array.isArray(spec.preflight)) {
441
+ err('preflight must be an array');
442
+ }
443
+ else {
444
+ spec.preflight.forEach((step, i) => {
445
+ const ctx = `preflight[${i}]`;
446
+ if (!isRecord(step)) {
447
+ err(`${ctx} must be an object`);
448
+ return;
449
+ }
450
+ checkArgv(step.argv, ctx, PREFLIGHT_PLACEHOLDERS);
451
+ checkEnv(step.env, ctx, PREFLIGHT_PLACEHOLDERS);
452
+ if (typeof step.fixMessage !== 'string' || step.fixMessage === '')
453
+ err(`${ctx}.fixMessage must be a non-empty string`);
454
+ else
455
+ checkPlaceholders(step.fixMessage, `${ctx}.fixMessage`, PREFLIGHT_FIXMESSAGE_PLACEHOLDERS);
456
+ });
457
+ }
458
+ if (errors.length > 0)
459
+ return { errors };
460
+ const ops = {};
461
+ for (const [name, op] of Object.entries(rawOps)) {
462
+ if (name !== 'listComments')
463
+ ops[name] = op;
464
+ }
465
+ return {
466
+ spec: {
467
+ ops,
468
+ commentSources,
469
+ visibilityLagSeconds,
470
+ preflight: spec.preflight,
471
+ errorClasses: spec.errorClasses,
472
+ },
473
+ };
474
+ }
475
+ //# sourceMappingURL=driver-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-spec.js","sourceRoot":"","sources":["../../src/platform/driver-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type AckActorContext, type AckCarrierRow, type AckCollection, type CommentSourceClass } from './markers.js';
2
+ import { type NormalizedRow } from './row-schema.js';
3
+ import type { CommentSourceOp } from './types.js';
4
+ import type { OpVars } from './git-driver.js';
5
+ import { type VerdictSourceScan } from './verdict-engine.js';
6
+ export interface FeedbackSourceScan {
7
+ key: string;
8
+ sourceClass: CommentSourceClass;
9
+ ok: boolean;
10
+ rows: NormalizedRow[];
11
+ }
12
+ export interface PendingFeedbackResult {
13
+ allSourcesOk: boolean;
14
+ pending: Map<string, {
15
+ sourceKey: string;
16
+ id: string;
17
+ bodyDigest: string;
18
+ }>;
19
+ }
20
+ export interface CommentSourceReader {
21
+ commentSources: CommentSourceOp[];
22
+ runCommentSource(source: CommentSourceOp, vars: OpVars, projectPage?: (pageRows: NormalizedRow[]) => NormalizedRow[]): Promise<NormalizedRow[]>;
23
+ }
24
+ export declare function scanCommentSourcesOnce(driver: CommentSourceReader, prNumber: number, now: () => number, onFailure?: (key: string, error: unknown) => void): Promise<VerdictSourceScan[]>;
25
+ export declare function buildAckCarrierRows(scans: readonly FeedbackSourceScan[]): AckCarrierRow[];
26
+ export declare function feedbackEventTarget(row: NormalizedRow, sourceKey: string, acks: AckCollection): {
27
+ id: string;
28
+ digest: string;
29
+ } | undefined;
30
+ export declare function collectPendingFeedback(scans: readonly FeedbackSourceScan[], ctx: AckActorContext): PendingFeedbackResult;
31
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/platform/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EACtF,MAAM,cAAc,CAAC;AACtB,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,kBAAkB,CAAC;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,aAAa,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,gBAAgB,CACd,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,GAC3D,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC7B;AAKD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,MAAM,EACjB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,GAChD,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAiB9B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,GAAG,aAAa,EAAE,CAUzF;AAmBD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,aAAa,GAClB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAG5C;AAID,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,GAAG,EAAE,eAAe,GACnB,qBAAqB,CAmBvB"}
@@ -0,0 +1,85 @@
1
+ import { ackCarrierKey, ackRevisionKey, classifyCommentSource, collectValidAcks, projectCommentRow, rowAcks, rowBodyDigest, rowHasBody, rowTokens, } from './markers.js';
2
+ import { versionTimeOf } from './row-schema.js';
3
+ import { deadTokens } from './verdict-engine.js';
4
+ // 单次全源抓取(poller 周期与 manager 权威复核共用):行投影后释放正文、system 行统一过滤;
5
+ // 失败源保留在 scans(ok=false)供完整性门/fail-closed 判定。onFailure 在失败源入列后立即
6
+ // 调用——poller 以它承载 RATE_LIMIT 中止(抛错停止余下源),manager 侧默认继续扫完。
7
+ export async function scanCommentSourcesOnce(driver, prNumber, now, onFailure) {
8
+ const scans = [];
9
+ for (const source of driver.commentSources) {
10
+ const sourceClass = classifyCommentSource(source);
11
+ const scanStartedAt = now();
12
+ try {
13
+ const rows = await driver.runCommentSource(source, { prNumber }, pageRows => {
14
+ for (const row of pageRows)
15
+ projectCommentRow(row);
16
+ return pageRows;
17
+ });
18
+ scans.push({ key: source.key, sourceClass, ok: true, scanStartedAt, rows: rows.filter(r => r.system !== true) });
19
+ }
20
+ catch (error) {
21
+ scans.push({ key: source.key, sourceClass, ok: false, scanStartedAt, rows: [] });
22
+ onFailure?.(source.key, error);
23
+ }
24
+ }
25
+ return scans;
26
+ }
27
+ export function buildAckCarrierRows(scans) {
28
+ return scans.flatMap(scan => scan.rows.map(row => ({
29
+ sourceKey: scan.key,
30
+ sourceClass: scan.sourceClass,
31
+ id: String(row.id),
32
+ authorId: typeof row.authorId === 'string' ? row.authorId : undefined,
33
+ discussionId: row.discussionId === null || row.discussionId === undefined ? null : String(row.discussionId),
34
+ acks: rowAcks(row),
35
+ carriesToken: rowTokens(row).length > 0,
36
+ })));
37
+ }
38
+ function unackedRevision(row, sourceKey, acks) {
39
+ if (row.system === true)
40
+ return undefined;
41
+ if (versionTimeOf(row) === undefined)
42
+ return undefined;
43
+ if (!rowHasBody(row))
44
+ return undefined;
45
+ const id = String(row.id);
46
+ if (acks.carrierRowKeys.has(ackCarrierKey(sourceKey, id)))
47
+ return undefined;
48
+ const digest = rowBodyDigest(row);
49
+ if (acks.acks.has(ackRevisionKey(sourceKey, id, digest)))
50
+ return undefined;
51
+ return { id, digest };
52
+ }
53
+ // poller 事件合成矩阵的行谓词(spec §6):令牌行走裁决通道、载体行是 dev 回复、已 ack 的
54
+ // revision 已处置——三类都不合成反馈事件。
55
+ export function feedbackEventTarget(row, sourceKey, acks) {
56
+ if (rowTokens(row).length > 0)
57
+ return undefined;
58
+ return unackedRevision(row, sourceKey, acks);
59
+ }
60
+ // 待 ack 集合(spec §6 矩阵②/§8):目标 = 无标记人类评论 + fail 裁决正文(pass-only 行无 fix
61
+ // 轮不入集合);有效 ack 逐 revision 判定。事件合成与 no-op/merge 复核共用此一个定义。
62
+ export function collectPendingFeedback(scans, ctx) {
63
+ const acks = collectValidAcks(buildAckCarrierRows(scans), ctx);
64
+ // dismiss 是受信人类的显式解除(spec §7 令牌级撤销):被判死的 fail 不再构成待 ack 目标,
65
+ // 复制到其它源的同 token 行同样出列
66
+ const dead = deadTokens(scans.map(s => ({ ...s, scanStartedAt: 0 })));
67
+ const pending = new Map();
68
+ for (const scan of scans) {
69
+ if (!scan.ok)
70
+ continue;
71
+ for (const row of scan.rows) {
72
+ const tokens = rowTokens(row);
73
+ if (tokens.length > 0 && !tokens.some(t => t.kind === 'fail' && !dead.has(t.token)))
74
+ continue;
75
+ const target = unackedRevision(row, scan.key, acks);
76
+ if (target === undefined)
77
+ continue;
78
+ pending.set(ackRevisionKey(scan.key, target.id, target.digest), {
79
+ sourceKey: scan.key, id: target.id, bodyDigest: target.digest,
80
+ });
81
+ }
82
+ }
83
+ return { allSourcesOk: scans.every(s => s.ok), pending };
84
+ }
85
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/platform/feedback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { DriverOp } from './types.js';
2
+ export type MappedRow = Record<string, unknown>;
3
+ export declare class FieldMappingError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ export declare function mapResponse(opName: string, op: DriverOp, payload: unknown): MappedRow[];
7
+ //# sourceMappingURL=field-mapper.d.ts.map