baxian 2.0.6 → 2.0.8

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 (182) hide show
  1. package/README.md +2 -3
  2. package/README.zh-CN.md +2 -3
  3. package/dist/agent/bootstrap-poller.d.ts +2 -2
  4. package/dist/agent/bootstrap-poller.d.ts.map +1 -1
  5. package/dist/agent/bootstrap-poller.js.map +1 -1
  6. package/dist/agent/bootstrap.d.ts +1 -1
  7. package/dist/agent/bootstrap.d.ts.map +1 -1
  8. package/dist/agent/bootstrap.js +24 -48
  9. package/dist/agent/bootstrap.js.map +1 -1
  10. package/dist/agent/manager.d.ts +10 -36
  11. package/dist/agent/manager.d.ts.map +1 -1
  12. package/dist/agent/manager.js +103 -342
  13. package/dist/agent/manager.js.map +1 -1
  14. package/dist/agent/net-exec.d.ts +0 -1
  15. package/dist/agent/net-exec.d.ts.map +1 -1
  16. package/dist/agent/net-exec.js +0 -1
  17. package/dist/agent/net-exec.js.map +1 -1
  18. package/dist/agent/pane-streamer-manager.d.ts.map +1 -1
  19. package/dist/agent/pane-streamer-manager.js +1 -3
  20. package/dist/agent/pane-streamer-manager.js.map +1 -1
  21. package/dist/agent/preflight.d.ts +1 -20
  22. package/dist/agent/preflight.d.ts.map +1 -1
  23. package/dist/agent/preflight.js +39 -122
  24. package/dist/agent/preflight.js.map +1 -1
  25. package/dist/agent/prompt.d.ts +6 -16
  26. package/dist/agent/prompt.d.ts.map +1 -1
  27. package/dist/agent/prompt.js +128 -79
  28. package/dist/agent/prompt.js.map +1 -1
  29. package/dist/agent/repo-store.d.ts +1 -5
  30. package/dist/agent/repo-store.d.ts.map +1 -1
  31. package/dist/agent/repo-store.js +8 -33
  32. package/dist/agent/repo-store.js.map +1 -1
  33. package/dist/agent/runner.d.ts +1 -1
  34. package/dist/agent/runner.d.ts.map +1 -1
  35. package/dist/agent/runner.js +1 -3
  36. package/dist/agent/runner.js.map +1 -1
  37. package/dist/api/config.d.ts +1 -2
  38. package/dist/api/config.d.ts.map +1 -1
  39. package/dist/api/config.js +5 -22
  40. package/dist/api/config.js.map +1 -1
  41. package/dist/api/platform-guard.d.ts.map +1 -1
  42. package/dist/api/platform-guard.js +5 -15
  43. package/dist/api/platform-guard.js.map +1 -1
  44. package/dist/api/projects.d.ts.map +1 -1
  45. package/dist/api/projects.js +18 -25
  46. package/dist/api/projects.js.map +1 -1
  47. package/dist/api/tasks.js +2 -2
  48. package/dist/api/tasks.js.map +1 -1
  49. package/dist/cli.js.map +1 -1
  50. package/dist/config/hot-reload.d.ts +3 -2
  51. package/dist/config/hot-reload.d.ts.map +1 -1
  52. package/dist/config/hot-reload.js +6 -16
  53. package/dist/config/hot-reload.js.map +1 -1
  54. package/dist/config/loader.d.ts +1 -5
  55. package/dist/config/loader.d.ts.map +1 -1
  56. package/dist/config/loader.js +31 -31
  57. package/dist/config/loader.js.map +1 -1
  58. package/dist/config/validator.d.ts +2 -8
  59. package/dist/config/validator.d.ts.map +1 -1
  60. package/dist/config/validator.js +42 -120
  61. package/dist/config/validator.js.map +1 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +7 -29
  64. package/dist/index.js.map +1 -1
  65. package/dist/platform/driver-host.d.ts +4 -3
  66. package/dist/platform/driver-host.d.ts.map +1 -1
  67. package/dist/platform/driver-host.js +12 -11
  68. package/dist/platform/driver-host.js.map +1 -1
  69. package/dist/platform/feedback.d.ts +5 -6
  70. package/dist/platform/feedback.d.ts.map +1 -1
  71. package/dist/platform/feedback.js +4 -7
  72. package/dist/platform/feedback.js.map +1 -1
  73. package/dist/platform/github-driver.d.ts +36 -0
  74. package/dist/platform/github-driver.d.ts.map +1 -0
  75. package/dist/platform/github-driver.js +374 -0
  76. package/dist/platform/github-driver.js.map +1 -0
  77. package/dist/platform/markers.d.ts +1 -4
  78. package/dist/platform/markers.d.ts.map +1 -1
  79. package/dist/platform/markers.js +0 -8
  80. package/dist/platform/markers.js.map +1 -1
  81. package/dist/platform/platform-poller.d.ts +2 -17
  82. package/dist/platform/platform-poller.d.ts.map +1 -1
  83. package/dist/platform/platform-poller.js +9 -15
  84. package/dist/platform/platform-poller.js.map +1 -1
  85. package/dist/platform/response-parser.d.ts.map +1 -1
  86. package/dist/platform/response-parser.js +6 -63
  87. package/dist/platform/response-parser.js.map +1 -1
  88. package/dist/platform/review-timeline.d.ts +6 -8
  89. package/dist/platform/review-timeline.d.ts.map +1 -1
  90. package/dist/platform/review-timeline.js +4 -6
  91. package/dist/platform/review-timeline.js.map +1 -1
  92. package/dist/platform/row-schema.d.ts +1 -2
  93. package/dist/platform/row-schema.d.ts.map +1 -1
  94. package/dist/platform/row-schema.js +13 -1
  95. package/dist/platform/row-schema.js.map +1 -1
  96. package/dist/platform/startup.d.ts +6 -34
  97. package/dist/platform/startup.d.ts.map +1 -1
  98. package/dist/platform/startup.js +10 -109
  99. package/dist/platform/startup.js.map +1 -1
  100. package/dist/platform/types.d.ts +61 -54
  101. package/dist/platform/types.d.ts.map +1 -1
  102. package/dist/platform/types.js +38 -26
  103. package/dist/platform/types.js.map +1 -1
  104. package/dist/platform/verdict-engine.d.ts +1 -1
  105. package/dist/platform/verdict-engine.d.ts.map +1 -1
  106. package/dist/platform/verdict-engine.js +1 -1
  107. package/dist/platform/verdict-engine.js.map +1 -1
  108. package/dist/shared/constants.d.ts +2 -6
  109. package/dist/shared/constants.d.ts.map +1 -1
  110. package/dist/shared/constants.js +2 -17
  111. package/dist/shared/constants.js.map +1 -1
  112. package/dist/shared/git-url.d.ts +0 -14
  113. package/dist/shared/git-url.d.ts.map +1 -1
  114. package/dist/shared/git-url.js +4 -57
  115. package/dist/shared/git-url.js.map +1 -1
  116. package/dist/shared/types.d.ts +2 -10
  117. package/dist/shared/types.d.ts.map +1 -1
  118. package/dist/shared/types.js.map +1 -1
  119. package/dist/state/agent-store.js +0 -3
  120. package/dist/state/agent-store.js.map +1 -1
  121. package/dist/state/task-store.js +2 -2
  122. package/dist/state/task-store.js.map +1 -1
  123. package/dist/web/assets/index-KH_4rYrI.js +15 -0
  124. package/dist/web/index.html +1 -1
  125. package/package.json +1 -1
  126. package/dist/config/normalizer.d.ts +0 -2
  127. package/dist/config/normalizer.d.ts.map +0 -1
  128. package/dist/config/normalizer.js +0 -46
  129. package/dist/config/normalizer.js.map +0 -1
  130. package/dist/platform/command-renderer.d.ts +0 -29
  131. package/dist/platform/command-renderer.d.ts.map +0 -1
  132. package/dist/platform/command-renderer.js +0 -113
  133. package/dist/platform/command-renderer.js.map +0 -1
  134. package/dist/platform/driver-spec.d.ts +0 -7
  135. package/dist/platform/driver-spec.d.ts.map +0 -1
  136. package/dist/platform/driver-spec.js +0 -506
  137. package/dist/platform/driver-spec.js.map +0 -1
  138. package/dist/platform/field-mapper.d.ts +0 -7
  139. package/dist/platform/field-mapper.d.ts.map +0 -1
  140. package/dist/platform/field-mapper.js +0 -109
  141. package/dist/platform/field-mapper.js.map +0 -1
  142. package/dist/platform/git-driver.d.ts +0 -64
  143. package/dist/platform/git-driver.d.ts.map +0 -1
  144. package/dist/platform/git-driver.js +0 -230
  145. package/dist/platform/git-driver.js.map +0 -1
  146. package/dist/platform/manifest.d.ts +0 -11
  147. package/dist/platform/manifest.d.ts.map +0 -1
  148. package/dist/platform/manifest.js +0 -42
  149. package/dist/platform/manifest.js.map +0 -1
  150. package/dist/platform/plugin-registry.d.ts +0 -31
  151. package/dist/platform/plugin-registry.d.ts.map +0 -1
  152. package/dist/platform/plugin-registry.js +0 -239
  153. package/dist/platform/plugin-registry.js.map +0 -1
  154. package/dist/platform/plugin-roots.d.ts +0 -3
  155. package/dist/platform/plugin-roots.d.ts.map +0 -1
  156. package/dist/platform/plugin-roots.js +0 -9
  157. package/dist/platform/plugin-roots.js.map +0 -1
  158. package/dist/platform/plugins/github/baxian-plugin.json +0 -8
  159. package/dist/platform/plugins/github/driver.json +0 -153
  160. package/dist/platform/plugins/github/skills/baxian-cli-gh/SKILL.md +0 -115
  161. package/dist/platform/plugins/github/skills/baxian-cli-gh/agents/openai.yaml +0 -2
  162. package/dist/platform/preflight-exec.d.ts +0 -21
  163. package/dist/platform/preflight-exec.d.ts.map +0 -1
  164. package/dist/platform/preflight-exec.js +0 -53
  165. package/dist/platform/preflight-exec.js.map +0 -1
  166. package/dist/skill/registry.d.ts +0 -37
  167. package/dist/skill/registry.d.ts.map +0 -1
  168. package/dist/skill/registry.js +0 -234
  169. package/dist/skill/registry.js.map +0 -1
  170. package/dist/skills/baxian-greeting/SKILL.md +0 -15
  171. package/dist/skills/baxian-greeting/agents/openai.yaml +0 -2
  172. package/dist/skills/baxian-pr-feedback/SKILL.md +0 -41
  173. package/dist/skills/baxian-pr-feedback/agents/openai.yaml +0 -2
  174. package/dist/skills/baxian-pr-recheck/SKILL.md +0 -27
  175. package/dist/skills/baxian-pr-recheck/agents/openai.yaml +0 -2
  176. package/dist/skills/baxian-pr-review/SKILL.md +0 -33
  177. package/dist/skills/baxian-pr-review/agents/openai.yaml +0 -2
  178. package/dist/skills/baxian-signals/SKILL.md +0 -86
  179. package/dist/skills/baxian-signals/agents/openai.yaml +0 -2
  180. package/dist/skills/baxian-task-check/SKILL.md +0 -52
  181. package/dist/skills/baxian-task-check/agents/openai.yaml +0 -2
  182. package/dist/web/assets/index-CF2C4Fq-.js +0 -15
@@ -1,506 +0,0 @@
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
- const REQUIRED_OPS = [
8
- 'listPrs', 'prView', 'projectView', 'branchView', 'listComments', 'comment', 'merge', 'close', 'deleteBranch',
9
- ];
10
- const TREAT_AS_SUCCESS_OPS = new Set(['merge', 'close', 'deleteBranch']);
11
- const TREAT_AS_SUCCESS_LABEL = [...TREAT_AS_SUCCESS_OPS].join('/');
12
- const REQUIRED_OP_PLACEHOLDERS = [
13
- ['merge', [['prNumber'], ['expectedHeadSha']]],
14
- ['comment', [['prNumber'], ['body']]],
15
- ['close', [['prNumber']]],
16
- ['deleteBranch', [['branch', 'branchEncoded'], ['expectedHeadSha'], ['remoteProjectId']]],
17
- ['branchView', [['branch', 'branchEncoded'], ['remoteProjectId']]],
18
- ['prView', [['prNumber']]],
19
- ];
20
- const REQUIRED_MAP_FIELDS = {
21
- listPrs: [
22
- 'prNumber', 'prUrl', 'branch', 'headSha', 'state', 'draft', 'mergedAt', 'updatedAt',
23
- 'sourceProjectId', 'targetProjectId', 'targetBranch',
24
- ],
25
- prView: [
26
- 'prUrl', 'branch', 'headSha', 'state', 'draft', 'mergedAt',
27
- 'sourceProjectId', 'targetProjectId', 'targetBranch',
28
- ],
29
- projectView: ['defaultBranch', 'remoteProjectId'],
30
- branchView: ['remoteProjectId', 'headSha'],
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'],
36
- ];
37
- const INVISIBLE_FORMAT_RE = /\p{Cf}/u;
38
- export function parseDriverSpec(raw, pluginPath) {
39
- const errors = [];
40
- const err = (message) => errors.push({ pluginPath, message });
41
- let obj;
42
- try {
43
- obj = JSON.parse(raw);
44
- }
45
- catch (e) {
46
- err(`driver.json is not valid JSON: ${e instanceof Error ? e.message : String(e)}`);
47
- return { errors };
48
- }
49
- if (!isRecord(obj)) {
50
- err('driver.json must be a JSON object');
51
- return { errors };
52
- }
53
- const spec = obj;
54
- if (!isRecord(spec.ops)) {
55
- err('ops must be an object');
56
- return { errors };
57
- }
58
- const checkPlaceholders = (s, ctx, allowed) => {
59
- const placeholderText = s.replace(/\\[{}]/g, '');
60
- for (const m of placeholderText.matchAll(PLACEHOLDER_TOKEN_RE)) {
61
- const name = m[1];
62
- if (!VALID_PLACEHOLDER_NAME_RE.test(name)) {
63
- err(`${ctx}: malformed placeholder token {${name}}`);
64
- continue;
65
- }
66
- if (!allowed.has(name))
67
- err(`${ctx}: unknown placeholder {${name}}`);
68
- }
69
- const stripped = placeholderText.replace(PLACEHOLDER_TOKEN_RE, '');
70
- if (stripped.includes('{') || stripped.includes('}')) {
71
- err(`${ctx}: unbalanced '{' or '}' in '${s}' (placeholders must be complete {name} tokens)`);
72
- }
73
- };
74
- const isMalformedSegment = (key) => key === '' || key.trim() !== key || key.includes('[') || key.includes(']')
75
- || INVISIBLE_FORMAT_RE.test(key) || CONTROL_CHAR_RE.test(key);
76
- const checkSourcePath = (src, ctxField) => {
77
- if (src.trim() === '') {
78
- err(`${ctxField}: source path must be non-empty`);
79
- return;
80
- }
81
- const segments = src.split('.');
82
- if (segments.filter(seg => seg.endsWith('[]')).length > 1) {
83
- err(`${ctxField}: source path '${src}' has more than one '[]' level (single-level flatten only)`);
84
- }
85
- for (const seg of segments) {
86
- const key = seg.endsWith('[]') ? seg.slice(0, -2) : seg;
87
- if (isMalformedSegment(key)) {
88
- err(`${ctxField}: source path '${src}' has a malformed segment '${seg}' (dot path with a single trailing '[]' only)`);
89
- return;
90
- }
91
- }
92
- };
93
- const checkContainer = (value, ctxField) => {
94
- if (value === undefined)
95
- return undefined;
96
- if (!isRecord(value)) {
97
- err(`${ctxField} must be an object`);
98
- return undefined;
99
- }
100
- return value;
101
- };
102
- const checkOptionalField = (value, ctxField) => {
103
- if (value !== undefined && typeof value !== 'boolean')
104
- err(`${ctxField}.optional must be a boolean`);
105
- };
106
- const checkArgv = (argv, ctx, allowed) => {
107
- if (!Array.isArray(argv) || argv.length === 0 || argv.some(a => typeof a !== 'string')) {
108
- err(`${ctx}.argv must be a non-empty string array`);
109
- return false;
110
- }
111
- if (argv[0] !== '{binary}')
112
- err(`${ctx}.argv[0] must be '{binary}'`);
113
- for (const a of argv)
114
- checkPlaceholders(a, `${ctx}.argv`, allowed);
115
- return true;
116
- };
117
- const checkEnv = (env, ctx, allowed) => {
118
- const container = checkContainer(env, `${ctx}.env`);
119
- for (const [k, v] of Object.entries(container ?? {})) {
120
- if (!ENV_KEY_PATTERN.test(k)) {
121
- err(`${ctx}.env key must match ${ENV_KEY_PATTERN} (got ${k})`);
122
- continue;
123
- }
124
- if (typeof v !== 'string') {
125
- err(`${ctx}.env values must be strings`);
126
- continue;
127
- }
128
- if (CONTROL_CHAR_RE.test(v)) {
129
- err(`${ctx}.env value for ${k} contains a control character`);
130
- continue;
131
- }
132
- checkPlaceholders(v, `${ctx}.env`, allowed);
133
- }
134
- };
135
- const checkStdin = (stdin, ctx, allowed) => {
136
- if (stdin === undefined)
137
- return;
138
- if (typeof stdin !== 'string' || stdin.length === 0) {
139
- err(`${ctx}.stdin must be a non-empty string`);
140
- return;
141
- }
142
- checkPlaceholders(stdin, `${ctx}.stdin`, allowed);
143
- };
144
- const errorClassNames = new Set();
145
- if (!Array.isArray(spec.errorClasses)) {
146
- err('errorClasses must be an array');
147
- }
148
- else {
149
- spec.errorClasses.forEach((c, i) => {
150
- if (!isRecord(c)) {
151
- err(`errorClasses[${i}] must be an object`);
152
- return;
153
- }
154
- if (typeof c.class !== 'string' || !ERROR_CLASS_RE.test(c.class)) {
155
- err(`errorClasses[${i}].class must be UPPER_SNAKE`);
156
- }
157
- else if (errorClassNames.has(c.class)) {
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
- if (new RegExp(r).test(''))
173
- err(`errorClasses[${i}].regex[${k}] matches the empty string (matches any stderr)`);
174
- }
175
- catch {
176
- err(`errorClasses[${i}].regex[${k}] invalid`);
177
- }
178
- }
179
- });
180
- });
181
- }
182
- const checkOp = (opValue, ctx) => {
183
- if (!isRecord(opValue)) {
184
- err(`${ctx} must be an object`);
185
- return false;
186
- }
187
- const op = opValue;
188
- const allowed = op.parse === 'json-paged' ? PLACEHOLDERS_WITH_PAGE : PLACEHOLDERS;
189
- const argvOk = checkArgv(op.argv, ctx, allowed);
190
- checkEnv(op.env, ctx, allowed);
191
- checkStdin(op.stdin, ctx, allowed);
192
- if (op.parse !== undefined && op.parse !== 'json' && op.parse !== 'json-paged') {
193
- err(`${ctx}.parse must be 'json' | 'json-paged'`);
194
- }
195
- else if (op.parse === 'json-paged' && argvOk && !op.argv.join(' ').includes('{page}')) {
196
- err(`${ctx}.argv must include a {page} token when parse is 'json-paged'`);
197
- }
198
- if (op.responseEnvelope !== undefined && op.responseEnvelope !== 'graphql') {
199
- err(`${ctx}.responseEnvelope must be 'graphql' when present`);
200
- }
201
- else if (op.responseEnvelope === 'graphql' && op.parse === 'json-paged') {
202
- err(`${ctx}.responseEnvelope 'graphql' is not supported on paged ops`);
203
- }
204
- if (op.flatten !== undefined && (typeof op.flatten !== 'string' || op.flatten.trim() === '')) {
205
- err(`${ctx}.flatten must be a non-empty string`);
206
- }
207
- else if (typeof op.flatten === 'string' && op.flatten.split('.').some(isMalformedSegment)) {
208
- err(`${ctx}.flatten must be a dot path of non-empty segments without '[]' (got '${op.flatten}')`);
209
- }
210
- const mapContainer = checkContainer(op.map, `${ctx}.map`);
211
- if (mapContainer) {
212
- for (const [field, value] of Object.entries(mapContainer)) {
213
- if (!MAP_TARGET_FIELDS.has(field))
214
- err(`${ctx}.map.${field}: not in the closed target field set`);
215
- const checkDiscussionRef = (src) => {
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
- const stdinText = typeof op.stdin === 'string' ? op.stdin : '';
269
- return `${argvText} ${envText} ${stdinText}`;
270
- };
271
- const requirePlaceholders = (opValue, ctx, groups) => {
272
- if (!isRecord(opValue))
273
- return;
274
- const text = opAllText(opValue);
275
- for (const group of groups) {
276
- if (!group.some(name => text.includes(`{${name}}`))) {
277
- err(`${ctx} must consume ${group.map(n => `{${n}}`).join(' or ')} (lifecycle scope/atomicity contract)`);
278
- }
279
- }
280
- };
281
- const rawOps = spec.ops;
282
- for (const [opName, op] of Object.entries(rawOps)) {
283
- if (opName === 'listComments')
284
- continue;
285
- checkOp(op, `ops.${opName}`);
286
- }
287
- const checkSourceKey = (value, ctx) => {
288
- if (typeof value !== 'string' || !SOURCE_KEY_PATTERN.test(value)) {
289
- err(`${ctx}.key must match ${SOURCE_KEY_PATTERN} (got ${JSON.stringify(value)})`);
290
- return undefined;
291
- }
292
- return value;
293
- };
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;
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
- const requirePagedParse = (opValue, ctx) => {
308
- if (isRecord(opValue) && opValue.parse !== 'json-paged') {
309
- err(`${ctx}.parse must be 'json-paged'`);
310
- }
311
- };
312
- const isOptionalDeclaration = (map, field) => {
313
- const v = map[field];
314
- return isRecord(v) && v.optional === true;
315
- };
316
- const checkCommentSourceContract = (src, ctx) => {
317
- requirePagedParse(src, ctx);
318
- requirePlaceholders(src, ctx, [['prNumber']]);
319
- if (isRecord(src) && src.optional !== undefined) {
320
- err(`${ctx}.optional is not allowed on a comment source (completeness gate covers every source)`);
321
- }
322
- if (isRecord(src) && src.treatAsSuccess !== undefined) {
323
- err(`${ctx}.treatAsSuccess is only allowed on ${TREAT_AS_SUCCESS_LABEL}`);
324
- }
325
- const map = requireDeclaredFields(src, ctx, REQUIRED_COMMENT_SOURCE_FIELDS);
326
- if (!map)
327
- return;
328
- if (!('createdAt' in map) && !('updatedAt' in map)) {
329
- err(`${ctx} must declare at least one of createdAt/updatedAt`);
330
- }
331
- if ('body' in map && isOptionalDeclaration(map, 'body')) {
332
- err(`${ctx}.map.body must not be optional (null-as-present already covers empty values)`);
333
- }
334
- if (classifyCommentSource({ map }) !== 'reviews') {
335
- const timestamps = ['createdAt', 'updatedAt'].filter(f => f in map);
336
- if (timestamps.length > 0 && timestamps.every(f => isOptionalDeclaration(map, f))) {
337
- err(`${ctx} must declare at least one non-optional createdAt/updatedAt on a non-reviews source`);
338
- }
339
- }
340
- };
341
- const commentSources = [];
342
- const rawListComments = rawOps.listComments;
343
- if (Array.isArray(rawListComments)) {
344
- if (rawListComments.length === 0)
345
- err('ops.listComments must declare at least one source');
346
- const seenKeys = new Set();
347
- rawListComments.forEach((src, i) => {
348
- const ctx = `ops.listComments[${i}]`;
349
- if (!checkOp(src, ctx))
350
- return;
351
- checkCommentSourceContract(src, ctx);
352
- const key = checkSourceKey(src.key, ctx);
353
- if (key === undefined)
354
- return;
355
- if (seenKeys.has(key)) {
356
- err(`${ctx}.key duplicates '${key}'`);
357
- return;
358
- }
359
- seenKeys.add(key);
360
- commentSources.push({ ...src, key });
361
- });
362
- }
363
- else if (rawListComments !== undefined && checkOp(rawListComments, 'ops.listComments')) {
364
- checkCommentSourceContract(rawListComments, 'ops.listComments');
365
- const rawKey = rawListComments.key;
366
- const key = rawKey === undefined ? 'default' : checkSourceKey(rawKey, 'ops.listComments');
367
- if (key !== undefined)
368
- commentSources.push({ ...rawListComments, key });
369
- }
370
- for (const opName of REQUIRED_OPS) {
371
- if (rawOps[opName] === undefined)
372
- err(`ops.${opName} is required by driverSchema 1`);
373
- }
374
- if (rawOps.listPrs !== undefined)
375
- requirePagedParse(rawOps.listPrs, 'ops.listPrs');
376
- for (const [opName, fields] of Object.entries(REQUIRED_MAP_FIELDS)) {
377
- if (rawOps[opName] !== undefined)
378
- requireDeclaredFields(rawOps[opName], `ops.${opName}`, fields);
379
- }
380
- for (const opName of SINGLE_RESOURCE_OPS) {
381
- const op = rawOps[opName];
382
- if (op !== undefined && isRecord(op) && op.parse !== 'json') {
383
- err(`ops.${opName}.parse must be 'json' (single-resource read)`);
384
- }
385
- }
386
- for (const opName of WRITE_OPS) {
387
- const op = rawOps[opName];
388
- if (op !== undefined && isRecord(op) && op.parse === 'json-paged') {
389
- err(`ops.${opName}.parse must not be 'json-paged' (write ops run through runOp, which has no page loop)`);
390
- }
391
- }
392
- const requiredOpSet = new Set(REQUIRED_OPS);
393
- for (const [opName, opValue] of Object.entries(rawOps)) {
394
- if (opName === 'listComments' || !isRecord(opValue))
395
- continue;
396
- const op = opValue;
397
- if (requiredOpSet.has(opName) && op.optional === true) {
398
- err(`ops.${opName}.optional must not be true (lifecycle-required op)`);
399
- }
400
- if (!TREAT_AS_SUCCESS_OPS.has(opName) && op.treatAsSuccess !== undefined) {
401
- err(`ops.${opName}.treatAsSuccess is only allowed on ${TREAT_AS_SUCCESS_LABEL}`);
402
- }
403
- }
404
- for (const [opName, groups] of REQUIRED_OP_PLACEHOLDERS) {
405
- if (rawOps[opName] !== undefined)
406
- requirePlaceholders(rawOps[opName], `ops.${opName}`, groups);
407
- }
408
- if (isRecord(rawOps.comment)) {
409
- const comment = rawOps.comment;
410
- const argvText = Array.isArray(comment.argv)
411
- ? comment.argv.filter(a => typeof a === 'string').join(' ')
412
- : '';
413
- const envText = isRecord(comment.env)
414
- ? Object.values(comment.env).filter(v => typeof v === 'string').join(' ')
415
- : '';
416
- if (`${argvText} ${envText}`.includes('{body}')) {
417
- err('ops.comment must not inline {body} in argv/env; transport it through stdin');
418
- }
419
- if (comment.stdin !== '{body}') {
420
- err("ops.comment.stdin must be exactly '{body}'");
421
- }
422
- }
423
- for (const [cls, requiredBy] of RESERVED_ERROR_CLASSES) {
424
- if (requiredBy !== 'core' && rawOps[requiredBy] === undefined)
425
- continue;
426
- if (!errorClassNames.has(cls))
427
- err(`errorClasses must declare '${cls}' (reserved, required by ${requiredBy})`);
428
- }
429
- let visibilityLagSeconds = 5;
430
- const rawLag = obj.visibilityLagSeconds;
431
- if (rawLag !== undefined) {
432
- if (typeof rawLag !== 'number' || !Number.isFinite(rawLag) || rawLag <= 0) {
433
- err(`visibilityLagSeconds must be a positive number (got ${JSON.stringify(rawLag)})`);
434
- }
435
- else {
436
- visibilityLagSeconds = rawLag;
437
- }
438
- }
439
- if (!Array.isArray(spec.preflight)) {
440
- err('preflight must be an array');
441
- }
442
- else {
443
- let versionSteps = 0;
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
- if (step.versionCheck !== undefined && typeof step.versionCheck !== 'boolean') {
457
- err(`${ctx}.versionCheck must be a boolean when present`);
458
- }
459
- if (step.versionCheck === true)
460
- versionSteps += 1;
461
- });
462
- if (versionSteps !== 1) {
463
- err(`preflight must declare exactly one versionCheck step (got ${versionSteps})`);
464
- }
465
- }
466
- const COMMAND_NAME_RE = /^[a-z0-9_.-]+$/i;
467
- let agentCommands = [];
468
- if (spec.agentCommands !== undefined) {
469
- if (!Array.isArray(spec.agentCommands)) {
470
- err('agentCommands must be an array of command-alternative groups');
471
- }
472
- else {
473
- spec.agentCommands.forEach((group, i) => {
474
- if (!Array.isArray(group) || group.length === 0) {
475
- err(`agentCommands[${i}] must be a non-empty array of command names`);
476
- return;
477
- }
478
- for (const cmd of group) {
479
- if (typeof cmd !== 'string' || !COMMAND_NAME_RE.test(cmd)) {
480
- err(`agentCommands[${i}] entries must be plain command names (got ${JSON.stringify(cmd)})`);
481
- }
482
- }
483
- });
484
- if (errors.length === 0)
485
- agentCommands = spec.agentCommands;
486
- }
487
- }
488
- if (errors.length > 0)
489
- return { errors };
490
- const ops = {};
491
- for (const [name, op] of Object.entries(rawOps)) {
492
- if (name !== 'listComments')
493
- ops[name] = op;
494
- }
495
- return {
496
- spec: {
497
- ops,
498
- commentSources,
499
- visibilityLagSeconds,
500
- preflight: spec.preflight,
501
- agentCommands,
502
- errorClasses: spec.errorClasses,
503
- },
504
- };
505
- }
506
- //# sourceMappingURL=driver-spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"driver-spec.js","sourceRoot":"","sources":["../../src/platform/driver-spec.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-mapper.d.ts","sourceRoot":"","sources":["../../src/platform/field-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAC;AAEzD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAoFD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,CA+BvF"}
@@ -1,109 +0,0 @@
1
- export class FieldMappingError extends Error {
2
- constructor(message) {
3
- super(message);
4
- this.name = 'FieldMappingError';
5
- }
6
- }
7
- const MISSING = Symbol('missing');
8
- function getPath(obj, path) {
9
- let cur = obj;
10
- for (const seg of path.split('.')) {
11
- if (cur === null || typeof cur !== 'object' || !Object.hasOwn(cur, seg))
12
- return MISSING;
13
- cur = cur[seg];
14
- }
15
- return cur;
16
- }
17
- function resolveSourceSegments(obj, segments, fullPath, opName, field) {
18
- if (segments.length === 0)
19
- return obj;
20
- if (obj === null || typeof obj !== 'object')
21
- return MISSING;
22
- const record = obj;
23
- const [seg, ...rest] = segments;
24
- if (!seg.endsWith('[]')) {
25
- if (!Object.hasOwn(record, seg))
26
- return MISSING;
27
- return resolveSourceSegments(record[seg], rest, fullPath, opName, field);
28
- }
29
- const key = seg.slice(0, -2);
30
- if (!Object.hasOwn(record, key))
31
- return MISSING;
32
- const arr = record[key];
33
- if (arr === null)
34
- return [];
35
- if (!Array.isArray(arr)) {
36
- throw new FieldMappingError(`op ${opName}: field '${field}' source path '${fullPath}' expects an array at '${key}' (got ${typeof arr})`);
37
- }
38
- const results = [];
39
- for (const element of arr) {
40
- const v = resolveSourceSegments(element, rest, fullPath, opName, field);
41
- if (v !== MISSING)
42
- results.push(v);
43
- }
44
- return results;
45
- }
46
- function compileMap(opName, map) {
47
- return Object.entries(map).map(([field, spec]) => {
48
- const rawSources = typeof spec === 'string' ? [spec] : spec.sources;
49
- const optional = typeof spec === 'string' ? false : spec.optional === true;
50
- const values = typeof spec === 'string' ? undefined : spec.values;
51
- const sources = rawSources.map((raw) => {
52
- const fromParent = raw.startsWith('_discussion.');
53
- const path = fromParent ? raw.slice('_discussion.'.length) : raw;
54
- const segments = path.split('.');
55
- if (segments.filter(seg => seg.endsWith('[]')).length > 1) {
56
- throw new FieldMappingError(`op ${opName}: field '${field}' source path '${path}' has more than one '[]' level, which is unsupported`);
57
- }
58
- return { fromParent, segments, raw: path };
59
- });
60
- return { field, sources, sourceKeys: rawSources.join(', '), optional, values };
61
- });
62
- }
63
- function resolveField(opName, compiled, element, parent) {
64
- for (const src of compiled.sources) {
65
- const v = resolveSourceSegments(src.fromParent ? parent : element, src.segments, src.raw, opName, compiled.field);
66
- if (v !== MISSING) {
67
- if (compiled.values && typeof v === 'string' && Object.hasOwn(compiled.values, v))
68
- return compiled.values[v];
69
- return v;
70
- }
71
- }
72
- if (compiled.optional)
73
- return undefined;
74
- throw new FieldMappingError(`op ${opName}: required field '${compiled.field}' missing (tried keys: ${compiled.sourceKeys})`);
75
- }
76
- export function mapResponse(opName, op, payload) {
77
- const compiledFields = compileMap(opName, op.map ?? {});
78
- const units = [];
79
- if (payload === null || typeof payload !== 'object') {
80
- return [];
81
- }
82
- const top = Array.isArray(payload) ? payload : [payload];
83
- for (const item of top) {
84
- if (op.flatten) {
85
- const arr = getPath(item, op.flatten);
86
- if (arr === MISSING) {
87
- throw new FieldMappingError(`op ${opName}: flatten path '${op.flatten}' missing on a response item`);
88
- }
89
- if (arr === null)
90
- continue;
91
- if (!Array.isArray(arr)) {
92
- throw new FieldMappingError(`op ${opName}: flatten path '${op.flatten}' expects an array (got ${typeof arr})`);
93
- }
94
- for (const child of arr)
95
- units.push({ element: child, parent: item });
96
- }
97
- else {
98
- units.push({ element: item, parent: item });
99
- }
100
- }
101
- return units.map(({ element, parent }) => {
102
- const row = {};
103
- for (const compiled of compiledFields) {
104
- row[compiled.field] = resolveField(opName, compiled, element, parent);
105
- }
106
- return row;
107
- });
108
- }
109
- //# sourceMappingURL=field-mapper.js.map