@nxuss/lemma 1.39.0 → 1.41.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 +45 -14
- package/bin/brain-ingest.js +41 -0
- package/bin/init.js +92 -92
- package/bin/postinstall.js +58 -4
- package/dashboard/dist/assets/index-Ca05LJvs.js +453 -0
- package/dashboard/dist/assets/{index-DNTQXLER.css → index-DdEVyDRj.css} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dist/cjs/cli/hostHooks.d.ts +14 -1
- package/dist/cjs/cli/hostHooks.d.ts.map +1 -1
- package/dist/cjs/cli/hostHooks.js +53 -6
- package/dist/cjs/cli/hostHooks.js.map +1 -1
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +29 -10
- package/dist/cjs/cli/lemma-proxy.js.map +1 -1
- package/dist/cjs/contracts/evidence.d.ts +8 -1
- package/dist/cjs/contracts/evidence.d.ts.map +1 -1
- package/dist/cjs/mcp/cognitiveMap.d.ts.map +1 -1
- package/dist/cjs/mcp/cognitiveMap.js +6 -2
- package/dist/cjs/mcp/cognitiveMap.js.map +1 -1
- package/dist/cjs/mcp/index.js +21 -0
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/prompts.d.ts +1 -1
- package/dist/cjs/mcp/prompts.d.ts.map +1 -1
- package/dist/cjs/mcp/prompts.js +6 -16
- package/dist/cjs/mcp/prompts.js.map +1 -1
- package/dist/cjs/mcp/tool-profiles.d.ts.map +1 -1
- package/dist/cjs/mcp/tool-profiles.js +8 -4
- package/dist/cjs/mcp/tool-profiles.js.map +1 -1
- package/dist/cjs/mcp/tools/context-tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/context-tools.js +21 -17
- package/dist/cjs/mcp/tools/context-tools.js.map +1 -1
- package/dist/cjs/mcp/tools/devtools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/devtools.js +11 -1
- package/dist/cjs/mcp/tools/devtools.js.map +1 -1
- package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/memory.js +82 -18
- package/dist/cjs/mcp/tools/memory.js.map +1 -1
- package/dist/cjs/mcp/tools/refactor.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/refactor.js +129 -32
- package/dist/cjs/mcp/tools/refactor.js.map +1 -1
- package/dist/cjs/mcp/tools/workspace.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/workspace.js +192 -49
- package/dist/cjs/mcp/tools/workspace.js.map +1 -1
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js +95 -34
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/mcp/utils.d.ts.map +1 -1
- package/dist/cjs/mcp/utils.js +6 -1
- package/dist/cjs/mcp/utils.js.map +1 -1
- package/dist/cjs/mcp/workspaceShared.d.ts.map +1 -1
- package/dist/cjs/mcp/workspaceShared.js +14 -9
- package/dist/cjs/mcp/workspaceShared.js.map +1 -1
- package/dist/cjs/proxy/KeyManager.d.ts +10 -0
- package/dist/cjs/proxy/KeyManager.d.ts.map +1 -1
- package/dist/cjs/proxy/KeyManager.js +45 -8
- package/dist/cjs/proxy/KeyManager.js.map +1 -1
- package/dist/cjs/proxy/ProjectStore.d.ts.map +1 -1
- package/dist/cjs/proxy/ProjectStore.js +9 -6
- package/dist/cjs/proxy/ProjectStore.js.map +1 -1
- package/dist/cjs/security/SemanticScrubber.d.ts.map +1 -1
- package/dist/cjs/security/SemanticScrubber.js +19 -1
- package/dist/cjs/security/SemanticScrubber.js.map +1 -1
- package/dist/cjs/subconscious/HostRecall.d.ts +7 -5
- package/dist/cjs/subconscious/HostRecall.d.ts.map +1 -1
- package/dist/cjs/subconscious/HostRecall.js +130 -18
- package/dist/cjs/subconscious/HostRecall.js.map +1 -1
- package/dist/cjs/subconscious/NarrowEvidence.d.ts +6 -0
- package/dist/cjs/subconscious/NarrowEvidence.d.ts.map +1 -1
- package/dist/cjs/subconscious/NarrowEvidence.js +32 -47
- package/dist/cjs/subconscious/NarrowEvidence.js.map +1 -1
- package/dist/cjs/subconscious/TheBrainV2.d.ts +17 -1
- package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
- package/dist/cjs/subconscious/TheBrainV2.js +101 -20
- package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
- package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts +3 -0
- package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
- package/dist/cjs/subconscious/freshness/LocalFsResolver.js +46 -13
- package/dist/cjs/subconscious/freshness/LocalFsResolver.js.map +1 -1
- package/dist/cjs/utils/AffectedTests.d.ts +1 -5
- package/dist/cjs/utils/AffectedTests.d.ts.map +1 -1
- package/dist/cjs/utils/AffectedTests.js +5 -37
- package/dist/cjs/utils/AffectedTests.js.map +1 -1
- package/dist/cjs/utils/AtomicFile.d.ts +14 -0
- package/dist/cjs/utils/AtomicFile.d.ts.map +1 -0
- package/dist/cjs/utils/AtomicFile.js +44 -0
- package/dist/cjs/utils/AtomicFile.js.map +1 -0
- package/dist/cjs/utils/AutoContextBundle.js +1 -1
- package/dist/cjs/utils/AutoContextBundle.js.map +1 -1
- package/dist/cjs/utils/BulkFileDigest.js +1 -1
- package/dist/cjs/utils/BulkFileDigest.js.map +1 -1
- package/dist/cjs/utils/CommandOutputDistiller.d.ts +10 -0
- package/dist/cjs/utils/CommandOutputDistiller.d.ts.map +1 -1
- package/dist/cjs/utils/CommandOutputDistiller.js +40 -2
- package/dist/cjs/utils/CommandOutputDistiller.js.map +1 -1
- package/dist/cjs/utils/ContextSqueezer.d.ts +49 -5
- package/dist/cjs/utils/ContextSqueezer.d.ts.map +1 -1
- package/dist/cjs/utils/ContextSqueezer.js +245 -24
- package/dist/cjs/utils/ContextSqueezer.js.map +1 -1
- package/dist/cjs/utils/FileLock.d.ts +2 -0
- package/dist/cjs/utils/FileLock.d.ts.map +1 -0
- package/dist/cjs/utils/FileLock.js +32 -0
- package/dist/cjs/utils/FileLock.js.map +1 -0
- package/dist/cjs/utils/FileOutline.d.ts +1 -1
- package/dist/cjs/utils/FileOutline.d.ts.map +1 -1
- package/dist/cjs/utils/FileOutline.js +5 -1
- package/dist/cjs/utils/FileOutline.js.map +1 -1
- package/dist/cjs/utils/FixCapture.d.ts.map +1 -1
- package/dist/cjs/utils/FixCapture.js +60 -3
- package/dist/cjs/utils/FixCapture.js.map +1 -1
- package/dist/cjs/utils/GitChanges.d.ts +11 -0
- package/dist/cjs/utils/GitChanges.d.ts.map +1 -0
- package/dist/cjs/utils/GitChanges.js +44 -0
- package/dist/cjs/utils/GitChanges.js.map +1 -0
- package/dist/cjs/utils/JsonKeys.d.ts +17 -0
- package/dist/cjs/utils/JsonKeys.d.ts.map +1 -0
- package/dist/cjs/utils/JsonKeys.js +75 -0
- package/dist/cjs/utils/JsonKeys.js.map +1 -0
- package/dist/cjs/utils/LineNumberMap.d.ts.map +1 -1
- package/dist/cjs/utils/LineNumberMap.js +27 -0
- package/dist/cjs/utils/LineNumberMap.js.map +1 -1
- package/dist/cjs/utils/LocalExclude.d.ts +3 -0
- package/dist/cjs/utils/LocalExclude.d.ts.map +1 -0
- package/dist/cjs/utils/LocalExclude.js +68 -0
- package/dist/cjs/utils/LocalExclude.js.map +1 -0
- package/dist/cjs/utils/OtherLanguageSymbols.d.ts.map +1 -1
- package/dist/cjs/utils/OtherLanguageSymbols.js +0 -7
- package/dist/cjs/utils/OtherLanguageSymbols.js.map +1 -1
- package/dist/cjs/utils/OutputDelta.d.ts +14 -2
- package/dist/cjs/utils/OutputDelta.d.ts.map +1 -1
- package/dist/cjs/utils/OutputDelta.js +22 -15
- package/dist/cjs/utils/OutputDelta.js.map +1 -1
- package/dist/cjs/utils/PatchMatcher.d.ts.map +1 -1
- package/dist/cjs/utils/PatchMatcher.js +26 -0
- package/dist/cjs/utils/PatchMatcher.js.map +1 -1
- package/dist/cjs/utils/ProLicense.d.ts +2 -0
- package/dist/cjs/utils/ProLicense.d.ts.map +1 -0
- package/dist/cjs/utils/ProLicense.js +31 -0
- package/dist/cjs/utils/ProLicense.js.map +1 -0
- package/dist/cjs/utils/RevivalThrottle.d.ts +9 -0
- package/dist/cjs/utils/RevivalThrottle.d.ts.map +1 -0
- package/dist/cjs/utils/RevivalThrottle.js +25 -0
- package/dist/cjs/utils/RevivalThrottle.js.map +1 -0
- package/dist/cjs/utils/RoiLedger.d.ts.map +1 -1
- package/dist/cjs/utils/RoiLedger.js +7 -3
- package/dist/cjs/utils/RoiLedger.js.map +1 -1
- package/dist/cjs/utils/SavingsLedger.d.ts +58 -18
- package/dist/cjs/utils/SavingsLedger.d.ts.map +1 -1
- package/dist/cjs/utils/SavingsLedger.js +333 -177
- package/dist/cjs/utils/SavingsLedger.js.map +1 -1
- package/dist/cjs/utils/SearchCache.d.ts +2 -2
- package/dist/cjs/utils/SearchCache.d.ts.map +1 -1
- package/dist/cjs/utils/SearchCache.js +8 -6
- package/dist/cjs/utils/SearchCache.js.map +1 -1
- package/dist/cjs/utils/SessionCapture.d.ts +65 -0
- package/dist/cjs/utils/SessionCapture.d.ts.map +1 -0
- package/dist/cjs/utils/SessionCapture.js +339 -0
- package/dist/cjs/utils/SessionCapture.js.map +1 -0
- package/dist/cjs/utils/SharedLedgerStore.d.ts.map +1 -1
- package/dist/cjs/utils/SharedLedgerStore.js +2 -1
- package/dist/cjs/utils/SharedLedgerStore.js.map +1 -1
- package/dist/cjs/utils/StaleDelta.d.ts +2 -0
- package/dist/cjs/utils/StaleDelta.d.ts.map +1 -0
- package/dist/cjs/utils/StaleDelta.js +60 -0
- package/dist/cjs/utils/StaleDelta.js.map +1 -0
- package/dist/cjs/utils/SurgicalASTInsert.d.ts.map +1 -1
- package/dist/cjs/utils/SurgicalASTInsert.js +2 -1
- package/dist/cjs/utils/SurgicalASTInsert.js.map +1 -1
- package/dist/cjs/utils/SymbolSurgicalContext.d.ts +2 -2
- package/dist/cjs/utils/SymbolSurgicalContext.d.ts.map +1 -1
- package/dist/cjs/utils/SymbolSurgicalContext.js +29 -62
- package/dist/cjs/utils/SymbolSurgicalContext.js.map +1 -1
- package/dist/cjs/utils/TokenBudgetedReader.d.ts.map +1 -1
- package/dist/cjs/utils/TokenBudgetedReader.js +56 -15
- package/dist/cjs/utils/TokenBudgetedReader.js.map +1 -1
- package/dist/cjs/utils/Utf8Guard.d.ts +23 -0
- package/dist/cjs/utils/Utf8Guard.d.ts.map +1 -0
- package/dist/cjs/utils/Utf8Guard.js +81 -0
- package/dist/cjs/utils/Utf8Guard.js.map +1 -0
- package/dist/cjs/utils/WorkspaceSearch.d.ts +8 -1
- package/dist/cjs/utils/WorkspaceSearch.d.ts.map +1 -1
- package/dist/cjs/utils/WorkspaceSearch.js +101 -13
- package/dist/cjs/utils/WorkspaceSearch.js.map +1 -1
- package/dist/cjs/utils/reportSavings.d.ts +3 -0
- package/dist/cjs/utils/reportSavings.d.ts.map +1 -1
- package/dist/cjs/utils/reportSavings.js +44 -5
- package/dist/cjs/utils/reportSavings.js.map +1 -1
- package/dist/cjs/utils/tsLoader.d.ts +5 -0
- package/dist/cjs/utils/tsLoader.d.ts.map +1 -0
- package/dist/cjs/utils/tsLoader.js +15 -0
- package/dist/cjs/utils/tsLoader.js.map +1 -0
- package/dist/esm/cli/hostHooks.d.ts +14 -1
- package/dist/esm/cli/hostHooks.d.ts.map +1 -1
- package/dist/esm/cli/hostHooks.js +52 -5
- package/dist/esm/cli/hostHooks.js.map +1 -1
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +30 -11
- package/dist/esm/cli/lemma-proxy.js.map +1 -1
- package/dist/esm/contracts/evidence.d.ts +8 -1
- package/dist/esm/contracts/evidence.d.ts.map +1 -1
- package/dist/esm/mcp/cognitiveMap.d.ts.map +1 -1
- package/dist/esm/mcp/cognitiveMap.js +6 -2
- package/dist/esm/mcp/cognitiveMap.js.map +1 -1
- package/dist/esm/mcp/index.js +22 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/prompts.d.ts +1 -1
- package/dist/esm/mcp/prompts.d.ts.map +1 -1
- package/dist/esm/mcp/prompts.js +6 -16
- package/dist/esm/mcp/prompts.js.map +1 -1
- package/dist/esm/mcp/tool-profiles.d.ts.map +1 -1
- package/dist/esm/mcp/tool-profiles.js +8 -4
- package/dist/esm/mcp/tool-profiles.js.map +1 -1
- package/dist/esm/mcp/tools/context-tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools/context-tools.js +21 -17
- package/dist/esm/mcp/tools/context-tools.js.map +1 -1
- package/dist/esm/mcp/tools/devtools.d.ts.map +1 -1
- package/dist/esm/mcp/tools/devtools.js +11 -1
- package/dist/esm/mcp/tools/devtools.js.map +1 -1
- package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
- package/dist/esm/mcp/tools/memory.js +83 -19
- package/dist/esm/mcp/tools/memory.js.map +1 -1
- package/dist/esm/mcp/tools/refactor.d.ts.map +1 -1
- package/dist/esm/mcp/tools/refactor.js +129 -32
- package/dist/esm/mcp/tools/refactor.js.map +1 -1
- package/dist/esm/mcp/tools/workspace.d.ts.map +1 -1
- package/dist/esm/mcp/tools/workspace.js +193 -50
- package/dist/esm/mcp/tools/workspace.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js +94 -33
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/mcp/utils.d.ts.map +1 -1
- package/dist/esm/mcp/utils.js +6 -1
- package/dist/esm/mcp/utils.js.map +1 -1
- package/dist/esm/mcp/workspaceShared.d.ts.map +1 -1
- package/dist/esm/mcp/workspaceShared.js +14 -9
- package/dist/esm/mcp/workspaceShared.js.map +1 -1
- package/dist/esm/proxy/KeyManager.d.ts +10 -0
- package/dist/esm/proxy/KeyManager.d.ts.map +1 -1
- package/dist/esm/proxy/KeyManager.js +43 -6
- package/dist/esm/proxy/KeyManager.js.map +1 -1
- package/dist/esm/proxy/ProjectStore.d.ts.map +1 -1
- package/dist/esm/proxy/ProjectStore.js +9 -6
- package/dist/esm/proxy/ProjectStore.js.map +1 -1
- package/dist/esm/security/SemanticScrubber.d.ts.map +1 -1
- package/dist/esm/security/SemanticScrubber.js +19 -1
- package/dist/esm/security/SemanticScrubber.js.map +1 -1
- package/dist/esm/subconscious/HostRecall.d.ts +7 -5
- package/dist/esm/subconscious/HostRecall.d.ts.map +1 -1
- package/dist/esm/subconscious/HostRecall.js +130 -19
- package/dist/esm/subconscious/HostRecall.js.map +1 -1
- package/dist/esm/subconscious/NarrowEvidence.d.ts +6 -0
- package/dist/esm/subconscious/NarrowEvidence.d.ts.map +1 -1
- package/dist/esm/subconscious/NarrowEvidence.js +24 -7
- package/dist/esm/subconscious/NarrowEvidence.js.map +1 -1
- package/dist/esm/subconscious/TheBrainV2.d.ts +17 -1
- package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
- package/dist/esm/subconscious/TheBrainV2.js +101 -20
- package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
- package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts +3 -0
- package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
- package/dist/esm/subconscious/freshness/LocalFsResolver.js +46 -13
- package/dist/esm/subconscious/freshness/LocalFsResolver.js.map +1 -1
- package/dist/esm/utils/AffectedTests.d.ts +1 -5
- package/dist/esm/utils/AffectedTests.d.ts.map +1 -1
- package/dist/esm/utils/AffectedTests.js +2 -35
- package/dist/esm/utils/AffectedTests.js.map +1 -1
- package/dist/esm/utils/AtomicFile.d.ts +14 -0
- package/dist/esm/utils/AtomicFile.d.ts.map +1 -0
- package/dist/esm/utils/AtomicFile.js +37 -0
- package/dist/esm/utils/AtomicFile.js.map +1 -0
- package/dist/esm/utils/AutoContextBundle.js +1 -1
- package/dist/esm/utils/AutoContextBundle.js.map +1 -1
- package/dist/esm/utils/BulkFileDigest.js +1 -1
- package/dist/esm/utils/BulkFileDigest.js.map +1 -1
- package/dist/esm/utils/CommandOutputDistiller.d.ts +10 -0
- package/dist/esm/utils/CommandOutputDistiller.d.ts.map +1 -1
- package/dist/esm/utils/CommandOutputDistiller.js +39 -2
- package/dist/esm/utils/CommandOutputDistiller.js.map +1 -1
- package/dist/esm/utils/ContextSqueezer.d.ts +49 -5
- package/dist/esm/utils/ContextSqueezer.d.ts.map +1 -1
- package/dist/esm/utils/ContextSqueezer.js +242 -24
- package/dist/esm/utils/ContextSqueezer.js.map +1 -1
- package/dist/esm/utils/FileLock.d.ts +2 -0
- package/dist/esm/utils/FileLock.d.ts.map +1 -0
- package/dist/esm/utils/FileLock.js +29 -0
- package/dist/esm/utils/FileLock.js.map +1 -0
- package/dist/esm/utils/FileOutline.d.ts +1 -1
- package/dist/esm/utils/FileOutline.d.ts.map +1 -1
- package/dist/esm/utils/FileOutline.js +5 -1
- package/dist/esm/utils/FileOutline.js.map +1 -1
- package/dist/esm/utils/FixCapture.d.ts.map +1 -1
- package/dist/esm/utils/FixCapture.js +59 -2
- package/dist/esm/utils/FixCapture.js.map +1 -1
- package/dist/esm/utils/GitChanges.d.ts +11 -0
- package/dist/esm/utils/GitChanges.d.ts.map +1 -0
- package/dist/esm/utils/GitChanges.js +41 -0
- package/dist/esm/utils/GitChanges.js.map +1 -0
- package/dist/esm/utils/JsonKeys.d.ts +17 -0
- package/dist/esm/utils/JsonKeys.d.ts.map +1 -0
- package/dist/esm/utils/JsonKeys.js +71 -0
- package/dist/esm/utils/JsonKeys.js.map +1 -0
- package/dist/esm/utils/LineNumberMap.d.ts.map +1 -1
- package/dist/esm/utils/LineNumberMap.js +27 -0
- package/dist/esm/utils/LineNumberMap.js.map +1 -1
- package/dist/esm/utils/LocalExclude.d.ts +3 -0
- package/dist/esm/utils/LocalExclude.d.ts.map +1 -0
- package/dist/esm/utils/LocalExclude.js +62 -0
- package/dist/esm/utils/LocalExclude.js.map +1 -0
- package/dist/esm/utils/OtherLanguageSymbols.d.ts.map +1 -1
- package/dist/esm/utils/OtherLanguageSymbols.js +0 -7
- package/dist/esm/utils/OtherLanguageSymbols.js.map +1 -1
- package/dist/esm/utils/OutputDelta.d.ts +14 -2
- package/dist/esm/utils/OutputDelta.d.ts.map +1 -1
- package/dist/esm/utils/OutputDelta.js +22 -15
- package/dist/esm/utils/OutputDelta.js.map +1 -1
- package/dist/esm/utils/PatchMatcher.d.ts.map +1 -1
- package/dist/esm/utils/PatchMatcher.js +26 -0
- package/dist/esm/utils/PatchMatcher.js.map +1 -1
- package/dist/esm/utils/ProLicense.d.ts +2 -0
- package/dist/esm/utils/ProLicense.d.ts.map +1 -0
- package/dist/esm/utils/ProLicense.js +25 -0
- package/dist/esm/utils/ProLicense.js.map +1 -0
- package/dist/esm/utils/RevivalThrottle.d.ts +9 -0
- package/dist/esm/utils/RevivalThrottle.d.ts.map +1 -0
- package/dist/esm/utils/RevivalThrottle.js +22 -0
- package/dist/esm/utils/RevivalThrottle.js.map +1 -0
- package/dist/esm/utils/RoiLedger.d.ts.map +1 -1
- package/dist/esm/utils/RoiLedger.js +7 -3
- package/dist/esm/utils/RoiLedger.js.map +1 -1
- package/dist/esm/utils/SavingsLedger.d.ts +58 -18
- package/dist/esm/utils/SavingsLedger.d.ts.map +1 -1
- package/dist/esm/utils/SavingsLedger.js +333 -177
- package/dist/esm/utils/SavingsLedger.js.map +1 -1
- package/dist/esm/utils/SearchCache.d.ts +2 -2
- package/dist/esm/utils/SearchCache.d.ts.map +1 -1
- package/dist/esm/utils/SearchCache.js +8 -6
- package/dist/esm/utils/SearchCache.js.map +1 -1
- package/dist/esm/utils/SessionCapture.d.ts +65 -0
- package/dist/esm/utils/SessionCapture.d.ts.map +1 -0
- package/dist/esm/utils/SessionCapture.js +328 -0
- package/dist/esm/utils/SessionCapture.js.map +1 -0
- package/dist/esm/utils/SharedLedgerStore.d.ts.map +1 -1
- package/dist/esm/utils/SharedLedgerStore.js +2 -1
- package/dist/esm/utils/SharedLedgerStore.js.map +1 -1
- package/dist/esm/utils/StaleDelta.d.ts +2 -0
- package/dist/esm/utils/StaleDelta.d.ts.map +1 -0
- package/dist/esm/utils/StaleDelta.js +54 -0
- package/dist/esm/utils/StaleDelta.js.map +1 -0
- package/dist/esm/utils/SurgicalASTInsert.d.ts.map +1 -1
- package/dist/esm/utils/SurgicalASTInsert.js +2 -1
- package/dist/esm/utils/SurgicalASTInsert.js.map +1 -1
- package/dist/esm/utils/SymbolSurgicalContext.d.ts +2 -2
- 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/TokenBudgetedReader.d.ts.map +1 -1
- package/dist/esm/utils/TokenBudgetedReader.js +56 -15
- package/dist/esm/utils/TokenBudgetedReader.js.map +1 -1
- package/dist/esm/utils/Utf8Guard.d.ts +23 -0
- package/dist/esm/utils/Utf8Guard.d.ts.map +1 -0
- package/dist/esm/utils/Utf8Guard.js +74 -0
- package/dist/esm/utils/Utf8Guard.js.map +1 -0
- package/dist/esm/utils/WorkspaceSearch.d.ts +8 -1
- package/dist/esm/utils/WorkspaceSearch.d.ts.map +1 -1
- package/dist/esm/utils/WorkspaceSearch.js +100 -13
- package/dist/esm/utils/WorkspaceSearch.js.map +1 -1
- package/dist/esm/utils/reportSavings.d.ts +3 -0
- package/dist/esm/utils/reportSavings.d.ts.map +1 -1
- package/dist/esm/utils/reportSavings.js +42 -5
- package/dist/esm/utils/reportSavings.js.map +1 -1
- package/dist/esm/utils/tsLoader.d.ts +5 -0
- package/dist/esm/utils/tsLoader.d.ts.map +1 -0
- package/dist/esm/utils/tsLoader.js +13 -0
- package/dist/esm/utils/tsLoader.js.map +1 -0
- package/package.json +5 -5
- package/dashboard/dist/assets/index-DzL_Zu3m.js +0 -452
- package/dist/cjs/examples/basic-usage.d.ts +0 -12
- package/dist/cjs/examples/basic-usage.d.ts.map +0 -1
- package/dist/cjs/examples/basic-usage.js +0 -128
- package/dist/cjs/examples/basic-usage.js.map +0 -1
- package/dist/esm/examples/basic-usage.d.ts +0 -12
- package/dist/esm/examples/basic-usage.d.ts.map +0 -1
- package/dist/esm/examples/basic-usage.js +0 -126
- package/dist/esm/examples/basic-usage.js.map +0 -1
|
@@ -11,6 +11,7 @@ import fs from 'fs';
|
|
|
11
11
|
import * as ts from 'typescript';
|
|
12
12
|
import { safeResolvePath } from '../mcp/utils.js';
|
|
13
13
|
import { withFileEol } from './Eol.js';
|
|
14
|
+
import { readUtf8ForEdit } from './Utf8Guard.js';
|
|
14
15
|
/**
|
|
15
16
|
* Finds a class or interface node by name.
|
|
16
17
|
*/
|
|
@@ -53,7 +54,7 @@ export function surgicalASTInsert(workspaceRoot, options) {
|
|
|
53
54
|
if (!fs.existsSync(resolved)) {
|
|
54
55
|
throw new Error(`File not found: ${options.filePath}`);
|
|
55
56
|
}
|
|
56
|
-
const src =
|
|
57
|
+
const src = readUtf8ForEdit(resolved);
|
|
57
58
|
const sf = ts.createSourceFile(resolved, src, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
58
59
|
const position = options.insertPosition || 'after';
|
|
59
60
|
const body = dedent(options.codeToInsert);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SurgicalASTInsert.js","sourceRoot":"","sources":["../../../src/utils/SurgicalASTInsert.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SurgicalASTInsert.js","sourceRoot":"","sources":["../../../src/utils/SurgicalASTInsert.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Saves up to 90% of token context in LLM prompts.
|
|
9
9
|
*/
|
|
10
|
-
import * as
|
|
10
|
+
import type * as TS from 'typescript';
|
|
11
11
|
export interface SurgicalContextResult {
|
|
12
12
|
symbolName: string;
|
|
13
13
|
filePath: string;
|
|
@@ -19,7 +19,7 @@ export interface SurgicalContextResult {
|
|
|
19
19
|
type: string;
|
|
20
20
|
}>;
|
|
21
21
|
}
|
|
22
|
-
export declare function findSymbolNode(sourceFile:
|
|
22
|
+
export declare function findSymbolNode(sourceFile: TS.SourceFile, name: string): TS.Node | null;
|
|
23
23
|
/**
|
|
24
24
|
* Canonicalizes a symbol's source into a token stream with comments and whitespace
|
|
25
25
|
* stripped, for cosmetic-vs-structural freshness classification (Fase D). Two versions of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SymbolSurgicalContext.d.ts","sourceRoot":"","sources":["../../../src/utils/SymbolSurgicalContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"SymbolSurgicalContext.d.ts","sourceRoot":"","sources":["../../../src/utils/SymbolSurgicalContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAItC,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAiCD,wBAAgB,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,CAGtF;AAgLD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,MAAM,GACjB,qBAAqB,CAmDvB"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import fs from 'fs';
|
|
11
11
|
import path from 'path';
|
|
12
|
-
import
|
|
12
|
+
import { ts } from './tsLoader.js';
|
|
13
13
|
import { safeResolvePath } from '../mcp/utils.js';
|
|
14
14
|
/**
|
|
15
15
|
* Traverses AST to find the node defining the specified symbol name.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SymbolSurgicalContext.js","sourceRoot":"","sources":["../../../src/utils/SymbolSurgicalContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"SymbolSurgicalContext.js","sourceRoot":"","sources":["../../../src/utils/SymbolSurgicalContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenBudgetedReader.d.ts","sourceRoot":"","sources":["../../../src/utils/TokenBudgetedReader.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE;
|
|
1
|
+
{"version":3,"file":"TokenBudgetedReader.d.ts","sourceRoot":"","sources":["../../../src/utils/TokenBudgetedReader.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE;AAsHD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,KAAK,GAAE,MAAW,EAClB,SAAS,GAAE,MAAa,GACvB,uBAAuB,CA6DzB"}
|
|
@@ -65,17 +65,54 @@ function extractSections(filePath, content) {
|
|
|
65
65
|
}
|
|
66
66
|
return sections;
|
|
67
67
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
68
|
+
const BM25_K1 = 1.2;
|
|
69
|
+
const BM25_B = 0.75;
|
|
70
|
+
// A query word equal to a section's own name outranks any amount of body text: asking for
|
|
71
|
+
// `checkEntryFreshness` means that function, not whichever section repeats "fresh" the most.
|
|
72
|
+
const NAME_EXACT_BONUS = 100;
|
|
73
|
+
const NAME_PART_BONUS = 5;
|
|
74
|
+
function queryTerms(query) {
|
|
75
|
+
return [...new Set(query.toLowerCase().split(/[\s,;]+/).filter(Boolean))];
|
|
76
|
+
}
|
|
77
|
+
function countOccurrences(haystack, needle) {
|
|
78
|
+
let count = 0;
|
|
79
|
+
for (let i = haystack.indexOf(needle); i !== -1; i = haystack.indexOf(needle, i + needle.length))
|
|
80
|
+
count++;
|
|
81
|
+
return count;
|
|
82
|
+
}
|
|
83
|
+
/** The identifiers a section label names, member first: "function a" -> [a]; "method C.m" -> [m, c]. */
|
|
84
|
+
function labelNames(label) {
|
|
85
|
+
const name = label.replace(/^(function|class|interface|type|enum|const|method)\s+/, '');
|
|
86
|
+
return name.split('.').reverse().map((part) => part.toLowerCase());
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* BM25 across the sections, so a long body cannot win by volume and a word found in every section
|
|
90
|
+
* counts for little, plus a bonus for a query word that is the section's own name.
|
|
91
|
+
*/
|
|
92
|
+
function scoreSections(sections, query) {
|
|
93
|
+
const terms = queryTerms(query);
|
|
94
|
+
if (terms.length === 0)
|
|
95
|
+
return sections.map(() => 1);
|
|
96
|
+
const lowered = sections.map((s) => s.text.toLowerCase());
|
|
97
|
+
const avgLength = lowered.reduce((sum, t) => sum + t.length, 0) / sections.length || 1;
|
|
98
|
+
const docFreq = terms.map((term) => lowered.filter((t) => t.includes(term)).length);
|
|
99
|
+
return sections.map((s, i) => {
|
|
100
|
+
const names = labelNames(s.label);
|
|
101
|
+
let score = 0;
|
|
102
|
+
terms.forEach((term, k) => {
|
|
103
|
+
const tf = countOccurrences(lowered[i], term);
|
|
104
|
+
if (tf > 0) {
|
|
105
|
+
const idf = Math.log(1 + (sections.length - docFreq[k] + 0.5) / (docFreq[k] + 0.5));
|
|
106
|
+
const norm = tf + BM25_K1 * (1 - BM25_B + (BM25_B * lowered[i].length) / avgLength);
|
|
107
|
+
score += (idf * tf * (BM25_K1 + 1)) / norm;
|
|
108
|
+
}
|
|
109
|
+
if (names[0] === term)
|
|
110
|
+
score += NAME_EXACT_BONUS;
|
|
111
|
+
else if (term.length >= 3 && names.some((n) => n.includes(term)))
|
|
112
|
+
score += NAME_PART_BONUS;
|
|
113
|
+
});
|
|
114
|
+
return score;
|
|
115
|
+
});
|
|
79
116
|
}
|
|
80
117
|
export function readTokenBudgeted(filePath, projectRoot, query = '', maxTokens = 2000) {
|
|
81
118
|
const resolved = path.resolve(projectRoot, filePath);
|
|
@@ -88,15 +125,19 @@ export function readTokenBudgeted(filePath, projectRoot, query = '', maxTokens =
|
|
|
88
125
|
return { filePath, content, tokensUsed: totalTokens, tokensBudget: maxTokens, truncated: false, relevantSections: [] };
|
|
89
126
|
}
|
|
90
127
|
const sections = extractSections(filePath, content);
|
|
91
|
-
const
|
|
128
|
+
const scores = scoreSections(sections, query);
|
|
129
|
+
const scored = sections.map((s, i) => ({
|
|
92
130
|
...s,
|
|
93
|
-
relevance:
|
|
131
|
+
relevance: scores[i],
|
|
94
132
|
tokens: estimateTokens(s.text),
|
|
95
133
|
}));
|
|
96
|
-
|
|
134
|
+
// With a query, a section that matches nothing is filler: leave the budget unspent rather than
|
|
135
|
+
// fill it with those. When nothing matches at all, fall back to file order.
|
|
136
|
+
const pool = query.trim() && scored.some((s) => s.relevance > 0) ? scored.filter((s) => s.relevance > 0) : scored;
|
|
137
|
+
pool.sort((a, b) => b.relevance - a.relevance);
|
|
97
138
|
const selected = [];
|
|
98
139
|
let tokensUsed = 0;
|
|
99
|
-
for (const s of
|
|
140
|
+
for (const s of pool) {
|
|
100
141
|
const remaining = maxTokens - tokensUsed;
|
|
101
142
|
if (s.tokens <= remaining) {
|
|
102
143
|
selected.push(s);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenBudgetedReader.js","sourceRoot":"","sources":["../../../src/utils/TokenBudgetedReader.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TokenBudgetedReader.js","sourceRoot":"","sources":["../../../src/utils/TokenBudgetedReader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Editing tools read a file as UTF-8 text and write the edited text back. For a file that is not
|
|
3
|
+
* UTF-8 (Latin-1, Shift-JIS, a stray binary byte) that round trip is lossy: every byte that is not
|
|
4
|
+
* valid UTF-8 decodes to U+FFFD and is written back as the three bytes EF BF BD. The other bytes
|
|
5
|
+
* of the file are gone for good and nothing says so, so the tools refuse such a file instead.
|
|
6
|
+
*/
|
|
7
|
+
/** True when decoding `buf` as UTF-8 would lose bytes. A file that really contains U+FFFD is fine. */
|
|
8
|
+
export declare function isLossyUtf8(buf: Buffer): boolean;
|
|
9
|
+
export declare const NOT_UTF8_REASON = "is not valid UTF-8 (probably Latin-1 or another legacy encoding). Writing it back would replace every byte that is not valid UTF-8 with U+FFFD, permanently, so nothing was changed. Edit it with a tool that preserves the encoding, or convert it to UTF-8 first.";
|
|
10
|
+
export declare class NotUtf8Error extends Error {
|
|
11
|
+
readonly file: string;
|
|
12
|
+
constructor(file: string);
|
|
13
|
+
}
|
|
14
|
+
/** Reads a text file for editing; throws NotUtf8Error rather than hand back a lossy decoding. */
|
|
15
|
+
export declare function readUtf8ForEdit(file: string, label?: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* What kind of non-text file `buf` is, or null when it is text. A binary file read as UTF-8 comes
|
|
18
|
+
* back as tens of thousands of replacement characters: the whole file's worth of tokens spent on
|
|
19
|
+
* nothing, and a warning about encodings that does not apply. UTF-16 text is reported too — its
|
|
20
|
+
* NULs are not stray, and decoding it as UTF-8 is as useless as decoding a PNG.
|
|
21
|
+
*/
|
|
22
|
+
export declare function describeBinary(buf: Buffer): string | null;
|
|
23
|
+
//# sourceMappingURL=Utf8Guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Utf8Guard.d.ts","sourceRoot":"","sources":["../../../src/utils/Utf8Guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGhD;AAED,eAAO,MAAM,eAAe,wQAC2O,CAAC;AAExQ,qBAAa,YAAa,SAAQ,KAAK;aACT,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAIzC;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAa,GAAG,MAAM,CAK1E;AAiBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBzD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Editing tools read a file as UTF-8 text and write the edited text back. For a file that is not
|
|
3
|
+
* UTF-8 (Latin-1, Shift-JIS, a stray binary byte) that round trip is lossy: every byte that is not
|
|
4
|
+
* valid UTF-8 decodes to U+FFFD and is written back as the three bytes EF BF BD. The other bytes
|
|
5
|
+
* of the file are gone for good and nothing says so, so the tools refuse such a file instead.
|
|
6
|
+
*/
|
|
7
|
+
/** True when decoding `buf` as UTF-8 would lose bytes. A file that really contains U+FFFD is fine. */
|
|
8
|
+
export function isLossyUtf8(buf) {
|
|
9
|
+
const text = buf.toString('utf8');
|
|
10
|
+
return text.includes('�') && !Buffer.from(text, 'utf8').equals(buf);
|
|
11
|
+
}
|
|
12
|
+
export const NOT_UTF8_REASON = 'is not valid UTF-8 (probably Latin-1 or another legacy encoding). Writing it back would replace every byte that is not valid UTF-8 with U+FFFD, permanently, so nothing was changed. Edit it with a tool that preserves the encoding, or convert it to UTF-8 first.';
|
|
13
|
+
export class NotUtf8Error extends Error {
|
|
14
|
+
constructor(file) {
|
|
15
|
+
super(`${file} ${NOT_UTF8_REASON}`);
|
|
16
|
+
this.file = file;
|
|
17
|
+
this.name = 'NotUtf8Error';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Reads a text file for editing; throws NotUtf8Error rather than hand back a lossy decoding. */
|
|
21
|
+
export function readUtf8ForEdit(file, label = file) {
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
23
|
+
const buf = require('fs').readFileSync(file);
|
|
24
|
+
if (isLossyUtf8(buf))
|
|
25
|
+
throw new NotUtf8Error(label);
|
|
26
|
+
return buf.toString('utf8');
|
|
27
|
+
}
|
|
28
|
+
const MAGIC = [
|
|
29
|
+
['PNG image', [0x89, 0x50, 0x4e, 0x47]],
|
|
30
|
+
['JPEG image', [0xff, 0xd8, 0xff]],
|
|
31
|
+
['GIF image', [0x47, 0x49, 0x46, 0x38]],
|
|
32
|
+
['PDF document', [0x25, 0x50, 0x44, 0x46]],
|
|
33
|
+
['ZIP archive', [0x50, 0x4b, 0x03, 0x04]],
|
|
34
|
+
['gzip archive', [0x1f, 0x8b]],
|
|
35
|
+
['ELF executable', [0x7f, 0x45, 0x4c, 0x46]],
|
|
36
|
+
['Mach-O executable', [0xcf, 0xfa, 0xed, 0xfe]],
|
|
37
|
+
['WebAssembly module', [0x00, 0x61, 0x73, 0x6d]],
|
|
38
|
+
['SQLite database', [0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66]],
|
|
39
|
+
['WOFF font', [0x77, 0x4f, 0x46]],
|
|
40
|
+
['ICO image', [0x00, 0x00, 0x01, 0x00]],
|
|
41
|
+
];
|
|
42
|
+
/**
|
|
43
|
+
* What kind of non-text file `buf` is, or null when it is text. A binary file read as UTF-8 comes
|
|
44
|
+
* back as tens of thousands of replacement characters: the whole file's worth of tokens spent on
|
|
45
|
+
* nothing, and a warning about encodings that does not apply. UTF-16 text is reported too — its
|
|
46
|
+
* NULs are not stray, and decoding it as UTF-8 is as useless as decoding a PNG.
|
|
47
|
+
*/
|
|
48
|
+
export function describeBinary(buf) {
|
|
49
|
+
if (buf.length === 0)
|
|
50
|
+
return null;
|
|
51
|
+
if (buf.length >= 2 && ((buf[0] === 0xff && buf[1] === 0xfe) || (buf[0] === 0xfe && buf[1] === 0xff)))
|
|
52
|
+
return 'UTF-16 text (not UTF-8)';
|
|
53
|
+
for (const [name, magic] of MAGIC) {
|
|
54
|
+
if (buf.length >= magic.length && magic.every((b, i) => buf[i] === b))
|
|
55
|
+
return name;
|
|
56
|
+
}
|
|
57
|
+
const n = Math.min(buf.length, 8000);
|
|
58
|
+
let nuls = 0;
|
|
59
|
+
let control = 0;
|
|
60
|
+
for (let i = 0; i < n; i++) {
|
|
61
|
+
const b = buf[i];
|
|
62
|
+
if (b === 0)
|
|
63
|
+
nuls++;
|
|
64
|
+
// Control bytes other than tab, LF, CR, form feed and ESC (ANSI colour in logs).
|
|
65
|
+
if (b < 0x20 && b !== 0x09 && b !== 0x0a && b !== 0x0d && b !== 0x0c && b !== 0x1b)
|
|
66
|
+
control++;
|
|
67
|
+
}
|
|
68
|
+
// A stray NUL in a source file is not a binary (WorkspaceSearch learned that the hard way).
|
|
69
|
+
// Proportional AND a floor: one NUL in a 40-byte file is 2.5% of it, and still just a typo.
|
|
70
|
+
if ((nuls >= 4 && nuls / n > 0.001) || (control >= 8 && control / n > 0.1))
|
|
71
|
+
return 'binary data';
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=Utf8Guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Utf8Guard.js","sourceRoot":"","sources":["../../../src/utils/Utf8Guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,12 +11,19 @@ export interface GroupedSearchResult {
|
|
|
11
11
|
}
|
|
12
12
|
export declare function loadGitignorePatterns(workspaceRoot: string): RegExp[];
|
|
13
13
|
export declare function parseExtensionFilter(extension?: string): string[] | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Compiles the `regex` query of search_workspace (case-insensitive, like the literal search).
|
|
16
|
+
* Throws an Error whose message is meant for the model: what was wrong and what to do.
|
|
17
|
+
*/
|
|
18
|
+
export declare function compileSearchRegex(query: string): RegExp;
|
|
14
19
|
export interface SearchWorkspaceResult {
|
|
15
20
|
matches: SearchMatch[];
|
|
16
21
|
truncated: boolean;
|
|
17
22
|
}
|
|
18
23
|
export declare function searchWorkspace(workspaceRoot: string, query: string, extensions?: string[], maxResults?: number,
|
|
19
24
|
/** Workspace-relative directory to search instead of the whole root; the caller has validated it. */
|
|
20
|
-
subdir?: string
|
|
25
|
+
subdir?: string,
|
|
26
|
+
/** Treat `query` as a regular expression instead of literal text. */
|
|
27
|
+
useRegex?: boolean): SearchWorkspaceResult;
|
|
21
28
|
export declare function groupSearchResults(matches: SearchMatch[], truncated: boolean, maxPerFile?: number, workspaceRoot?: string): GroupedSearchResult;
|
|
22
29
|
//# sourceMappingURL=WorkspaceSearch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkspaceSearch.d.ts","sourceRoot":"","sources":["../../../src/utils/WorkspaceSearch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WorkspaceSearch.d.ts","sourceRoot":"","sources":["../../../src/utils/WorkspaceSearch.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAyBD,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAYrE;AAiBD,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAM7E;AA+BD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMxD;AAkCD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,UAAU,SAAsB;AAChC,qGAAqG;AACrG,MAAM,SAAK;AACX,qEAAqE;AACrE,QAAQ,UAAQ,GACf,qBAAqB,CA6FvB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,WAAW,EAAE,EACtB,SAAS,EAAE,OAAO,EAClB,UAAU,SAAuB,EACjC,aAAa,CAAC,EAAE,MAAM,GACrB,mBAAmB,CA2CrB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
|
+
import vm from "vm";
|
|
3
4
|
import { isStructurallySearchable, resolveStructuralMatches } from "./StructuralSearch.js";
|
|
4
5
|
const DEFAULT_IGNORED_DIRS = ["node_modules", ".git", "dist", "chroma_data", ".lemma"];
|
|
5
6
|
const MAX_SEARCHABLE_BYTES = 500 * 1024; // skip files larger than this
|
|
@@ -61,7 +62,7 @@ function isBinaryLikely(buf) {
|
|
|
61
62
|
if (buf[i] === 0)
|
|
62
63
|
nuls++;
|
|
63
64
|
}
|
|
64
|
-
return sampleLen > 0 && nuls / sampleLen > 0.001;
|
|
65
|
+
return sampleLen > 0 && nuls >= 4 && nuls / sampleLen > 0.001;
|
|
65
66
|
}
|
|
66
67
|
export function parseExtensionFilter(extension) {
|
|
67
68
|
if (!extension)
|
|
@@ -72,11 +73,11 @@ export function parseExtensionFilter(extension) {
|
|
|
72
73
|
.filter(Boolean);
|
|
73
74
|
}
|
|
74
75
|
/** The line, trimmed; when longer than MAX_LINE_CHARS, a window centred on the first hit. */
|
|
75
|
-
function snippetAround(line, lowerQuery) {
|
|
76
|
+
function snippetAround(line, lowerQuery, regex) {
|
|
76
77
|
const trimmed = line.trim();
|
|
77
78
|
if (trimmed.length <= MAX_LINE_CHARS)
|
|
78
79
|
return trimmed;
|
|
79
|
-
const at = Math.max(0, trimmed.toLowerCase().indexOf(lowerQuery));
|
|
80
|
+
const at = Math.max(0, regex ? (regex.exec(trimmed)?.index ?? 0) : trimmed.toLowerCase().indexOf(lowerQuery));
|
|
80
81
|
const start = Math.max(0, Math.min(at - LINE_CONTEXT_BEFORE, trimmed.length - MAX_LINE_CHARS));
|
|
81
82
|
const end = Math.min(trimmed.length, start + MAX_LINE_CHARS);
|
|
82
83
|
return `${start > 0 ? "…" : ""}${trimmed.slice(start, end)}${end < trimmed.length ? "…" : ""}`;
|
|
@@ -91,11 +92,62 @@ function searchPriority(entry) {
|
|
|
91
92
|
}
|
|
92
93
|
return /\.(md|mdx|txt|rst|mdc)$/i.test(entry.name) || entry.name.startsWith(".") ? 1 : 0;
|
|
93
94
|
}
|
|
95
|
+
/** Lines longer than this are not run through a user regex: minified bundles are where backtracking blows up. */
|
|
96
|
+
const MAX_REGEX_LINE_CHARS = 2000;
|
|
97
|
+
/** A failure of the user's regex itself, as opposed to an unreadable file: the walk must not swallow it. */
|
|
98
|
+
class RegexSearchError extends Error {
|
|
99
|
+
}
|
|
100
|
+
/** Wall-clock budget for running a user regex over ONE file; the first overrun aborts the whole search. */
|
|
101
|
+
const DEFAULT_REGEX_FILE_TIMEOUT_MS = 1500;
|
|
102
|
+
/**
|
|
103
|
+
* Compiles the `regex` query of search_workspace (case-insensitive, like the literal search).
|
|
104
|
+
* Throws an Error whose message is meant for the model: what was wrong and what to do.
|
|
105
|
+
*/
|
|
106
|
+
export function compileSearchRegex(query) {
|
|
107
|
+
try {
|
|
108
|
+
return new RegExp(query, "i");
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
throw new Error(`invalid regex "${query}": ${err.message}. Escape special characters or omit regex:true to search for literal text.`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Runs `re` over the lines of one file and returns the 0-based indexes that match.
|
|
116
|
+
*
|
|
117
|
+
* JavaScript has no linear-time regex engine, and the MCP server is one thread that every tool
|
|
118
|
+
* shares: a pattern like `(a|aa)+$` on a 40-character line can run for minutes. The whole file is
|
|
119
|
+
* scanned inside one `vm` call with a timeout (V8 interrupts the regex); per line the same call
|
|
120
|
+
* costs ~600x more, which is why the unit is the file. `^`/`$` are line anchors, so the cheap
|
|
121
|
+
* whole-file prefilter uses the multiline form.
|
|
122
|
+
*/
|
|
123
|
+
function matchingLineIndexes(re, fileRe, content, timeoutMs, where) {
|
|
124
|
+
const ctx = vm.createContext({ re, fileRe, content, max: MAX_REGEX_LINE_CHARS });
|
|
125
|
+
try {
|
|
126
|
+
return vm.runInContext(`(function () {
|
|
127
|
+
if (!fileRe.test(content)) return [];
|
|
128
|
+
var lines = content.split("\\n"), out = [];
|
|
129
|
+
for (var i = 0; i < lines.length; i++) if (lines[i].length <= max && re.test(lines[i])) out.push(i);
|
|
130
|
+
return out;
|
|
131
|
+
})()`, ctx, { timeout: timeoutMs });
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
if (err?.code === "ERR_SCRIPT_EXECUTION_TIMEOUT") {
|
|
135
|
+
throw new RegexSearchError(`regex too slow: "${re.source}" ran over ${timeoutMs} ms on ${where} (catastrophic backtracking, usually from a repeated group like "(a+)+"). Simplify the pattern or search for literal text.`);
|
|
136
|
+
}
|
|
137
|
+
throw err;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
94
140
|
export function searchWorkspace(workspaceRoot, query, extensions, maxResults = DEFAULT_MAX_RESULTS,
|
|
95
141
|
/** Workspace-relative directory to search instead of the whole root; the caller has validated it. */
|
|
96
|
-
subdir = ""
|
|
142
|
+
subdir = "",
|
|
143
|
+
/** Treat `query` as a regular expression instead of literal text. */
|
|
144
|
+
useRegex = false) {
|
|
97
145
|
const gitignorePatterns = loadGitignorePatterns(workspaceRoot);
|
|
98
146
|
const lowerQuery = query.toLowerCase();
|
|
147
|
+
const lineRe = useRegex ? compileSearchRegex(query) : undefined;
|
|
148
|
+
// `^` and `$` mean line anchors to someone writing a grep pattern, so the whole-file prefilter
|
|
149
|
+
// has to see the same thing the per-line test does.
|
|
150
|
+
const fileRe = useRegex ? new RegExp(lineRe.source, "im") : undefined;
|
|
99
151
|
const results = [];
|
|
100
152
|
let truncated = false;
|
|
101
153
|
function walk(currentDir, relativePath) {
|
|
@@ -121,6 +173,10 @@ subdir = "") {
|
|
|
121
173
|
}
|
|
122
174
|
if (DEFAULT_IGNORED_DIRS.includes(entry.name))
|
|
123
175
|
continue;
|
|
176
|
+
// Like ripgrep, never follow a symlink: statSync/readFileSync would, and a link to a file
|
|
177
|
+
// outside the workspace made its content a search result (read_workspace_file refuses it).
|
|
178
|
+
if (entry.isSymbolicLink())
|
|
179
|
+
continue;
|
|
124
180
|
const rel = relativePath ? path.join(relativePath, entry.name) : entry.name;
|
|
125
181
|
const full = path.join(currentDir, entry.name);
|
|
126
182
|
const relForMatch = entry.isDirectory() ? `${rel}/` : rel;
|
|
@@ -140,6 +196,21 @@ subdir = "") {
|
|
|
140
196
|
if (isBinaryLikely(buf))
|
|
141
197
|
continue;
|
|
142
198
|
const content = buf.toString("utf8");
|
|
199
|
+
if (lineRe) {
|
|
200
|
+
const timeoutMs = Number(process.env.LEMMA_REGEX_TIMEOUT_MS) || DEFAULT_REGEX_FILE_TIMEOUT_MS;
|
|
201
|
+
const hits = matchingLineIndexes(lineRe, fileRe, content, timeoutMs, rel);
|
|
202
|
+
if (hits.length === 0)
|
|
203
|
+
continue;
|
|
204
|
+
const fileLines = content.split("\n");
|
|
205
|
+
for (const idx of hits) {
|
|
206
|
+
if (results.length >= maxResults) {
|
|
207
|
+
truncated = true;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
results.push({ filePath: rel, line: idx + 1, text: snippetAround(fileLines[idx], lowerQuery, lineRe) });
|
|
211
|
+
}
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
143
214
|
if (!content.toLowerCase().includes(lowerQuery))
|
|
144
215
|
continue;
|
|
145
216
|
const lines = content.split("\n");
|
|
@@ -153,8 +224,10 @@ subdir = "") {
|
|
|
153
224
|
}
|
|
154
225
|
}
|
|
155
226
|
}
|
|
156
|
-
catch {
|
|
157
|
-
// unreadable file — skip
|
|
227
|
+
catch (err) {
|
|
228
|
+
// A pattern that is too slow aborts the search; anything else is an unreadable file — skip it.
|
|
229
|
+
if (err instanceof RegexSearchError)
|
|
230
|
+
throw err;
|
|
158
231
|
}
|
|
159
232
|
}
|
|
160
233
|
}
|
|
@@ -204,10 +277,11 @@ export function groupSearchResults(matches, truncated, maxPerFile = DEFAULT_MAX_
|
|
|
204
277
|
formatted: kept.join("\n\n"),
|
|
205
278
|
};
|
|
206
279
|
}
|
|
280
|
+
const MAX_LINES_PER_SYMBOL = 3;
|
|
207
281
|
// For code files, collapse N line matches inside the same function/class/etc. into one
|
|
208
|
-
// symbol entry
|
|
209
|
-
// pile of raw lines. Falls back to null (caller uses
|
|
210
|
-
// or files with no parseable declarations.
|
|
282
|
+
// symbol entry that names the function and keeps the matching lines — the model gets "what
|
|
283
|
+
// defines this behavior" and where, not a pile of raw lines. Falls back to null (caller uses
|
|
284
|
+
// the raw line format) for non-code files or files with no parseable declarations.
|
|
211
285
|
function formatStructuralBlock(workspaceRoot, file, fileMatches, maxPerFile) {
|
|
212
286
|
if (!isStructurallySearchable(file))
|
|
213
287
|
return null;
|
|
@@ -220,10 +294,23 @@ function formatStructuralBlock(workspaceRoot, file, fileMatches, maxPerFile) {
|
|
|
220
294
|
return null;
|
|
221
295
|
symbolHits.sort((a, b) => Math.min(...a.matchLines) - Math.min(...b.matchLines));
|
|
222
296
|
const shown = symbolHits.slice(0, maxPerFile);
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
297
|
+
const textAt = new Map(fileMatches.map((m) => [m.line, m.text]));
|
|
298
|
+
const lines = [];
|
|
299
|
+
for (const h of shown) {
|
|
300
|
+
const where = `${h.symbol.name} (L${h.symbol.startLine}-L${h.symbol.endLine})`;
|
|
301
|
+
if (h.matchLines.length === 1) {
|
|
302
|
+
// One hit in a function: the matching line IS the answer. The signature the old format
|
|
303
|
+
// printed was ~140 characters of parameter types, and left out the line that matched.
|
|
304
|
+
lines.push(` ${h.matchLines[0]} in ${where}: ${textAt.get(h.matchLines[0]) ?? ""}`);
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
// Several hits in one function are where collapsing pays: one header, then the lines.
|
|
308
|
+
lines.push(` in ${where}, ${h.matchLines.length} matches:`);
|
|
309
|
+
for (const line of h.matchLines.slice(0, MAX_LINES_PER_SYMBOL))
|
|
310
|
+
lines.push(` ${line}: ${textAt.get(line) ?? ""}`);
|
|
311
|
+
if (h.matchLines.length > MAX_LINES_PER_SYMBOL)
|
|
312
|
+
lines.push(` +${h.matchLines.length - MAX_LINES_PER_SYMBOL} more`);
|
|
313
|
+
}
|
|
227
314
|
const remainder = symbolHits.length - shown.length;
|
|
228
315
|
if (remainder > 0)
|
|
229
316
|
lines.push(` +${remainder} more symbols`);
|