mindweave 0.0.1 → 2.1.2
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/LICENSE +190 -0
- package/README.md +171 -14
- package/dist/alternator/chassis/cache.js +47 -0
- package/dist/alternator/chassis/cache.js.map +1 -0
- package/dist/alternator/chassis/domRefs.js +53 -0
- package/dist/alternator/chassis/domRefs.js.map +1 -0
- package/dist/alternator/chassis/extractWorker.js +65 -0
- package/dist/alternator/chassis/extractWorker.js.map +1 -0
- package/dist/alternator/chassis/graph.js +221 -0
- package/dist/alternator/chassis/graph.js.map +1 -0
- package/dist/alternator/chassis/index.js +463 -0
- package/dist/alternator/chassis/index.js.map +1 -0
- package/dist/alternator/chassis/isolation.js +336 -0
- package/dist/alternator/chassis/isolation.js.map +1 -0
- package/dist/alternator/chassis/langCases.js +69 -0
- package/dist/alternator/chassis/langCases.js.map +1 -0
- package/dist/alternator/chassis/lsp.js +469 -0
- package/dist/alternator/chassis/lsp.js.map +1 -0
- package/dist/alternator/chassis/markup.js +262 -0
- package/dist/alternator/chassis/markup.js.map +1 -0
- package/dist/alternator/chassis/provision.js +198 -0
- package/dist/alternator/chassis/provision.js.map +1 -0
- package/dist/alternator/chassis/rank.js +72 -0
- package/dist/alternator/chassis/rank.js.map +1 -0
- package/dist/alternator/chassis/servers.js +215 -0
- package/dist/alternator/chassis/servers.js.map +1 -0
- package/dist/alternator/chassis/treesitter.js +608 -0
- package/dist/alternator/chassis/treesitter.js.map +1 -0
- package/dist/alternator/chassis/types.js +24 -0
- package/dist/alternator/chassis/types.js.map +1 -0
- package/dist/alternator/lane.js +67 -0
- package/dist/alternator/lane.js.map +1 -0
- package/dist/cli/App.js +2586 -0
- package/dist/cli/App.js.map +1 -0
- package/dist/cli/altScreen.js +67 -0
- package/dist/cli/altScreen.js.map +1 -0
- package/dist/cli/approvalChannel.js +72 -0
- package/dist/cli/approvalChannel.js.map +1 -0
- package/dist/cli/attachments.js +188 -0
- package/dist/cli/attachments.js.map +1 -0
- package/dist/cli/bootstrap.js +279 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/chatAnchor.js +94 -0
- package/dist/cli/chatAnchor.js.map +1 -0
- package/dist/cli/commandArgs.js +79 -0
- package/dist/cli/commandArgs.js.map +1 -0
- package/dist/cli/commandRoute.js +78 -0
- package/dist/cli/commandRoute.js.map +1 -0
- package/dist/cli/compaction.js +69 -0
- package/dist/cli/compaction.js.map +1 -0
- package/dist/cli/components/ApprovalBox.js +100 -0
- package/dist/cli/components/ApprovalBox.js.map +1 -0
- package/dist/cli/components/BlockView.js +128 -0
- package/dist/cli/components/BlockView.js.map +1 -0
- package/dist/cli/components/FirstRunFrame.js +41 -0
- package/dist/cli/components/FirstRunFrame.js.map +1 -0
- package/dist/cli/components/KeyManager.js +197 -0
- package/dist/cli/components/KeyManager.js.map +1 -0
- package/dist/cli/components/KeySetup.js +125 -0
- package/dist/cli/components/KeySetup.js.map +1 -0
- package/dist/cli/components/MenuFrame.js +24 -0
- package/dist/cli/components/MenuFrame.js.map +1 -0
- package/dist/cli/components/Picker.js +82 -0
- package/dist/cli/components/Picker.js.map +1 -0
- package/dist/cli/components/PromptInput.js +509 -0
- package/dist/cli/components/PromptInput.js.map +1 -0
- package/dist/cli/components/SubagentView.js +86 -0
- package/dist/cli/components/SubagentView.js.map +1 -0
- package/dist/cli/components/ToolGroup.js +60 -0
- package/dist/cli/components/ToolGroup.js.map +1 -0
- package/dist/cli/components/ToolLine.js +123 -0
- package/dist/cli/components/ToolLine.js.map +1 -0
- package/dist/cli/components/TrustGate.js +37 -0
- package/dist/cli/components/TrustGate.js.map +1 -0
- package/dist/cli/costView.js +40 -0
- package/dist/cli/costView.js.map +1 -0
- package/dist/cli/frameRate.js +30 -0
- package/dist/cli/frameRate.js.map +1 -0
- package/dist/cli/framebuffer/paint.js +165 -0
- package/dist/cli/framebuffer/paint.js.map +1 -0
- package/dist/cli/framebuffer/parse.js +266 -0
- package/dist/cli/framebuffer/parse.js.map +1 -0
- package/dist/cli/framebuffer/screen.js +196 -0
- package/dist/cli/framebuffer/screen.js.map +1 -0
- package/dist/cli/framebuffer/writer.js +139 -0
- package/dist/cli/framebuffer/writer.js.map +1 -0
- package/dist/cli/groupReveal.js +51 -0
- package/dist/cli/groupReveal.js.map +1 -0
- package/dist/cli/help.js +55 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/inputView.js +105 -0
- package/dist/cli/inputView.js.map +1 -0
- package/dist/cli/keyManager.js +65 -0
- package/dist/cli/keyManager.js.map +1 -0
- package/dist/cli/keySetup.js +35 -0
- package/dist/cli/keySetup.js.map +1 -0
- package/dist/cli/keyStore.js +73 -0
- package/dist/cli/keyStore.js.map +1 -0
- package/dist/cli/markdown.js +460 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/messageQueue.js +96 -0
- package/dist/cli/messageQueue.js.map +1 -0
- package/dist/cli/modes.js +90 -0
- package/dist/cli/modes.js.map +1 -0
- package/dist/cli/mouse.js +78 -0
- package/dist/cli/mouse.js.map +1 -0
- package/dist/cli/pasteAssembler.js +44 -0
- package/dist/cli/pasteAssembler.js.map +1 -0
- package/dist/cli/pathComplete.js +39 -0
- package/dist/cli/pathComplete.js.map +1 -0
- package/dist/cli/perfLog.js +90 -0
- package/dist/cli/perfLog.js.map +1 -0
- package/dist/cli/reveal.js +32 -0
- package/dist/cli/reveal.js.map +1 -0
- package/dist/cli/revealPace.js +59 -0
- package/dist/cli/revealPace.js.map +1 -0
- package/dist/cli/sessionCarry.js +19 -0
- package/dist/cli/sessionCarry.js.map +1 -0
- package/dist/cli/smoothScroll.js +74 -0
- package/dist/cli/smoothScroll.js.map +1 -0
- package/dist/cli/startupArgs.js +96 -0
- package/dist/cli/startupArgs.js.map +1 -0
- package/dist/cli/terminalRestore.js +34 -0
- package/dist/cli/terminalRestore.js.map +1 -0
- package/dist/cli/toolDisplay.js +219 -0
- package/dist/cli/toolDisplay.js.map +1 -0
- package/dist/cli/toolItems.js +65 -0
- package/dist/cli/toolItems.js.map +1 -0
- package/dist/cli/transcript.js +351 -0
- package/dist/cli/transcript.js.map +1 -0
- package/dist/cli/trust.js +79 -0
- package/dist/cli/trust.js.map +1 -0
- package/dist/cli/updateCheck.js +107 -0
- package/dist/cli/updateCheck.js.map +1 -0
- package/dist/cli/version.js +39 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/cli/viewport.js +179 -0
- package/dist/cli/viewport.js.map +1 -0
- package/dist/cli/virtualWindow.js +103 -0
- package/dist/cli/virtualWindow.js.map +1 -0
- package/dist/cli/workingVerb.js +37 -0
- package/dist/cli/workingVerb.js.map +1 -0
- package/dist/cli/wrap.js +145 -0
- package/dist/cli/wrap.js.map +1 -0
- package/dist/drivers/anthropic/cachePoints.js +77 -0
- package/dist/drivers/anthropic/cachePoints.js.map +1 -0
- package/dist/drivers/anthropic/client.js +432 -0
- package/dist/drivers/anthropic/client.js.map +1 -0
- package/dist/drivers/anthropic/index.js +10 -0
- package/dist/drivers/anthropic/index.js.map +1 -0
- package/dist/drivers/anthropic/manifest.js +221 -0
- package/dist/drivers/anthropic/manifest.js.map +1 -0
- package/dist/drivers/cerebras/client.js +69 -0
- package/dist/drivers/cerebras/client.js.map +1 -0
- package/dist/drivers/cerebras/index.js +5 -0
- package/dist/drivers/cerebras/index.js.map +1 -0
- package/dist/drivers/cerebras/manifest.js +140 -0
- package/dist/drivers/cerebras/manifest.js.map +1 -0
- package/dist/drivers/clientId.js +41 -0
- package/dist/drivers/clientId.js.map +1 -0
- package/dist/drivers/contextOverflow.js +77 -0
- package/dist/drivers/contextOverflow.js.map +1 -0
- package/dist/drivers/deepseek/client.js +168 -0
- package/dist/drivers/deepseek/client.js.map +1 -0
- package/dist/drivers/deepseek/index.js +16 -0
- package/dist/drivers/deepseek/index.js.map +1 -0
- package/dist/drivers/deepseek/inlineTools.js +46 -0
- package/dist/drivers/deepseek/inlineTools.js.map +1 -0
- package/dist/drivers/deepseek/manifest.js +166 -0
- package/dist/drivers/deepseek/manifest.js.map +1 -0
- package/dist/drivers/gemini/client.js +38 -0
- package/dist/drivers/gemini/client.js.map +1 -0
- package/dist/drivers/gemini/index.js +5 -0
- package/dist/drivers/gemini/index.js.map +1 -0
- package/dist/drivers/gemini/manifest.js +150 -0
- package/dist/drivers/gemini/manifest.js.map +1 -0
- package/dist/drivers/glm/client.js +90 -0
- package/dist/drivers/glm/client.js.map +1 -0
- package/dist/drivers/glm/index.js +9 -0
- package/dist/drivers/glm/index.js.map +1 -0
- package/dist/drivers/glm/manifest.js +183 -0
- package/dist/drivers/glm/manifest.js.map +1 -0
- package/dist/drivers/groq/client.js +80 -0
- package/dist/drivers/groq/client.js.map +1 -0
- package/dist/drivers/groq/index.js +5 -0
- package/dist/drivers/groq/index.js.map +1 -0
- package/dist/drivers/groq/manifest.js +160 -0
- package/dist/drivers/groq/manifest.js.map +1 -0
- package/dist/drivers/kimi/client.js +82 -0
- package/dist/drivers/kimi/client.js.map +1 -0
- package/dist/drivers/kimi/index.js +9 -0
- package/dist/drivers/kimi/index.js.map +1 -0
- package/dist/drivers/kimi/manifest.js +168 -0
- package/dist/drivers/kimi/manifest.js.map +1 -0
- package/dist/drivers/meta/client.js +30 -0
- package/dist/drivers/meta/client.js.map +1 -0
- package/dist/drivers/meta/index.js +5 -0
- package/dist/drivers/meta/index.js.map +1 -0
- package/dist/drivers/meta/manifest.js +101 -0
- package/dist/drivers/meta/manifest.js.map +1 -0
- package/dist/drivers/minimax/client.js +36 -0
- package/dist/drivers/minimax/client.js.map +1 -0
- package/dist/drivers/minimax/index.js +5 -0
- package/dist/drivers/minimax/index.js.map +1 -0
- package/dist/drivers/minimax/manifest.js +120 -0
- package/dist/drivers/minimax/manifest.js.map +1 -0
- package/dist/drivers/mistral/client.js +54 -0
- package/dist/drivers/mistral/client.js.map +1 -0
- package/dist/drivers/mistral/index.js +5 -0
- package/dist/drivers/mistral/index.js.map +1 -0
- package/dist/drivers/mistral/manifest.js +118 -0
- package/dist/drivers/mistral/manifest.js.map +1 -0
- package/dist/drivers/openai/client.js +290 -0
- package/dist/drivers/openai/client.js.map +1 -0
- package/dist/drivers/openai/index.js +9 -0
- package/dist/drivers/openai/index.js.map +1 -0
- package/dist/drivers/openai/manifest.js +133 -0
- package/dist/drivers/openai/manifest.js.map +1 -0
- package/dist/drivers/openaiCompat/wire.js +493 -0
- package/dist/drivers/openaiCompat/wire.js.map +1 -0
- package/dist/drivers/partialTurn.js +23 -0
- package/dist/drivers/partialTurn.js.map +1 -0
- package/dist/drivers/providerError.js +181 -0
- package/dist/drivers/providerError.js.map +1 -0
- package/dist/drivers/qwen/client.js +93 -0
- package/dist/drivers/qwen/client.js.map +1 -0
- package/dist/drivers/qwen/index.js +9 -0
- package/dist/drivers/qwen/index.js.map +1 -0
- package/dist/drivers/qwen/manifest.js +146 -0
- package/dist/drivers/qwen/manifest.js.map +1 -0
- package/dist/drivers/registry.js +177 -0
- package/dist/drivers/registry.js.map +1 -0
- package/dist/drivers/retryPolicy.js +129 -0
- package/dist/drivers/retryPolicy.js.map +1 -0
- package/dist/drivers/searchBlocks.js +61 -0
- package/dist/drivers/searchBlocks.js.map +1 -0
- package/dist/drivers/types.js +2 -0
- package/dist/drivers/types.js.map +1 -0
- package/dist/drivers/xai/client.js +63 -0
- package/dist/drivers/xai/client.js.map +1 -0
- package/dist/drivers/xai/index.js +5 -0
- package/dist/drivers/xai/index.js.map +1 -0
- package/dist/drivers/xai/manifest.js +137 -0
- package/dist/drivers/xai/manifest.js.map +1 -0
- package/dist/dynamo/_probe.tmp.js +20 -0
- package/dist/dynamo/_probe.tmp.js.map +1 -0
- package/dist/dynamo/cacheBreak.js +88 -0
- package/dist/dynamo/cacheBreak.js.map +1 -0
- package/dist/dynamo/contextWindow.js +243 -0
- package/dist/dynamo/contextWindow.js.map +1 -0
- package/dist/dynamo/engine.js +2011 -0
- package/dist/dynamo/engine.js.map +1 -0
- package/dist/dynamo/guard.js +132 -0
- package/dist/dynamo/guard.js.map +1 -0
- package/dist/dynamo/liveMeter.js +58 -0
- package/dist/dynamo/liveMeter.js.map +1 -0
- package/dist/dynamo/model.js +172 -0
- package/dist/dynamo/model.js.map +1 -0
- package/dist/dynamo/planArtifact.js +125 -0
- package/dist/dynamo/planArtifact.js.map +1 -0
- package/dist/dynamo/pricing.js +140 -0
- package/dist/dynamo/pricing.js.map +1 -0
- package/dist/dynamo/prompt.js +264 -0
- package/dist/dynamo/prompt.js.map +1 -0
- package/dist/dynamo/spend.js +45 -0
- package/dist/dynamo/spend.js.map +1 -0
- package/dist/dynamo/verify.js +483 -0
- package/dist/dynamo/verify.js.map +1 -0
- package/dist/governor/forbidden.js +181 -0
- package/dist/governor/forbidden.js.map +1 -0
- package/dist/governor/freshness.js +83 -0
- package/dist/governor/freshness.js.map +1 -0
- package/dist/governor/frontmatter.js +38 -0
- package/dist/governor/frontmatter.js.map +1 -0
- package/dist/governor/glob.js +75 -0
- package/dist/governor/glob.js.map +1 -0
- package/dist/governor/index.js +87 -0
- package/dist/governor/index.js.map +1 -0
- package/dist/governor/rules.js +80 -0
- package/dist/governor/rules.js.map +1 -0
- package/dist/governor/scope.js +91 -0
- package/dist/governor/scope.js.map +1 -0
- package/dist/governor/skills.js +176 -0
- package/dist/governor/skills.js.map +1 -0
- package/dist/governor/types.js +16 -0
- package/dist/governor/types.js.map +1 -0
- package/dist/governor/write.js +182 -0
- package/dist/governor/write.js.map +1 -0
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/catalog.js +232 -0
- package/dist/mcp/catalog.js.map +1 -0
- package/dist/mcp/config.js +116 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/configWrite.js +254 -0
- package/dist/mcp/configWrite.js.map +1 -0
- package/dist/mcp/connection.js +504 -0
- package/dist/mcp/connection.js.map +1 -0
- package/dist/mcp/deferred.js +104 -0
- package/dist/mcp/deferred.js.map +1 -0
- package/dist/mcp/discover.js +128 -0
- package/dist/mcp/discover.js.map +1 -0
- package/dist/mcp/manager.js +679 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/paramHeaders.js +163 -0
- package/dist/mcp/paramHeaders.js.map +1 -0
- package/dist/mcp/prompts.js +136 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/protocol.js +171 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/resources.js +119 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/resultStore.js +180 -0
- package/dist/mcp/resultStore.js.map +1 -0
- package/dist/mcp/subscriptions.js +74 -0
- package/dist/mcp/subscriptions.js.map +1 -0
- package/dist/mcp/transport/headerValue.js +40 -0
- package/dist/mcp/transport/headerValue.js.map +1 -0
- package/dist/mcp/transport/http.js +321 -0
- package/dist/mcp/transport/http.js.map +1 -0
- package/dist/mcp/transport/stdio.js +234 -0
- package/dist/mcp/transport/stdio.js.map +1 -0
- package/dist/mcp/transport/types.js +27 -0
- package/dist/mcp/transport/types.js.map +1 -0
- package/dist/mcp/trust.js +98 -0
- package/dist/mcp/trust.js.map +1 -0
- package/dist/mcp/trustStore.js +55 -0
- package/dist/mcp/trustStore.js.map +1 -0
- package/dist/memory/autoMemory.js +340 -0
- package/dist/memory/autoMemory.js.map +1 -0
- package/dist/memory/compaction.js +513 -0
- package/dist/memory/compaction.js.map +1 -0
- package/dist/memory/images.js +173 -0
- package/dist/memory/images.js.map +1 -0
- package/dist/memory/presence.js +59 -0
- package/dist/memory/presence.js.map +1 -0
- package/dist/memory/projectNotes.js +247 -0
- package/dist/memory/projectNotes.js.map +1 -0
- package/dist/memory/restore.js +72 -0
- package/dist/memory/restore.js.map +1 -0
- package/dist/memory/session.js +472 -0
- package/dist/memory/session.js.map +1 -0
- package/dist/memory/sessionMemory.js +142 -0
- package/dist/memory/sessionMemory.js.map +1 -0
- package/dist/memory/sessionMemoryCompact.js +136 -0
- package/dist/memory/sessionMemoryCompact.js.map +1 -0
- package/dist/memory/store.js +217 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/types.js +14 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/memory/workingSet.js +383 -0
- package/dist/memory/workingSet.js.map +1 -0
- package/dist/project/context.js +425 -0
- package/dist/project/context.js.map +1 -0
- package/dist/tools/approval.js +189 -0
- package/dist/tools/approval.js.map +1 -0
- package/dist/tools/askUser.js +103 -0
- package/dist/tools/askUser.js.map +1 -0
- package/dist/tools/atomicWrite.js +151 -0
- package/dist/tools/atomicWrite.js.map +1 -0
- package/dist/tools/backgroundShells.js +468 -0
- package/dist/tools/backgroundShells.js.map +1 -0
- package/dist/tools/captureSweep.js +77 -0
- package/dist/tools/captureSweep.js.map +1 -0
- package/dist/tools/chassisMux.js +92 -0
- package/dist/tools/chassisMux.js.map +1 -0
- package/dist/tools/checkpoints.js +328 -0
- package/dist/tools/checkpoints.js.map +1 -0
- package/dist/tools/codeIntel.js +267 -0
- package/dist/tools/codeIntel.js.map +1 -0
- package/dist/tools/deferredNative.js +121 -0
- package/dist/tools/deferredNative.js.map +1 -0
- package/dist/tools/detail.js +135 -0
- package/dist/tools/detail.js.map +1 -0
- package/dist/tools/diagnostics.js +174 -0
- package/dist/tools/diagnostics.js.map +1 -0
- package/dist/tools/edit.js +167 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/editCore.js +283 -0
- package/dist/tools/editCore.js.map +1 -0
- package/dist/tools/editFile.js +183 -0
- package/dist/tools/editFile.js.map +1 -0
- package/dist/tools/editRipple.js +126 -0
- package/dist/tools/editRipple.js.map +1 -0
- package/dist/tools/editTarget.js +131 -0
- package/dist/tools/editTarget.js.map +1 -0
- package/dist/tools/editWindow.js +49 -0
- package/dist/tools/editWindow.js.map +1 -0
- package/dist/tools/eol.js +56 -0
- package/dist/tools/eol.js.map +1 -0
- package/dist/tools/exitPlan.js +175 -0
- package/dist/tools/exitPlan.js.map +1 -0
- package/dist/tools/focus.js +42 -0
- package/dist/tools/focus.js.map +1 -0
- package/dist/tools/gitignore.js +148 -0
- package/dist/tools/gitignore.js.map +1 -0
- package/dist/tools/glob.js +134 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/governorTools.js +258 -0
- package/dist/tools/governorTools.js.map +1 -0
- package/dist/tools/grep.js +450 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/guard.js +220 -0
- package/dist/tools/guard.js.map +1 -0
- package/dist/tools/killTree.js +215 -0
- package/dist/tools/killTree.js.map +1 -0
- package/dist/tools/listDir.js +143 -0
- package/dist/tools/listDir.js.map +1 -0
- package/dist/tools/mcpAdd.js +176 -0
- package/dist/tools/mcpAdd.js.map +1 -0
- package/dist/tools/mcpResources.js +116 -0
- package/dist/tools/mcpResources.js.map +1 -0
- package/dist/tools/mcpSearch.js +123 -0
- package/dist/tools/mcpSearch.js.map +1 -0
- package/dist/tools/multiEdit.js +168 -0
- package/dist/tools/multiEdit.js.map +1 -0
- package/dist/tools/paths.js +225 -0
- package/dist/tools/paths.js.map +1 -0
- package/dist/tools/posixShell.js +123 -0
- package/dist/tools/posixShell.js.map +1 -0
- package/dist/tools/readFile.js +371 -0
- package/dist/tools/readFile.js.map +1 -0
- package/dist/tools/readSymbol.js +145 -0
- package/dist/tools/readSymbol.js.map +1 -0
- package/dist/tools/registry.js +120 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/replaceSymbol.js +141 -0
- package/dist/tools/replaceSymbol.js.map +1 -0
- package/dist/tools/results.js +15 -0
- package/dist/tools/results.js.map +1 -0
- package/dist/tools/ripgrep.js +145 -0
- package/dist/tools/ripgrep.js.map +1 -0
- package/dist/tools/runCommand.js +633 -0
- package/dist/tools/runCommand.js.map +1 -0
- package/dist/tools/saveMemory.js +102 -0
- package/dist/tools/saveMemory.js.map +1 -0
- package/dist/tools/screenshot.js +200 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/screenshotWin.js +227 -0
- package/dist/tools/screenshotWin.js.map +1 -0
- package/dist/tools/search.js +121 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/sessionTools.js +187 -0
- package/dist/tools/sessionTools.js.map +1 -0
- package/dist/tools/shellCheckpoint.js +123 -0
- package/dist/tools/shellCheckpoint.js.map +1 -0
- package/dist/tools/shellLint.js +102 -0
- package/dist/tools/shellLint.js.map +1 -0
- package/dist/tools/shellTools.js +203 -0
- package/dist/tools/shellTools.js.map +1 -0
- package/dist/tools/spanCore.js +78 -0
- package/dist/tools/spanCore.js.map +1 -0
- package/dist/tools/subagent.js +224 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/subagentReport.js +114 -0
- package/dist/tools/subagentReport.js.map +1 -0
- package/dist/tools/tempSweep.js +118 -0
- package/dist/tools/tempSweep.js.map +1 -0
- package/dist/tools/todo.js +117 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/untrusted.js +46 -0
- package/dist/tools/untrusted.js.map +1 -0
- package/dist/tools/useSkill.js +62 -0
- package/dist/tools/useSkill.js.map +1 -0
- package/dist/tools/walk.js +152 -0
- package/dist/tools/walk.js.map +1 -0
- package/dist/tools/web.js +61 -0
- package/dist/tools/web.js.map +1 -0
- package/dist/tools/webFetch.js +444 -0
- package/dist/tools/webFetch.js.map +1 -0
- package/dist/tools/webSearch.js +130 -0
- package/dist/tools/webSearch.js.map +1 -0
- package/dist/tools/workspace.js +212 -0
- package/dist/tools/workspace.js.map +1 -0
- package/dist/tools/workspaceDiscover.js +216 -0
- package/dist/tools/workspaceDiscover.js.map +1 -0
- package/dist/tools/writeFile.js +162 -0
- package/dist/tools/writeFile.js.map +1 -0
- package/package.json +74 -28
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sessionMemoryCompact.ts — compacting without a model call.
|
|
3
|
+
*
|
|
4
|
+
* Session memory is already a structured, continuously-refreshed picture of what this
|
|
5
|
+
* session is doing, maintained outside the transcript (see `sessionMemory.ts`). When
|
|
6
|
+
* the transcript crosses the autocompact bar, the usual answer is to spend a whole
|
|
7
|
+
* summarizer call producing... a structured picture of what this session is doing.
|
|
8
|
+
* If the notes are current, that call is buying something we already own.
|
|
9
|
+
*
|
|
10
|
+
* So this runs first. It replaces the summarized prefix with the notes themselves and
|
|
11
|
+
* keeps the recent tail verbatim, for zero tokens and zero latency. Only when the
|
|
12
|
+
* notes are missing, still the untouched template, or too stale to have covered
|
|
13
|
+
* enough of the transcript does the summarizer get called.
|
|
14
|
+
*
|
|
15
|
+
* WHAT MAKES IT SAFE. The notes cover everything up to the entry index they were last
|
|
16
|
+
* refreshed at, and everything AFTER that index is kept verbatim. So the split is not
|
|
17
|
+
* a guess about what matters; it is the boundary between what has been written down
|
|
18
|
+
* and what has not. Stale notes do not lose work, they simply mean more of the tail
|
|
19
|
+
* has to be kept, which is exactly the case where this declines and lets the
|
|
20
|
+
* summarizer do its job.
|
|
21
|
+
*
|
|
22
|
+
* Pure except for reading the session object: it returns a new transcript or null and
|
|
23
|
+
* makes no model call, no I/O, and no decision about when to run.
|
|
24
|
+
*/
|
|
25
|
+
import { estimateEntriesTokens, groupByRound } from "./compaction.js";
|
|
26
|
+
import { SESSION_MEMORY_TEMPLATE } from "./sessionMemory.js";
|
|
27
|
+
const env = (name, fallback) => {
|
|
28
|
+
const v = Number(process.env[name]);
|
|
29
|
+
return Number.isFinite(v) && v > 0 ? v : fallback;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Least recent transcript we are willing to keep verbatim.
|
|
33
|
+
*
|
|
34
|
+
* Below this the notes are carrying nearly everything, and a compaction that leaves
|
|
35
|
+
* the model almost no raw recent context is the one that reads as amnesia even when
|
|
36
|
+
* the notes are good. If this cannot be met under the bar, decline and summarize.
|
|
37
|
+
*/
|
|
38
|
+
export const SM_KEEP_MIN_TOKENS = env("MINDWEAVE_SM_COMPACT_MIN", 10_000);
|
|
39
|
+
/**
|
|
40
|
+
* Most recent transcript we are willing to keep verbatim.
|
|
41
|
+
*
|
|
42
|
+
* The point of compacting is to reclaim room; keeping an unbounded tail because it
|
|
43
|
+
* happens to fit would leave the next compaction due almost immediately.
|
|
44
|
+
*/
|
|
45
|
+
export const SM_KEEP_MAX_TOKENS = env("MINDWEAVE_SM_COMPACT_MAX", 40_000);
|
|
46
|
+
/** Prepended to the notes when they stand in for the summarized prefix. Deliberately
|
|
47
|
+
* close to the summary's own resume prefix: from the model's side this IS the summary,
|
|
48
|
+
* and telling it which machinery produced its context would only invite commentary. */
|
|
49
|
+
const RESUME_PREFIX = "[Earlier conversation compacted to save context. Your maintained session notes " +
|
|
50
|
+
"below are the record of it. Continue as if the break never happened — do not " +
|
|
51
|
+
"acknowledge the compaction or recap it.]\n\n";
|
|
52
|
+
/**
|
|
53
|
+
* Are these notes real, or just the skeleton nobody has filled in yet (pure)?
|
|
54
|
+
*
|
|
55
|
+
* The template ships with headers and italic `_descriptions_` that the model leaves
|
|
56
|
+
* intact and writes beneath, so "non-empty" is not the same as "has content". Strip
|
|
57
|
+
* everything the template already contained and see whether anything is left.
|
|
58
|
+
*/
|
|
59
|
+
export function hasRealNotes(notes) {
|
|
60
|
+
const substance = (text) => text
|
|
61
|
+
.split("\n")
|
|
62
|
+
.map((line) => line.trim())
|
|
63
|
+
.filter((line) => line && !line.startsWith("#") && !(line.startsWith("_") && line.endsWith("_")))
|
|
64
|
+
.join("\n");
|
|
65
|
+
const written = substance(notes ?? "");
|
|
66
|
+
if (!written)
|
|
67
|
+
return false;
|
|
68
|
+
// A model that echoes a stretch of the template verbatim has still written nothing.
|
|
69
|
+
return written !== substance(SESSION_MEMORY_TEMPLATE);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The most recent whole rounds that fit in `budget` tokens (pure).
|
|
73
|
+
*
|
|
74
|
+
* Rounds rather than entries, for the reason `groupByRound` exists: a round with six
|
|
75
|
+
* parallel tool calls is seven entries, so counting entries can sever a call from its
|
|
76
|
+
* result and turn a merely-long request into a malformed one. Whole rounds only, taken
|
|
77
|
+
* from the end.
|
|
78
|
+
*/
|
|
79
|
+
export function recentRoundsWithin(entries, budget) {
|
|
80
|
+
const groups = groupByRound(entries);
|
|
81
|
+
const kept = [];
|
|
82
|
+
let total = 0;
|
|
83
|
+
for (let i = groups.length - 1; i >= 0; i--) {
|
|
84
|
+
const group = groups[i];
|
|
85
|
+
const cost = estimateEntriesTokens(group);
|
|
86
|
+
if (total + cost > budget && kept.length > 0)
|
|
87
|
+
break;
|
|
88
|
+
// The newest round is taken even if it alone exceeds the budget: returning nothing
|
|
89
|
+
// would hand the model a summary and no working context at all, which is worse
|
|
90
|
+
// than being slightly over. The caller's own bar check is what catches that.
|
|
91
|
+
kept.unshift(group);
|
|
92
|
+
total += cost;
|
|
93
|
+
if (total >= budget)
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
return kept.flat();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Compact using the session notes instead of a summarizer call (pure), or null to
|
|
100
|
+
* decline.
|
|
101
|
+
*
|
|
102
|
+
* Declines when there is nothing written down, when the notes cover none of the
|
|
103
|
+
* transcript, or when the result would not actually get under `targetTokens` — in
|
|
104
|
+
* which case spending the summarizer call is the right answer and this must not
|
|
105
|
+
* pretend otherwise. `overhead` is everything outside the transcript, so the target
|
|
106
|
+
* is measured in the same currency the compaction bars use.
|
|
107
|
+
*/
|
|
108
|
+
export function compactFromSessionMemory(entries, notes, coveredEntries, targetTokens, overhead) {
|
|
109
|
+
if (!hasRealNotes(notes))
|
|
110
|
+
return null;
|
|
111
|
+
// Without a boundary we cannot say which part of the transcript the notes describe,
|
|
112
|
+
// and keeping the wrong half is the one failure this must never risk.
|
|
113
|
+
if (coveredEntries === undefined || coveredEntries <= 0)
|
|
114
|
+
return null;
|
|
115
|
+
if (coveredEntries > entries.length)
|
|
116
|
+
return null;
|
|
117
|
+
const summaryEntry = { role: "summary", content: RESUME_PREFIX + (notes ?? "").trim() };
|
|
118
|
+
const fixed = estimateEntriesTokens([summaryEntry]) + overhead;
|
|
119
|
+
// What the tail may cost and still leave us under the bar, capped so a compaction
|
|
120
|
+
// that technically fits does not leave the next one due immediately.
|
|
121
|
+
const budget = Math.min(SM_KEEP_MAX_TOKENS, targetTokens - fixed);
|
|
122
|
+
if (budget < SM_KEEP_MIN_TOKENS)
|
|
123
|
+
return null;
|
|
124
|
+
// Only the uncovered tail is a candidate: anything earlier is already in the notes,
|
|
125
|
+
// and keeping it verbatim as well would pay for it twice.
|
|
126
|
+
const uncovered = entries.slice(coveredEntries);
|
|
127
|
+
const tail = recentRoundsWithin(uncovered.length > 0 ? uncovered : entries.slice(-1), budget);
|
|
128
|
+
if (tail.length === 0)
|
|
129
|
+
return null;
|
|
130
|
+
const result = [summaryEntry, ...tail];
|
|
131
|
+
// The decisive check. Everything above is an attempt; this is whether it worked.
|
|
132
|
+
if (estimateEntriesTokens(result) + overhead > targetTokens)
|
|
133
|
+
return null;
|
|
134
|
+
return { entries: result, kept: tail.length };
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=sessionMemoryCompact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionMemoryCompact.js","sourceRoot":"","sources":["../../src/memory/sessionMemoryCompact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAU,EAAE;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpD,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;AAE1E;;wFAEwF;AACxF,MAAM,aAAa,GACjB,iFAAiF;IACjF,+EAA+E;IAC/E,8CAA8C,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAyB;IACpD,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CACzC,IAAI;SACD,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;SAChG,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,oFAAoF;IACpF,OAAO,OAAO,KAAK,SAAS,CAAC,uBAAuB,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAyB,EAAE,MAAc;IAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACzB,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,KAAK,GAAG,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM;QACpD,mFAAmF;QACnF,+EAA+E;QAC/E,6EAA6E;QAC7E,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpB,KAAK,IAAI,IAAI,CAAC;QACd,IAAI,KAAK,IAAI,MAAM;YAAE,MAAM;IAC7B,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC;AASD;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAyB,EACzB,KAAyB,EACzB,cAAkC,EAClC,YAAoB,EACpB,QAAgB;IAEhB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,oFAAoF;IACpF,sEAAsE;IACtE,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,IAAI,cAAc,GAAG,OAAO,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEjD,MAAM,YAAY,GAAU,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IAC/F,MAAM,KAAK,GAAG,qBAAqB,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,QAAQ,CAAC;IAE/D,kFAAkF;IAClF,qEAAqE;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,YAAY,GAAG,KAAK,CAAC,CAAC;IAClE,IAAI,MAAM,GAAG,kBAAkB;QAAE,OAAO,IAAI,CAAC;IAE7C,oFAAoF;IACpF,0DAA0D;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,MAAM,GAAG,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;IACvC,iFAAiF;IACjF,IAAI,qBAAqB,CAAC,MAAM,CAAC,GAAG,QAAQ,GAAG,YAAY;QAAE,OAAO,IAAI,CAAC;IACzE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* store.ts — where sessions live on disk.
|
|
3
|
+
*
|
|
4
|
+
* Sessions are persisted OUTSIDE the project, under the user's home directory
|
|
5
|
+
* (`~/.mindweave/projects/<sanitized-project-path>/`), keyed by which project they
|
|
6
|
+
* belong to. This keeps a project's git tree
|
|
7
|
+
* clean while still letting you resume exactly where you left off, per project.
|
|
8
|
+
*
|
|
9
|
+
* Each session is two files:
|
|
10
|
+
* <id>.jsonl — the transcript, one Entry per line (append-friendly, but
|
|
11
|
+
* rewritten wholesale at end of turn so compaction's edits
|
|
12
|
+
* to earlier entries are reflected — a transcript is bounded
|
|
13
|
+
* by compaction, so the rewrite is cheap).
|
|
14
|
+
* <id>.meta.json — small descriptor (prompts, timestamps) the resume picker
|
|
15
|
+
* reads without parsing the whole transcript.
|
|
16
|
+
*
|
|
17
|
+
* All persistence is best-effort: a failed write logs nothing and never breaks a
|
|
18
|
+
* turn (the in-memory session is the source of truth during a run). This is the
|
|
19
|
+
* CLIENT side of the eventual client/server split — the pure engine never calls
|
|
20
|
+
* anything in here.
|
|
21
|
+
*/
|
|
22
|
+
import { promises as fs } from "node:fs";
|
|
23
|
+
import { homedir } from "node:os";
|
|
24
|
+
import { join } from "node:path";
|
|
25
|
+
import { writeFileAtomic } from "../tools/atomicWrite.js";
|
|
26
|
+
/** Turn a project path into a single safe directory name (e.g. `D:\proj` → `D--proj`). */
|
|
27
|
+
export function sanitizeProjectPath(cwd) {
|
|
28
|
+
return cwd.replace(/[/\\:]+/g, "-").replace(/^-+|-+$/g, "") || "root";
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The per-project state directory under the user's home: where everything Mindweave
|
|
32
|
+
* keeps for a given project lives — sessions today, and per-project rules /
|
|
33
|
+
* skills / forbidden (the governor). One scheme, one source of truth, so a
|
|
34
|
+
* project's state is always filed under the same key.
|
|
35
|
+
*/
|
|
36
|
+
export function projectDir(projectCwd) {
|
|
37
|
+
return join(stateRoot(), "projects", sanitizeProjectPath(projectCwd));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Where Mindweave keeps everything, overridable.
|
|
41
|
+
*
|
|
42
|
+
* The override is not a feature, it is the fix for a real mess. This path is derived
|
|
43
|
+
* from the working directory, so a test that ran anything against a temp directory
|
|
44
|
+
* wrote a permanent folder into the user's HOME. Measured on this machine: 6,761 of
|
|
45
|
+
* 6,770 directories under `~/.mindweave/projects` were test litter, growing with every
|
|
46
|
+
* suite run and never cleaned up, because nothing knew they were disposable.
|
|
47
|
+
*
|
|
48
|
+
* Read on every call rather than once at import, so a test can point it somewhere
|
|
49
|
+
* disposable before touching anything. The default is unchanged, so a real session is
|
|
50
|
+
* unaffected.
|
|
51
|
+
*/
|
|
52
|
+
export function stateRoot() {
|
|
53
|
+
const override = process.env.MINDWEAVE_STATE_DIR?.trim();
|
|
54
|
+
return override ? override : join(homedir(), ".mindweave");
|
|
55
|
+
}
|
|
56
|
+
/** The directory holding all sessions for a given project (its state dir). */
|
|
57
|
+
export function sessionDir(projectCwd) {
|
|
58
|
+
return projectDir(projectCwd);
|
|
59
|
+
}
|
|
60
|
+
/** Where a session's transcript lives. Exported so a cleared session can tell the
|
|
61
|
+
* model where the conversation it just lost can still be read. */
|
|
62
|
+
export function transcriptPath(projectCwd, id) {
|
|
63
|
+
return join(sessionDir(projectCwd), `${id}.jsonl`);
|
|
64
|
+
}
|
|
65
|
+
/** Sidecar file holding a session's maintained "session memory" notes. */
|
|
66
|
+
function notesPath(projectCwd, id) {
|
|
67
|
+
return join(sessionDir(projectCwd), `${id}.notes.md`);
|
|
68
|
+
}
|
|
69
|
+
/** Load a session's session-memory notes, or "" if none. */
|
|
70
|
+
export async function loadSessionNotes(projectCwd, id) {
|
|
71
|
+
try {
|
|
72
|
+
return (await fs.readFile(notesPath(projectCwd, id), "utf8")).trim();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return "";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function metaPath(projectCwd, id) {
|
|
79
|
+
return join(sessionDir(projectCwd), `${id}.meta.json`);
|
|
80
|
+
}
|
|
81
|
+
function firstUserText(transcript) {
|
|
82
|
+
return transcript.find((e) => e.role === "user")?.content.trim() ?? "";
|
|
83
|
+
}
|
|
84
|
+
/** The last thing the PERSON said. Engine-written nudges arrive as `user` messages so
|
|
85
|
+
* the model treats them as instruction, but they are not prompts and must not be
|
|
86
|
+
* shown as one — this is what the session picker labels a session with. */
|
|
87
|
+
function lastUserText(transcript) {
|
|
88
|
+
for (let i = transcript.length - 1; i >= 0; i--) {
|
|
89
|
+
const e = transcript[i];
|
|
90
|
+
if (e.role === "user" && !e.synthetic)
|
|
91
|
+
return e.content.trim();
|
|
92
|
+
}
|
|
93
|
+
return "";
|
|
94
|
+
}
|
|
95
|
+
function clip(s, max = 200) {
|
|
96
|
+
const flat = s.replace(/\s+/g, " ").trim();
|
|
97
|
+
return flat.length <= max ? flat : flat.slice(0, max - 1) + "…";
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Write the session to disk (transcript + meta). Best-effort: returns false on
|
|
101
|
+
* any failure instead of throwing, so a persistence hiccup never aborts a turn.
|
|
102
|
+
*/
|
|
103
|
+
export async function saveSession(session) {
|
|
104
|
+
try {
|
|
105
|
+
const dir = sessionDir(session.cwd);
|
|
106
|
+
await fs.mkdir(dir, { recursive: true });
|
|
107
|
+
const lines = session.transcript.map((e) => JSON.stringify(e)).join("\n");
|
|
108
|
+
// ATOMIC, like every other write in the project. `fs.writeFile` truncates the
|
|
109
|
+
// destination and then streams the new bytes in, so between those two moments the
|
|
110
|
+
// file on disk is empty or half-written. This file is rewritten WHOLE on every
|
|
111
|
+
// persist — before each tool batch, after each result, after each reply — so a
|
|
112
|
+
// session crossing that window is not exotic, and the crash that lands there is
|
|
113
|
+
// exactly the kind this project has already met (an OOM kill runs no handlers).
|
|
114
|
+
// What is lost is the user's entire conversation, and a zero-byte transcript is
|
|
115
|
+
// unrecoverable rather than merely damaged: the resume path finds nothing at all.
|
|
116
|
+
// The same reasoning already protects the user's SOURCE files; their session was
|
|
117
|
+
// the one thing still written the unsafe way.
|
|
118
|
+
await writeFileAtomic(transcriptPath(session.cwd, session.id), lines + "\n");
|
|
119
|
+
// Extra roots = everything on the tool context beyond the primary (session.cwd).
|
|
120
|
+
const extraRoots = (session.toolContext.roots ?? []).filter((r) => r !== session.cwd);
|
|
121
|
+
const meta = {
|
|
122
|
+
id: session.id,
|
|
123
|
+
cwd: session.cwd,
|
|
124
|
+
createdAt: session.createdAt,
|
|
125
|
+
updatedAt: Date.now(),
|
|
126
|
+
firstPrompt: clip(firstUserText(session.transcript)),
|
|
127
|
+
lastPrompt: clip(lastUserText(session.transcript)),
|
|
128
|
+
entryCount: session.transcript.length,
|
|
129
|
+
// Unconditional: a session with no model recorded is one whose behaviour cannot
|
|
130
|
+
// be compared against any other.
|
|
131
|
+
...(session.modelConfig?.model ? { model: session.modelConfig.model } : {}),
|
|
132
|
+
...(extraRoots.length > 0 ? { extraRoots } : {}),
|
|
133
|
+
// Only once something has actually been spent, so a session that never ran a turn
|
|
134
|
+
// does not carry a row of zeroes claiming to be a measurement.
|
|
135
|
+
...(session.spend && session.spend.turns > 0 ? { spend: session.spend } : {}),
|
|
136
|
+
// The per-call breakdown, which is what makes a surprising bill diagnosable: the
|
|
137
|
+
// totals above are identical whether a turn made one expensive call or six cheap
|
|
138
|
+
// ones, and that difference is the whole answer.
|
|
139
|
+
...(session.callLog && session.callLog.length > 0 ? { callLog: session.callLog } : {}),
|
|
140
|
+
// Deferred tools the model surfaced this session, so a resume re-advertises them
|
|
141
|
+
// instead of stripping a tool it was mid-use of (see registry.toolSchemas).
|
|
142
|
+
...(session.toolContext.activatedTools && session.toolContext.activatedTools.size > 0
|
|
143
|
+
? { activatedTools: [...session.toolContext.activatedTools] }
|
|
144
|
+
: {}),
|
|
145
|
+
};
|
|
146
|
+
await writeFileAtomic(metaPath(session.cwd, session.id), JSON.stringify(meta, null, 2));
|
|
147
|
+
// Session-memory notes sidecar (the maintained running state), when present.
|
|
148
|
+
if (session.sessionMemory && session.sessionMemory.trim()) {
|
|
149
|
+
await writeFileAtomic(notesPath(session.cwd, session.id), session.sessionMemory);
|
|
150
|
+
}
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** Load a session's transcript from disk, or null if it isn't there / is unreadable. */
|
|
158
|
+
export async function loadTranscript(projectCwd, id) {
|
|
159
|
+
try {
|
|
160
|
+
const raw = await fs.readFile(transcriptPath(projectCwd, id), "utf8");
|
|
161
|
+
const entries = [];
|
|
162
|
+
for (const line of raw.split("\n")) {
|
|
163
|
+
const trimmed = line.trim();
|
|
164
|
+
if (!trimmed)
|
|
165
|
+
continue;
|
|
166
|
+
try {
|
|
167
|
+
entries.push(JSON.parse(trimmed));
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Skip a corrupt line rather than losing the whole session.
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return entries;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** Load one session's descriptor (for resume — carries extraRoots/createdAt), or null. */
|
|
180
|
+
export async function loadMeta(projectCwd, id) {
|
|
181
|
+
try {
|
|
182
|
+
const raw = await fs.readFile(metaPath(projectCwd, id), "utf8");
|
|
183
|
+
return JSON.parse(raw);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** List this project's sessions, most-recently-updated first. */
|
|
190
|
+
export async function listSessions(projectCwd) {
|
|
191
|
+
const dir = sessionDir(projectCwd);
|
|
192
|
+
let names;
|
|
193
|
+
try {
|
|
194
|
+
names = await fs.readdir(dir);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
const metas = [];
|
|
200
|
+
for (const name of names) {
|
|
201
|
+
if (!name.endsWith(".meta.json"))
|
|
202
|
+
continue;
|
|
203
|
+
try {
|
|
204
|
+
const raw = await fs.readFile(join(dir, name), "utf8");
|
|
205
|
+
metas.push(JSON.parse(raw));
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Skip unreadable/corrupt meta files.
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return metas.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
212
|
+
}
|
|
213
|
+
/** The most recent session for this project, or null if there are none. */
|
|
214
|
+
export async function latestSession(projectCwd) {
|
|
215
|
+
return (await listSessions(projectCwd))[0] ?? null;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The whole-file paths a tool entry carries, as a list.
|
|
3
|
+
*
|
|
4
|
+
* Exists because the field was a single path before read_file could read several files
|
|
5
|
+
* at once, and sessions on disk still hold that shape. Resuming one and silently getting
|
|
6
|
+
* no presence for its reads would make the model re-read files it already has — the
|
|
7
|
+
* exact waste the recording was added to prevent.
|
|
8
|
+
*/
|
|
9
|
+
export function fullPathsOf(entry) {
|
|
10
|
+
if (entry.role !== "tool" || !entry.fullContentOf)
|
|
11
|
+
return [];
|
|
12
|
+
return typeof entry.fullContentOf === "string" ? [entry.fullContentOf] : entry.fullContentOf;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAmFA;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAC7D,OAAO,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;AAC/F,CAAC"}
|