@nxuss/lemma 1.38.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 +3 -4
- package/bin/brain-ingest.js +68 -31
- package/bin/init.js +25 -28
- 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/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +21 -1
- 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/prompts.d.ts +1 -1
- package/dist/cjs/mcp/prompts.d.ts.map +1 -1
- package/dist/cjs/mcp/prompts.js +8 -23
- 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 +8 -4
- package/dist/cjs/mcp/workspaceShared.js.map +1 -1
- package/dist/cjs/proxy/ProjectRegistry.d.ts +20 -0
- package/dist/cjs/proxy/ProjectRegistry.d.ts.map +1 -1
- package/dist/cjs/proxy/ProjectRegistry.js +46 -4
- package/dist/cjs/proxy/ProjectRegistry.js.map +1 -1
- package/dist/cjs/subconscious/HostRecall.d.ts +26 -2
- package/dist/cjs/subconscious/HostRecall.d.ts.map +1 -1
- package/dist/cjs/subconscious/HostRecall.js +101 -36
- 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 +8 -0
- package/dist/cjs/subconscious/recallDigest.d.ts.map +1 -1
- package/dist/cjs/subconscious/recallDigest.js +13 -1
- package/dist/cjs/subconscious/recallDigest.js.map +1 -1
- 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/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +21 -1
- 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/prompts.d.ts +1 -1
- package/dist/esm/mcp/prompts.d.ts.map +1 -1
- package/dist/esm/mcp/prompts.js +8 -23
- 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 +9 -5
- package/dist/esm/mcp/workspaceShared.js.map +1 -1
- package/dist/esm/proxy/ProjectRegistry.d.ts +20 -0
- package/dist/esm/proxy/ProjectRegistry.d.ts.map +1 -1
- package/dist/esm/proxy/ProjectRegistry.js +45 -3
- package/dist/esm/proxy/ProjectRegistry.js.map +1 -1
- package/dist/esm/subconscious/HostRecall.d.ts +26 -2
- package/dist/esm/subconscious/HostRecall.d.ts.map +1 -1
- package/dist/esm/subconscious/HostRecall.js +99 -37
- 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 +8 -0
- package/dist/esm/subconscious/recallDigest.d.ts.map +1 -1
- package/dist/esm/subconscious/recallDigest.js +12 -1
- package/dist/esm/subconscious/recallDigest.js.map +1 -1
- 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-CLXWgzTm.css +0 -1
- package/dashboard/dist/assets/index-CoMIMxyC.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalFsResolver.js","sourceRoot":"","sources":["../../../../src/subconscious/freshness/LocalFsResolver.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;;;;;;;;;;GAcG;AACH,4CAAoB;AACpB,gDAAwB;AACxB,oDAA4B;AAC5B,6EAAoG;
|
|
1
|
+
{"version":3,"file":"LocalFsResolver.js","sourceRoot":"","sources":["../../../../src/subconscious/freshness/LocalFsResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,8 +19,16 @@ export interface FileDigest {
|
|
|
19
19
|
total: number;
|
|
20
20
|
/** One "• id (fresh, 3d ago): headline" line per memory shown, most relevant first. */
|
|
21
21
|
lines: string[];
|
|
22
|
+
/** The ids those lines name — what the note actually offered the agent. */
|
|
23
|
+
ids: string[];
|
|
22
24
|
failedCount: number;
|
|
23
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* The hits worth naming in a note: commit-log ingests are dropped. They restate `git log`, and on
|
|
28
|
+
* a hub file they were most of the list — Lemma's own repo held 295 of them, recalled twice in
|
|
29
|
+
* total, and a file with no deliberate memory got a note made only of them.
|
|
30
|
+
*/
|
|
31
|
+
export declare function recallableHits<T extends DigestHit>(brain: TheBrainV2, hits: T[]): T[];
|
|
24
32
|
/**
|
|
25
33
|
* Relevance without a query to rank against: a failed approach first (repeating it is the
|
|
26
34
|
* costliest mistake), then memories someone wrote on purpose over commit-log ingests (a hub
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recallDigest.d.ts","sourceRoot":"","sources":["../../../src/subconscious/recallDigest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAG5D;;;;;;;;;GASG;AAEH,eAAO,MAAM,UAAU,IAAI,CAAC;AAG5B,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAOD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAoB9E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,SAAa,GAAG,UAAU,CAkBjG;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAY5E"}
|
|
1
|
+
{"version":3,"file":"recallDigest.d.ts","sourceRoot":"","sources":["../../../src/subconscious/recallDigest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAG5D;;;;;;;;;GASG;AAEH,eAAO,MAAM,UAAU,IAAI,CAAC;AAG5B,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,2EAA2E;IAC3E,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAOD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAKrF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAoB9E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,SAAa,GAAG,UAAU,CAkBjG;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAY5E"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DIGEST_MAX = void 0;
|
|
4
|
+
exports.recallableHits = recallableHits;
|
|
4
5
|
exports.rankFileHits = rankFileHits;
|
|
5
6
|
exports.digestFileHits = digestFileHits;
|
|
6
7
|
exports.formatFileDigest = formatFileDigest;
|
|
@@ -22,6 +23,17 @@ function headline(query) {
|
|
|
22
23
|
const q = query.replace(/\s+/g, ' ').trim();
|
|
23
24
|
return q.length > HEADLINE_MAX ? `${q.slice(0, HEADLINE_MAX - 1)}…` : q;
|
|
24
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* The hits worth naming in a note: commit-log ingests are dropped. They restate `git log`, and on
|
|
28
|
+
* a hub file they were most of the list — Lemma's own repo held 295 of them, recalled twice in
|
|
29
|
+
* total, and a file with no deliberate memory got a note made only of them.
|
|
30
|
+
*/
|
|
31
|
+
function recallableHits(brain, hits) {
|
|
32
|
+
return hits.filter((h) => {
|
|
33
|
+
const entry = brain.getEntry(h.id);
|
|
34
|
+
return !entry || (0, TheBrainV2_1.entrySource)(entry) !== 'auto-git';
|
|
35
|
+
});
|
|
36
|
+
}
|
|
25
37
|
/**
|
|
26
38
|
* Relevance without a query to rank against: a failed approach first (repeating it is the
|
|
27
39
|
* costliest mistake), then memories someone wrote on purpose over commit-log ingests (a hub
|
|
@@ -65,7 +77,7 @@ function digestFileHits(brain, hits, max = exports.DIGEST_MAX) {
|
|
|
65
77
|
const failed = h.outcome === 'failed' ? ', FAILED approach' : '';
|
|
66
78
|
return ` • ${h.id} (${verdict}, ${age}${failed}): ${headline(h.query)}`;
|
|
67
79
|
});
|
|
68
|
-
return { total: hits.length, lines, failedCount: hits.filter((h) => h.outcome === 'failed').length };
|
|
80
|
+
return { total: hits.length, lines, ids: top.map((h) => h.id), failedCount: hits.filter((h) => h.outcome === 'failed').length };
|
|
69
81
|
}
|
|
70
82
|
/** The full note: header, the digest lines, and what to do with them. */
|
|
71
83
|
function formatFileDigest(subject, digest) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recallDigest.js","sourceRoot":"","sources":["../../../src/subconscious/recallDigest.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"recallDigest.js","sourceRoot":"","sources":["../../../src/subconscious/recallDigest.ts"],"names":[],"mappings":";;;AA0CA,wCAKC;AAQD,oCAoBC;AAED,wCAkBC;AAGD,4CAYC;AA9GD,6CAA4D;AAC5D,gDAA6C;AAE7C;;;;;;;;;GASG;AAEU,QAAA,UAAU,GAAG,CAAC,CAAC;AAC5B,MAAM,YAAY,GAAG,GAAG,CAAC;AAiBzB,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,OAAO,CAAC,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAsB,KAAiB,EAAE,IAAS;IAC9E,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,IAAI,IAAA,wBAAW,EAAC,KAAK,CAAC,KAAK,UAAU,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,KAAiB,EAAE,IAAiB;IAC/D,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO;YACL,CAAC,CAAC,EAAE;YACJ;gBACE,MAAM,EAAE,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,UAAU,EAAE,KAAK,IAAI,IAAA,wBAAW,EAAC,KAAK,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;gBACtB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC,IAAI,CAAC;aAC9C;SACF,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IACF,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC;QAC1B,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IAClG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,cAAc,CAAC,KAAiB,EAAE,IAAiB,EAAE,GAAG,GAAG,kBAAU;IACnF,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,4FAA4F;IAC5F,6BAA6B;IAC7B,IAAI,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC;QAC7C,MAAM,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QAChD,MAAM,GAAG,GAAG,IAAA,mBAAQ,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,OAAO,CAAC,CAAC,EAAE,KAAK,OAAO,KAAK,GAAG,GAAG,MAAM,MAAM,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IAC3E,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;AAClI,CAAC;AAED,yEAAyE;AACzE,SAAgB,gBAAgB,CAAC,OAAe,EAAE,MAAkB;IAClE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAC7C,MAAM,MAAM,GACV,KAAK,KAAK,CAAC;QACT,CAAC,CAAC,qCAAqC,OAAO,GAAG;QACjD,CAAC,CAAC,sBAAsB,KAAK,mBAAmB,OAAO,sBAAsB,CAAC;IAClF,MAAM,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,kEAAkE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvI,4FAA4F;IAC5F,MAAM,MAAM,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,WAAW,WAAW,8DAA8D,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1K,MAAM,MAAM,GACV,8GAA8G,CAAC;IACjH,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbol lookup for languages the TypeScript compiler cannot parse.
|
|
3
|
+
*
|
|
4
|
+
* Freshness tracks the symbols a memory names instead of the whole file, so an edit elsewhere
|
|
5
|
+
* in the file does not make the memory STALE. That only worked for .ts/.js: in a Python, Go or
|
|
6
|
+
* Java project every memory tracked a whole file and went STALE on any edit to it, which is
|
|
7
|
+
* exactly the noise symbol tracking exists to remove.
|
|
8
|
+
*
|
|
9
|
+
* This is a declaration locator, not a parser. It finds where a named function/class/method
|
|
10
|
+
* starts and where its block ends (indentation for Python and Ruby, brace depth for the rest).
|
|
11
|
+
* It is deliberately conservative in both directions the Brain cares about:
|
|
12
|
+
* - a name it cannot find, or finds in more than one place, returns null — the caller then
|
|
13
|
+
* tracks the whole file, which can only be too sensitive, never blind;
|
|
14
|
+
* - comments are stripped only where a scanner that tracks string literals is sure they are
|
|
15
|
+
* comments, so a `#` or `//` inside a string is never mistaken for one. Treating a code
|
|
16
|
+
* change as cosmetic would stamp "fresh" on a memory whose subject changed.
|
|
17
|
+
*/
|
|
18
|
+
export declare function supportsOtherLanguage(filePath: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* The source text of the named declaration, or null when it is absent or ambiguous.
|
|
21
|
+
* `Class.member` looks the member up inside the class's own block.
|
|
22
|
+
*/
|
|
23
|
+
export declare function findOtherLanguageSymbol(filePath: string, source: string, name: string): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* The declaration with comments dropped and whitespace collapsed, for the cosmetic-vs-real
|
|
26
|
+
* change test. Python keeps each line's indentation because it is syntax there; everything
|
|
27
|
+
* else collapses to one token stream. Anything the scanner is unsure about stays in, so the
|
|
28
|
+
* worst outcome is a cosmetic edit reported as a change, never a change reported as cosmetic.
|
|
29
|
+
*/
|
|
30
|
+
export declare function normalizeOtherLanguage(filePath: string, source: string): string;
|
|
31
|
+
//# sourceMappingURL=OtherLanguageSymbols.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OtherLanguageSymbols.d.ts","sourceRoot":"","sources":["../../../src/utils/OtherLanguageSymbols.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA2DH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/D;AAWD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAarG;AAuGD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA8C/E"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Symbol lookup for languages the TypeScript compiler cannot parse.
|
|
4
|
+
*
|
|
5
|
+
* Freshness tracks the symbols a memory names instead of the whole file, so an edit elsewhere
|
|
6
|
+
* in the file does not make the memory STALE. That only worked for .ts/.js: in a Python, Go or
|
|
7
|
+
* Java project every memory tracked a whole file and went STALE on any edit to it, which is
|
|
8
|
+
* exactly the noise symbol tracking exists to remove.
|
|
9
|
+
*
|
|
10
|
+
* This is a declaration locator, not a parser. It finds where a named function/class/method
|
|
11
|
+
* starts and where its block ends (indentation for Python and Ruby, brace depth for the rest).
|
|
12
|
+
* It is deliberately conservative in both directions the Brain cares about:
|
|
13
|
+
* - a name it cannot find, or finds in more than one place, returns null — the caller then
|
|
14
|
+
* tracks the whole file, which can only be too sensitive, never blind;
|
|
15
|
+
* - comments are stripped only where a scanner that tracks string literals is sure they are
|
|
16
|
+
* comments, so a `#` or `//` inside a string is never mistaken for one. Treating a code
|
|
17
|
+
* change as cosmetic would stamp "fresh" on a memory whose subject changed.
|
|
18
|
+
*/
|
|
19
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
20
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.supportsOtherLanguage = supportsOtherLanguage;
|
|
24
|
+
exports.findOtherLanguageSymbol = findOtherLanguageSymbol;
|
|
25
|
+
exports.normalizeOtherLanguage = normalizeOtherLanguage;
|
|
26
|
+
const path_1 = __importDefault(require("path"));
|
|
27
|
+
const C_LIKE_COMMENTS = { lineComment: ['//'], blockComment: ['/*', '*/'] };
|
|
28
|
+
const LANGS = {
|
|
29
|
+
'.py': {
|
|
30
|
+
style: 'indent',
|
|
31
|
+
decl: ['^(\\s*)(?:async\\s+)?(?:def|class)\\s+$NAME\\b'],
|
|
32
|
+
lineComment: ['#'],
|
|
33
|
+
quotes: ['"""', "'''", '"', "'"],
|
|
34
|
+
},
|
|
35
|
+
'.rb': {
|
|
36
|
+
style: 'ruby',
|
|
37
|
+
decl: ['^(\\s*)(?:def|class|module)\\s+(?:self\\.)?$NAME\\b'],
|
|
38
|
+
lineComment: ['#'],
|
|
39
|
+
quotes: ['"', "'"],
|
|
40
|
+
},
|
|
41
|
+
'.go': {
|
|
42
|
+
style: 'braces',
|
|
43
|
+
decl: ['^(\\s*)func\\s+(?:\\([^)]*\\)\\s*)?$NAME\\s*[(\\[]', '^(\\s*)type\\s+$NAME\\b'],
|
|
44
|
+
...C_LIKE_COMMENTS,
|
|
45
|
+
quotes: ['`', '"', "'"],
|
|
46
|
+
},
|
|
47
|
+
'.rs': {
|
|
48
|
+
style: 'braces',
|
|
49
|
+
decl: ['^(\\s*)(?:pub(?:\\([^)]*\\))?\\s+)?(?:async\\s+)?(?:unsafe\\s+)?(?:fn|struct|enum|trait)\\s+$NAME\\b'],
|
|
50
|
+
...C_LIKE_COMMENTS,
|
|
51
|
+
quotes: ['"', "'"],
|
|
52
|
+
},
|
|
53
|
+
// Java/Kotlin/C#/PHP/Swift: a method or class declaration — modifiers and a return type, then
|
|
54
|
+
// the name and an opening paren or brace. A call such as `foo(x);` has no brace and no type.
|
|
55
|
+
'.java': { style: 'braces', decl: braceDecl(), ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
|
|
56
|
+
'.kt': { style: 'braces', decl: ['^(\\s*)(?:[\\w@]+\\s+)*(?:fun|class|object|interface)\\s+(?:<[^>]*>\\s*)?$NAME\\b'], ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
|
|
57
|
+
'.cs': { style: 'braces', decl: braceDecl(), ...C_LIKE_COMMENTS, quotes: ['"', "'"] },
|
|
58
|
+
'.php': { style: 'braces', decl: ['^(\\s*)(?:(?:public|private|protected|static|abstract|final)\\s+)*(?:function|class|interface|trait)\\s+&?$NAME\\b'], ...C_LIKE_COMMENTS, lineComment: ['//', '#'], quotes: ['"', "'"] },
|
|
59
|
+
'.swift': { style: 'braces', decl: ['^(\\s*)(?:[\\w@]+\\s+)*(?:func|class|struct|enum|protocol)\\s+$NAME\\b'], ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
|
|
60
|
+
};
|
|
61
|
+
function braceDecl() {
|
|
62
|
+
return [
|
|
63
|
+
'^(\\s*)(?:(?:public|private|protected|internal|static|final|abstract|virtual|override|async|sealed|partial)\\s+)*(?:class|interface|enum|record|struct)\\s+$NAME\\b',
|
|
64
|
+
'^(\\s*)(?:(?:public|private|protected|internal|static|final|abstract|virtual|override|async|synchronized)\\s+)+[\\w<>\\[\\],.?\\s]+?\\s$NAME\\s*\\(',
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
function supportsOtherLanguage(filePath) {
|
|
68
|
+
return path_1.default.extname(filePath).toLowerCase() in LANGS;
|
|
69
|
+
}
|
|
70
|
+
const escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
71
|
+
/** Index of the first line at or after `from` whose text is not blank. */
|
|
72
|
+
function nextCodeLine(lines, from) {
|
|
73
|
+
let i = from;
|
|
74
|
+
while (i < lines.length && lines[i].trim() === '')
|
|
75
|
+
i++;
|
|
76
|
+
return i;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The source text of the named declaration, or null when it is absent or ambiguous.
|
|
80
|
+
* `Class.member` looks the member up inside the class's own block.
|
|
81
|
+
*/
|
|
82
|
+
function findOtherLanguageSymbol(filePath, source, name) {
|
|
83
|
+
const lang = LANGS[path_1.default.extname(filePath).toLowerCase()];
|
|
84
|
+
if (!lang)
|
|
85
|
+
return null;
|
|
86
|
+
const [owner, member] = name.split('.');
|
|
87
|
+
if (name.split('.').length > 2)
|
|
88
|
+
return null;
|
|
89
|
+
const lines = source.split(/\r?\n/);
|
|
90
|
+
const ownerBlock = locate(lang, lines, 0, lines.length, owner, true);
|
|
91
|
+
if (!ownerBlock)
|
|
92
|
+
return null;
|
|
93
|
+
if (!member)
|
|
94
|
+
return lines.slice(ownerBlock.start, ownerBlock.end).join('\n');
|
|
95
|
+
// The member must sit inside the owner's block; the owner line itself is not searched.
|
|
96
|
+
const inner = locate(lang, lines, ownerBlock.start + 1, ownerBlock.end, member, false);
|
|
97
|
+
return inner ? lines.slice(inner.start, inner.end).join('\n') : null;
|
|
98
|
+
}
|
|
99
|
+
function locate(lang, lines, from, to, name, topLevelOnly) {
|
|
100
|
+
const patterns = lang.decl.map((d) => new RegExp(d.replace(/\$NAME/g, escapeRe(name))));
|
|
101
|
+
const hits = [];
|
|
102
|
+
for (let i = from; i < to; i++) {
|
|
103
|
+
for (const re of patterns) {
|
|
104
|
+
const m = re.exec(lines[i]);
|
|
105
|
+
if (m) {
|
|
106
|
+
hits.push({ line: i, indent: m[1].length });
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Ambiguous (an overload, a redefinition, a nested helper of the same name): do not guess.
|
|
112
|
+
// For a top-level lookup, only the least-indented hit counts, so a method with the same name
|
|
113
|
+
// as a function does not make the function unfindable.
|
|
114
|
+
const pool = topLevelOnly && hits.length > 1 ? hits.filter((h) => h.indent === Math.min(...hits.map((x) => x.indent))) : hits;
|
|
115
|
+
if (pool.length !== 1)
|
|
116
|
+
return null;
|
|
117
|
+
const { line, indent } = pool[0];
|
|
118
|
+
const end = blockEnd(lang, lines, line, indent, to);
|
|
119
|
+
if (end === null)
|
|
120
|
+
return null;
|
|
121
|
+
// A decorator or annotation directly above belongs to the declaration.
|
|
122
|
+
let start = line;
|
|
123
|
+
while (start > from && /^\s*(@\w|#\[)/.test(lines[start - 1]))
|
|
124
|
+
start--;
|
|
125
|
+
return { start, end };
|
|
126
|
+
}
|
|
127
|
+
function blockEnd(lang, lines, line, indent, limit) {
|
|
128
|
+
if (lang.style === 'indent') {
|
|
129
|
+
// The block is every following line indented deeper than the declaration (blank lines
|
|
130
|
+
// inside it included); a continuation of a multi-line signature is deeper too.
|
|
131
|
+
let end = line + 1;
|
|
132
|
+
for (let i = line + 1; i < limit; i++) {
|
|
133
|
+
if (lines[i].trim() === '')
|
|
134
|
+
continue;
|
|
135
|
+
const ind = lines[i].match(/^\s*/)[0].length;
|
|
136
|
+
if (ind <= indent)
|
|
137
|
+
break;
|
|
138
|
+
end = i + 1;
|
|
139
|
+
}
|
|
140
|
+
return end;
|
|
141
|
+
}
|
|
142
|
+
if (lang.style === 'ruby') {
|
|
143
|
+
for (let i = line + 1; i < limit; i++) {
|
|
144
|
+
if (new RegExp(`^\\s{${indent}}end\\b`).test(lines[i]))
|
|
145
|
+
return i + 1;
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
// Braces: from the declaration, count { and } outside strings and comments until balanced.
|
|
150
|
+
let depth = 0;
|
|
151
|
+
let opened = false;
|
|
152
|
+
let inBlock = false;
|
|
153
|
+
for (let i = line; i < limit; i++) {
|
|
154
|
+
const text = lines[i];
|
|
155
|
+
let pos = 0;
|
|
156
|
+
while (pos < text.length) {
|
|
157
|
+
if (inBlock) {
|
|
158
|
+
const close = text.indexOf(lang.blockComment[1], pos);
|
|
159
|
+
if (close < 0) {
|
|
160
|
+
pos = text.length;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
pos = close + lang.blockComment[1].length;
|
|
164
|
+
inBlock = false;
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (lang.blockComment && text.startsWith(lang.blockComment[0], pos)) {
|
|
168
|
+
inBlock = true;
|
|
169
|
+
pos += lang.blockComment[0].length;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (lang.lineComment.some((c) => text.startsWith(c, pos)))
|
|
173
|
+
break;
|
|
174
|
+
const q = lang.quotes.find((c) => text.startsWith(c, pos));
|
|
175
|
+
if (q) {
|
|
176
|
+
pos = skipString(text, pos, q);
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const ch = text[pos];
|
|
180
|
+
if (ch === '{') {
|
|
181
|
+
depth++;
|
|
182
|
+
opened = true;
|
|
183
|
+
}
|
|
184
|
+
else if (ch === '}') {
|
|
185
|
+
depth--;
|
|
186
|
+
if (opened && depth === 0)
|
|
187
|
+
return i + 1;
|
|
188
|
+
}
|
|
189
|
+
pos++;
|
|
190
|
+
}
|
|
191
|
+
// A declaration with no body (an interface method, an abstract one) ends at its semicolon.
|
|
192
|
+
if (!opened && /;\s*$/.test(text))
|
|
193
|
+
return i + 1;
|
|
194
|
+
}
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
/** Position after the string literal starting at `pos`; an unterminated one ends the line. */
|
|
198
|
+
function skipString(text, pos, quote) {
|
|
199
|
+
return scanString(text, pos, quote).end;
|
|
200
|
+
}
|
|
201
|
+
function scanString(text, pos, quote) {
|
|
202
|
+
let i = pos + quote.length;
|
|
203
|
+
while (i < text.length) {
|
|
204
|
+
if (text[i] === '\\' && quote !== '`') {
|
|
205
|
+
i += 2;
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
if (text.startsWith(quote, i))
|
|
209
|
+
return { end: i + quote.length, closed: true };
|
|
210
|
+
i++;
|
|
211
|
+
}
|
|
212
|
+
return { end: text.length, closed: false };
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* The declaration with comments dropped and whitespace collapsed, for the cosmetic-vs-real
|
|
216
|
+
* change test. Python keeps each line's indentation because it is syntax there; everything
|
|
217
|
+
* else collapses to one token stream. Anything the scanner is unsure about stays in, so the
|
|
218
|
+
* worst outcome is a cosmetic edit reported as a change, never a change reported as cosmetic.
|
|
219
|
+
*/
|
|
220
|
+
function normalizeOtherLanguage(filePath, source) {
|
|
221
|
+
const lang = LANGS[path_1.default.extname(filePath).toLowerCase()];
|
|
222
|
+
if (!lang)
|
|
223
|
+
return source;
|
|
224
|
+
const out = [];
|
|
225
|
+
let inBlock = false;
|
|
226
|
+
let openQuote = null; // a triple-quoted or backtick string spanning lines
|
|
227
|
+
for (const raw of source.split(/\r?\n/)) {
|
|
228
|
+
let kept = '';
|
|
229
|
+
let pos = 0;
|
|
230
|
+
if (openQuote) {
|
|
231
|
+
const close = raw.indexOf(openQuote);
|
|
232
|
+
if (close < 0) {
|
|
233
|
+
out.push(raw);
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
kept = raw.slice(0, close + openQuote.length);
|
|
237
|
+
pos = close + openQuote.length;
|
|
238
|
+
openQuote = null;
|
|
239
|
+
}
|
|
240
|
+
while (pos < raw.length) {
|
|
241
|
+
if (inBlock) {
|
|
242
|
+
const close = raw.indexOf(lang.blockComment[1], pos);
|
|
243
|
+
if (close < 0) {
|
|
244
|
+
pos = raw.length;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
pos = close + lang.blockComment[1].length;
|
|
248
|
+
inBlock = false;
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (lang.blockComment && raw.startsWith(lang.blockComment[0], pos)) {
|
|
252
|
+
inBlock = true;
|
|
253
|
+
pos += lang.blockComment[0].length;
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
if (lang.lineComment.some((c) => raw.startsWith(c, pos)))
|
|
257
|
+
break;
|
|
258
|
+
const q = lang.quotes.find((c) => raw.startsWith(c, pos));
|
|
259
|
+
if (q) {
|
|
260
|
+
const { end, closed } = scanString(raw, pos, q);
|
|
261
|
+
kept += raw.slice(pos, end);
|
|
262
|
+
pos = end;
|
|
263
|
+
if (!closed && (q.length === 3 || q === '`'))
|
|
264
|
+
openQuote = q;
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
kept += raw[pos++];
|
|
268
|
+
}
|
|
269
|
+
if (lang.style === 'indent') {
|
|
270
|
+
const indent = raw.match(/^\s*/)[0];
|
|
271
|
+
const body = kept.trim().replace(/[ \t]+/g, ' ');
|
|
272
|
+
if (body)
|
|
273
|
+
out.push(indent + body);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
const body = kept.trim().replace(/\s+/g, ' ');
|
|
277
|
+
if (body)
|
|
278
|
+
out.push(body);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return lang.style === 'indent' ? out.join('\n') : out.join(' ');
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=OtherLanguageSymbols.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OtherLanguageSymbols.js","sourceRoot":"","sources":["../../../src/utils/OtherLanguageSymbols.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,6 +62,23 @@ export interface NetStats {
|
|
|
62
62
|
/** tokensSaved / tokensSpent. Below 1.0 means Lemma is not paying for itself. */
|
|
63
63
|
ratio: number;
|
|
64
64
|
}
|
|
65
|
+
/** Tokens saved and spent on one local calendar day. */
|
|
66
|
+
export interface DayTotals {
|
|
67
|
+
saved: number;
|
|
68
|
+
spent: number;
|
|
69
|
+
}
|
|
70
|
+
/** Net position over the last `days` days — the trend the all-time totals hide. */
|
|
71
|
+
export interface RecentStats {
|
|
72
|
+
days: number;
|
|
73
|
+
/** First day of the window (YYYY-MM-DD, local time). */
|
|
74
|
+
since: string;
|
|
75
|
+
/** Days in the window that recorded anything. */
|
|
76
|
+
daysWithData: number;
|
|
77
|
+
tokensSaved: number;
|
|
78
|
+
tokensSpent: number;
|
|
79
|
+
netTokens: number;
|
|
80
|
+
netCost: number;
|
|
81
|
+
}
|
|
65
82
|
export interface SavingsSnapshot {
|
|
66
83
|
clipboard: SourceStats;
|
|
67
84
|
contextSqueeze: SourceStats;
|
|
@@ -72,6 +89,12 @@ export interface SavingsSnapshot {
|
|
|
72
89
|
costs: Record<CostSource, CostStats>;
|
|
73
90
|
totalCost: CostStats;
|
|
74
91
|
net: NetStats;
|
|
92
|
+
/**
|
|
93
|
+
* The last RECENT_WINDOW_DAYS days. The all-time totals mix every configuration Lemma ever
|
|
94
|
+
* ran with; this shows what it does now. Empty (daysWithData 0) for ledgers written before
|
|
95
|
+
* daily totals existed — those days were never recorded per day, and are not invented.
|
|
96
|
+
*/
|
|
97
|
+
recent: RecentStats;
|
|
75
98
|
sessionStartedAt: string;
|
|
76
99
|
/**
|
|
77
100
|
* AN-01 attribution: per-tool / per-host / per-origin rollups of toolResult.
|
|
@@ -95,6 +118,8 @@ declare class SavingsLedger {
|
|
|
95
118
|
/** Per-origin rollup: "lemma" vs anything explicitly reported otherwise. */
|
|
96
119
|
private costByOrigin;
|
|
97
120
|
private readonly sessionStartedAt;
|
|
121
|
+
/** Local day (YYYY-MM-DD) -> tokens saved/spent that day. */
|
|
122
|
+
private daily;
|
|
98
123
|
constructor();
|
|
99
124
|
private load;
|
|
100
125
|
private save;
|
|
@@ -105,6 +130,8 @@ declare class SavingsLedger {
|
|
|
105
130
|
* @param charsAfter Resulting char count after compression/routing
|
|
106
131
|
*/
|
|
107
132
|
record(source: SavingsSource, charsBefore: number, charsAfter: number): void;
|
|
133
|
+
/** Adds to today's totals and drops days past MAX_DAYS_KEPT. */
|
|
134
|
+
private bumpDay;
|
|
108
135
|
/**
|
|
109
136
|
* Record a savings event directly in tokens (for sources that already know their token count).
|
|
110
137
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SavingsLedger.d.ts","sourceRoot":"","sources":["../../../src/utils/SavingsLedger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,gBAAgB,GAAG,cAAc,GAAG,mBAAmB,GAAG,OAAO,CAAC;AAE5G;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,WAAW,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oGAAoG;IACpG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,MAAM,WAAW,QAAQ;IACvB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,WAAW,CAAC;IACvB,cAAc,EAAE,WAAW,CAAC;IAC5B,YAAY,EAAE,WAAW,CAAC;IAC1B,iBAAiB,EAAE,WAAW,CAAC;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,EAAE,QAAQ,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,eAAe,EAAE;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACtC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;KACzC,CAAC;CACH;AAED,sFAAsF;AACtF,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAyB3C,cAAM,aAAa;IACjB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,KAAK,CAAgC;IAC7C,iFAAiF;IACjF,OAAO,CAAC,UAAU,CAAgC;IAClD,6EAA6E;IAC7E,OAAO,CAAC,UAAU,CAAgC;IAClD,4EAA4E;IAC5E,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;;
|
|
1
|
+
{"version":3,"file":"SavingsLedger.d.ts","sourceRoot":"","sources":["../../../src/utils/SavingsLedger.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,13 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
16
16
|
const path_1 = __importDefault(require("path"));
|
|
17
17
|
/** Hard cap on tracked tool names so a hostile caller cannot grow ledger.json unbounded. */
|
|
18
18
|
const MAX_ATTRIBUTED_TOOLS = 300;
|
|
19
|
+
/** Daily totals kept on disk: enough for any window the dashboard shows, bounded. */
|
|
20
|
+
const MAX_DAYS_KEPT = 90;
|
|
21
|
+
const RECENT_WINDOW_DAYS = 7;
|
|
22
|
+
function dayKey(d = new Date()) {
|
|
23
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
24
|
+
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
|
25
|
+
}
|
|
19
26
|
/** Average blended cost per input token across GPT-4o / Claude Sonnet / Gemini Pro */
|
|
20
27
|
exports.AVG_COST_PER_TOKEN = 0.000008; // $0.008 per 1K tokens
|
|
21
28
|
const HOME = process.env.HOME || process.env.USERPROFILE || '~';
|
|
@@ -46,6 +53,8 @@ function readRollup(raw) {
|
|
|
46
53
|
}
|
|
47
54
|
class SavingsLedger {
|
|
48
55
|
constructor() {
|
|
56
|
+
/** Local day (YYYY-MM-DD) -> tokens saved/spent that day. */
|
|
57
|
+
this.daily = {};
|
|
49
58
|
this.sessionStartedAt = new Date().toISOString();
|
|
50
59
|
this.sources = {
|
|
51
60
|
clipboard: { events: 0, tokensSaved: 0, costSaved: 0 },
|
|
@@ -102,6 +111,18 @@ class SavingsLedger {
|
|
|
102
111
|
this.costByHost = readRollup(parsedCosts._byHost);
|
|
103
112
|
this.costByOrigin = readRollup(parsedCosts._byOrigin);
|
|
104
113
|
}
|
|
114
|
+
const parsedDaily = parsed._daily;
|
|
115
|
+
if (parsedDaily && typeof parsedDaily === 'object' && !Array.isArray(parsedDaily)) {
|
|
116
|
+
for (const [day, v] of Object.entries(parsedDaily)) {
|
|
117
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(day) || !v || typeof v !== 'object')
|
|
118
|
+
continue;
|
|
119
|
+
const saved = Number(v.saved);
|
|
120
|
+
const spent = Number(v.spent);
|
|
121
|
+
if (!Number.isFinite(saved) || !Number.isFinite(spent) || saved < 0 || spent < 0)
|
|
122
|
+
continue;
|
|
123
|
+
this.daily[day] = { saved: Math.floor(saved), spent: Math.floor(spent) };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
105
126
|
}
|
|
106
127
|
}
|
|
107
128
|
}
|
|
@@ -121,6 +142,7 @@ class SavingsLedger {
|
|
|
121
142
|
const payload = {
|
|
122
143
|
...this.sources,
|
|
123
144
|
_costs: { ...this.costs, _byTool: this.costByTool, _byHost: this.costByHost, _byOrigin: this.costByOrigin },
|
|
145
|
+
_daily: this.daily,
|
|
124
146
|
// Stays 2: the rollups are additive keys a v2 reader already ignores, so no
|
|
125
147
|
// format bump — and the existing round-trip contract pins this number.
|
|
126
148
|
_version: 2,
|
|
@@ -146,8 +168,18 @@ class SavingsLedger {
|
|
|
146
168
|
this.sources[source].events++;
|
|
147
169
|
this.sources[source].tokensSaved += tokensSaved;
|
|
148
170
|
this.sources[source].costSaved += costSaved;
|
|
171
|
+
this.bumpDay('saved', tokensSaved);
|
|
149
172
|
this.save();
|
|
150
173
|
}
|
|
174
|
+
/** Adds to today's totals and drops days past MAX_DAYS_KEPT. */
|
|
175
|
+
bumpDay(side, tokens) {
|
|
176
|
+
const today = dayKey();
|
|
177
|
+
const slot = this.daily[today] ?? (this.daily[today] = { saved: 0, spent: 0 });
|
|
178
|
+
slot[side] += tokens;
|
|
179
|
+
const days = Object.keys(this.daily).sort();
|
|
180
|
+
for (const old of days.slice(0, Math.max(0, days.length - MAX_DAYS_KEPT)))
|
|
181
|
+
delete this.daily[old];
|
|
182
|
+
}
|
|
151
183
|
/**
|
|
152
184
|
* Record a savings event directly in tokens (for sources that already know their token count).
|
|
153
185
|
*/
|
|
@@ -158,6 +190,7 @@ class SavingsLedger {
|
|
|
158
190
|
this.sources[source].events++;
|
|
159
191
|
this.sources[source].tokensSaved += tokensSaved;
|
|
160
192
|
this.sources[source].costSaved += costSaved;
|
|
193
|
+
this.bumpDay('saved', tokensSaved);
|
|
161
194
|
this.save();
|
|
162
195
|
}
|
|
163
196
|
/**
|
|
@@ -175,6 +208,7 @@ class SavingsLedger {
|
|
|
175
208
|
this.costs[source].events++;
|
|
176
209
|
this.costs[source].tokensSpent += tokensSpent;
|
|
177
210
|
this.costs[source].costSpent += tokensSpent * exports.AVG_COST_PER_TOKEN;
|
|
211
|
+
this.bumpDay('spent', tokensSpent);
|
|
178
212
|
if (source === 'toolResult') {
|
|
179
213
|
// byTool needs an explicit tool name; host/origin ALWAYS annotate (defaulting
|
|
180
214
|
// to unknown/lemma) so the rollups sum to the bucket totals — a smoke test
|
|
@@ -232,12 +266,28 @@ class SavingsLedger {
|
|
|
232
266
|
? total.tokensSaved / totalCost.tokensSpent
|
|
233
267
|
: (total.tokensSaved > 0 ? Infinity : 0),
|
|
234
268
|
};
|
|
269
|
+
const start = new Date();
|
|
270
|
+
start.setDate(start.getDate() - (RECENT_WINDOW_DAYS - 1));
|
|
271
|
+
const since = dayKey(start);
|
|
272
|
+
const inWindow = Object.entries(this.daily).filter(([day]) => day >= since);
|
|
273
|
+
const recentSaved = inWindow.reduce((n, [, d]) => n + d.saved, 0);
|
|
274
|
+
const recentSpent = inWindow.reduce((n, [, d]) => n + d.spent, 0);
|
|
275
|
+
const recent = {
|
|
276
|
+
days: RECENT_WINDOW_DAYS,
|
|
277
|
+
since,
|
|
278
|
+
daysWithData: inWindow.length,
|
|
279
|
+
tokensSaved: recentSaved,
|
|
280
|
+
tokensSpent: recentSpent,
|
|
281
|
+
netTokens: recentSaved - recentSpent,
|
|
282
|
+
netCost: (recentSaved - recentSpent) * exports.AVG_COST_PER_TOKEN,
|
|
283
|
+
};
|
|
235
284
|
return {
|
|
236
285
|
...this.sources,
|
|
237
286
|
total,
|
|
238
287
|
costs: { ...this.costs },
|
|
239
288
|
totalCost,
|
|
240
289
|
net,
|
|
290
|
+
recent,
|
|
241
291
|
sessionStartedAt: this.sessionStartedAt,
|
|
242
292
|
costAttribution: {
|
|
243
293
|
byTool: { ...this.costByTool },
|
|
@@ -301,6 +351,7 @@ class SavingsLedger {
|
|
|
301
351
|
this.costByTool = {};
|
|
302
352
|
this.costByHost = {};
|
|
303
353
|
this.costByOrigin = {};
|
|
354
|
+
this.daily = {};
|
|
304
355
|
this.save();
|
|
305
356
|
}
|
|
306
357
|
}
|