soloforge 1.2.2 → 1.2.3

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/README.md +78 -18
  2. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  3. package/dist/adapters/claude_code/tools.js +319 -5
  4. package/dist/adapters/claude_code/tools.js.map +1 -1
  5. package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
  6. package/dist/adapters/shared/workflow_template.js +25 -0
  7. package/dist/adapters/shared/workflow_template.js.map +1 -1
  8. package/dist/bin/soloforge.js +169 -13
  9. package/dist/bin/soloforge.js.map +1 -1
  10. package/dist/engine/audit_pool.d.ts +36 -0
  11. package/dist/engine/audit_pool.d.ts.map +1 -0
  12. package/dist/engine/audit_pool.js +83 -0
  13. package/dist/engine/audit_pool.js.map +1 -0
  14. package/dist/engine/audit_sampler.d.ts +15 -0
  15. package/dist/engine/audit_sampler.d.ts.map +1 -0
  16. package/dist/engine/audit_sampler.js +26 -0
  17. package/dist/engine/audit_sampler.js.map +1 -0
  18. package/dist/engine/capability_action_advisor.d.ts +24 -0
  19. package/dist/engine/capability_action_advisor.d.ts.map +1 -0
  20. package/dist/engine/capability_action_advisor.js +147 -0
  21. package/dist/engine/capability_action_advisor.js.map +1 -0
  22. package/dist/engine/capability_registry.d.ts +23 -1
  23. package/dist/engine/capability_registry.d.ts.map +1 -1
  24. package/dist/engine/capability_registry.js +511 -19
  25. package/dist/engine/capability_registry.js.map +1 -1
  26. package/dist/engine/capability_state_store.d.ts +50 -0
  27. package/dist/engine/capability_state_store.d.ts.map +1 -0
  28. package/dist/engine/capability_state_store.js +123 -0
  29. package/dist/engine/capability_state_store.js.map +1 -0
  30. package/dist/engine/cognitive_anchor.d.ts +59 -0
  31. package/dist/engine/cognitive_anchor.d.ts.map +1 -0
  32. package/dist/engine/cognitive_anchor.js +68 -0
  33. package/dist/engine/cognitive_anchor.js.map +1 -0
  34. package/dist/engine/conflict_gate.d.ts +36 -0
  35. package/dist/engine/conflict_gate.d.ts.map +1 -0
  36. package/dist/engine/conflict_gate.js +73 -0
  37. package/dist/engine/conflict_gate.js.map +1 -0
  38. package/dist/engine/decision_contract.d.ts +29 -0
  39. package/dist/engine/decision_contract.d.ts.map +1 -0
  40. package/dist/engine/decision_contract.js +41 -0
  41. package/dist/engine/decision_contract.js.map +1 -0
  42. package/dist/engine/delivery.d.ts.map +1 -1
  43. package/dist/engine/delivery.js +83 -0
  44. package/dist/engine/delivery.js.map +1 -1
  45. package/dist/engine/developer_sovereignty.d.ts +62 -0
  46. package/dist/engine/developer_sovereignty.d.ts.map +1 -0
  47. package/dist/engine/developer_sovereignty.js +134 -0
  48. package/dist/engine/developer_sovereignty.js.map +1 -0
  49. package/dist/engine/diff_ownership.d.ts +74 -0
  50. package/dist/engine/diff_ownership.d.ts.map +1 -0
  51. package/dist/engine/diff_ownership.js +143 -0
  52. package/dist/engine/diff_ownership.js.map +1 -0
  53. package/dist/engine/diff_ownership_store.d.ts +76 -0
  54. package/dist/engine/diff_ownership_store.d.ts.map +1 -0
  55. package/dist/engine/diff_ownership_store.js +264 -0
  56. package/dist/engine/diff_ownership_store.js.map +1 -0
  57. package/dist/engine/escape_report.d.ts +45 -0
  58. package/dist/engine/escape_report.d.ts.map +1 -0
  59. package/dist/engine/escape_report.js +97 -0
  60. package/dist/engine/escape_report.js.map +1 -0
  61. package/dist/engine/exploration.d.ts +54 -0
  62. package/dist/engine/exploration.d.ts.map +1 -1
  63. package/dist/engine/exploration.js +138 -0
  64. package/dist/engine/exploration.js.map +1 -1
  65. package/dist/engine/governance_report.d.ts +36 -0
  66. package/dist/engine/governance_report.d.ts.map +1 -0
  67. package/dist/engine/governance_report.js +79 -0
  68. package/dist/engine/governance_report.js.map +1 -0
  69. package/dist/engine/java_quality_guard.d.ts +52 -0
  70. package/dist/engine/java_quality_guard.d.ts.map +1 -0
  71. package/dist/engine/java_quality_guard.js +237 -0
  72. package/dist/engine/java_quality_guard.js.map +1 -0
  73. package/dist/engine/job_manager.d.ts +76 -0
  74. package/dist/engine/job_manager.d.ts.map +1 -0
  75. package/dist/engine/job_manager.js +225 -0
  76. package/dist/engine/job_manager.js.map +1 -0
  77. package/dist/engine/knowledge_sovereignty.d.ts +61 -0
  78. package/dist/engine/knowledge_sovereignty.d.ts.map +1 -0
  79. package/dist/engine/knowledge_sovereignty.js +190 -0
  80. package/dist/engine/knowledge_sovereignty.js.map +1 -0
  81. package/dist/engine/mutation_audit.d.ts +43 -0
  82. package/dist/engine/mutation_audit.d.ts.map +1 -0
  83. package/dist/engine/mutation_audit.js +118 -0
  84. package/dist/engine/mutation_audit.js.map +1 -0
  85. package/dist/engine/policy_drift_detector.d.ts +46 -0
  86. package/dist/engine/policy_drift_detector.d.ts.map +1 -0
  87. package/dist/engine/policy_drift_detector.js +181 -0
  88. package/dist/engine/policy_drift_detector.js.map +1 -0
  89. package/dist/engine/regression_matrix.d.ts +102 -0
  90. package/dist/engine/regression_matrix.d.ts.map +1 -0
  91. package/dist/engine/regression_matrix.js +380 -0
  92. package/dist/engine/regression_matrix.js.map +1 -0
  93. package/dist/engine/risk_sampler.d.ts +37 -0
  94. package/dist/engine/risk_sampler.d.ts.map +1 -0
  95. package/dist/engine/risk_sampler.js +69 -0
  96. package/dist/engine/risk_sampler.js.map +1 -0
  97. package/dist/engine/runtime_safety.d.ts +80 -0
  98. package/dist/engine/runtime_safety.d.ts.map +1 -0
  99. package/dist/engine/runtime_safety.js +195 -0
  100. package/dist/engine/runtime_safety.js.map +1 -0
  101. package/dist/engine/scope_lease.d.ts +45 -0
  102. package/dist/engine/scope_lease.d.ts.map +1 -0
  103. package/dist/engine/scope_lease.js +122 -0
  104. package/dist/engine/scope_lease.js.map +1 -0
  105. package/dist/engine/semantic_evidence.d.ts +23 -0
  106. package/dist/engine/semantic_evidence.d.ts.map +1 -0
  107. package/dist/engine/semantic_evidence.js +81 -0
  108. package/dist/engine/semantic_evidence.js.map +1 -0
  109. package/dist/engine/task_context.d.ts +16 -0
  110. package/dist/engine/task_context.d.ts.map +1 -1
  111. package/dist/engine/task_context.js +58 -0
  112. package/dist/engine/task_context.js.map +1 -1
  113. package/dist/engine/verifier.d.ts.map +1 -1
  114. package/dist/engine/verifier.js +22 -1
  115. package/dist/engine/verifier.js.map +1 -1
  116. package/dist/engine/workspace_resumer.d.ts +43 -0
  117. package/dist/engine/workspace_resumer.d.ts.map +1 -1
  118. package/dist/engine/workspace_resumer.js +119 -4
  119. package/dist/engine/workspace_resumer.js.map +1 -1
  120. package/dist/engine/zero_config_init.d.ts +87 -0
  121. package/dist/engine/zero_config_init.d.ts.map +1 -0
  122. package/dist/engine/zero_config_init.js +427 -0
  123. package/dist/engine/zero_config_init.js.map +1 -0
  124. package/dist/knowledge/index_manager.d.ts +19 -0
  125. package/dist/knowledge/index_manager.d.ts.map +1 -1
  126. package/dist/knowledge/index_manager.js +31 -0
  127. package/dist/knowledge/index_manager.js.map +1 -1
  128. package/dist/knowledge/writer.d.ts.map +1 -1
  129. package/dist/knowledge/writer.js +1 -0
  130. package/dist/knowledge/writer.js.map +1 -1
  131. package/dist/types.d.ts +61 -1
  132. package/dist/types.d.ts.map +1 -1
  133. package/package.json +2 -2
  134. package/templates/knowledge/patterns/core/Diff/345/275/222/345/261/236/350/277/275/350/270/252.md +47 -0
  135. package/templates/knowledge/patterns/core/Java/350/264/250/351/207/217/351/227/250/347/246/201.md +46 -0
  136. package/templates/knowledge/patterns/core/LLM/351/242/204/347/256/227/347/275/221/345/205/263.md +46 -0
  137. package/templates/knowledge/patterns/core//344/273/273/345/212/241/344/270/212/344/270/213/346/226/207/347/224/237/345/221/275/345/221/250/346/234/237.md +47 -0
  138. package/templates/knowledge/patterns/core//344/273/273/345/212/241/347/256/241/347/220/206/345/231/250.md +47 -0
  139. package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/344/270/216/345/257/206/351/222/245/346/213/246/346/210/252.md +46 -0
  140. package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/347/247/237/347/272/246.md +47 -0
  141. package/templates/knowledge/patterns/core//345/206/262/347/252/201/351/227/250/347/246/201.md +47 -0
  142. package/templates/knowledge/patterns/core//345/206/263/347/255/226/347/275/221/345/205/263.md +30 -11
  143. package/templates/knowledge/patterns/core//345/217/230/345/274/202/345/256/241/350/256/241.md +20 -0
  144. package/templates/knowledge/patterns/core//345/233/236/345/275/222/347/237/251/351/230/265.md +46 -0
  145. package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/344/272/222/346/226/245/351/224/201.md +44 -0
  146. package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/345/224/244/351/206/222.md +46 -0
  147. package/templates/knowledge/patterns/core//345/271/266/345/217/221/351/224/201.md +29 -16
  148. package/templates/knowledge/patterns/core//345/274/200/345/217/221/350/200/205/345/256/252/346/263/225.md +20 -0
  149. package/templates/knowledge/patterns/core//346/225/217/346/204/237/344/277/241/346/201/257/346/211/253/346/217/217.md +45 -0
  150. package/templates/knowledge/patterns/core//346/262/273/347/220/206/350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +48 -0
  151. package/templates/knowledge/patterns/core//346/265/201/345/274/217/345/277/203/350/267/263.md +20 -0
  152. package/templates/knowledge/patterns/core//347/237/245/350/257/206/344/270/273/346/235/203.md +20 -0
  153. package/templates/knowledge/patterns/core//350/257/255/344/271/211/350/257/201/346/215/256.md +47 -0
  154. package/templates/knowledge/patterns/core//350/277/220/350/241/214/345/256/211/345/205/250/345/214/205.md +50 -0
  155. package/templates/knowledge/patterns/core//351/233/266/351/205/215/347/275/256/345/210/235/345/247/213/345/214/226.md +47 -0
  156. package/templates/knowledge/patterns/core//351/252/214/350/257/201/345/221/275/344/273/244/347/224/237/346/210/220.md +46 -0
@@ -0,0 +1,380 @@
1
+ /**
2
+ * 回归矩阵 + 复杂度预算 — fixture 项目回归测试 + capability 代码量预算。
3
+ *
4
+ * 职责:
5
+ * - fixture 项目模板: Spring Boot, React, Go 的标准结构
6
+ * - 回归矩阵: 对 fixture 验证 classify/expand/verify 兼容性
7
+ * - 复杂度预算: 每个能力模块的代码行数预算,超出 advisory 告警
8
+ */
9
+ import fs from "node:fs";
10
+ import path from "node:path";
11
+ import os from "node:os";
12
+ import { detectFingerprint, generateConfigDraft } from "./zero_config_init.js";
13
+ export const FIXTURE_SPRING_BOOT = {
14
+ name: "spring-boot-demo",
15
+ tech_stack: "spring-boot + react",
16
+ files: {
17
+ "pom.xml": '<project><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId></parent></project>',
18
+ "src/main/java/com/example/DemoApplication.java": "package com.example;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class DemoApplication {\n public static void main(String[] args) {\n SpringApplication.run(DemoApplication.class, args);\n }\n}",
19
+ "src/main/java/com/example/controller/UserController.java": "package com.example.controller;\nimport org.springframework.web.bind.annotation.*;\nimport java.util.List;\n\n@RestController\n@RequestMapping(\"/api/users\")\npublic class UserController {\n @GetMapping\n public List<String> listUsers() {\n return List.of(\"alice\", \"bob\");\n }\n}",
20
+ "package.json": '{"name": "frontend", "dependencies": {"react": "^18.2.0"}, "devDependencies": {"vitest": "^2.0.0"}}',
21
+ "web/src/App.tsx": "import React from 'react';\nexport default function App() {\n return <div>Hello</div>;\n}",
22
+ "tsconfig.json": '{"compilerOptions": {"target": "ES2022"}}',
23
+ },
24
+ };
25
+ export const FIXTURE_REACT = {
26
+ name: "react-demo",
27
+ tech_stack: "react + vitest",
28
+ files: {
29
+ "package.json": '{"name": "react-demo", "dependencies": {"react": "^18.2.0", "react-dom": "^18.2.0"}, "devDependencies": {"vitest": "^2.0.0", "vite": "^5.0.0", "typescript": "^5.0.0"}}',
30
+ "src/App.tsx": "import React from 'react';\nexport default function App() {\n return <h1>Hello React</h1>;\n}",
31
+ "src/App.test.ts": "import { describe, it, expect } from 'vitest';\ndescribe('App', () => {\n it('renders', () => {\n expect(true).toBe(true);\n });\n});",
32
+ "vite.config.ts": "import { defineConfig } from 'vite';\nexport default defineConfig({});",
33
+ "tsconfig.json": '{"compilerOptions": {"target": "ES2022", "jsx": "react-jsx"}}',
34
+ },
35
+ };
36
+ export const FIXTURE_GO = {
37
+ name: "go-demo",
38
+ tech_stack: "go",
39
+ files: {
40
+ "go.mod": "module github.com/example/demo\ngo 1.22\n",
41
+ "cmd/main.go": "package main\n\nimport \"fmt\"\n\nfunc main() {\n fmt.Println(\"hello\")\n}",
42
+ "internal/service/user.go": "package service\n\ntype UserService struct{}\n\nfunc (s *UserService) ListUsers() []string {\n return []string{\"alice\", \"bob\"}\n}",
43
+ },
44
+ };
45
+ export const FIXTURE_NODE_TS = {
46
+ name: "node-ts-toolkit",
47
+ tech_stack: "node",
48
+ files: {
49
+ "package.json": '{"name": "my-toolkit", "type": "module", "main": "dist/index.js", "devDependencies": {"typescript": "^5.0.0", "vitest": "^2.0.0"}}',
50
+ "tsconfig.json": '{"compilerOptions": {"target": "ES2022", "module": "ES2022", "outDir": "dist", "rootDir": "src"}}',
51
+ "src/index.ts": "export function add(a: number, b: number): number { return a + b; }\nexport function greet(name: string): string { return `Hello, ${name}!`; }",
52
+ "src/index.test.ts": "import { describe, it, expect } from 'vitest';\nimport { add, greet } from './index.js';\ndescribe('toolkit', () => {\n it('adds', () => { expect(add(1, 2)).toBe(3); });\n it('greets', () => { expect(greet('world')).toBe('Hello, world!'); });\n});",
53
+ },
54
+ };
55
+ export const FIXTURE_MONOREPO = {
56
+ name: "monorepo-demo",
57
+ tech_stack: "node",
58
+ files: {
59
+ "package.json": '{"name": "monorepo-root", "private": true, "workspaces": ["packages/*"]}',
60
+ "packages/backend/package.json": '{"name": "@repo/backend", "dependencies": {"express": "^4.18.0"}, "devDependencies": {"typescript": "^5.0.0"}}',
61
+ "packages/backend/tsconfig.json": '{"compilerOptions": {"target": "ES2022", "module": "commonjs", "outDir": "dist"}}',
62
+ "packages/backend/src/server.ts": "import express from 'express';\nconst app = express();\napp.get('/api/health', (_req, res) => res.json({ ok: true }));\nexport { app };",
63
+ "packages/frontend/package.json": '{"name": "@repo/frontend", "dependencies": {"react": "^18.2.0"}, "devDependencies": {"vitest": "^2.0.0", "vite": "^5.0.0"}}',
64
+ "packages/frontend/src/App.tsx": "import React from 'react';\nexport default function App() {\n return <h1>Monorepo</h1>;\n}",
65
+ "packages/frontend/vite.config.ts": "import { defineConfig } from 'vite';\nexport default defineConfig({});",
66
+ },
67
+ };
68
+ export const FIXTURE_DOCS = {
69
+ name: "docs-only",
70
+ tech_stack: "docs",
71
+ files: {
72
+ "README.md": "# My Project\n\nA documentation-only project with no code.\n",
73
+ "docs/guide.md": "# Getting Started\n\nFollow these steps to get started.\n",
74
+ "docs/api-reference.md": "# API Reference\n\n## Endpoints\n\n- `GET /health`\n- `GET /status`\n",
75
+ },
76
+ };
77
+ /**
78
+ * 对 fixture 项目运行回归检查矩阵。
79
+ * 纯确定性检查,不依赖 LLM。
80
+ */
81
+ export function runRegressionMatrix(fixture, fingerprintFn) {
82
+ const checks = [];
83
+ const fileNames = Object.keys(fixture.files);
84
+ // 1. Fingerprint detection
85
+ const fp = fingerprintFn(fixture.files);
86
+ const expectsBackend = fixture.tech_stack.includes("spring-boot") || fixture.tech_stack.includes("go");
87
+ const expectsFrontend = fixture.tech_stack.includes("react") || fixture.tech_stack.includes("vue");
88
+ checks.push({
89
+ fixture: fixture.name,
90
+ check: "backend_detection",
91
+ passed: expectsBackend ? fp.backend !== null : true,
92
+ detail: fp.backend ? `detected: ${fp.backend.framework}` : (expectsBackend ? "expected but not detected" : "not expected"),
93
+ });
94
+ checks.push({
95
+ fixture: fixture.name,
96
+ check: "frontend_detection",
97
+ passed: expectsFrontend ? fp.frontend !== null : true,
98
+ detail: fp.frontend ? `detected: ${fp.frontend.framework}` : (expectsFrontend ? "expected but not detected" : "not expected"),
99
+ });
100
+ // 2. Test framework detection
101
+ const expectsTestFramework = fixture.tech_stack.includes("vitest") || fixture.tech_stack.includes("jest");
102
+ checks.push({
103
+ fixture: fixture.name,
104
+ check: "test_framework_detection",
105
+ passed: expectsTestFramework ? fp.test_frameworks.length > 0 : true,
106
+ detail: fp.test_frameworks.length > 0 ? fp.test_frameworks.join(", ") : "none detected (not expected)",
107
+ });
108
+ // 3. File structure validation
109
+ const hasSource = fileNames.some((f) => f.includes("src") || f.includes("cmd") || f.includes("internal"));
110
+ checks.push({
111
+ fixture: fixture.name,
112
+ check: "source_structure",
113
+ passed: hasSource,
114
+ detail: hasSource ? "source files found" : "no source directory",
115
+ });
116
+ // 4. Config file presence
117
+ const hasConfig = fileNames.some((f) => f.endsWith(".json") || f.endsWith(".xml") || f.endsWith(".mod") || f.endsWith(".yaml"));
118
+ checks.push({
119
+ fixture: fixture.name,
120
+ check: "config_files",
121
+ passed: hasConfig,
122
+ detail: hasConfig ? "config files found" : "no config files",
123
+ });
124
+ const allPassed = checks.every((c) => c.passed);
125
+ return {
126
+ fixture: fixture.name,
127
+ checks,
128
+ passed: allPassed,
129
+ summary: allPassed
130
+ ? `${fixture.name}: all ${checks.length} checks passed`
131
+ : `${fixture.name}: ${checks.filter((c) => !c.passed).length}/${checks.length} checks failed`,
132
+ };
133
+ }
134
+ /**
135
+ * Write fixture files to a temp directory and run real detectFingerprint.
136
+ * Cleanup is automatic via temp dir removal.
137
+ */
138
+ export async function runRealFingerprintRegression(fixtures = [FIXTURE_SPRING_BOOT, FIXTURE_REACT, FIXTURE_GO, FIXTURE_NODE_TS, FIXTURE_MONOREPO, FIXTURE_DOCS]) {
139
+ const checks = [];
140
+ for (const fixture of fixtures) {
141
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), `sf-regression-${fixture.name}-`));
142
+ try {
143
+ // Write fixture files to temp dir
144
+ for (const [relPath, content] of Object.entries(fixture.files)) {
145
+ const fullPath = path.join(tmpDir, relPath);
146
+ fs.mkdirSync(path.dirname(fullPath), { recursive: true });
147
+ fs.writeFileSync(fullPath, content, "utf-8");
148
+ }
149
+ const fp = await detectFingerprint(tmpDir);
150
+ const expectsBackend = fixture.tech_stack.includes("spring-boot") || fixture.tech_stack.includes("go");
151
+ const expectedBackend = expectsBackend
152
+ ? (fixture.tech_stack.includes("spring-boot") ? "spring-boot" : "stdlib")
153
+ : null;
154
+ const expectsFrontend = fixture.tech_stack.includes("react") || fixture.tech_stack.includes("vue");
155
+ const expectedFrontend = expectsFrontend
156
+ ? (fixture.tech_stack.includes("react") ? "react" : "vue")
157
+ : null;
158
+ const backendMatch = expectedBackend
159
+ ? fp.backend?.framework === expectedBackend
160
+ : fp.backend === null;
161
+ const frontendMatch = expectedFrontend
162
+ ? fp.frontend?.framework === expectedFrontend
163
+ : true;
164
+ const passed = backendMatch && frontendMatch;
165
+ checks.push({
166
+ fixture: fixture.name,
167
+ expected_backend: expectedBackend,
168
+ detected_backend: fp.backend?.framework ?? null,
169
+ expected_frontend: expectedFrontend,
170
+ detected_frontend: fp.frontend?.framework ?? null,
171
+ backend_match: backendMatch,
172
+ frontend_match: frontendMatch,
173
+ passed,
174
+ advisory: passed
175
+ ? `${fixture.name}: fingerprint match`
176
+ : `${fixture.name}: mismatch — expected backend=${expectedBackend}, got ${fp.backend?.framework}; expected frontend=${expectedFrontend}, got ${fp.frontend?.framework}`,
177
+ });
178
+ }
179
+ finally {
180
+ // Cleanup temp dir
181
+ fs.rmSync(tmpDir, { recursive: true, force: true });
182
+ }
183
+ }
184
+ const allPassed = checks.every((c) => c.passed);
185
+ return {
186
+ checks,
187
+ all_passed: allPassed,
188
+ summary: allPassed
189
+ ? `all ${checks.length} fixture(s) fingerprint matched`
190
+ : `${checks.filter((c) => !c.passed).length}/${checks.length} fixture(s) fingerprint mismatch`,
191
+ };
192
+ }
193
+ /**
194
+ * Run minimal classify → expand → verify → learn (evolve) → governance report
195
+ * on a fixture written to a temp directory.
196
+ */
197
+ export async function runE2EPipeline(fixture) {
198
+ const steps = [];
199
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), `sf-e2e-${fixture.name}-`));
200
+ try {
201
+ // Write fixture files
202
+ for (const [relPath, content] of Object.entries(fixture.files)) {
203
+ const fullPath = path.join(tmpDir, relPath);
204
+ fs.mkdirSync(path.dirname(fullPath), { recursive: true });
205
+ fs.writeFileSync(fullPath, content, "utf-8");
206
+ }
207
+ // Step 1: detectFingerprint
208
+ const fp = await detectFingerprint(tmpDir);
209
+ steps.push({
210
+ step: "fingerprint",
211
+ passed: true,
212
+ detail: `backend=${fp.backend?.framework ?? "none"}, frontend=${fp.frontend?.framework ?? "none"}`,
213
+ });
214
+ // Step 2: classify (deterministic, no IO)
215
+ const { classify } = await import("./classifier.js");
216
+ const classifyResult = classify({ intent: `add feature to ${fixture.name}` });
217
+ steps.push({
218
+ step: "classify",
219
+ passed: classifyResult.task_type != null && classifyResult.strategy != null,
220
+ detail: `type=${classifyResult.task_type}, strategy=${classifyResult.strategy}`,
221
+ });
222
+ // Step 3: expand (uses KnowledgeIndexManager — provide minimal in-memory)
223
+ const { expand } = await import("./intent_expander.js");
224
+ const configDraft = generateConfigDraft(fp);
225
+ const projectConfig = {
226
+ name: configDraft.name,
227
+ tech_stack: {
228
+ backend: configDraft.tech_stack.backend,
229
+ frontend: configDraft.tech_stack.frontend,
230
+ },
231
+ product_profile: configDraft.product_profile,
232
+ repos: [],
233
+ build_commands: configDraft.build_commands,
234
+ scope: configDraft.scope,
235
+ _projectPath: tmpDir,
236
+ };
237
+ const minimalKnowledgeIndex = {
238
+ query: () => [],
239
+ markUsed: () => { },
240
+ getAllEntries: () => ({ global: [], project: [] }),
241
+ getEntry: () => undefined,
242
+ addEntryInMemory: () => { },
243
+ reload: () => { },
244
+ checkHealth: () => ({ healthy: true, errors: [] }),
245
+ close: () => { },
246
+ };
247
+ let expandOk = false;
248
+ try {
249
+ const expandResult = await expand({
250
+ intent: `add feature to ${fixture.name}`,
251
+ classification: classifyResult,
252
+ projectPath: tmpDir,
253
+ config: projectConfig,
254
+ knowledgeIndex: minimalKnowledgeIndex,
255
+ });
256
+ expandOk = expandResult.prompt != null && expandResult.prompt.length > 0;
257
+ }
258
+ catch {
259
+ expandOk = false;
260
+ }
261
+ steps.push({
262
+ step: "expand",
263
+ passed: expandOk,
264
+ detail: expandOk ? "prompt generated" : "expand failed or returned empty",
265
+ });
266
+ // Step 4: generateVerifyCommands
267
+ const { generateVerifyCommands } = await import("./verifier.js");
268
+ const verifyResult = generateVerifyCommands(projectConfig, Object.keys(fixture.files), []);
269
+ steps.push({
270
+ step: "verify_commands",
271
+ passed: true,
272
+ detail: `build=${verifyResult.checks.build.length}, test=${verifyResult.checks.tests.length}`,
273
+ });
274
+ // Step 5: learn (evolve) — with minimal input
275
+ const { evolve } = await import("./evolver.js");
276
+ let learnOk = false;
277
+ try {
278
+ const learnResult = await evolve({
279
+ taskContext: {
280
+ task_id: "e2e-test",
281
+ created_at: new Date().toISOString(),
282
+ intent: `add feature to ${fixture.name}`,
283
+ product_profile: configDraft.product_profile,
284
+ status: "done",
285
+ },
286
+ result: "success",
287
+ verifyOutput: { build_passed: true, tests_passed: true },
288
+ }, tmpDir);
289
+ learnOk = learnResult.task_id === "e2e-test";
290
+ }
291
+ catch {
292
+ learnOk = false;
293
+ }
294
+ steps.push({
295
+ step: "learn",
296
+ passed: learnOk,
297
+ detail: learnOk ? "evolve returned result" : "evolve failed",
298
+ });
299
+ // Step 6: governance report (with empty data — confirms function doesn't crash)
300
+ const { generateReport } = await import("./governance_report.js");
301
+ const emptyEscapeByType = {
302
+ rule_gap: 0, weak_test: 0, bad_evidence: 0, ai_escape: 0,
303
+ human_miss: 0, tool_bug: 0, false_positive: 0,
304
+ };
305
+ const emptyEscapeByAction = {
306
+ keep: 0, downgrade: 0, disable: 0, promote_blocked: 0,
307
+ };
308
+ const report = generateReport({ total: 0, by_risk: { low: 0, medium: 0, high: 0, critical: 0 } }, [], [], { total: 0, by_type: emptyEscapeByType, by_action: emptyEscapeByAction }, []);
309
+ steps.push({
310
+ step: "governance_report",
311
+ passed: report.generated_at != null && report.generated_at.length > 0,
312
+ detail: `report generated, total_tasks=${report.total_tasks}`,
313
+ });
314
+ const allPassed = steps.every((s) => s.passed);
315
+ return {
316
+ fixture: fixture.name,
317
+ steps,
318
+ passed: allPassed,
319
+ summary: allPassed
320
+ ? `${fixture.name}: all ${steps.length} e2e steps passed`
321
+ : `${fixture.name}: ${steps.filter((s) => !s.passed).length}/${steps.length} e2e steps failed`,
322
+ };
323
+ }
324
+ finally {
325
+ fs.rmSync(tmpDir, { recursive: true, force: true });
326
+ }
327
+ }
328
+ const CAPABILITY_BUDGETS = {
329
+ "task_context.ts": 600,
330
+ "diff_ownership_store.ts": 400,
331
+ "diff_ownership.ts": 300,
332
+ "scope_lease.ts": 150,
333
+ "conflict_gate.ts": 100,
334
+ "workspace_resumer.ts": 200,
335
+ "semantic_evidence.ts": 150,
336
+ "mutation_audit.ts": 200,
337
+ "knowledge_sovereignty.ts": 250,
338
+ "developer_sovereignty.ts": 150,
339
+ "job_manager.ts": 250,
340
+ "zero_config_init.ts": 350,
341
+ "java_quality_guard.ts": 300,
342
+ "runtime_safety.ts": 350,
343
+ "audit_pool.ts": 200,
344
+ "evolver.ts": 300,
345
+ "test_quality.ts": 400,
346
+ };
347
+ /**
348
+ * 检查能力模块的复杂度预算。
349
+ * @param fileLineCounts - 模块名到行数的映射
350
+ * @returns 复杂度预算报告
351
+ */
352
+ export function checkComplexityBudget(fileLineCounts) {
353
+ const modules = [];
354
+ for (const [module, budget] of Object.entries(CAPABILITY_BUDGETS)) {
355
+ const actual = fileLineCounts[module] ?? 0;
356
+ const exceeded = actual > budget;
357
+ modules.push({
358
+ module,
359
+ budget_lines: budget,
360
+ actual_lines: actual,
361
+ exceeded,
362
+ advisory: exceeded
363
+ ? `advisory: ${module} exceeded budget (${actual}/${budget} lines, +${actual - budget})`
364
+ : `${module}: ${actual}/${budget} lines`,
365
+ });
366
+ }
367
+ const totalBudget = modules.reduce((s, m) => s + m.budget_lines, 0);
368
+ const totalActual = modules.reduce((s, m) => s + m.actual_lines, 0);
369
+ const exceededCount = modules.filter((m) => m.exceeded).length;
370
+ return {
371
+ modules,
372
+ total_budget: totalBudget,
373
+ total_actual: totalActual,
374
+ exceeded_modules: exceededCount,
375
+ summary: exceededCount > 0
376
+ ? `advisory: ${exceededCount} module(s) exceeded complexity budget (total: ${totalActual}/${totalBudget} lines)`
377
+ : `all modules within budget (total: ${totalActual}/${totalBudget} lines)`,
378
+ };
379
+ }
380
+ //# sourceMappingURL=regression_matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regression_matrix.js","sourceRoot":"","sources":["../../src/engine/regression_matrix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 风险加权抽样决策 — 基于 audit pool 中的 AuditItem 决定是否抽检。
3
+ * P2-2 范围: 只输出抽样决策,不生成逃逸报告,不改能力状态。
4
+ *
5
+ * 抽样率:
6
+ * - low: 20% baseline
7
+ * - medium: 50%
8
+ * - high: 80%
9
+ * - critical: 100%
10
+ *
11
+ * 可复现: 同 seed + 同 task_id → 同决策。
12
+ */
13
+ import type { RiskLevel } from "./audit_pool.js";
14
+ export interface SamplingDecision {
15
+ item_task_id: string;
16
+ item_risk: RiskLevel;
17
+ should_sample: boolean;
18
+ seed: number;
19
+ threshold_pct: number;
20
+ hash_value: number;
21
+ risk_factors: RiskFactor[];
22
+ reason: string;
23
+ }
24
+ export interface RiskFactor {
25
+ factor: string;
26
+ detail: string;
27
+ impact: "increases" | "decreases" | "neutral";
28
+ }
29
+ export interface SampleableItem {
30
+ task_id: string;
31
+ risk: RiskLevel;
32
+ changed_files: string[];
33
+ capability_refs: string[];
34
+ }
35
+ export declare function shouldSample(item: SampleableItem, seed?: number): SamplingDecision;
36
+ export declare function getThreshold(risk: RiskLevel): number;
37
+ //# sourceMappingURL=risk_sampler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk_sampler.d.ts","sourceRoot":"","sources":["../../src/engine/risk_sampler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;CAC/C;AA8CD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE,MAAU,GACf,gBAAgB,CAyBlB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * 风险加权抽样决策 — 基于 audit pool 中的 AuditItem 决定是否抽检。
3
+ * P2-2 范围: 只输出抽样决策,不生成逃逸报告,不改能力状态。
4
+ *
5
+ * 抽样率:
6
+ * - low: 20% baseline
7
+ * - medium: 50%
8
+ * - high: 80%
9
+ * - critical: 100%
10
+ *
11
+ * 可复现: 同 seed + 同 task_id → 同决策。
12
+ */
13
+ import { createHash } from "node:crypto";
14
+ const RISK_THRESHOLDS = {
15
+ low: 20,
16
+ medium: 50,
17
+ high: 80,
18
+ critical: 100,
19
+ };
20
+ function computeHash(taskId, seed) {
21
+ const h = createHash("sha256").update(`${taskId}:${seed}`).digest();
22
+ return h.readUInt32BE(0) % 100;
23
+ }
24
+ function collectRiskFactors(risk, changedFileCount, hasCapabilityRefs) {
25
+ const factors = [];
26
+ factors.push({
27
+ factor: "risk_level",
28
+ detail: `task risk is ${risk}, threshold ${RISK_THRESHOLDS[risk]}%`,
29
+ impact: risk === "low" ? "decreases" : risk === "critical" ? "increases" : "neutral",
30
+ });
31
+ if (changedFileCount > 10) {
32
+ factors.push({
33
+ factor: "large_change_set",
34
+ detail: `${changedFileCount} files changed (>10)`,
35
+ impact: "increases",
36
+ });
37
+ }
38
+ if (hasCapabilityRefs) {
39
+ factors.push({
40
+ factor: "capability_coverage",
41
+ detail: "task touches registered capabilities",
42
+ impact: "increases",
43
+ });
44
+ }
45
+ return factors;
46
+ }
47
+ export function shouldSample(item, seed = 0) {
48
+ const threshold = RISK_THRESHOLDS[item.risk];
49
+ const hashValue = computeHash(item.task_id, seed);
50
+ const shouldSample = hashValue < threshold;
51
+ const riskFactors = collectRiskFactors(item.risk, item.changed_files.length, item.capability_refs.length > 0);
52
+ const reason = shouldSample
53
+ ? `sampled: hash ${hashValue} < threshold ${threshold} (risk=${item.risk})`
54
+ : `skipped: hash ${hashValue} >= threshold ${threshold} (risk=${item.risk})`;
55
+ return {
56
+ item_task_id: item.task_id,
57
+ item_risk: item.risk,
58
+ should_sample: shouldSample,
59
+ seed,
60
+ threshold_pct: threshold,
61
+ hash_value: hashValue,
62
+ risk_factors: riskFactors,
63
+ reason,
64
+ };
65
+ }
66
+ export function getThreshold(risk) {
67
+ return RISK_THRESHOLDS[risk];
68
+ }
69
+ //# sourceMappingURL=risk_sampler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk_sampler.js","sourceRoot":"","sources":["../../src/engine/risk_sampler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoBzC,MAAM,eAAe,GAA8B;IACjD,GAAG,EAAE,EAAE;IACP,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF,SAAS,WAAW,CAAC,MAAc,EAAE,IAAY;IAC/C,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IACpE,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAe,EACf,gBAAwB,EACxB,iBAA0B;IAE1B,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,OAAO,CAAC,IAAI,CAAC;QACX,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,gBAAgB,IAAI,eAAe,eAAe,CAAC,IAAI,CAAC,GAAG;QACnE,MAAM,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KACrF,CAAC,CAAC;IAEH,IAAI,gBAAgB,GAAG,EAAE,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC;YACX,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,GAAG,gBAAgB,sBAAsB;YACjD,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC;YACX,MAAM,EAAE,qBAAqB;YAC7B,MAAM,EAAE,sCAAsC;YAC9C,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AASD,MAAM,UAAU,YAAY,CAC1B,IAAoB,EACpB,OAAe,CAAC;IAEhB,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;IAE3C,MAAM,WAAW,GAAG,kBAAkB,CACpC,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,aAAa,CAAC,MAAM,EACzB,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAChC,CAAC;IAEF,MAAM,MAAM,GAAG,YAAY;QACzB,CAAC,CAAC,iBAAiB,SAAS,gBAAgB,SAAS,UAAU,IAAI,CAAC,IAAI,GAAG;QAC3E,CAAC,CAAC,iBAAiB,SAAS,iBAAiB,SAAS,UAAU,IAAI,CAAC,IAAI,GAAG,CAAC;IAE/E,OAAO;QACL,YAAY,EAAE,IAAI,CAAC,OAAO;QAC1B,SAAS,EAAE,IAAI,CAAC,IAAI;QACpB,aAAa,EAAE,YAAY;QAC3B,IAAI;QACJ,aAAa,EAAE,SAAS;QACxB,UAAU,EAAE,SAAS;QACrB,YAAY,EAAE,WAAW;QACzB,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAe;IAC1C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * 运行安全包 — 证据 hash chain、命令副作用分级、供应链治理、迁移回滚契约。
3
+ * advisory: 不 hard block(除 destructive 命令需人工确认)。
4
+ */
5
+ export interface EvidenceBlock {
6
+ step: string;
7
+ timestamp: string;
8
+ data_hash: string;
9
+ prev_hash: string | null;
10
+ chain_hash: string;
11
+ payload: string;
12
+ }
13
+ /**
14
+ * 构建证据链 — 每个步骤产出带 hash 的证据块,与前一个块链式连接。
15
+ */
16
+ export declare function buildEvidenceChain(steps: Array<{
17
+ step: string;
18
+ payload: string;
19
+ timestamp?: string;
20
+ }>): EvidenceBlock[];
21
+ /**
22
+ * 验证证据链完整性 — 检查每个块的 chain_hash 是否与重算结果一致。
23
+ */
24
+ export declare function verifyEvidenceChain(chain: EvidenceBlock[]): {
25
+ valid: boolean;
26
+ broken_at: number | null;
27
+ advisory: string;
28
+ };
29
+ export type CommandRisk = "read_only" | "mutating" | "destructive";
30
+ export interface ClassifiedCommand {
31
+ command: string;
32
+ risk: CommandRisk;
33
+ advisory: string;
34
+ requires_human_confirm: boolean;
35
+ }
36
+ /**
37
+ * 分类命令的副作用级别。
38
+ */
39
+ export declare function classifyCommand(command: string): ClassifiedCommand;
40
+ export interface MigrationContract {
41
+ migration_id: string;
42
+ description: string;
43
+ forward_command: string;
44
+ rollback_command: string;
45
+ risk: CommandRisk;
46
+ created_at: string;
47
+ }
48
+ export interface MigrationCheckResult {
49
+ migration_id: string;
50
+ has_rollback: boolean;
51
+ rollback_valid: boolean;
52
+ advisory: string;
53
+ }
54
+ /**
55
+ * 检查迁移契约 — 确保 schema 变更有回滚路径。
56
+ */
57
+ export declare function checkMigrationContract(migration: MigrationContract): MigrationCheckResult;
58
+ export interface DependencyCheck {
59
+ package_name: string;
60
+ version: string;
61
+ has_lockfile: boolean;
62
+ has_integrity_hash: boolean;
63
+ advisory: string;
64
+ }
65
+ export interface SupplyChainReport {
66
+ total_dependencies: number;
67
+ locked_dependencies: number;
68
+ unlocked_dependencies: number;
69
+ checks: DependencyCheck[];
70
+ advisory: string;
71
+ }
72
+ /**
73
+ * 检查供应链安全 — 验证依赖有 lockfile 和完整性 hash。
74
+ * 此为轻量级检查,不读取实际文件内容。
75
+ */
76
+ export declare function checkSupplyChain(rootDirFiles: string[], dependencies: Array<{
77
+ name: string;
78
+ version: string;
79
+ }>): SupplyChainReport;
80
+ //# sourceMappingURL=runtime_safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime_safety.d.ts","sourceRoot":"","sources":["../../src/engine/runtime_safety.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAClE,aAAa,EAAE,CAiCjB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG;IAC3D,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAmDA;AAID,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAuBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CA6BlE;AAID,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,iBAAiB,GAC3B,oBAAoB,CAsBtB;AAID,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAUD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EAAE,EACtB,YAAY,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACrD,iBAAiB,CA0BnB"}