@blockspool/cli 0.4.3 → 0.5.0

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 (37) hide show
  1. package/dist/bin/blockspool.js +1 -1
  2. package/dist/lib/codebase-index.d.ts +46 -0
  3. package/dist/lib/codebase-index.d.ts.map +1 -0
  4. package/dist/lib/codebase-index.js +427 -0
  5. package/dist/lib/codebase-index.js.map +1 -0
  6. package/dist/lib/learnings.d.ts +68 -0
  7. package/dist/lib/learnings.d.ts.map +1 -0
  8. package/dist/lib/learnings.js +248 -0
  9. package/dist/lib/learnings.js.map +1 -0
  10. package/dist/lib/project-metadata.d.ts +34 -0
  11. package/dist/lib/project-metadata.d.ts.map +1 -0
  12. package/dist/lib/project-metadata.js +504 -0
  13. package/dist/lib/project-metadata.js.map +1 -0
  14. package/dist/lib/proposal-review.d.ts +26 -0
  15. package/dist/lib/proposal-review.d.ts.map +1 -0
  16. package/dist/lib/proposal-review.js +89 -0
  17. package/dist/lib/proposal-review.js.map +1 -0
  18. package/dist/lib/solo-auto.d.ts.map +1 -1
  19. package/dist/lib/solo-auto.js +183 -2
  20. package/dist/lib/solo-auto.js.map +1 -1
  21. package/dist/lib/solo-ci.d.ts +1 -1
  22. package/dist/lib/solo-ci.d.ts.map +1 -1
  23. package/dist/lib/solo-ci.js +6 -0
  24. package/dist/lib/solo-ci.js.map +1 -1
  25. package/dist/lib/solo-config.d.ts +8 -0
  26. package/dist/lib/solo-config.d.ts.map +1 -1
  27. package/dist/lib/solo-config.js +4 -0
  28. package/dist/lib/solo-config.js.map +1 -1
  29. package/dist/lib/solo-ticket.d.ts +6 -2
  30. package/dist/lib/solo-ticket.d.ts.map +1 -1
  31. package/dist/lib/solo-ticket.js +29 -3
  32. package/dist/lib/solo-ticket.js.map +1 -1
  33. package/dist/lib/spindle.d.ts +21 -1
  34. package/dist/lib/spindle.d.ts.map +1 -1
  35. package/dist/lib/spindle.js +152 -3
  36. package/dist/lib/spindle.js.map +1 -1
  37. package/package.json +1 -1
@@ -0,0 +1,504 @@
1
+ /**
2
+ * Project Metadata — framework-agnostic detection of tooling, test runners,
3
+ * package managers, and languages.
4
+ *
5
+ * Scans config files at the project root to build a structured summary
6
+ * that gets injected into scout prompts so the LLM knows which CLI
7
+ * flags and conventions to use.
8
+ */
9
+ import * as fs from 'node:fs';
10
+ import * as path from 'node:path';
11
+ // ---------------------------------------------------------------------------
12
+ // Main entry
13
+ // ---------------------------------------------------------------------------
14
+ export function detectProjectMetadata(projectRoot) {
15
+ const meta = {
16
+ languages: [],
17
+ package_manager: null,
18
+ test_runner: null,
19
+ framework: null,
20
+ linter: null,
21
+ type_checker: null,
22
+ monorepo_tool: null,
23
+ signals: [],
24
+ };
25
+ const exists = (f) => fs.existsSync(path.join(projectRoot, f));
26
+ const readJson = (f) => {
27
+ try {
28
+ return JSON.parse(fs.readFileSync(path.join(projectRoot, f), 'utf8'));
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ };
34
+ const readText = (f) => {
35
+ try {
36
+ return fs.readFileSync(path.join(projectRoot, f), 'utf8');
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ };
42
+ // -----------------------------------------------------------------------
43
+ // Node / JavaScript / TypeScript
44
+ // -----------------------------------------------------------------------
45
+ if (exists('package.json')) {
46
+ const pkg = readJson('package.json');
47
+ if (pkg) {
48
+ const devDeps = (pkg.devDependencies ?? {});
49
+ const deps = (pkg.dependencies ?? {});
50
+ const scripts = (pkg.scripts ?? {});
51
+ const allDeps = { ...deps, ...devDeps };
52
+ // Language
53
+ if (allDeps['typescript'] || exists('tsconfig.json')) {
54
+ meta.languages.push('TypeScript');
55
+ meta.type_checker = 'tsc';
56
+ meta.signals.push('tsconfig.json or typescript dep');
57
+ }
58
+ else {
59
+ meta.languages.push('JavaScript');
60
+ }
61
+ // Package manager
62
+ if (exists('bun.lockb') || exists('bun.lock')) {
63
+ meta.package_manager = 'bun';
64
+ }
65
+ else if (exists('pnpm-lock.yaml')) {
66
+ meta.package_manager = 'pnpm';
67
+ }
68
+ else if (exists('yarn.lock')) {
69
+ meta.package_manager = 'yarn';
70
+ }
71
+ else {
72
+ meta.package_manager = 'npm';
73
+ }
74
+ // Test runner
75
+ if (allDeps['vitest'] || exists('vitest.config.ts') || exists('vitest.config.js') || exists('vitest.config.mts')) {
76
+ const runCmd = scripts['test'] ? `${meta.package_manager} test` : 'npx vitest run';
77
+ meta.test_runner = {
78
+ name: 'vitest',
79
+ run_command: runCmd,
80
+ filter_syntax: `${runCmd} -- <file-or-pattern>`,
81
+ };
82
+ meta.signals.push('vitest detected');
83
+ }
84
+ else if (allDeps['jest'] || exists('jest.config.js') || exists('jest.config.ts') || exists('jest.config.mjs')) {
85
+ const runCmd = scripts['test'] ? `${meta.package_manager} test` : 'npx jest';
86
+ meta.test_runner = {
87
+ name: 'jest',
88
+ run_command: runCmd,
89
+ filter_syntax: `${runCmd} -- --testPathPattern=<pattern>`,
90
+ };
91
+ meta.signals.push('jest detected');
92
+ }
93
+ else if (allDeps['mocha']) {
94
+ meta.test_runner = {
95
+ name: 'mocha',
96
+ run_command: scripts['test'] ? `${meta.package_manager} test` : 'npx mocha',
97
+ filter_syntax: `npx mocha --grep <pattern>`,
98
+ };
99
+ meta.signals.push('mocha detected');
100
+ }
101
+ else if (allDeps['ava']) {
102
+ meta.test_runner = {
103
+ name: 'ava',
104
+ run_command: scripts['test'] ? `${meta.package_manager} test` : 'npx ava',
105
+ filter_syntax: `npx ava --match '<pattern>'`,
106
+ };
107
+ meta.signals.push('ava detected');
108
+ }
109
+ else if (scripts['test']) {
110
+ // Has a test script but can't identify runner — use generic
111
+ meta.test_runner = {
112
+ name: 'unknown',
113
+ run_command: `${meta.package_manager} test`,
114
+ filter_syntax: `${meta.package_manager} test`,
115
+ };
116
+ meta.signals.push('test script exists but runner unknown');
117
+ }
118
+ // Framework
119
+ if (allDeps['next']) {
120
+ meta.framework = 'Next.js';
121
+ meta.signals.push('next dep');
122
+ }
123
+ else if (allDeps['@remix-run/node'] || allDeps['@remix-run/react']) {
124
+ meta.framework = 'Remix';
125
+ }
126
+ else if (allDeps['nuxt']) {
127
+ meta.framework = 'Nuxt';
128
+ }
129
+ else if (allDeps['svelte'] || allDeps['@sveltejs/kit']) {
130
+ meta.framework = 'SvelteKit';
131
+ }
132
+ else if (allDeps['astro']) {
133
+ meta.framework = 'Astro';
134
+ }
135
+ else if (allDeps['express']) {
136
+ meta.framework = 'Express';
137
+ }
138
+ else if (allDeps['fastify']) {
139
+ meta.framework = 'Fastify';
140
+ }
141
+ else if (allDeps['hono']) {
142
+ meta.framework = 'Hono';
143
+ }
144
+ else if (allDeps['react']) {
145
+ meta.framework = 'React';
146
+ }
147
+ else if (allDeps['vue']) {
148
+ meta.framework = 'Vue';
149
+ }
150
+ else if (allDeps['angular'] || allDeps['@angular/core']) {
151
+ meta.framework = 'Angular';
152
+ }
153
+ // Linter
154
+ if (allDeps['@biomejs/biome'] || exists('biome.json') || exists('biome.jsonc')) {
155
+ meta.linter = 'biome';
156
+ }
157
+ else if (allDeps['eslint'] || exists('.eslintrc.js') || exists('.eslintrc.json') || exists('eslint.config.js') || exists('eslint.config.mjs')) {
158
+ meta.linter = 'eslint';
159
+ }
160
+ // Monorepo
161
+ if (allDeps['turbo'] || exists('turbo.json')) {
162
+ meta.monorepo_tool = 'turborepo';
163
+ }
164
+ else if (allDeps['nx'] || exists('nx.json')) {
165
+ meta.monorepo_tool = 'nx';
166
+ }
167
+ else if (allDeps['lerna'] || exists('lerna.json')) {
168
+ meta.monorepo_tool = 'lerna';
169
+ }
170
+ else if (pkg.workspaces) {
171
+ meta.monorepo_tool = 'workspaces';
172
+ }
173
+ }
174
+ }
175
+ // -----------------------------------------------------------------------
176
+ // Python
177
+ // -----------------------------------------------------------------------
178
+ if (exists('pyproject.toml') || exists('setup.py') || exists('requirements.txt') || exists('Pipfile')) {
179
+ if (!meta.languages.includes('Python'))
180
+ meta.languages.push('Python');
181
+ const pyproject = readText('pyproject.toml');
182
+ // Package manager
183
+ if (exists('poetry.lock') || pyproject?.includes('[tool.poetry]')) {
184
+ meta.package_manager = meta.package_manager ?? 'poetry';
185
+ }
186
+ else if (exists('Pipfile.lock') || exists('Pipfile')) {
187
+ meta.package_manager = meta.package_manager ?? 'pipenv';
188
+ }
189
+ else if (exists('uv.lock') || pyproject?.includes('[tool.uv]')) {
190
+ meta.package_manager = meta.package_manager ?? 'uv';
191
+ }
192
+ else {
193
+ meta.package_manager = meta.package_manager ?? 'pip';
194
+ }
195
+ // Test runner
196
+ if (!meta.test_runner) {
197
+ if (pyproject?.includes('[tool.pytest]') || exists('pytest.ini') || exists('conftest.py')) {
198
+ meta.test_runner = {
199
+ name: 'pytest',
200
+ run_command: 'pytest',
201
+ filter_syntax: 'pytest <path> -k <pattern>',
202
+ };
203
+ meta.signals.push('pytest detected');
204
+ }
205
+ else if (exists('tox.ini')) {
206
+ meta.test_runner = {
207
+ name: 'tox',
208
+ run_command: 'tox',
209
+ filter_syntax: 'tox -- <path>',
210
+ };
211
+ }
212
+ else {
213
+ // Default python test
214
+ meta.test_runner = {
215
+ name: 'pytest',
216
+ run_command: 'pytest',
217
+ filter_syntax: 'pytest <path> -k <pattern>',
218
+ };
219
+ }
220
+ }
221
+ // Framework
222
+ if (!meta.framework) {
223
+ const allText = (pyproject ?? '') + (readText('requirements.txt') ?? '');
224
+ if (allText.includes('django') || allText.includes('Django')) {
225
+ meta.framework = 'Django';
226
+ }
227
+ else if (allText.includes('flask') || allText.includes('Flask')) {
228
+ meta.framework = 'Flask';
229
+ }
230
+ else if (allText.includes('fastapi') || allText.includes('FastAPI')) {
231
+ meta.framework = 'FastAPI';
232
+ }
233
+ }
234
+ // Linter / type checker
235
+ if (!meta.linter) {
236
+ if (pyproject?.includes('[tool.ruff]') || exists('ruff.toml')) {
237
+ meta.linter = 'ruff';
238
+ }
239
+ else if (pyproject?.includes('[tool.flake8]') || exists('.flake8')) {
240
+ meta.linter = 'flake8';
241
+ }
242
+ }
243
+ if (!meta.type_checker) {
244
+ if (pyproject?.includes('[tool.mypy]') || exists('mypy.ini') || exists('.mypy.ini')) {
245
+ meta.type_checker = 'mypy';
246
+ }
247
+ else if (pyproject?.includes('[tool.pyright]') || exists('pyrightconfig.json')) {
248
+ meta.type_checker = 'pyright';
249
+ }
250
+ }
251
+ }
252
+ // -----------------------------------------------------------------------
253
+ // Rust
254
+ // -----------------------------------------------------------------------
255
+ if (exists('Cargo.toml')) {
256
+ if (!meta.languages.includes('Rust'))
257
+ meta.languages.push('Rust');
258
+ meta.package_manager = meta.package_manager ?? 'cargo';
259
+ if (!meta.test_runner) {
260
+ meta.test_runner = {
261
+ name: 'cargo-test',
262
+ run_command: 'cargo test',
263
+ filter_syntax: 'cargo test <test_name>',
264
+ };
265
+ }
266
+ meta.linter = meta.linter ?? 'clippy';
267
+ meta.signals.push('Cargo.toml detected');
268
+ const cargo = readText('Cargo.toml');
269
+ if (cargo?.includes('[workspace]')) {
270
+ meta.monorepo_tool = meta.monorepo_tool ?? 'cargo-workspaces';
271
+ }
272
+ if (cargo?.includes('actix') || cargo?.includes('actix-web')) {
273
+ meta.framework = meta.framework ?? 'Actix';
274
+ }
275
+ else if (cargo?.includes('axum')) {
276
+ meta.framework = meta.framework ?? 'Axum';
277
+ }
278
+ else if (cargo?.includes('rocket')) {
279
+ meta.framework = meta.framework ?? 'Rocket';
280
+ }
281
+ }
282
+ // -----------------------------------------------------------------------
283
+ // Go
284
+ // -----------------------------------------------------------------------
285
+ if (exists('go.mod')) {
286
+ if (!meta.languages.includes('Go'))
287
+ meta.languages.push('Go');
288
+ meta.package_manager = meta.package_manager ?? 'go';
289
+ if (!meta.test_runner) {
290
+ meta.test_runner = {
291
+ name: 'go-test',
292
+ run_command: 'go test ./...',
293
+ filter_syntax: 'go test ./... -run <TestName>',
294
+ };
295
+ }
296
+ meta.linter = meta.linter ?? (exists('.golangci.yml') || exists('.golangci.yaml') ? 'golangci-lint' : null);
297
+ meta.signals.push('go.mod detected');
298
+ const gomod = readText('go.mod');
299
+ if (gomod?.includes('github.com/gin-gonic/gin')) {
300
+ meta.framework = meta.framework ?? 'Gin';
301
+ }
302
+ else if (gomod?.includes('github.com/labstack/echo')) {
303
+ meta.framework = meta.framework ?? 'Echo';
304
+ }
305
+ else if (gomod?.includes('github.com/gofiber/fiber')) {
306
+ meta.framework = meta.framework ?? 'Fiber';
307
+ }
308
+ }
309
+ // -----------------------------------------------------------------------
310
+ // Ruby
311
+ // -----------------------------------------------------------------------
312
+ if (exists('Gemfile')) {
313
+ if (!meta.languages.includes('Ruby'))
314
+ meta.languages.push('Ruby');
315
+ meta.package_manager = meta.package_manager ?? 'bundler';
316
+ const gemfile = readText('Gemfile') ?? '';
317
+ if (!meta.test_runner) {
318
+ if (gemfile.includes('rspec') || exists('.rspec')) {
319
+ meta.test_runner = {
320
+ name: 'rspec',
321
+ run_command: 'bundle exec rspec',
322
+ filter_syntax: 'bundle exec rspec <path>',
323
+ };
324
+ }
325
+ else {
326
+ meta.test_runner = {
327
+ name: 'minitest',
328
+ run_command: 'bundle exec rake test',
329
+ filter_syntax: 'bundle exec ruby -Itest <path>',
330
+ };
331
+ }
332
+ }
333
+ if (!meta.framework) {
334
+ if (gemfile.includes('rails') || exists('config/routes.rb')) {
335
+ meta.framework = 'Rails';
336
+ }
337
+ else if (gemfile.includes('sinatra')) {
338
+ meta.framework = 'Sinatra';
339
+ }
340
+ }
341
+ meta.linter = meta.linter ?? (gemfile.includes('rubocop') ? 'rubocop' : null);
342
+ meta.signals.push('Gemfile detected');
343
+ }
344
+ // -----------------------------------------------------------------------
345
+ // Elixir
346
+ // -----------------------------------------------------------------------
347
+ if (exists('mix.exs')) {
348
+ if (!meta.languages.includes('Elixir'))
349
+ meta.languages.push('Elixir');
350
+ meta.package_manager = meta.package_manager ?? 'mix';
351
+ if (!meta.test_runner) {
352
+ meta.test_runner = {
353
+ name: 'exunit',
354
+ run_command: 'mix test',
355
+ filter_syntax: 'mix test <path>:<line>',
356
+ };
357
+ }
358
+ const mixfile = readText('mix.exs') ?? '';
359
+ if (mixfile.includes(':phoenix')) {
360
+ meta.framework = meta.framework ?? 'Phoenix';
361
+ }
362
+ meta.signals.push('mix.exs detected');
363
+ }
364
+ // -----------------------------------------------------------------------
365
+ // Java / Kotlin
366
+ // -----------------------------------------------------------------------
367
+ if (exists('pom.xml')) {
368
+ if (!meta.languages.includes('Java'))
369
+ meta.languages.push('Java');
370
+ meta.package_manager = meta.package_manager ?? 'maven';
371
+ if (!meta.test_runner) {
372
+ meta.test_runner = {
373
+ name: 'junit',
374
+ run_command: 'mvn test',
375
+ filter_syntax: 'mvn test -Dtest=<ClassName>#<methodName>',
376
+ };
377
+ }
378
+ const pom = readText('pom.xml') ?? '';
379
+ if (pom.includes('spring-boot')) {
380
+ meta.framework = meta.framework ?? 'Spring Boot';
381
+ }
382
+ meta.signals.push('pom.xml detected');
383
+ }
384
+ else if (exists('build.gradle') || exists('build.gradle.kts')) {
385
+ const lang = exists('build.gradle.kts') ? 'Kotlin' : 'Java';
386
+ if (!meta.languages.includes(lang))
387
+ meta.languages.push(lang);
388
+ meta.package_manager = meta.package_manager ?? 'gradle';
389
+ if (!meta.test_runner) {
390
+ meta.test_runner = {
391
+ name: 'junit',
392
+ run_command: './gradlew test',
393
+ filter_syntax: './gradlew test --tests <ClassName>',
394
+ };
395
+ }
396
+ meta.signals.push('build.gradle detected');
397
+ }
398
+ // -----------------------------------------------------------------------
399
+ // C# / .NET
400
+ // -----------------------------------------------------------------------
401
+ if (exists('*.sln') || exists('*.csproj') || existsGlob(projectRoot, '*.csproj')) {
402
+ if (!meta.languages.includes('C#'))
403
+ meta.languages.push('C#');
404
+ meta.package_manager = meta.package_manager ?? 'dotnet';
405
+ if (!meta.test_runner) {
406
+ meta.test_runner = {
407
+ name: 'dotnet-test',
408
+ run_command: 'dotnet test',
409
+ filter_syntax: 'dotnet test --filter <FullyQualifiedName>',
410
+ };
411
+ }
412
+ meta.signals.push('.NET project detected');
413
+ }
414
+ // -----------------------------------------------------------------------
415
+ // PHP
416
+ // -----------------------------------------------------------------------
417
+ if (exists('composer.json')) {
418
+ if (!meta.languages.includes('PHP'))
419
+ meta.languages.push('PHP');
420
+ meta.package_manager = meta.package_manager ?? 'composer';
421
+ if (!meta.test_runner) {
422
+ if (exists('phpunit.xml') || exists('phpunit.xml.dist')) {
423
+ meta.test_runner = {
424
+ name: 'phpunit',
425
+ run_command: './vendor/bin/phpunit',
426
+ filter_syntax: './vendor/bin/phpunit --filter <pattern>',
427
+ };
428
+ }
429
+ }
430
+ const composer = readJson('composer.json');
431
+ const require_ = (composer?.require ?? {});
432
+ if (require_['laravel/framework']) {
433
+ meta.framework = meta.framework ?? 'Laravel';
434
+ }
435
+ else if (require_['symfony/framework-bundle']) {
436
+ meta.framework = meta.framework ?? 'Symfony';
437
+ }
438
+ meta.signals.push('composer.json detected');
439
+ }
440
+ // -----------------------------------------------------------------------
441
+ // Swift
442
+ // -----------------------------------------------------------------------
443
+ if (exists('Package.swift')) {
444
+ if (!meta.languages.includes('Swift'))
445
+ meta.languages.push('Swift');
446
+ meta.package_manager = meta.package_manager ?? 'swift-pm';
447
+ if (!meta.test_runner) {
448
+ meta.test_runner = {
449
+ name: 'swift-test',
450
+ run_command: 'swift test',
451
+ filter_syntax: 'swift test --filter <TestTarget>.<TestCase>',
452
+ };
453
+ }
454
+ meta.signals.push('Package.swift detected');
455
+ }
456
+ return meta;
457
+ }
458
+ // ---------------------------------------------------------------------------
459
+ // Helpers
460
+ // ---------------------------------------------------------------------------
461
+ /** Simple glob check for a single pattern at root level */
462
+ function existsGlob(dir, pattern) {
463
+ try {
464
+ const ext = pattern.replace('*', '');
465
+ const entries = fs.readdirSync(dir);
466
+ return entries.some(e => e.endsWith(ext));
467
+ }
468
+ catch {
469
+ return false;
470
+ }
471
+ }
472
+ // ---------------------------------------------------------------------------
473
+ // Format for prompt injection
474
+ // ---------------------------------------------------------------------------
475
+ export function formatMetadataForPrompt(meta) {
476
+ const lines = ['## Project Tooling'];
477
+ if (meta.languages.length > 0) {
478
+ lines.push(`**Language(s):** ${meta.languages.join(', ')}`);
479
+ }
480
+ if (meta.framework) {
481
+ lines.push(`**Framework:** ${meta.framework}`);
482
+ }
483
+ if (meta.package_manager) {
484
+ lines.push(`**Package manager:** ${meta.package_manager}`);
485
+ }
486
+ if (meta.test_runner) {
487
+ lines.push(`**Test runner:** ${meta.test_runner.name}`);
488
+ lines.push(`**Run tests:** \`${meta.test_runner.run_command}\``);
489
+ lines.push(`**Filter tests:** \`${meta.test_runner.filter_syntax}\``);
490
+ lines.push('');
491
+ lines.push(`**IMPORTANT:** Use ${meta.test_runner.name} CLI syntax for all \`verification_commands\`. Do NOT guess — use the exact syntax above.`);
492
+ }
493
+ if (meta.linter) {
494
+ lines.push(`**Linter:** ${meta.linter}`);
495
+ }
496
+ if (meta.type_checker) {
497
+ lines.push(`**Type checker:** ${meta.type_checker}`);
498
+ }
499
+ if (meta.monorepo_tool) {
500
+ lines.push(`**Monorepo:** ${meta.monorepo_tool}`);
501
+ }
502
+ return lines.join('\n');
503
+ }
504
+ //# sourceMappingURL=project-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-metadata.js","sourceRoot":"","sources":["../../src/lib/project-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AA+BlC,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,IAAI,GAAoB;QAC5B,SAAS,EAAE,EAAE;QACb,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;QACnB,OAAO,EAAE,EAAE;KACZ,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAkC,EAAE;QAC7D,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IAC1B,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAiB,EAAE;QAC5C,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,0EAA0E;IAC1E,iCAAiC;IACjC,0EAA0E;IAC1E,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAmC,CAAC;QACvE,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAA2B,CAAC;YACtE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAA2B,CAAC;YAChE,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAA2B,CAAC;YAC9D,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;YAExC,WAAW;YACX,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAClC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACpC,CAAC;YAED,kBAAkB;YAClB,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC/B,CAAC;iBAAM,IAAI,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;YAChC,CAAC;iBAAM,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC/B,CAAC;YAED,cAAc;YACd,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACjH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBACnF,IAAI,CAAC,WAAW,GAAG;oBACjB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,MAAM;oBACnB,aAAa,EAAE,GAAG,MAAM,uBAAuB;iBAChD,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACvC,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAChH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC7E,IAAI,CAAC,WAAW,GAAG;oBACjB,IAAI,EAAE,MAAM;oBACZ,WAAW,EAAE,MAAM;oBACnB,aAAa,EAAE,GAAG,MAAM,iCAAiC;iBAC1D,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,WAAW,GAAG;oBACjB,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,OAAO,CAAC,CAAC,CAAC,WAAW;oBAC3E,aAAa,EAAE,4BAA4B;iBAC5C,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACtC,CAAC;iBAAM,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,WAAW,GAAG;oBACjB,IAAI,EAAE,KAAK;oBACX,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,OAAO,CAAC,CAAC,CAAC,SAAS;oBACzE,aAAa,EAAE,6BAA6B;iBAC7C,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,4DAA4D;gBAC5D,IAAI,CAAC,WAAW,GAAG;oBACjB,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,GAAG,IAAI,CAAC,eAAe,OAAO;oBAC3C,aAAa,EAAE,GAAG,IAAI,CAAC,eAAe,OAAO;iBAC9C,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YAC7D,CAAC;YAED,YAAY;YACZ,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;gBAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAAC,CAAC;iBAC9E,IAAI,OAAO,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;YAAC,CAAC;iBAC5F,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YAAC,CAAC;iBACjD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;YAAC,CAAC;iBACpF,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;YAAC,CAAC;iBACnD,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAAC,CAAC;iBACvD,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAAC,CAAC;iBACvD,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YAAC,CAAC;iBACjD,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;YAAC,CAAC;iBACnD,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YAAC,CAAC;iBAC/C,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAAC,CAAC;YAExF,SAAS;YACT,IAAI,OAAO,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC/E,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACxB,CAAC;iBAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAChJ,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACzB,CAAC;YAED,WAAW;YACX,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;YAAC,CAAC;iBAC9E,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAAC,CAAC;iBACtE,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAAC,CAAC;iBAC/E,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBAAC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;YAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,SAAS;IACT,0EAA0E;IAC1E,IAAI,MAAM,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtE,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAE7C,kBAAkB;QAClB,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,SAAS,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,QAAQ,CAAC;QAC1D,CAAC;aAAM,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,QAAQ,CAAC;QAC1D,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACjE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC;QACvD,CAAC;QAED,cAAc;QACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,SAAS,EAAE,QAAQ,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1F,IAAI,CAAC,WAAW,GAAG;oBACjB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,QAAQ;oBACrB,aAAa,EAAE,4BAA4B;iBAC5C,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACvC,CAAC;iBAAM,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,WAAW,GAAG;oBACjB,IAAI,EAAE,KAAK;oBACX,WAAW,EAAE,KAAK;oBAClB,aAAa,EAAE,eAAe;iBAC/B,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,sBAAsB;gBACtB,IAAI,CAAC,WAAW,GAAG;oBACjB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,QAAQ;oBACrB,aAAa,EAAE,4BAA4B;iBAC5C,CAAC;YACJ,CAAC;QACH,CAAC;QAED,YAAY;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;YACzE,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;YAAC,CAAC;iBACvF,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;YAAC,CAAC;iBACzF,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAAC,CAAC;QACtG,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,SAAS,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YAAC,CAAC;iBACnF,IAAI,SAAS,EAAE,QAAQ,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YAAC,CAAC;QACjG,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,SAAS,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAAC,CAAC;iBAC/G,IAAI,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAAC,CAAC;QACpH,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,OAAO;IACP,0EAA0E;IAC1E,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC;QAEvD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG;gBACjB,IAAI,EAAE,YAAY;gBAClB,WAAW,EAAE,YAAY;gBACzB,aAAa,EAAE,wBAAwB;aACxC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAEzC,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,kBAAkB,CAAC;QAAC,CAAC;QACtG,IAAI,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;QAAC,CAAC;aACxG,IAAI,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC;QAAC,CAAC;aAC3E,IAAI,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC;QAAC,CAAC;IACtF,CAAC;IAED,0EAA0E;IAC1E,KAAK;IACL,0EAA0E;IAC1E,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;QAEpD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG;gBACjB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,eAAe;gBAC5B,aAAa,EAAE,+BAA+B;aAC/C,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5G,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAErC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;QAAC,CAAC;aACzF,IAAI,KAAK,EAAE,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC;QAAC,CAAC;aAC/F,IAAI,KAAK,EAAE,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;QAAC,CAAC;IACvG,CAAC;IAED,0EAA0E;IAC1E,OAAO;IACP,0EAA0E;IAC1E,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC;QAEzD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAE1C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,WAAW,GAAG;oBACjB,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,mBAAmB;oBAChC,aAAa,EAAE,0BAA0B;iBAC1C,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,WAAW,GAAG;oBACjB,IAAI,EAAE,UAAU;oBAChB,WAAW,EAAE,uBAAuB;oBACpC,aAAa,EAAE,gCAAgC;iBAChD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;YAAC,CAAC;iBACrF,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC;IAED,0EAA0E;IAC1E,SAAS;IACT,0EAA0E;IAC1E,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC;QAErD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG;gBACjB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,UAAU;gBACvB,aAAa,EAAE,wBAAwB;aACxC,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC;QAAC,CAAC;QACnF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC;IAED,0EAA0E;IAC1E,gBAAgB;IAChB,0EAA0E;IAC1E,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG;gBACjB,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,UAAU;gBACvB,aAAa,EAAE,0CAA0C;aAC1D,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC;QAAC,CAAC;QACtF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,QAAQ,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG;gBACjB,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,gBAAgB;gBAC7B,aAAa,EAAE,oCAAoC;aACpD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC7C,CAAC;IAED,0EAA0E;IAC1E,YAAY;IACZ,0EAA0E;IAC1E,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;QACjF,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,QAAQ,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG;gBACjB,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,aAAa;gBAC1B,aAAa,EAAE,2CAA2C;aAC3D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC7C,CAAC;IAED,0EAA0E;IAC1E,MAAM;IACN,0EAA0E;IAC1E,IAAI,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,UAAU,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACxD,IAAI,CAAC,WAAW,GAAG;oBACjB,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,sBAAsB;oBACnC,aAAa,EAAE,yCAAyC;iBACzD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAmC,CAAC;QAC7E,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAA2B,CAAC;QACrE,IAAI,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC;QAAC,CAAC;aAC/E,IAAI,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC;QAAC,CAAC;QAChG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC9C,CAAC;IAED,0EAA0E;IAC1E,QAAQ;IACR,0EAA0E;IAC1E,IAAI,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,UAAU,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG;gBACjB,IAAI,EAAE,YAAY;gBAClB,WAAW,EAAE,YAAY;gBACzB,aAAa,EAAE,6CAA6C;aAC7D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,2DAA2D;AAC3D,SAAS,UAAU,CAAC,GAAW,EAAE,OAAe;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,MAAM,UAAU,uBAAuB,CAAC,IAAqB;IAC3D,MAAM,KAAK,GAAa,CAAC,oBAAoB,CAAC,CAAC;IAE/C,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,WAAW,CAAC,WAAW,IAAI,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,WAAW,CAAC,aAAa,IAAI,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,WAAW,CAAC,IAAI,2FAA2F,CAAC,CAAC;IACrJ,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Adversarial proposal review — second-pass critical evaluation of scout proposals.
3
+ *
4
+ * Builds a review prompt, sends it through the execution backend (Claude CLI / Codex),
5
+ * parses revised confidence/impact scores, and applies them to proposals.
6
+ */
7
+ import type { TicketProposal } from '@blockspool/core/scout';
8
+ export declare function buildProposalReviewPrompt(proposals: TicketProposal[]): string;
9
+ export interface ReviewedProposal {
10
+ title: string;
11
+ confidence: number;
12
+ impact_score: number;
13
+ review_note?: string;
14
+ }
15
+ /**
16
+ * Parse the <reviewed-proposals> XML block from the LLM response.
17
+ * Returns null if parsing fails.
18
+ */
19
+ export declare function parseReviewedProposals(response: string): ReviewedProposal[] | null;
20
+ /**
21
+ * Apply reviewed scores to the original proposals.
22
+ * Matches by title (case-insensitive). Unmatched proposals keep original scores.
23
+ * Returns a new array (does not mutate originals).
24
+ */
25
+ export declare function applyReviewToProposals(proposals: TicketProposal[], reviewed: ReviewedProposal[]): TicketProposal[];
26
+ //# sourceMappingURL=proposal-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal-review.d.ts","sourceRoot":"","sources":["../../src/lib/proposal-review.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,CAoD7E;AAMD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE,GAAG,IAAI,CA4BlF;AAMD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,cAAc,EAAE,EAC3B,QAAQ,EAAE,gBAAgB,EAAE,GAC3B,cAAc,EAAE,CAgBlB"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Adversarial proposal review — second-pass critical evaluation of scout proposals.
3
+ *
4
+ * Builds a review prompt, sends it through the execution backend (Claude CLI / Codex),
5
+ * parses revised confidence/impact scores, and applies them to proposals.
6
+ */
7
+ // ---------------------------------------------------------------------------
8
+ // Review prompt builder
9
+ // ---------------------------------------------------------------------------
10
+ export function buildProposalReviewPrompt(proposals) {
11
+ const parts = [
12
+ '# Adversarial Proposal Review',
13
+ '',
14
+ 'You previously generated the proposals below. Now review them critically as a skeptical senior engineer.',
15
+ 'For each proposal, evaluate:',
16
+ '',
17
+ '1. **Is the confidence inflated?** Would you bet your reputation on this score?',
18
+ '2. **Will the verification commands actually validate the change?** Or are they too generic (e.g. just `npm test`)?',
19
+ '3. **Missing edge cases?** What could break that you didn\'t consider?',
20
+ '4. **Feasibility:** Can this actually be implemented within the file set listed, or does it require changes elsewhere?',
21
+ '',
22
+ '## Proposals to Review',
23
+ '',
24
+ ];
25
+ for (let i = 0; i < proposals.length; i++) {
26
+ const p = proposals[i];
27
+ parts.push(`### ${i + 1}. ${p.title}`, `- **Category:** ${p.category}`, `- **Confidence:** ${p.confidence}`, `- **Impact:** ${p.impact_score ?? 5}/10`, `- **Files:** ${p.files.join(', ') || '(none listed)'}`, `- **Verification:** ${p.verification_commands.join(', ') || '(none)'}`, `- **Description:** ${p.description}`, '');
28
+ }
29
+ parts.push('## Output', '', 'Return ONLY a `<reviewed-proposals>` XML block containing a JSON array.', 'Each element must have: `title` (string, matching original), `confidence` (number 0-100),', '`impact_score` (number 1-10), and optionally `review_note` (string).', 'If a proposal is fundamentally flawed, set its confidence to 0.', '', 'Example:', '```', '<reviewed-proposals>', '[', ' { "title": "Add missing null check", "confidence": 75, "impact_score": 6, "review_note": "Solid but verify edge case X" },', ' { "title": "Refactor auth module", "confidence": 0, "impact_score": 2, "review_note": "Requires changes outside allowed_paths" }', ']', '</reviewed-proposals>', '```', '', 'Output the <reviewed-proposals> block now. Nothing else.');
30
+ return parts.join('\n');
31
+ }
32
+ /**
33
+ * Parse the <reviewed-proposals> XML block from the LLM response.
34
+ * Returns null if parsing fails.
35
+ */
36
+ export function parseReviewedProposals(response) {
37
+ // Extract content between <reviewed-proposals> tags
38
+ const match = response.match(/<reviewed-proposals>\s*([\s\S]*?)\s*<\/reviewed-proposals>/);
39
+ if (!match)
40
+ return null;
41
+ let jsonStr = match[1].trim();
42
+ // Strip markdown code fences if present
43
+ jsonStr = jsonStr.replace(/^```(?:json)?\s*/, '').replace(/\s*```$/, '');
44
+ try {
45
+ const parsed = JSON.parse(jsonStr);
46
+ if (!Array.isArray(parsed))
47
+ return null;
48
+ const results = [];
49
+ for (const item of parsed) {
50
+ if (typeof item.title !== 'string')
51
+ continue;
52
+ results.push({
53
+ title: item.title,
54
+ confidence: typeof item.confidence === 'number' ? item.confidence : 50,
55
+ impact_score: typeof item.impact_score === 'number' ? item.impact_score : 5,
56
+ review_note: typeof item.review_note === 'string' ? item.review_note : undefined,
57
+ });
58
+ }
59
+ return results.length > 0 ? results : null;
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // Apply review results to proposals
67
+ // ---------------------------------------------------------------------------
68
+ /**
69
+ * Apply reviewed scores to the original proposals.
70
+ * Matches by title (case-insensitive). Unmatched proposals keep original scores.
71
+ * Returns a new array (does not mutate originals).
72
+ */
73
+ export function applyReviewToProposals(proposals, reviewed) {
74
+ const reviewMap = new Map();
75
+ for (const r of reviewed) {
76
+ reviewMap.set(r.title.toLowerCase(), r);
77
+ }
78
+ return proposals.map(p => {
79
+ const review = reviewMap.get(p.title.toLowerCase());
80
+ if (!review)
81
+ return p;
82
+ return {
83
+ ...p,
84
+ confidence: review.confidence,
85
+ impact_score: review.impact_score,
86
+ };
87
+ });
88
+ }
89
+ //# sourceMappingURL=proposal-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal-review.js","sourceRoot":"","sources":["../../src/lib/proposal-review.ts"],"names":[],"mappings":"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"}