@nxuss/lemma 1.37.0 → 1.39.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.
- package/README.md +9 -6
- package/bin/brain-ingest.js +86 -27
- package/bin/doctor.js +31 -4
- package/bin/init.js +98 -60
- package/dashboard/dist/assets/index-DNTQXLER.css +1 -0
- package/dashboard/dist/assets/index-DzL_Zu3m.js +452 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/cjs/cli/gitHooks.d.ts +9 -2
- package/dist/cjs/cli/gitHooks.d.ts.map +1 -1
- package/dist/cjs/cli/gitHooks.js +31 -4
- package/dist/cjs/cli/gitHooks.js.map +1 -1
- package/dist/cjs/cli/hostHooks.d.ts +13 -1
- package/dist/cjs/cli/hostHooks.d.ts.map +1 -1
- package/dist/cjs/cli/hostHooks.js +34 -4
- package/dist/cjs/cli/hostHooks.js.map +1 -1
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +42 -5
- package/dist/cjs/cli/lemma-proxy.js.map +1 -1
- package/dist/cjs/infra/analyzers/index.d.ts +0 -2
- package/dist/cjs/infra/analyzers/index.d.ts.map +1 -1
- package/dist/cjs/infra/analyzers/index.js +1 -6
- package/dist/cjs/infra/analyzers/index.js.map +1 -1
- package/dist/cjs/infra/cli.d.ts +4 -0
- package/dist/cjs/infra/cli.d.ts.map +1 -1
- package/dist/cjs/infra/cli.js +6 -199
- package/dist/cjs/infra/cli.js.map +1 -1
- package/dist/cjs/infra/index.d.ts +1 -3
- package/dist/cjs/infra/index.d.ts.map +1 -1
- package/dist/cjs/infra/index.js +1 -16
- package/dist/cjs/infra/index.js.map +1 -1
- package/dist/cjs/infra/mcp-tools.d.ts.map +1 -1
- package/dist/cjs/infra/mcp-tools.js +8 -453
- package/dist/cjs/infra/mcp-tools.js.map +1 -1
- package/dist/cjs/infra/types.d.ts +0 -101
- package/dist/cjs/infra/types.d.ts.map +1 -1
- package/dist/cjs/infra/types.js +2 -1
- package/dist/cjs/infra/types.js.map +1 -1
- package/dist/cjs/mcp/index.js +33 -10
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/prompts.d.ts +1 -1
- package/dist/cjs/mcp/prompts.d.ts.map +1 -1
- package/dist/cjs/mcp/prompts.js +8 -21
- package/dist/cjs/mcp/prompts.js.map +1 -1
- package/dist/cjs/mcp/tool-profiles.d.ts +8 -3
- package/dist/cjs/mcp/tool-profiles.d.ts.map +1 -1
- package/dist/cjs/mcp/tool-profiles.js +25 -54
- package/dist/cjs/mcp/tool-profiles.js.map +1 -1
- package/dist/cjs/mcp/tools/memory.d.ts +8 -0
- package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/memory.js +154 -125
- package/dist/cjs/mcp/tools/memory.js.map +1 -1
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js +11 -6
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/mcp/workspaceShared.d.ts.map +1 -1
- package/dist/cjs/mcp/workspaceShared.js +13 -12
- package/dist/cjs/mcp/workspaceShared.js.map +1 -1
- package/dist/cjs/proxy/ProjectRegistry.d.ts +44 -0
- package/dist/cjs/proxy/ProjectRegistry.d.ts.map +1 -1
- package/dist/cjs/proxy/ProjectRegistry.js +92 -3
- package/dist/cjs/proxy/ProjectRegistry.js.map +1 -1
- package/dist/cjs/subconscious/HostRecall.d.ts +36 -3
- package/dist/cjs/subconscious/HostRecall.d.ts.map +1 -1
- package/dist/cjs/subconscious/HostRecall.js +164 -37
- package/dist/cjs/subconscious/HostRecall.js.map +1 -1
- package/dist/cjs/subconscious/NarrowEvidence.d.ts +47 -0
- package/dist/cjs/subconscious/NarrowEvidence.d.ts.map +1 -0
- package/dist/cjs/subconscious/NarrowEvidence.js +252 -0
- package/dist/cjs/subconscious/NarrowEvidence.js.map +1 -0
- package/dist/cjs/subconscious/TheBrainV2.d.ts +37 -0
- package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
- package/dist/cjs/subconscious/TheBrainV2.js +147 -15
- package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
- package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
- package/dist/cjs/subconscious/freshness/LocalFsResolver.js +17 -0
- package/dist/cjs/subconscious/freshness/LocalFsResolver.js.map +1 -1
- package/dist/cjs/subconscious/recallDigest.d.ts +42 -0
- package/dist/cjs/subconscious/recallDigest.d.ts.map +1 -0
- package/dist/cjs/subconscious/recallDigest.js +94 -0
- package/dist/cjs/subconscious/recallDigest.js.map +1 -0
- package/dist/cjs/utils/OtherLanguageSymbols.d.ts +31 -0
- package/dist/cjs/utils/OtherLanguageSymbols.d.ts.map +1 -0
- package/dist/cjs/utils/OtherLanguageSymbols.js +283 -0
- package/dist/cjs/utils/OtherLanguageSymbols.js.map +1 -0
- package/dist/cjs/utils/SavingsLedger.d.ts +27 -0
- package/dist/cjs/utils/SavingsLedger.d.ts.map +1 -1
- package/dist/cjs/utils/SavingsLedger.js +51 -0
- package/dist/cjs/utils/SavingsLedger.js.map +1 -1
- package/dist/cjs/utils/StoreDraft.d.ts +12 -0
- package/dist/cjs/utils/StoreDraft.d.ts.map +1 -1
- package/dist/cjs/utils/StoreDraft.js +53 -1
- package/dist/cjs/utils/StoreDraft.js.map +1 -1
- package/dist/cjs/utils/SymbolSurgicalContext.d.ts +2 -0
- package/dist/cjs/utils/SymbolSurgicalContext.d.ts.map +1 -1
- package/dist/cjs/utils/SymbolSurgicalContext.js +1 -0
- package/dist/cjs/utils/SymbolSurgicalContext.js.map +1 -1
- package/dist/cjs/utils/reportSavings.d.ts +17 -4
- package/dist/cjs/utils/reportSavings.d.ts.map +1 -1
- package/dist/cjs/utils/reportSavings.js +67 -22
- package/dist/cjs/utils/reportSavings.js.map +1 -1
- package/dist/esm/cli/gitHooks.d.ts +9 -2
- package/dist/esm/cli/gitHooks.d.ts.map +1 -1
- package/dist/esm/cli/gitHooks.js +31 -4
- package/dist/esm/cli/gitHooks.js.map +1 -1
- package/dist/esm/cli/hostHooks.d.ts +13 -1
- package/dist/esm/cli/hostHooks.d.ts.map +1 -1
- package/dist/esm/cli/hostHooks.js +32 -3
- package/dist/esm/cli/hostHooks.js.map +1 -1
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +42 -5
- package/dist/esm/cli/lemma-proxy.js.map +1 -1
- package/dist/esm/infra/analyzers/index.d.ts +0 -2
- package/dist/esm/infra/analyzers/index.d.ts.map +1 -1
- package/dist/esm/infra/analyzers/index.js +0 -2
- package/dist/esm/infra/analyzers/index.js.map +1 -1
- package/dist/esm/infra/cli.d.ts +4 -0
- package/dist/esm/infra/cli.d.ts.map +1 -1
- package/dist/esm/infra/cli.js +6 -199
- package/dist/esm/infra/cli.js.map +1 -1
- package/dist/esm/infra/index.d.ts +1 -3
- package/dist/esm/infra/index.d.ts.map +1 -1
- package/dist/esm/infra/index.js +1 -3
- package/dist/esm/infra/index.js.map +1 -1
- package/dist/esm/infra/mcp-tools.d.ts.map +1 -1
- package/dist/esm/infra/mcp-tools.js +9 -454
- package/dist/esm/infra/mcp-tools.js.map +1 -1
- package/dist/esm/infra/types.d.ts +0 -101
- package/dist/esm/infra/types.d.ts.map +1 -1
- package/dist/esm/infra/types.js +2 -1
- package/dist/esm/infra/types.js.map +1 -1
- package/dist/esm/mcp/index.js +33 -10
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/prompts.d.ts +1 -1
- package/dist/esm/mcp/prompts.d.ts.map +1 -1
- package/dist/esm/mcp/prompts.js +8 -21
- package/dist/esm/mcp/prompts.js.map +1 -1
- package/dist/esm/mcp/tool-profiles.d.ts +8 -3
- package/dist/esm/mcp/tool-profiles.d.ts.map +1 -1
- package/dist/esm/mcp/tool-profiles.js +25 -54
- package/dist/esm/mcp/tool-profiles.js.map +1 -1
- package/dist/esm/mcp/tools/memory.d.ts +8 -0
- package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
- package/dist/esm/mcp/tools/memory.js +156 -128
- package/dist/esm/mcp/tools/memory.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js +12 -7
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/mcp/workspaceShared.d.ts.map +1 -1
- package/dist/esm/mcp/workspaceShared.js +13 -12
- package/dist/esm/mcp/workspaceShared.js.map +1 -1
- package/dist/esm/proxy/ProjectRegistry.d.ts +44 -0
- package/dist/esm/proxy/ProjectRegistry.d.ts.map +1 -1
- package/dist/esm/proxy/ProjectRegistry.js +91 -2
- package/dist/esm/proxy/ProjectRegistry.js.map +1 -1
- package/dist/esm/subconscious/HostRecall.d.ts +36 -3
- package/dist/esm/subconscious/HostRecall.d.ts.map +1 -1
- package/dist/esm/subconscious/HostRecall.js +159 -36
- package/dist/esm/subconscious/HostRecall.js.map +1 -1
- package/dist/esm/subconscious/NarrowEvidence.d.ts +47 -0
- package/dist/esm/subconscious/NarrowEvidence.d.ts.map +1 -0
- package/dist/esm/subconscious/NarrowEvidence.js +211 -0
- package/dist/esm/subconscious/NarrowEvidence.js.map +1 -0
- package/dist/esm/subconscious/TheBrainV2.d.ts +37 -0
- package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
- package/dist/esm/subconscious/TheBrainV2.js +146 -14
- package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
- package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
- package/dist/esm/subconscious/freshness/LocalFsResolver.js +17 -0
- package/dist/esm/subconscious/freshness/LocalFsResolver.js.map +1 -1
- package/dist/esm/subconscious/recallDigest.d.ts +42 -0
- package/dist/esm/subconscious/recallDigest.d.ts.map +1 -0
- package/dist/esm/subconscious/recallDigest.js +87 -0
- package/dist/esm/subconscious/recallDigest.js.map +1 -0
- package/dist/esm/utils/OtherLanguageSymbols.d.ts +31 -0
- package/dist/esm/utils/OtherLanguageSymbols.d.ts.map +1 -0
- package/dist/esm/utils/OtherLanguageSymbols.js +275 -0
- package/dist/esm/utils/OtherLanguageSymbols.js.map +1 -0
- package/dist/esm/utils/SavingsLedger.d.ts +27 -0
- package/dist/esm/utils/SavingsLedger.d.ts.map +1 -1
- package/dist/esm/utils/SavingsLedger.js +51 -0
- package/dist/esm/utils/SavingsLedger.js.map +1 -1
- package/dist/esm/utils/StoreDraft.d.ts +12 -0
- package/dist/esm/utils/StoreDraft.d.ts.map +1 -1
- package/dist/esm/utils/StoreDraft.js +52 -1
- package/dist/esm/utils/StoreDraft.js.map +1 -1
- package/dist/esm/utils/SymbolSurgicalContext.d.ts +2 -0
- package/dist/esm/utils/SymbolSurgicalContext.d.ts.map +1 -1
- package/dist/esm/utils/SymbolSurgicalContext.js +1 -1
- package/dist/esm/utils/SymbolSurgicalContext.js.map +1 -1
- package/dist/esm/utils/reportSavings.d.ts +17 -4
- package/dist/esm/utils/reportSavings.d.ts.map +1 -1
- package/dist/esm/utils/reportSavings.js +65 -22
- package/dist/esm/utils/reportSavings.js.map +1 -1
- package/package.json +2 -1
- package/dashboard/dist/assets/index-BoeQau6n.css +0 -1
- package/dashboard/dist/assets/index-Clf3qR64.js +0 -451
- package/dist/cjs/infra/analyzers/DriftDetector.d.ts +0 -4
- package/dist/cjs/infra/analyzers/DriftDetector.d.ts.map +0 -1
- package/dist/cjs/infra/analyzers/DriftDetector.js +0 -88
- package/dist/cjs/infra/analyzers/DriftDetector.js.map +0 -1
- package/dist/cjs/infra/analyzers/InfraAnalyzer.d.ts +0 -3
- package/dist/cjs/infra/analyzers/InfraAnalyzer.d.ts.map +0 -1
- package/dist/cjs/infra/analyzers/InfraAnalyzer.js +0 -73
- package/dist/cjs/infra/analyzers/InfraAnalyzer.js.map +0 -1
- package/dist/cjs/infra/config.d.ts +0 -17
- package/dist/cjs/infra/config.d.ts.map +0 -1
- package/dist/cjs/infra/config.js +0 -111
- package/dist/cjs/infra/config.js.map +0 -1
- package/dist/cjs/infra/errorCause.d.ts +0 -36
- package/dist/cjs/infra/errorCause.d.ts.map +0 -1
- package/dist/cjs/infra/errorCause.js +0 -143
- package/dist/cjs/infra/errorCause.js.map +0 -1
- package/dist/cjs/infra/providers/InfraProvider.d.ts +0 -9
- package/dist/cjs/infra/providers/InfraProvider.d.ts.map +0 -1
- package/dist/cjs/infra/providers/InfraProvider.js +0 -3
- package/dist/cjs/infra/providers/InfraProvider.js.map +0 -1
- package/dist/cjs/infra/providers/JenkinsProvider.d.ts +0 -16
- package/dist/cjs/infra/providers/JenkinsProvider.d.ts.map +0 -1
- package/dist/cjs/infra/providers/JenkinsProvider.js +0 -193
- package/dist/cjs/infra/providers/JenkinsProvider.js.map +0 -1
- package/dist/cjs/infra/providers/OKDProvider.d.ts +0 -24
- package/dist/cjs/infra/providers/OKDProvider.d.ts.map +0 -1
- package/dist/cjs/infra/providers/OKDProvider.js +0 -296
- package/dist/cjs/infra/providers/OKDProvider.js.map +0 -1
- package/dist/cjs/infra/providers/TerraformProvider.d.ts +0 -17
- package/dist/cjs/infra/providers/TerraformProvider.d.ts.map +0 -1
- package/dist/cjs/infra/providers/TerraformProvider.js +0 -111
- package/dist/cjs/infra/providers/TerraformProvider.js.map +0 -1
- package/dist/cjs/infra/providers/index.d.ts +0 -9
- package/dist/cjs/infra/providers/index.d.ts.map +0 -1
- package/dist/cjs/infra/providers/index.js +0 -34
- package/dist/cjs/infra/providers/index.js.map +0 -1
- package/dist/cjs/infra/templates/jenkins/index.d.ts +0 -15
- package/dist/cjs/infra/templates/jenkins/index.d.ts.map +0 -1
- package/dist/cjs/infra/templates/jenkins/index.js +0 -128
- package/dist/cjs/infra/templates/jenkins/index.js.map +0 -1
- package/dist/cjs/infra/templates/okd/index.d.ts +0 -31
- package/dist/cjs/infra/templates/okd/index.d.ts.map +0 -1
- package/dist/cjs/infra/templates/okd/index.js +0 -149
- package/dist/cjs/infra/templates/okd/index.js.map +0 -1
- package/dist/esm/infra/analyzers/DriftDetector.d.ts +0 -4
- package/dist/esm/infra/analyzers/DriftDetector.d.ts.map +0 -1
- package/dist/esm/infra/analyzers/DriftDetector.js +0 -84
- package/dist/esm/infra/analyzers/DriftDetector.js.map +0 -1
- package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts +0 -3
- package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts.map +0 -1
- package/dist/esm/infra/analyzers/InfraAnalyzer.js +0 -70
- package/dist/esm/infra/analyzers/InfraAnalyzer.js.map +0 -1
- package/dist/esm/infra/config.d.ts +0 -17
- package/dist/esm/infra/config.d.ts.map +0 -1
- package/dist/esm/infra/config.js +0 -101
- package/dist/esm/infra/config.js.map +0 -1
- package/dist/esm/infra/errorCause.d.ts +0 -36
- package/dist/esm/infra/errorCause.d.ts.map +0 -1
- package/dist/esm/infra/errorCause.js +0 -138
- package/dist/esm/infra/errorCause.js.map +0 -1
- package/dist/esm/infra/providers/InfraProvider.d.ts +0 -9
- package/dist/esm/infra/providers/InfraProvider.d.ts.map +0 -1
- package/dist/esm/infra/providers/InfraProvider.js +0 -2
- package/dist/esm/infra/providers/InfraProvider.js.map +0 -1
- package/dist/esm/infra/providers/JenkinsProvider.d.ts +0 -16
- package/dist/esm/infra/providers/JenkinsProvider.d.ts.map +0 -1
- package/dist/esm/infra/providers/JenkinsProvider.js +0 -186
- package/dist/esm/infra/providers/JenkinsProvider.js.map +0 -1
- package/dist/esm/infra/providers/OKDProvider.d.ts +0 -24
- package/dist/esm/infra/providers/OKDProvider.d.ts.map +0 -1
- package/dist/esm/infra/providers/OKDProvider.js +0 -292
- package/dist/esm/infra/providers/OKDProvider.js.map +0 -1
- package/dist/esm/infra/providers/TerraformProvider.d.ts +0 -17
- package/dist/esm/infra/providers/TerraformProvider.d.ts.map +0 -1
- package/dist/esm/infra/providers/TerraformProvider.js +0 -107
- package/dist/esm/infra/providers/TerraformProvider.js.map +0 -1
- package/dist/esm/infra/providers/index.d.ts +0 -9
- package/dist/esm/infra/providers/index.d.ts.map +0 -1
- package/dist/esm/infra/providers/index.js +0 -27
- package/dist/esm/infra/providers/index.js.map +0 -1
- package/dist/esm/infra/templates/jenkins/index.d.ts +0 -15
- package/dist/esm/infra/templates/jenkins/index.d.ts.map +0 -1
- package/dist/esm/infra/templates/jenkins/index.js +0 -124
- package/dist/esm/infra/templates/jenkins/index.js.map +0 -1
- package/dist/esm/infra/templates/okd/index.d.ts +0 -31
- package/dist/esm/infra/templates/okd/index.d.ts.map +0 -1
- package/dist/esm/infra/templates/okd/index.js +0 -142
- package/dist/esm/infra/templates/okd/index.js.map +0 -1
|
@@ -8,6 +8,8 @@ import fs from "fs";
|
|
|
8
8
|
import path from "path";
|
|
9
9
|
import { getBrain } from "../subconscious/TheBrainV2.js";
|
|
10
10
|
import { entriesForFile } from "../utils/StateHashCache.js";
|
|
11
|
+
import { digestFileHits, formatFileDigest, recallableHits } from "../subconscious/recallDigest.js";
|
|
12
|
+
import { reportRecall } from "../utils/reportSavings.js";
|
|
11
13
|
export function listDirRecursive(currentDir, relativePath, depth, maxDepth) {
|
|
12
14
|
if (depth > maxDepth)
|
|
13
15
|
return [];
|
|
@@ -67,8 +69,8 @@ export function formatBlastRadiusNote(result) {
|
|
|
67
69
|
*
|
|
68
70
|
* Same rules as the write-side note: advisory only, never blocks, never mutates, and adds no
|
|
69
71
|
* tool schema (it enriches an existing response), so it costs nothing per turn. It reports
|
|
70
|
-
*
|
|
71
|
-
* context than it saves;
|
|
72
|
+
* headlines rather than bodies (see recallDigest) — pulling whole memories into every file read
|
|
73
|
+
* would spend far more context than it saves; get_memory fetches the one that matters.
|
|
72
74
|
*/
|
|
73
75
|
const _recallNoted = new Set();
|
|
74
76
|
/** "a, b, c, d, e (+N more)" — at most `max` ids, the rest only counted. */
|
|
@@ -77,24 +79,23 @@ export function capIds(ids, max = 5) {
|
|
|
77
79
|
}
|
|
78
80
|
export function formatRecallNote(filePath, symbolName) {
|
|
79
81
|
try {
|
|
80
|
-
const
|
|
81
|
-
if (
|
|
82
|
+
const hits = recallableHits(getBrain(), getBrain().findBlastRadius(filePath, symbolName).hits);
|
|
83
|
+
if (hits.length === 0)
|
|
82
84
|
return "";
|
|
83
85
|
// Repeating the identical note on every read of the same file is nagging, not signal.
|
|
84
86
|
// Keyed by the memory set, so a note reappears when the set genuinely changes.
|
|
85
|
-
const ids =
|
|
87
|
+
const ids = hits.map((h) => h.id).sort();
|
|
86
88
|
const key = `${path.resolve(filePath)}::${symbolName || ""}::${ids.join(",")}`;
|
|
87
89
|
if (_recallNoted.has(key))
|
|
88
90
|
return "";
|
|
89
91
|
_recallNoted.add(key);
|
|
90
92
|
const subject = symbolName ? `\`${symbolName}\`` : "this file";
|
|
91
|
-
// Hub files (package.json: 103 memories, CHANGELOG.md: 51)
|
|
92
|
-
//
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
return `${base}\n⚠️ ${result.failedHits.length} of those document an approach that was tried here and FAILED: ${failedIds}. Read those first so you don't repeat it.`;
|
|
93
|
+
// Hub files (package.json: 103 memories, CHANGELOG.md: 51) used to print every id. A digest
|
|
94
|
+
// of the few worth opening — headline, freshness, age — is something an agent acts on.
|
|
95
|
+
const digest = digestFileHits(getBrain(), hits);
|
|
96
|
+
// Long-lived process: no need to wait for the proxy's answer.
|
|
97
|
+
void reportRecall({ projectPath: process.cwd(), trigger: "read", memoryIds: digest.ids });
|
|
98
|
+
return `\n\n${formatFileDigest(subject, digest)}`;
|
|
98
99
|
}
|
|
99
100
|
catch {
|
|
100
101
|
// A recall note must never be the reason a file read fails.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspaceShared.js","sourceRoot":"","sources":["../../../src/mcp/workspaceShared.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,QAAQ,EAA0B,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"workspaceShared.js","sourceRoot":"","sources":["../../../src/mcp/workspaceShared.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,16 +2,60 @@ export interface RegisteredProject {
|
|
|
2
2
|
name: string;
|
|
3
3
|
path: string;
|
|
4
4
|
stack: string;
|
|
5
|
+
/** Last handshake or tool call — what getActive() ranks by. Heartbeats don't move it. */
|
|
5
6
|
lastActive: number;
|
|
7
|
+
/** Last sign of life from any MCP server in this project: handshake, heartbeat or tool call. */
|
|
8
|
+
lastSeen: number;
|
|
9
|
+
/** Last MCP tool call, or null if the project connected but hasn't called a tool yet. */
|
|
10
|
+
lastToolCall: number | null;
|
|
11
|
+
toolCallCount: number;
|
|
6
12
|
}
|
|
13
|
+
export type ProjectStatus = 'active' | 'idle' | 'offline';
|
|
14
|
+
export interface ProjectSnapshot extends RegisteredProject {
|
|
15
|
+
status: ProjectStatus;
|
|
16
|
+
/** Distinct memories a recall note (hook, briefing or read-tool note) put in front of an agent. */
|
|
17
|
+
offeredCount: number;
|
|
18
|
+
/** Of those, how many the agent then opened with get_memory. */
|
|
19
|
+
usedCount: number;
|
|
20
|
+
}
|
|
21
|
+
/** MCP servers heartbeat every 30s; three missed beats and the project counts as disconnected. */
|
|
22
|
+
export declare const OFFLINE_AFTER_MS = 90000;
|
|
23
|
+
/** Same threshold /api/mcp-status uses for "active". */
|
|
24
|
+
export declare const ACTIVE_WITHIN_MS = 60000;
|
|
25
|
+
/**
|
|
26
|
+
* A get_memory counts as using an offered memory only this soon after the offer — a stand-in
|
|
27
|
+
* for "the same working session", since the hook knows the host's session id and the MCP
|
|
28
|
+
* server doesn't.
|
|
29
|
+
*/
|
|
30
|
+
export declare const RECALL_USE_WINDOW_MS: number;
|
|
7
31
|
export declare class ProjectRegistry {
|
|
8
32
|
private projects;
|
|
33
|
+
private recall;
|
|
34
|
+
private tally;
|
|
9
35
|
register(projectPath: string, name: string, stack: string): RegisteredProject;
|
|
36
|
+
/**
|
|
37
|
+
* Keep-alive from an MCP server. Re-registers a project the daemon forgot (it restarted),
|
|
38
|
+
* but leaves lastActive alone so idle sessions heartbeating in the background don't steal
|
|
39
|
+
* getActive() from the project actually being worked on.
|
|
40
|
+
*/
|
|
41
|
+
heartbeat(projectPath: string, name: string, stack: string): RegisteredProject;
|
|
42
|
+
/** A tool call from this project. Registers it if the handshake never reached this daemon. */
|
|
43
|
+
recordToolCall(projectPath: string): RegisteredProject;
|
|
44
|
+
/** A recall note offered these memories in this project. Doesn't touch connection status. */
|
|
45
|
+
recordOffered(projectPath: string, ids: string[], now?: number): void;
|
|
46
|
+
/**
|
|
47
|
+
* get_memory read `id` in this project. True when a note had offered it within
|
|
48
|
+
* RECALL_USE_WINDOW_MS — the agent acted on recall it didn't have to search for. A read of a
|
|
49
|
+
* memory nobody offered (an id from search_memory, or carried over) is not counted here.
|
|
50
|
+
*/
|
|
51
|
+
recordRecallUse(projectPath: string, id: string, now?: number): boolean;
|
|
10
52
|
get(projectPath: string): RegisteredProject | undefined;
|
|
11
53
|
touch(projectPath: string): void;
|
|
12
54
|
getActive(): RegisteredProject | null;
|
|
13
55
|
findByPathFragment(text: string): RegisteredProject | null;
|
|
14
56
|
isStale(project: RegisteredProject, hours?: number): boolean;
|
|
15
57
|
getAll(): RegisteredProject[];
|
|
58
|
+
/** Every known project with its connection status, most recently active first. */
|
|
59
|
+
snapshot(now?: number): ProjectSnapshot[];
|
|
16
60
|
}
|
|
17
61
|
//# sourceMappingURL=ProjectRegistry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectRegistry.d.ts","sourceRoot":"","sources":["../../../src/proxy/ProjectRegistry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ProjectRegistry.d.ts","sourceRoot":"","sources":["../../../src/proxy/ProjectRegistry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,UAAU,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,QAAQ,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1D,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,MAAM,EAAE,aAAa,CAAC;IACtB,mGAAmG;IACnG,YAAY,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,kGAAkG;AAClG,eAAO,MAAM,gBAAgB,QAAS,CAAC;AACvC,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,QAAS,CAAC;AACvC;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAAqB,CAAC;AAWvD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,MAAM,CAAkC;IAEhD,OAAO,CAAC,KAAK;IASb,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB;IAsB7E;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB;IAQ9E,8FAA8F;IAC9F,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB;IAUtD,6FAA6F;IAC7F,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,SAAa,GAAG,IAAI;IAUzE;;;;OAIG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,OAAO;IAQ3E,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIvD,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAKhC,SAAS,IAAI,iBAAiB,GAAG,IAAI;IAYrC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAQ1D,OAAO,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,SAAK,GAAG,OAAO;IAIxD,MAAM,IAAI,iBAAiB,EAAE;IAI7B,kFAAkF;IAClF,QAAQ,CAAC,GAAG,SAAa,GAAG,eAAe,EAAE;CAW9C"}
|
|
@@ -1,11 +1,34 @@
|
|
|
1
|
+
/** MCP servers heartbeat every 30s; three missed beats and the project counts as disconnected. */
|
|
2
|
+
export const OFFLINE_AFTER_MS = 90000;
|
|
3
|
+
/** Same threshold /api/mcp-status uses for "active". */
|
|
4
|
+
export const ACTIVE_WITHIN_MS = 60000;
|
|
5
|
+
/**
|
|
6
|
+
* A get_memory counts as using an offered memory only this soon after the offer — a stand-in
|
|
7
|
+
* for "the same working session", since the hook knows the host's session id and the MCP
|
|
8
|
+
* server doesn't.
|
|
9
|
+
*/
|
|
10
|
+
export const RECALL_USE_WINDOW_MS = 6 * 60 * 60 * 1000;
|
|
11
|
+
const MAX_OFFERED_PER_PROJECT = 2000;
|
|
12
|
+
const folderName = (projectPath) => projectPath.split(/[\\/]/).filter(Boolean).pop() || projectPath;
|
|
1
13
|
export class ProjectRegistry {
|
|
2
14
|
constructor() {
|
|
3
15
|
this.projects = new Map();
|
|
16
|
+
this.recall = new Map();
|
|
17
|
+
}
|
|
18
|
+
tally(projectPath) {
|
|
19
|
+
let t = this.recall.get(projectPath);
|
|
20
|
+
if (!t) {
|
|
21
|
+
t = { offered: new Map(), used: new Set() };
|
|
22
|
+
this.recall.set(projectPath, t);
|
|
23
|
+
}
|
|
24
|
+
return t;
|
|
4
25
|
}
|
|
5
26
|
register(projectPath, name, stack) {
|
|
27
|
+
const now = Date.now();
|
|
6
28
|
const existing = this.projects.get(projectPath);
|
|
7
29
|
if (existing) {
|
|
8
|
-
existing.lastActive =
|
|
30
|
+
existing.lastActive = now;
|
|
31
|
+
existing.lastSeen = now;
|
|
9
32
|
if (stack && stack !== existing.stack)
|
|
10
33
|
existing.stack = stack;
|
|
11
34
|
return existing;
|
|
@@ -14,11 +37,63 @@ export class ProjectRegistry {
|
|
|
14
37
|
name,
|
|
15
38
|
path: projectPath,
|
|
16
39
|
stack,
|
|
17
|
-
lastActive:
|
|
40
|
+
lastActive: now,
|
|
41
|
+
lastSeen: now,
|
|
42
|
+
lastToolCall: null,
|
|
43
|
+
toolCallCount: 0,
|
|
18
44
|
};
|
|
19
45
|
this.projects.set(projectPath, project);
|
|
20
46
|
return project;
|
|
21
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Keep-alive from an MCP server. Re-registers a project the daemon forgot (it restarted),
|
|
50
|
+
* but leaves lastActive alone so idle sessions heartbeating in the background don't steal
|
|
51
|
+
* getActive() from the project actually being worked on.
|
|
52
|
+
*/
|
|
53
|
+
heartbeat(projectPath, name, stack) {
|
|
54
|
+
const existing = this.projects.get(projectPath);
|
|
55
|
+
if (!existing)
|
|
56
|
+
return this.register(projectPath, name, stack);
|
|
57
|
+
existing.lastSeen = Date.now();
|
|
58
|
+
if (stack && stack !== existing.stack)
|
|
59
|
+
existing.stack = stack;
|
|
60
|
+
return existing;
|
|
61
|
+
}
|
|
62
|
+
/** A tool call from this project. Registers it if the handshake never reached this daemon. */
|
|
63
|
+
recordToolCall(projectPath) {
|
|
64
|
+
const project = this.projects.get(projectPath) ?? this.register(projectPath, folderName(projectPath), '');
|
|
65
|
+
const now = Date.now();
|
|
66
|
+
project.lastActive = now;
|
|
67
|
+
project.lastSeen = now;
|
|
68
|
+
project.lastToolCall = now;
|
|
69
|
+
project.toolCallCount++;
|
|
70
|
+
return project;
|
|
71
|
+
}
|
|
72
|
+
/** A recall note offered these memories in this project. Doesn't touch connection status. */
|
|
73
|
+
recordOffered(projectPath, ids, now = Date.now()) {
|
|
74
|
+
if (!this.projects.has(projectPath))
|
|
75
|
+
this.register(projectPath, folderName(projectPath), '');
|
|
76
|
+
const { offered } = this.tally(projectPath);
|
|
77
|
+
for (const id of ids) {
|
|
78
|
+
offered.delete(id); // re-insert so the oldest offers are the ones evicted
|
|
79
|
+
offered.set(id, now);
|
|
80
|
+
}
|
|
81
|
+
while (offered.size > MAX_OFFERED_PER_PROJECT)
|
|
82
|
+
offered.delete(offered.keys().next().value);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* get_memory read `id` in this project. True when a note had offered it within
|
|
86
|
+
* RECALL_USE_WINDOW_MS — the agent acted on recall it didn't have to search for. A read of a
|
|
87
|
+
* memory nobody offered (an id from search_memory, or carried over) is not counted here.
|
|
88
|
+
*/
|
|
89
|
+
recordRecallUse(projectPath, id, now = Date.now()) {
|
|
90
|
+
const t = this.recall.get(projectPath);
|
|
91
|
+
const at = t?.offered.get(id);
|
|
92
|
+
if (!t || at === undefined || now - at > RECALL_USE_WINDOW_MS)
|
|
93
|
+
return false;
|
|
94
|
+
t.used.add(id);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
22
97
|
get(projectPath) {
|
|
23
98
|
return this.projects.get(projectPath);
|
|
24
99
|
}
|
|
@@ -52,5 +127,19 @@ export class ProjectRegistry {
|
|
|
52
127
|
getAll() {
|
|
53
128
|
return Array.from(this.projects.values());
|
|
54
129
|
}
|
|
130
|
+
/** Every known project with its connection status, most recently active first. */
|
|
131
|
+
snapshot(now = Date.now()) {
|
|
132
|
+
return this.getAll()
|
|
133
|
+
.map((p) => {
|
|
134
|
+
let status = 'idle';
|
|
135
|
+
if (now - p.lastSeen > OFFLINE_AFTER_MS)
|
|
136
|
+
status = 'offline';
|
|
137
|
+
else if (p.lastToolCall !== null && now - p.lastToolCall < ACTIVE_WITHIN_MS)
|
|
138
|
+
status = 'active';
|
|
139
|
+
const t = this.recall.get(p.path);
|
|
140
|
+
return { ...p, status, offeredCount: t?.offered.size ?? 0, usedCount: t?.used.size ?? 0 };
|
|
141
|
+
})
|
|
142
|
+
.sort((a, b) => b.lastActive - a.lastActive);
|
|
143
|
+
}
|
|
55
144
|
}
|
|
56
145
|
//# sourceMappingURL=ProjectRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectRegistry.js","sourceRoot":"","sources":["../../../src/proxy/ProjectRegistry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProjectRegistry.js","sourceRoot":"","sources":["../../../src/proxy/ProjectRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* has no reason to. This module answers a host PostToolUse hook payload with the same kind of
|
|
9
9
|
* note, at the same three moments:
|
|
10
10
|
*
|
|
11
|
-
* - Reading a file the Brain has memories about →
|
|
11
|
+
* - Reading a file the Brain has memories about → a digest of the most relevant (recallDigest).
|
|
12
12
|
* - Editing a file a documented FAILED attempt depends on → a warning. Plain "this will go
|
|
13
13
|
* stale" notes stay off for native edits: they are the common case and not worth context.
|
|
14
14
|
* - A verdict command (test/build/lint) failing with an error the Brain already has a recorded
|
|
@@ -27,6 +27,14 @@
|
|
|
27
27
|
* only when a search actually returns it to a caller.
|
|
28
28
|
*/
|
|
29
29
|
import { TheBrainV2 } from './TheBrainV2.js';
|
|
30
|
+
import type { RecallTrigger } from '../utils/reportSavings.js';
|
|
31
|
+
/** A note plus what it put in front of the agent — reported to the dashboard as recall. */
|
|
32
|
+
export interface RecallNote {
|
|
33
|
+
text: string;
|
|
34
|
+
/** Ids the note named. Empty for notes that carry no memory (stale build, status question). */
|
|
35
|
+
offered: string[];
|
|
36
|
+
trigger: RecallTrigger;
|
|
37
|
+
}
|
|
30
38
|
/**
|
|
31
39
|
* BM25 similarity is normalized against the corpus, so the top result of any query scores
|
|
32
40
|
* high — and every fix memory shares the "fix:" token. It only nominates candidates; this
|
|
@@ -41,9 +49,21 @@ export declare function headlineOverlap(a: string, b: string): number;
|
|
|
41
49
|
* Never throws: a recall hint must never be the reason a tool call reports an error.
|
|
42
50
|
*/
|
|
43
51
|
export declare function recallForHookPayload(payload: unknown, cwd?: string, brain?: TheBrainV2): string;
|
|
52
|
+
/** recallForHookPayload with what the note offered, for reporting. Null when there's no note. */
|
|
53
|
+
export declare function hookRecall(payload: unknown, cwd?: string, brain?: TheBrainV2): RecallNote | null;
|
|
44
54
|
export declare function isStatusQuestion(prompt: string): boolean;
|
|
45
|
-
/**
|
|
46
|
-
|
|
55
|
+
/**
|
|
56
|
+
* How much of what the prompt is about appears in a memory's headline: the IDF-weighted share
|
|
57
|
+
* of the prompt's words (or their stem / bilingual synonym) found among the headline's terms.
|
|
58
|
+
*
|
|
59
|
+
* This replaced "share of the headline found in the prompt", which needed a short prompt to
|
|
60
|
+
* restate half of a long, specific headline: measured on Lemma's own Brain it offered the right
|
|
61
|
+
* memory for 1 of 30 real questions; weighted toward the prompt's rare words it offers several
|
|
62
|
+
* times more and never a wrong one (thresholds above). Prompts with under PROMPT_MIN_UNITS
|
|
63
|
+
* informative words are skipped, which is where the false offers were. This note arrives unasked on every prompt, so it keeps
|
|
64
|
+
* a floor — search_memory, which the agent calls on purpose, does not.
|
|
65
|
+
*/
|
|
66
|
+
export declare function promptCoverage(headline: string, prompt: string, idf: (term: string) => number): number;
|
|
47
67
|
/**
|
|
48
68
|
* The note (empty string for none) for a host UserPromptSubmit payload. This is the one
|
|
49
69
|
* moment recall can happen before the agent answers from its own notes: a status question
|
|
@@ -63,4 +83,17 @@ export interface PromptRecallOptions {
|
|
|
63
83
|
mcpProcessDir?: string;
|
|
64
84
|
}
|
|
65
85
|
export declare function recallForPrompt(payload: unknown, cwd?: string, brain?: TheBrainV2, options?: PromptRecallOptions): string;
|
|
86
|
+
/** recallForPrompt with the memories it offered, for reporting. Null when there's nothing to say. */
|
|
87
|
+
export declare function promptRecall(payload: unknown, cwd?: string, brain?: TheBrainV2, options?: PromptRecallOptions): RecallNote | null;
|
|
88
|
+
/** Tools the playbook names, in one ToolSearch line for hosts that defer MCP schemas. */
|
|
89
|
+
export declare const PLAYBOOK_TOOLS: string[];
|
|
90
|
+
/**
|
|
91
|
+
* When to reach for Lemma — triggers, not judgment calls. "Use it when it adds value" let every
|
|
92
|
+
* individual call look cheaper native; these are the moments where Lemma does something the
|
|
93
|
+
* native tools can't, so there is no cheaper alternative to weigh.
|
|
94
|
+
*/
|
|
95
|
+
export declare const LEMMA_PLAYBOOK: string;
|
|
96
|
+
export declare function sessionBriefing(payload: unknown, cwd?: string, brain?: TheBrainV2): string;
|
|
97
|
+
/** sessionBriefing with the memories it named, for reporting. */
|
|
98
|
+
export declare function sessionRecall(payload: unknown, cwd?: string, brain?: TheBrainV2): RecallNote | null;
|
|
66
99
|
//# sourceMappingURL=HostRecall.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HostRecall.d.ts","sourceRoot":"","sources":["../../../src/subconscious/HostRecall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,EAA0C,UAAU,
|
|
1
|
+
{"version":3,"file":"HostRecall.d.ts","sourceRoot":"","sources":["../../../src/subconscious/HostRecall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,EAA0C,UAAU,EAAY,MAAM,cAAc,CAAC;AAO5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,2FAA2F;AAC3F,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;CACxB;AAKD;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAoEzC,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAO5D;AA0BD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CAE/F;AAED,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAgChG;AAWD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAExD;AA6BD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAYtG;AAQD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mBAAmB;IAClC,gGAAgG;IAChG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,CAE7H;AAED,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,OAAO,GAAE,mBAAwB,GAAG,UAAU,GAAG,IAAI,CA6DrI;AASD,yFAAyF;AACzF,eAAO,MAAM,cAAc,UAQ1B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAQf,CAAC;AAIb,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CAE1F;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAiCnG"}
|