@hongmaple0820/scale-engine 0.24.0 → 0.26.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 (155) hide show
  1. package/LICENSE +15 -15
  2. package/README.en.md +336 -304
  3. package/README.md +500 -475
  4. package/dist/adapters/AiderAdapter.js +52 -52
  5. package/dist/adapters/AntigravityAdapter.d.ts +4 -0
  6. package/dist/adapters/AntigravityAdapter.js +21 -0
  7. package/dist/adapters/AntigravityAdapter.js.map +1 -0
  8. package/dist/adapters/ClaudeCodeAdapter.d.ts +4 -1
  9. package/dist/adapters/ClaudeCodeAdapter.js +34 -34
  10. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
  11. package/dist/adapters/ClineAdapter.d.ts +4 -0
  12. package/dist/adapters/ClineAdapter.js +20 -0
  13. package/dist/adapters/ClineAdapter.js.map +1 -0
  14. package/dist/adapters/CodexAdapter.js +28 -28
  15. package/dist/adapters/CursorAdapter.js +26 -26
  16. package/dist/adapters/DeepSeekTuiAdapter.js +97 -97
  17. package/dist/adapters/DoubaoAdapter.js +33 -33
  18. package/dist/adapters/GeminiAdapter.js +26 -26
  19. package/dist/adapters/GenericProjectAgentAdapter.d.ts +29 -0
  20. package/dist/adapters/GenericProjectAgentAdapter.js +204 -0
  21. package/dist/adapters/GenericProjectAgentAdapter.js.map +1 -0
  22. package/dist/adapters/HermesAdapter.js +26 -26
  23. package/dist/adapters/JCodeAdapter.d.ts +4 -0
  24. package/dist/adapters/JCodeAdapter.js +19 -0
  25. package/dist/adapters/JCodeAdapter.js.map +1 -0
  26. package/dist/adapters/KiloCodeAdapter.d.ts +4 -0
  27. package/dist/adapters/KiloCodeAdapter.js +20 -0
  28. package/dist/adapters/KiloCodeAdapter.js.map +1 -0
  29. package/dist/adapters/KimiAdapter.js +32 -32
  30. package/dist/adapters/KiroAdapter.js +26 -26
  31. package/dist/adapters/OpenClawAdapter.js +26 -26
  32. package/dist/adapters/OpenCodeAdapter.js +26 -26
  33. package/dist/adapters/QCoderAdapter.js +26 -26
  34. package/dist/adapters/QoderAdapter.d.ts +4 -0
  35. package/dist/adapters/QoderAdapter.js +21 -0
  36. package/dist/adapters/QoderAdapter.js.map +1 -0
  37. package/dist/adapters/TraeAdapter.js +26 -26
  38. package/dist/adapters/VSCAdapter.js +26 -26
  39. package/dist/adapters/WindsurfAdapter.js +32 -32
  40. package/dist/adapters/WorkBuddyAdapter.js +26 -26
  41. package/dist/adapters/index.d.ts +5 -0
  42. package/dist/adapters/index.js +15 -0
  43. package/dist/adapters/index.js.map +1 -1
  44. package/dist/api/cli.js +226 -48
  45. package/dist/api/cli.js.map +1 -1
  46. package/dist/api/doctor.js +10 -3
  47. package/dist/api/doctor.js.map +1 -1
  48. package/dist/api/quickstart.js +7 -1
  49. package/dist/api/quickstart.js.map +1 -1
  50. package/dist/artifact/sqliteStore.js +89 -89
  51. package/dist/artifact/types.d.ts +1 -1
  52. package/dist/cli/phaseCommands.js +45 -45
  53. package/dist/context/AntiPatternRegistry.js +20 -20
  54. package/dist/context/ContextBuilder.js +155 -155
  55. package/dist/evolution/EvolutionEngine.js +31 -31
  56. package/dist/evolution/EvolutionEvaluator.d.ts +2 -0
  57. package/dist/evolution/EvolutionEvaluator.js +7 -1
  58. package/dist/evolution/EvolutionEvaluator.js.map +1 -1
  59. package/dist/fsm/FSMAgentBridge.js +11 -11
  60. package/dist/hooks/HookGeneratorEnhanced.js +218 -218
  61. package/dist/index.d.ts +1 -1
  62. package/dist/index.js +2 -2
  63. package/dist/index.js.map +1 -1
  64. package/dist/knowledge/SQLiteKnowledgeBase.js +28 -28
  65. package/dist/memory/MemoryBrain.d.ts +1 -0
  66. package/dist/memory/MemoryBrain.js +55 -52
  67. package/dist/memory/MemoryBrain.js.map +1 -1
  68. package/dist/memory/MemoryFabric.d.ts +13 -1
  69. package/dist/memory/MemoryFabric.js +35 -0
  70. package/dist/memory/MemoryFabric.js.map +1 -1
  71. package/dist/memory/MemoryProviders.d.ts +111 -0
  72. package/dist/memory/MemoryProviders.js +385 -0
  73. package/dist/memory/MemoryProviders.js.map +1 -0
  74. package/dist/memory/index.d.ts +1 -0
  75. package/dist/memory/index.js +1 -0
  76. package/dist/memory/index.js.map +1 -1
  77. package/dist/output/GovernanceDashboard.js +44 -44
  78. package/dist/output/HTMLArtifactLayer.js +31 -31
  79. package/dist/prompts/VibeTemplateGallery.js +121 -121
  80. package/dist/skills/SkillDiscovery.js +12 -1
  81. package/dist/skills/SkillDiscovery.js.map +1 -1
  82. package/dist/skills/SkillRadar.js +20 -0
  83. package/dist/skills/SkillRadar.js.map +1 -1
  84. package/dist/skills/SkillRepository.d.ts +9 -1
  85. package/dist/skills/SkillRepository.js +70 -0
  86. package/dist/skills/SkillRepository.js.map +1 -1
  87. package/dist/skills/routing/SkillPlanner.js +40 -40
  88. package/dist/workflow/EngineeringStandards.js +62 -62
  89. package/dist/workflow/GovernanceTemplatePacks.d.ts +1 -1
  90. package/dist/workflow/GovernanceTemplatePacks.js +1990 -162
  91. package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
  92. package/dist/workflow/GovernanceTemplates.d.ts +2 -0
  93. package/dist/workflow/GovernanceTemplates.js +1012 -1001
  94. package/dist/workflow/GovernanceTemplates.js.map +1 -1
  95. package/dist/workflow/ResourceGovernance.js +16 -16
  96. package/dist/workflow/TaskArtifactScaffolder.js +10 -10
  97. package/dist/workflow/UpgradeManager.d.ts +3 -2
  98. package/dist/workflow/UpgradeManager.js +134 -49
  99. package/dist/workflow/UpgradeManager.js.map +1 -1
  100. package/dist/workflow/WorkspaceTopology.js +18 -15
  101. package/dist/workflow/WorkspaceTopology.js.map +1 -1
  102. package/docs/CODE_INTELLIGENCE.md +138 -138
  103. package/docs/CONTEXT_BUDGET.md +81 -81
  104. package/docs/EXTERNAL_REFERENCES.md +63 -0
  105. package/docs/GITLAB_FLOW.md +125 -125
  106. package/docs/GOVERNANCE_DASHBOARD.md +64 -64
  107. package/docs/MEMORY_BRAIN.md +104 -104
  108. package/docs/MEMORY_FABRIC.md +134 -107
  109. package/docs/README.md +79 -68
  110. package/docs/RUNTIME_EVIDENCE.md +101 -101
  111. package/docs/SKILL-REPOSITORY.md +57 -0
  112. package/docs/SKILL_RADAR.md +122 -115
  113. package/docs/THIRD_PARTY_SKILLS.md +57 -0
  114. package/docs/WORKFLOW_EVAL.md +151 -151
  115. package/docs/guides/DEVELOPMENT_WORKFLOW.md +80 -0
  116. package/docs/guides/GETTING_STARTED.md +50 -0
  117. package/docs/start/README.md +78 -72
  118. package/docs/start/agent-governance-demo.md +107 -107
  119. package/docs/start/quickstart.md +137 -127
  120. package/docs/start/workflow-upgrade.md +32 -8
  121. package/docs/workflow/README.md +67 -0
  122. package/docs/workflow/node-library.md +52 -0
  123. package/docs/workflow/templates/api-contract.md +29 -0
  124. package/docs/workflow/templates/architecture-review.md +23 -0
  125. package/docs/workflow/templates/db-change-plan.md +20 -0
  126. package/docs/workflow/templates/docs-impact.md +17 -0
  127. package/docs/workflow/templates/e2e-plan.md +20 -0
  128. package/docs/workflow/templates/explore.md +16 -0
  129. package/docs/workflow/templates/github-actions-scale-preflight.yml +32 -0
  130. package/docs/workflow/templates/mini-prd.md +16 -0
  131. package/docs/workflow/templates/plan.md +37 -0
  132. package/docs/workflow/templates/pre-push-scale-preflight.sh +8 -0
  133. package/docs/workflow/templates/product-smoke.md +61 -0
  134. package/docs/workflow/templates/reality-check.md +28 -0
  135. package/docs/workflow/templates/resource-cleanup.md +17 -0
  136. package/docs/workflow/templates/resource-impact.md +25 -0
  137. package/docs/workflow/templates/review.md +12 -0
  138. package/docs/workflow/templates/runtime.md +23 -0
  139. package/docs/workflow/templates/security-review.md +26 -0
  140. package/docs/workflow/templates/skill-evidence.md +33 -0
  141. package/docs/workflow/templates/skill-plan.md +39 -0
  142. package/docs/workflow/templates/spec.md +17 -0
  143. package/docs/workflow/templates/standards-impact.md +28 -0
  144. package/docs/workflow/templates/summary.md +16 -0
  145. package/docs/workflow/templates/tasks.md +8 -0
  146. package/docs/workflow/templates/ui-spec.md +29 -0
  147. package/docs/workflow/templates/verification.md +20 -0
  148. package/docs/workflow/templates/visual-review.md +20 -0
  149. package/examples/demo-projects/agent-governance-demo/CONTEXT.md +14 -14
  150. package/examples/demo-projects/agent-governance-demo/README.md +48 -48
  151. package/examples/demo-projects/agent-governance-demo/docs/CONTEXT-MAP.md +14 -14
  152. package/examples/demo-projects/agent-governance-demo/package.json +22 -21
  153. package/examples/demo-projects/agent-governance-demo/src/oauth-state.ts +39 -39
  154. package/examples/demo-projects/agent-governance-demo/tests/oauth-state.test.ts +52 -52
  155. package/package.json +88 -75
@@ -0,0 +1,385 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
3
+ import { MemoryBrain } from './MemoryBrain.js';
4
+ export function defaultMemoryProvidersConfig() {
5
+ return {
6
+ version: '1.0',
7
+ routing: {
8
+ mode: 'auto',
9
+ defaultOrder: ['agentmemory', 'gbrain', 'scale-local'],
10
+ allowExternalWrite: false,
11
+ requireEvidence: true,
12
+ maxResultsPerProvider: 5,
13
+ },
14
+ providers: [
15
+ {
16
+ id: 'agentmemory',
17
+ kind: 'agentmemory',
18
+ enabled: false,
19
+ priority: 90,
20
+ endpoint: process.env.AGENTMEMORY_ENDPOINT,
21
+ statusPath: '/health',
22
+ searchPath: '/search',
23
+ apiKeyEnv: 'AGENTMEMORY_API_KEY',
24
+ capabilities: ['semantic-recall', 'session-memory', 'mcp'],
25
+ safetyLevel: 'review-required',
26
+ writeMode: 'disabled',
27
+ attribution: {
28
+ license: 'Apache-2.0',
29
+ sourceUrl: 'https://github.com/rohitg00/agentmemory',
30
+ notice: 'Optional external memory provider. Do not enable writes until retention, privacy, and delete boundaries are reviewed.',
31
+ },
32
+ },
33
+ {
34
+ id: 'gbrain',
35
+ kind: 'gbrain',
36
+ enabled: false,
37
+ priority: 80,
38
+ endpoint: process.env.GBRAIN_ENDPOINT,
39
+ statusPath: '/health',
40
+ searchPath: '/search',
41
+ apiKeyEnv: 'GBRAIN_API_KEY',
42
+ capabilities: ['semantic-recall', 'graph-recall', 'session-memory', 'mcp'],
43
+ safetyLevel: 'review-required',
44
+ writeMode: 'disabled',
45
+ attribution: {
46
+ license: 'MIT',
47
+ sourceUrl: 'https://github.com/garrytan/gbrain',
48
+ notice: 'Optional graph memory provider. Treat returned knowledge as recall evidence, not final truth.',
49
+ },
50
+ },
51
+ {
52
+ id: 'scale-local',
53
+ kind: 'scale-local',
54
+ enabled: true,
55
+ priority: 10,
56
+ capabilities: ['keyword-recall'],
57
+ safetyLevel: 'trusted-local',
58
+ writeMode: 'candidate-only',
59
+ },
60
+ ],
61
+ };
62
+ }
63
+ export function memoryProvidersConfigPath(projectDir = process.cwd(), scaleDir = '.scale') {
64
+ return join(resolveScaleRoot(projectDir, scaleDir), 'memory-providers.json');
65
+ }
66
+ export function writeMemoryProvidersConfig(options = {}) {
67
+ const projectDir = resolve(options.projectDir ?? process.cwd());
68
+ const path = memoryProvidersConfigPath(projectDir, options.scaleDir);
69
+ if (existsSync(path) && !options.force) {
70
+ return { path, written: false, config: loadMemoryProvidersConfig(projectDir, options.scaleDir).config };
71
+ }
72
+ mkdirSync(dirname(path), { recursive: true });
73
+ const config = defaultMemoryProvidersConfig();
74
+ writeFileSync(path, JSON.stringify(config, null, 2), 'utf-8');
75
+ return { path, written: true, config };
76
+ }
77
+ export function loadMemoryProvidersConfig(projectDir = process.cwd(), scaleDir = '.scale') {
78
+ const path = memoryProvidersConfigPath(projectDir, scaleDir);
79
+ if (!existsSync(path))
80
+ return { config: defaultMemoryProvidersConfig(), path, exists: false };
81
+ try {
82
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
83
+ const defaults = defaultMemoryProvidersConfig();
84
+ return {
85
+ path,
86
+ exists: true,
87
+ config: {
88
+ version: '1.0',
89
+ routing: {
90
+ ...defaults.routing,
91
+ ...(parsed.routing ?? {}),
92
+ defaultOrder: Array.isArray(parsed.routing?.defaultOrder) ? parsed.routing.defaultOrder.map(String) : defaults.routing.defaultOrder,
93
+ maxResultsPerProvider: positiveInt(parsed.routing?.maxResultsPerProvider, defaults.routing.maxResultsPerProvider),
94
+ },
95
+ providers: normalizeProviders(parsed.providers, defaults.providers),
96
+ },
97
+ };
98
+ }
99
+ catch {
100
+ return { config: defaultMemoryProvidersConfig(), path, exists: true };
101
+ }
102
+ }
103
+ export function inspectMemoryProviders(options = {}) {
104
+ const projectDir = resolve(options.projectDir ?? process.cwd());
105
+ const loaded = loadMemoryProvidersConfig(projectDir, options.scaleDir);
106
+ const statuses = loaded.config.providers
107
+ .map(provider => providerStatus(provider, loaded.config.routing))
108
+ .sort((a, b) => b.priority - a.priority || a.id.localeCompare(b.id));
109
+ return {
110
+ projectDir,
111
+ scaleDir: resolveScaleRoot(projectDir, options.scaleDir),
112
+ configPath: loaded.path,
113
+ configExists: loaded.exists,
114
+ routing: loaded.config.routing,
115
+ providers: statuses,
116
+ availableProviderCount: statuses.filter(status => status.available).length,
117
+ warnings: providerWarnings(statuses, loaded.config),
118
+ };
119
+ }
120
+ export async function recallMemoryProviders(options) {
121
+ const projectDir = resolve(options.projectDir ?? process.cwd());
122
+ const loaded = loadMemoryProvidersConfig(projectDir, options.scaleDir);
123
+ const statuses = inspectMemoryProviders({ projectDir, scaleDir: options.scaleDir }).providers;
124
+ const limit = Math.max(1, Math.floor(options.limit ?? loaded.config.routing.maxResultsPerProvider));
125
+ const providers = orderedProviders(loaded.config, options.provider);
126
+ const warnings = [];
127
+ const items = [];
128
+ const selectedProviders = [];
129
+ let fallbackUsed = false;
130
+ for (const provider of providers) {
131
+ const status = statuses.find(item => item.id === provider.id);
132
+ if (!status?.available) {
133
+ warnings.push(`${provider.id} skipped: ${status?.reason ?? 'not available'}`);
134
+ continue;
135
+ }
136
+ try {
137
+ const recalled = provider.kind === 'scale-local'
138
+ ? recallLocal(projectDir, options.scaleDir, provider, options, limit)
139
+ : await recallExternal(provider, options, limit);
140
+ if (recalled.length > 0) {
141
+ selectedProviders.push(provider.id);
142
+ items.push(...recalled);
143
+ }
144
+ if (provider.kind === 'scale-local' && providers.some(item => item.kind !== 'scale-local'))
145
+ fallbackUsed = true;
146
+ }
147
+ catch (error) {
148
+ warnings.push(`${provider.id} recall failed: ${error.message}`);
149
+ }
150
+ if (items.length >= limit && !options.provider)
151
+ break;
152
+ }
153
+ return {
154
+ ok: items.length > 0,
155
+ projectDir,
156
+ generatedAt: new Date().toISOString(),
157
+ query: options.query,
158
+ providerOrder: providers.map(provider => provider.id),
159
+ selectedProviders,
160
+ fallbackUsed,
161
+ items: items
162
+ .sort((a, b) => b.score - a.score || b.confidence - a.confidence)
163
+ .slice(0, limit),
164
+ providerStatuses: statuses,
165
+ warnings,
166
+ };
167
+ }
168
+ function orderedProviders(config, providerId) {
169
+ const candidates = config.routing.mode === 'local-only'
170
+ ? config.providers.filter(provider => provider.kind === 'scale-local')
171
+ : config.providers;
172
+ const selected = providerId ? candidates.filter(provider => provider.id === providerId) : candidates;
173
+ const order = config.routing.mode === 'local-only'
174
+ ? ['scale-local']
175
+ : config.routing.defaultOrder;
176
+ return selected.sort((a, b) => {
177
+ const ai = order.indexOf(a.id);
178
+ const bi = order.indexOf(b.id);
179
+ const orderRank = (ai === -1 ? 999 : ai) - (bi === -1 ? 999 : bi);
180
+ return orderRank || b.priority - a.priority || a.id.localeCompare(b.id);
181
+ });
182
+ }
183
+ function recallLocal(projectDir, scaleDir, provider, input, limit) {
184
+ const brain = new MemoryBrain({ projectDir, scaleDir });
185
+ try {
186
+ const active = brain.query(input.query, { limit, status: 'active' }).nodes;
187
+ const nodes = active.length > 0 || !input.includeCandidates
188
+ ? active
189
+ : brain.query(input.query, { limit }).nodes;
190
+ return nodes.map(node => nodeToRecall(provider.id, node));
191
+ }
192
+ finally {
193
+ brain.close();
194
+ }
195
+ }
196
+ async function recallExternal(provider, input, limit) {
197
+ if (!provider.endpoint)
198
+ return [];
199
+ const response = await fetch(new URL(provider.searchPath ?? '/search', provider.endpoint), {
200
+ method: 'POST',
201
+ headers: {
202
+ 'content-type': 'application/json',
203
+ ...(provider.apiKeyEnv && process.env[provider.apiKeyEnv] ? { authorization: `Bearer ${process.env[provider.apiKeyEnv]}` } : {}),
204
+ },
205
+ body: JSON.stringify({
206
+ query: input.query,
207
+ task: input.task,
208
+ files: input.files ?? [],
209
+ limit,
210
+ }),
211
+ signal: AbortSignal.timeout(2500),
212
+ });
213
+ if (!response.ok)
214
+ throw new Error(`HTTP ${response.status}`);
215
+ const data = await response.json();
216
+ const raw = extractExternalResults(data);
217
+ return raw.slice(0, limit).map((item, index) => externalToRecall(provider.id, item, index));
218
+ }
219
+ function extractExternalResults(data) {
220
+ if (Array.isArray(data))
221
+ return data.filter(isRecord);
222
+ if (!isRecord(data))
223
+ return [];
224
+ for (const key of ['results', 'items', 'memories', 'nodes', 'documents']) {
225
+ const value = data[key];
226
+ if (Array.isArray(value))
227
+ return value.filter(isRecord);
228
+ }
229
+ return [];
230
+ }
231
+ function externalToRecall(provider, item, index) {
232
+ const title = firstString(item.title, item.name, item.summary, item.content, item.text) ?? `${provider} memory ${index + 1}`;
233
+ const summary = firstString(item.summary, item.content, item.text, item.body, item.markdown) ?? title;
234
+ const confidence = clampNumber(item.confidence ?? item.relevance ?? item.score, 0.5);
235
+ const score = clampNumber(item.score ?? item.relevance ?? item.confidence, confidence);
236
+ return {
237
+ provider,
238
+ id: firstString(item.id, item.key, item.memoryId) ?? `${provider}-${index + 1}`,
239
+ title: truncate(title, 140),
240
+ summary: truncate(summary, 500),
241
+ confidence,
242
+ score,
243
+ evidencePaths: arrayOfStrings(item.evidencePaths ?? item.evidence_paths ?? item.sources),
244
+ sourceUrl: firstString(item.url, item.sourceUrl, item.source_url),
245
+ metadata: item,
246
+ };
247
+ }
248
+ function nodeToRecall(provider, node) {
249
+ return {
250
+ provider,
251
+ id: node.id,
252
+ title: node.title,
253
+ summary: node.summary,
254
+ confidence: node.confidence,
255
+ score: node.confidence,
256
+ evidencePaths: node.evidencePaths,
257
+ metadata: {
258
+ type: node.type,
259
+ scope: node.scope,
260
+ status: node.status,
261
+ entities: node.entities,
262
+ },
263
+ };
264
+ }
265
+ function providerStatus(provider, routing) {
266
+ if (!provider.enabled) {
267
+ return {
268
+ ...providerStatusBase(provider, routing),
269
+ available: false,
270
+ reason: 'disabled by memory provider policy',
271
+ };
272
+ }
273
+ if (provider.kind === 'scale-local') {
274
+ return {
275
+ ...providerStatusBase(provider, routing),
276
+ available: true,
277
+ reason: 'local MemoryBrain fallback is available',
278
+ };
279
+ }
280
+ if (!provider.endpoint) {
281
+ return {
282
+ ...providerStatusBase(provider, routing),
283
+ available: false,
284
+ reason: `${provider.id} requires endpoint configuration before autonomous use`,
285
+ };
286
+ }
287
+ return {
288
+ ...providerStatusBase(provider, routing),
289
+ available: true,
290
+ reason: `${provider.id} endpoint configured; recall is read-only unless policy enables writes`,
291
+ };
292
+ }
293
+ function providerStatusBase(provider, routing) {
294
+ return {
295
+ id: provider.id,
296
+ kind: provider.kind,
297
+ enabled: provider.enabled,
298
+ selectedByDefault: routing.defaultOrder.includes(provider.id),
299
+ priority: provider.priority,
300
+ capabilities: provider.capabilities,
301
+ safetyLevel: provider.safetyLevel,
302
+ writeMode: provider.writeMode,
303
+ };
304
+ }
305
+ function providerWarnings(statuses, config) {
306
+ const warnings = [];
307
+ if (!config.routing.allowExternalWrite && statuses.some(status => status.writeMode === 'enabled' && status.kind !== 'scale-local')) {
308
+ warnings.push('External memory write is configured on a provider while routing.allowExternalWrite is false.');
309
+ }
310
+ if (!statuses.some(status => status.kind === 'scale-local' && status.available)) {
311
+ warnings.push('scale-local fallback is unavailable; autonomous recall may fail closed.');
312
+ }
313
+ for (const status of statuses) {
314
+ if (status.kind !== 'scale-local' && status.enabled && status.safetyLevel !== 'review-required') {
315
+ warnings.push(`${status.id} should remain review-required until privacy and retention boundaries are recorded.`);
316
+ }
317
+ }
318
+ return warnings;
319
+ }
320
+ function normalizeProviders(input, defaults) {
321
+ if (!Array.isArray(input))
322
+ return defaults;
323
+ const byId = new Map(defaults.map(provider => [provider.id, provider]));
324
+ const providers = input.filter(isRecord).map(item => {
325
+ const id = String(item.id ?? '');
326
+ const base = byId.get(id);
327
+ return {
328
+ ...(base ?? {}),
329
+ ...item,
330
+ id,
331
+ kind: normalizeKind(item.kind, base?.kind),
332
+ enabled: item.enabled !== false && Boolean(item.enabled ?? base?.enabled ?? false),
333
+ priority: positiveInt(item.priority, base?.priority ?? 0),
334
+ capabilities: arrayOfStrings(item.capabilities),
335
+ safetyLevel: normalizeSafety(item.safetyLevel, base?.safetyLevel),
336
+ writeMode: normalizeWriteMode(item.writeMode, base?.writeMode),
337
+ };
338
+ }).filter(provider => provider.id);
339
+ for (const defaultProvider of defaults) {
340
+ if (!providers.some(provider => provider.id === defaultProvider.id))
341
+ providers.push(defaultProvider);
342
+ }
343
+ return providers;
344
+ }
345
+ function normalizeKind(value, fallback = 'generic-http') {
346
+ return ['scale-local', 'agentmemory', 'gbrain', 'generic-http'].includes(String(value))
347
+ ? value
348
+ : fallback;
349
+ }
350
+ function normalizeSafety(value, fallback = 'review-required') {
351
+ return ['trusted-local', 'review-required', 'blocked'].includes(String(value))
352
+ ? value
353
+ : fallback;
354
+ }
355
+ function normalizeWriteMode(value, fallback = 'disabled') {
356
+ return ['disabled', 'candidate-only', 'enabled'].includes(String(value))
357
+ ? value
358
+ : fallback;
359
+ }
360
+ function positiveInt(value, fallback) {
361
+ const parsed = Number.parseInt(String(value ?? ''), 10);
362
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;
363
+ }
364
+ function resolveScaleRoot(projectDir, scaleDir) {
365
+ return isAbsolute(scaleDir ?? '') ? scaleDir : join(projectDir, scaleDir ?? '.scale');
366
+ }
367
+ function isRecord(value) {
368
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
369
+ }
370
+ function firstString(...values) {
371
+ return values.map(value => typeof value === 'string' ? value.trim() : '').find(Boolean);
372
+ }
373
+ function arrayOfStrings(value) {
374
+ return Array.isArray(value) ? value.map(String).filter(Boolean) : [];
375
+ }
376
+ function clampNumber(value, fallback) {
377
+ const number = Number(value);
378
+ if (!Number.isFinite(number))
379
+ return fallback;
380
+ return Math.max(0.01, Math.min(1, Math.round(number * 100) / 100));
381
+ }
382
+ function truncate(value, maxChars) {
383
+ return value.length > maxChars ? `${value.slice(0, maxChars - 3)}...` : value;
384
+ }
385
+ //# sourceMappingURL=MemoryProviders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryProviders.js","sourceRoot":"","sources":["../../src/memory/MemoryProviders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAA;AAkG/D,MAAM,UAAU,4BAA4B;IAC1C,OAAO;QACL,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,aAAa,CAAC;YACtD,kBAAkB,EAAE,KAAK;YACzB,eAAe,EAAE,IAAI;YACrB,qBAAqB,EAAE,CAAC;SACzB;QACD,SAAS,EAAE;YACT;gBACE,EAAE,EAAE,aAAa;gBACjB,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;gBAC1C,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,qBAAqB;gBAChC,YAAY,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,CAAC;gBAC1D,WAAW,EAAE,iBAAiB;gBAC9B,SAAS,EAAE,UAAU;gBACrB,WAAW,EAAE;oBACX,OAAO,EAAE,YAAY;oBACrB,SAAS,EAAE,yCAAyC;oBACpD,MAAM,EAAE,uHAAuH;iBAChI;aACF;YACD;gBACE,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;gBACrC,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,gBAAgB;gBAC3B,YAAY,EAAE,CAAC,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,KAAK,CAAC;gBAC1E,WAAW,EAAE,iBAAiB;gBAC9B,SAAS,EAAE,UAAU;gBACrB,WAAW,EAAE;oBACX,OAAO,EAAE,KAAK;oBACd,SAAS,EAAE,oCAAoC;oBAC/C,MAAM,EAAE,+FAA+F;iBACxG;aACF;YACD;gBACE,EAAE,EAAE,aAAa;gBACjB,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,CAAC,gBAAgB,CAAC;gBAChC,WAAW,EAAE,eAAe;gBAC5B,SAAS,EAAE,gBAAgB;aAC5B;SACF;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,QAAQ;IACvF,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,uBAAuB,CAAC,CAAA;AAC9E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAIvC,EAAE;IACJ,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/D,MAAM,IAAI,GAAG,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACpE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAA;IACzG,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,4BAA4B,EAAE,CAAA;IAC7C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,QAAQ;IAKvF,MAAM,IAAI,GAAG,yBAAyB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,4BAA4B,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAC7F,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAmC,CAAA;QACxF,MAAM,QAAQ,GAAG,4BAA4B,EAAE,CAAA;QAC/C,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE;oBACP,GAAG,QAAQ,CAAC,OAAO;oBACnB,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;oBACzB,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY;oBACnI,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC;iBAClH;gBACD,SAAS,EAAE,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC;aACpE;SACF,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,4BAA4B,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACvE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAGnC,EAAE;IACJ,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS;SACrC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SAChE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtE,OAAO;QACL,UAAU;QACV,QAAQ,EAAE,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC;QACxD,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,YAAY,EAAE,MAAM,CAAC,MAAM;QAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;QAC9B,SAAS,EAAE,QAAQ;QACnB,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM;QAC1E,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;KACpD,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAGf;IAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAA;IAC7F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAA;IACnG,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnE,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,KAAK,GAA+B,EAAE,CAAA;IAC5C,MAAM,iBAAiB,GAAa,EAAE,CAAA;IACtC,IAAI,YAAY,GAAG,KAAK,CAAA;IAExB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC7D,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,aAAa,MAAM,EAAE,MAAM,IAAI,eAAe,EAAE,CAAC,CAAA;YAC7E,SAAQ;QACV,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,KAAK,aAAa;gBAC9C,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC;gBACrE,CAAC,CAAC,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;YAClD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;gBACnC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;YACzB,CAAC;YACD,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;gBAAE,YAAY,GAAG,IAAI,CAAA;QACjH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,mBAAoB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAA;QAC5E,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,MAAK;IACvD,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;QACpB,UAAU;QACV,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,iBAAiB;QACjB,YAAY;QACZ,KAAK,EAAE,KAAK;aACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;aAChE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAClB,gBAAgB,EAAE,QAAQ;QAC1B,QAAQ;KACT,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,MAA6B,EAAE,UAAmB;IAC1E,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY;QACrD,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,aAAa,CAAC;QACtE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAA;IACpB,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IACpG,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY;QAChD,CAAC,CAAC,CAAC,aAAa,CAAC;QACjB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAA;IAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC9B,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC9B,MAAM,SAAS,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACjE,OAAO,SAAS,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,UAAkB,EAClB,QAA4B,EAC5B,QAA8B,EAC9B,KAAgC,EAChC,KAAa;IAEb,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAA;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAA;QAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB;YACzD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAA;QAC7C,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAA;IAC3D,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,QAA8B,EAC9B,KAAgC,EAChC,KAAa;IAEb,IAAI,CAAC,QAAQ,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAA;IACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACzF,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjI;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;YACxB,KAAK;SACN,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;KAClC,CAAC,CAAA;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAC5D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAa,CAAA;IAC7C,MAAM,GAAG,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;IACxC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;AAC7F,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAa;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACrD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAA;IAC9B,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,IAA6B,EAAE,KAAa;IACtF,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,WAAW,KAAK,GAAG,CAAC,EAAE,CAAA;IAC5H,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAA;IACrG,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACpF,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IACtF,OAAO;QACL,QAAQ;QACR,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE;QAC/E,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;QAC3B,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;QAC/B,UAAU;QACV,KAAK;QACL,aAAa,EAAE,cAAc,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,CAAC;QACxF,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC;QACjE,QAAQ,EAAE,IAAI;KACf,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,IAAgB;IACtD,OAAO;QACL,QAAQ;QACR,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,KAAK,EAAE,IAAI,CAAC,UAAU;QACtB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,QAAQ,EAAE;YACR,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB;KACF,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAA8B,EAAE,OAAoC;IAC1F,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,OAAO;YACL,GAAG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC;YACxC,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,oCAAoC;SAC7C,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACpC,OAAO;YACL,GAAG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC;YACxC,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,yCAAyC;SAClD,CAAA;IACH,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACvB,OAAO;YACL,GAAG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC;YACxC,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,wDAAwD;SAC/E,CAAA;IACH,CAAC;IACD,OAAO;QACL,GAAG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC;QACxC,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,wEAAwE;KAC/F,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAA8B,EAAE,OAAoC;IAC9F,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,iBAAiB,EAAE,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgC,EAAE,MAA6B;IACvF,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE,CAAC;QACnI,QAAQ,CAAC,IAAI,CAAC,8FAA8F,CAAC,CAAA;IAC/G,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAChF,QAAQ,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;IAC1F,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,WAAW,KAAK,iBAAiB,EAAE,CAAC;YAChG,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,qFAAqF,CAAC,CAAA;QAClH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,QAAgC;IAC1E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAA;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IACvE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAClD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzB,OAAO;YACL,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YACf,GAAG,IAAI;YACP,EAAE;YACF,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;YAC1C,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC;YAClF,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC,CAAC;YACzD,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAA+B;YAC7E,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC;YACjE,SAAS,EAAE,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC;SACvC,CAAA;IAC3B,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAClC,KAAK,MAAM,eAAe,IAAI,QAAQ,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,eAAe,CAAC,EAAE,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACtG,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,WAA+B,cAAc;IAClF,OAAO,CAAC,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrF,CAAC,CAAC,KAA2B;QAC7B,CAAC,CAAC,QAAQ,CAAA;AACd,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,WAAsC,iBAAiB;IAC9F,OAAO,CAAC,eAAe,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,CAAC,CAAC,KAAkC;QACpC,CAAC,CAAC,QAAQ,CAAA;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,WAAoC,UAAU;IACxF,OAAO,CAAC,UAAU,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC,CAAC,KAAgC;QAClC,CAAC,CAAC,QAAQ,CAAA;AACd,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,QAAgB;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACvD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAA;AACnE,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB,EAAE,QAAiB;IAC7D,OAAO,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,IAAI,QAAQ,CAAC,CAAA;AACjG,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,WAAW,CAAC,GAAG,MAAiB;IACvC,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACzF,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACtE,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,QAAgB;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,CAAA;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;AACpE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,QAAgB;IAC/C,OAAO,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;AAC/E,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from './MemoryFabric.js';
2
2
  export * from './MemoryLearning.js';
3
3
  export * from './MemoryBrain.js';
4
+ export * from './MemoryProviders.js';
@@ -1,4 +1,5 @@
1
1
  export * from './MemoryFabric.js';
2
2
  export * from './MemoryLearning.js';
3
3
  export * from './MemoryBrain.js';
4
+ export * from './MemoryProviders.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA"}
@@ -137,9 +137,9 @@ function dashboardFindings(summary) {
137
137
  return findings;
138
138
  }
139
139
  function runtimeSection(summary) {
140
- return `<table>
141
- <thead><tr><th>Status</th><th>Total</th><th>Passed</th><th>Failed</th><th>Skipped</th></tr></thead>
142
- <tbody><tr><td>${summary.runtime.ok ? 'OK' : 'FAILED'}</td><td>${summary.runtime.total}</td><td>${summary.runtime.passed}</td><td>${summary.runtime.failed}</td><td>${summary.runtime.skipped}</td></tr></tbody>
140
+ return `<table>
141
+ <thead><tr><th>Status</th><th>Total</th><th>Passed</th><th>Failed</th><th>Skipped</th></tr></thead>
142
+ <tbody><tr><td>${summary.runtime.ok ? 'OK' : 'FAILED'}</td><td>${summary.runtime.total}</td><td>${summary.runtime.passed}</td><td>${summary.runtime.failed}</td><td>${summary.runtime.skipped}</td></tr></tbody>
143
143
  </table>`;
144
144
  }
145
145
  function governanceMetricsSection(metrics) {
@@ -168,59 +168,59 @@ function governanceMetricsSection(metrics) {
168
168
  `;
169
169
  }
170
170
  function evalSection(runs, failures) {
171
- const latestRows = runs.slice(0, 5).map(run => `<tr>
172
- <td><code>${escapeHtml(run.id)}</code></td>
173
- <td>${escapeHtml(run.suiteId)}</td>
174
- <td>${run.ok ? 'pass' : 'fail'}</td>
175
- <td>${(run.metrics.passAt1Rate * 100).toFixed(1)}%</td>
176
- <td>${run.metrics.failureReplayCount}</td>
171
+ const latestRows = runs.slice(0, 5).map(run => `<tr>
172
+ <td><code>${escapeHtml(run.id)}</code></td>
173
+ <td>${escapeHtml(run.suiteId)}</td>
174
+ <td>${run.ok ? 'pass' : 'fail'}</td>
175
+ <td>${(run.metrics.passAt1Rate * 100).toFixed(1)}%</td>
176
+ <td>${run.metrics.failureReplayCount}</td>
177
177
  </tr>`).join('');
178
- const failureRows = failures.slice(0, 8).map(failure => `<tr>
179
- <td><code>${escapeHtml(failure.id)}</code></td>
180
- <td>${escapeHtml(failure.category)}</td>
181
- <td>${escapeHtml(failure.status)}</td>
182
- <td>${escapeHtml(failure.phase)}</td>
178
+ const failureRows = failures.slice(0, 8).map(failure => `<tr>
179
+ <td><code>${escapeHtml(failure.id)}</code></td>
180
+ <td>${escapeHtml(failure.category)}</td>
181
+ <td>${escapeHtml(failure.status)}</td>
182
+ <td>${escapeHtml(failure.phase)}</td>
183
183
  </tr>`).join('');
184
- return `
185
- <h3>Latest Runs</h3>
186
- <table><thead><tr><th>Run</th><th>Suite</th><th>Status</th><th>Pass@1</th><th>Failures</th></tr></thead><tbody>${latestRows || '<tr><td colspan="5">No eval runs found.</td></tr>'}</tbody></table>
187
- <h3>Recent Failures</h3>
188
- <table><thead><tr><th>Failure</th><th>Category</th><th>Status</th><th>Phase</th></tr></thead><tbody>${failureRows || '<tr><td colspan="4">No recent failure replays found.</td></tr>'}</tbody></table>
184
+ return `
185
+ <h3>Latest Runs</h3>
186
+ <table><thead><tr><th>Run</th><th>Suite</th><th>Status</th><th>Pass@1</th><th>Failures</th></tr></thead><tbody>${latestRows || '<tr><td colspan="5">No eval runs found.</td></tr>'}</tbody></table>
187
+ <h3>Recent Failures</h3>
188
+ <table><thead><tr><th>Failure</th><th>Category</th><th>Status</th><th>Phase</th></tr></thead><tbody>${failureRows || '<tr><td colspan="4">No recent failure replays found.</td></tr>'}</tbody></table>
189
189
  `;
190
190
  }
191
191
  function memorySection(memoryDream) {
192
- const contradictionRows = memoryDream.contradictions.slice(0, 8).map(item => `<tr>
193
- <td><code>${escapeHtml(item.id)}</code></td>
194
- <td>${escapeHtml(item.title)}</td>
195
- <td>${item.nodeIds.map(id => `<code>${escapeHtml(id)}</code>`).join(', ')}</td>
192
+ const contradictionRows = memoryDream.contradictions.slice(0, 8).map(item => `<tr>
193
+ <td><code>${escapeHtml(item.id)}</code></td>
194
+ <td>${escapeHtml(item.title)}</td>
195
+ <td>${item.nodeIds.map(id => `<code>${escapeHtml(id)}</code>`).join(', ')}</td>
196
196
  </tr>`).join('');
197
- const promoteRows = memoryDream.promotionCandidates.slice(0, 8).map(item => `<tr>
198
- <td><code>${escapeHtml(item.id)}</code></td>
199
- <td>${escapeHtml(item.title)}</td>
200
- <td>${item.confidence.toFixed(2)}</td>
197
+ const promoteRows = memoryDream.promotionCandidates.slice(0, 8).map(item => `<tr>
198
+ <td><code>${escapeHtml(item.id)}</code></td>
199
+ <td>${escapeHtml(item.title)}</td>
200
+ <td>${item.confidence.toFixed(2)}</td>
201
201
  </tr>`).join('');
202
- return `
203
- <table><thead><tr><th>Total</th><th>Active</th><th>Candidate</th><th>Stale</th><th>Contradictions</th></tr></thead>
204
- <tbody><tr><td>${memoryDream.summary.total}</td><td>${memoryDream.summary.active}</td><td>${memoryDream.summary.candidate}</td><td>${memoryDream.summary.stale}</td><td>${memoryDream.summary.contradictions}</td></tr></tbody></table>
205
- <h3>Contradictions</h3>
206
- <table><thead><tr><th>ID</th><th>Title</th><th>Nodes</th></tr></thead><tbody>${contradictionRows || '<tr><td colspan="3">No contradictions found.</td></tr>'}</tbody></table>
207
- <h3>Promotion Candidates</h3>
208
- <table><thead><tr><th>ID</th><th>Title</th><th>Confidence</th></tr></thead><tbody>${promoteRows || '<tr><td colspan="3">No promotion candidates found.</td></tr>'}</tbody></table>
202
+ return `
203
+ <table><thead><tr><th>Total</th><th>Active</th><th>Candidate</th><th>Stale</th><th>Contradictions</th></tr></thead>
204
+ <tbody><tr><td>${memoryDream.summary.total}</td><td>${memoryDream.summary.active}</td><td>${memoryDream.summary.candidate}</td><td>${memoryDream.summary.stale}</td><td>${memoryDream.summary.contradictions}</td></tr></tbody></table>
205
+ <h3>Contradictions</h3>
206
+ <table><thead><tr><th>ID</th><th>Title</th><th>Nodes</th></tr></thead><tbody>${contradictionRows || '<tr><td colspan="3">No contradictions found.</td></tr>'}</tbody></table>
207
+ <h3>Promotion Candidates</h3>
208
+ <table><thead><tr><th>ID</th><th>Title</th><th>Confidence</th></tr></thead><tbody>${promoteRows || '<tr><td colspan="3">No promotion candidates found.</td></tr>'}</tbody></table>
209
209
  `;
210
210
  }
211
211
  function resourceSection(resourceDoctor) {
212
- const findingRows = resourceDoctor.findings.slice(0, 12).map(finding => `<tr>
213
- <td>${escapeHtml(finding.severity)}</td>
214
- <td>${escapeHtml(finding.code)}</td>
215
- <td>${escapeHtml(finding.path ?? '')}</td>
216
- <td>${escapeHtml(finding.message)}</td>
212
+ const findingRows = resourceDoctor.findings.slice(0, 12).map(finding => `<tr>
213
+ <td>${escapeHtml(finding.severity)}</td>
214
+ <td>${escapeHtml(finding.code)}</td>
215
+ <td>${escapeHtml(finding.path ?? '')}</td>
216
+ <td>${escapeHtml(finding.message)}</td>
217
217
  </tr>`).join('');
218
218
  const summary = resourceDoctor.scan.summary;
219
- return `
220
- <table><thead><tr><th>Status</th><th>Total Assets</th><th>Tracked Forbidden</th><th>Expired</th><th>Large Tracked</th></tr></thead>
221
- <tbody><tr><td>${resourceDoctor.ok ? 'OK' : 'FAILED'}</td><td>${summary.total}</td><td>${summary.trackedForbidden}</td><td>${summary.expired}</td><td>${summary.largeTracked}</td></tr></tbody></table>
222
- <h3>Findings</h3>
223
- <table><thead><tr><th>Severity</th><th>Code</th><th>Path</th><th>Message</th></tr></thead><tbody>${findingRows || '<tr><td colspan="4">No resource findings.</td></tr>'}</tbody></table>
219
+ return `
220
+ <table><thead><tr><th>Status</th><th>Total Assets</th><th>Tracked Forbidden</th><th>Expired</th><th>Large Tracked</th></tr></thead>
221
+ <tbody><tr><td>${resourceDoctor.ok ? 'OK' : 'FAILED'}</td><td>${summary.total}</td><td>${summary.trackedForbidden}</td><td>${summary.expired}</td><td>${summary.largeTracked}</td></tr></tbody></table>
222
+ <h3>Findings</h3>
223
+ <table><thead><tr><th>Severity</th><th>Code</th><th>Path</th><th>Message</th></tr></thead><tbody>${findingRows || '<tr><td colspan="4">No resource findings.</td></tr>'}</tbody></table>
224
224
  `;
225
225
  }
226
226
  function htmlArtifactSection(paths) {
@@ -310,11 +310,11 @@ function renderPurposeSection(template, sections) {
310
310
  const missing = sections.missing.length
311
311
  ? `<p class="doc-warning">Missing source artifacts: ${sections.missing.map(item => `<code>${escapeHtml(item)}</code>`).join(', ')}</p>`
312
312
  : '<p>All configured source artifacts were found.</p>';
313
- return `
314
- <p>${escapeHtml(template.description)}</p>
315
- <h3>Source Artifacts</h3>
316
- ${present}
317
- ${missing}
313
+ return `
314
+ <p>${escapeHtml(template.description)}</p>
315
+ <h3>Source Artifacts</h3>
316
+ ${present}
317
+ ${missing}
318
318
  `;
319
319
  }
320
320
  function markdownToHtml(markdown) {
@@ -427,12 +427,12 @@ function writeArtifactIndex(projectDir, taskDir, policy, manifest) {
427
427
  });
428
428
  const rows = manifest.artifacts.map(artifact => {
429
429
  const href = basename(artifact.path);
430
- return `<tr>
431
- <td><a href="${escapeAttribute(href)}">${escapeHtml(artifact.type)}</a></td>
432
- <td>${escapeHtml(artifact.title)}</td>
433
- <td>${escapeHtml(artifact.gitPolicy)}</td>
434
- <td>${escapeHtml(artifact.generatedAt)}</td>
435
- <td>${artifact.missingSources.length ? artifact.missingSources.map(item => `<code>${escapeHtml(item)}</code>`).join(', ') : 'none'}</td>
430
+ return `<tr>
431
+ <td><a href="${escapeAttribute(href)}">${escapeHtml(artifact.type)}</a></td>
432
+ <td>${escapeHtml(artifact.title)}</td>
433
+ <td>${escapeHtml(artifact.gitPolicy)}</td>
434
+ <td>${escapeHtml(artifact.generatedAt)}</td>
435
+ <td>${artifact.missingSources.length ? artifact.missingSources.map(item => `<code>${escapeHtml(item)}</code>`).join(', ') : 'none'}</td>
436
436
  </tr>`;
437
437
  }).join('\n');
438
438
  const html = renderer.renderReport({
@@ -445,9 +445,9 @@ function writeArtifactIndex(projectDir, taskDir, policy, manifest) {
445
445
  },
446
446
  sections: [{
447
447
  heading: 'Artifact Index',
448
- content: `<table>
449
- <thead><tr><th>Type</th><th>Title</th><th>Git Policy</th><th>Generated</th><th>Missing Sources</th></tr></thead>
450
- <tbody>${rows}</tbody>
448
+ content: `<table>
449
+ <thead><tr><th>Type</th><th>Title</th><th>Git Policy</th><th>Generated</th><th>Missing Sources</th></tr></thead>
450
+ <tbody>${rows}</tbody>
451
451
  </table>`,
452
452
  }],
453
453
  });
@@ -520,23 +520,23 @@ function htmlArtifactSettlementMarkdown(taskId, doctor) {
520
520
  const artifacts = doctor.artifacts.length
521
521
  ? doctor.artifacts.map(artifact => `| ${artifact.type} | ${escapeCell(artifact.path)} | ${artifact.sourcePaths.length} | ${artifact.missingSources.length} | ${artifact.gitPolicy} |`).join('\n')
522
522
  : '| none | | 0 | 0 | |';
523
- return `# HTML Artifacts
524
-
525
- Task: ${taskId ?? 'unspecified'}
526
- Status: ${doctor.ok ? 'passed' : 'blocked'}
527
- Generated: ${new Date().toISOString()}
528
-
529
- ## Artifacts
530
-
531
- | Type | Path | Sources | Missing | Git policy |
532
- | --- | --- | ---: | ---: | --- |
533
- ${artifacts}
534
-
535
- ## Findings
536
-
537
- | Severity | Code | Path | Message |
538
- | --- | --- | --- | --- |
539
- ${findings}
523
+ return `# HTML Artifacts
524
+
525
+ Task: ${taskId ?? 'unspecified'}
526
+ Status: ${doctor.ok ? 'passed' : 'blocked'}
527
+ Generated: ${new Date().toISOString()}
528
+
529
+ ## Artifacts
530
+
531
+ | Type | Path | Sources | Missing | Git policy |
532
+ | --- | --- | ---: | ---: | --- |
533
+ ${artifacts}
534
+
535
+ ## Findings
536
+
537
+ | Severity | Code | Path | Message |
538
+ | --- | --- | --- | --- |
539
+ ${findings}
540
540
  `;
541
541
  }
542
542
  function sourceHeading(path) {