@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,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;
|
|
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"}
|
|
@@ -16,6 +16,17 @@ function headline(query) {
|
|
|
16
16
|
const q = query.replace(/\s+/g, ' ').trim();
|
|
17
17
|
return q.length > HEADLINE_MAX ? `${q.slice(0, HEADLINE_MAX - 1)}…` : q;
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* The hits worth naming in a note: commit-log ingests are dropped. They restate `git log`, and on
|
|
21
|
+
* a hub file they were most of the list — Lemma's own repo held 295 of them, recalled twice in
|
|
22
|
+
* total, and a file with no deliberate memory got a note made only of them.
|
|
23
|
+
*/
|
|
24
|
+
export function recallableHits(brain, hits) {
|
|
25
|
+
return hits.filter((h) => {
|
|
26
|
+
const entry = brain.getEntry(h.id);
|
|
27
|
+
return !entry || entrySource(entry) !== 'auto-git';
|
|
28
|
+
});
|
|
29
|
+
}
|
|
19
30
|
/**
|
|
20
31
|
* Relevance without a query to rank against: a failed approach first (repeating it is the
|
|
21
32
|
* costliest mistake), then memories someone wrote on purpose over commit-log ingests (a hub
|
|
@@ -59,7 +70,7 @@ export function digestFileHits(brain, hits, max = DIGEST_MAX) {
|
|
|
59
70
|
const failed = h.outcome === 'failed' ? ', FAILED approach' : '';
|
|
60
71
|
return ` • ${h.id} (${verdict}, ${age}${failed}): ${headline(h.query)}`;
|
|
61
72
|
});
|
|
62
|
-
return { total: hits.length, lines, failedCount: hits.filter((h) => h.outcome === 'failed').length };
|
|
73
|
+
return { total: hits.length, lines, ids: top.map((h) => h.id), failedCount: hits.filter((h) => h.outcome === 'failed').length };
|
|
63
74
|
}
|
|
64
75
|
/** The full note: header, the digest lines, and what to do with them. */
|
|
65
76
|
export function formatFileDigest(subject, digest) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recallDigest.js","sourceRoot":"","sources":["../../../src/subconscious/recallDigest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAmB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B,MAAM,YAAY,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"recallDigest.js","sourceRoot":"","sources":["../../../src/subconscious/recallDigest.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,275 @@
|
|
|
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
|
+
import path from 'path';
|
|
19
|
+
const C_LIKE_COMMENTS = { lineComment: ['//'], blockComment: ['/*', '*/'] };
|
|
20
|
+
const LANGS = {
|
|
21
|
+
'.py': {
|
|
22
|
+
style: 'indent',
|
|
23
|
+
decl: ['^(\\s*)(?:async\\s+)?(?:def|class)\\s+$NAME\\b'],
|
|
24
|
+
lineComment: ['#'],
|
|
25
|
+
quotes: ['"""', "'''", '"', "'"],
|
|
26
|
+
},
|
|
27
|
+
'.rb': {
|
|
28
|
+
style: 'ruby',
|
|
29
|
+
decl: ['^(\\s*)(?:def|class|module)\\s+(?:self\\.)?$NAME\\b'],
|
|
30
|
+
lineComment: ['#'],
|
|
31
|
+
quotes: ['"', "'"],
|
|
32
|
+
},
|
|
33
|
+
'.go': {
|
|
34
|
+
style: 'braces',
|
|
35
|
+
decl: ['^(\\s*)func\\s+(?:\\([^)]*\\)\\s*)?$NAME\\s*[(\\[]', '^(\\s*)type\\s+$NAME\\b'],
|
|
36
|
+
...C_LIKE_COMMENTS,
|
|
37
|
+
quotes: ['`', '"', "'"],
|
|
38
|
+
},
|
|
39
|
+
'.rs': {
|
|
40
|
+
style: 'braces',
|
|
41
|
+
decl: ['^(\\s*)(?:pub(?:\\([^)]*\\))?\\s+)?(?:async\\s+)?(?:unsafe\\s+)?(?:fn|struct|enum|trait)\\s+$NAME\\b'],
|
|
42
|
+
...C_LIKE_COMMENTS,
|
|
43
|
+
quotes: ['"', "'"],
|
|
44
|
+
},
|
|
45
|
+
// Java/Kotlin/C#/PHP/Swift: a method or class declaration — modifiers and a return type, then
|
|
46
|
+
// the name and an opening paren or brace. A call such as `foo(x);` has no brace and no type.
|
|
47
|
+
'.java': { style: 'braces', decl: braceDecl(), ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
|
|
48
|
+
'.kt': { style: 'braces', decl: ['^(\\s*)(?:[\\w@]+\\s+)*(?:fun|class|object|interface)\\s+(?:<[^>]*>\\s*)?$NAME\\b'], ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
|
|
49
|
+
'.cs': { style: 'braces', decl: braceDecl(), ...C_LIKE_COMMENTS, quotes: ['"', "'"] },
|
|
50
|
+
'.php': { style: 'braces', decl: ['^(\\s*)(?:(?:public|private|protected|static|abstract|final)\\s+)*(?:function|class|interface|trait)\\s+&?$NAME\\b'], ...C_LIKE_COMMENTS, lineComment: ['//', '#'], quotes: ['"', "'"] },
|
|
51
|
+
'.swift': { style: 'braces', decl: ['^(\\s*)(?:[\\w@]+\\s+)*(?:func|class|struct|enum|protocol)\\s+$NAME\\b'], ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
|
|
52
|
+
};
|
|
53
|
+
function braceDecl() {
|
|
54
|
+
return [
|
|
55
|
+
'^(\\s*)(?:(?:public|private|protected|internal|static|final|abstract|virtual|override|async|sealed|partial)\\s+)*(?:class|interface|enum|record|struct)\\s+$NAME\\b',
|
|
56
|
+
'^(\\s*)(?:(?:public|private|protected|internal|static|final|abstract|virtual|override|async|synchronized)\\s+)+[\\w<>\\[\\],.?\\s]+?\\s$NAME\\s*\\(',
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
export function supportsOtherLanguage(filePath) {
|
|
60
|
+
return path.extname(filePath).toLowerCase() in LANGS;
|
|
61
|
+
}
|
|
62
|
+
const escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
63
|
+
/** Index of the first line at or after `from` whose text is not blank. */
|
|
64
|
+
function nextCodeLine(lines, from) {
|
|
65
|
+
let i = from;
|
|
66
|
+
while (i < lines.length && lines[i].trim() === '')
|
|
67
|
+
i++;
|
|
68
|
+
return i;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The source text of the named declaration, or null when it is absent or ambiguous.
|
|
72
|
+
* `Class.member` looks the member up inside the class's own block.
|
|
73
|
+
*/
|
|
74
|
+
export function findOtherLanguageSymbol(filePath, source, name) {
|
|
75
|
+
const lang = LANGS[path.extname(filePath).toLowerCase()];
|
|
76
|
+
if (!lang)
|
|
77
|
+
return null;
|
|
78
|
+
const [owner, member] = name.split('.');
|
|
79
|
+
if (name.split('.').length > 2)
|
|
80
|
+
return null;
|
|
81
|
+
const lines = source.split(/\r?\n/);
|
|
82
|
+
const ownerBlock = locate(lang, lines, 0, lines.length, owner, true);
|
|
83
|
+
if (!ownerBlock)
|
|
84
|
+
return null;
|
|
85
|
+
if (!member)
|
|
86
|
+
return lines.slice(ownerBlock.start, ownerBlock.end).join('\n');
|
|
87
|
+
// The member must sit inside the owner's block; the owner line itself is not searched.
|
|
88
|
+
const inner = locate(lang, lines, ownerBlock.start + 1, ownerBlock.end, member, false);
|
|
89
|
+
return inner ? lines.slice(inner.start, inner.end).join('\n') : null;
|
|
90
|
+
}
|
|
91
|
+
function locate(lang, lines, from, to, name, topLevelOnly) {
|
|
92
|
+
const patterns = lang.decl.map((d) => new RegExp(d.replace(/\$NAME/g, escapeRe(name))));
|
|
93
|
+
const hits = [];
|
|
94
|
+
for (let i = from; i < to; i++) {
|
|
95
|
+
for (const re of patterns) {
|
|
96
|
+
const m = re.exec(lines[i]);
|
|
97
|
+
if (m) {
|
|
98
|
+
hits.push({ line: i, indent: m[1].length });
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Ambiguous (an overload, a redefinition, a nested helper of the same name): do not guess.
|
|
104
|
+
// For a top-level lookup, only the least-indented hit counts, so a method with the same name
|
|
105
|
+
// as a function does not make the function unfindable.
|
|
106
|
+
const pool = topLevelOnly && hits.length > 1 ? hits.filter((h) => h.indent === Math.min(...hits.map((x) => x.indent))) : hits;
|
|
107
|
+
if (pool.length !== 1)
|
|
108
|
+
return null;
|
|
109
|
+
const { line, indent } = pool[0];
|
|
110
|
+
const end = blockEnd(lang, lines, line, indent, to);
|
|
111
|
+
if (end === null)
|
|
112
|
+
return null;
|
|
113
|
+
// A decorator or annotation directly above belongs to the declaration.
|
|
114
|
+
let start = line;
|
|
115
|
+
while (start > from && /^\s*(@\w|#\[)/.test(lines[start - 1]))
|
|
116
|
+
start--;
|
|
117
|
+
return { start, end };
|
|
118
|
+
}
|
|
119
|
+
function blockEnd(lang, lines, line, indent, limit) {
|
|
120
|
+
if (lang.style === 'indent') {
|
|
121
|
+
// The block is every following line indented deeper than the declaration (blank lines
|
|
122
|
+
// inside it included); a continuation of a multi-line signature is deeper too.
|
|
123
|
+
let end = line + 1;
|
|
124
|
+
for (let i = line + 1; i < limit; i++) {
|
|
125
|
+
if (lines[i].trim() === '')
|
|
126
|
+
continue;
|
|
127
|
+
const ind = lines[i].match(/^\s*/)[0].length;
|
|
128
|
+
if (ind <= indent)
|
|
129
|
+
break;
|
|
130
|
+
end = i + 1;
|
|
131
|
+
}
|
|
132
|
+
return end;
|
|
133
|
+
}
|
|
134
|
+
if (lang.style === 'ruby') {
|
|
135
|
+
for (let i = line + 1; i < limit; i++) {
|
|
136
|
+
if (new RegExp(`^\\s{${indent}}end\\b`).test(lines[i]))
|
|
137
|
+
return i + 1;
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
// Braces: from the declaration, count { and } outside strings and comments until balanced.
|
|
142
|
+
let depth = 0;
|
|
143
|
+
let opened = false;
|
|
144
|
+
let inBlock = false;
|
|
145
|
+
for (let i = line; i < limit; i++) {
|
|
146
|
+
const text = lines[i];
|
|
147
|
+
let pos = 0;
|
|
148
|
+
while (pos < text.length) {
|
|
149
|
+
if (inBlock) {
|
|
150
|
+
const close = text.indexOf(lang.blockComment[1], pos);
|
|
151
|
+
if (close < 0) {
|
|
152
|
+
pos = text.length;
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
pos = close + lang.blockComment[1].length;
|
|
156
|
+
inBlock = false;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (lang.blockComment && text.startsWith(lang.blockComment[0], pos)) {
|
|
160
|
+
inBlock = true;
|
|
161
|
+
pos += lang.blockComment[0].length;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (lang.lineComment.some((c) => text.startsWith(c, pos)))
|
|
165
|
+
break;
|
|
166
|
+
const q = lang.quotes.find((c) => text.startsWith(c, pos));
|
|
167
|
+
if (q) {
|
|
168
|
+
pos = skipString(text, pos, q);
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const ch = text[pos];
|
|
172
|
+
if (ch === '{') {
|
|
173
|
+
depth++;
|
|
174
|
+
opened = true;
|
|
175
|
+
}
|
|
176
|
+
else if (ch === '}') {
|
|
177
|
+
depth--;
|
|
178
|
+
if (opened && depth === 0)
|
|
179
|
+
return i + 1;
|
|
180
|
+
}
|
|
181
|
+
pos++;
|
|
182
|
+
}
|
|
183
|
+
// A declaration with no body (an interface method, an abstract one) ends at its semicolon.
|
|
184
|
+
if (!opened && /;\s*$/.test(text))
|
|
185
|
+
return i + 1;
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
/** Position after the string literal starting at `pos`; an unterminated one ends the line. */
|
|
190
|
+
function skipString(text, pos, quote) {
|
|
191
|
+
return scanString(text, pos, quote).end;
|
|
192
|
+
}
|
|
193
|
+
function scanString(text, pos, quote) {
|
|
194
|
+
let i = pos + quote.length;
|
|
195
|
+
while (i < text.length) {
|
|
196
|
+
if (text[i] === '\\' && quote !== '`') {
|
|
197
|
+
i += 2;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (text.startsWith(quote, i))
|
|
201
|
+
return { end: i + quote.length, closed: true };
|
|
202
|
+
i++;
|
|
203
|
+
}
|
|
204
|
+
return { end: text.length, closed: false };
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* The declaration with comments dropped and whitespace collapsed, for the cosmetic-vs-real
|
|
208
|
+
* change test. Python keeps each line's indentation because it is syntax there; everything
|
|
209
|
+
* else collapses to one token stream. Anything the scanner is unsure about stays in, so the
|
|
210
|
+
* worst outcome is a cosmetic edit reported as a change, never a change reported as cosmetic.
|
|
211
|
+
*/
|
|
212
|
+
export function normalizeOtherLanguage(filePath, source) {
|
|
213
|
+
const lang = LANGS[path.extname(filePath).toLowerCase()];
|
|
214
|
+
if (!lang)
|
|
215
|
+
return source;
|
|
216
|
+
const out = [];
|
|
217
|
+
let inBlock = false;
|
|
218
|
+
let openQuote = null; // a triple-quoted or backtick string spanning lines
|
|
219
|
+
for (const raw of source.split(/\r?\n/)) {
|
|
220
|
+
let kept = '';
|
|
221
|
+
let pos = 0;
|
|
222
|
+
if (openQuote) {
|
|
223
|
+
const close = raw.indexOf(openQuote);
|
|
224
|
+
if (close < 0) {
|
|
225
|
+
out.push(raw);
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
kept = raw.slice(0, close + openQuote.length);
|
|
229
|
+
pos = close + openQuote.length;
|
|
230
|
+
openQuote = null;
|
|
231
|
+
}
|
|
232
|
+
while (pos < raw.length) {
|
|
233
|
+
if (inBlock) {
|
|
234
|
+
const close = raw.indexOf(lang.blockComment[1], pos);
|
|
235
|
+
if (close < 0) {
|
|
236
|
+
pos = raw.length;
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
pos = close + lang.blockComment[1].length;
|
|
240
|
+
inBlock = false;
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (lang.blockComment && raw.startsWith(lang.blockComment[0], pos)) {
|
|
244
|
+
inBlock = true;
|
|
245
|
+
pos += lang.blockComment[0].length;
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (lang.lineComment.some((c) => raw.startsWith(c, pos)))
|
|
249
|
+
break;
|
|
250
|
+
const q = lang.quotes.find((c) => raw.startsWith(c, pos));
|
|
251
|
+
if (q) {
|
|
252
|
+
const { end, closed } = scanString(raw, pos, q);
|
|
253
|
+
kept += raw.slice(pos, end);
|
|
254
|
+
pos = end;
|
|
255
|
+
if (!closed && (q.length === 3 || q === '`'))
|
|
256
|
+
openQuote = q;
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
kept += raw[pos++];
|
|
260
|
+
}
|
|
261
|
+
if (lang.style === 'indent') {
|
|
262
|
+
const indent = raw.match(/^\s*/)[0];
|
|
263
|
+
const body = kept.trim().replace(/[ \t]+/g, ' ');
|
|
264
|
+
if (body)
|
|
265
|
+
out.push(indent + body);
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
const body = kept.trim().replace(/\s+/g, ' ');
|
|
269
|
+
if (body)
|
|
270
|
+
out.push(body);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return lang.style === 'indent' ? out.join('\n') : out.join(' ');
|
|
274
|
+
}
|
|
275
|
+
//# 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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"}
|
|
@@ -10,6 +10,13 @@ import fs from 'fs';
|
|
|
10
10
|
import path from 'path';
|
|
11
11
|
/** Hard cap on tracked tool names so a hostile caller cannot grow ledger.json unbounded. */
|
|
12
12
|
const MAX_ATTRIBUTED_TOOLS = 300;
|
|
13
|
+
/** Daily totals kept on disk: enough for any window the dashboard shows, bounded. */
|
|
14
|
+
const MAX_DAYS_KEPT = 90;
|
|
15
|
+
const RECENT_WINDOW_DAYS = 7;
|
|
16
|
+
function dayKey(d = new Date()) {
|
|
17
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
18
|
+
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
|
19
|
+
}
|
|
13
20
|
/** Average blended cost per input token across GPT-4o / Claude Sonnet / Gemini Pro */
|
|
14
21
|
export const AVG_COST_PER_TOKEN = 0.000008; // $0.008 per 1K tokens
|
|
15
22
|
const HOME = process.env.HOME || process.env.USERPROFILE || '~';
|
|
@@ -40,6 +47,8 @@ function readRollup(raw) {
|
|
|
40
47
|
}
|
|
41
48
|
class SavingsLedger {
|
|
42
49
|
constructor() {
|
|
50
|
+
/** Local day (YYYY-MM-DD) -> tokens saved/spent that day. */
|
|
51
|
+
this.daily = {};
|
|
43
52
|
this.sessionStartedAt = new Date().toISOString();
|
|
44
53
|
this.sources = {
|
|
45
54
|
clipboard: { events: 0, tokensSaved: 0, costSaved: 0 },
|
|
@@ -96,6 +105,18 @@ class SavingsLedger {
|
|
|
96
105
|
this.costByHost = readRollup(parsedCosts._byHost);
|
|
97
106
|
this.costByOrigin = readRollup(parsedCosts._byOrigin);
|
|
98
107
|
}
|
|
108
|
+
const parsedDaily = parsed._daily;
|
|
109
|
+
if (parsedDaily && typeof parsedDaily === 'object' && !Array.isArray(parsedDaily)) {
|
|
110
|
+
for (const [day, v] of Object.entries(parsedDaily)) {
|
|
111
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(day) || !v || typeof v !== 'object')
|
|
112
|
+
continue;
|
|
113
|
+
const saved = Number(v.saved);
|
|
114
|
+
const spent = Number(v.spent);
|
|
115
|
+
if (!Number.isFinite(saved) || !Number.isFinite(spent) || saved < 0 || spent < 0)
|
|
116
|
+
continue;
|
|
117
|
+
this.daily[day] = { saved: Math.floor(saved), spent: Math.floor(spent) };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
99
120
|
}
|
|
100
121
|
}
|
|
101
122
|
}
|
|
@@ -115,6 +136,7 @@ class SavingsLedger {
|
|
|
115
136
|
const payload = {
|
|
116
137
|
...this.sources,
|
|
117
138
|
_costs: { ...this.costs, _byTool: this.costByTool, _byHost: this.costByHost, _byOrigin: this.costByOrigin },
|
|
139
|
+
_daily: this.daily,
|
|
118
140
|
// Stays 2: the rollups are additive keys a v2 reader already ignores, so no
|
|
119
141
|
// format bump — and the existing round-trip contract pins this number.
|
|
120
142
|
_version: 2,
|
|
@@ -140,8 +162,18 @@ class SavingsLedger {
|
|
|
140
162
|
this.sources[source].events++;
|
|
141
163
|
this.sources[source].tokensSaved += tokensSaved;
|
|
142
164
|
this.sources[source].costSaved += costSaved;
|
|
165
|
+
this.bumpDay('saved', tokensSaved);
|
|
143
166
|
this.save();
|
|
144
167
|
}
|
|
168
|
+
/** Adds to today's totals and drops days past MAX_DAYS_KEPT. */
|
|
169
|
+
bumpDay(side, tokens) {
|
|
170
|
+
const today = dayKey();
|
|
171
|
+
const slot = this.daily[today] ?? (this.daily[today] = { saved: 0, spent: 0 });
|
|
172
|
+
slot[side] += tokens;
|
|
173
|
+
const days = Object.keys(this.daily).sort();
|
|
174
|
+
for (const old of days.slice(0, Math.max(0, days.length - MAX_DAYS_KEPT)))
|
|
175
|
+
delete this.daily[old];
|
|
176
|
+
}
|
|
145
177
|
/**
|
|
146
178
|
* Record a savings event directly in tokens (for sources that already know their token count).
|
|
147
179
|
*/
|
|
@@ -152,6 +184,7 @@ class SavingsLedger {
|
|
|
152
184
|
this.sources[source].events++;
|
|
153
185
|
this.sources[source].tokensSaved += tokensSaved;
|
|
154
186
|
this.sources[source].costSaved += costSaved;
|
|
187
|
+
this.bumpDay('saved', tokensSaved);
|
|
155
188
|
this.save();
|
|
156
189
|
}
|
|
157
190
|
/**
|
|
@@ -169,6 +202,7 @@ class SavingsLedger {
|
|
|
169
202
|
this.costs[source].events++;
|
|
170
203
|
this.costs[source].tokensSpent += tokensSpent;
|
|
171
204
|
this.costs[source].costSpent += tokensSpent * AVG_COST_PER_TOKEN;
|
|
205
|
+
this.bumpDay('spent', tokensSpent);
|
|
172
206
|
if (source === 'toolResult') {
|
|
173
207
|
// byTool needs an explicit tool name; host/origin ALWAYS annotate (defaulting
|
|
174
208
|
// to unknown/lemma) so the rollups sum to the bucket totals — a smoke test
|
|
@@ -226,12 +260,28 @@ class SavingsLedger {
|
|
|
226
260
|
? total.tokensSaved / totalCost.tokensSpent
|
|
227
261
|
: (total.tokensSaved > 0 ? Infinity : 0),
|
|
228
262
|
};
|
|
263
|
+
const start = new Date();
|
|
264
|
+
start.setDate(start.getDate() - (RECENT_WINDOW_DAYS - 1));
|
|
265
|
+
const since = dayKey(start);
|
|
266
|
+
const inWindow = Object.entries(this.daily).filter(([day]) => day >= since);
|
|
267
|
+
const recentSaved = inWindow.reduce((n, [, d]) => n + d.saved, 0);
|
|
268
|
+
const recentSpent = inWindow.reduce((n, [, d]) => n + d.spent, 0);
|
|
269
|
+
const recent = {
|
|
270
|
+
days: RECENT_WINDOW_DAYS,
|
|
271
|
+
since,
|
|
272
|
+
daysWithData: inWindow.length,
|
|
273
|
+
tokensSaved: recentSaved,
|
|
274
|
+
tokensSpent: recentSpent,
|
|
275
|
+
netTokens: recentSaved - recentSpent,
|
|
276
|
+
netCost: (recentSaved - recentSpent) * AVG_COST_PER_TOKEN,
|
|
277
|
+
};
|
|
229
278
|
return {
|
|
230
279
|
...this.sources,
|
|
231
280
|
total,
|
|
232
281
|
costs: { ...this.costs },
|
|
233
282
|
totalCost,
|
|
234
283
|
net,
|
|
284
|
+
recent,
|
|
235
285
|
sessionStartedAt: this.sessionStartedAt,
|
|
236
286
|
costAttribution: {
|
|
237
287
|
byTool: { ...this.costByTool },
|
|
@@ -295,6 +345,7 @@ class SavingsLedger {
|
|
|
295
345
|
this.costByTool = {};
|
|
296
346
|
this.costByHost = {};
|
|
297
347
|
this.costByOrigin = {};
|
|
348
|
+
this.daily = {};
|
|
298
349
|
this.save();
|
|
299
350
|
}
|
|
300
351
|
}
|