@nookplot/runtime 0.5.131 → 0.5.132
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/dist/__tests__/apiMarketplace.test.d.ts +2 -0
- package/dist/__tests__/apiMarketplace.test.d.ts.map +1 -0
- package/dist/__tests__/apiMarketplace.test.js +102 -0
- package/dist/__tests__/apiMarketplace.test.js.map +1 -0
- package/dist/__tests__/autonomous.actionDispatch.test.d.ts +2 -0
- package/dist/__tests__/autonomous.actionDispatch.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.actionDispatch.test.js +287 -0
- package/dist/__tests__/autonomous.actionDispatch.test.js.map +1 -0
- package/dist/__tests__/autonomous.dedup.test.d.ts +2 -0
- package/dist/__tests__/autonomous.dedup.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.dedup.test.js +125 -0
- package/dist/__tests__/autonomous.dedup.test.js.map +1 -0
- package/dist/__tests__/autonomous.doomLoop.test.d.ts +2 -0
- package/dist/__tests__/autonomous.doomLoop.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.doomLoop.test.js +126 -0
- package/dist/__tests__/autonomous.doomLoop.test.js.map +1 -0
- package/dist/__tests__/autonomous.getAvailableActions.test.d.ts +2 -0
- package/dist/__tests__/autonomous.getAvailableActions.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.getAvailableActions.test.js +233 -0
- package/dist/__tests__/autonomous.getAvailableActions.test.js.map +1 -0
- package/dist/__tests__/autonomous.guardrails.test.d.ts +2 -0
- package/dist/__tests__/autonomous.guardrails.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.guardrails.test.js +215 -0
- package/dist/__tests__/autonomous.guardrails.test.js.map +1 -0
- package/dist/__tests__/autonomous.hooks.test.d.ts +2 -0
- package/dist/__tests__/autonomous.hooks.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.hooks.test.js +107 -0
- package/dist/__tests__/autonomous.hooks.test.js.map +1 -0
- package/dist/__tests__/autonomous.latentSpace.test.d.ts +2 -0
- package/dist/__tests__/autonomous.latentSpace.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.latentSpace.test.js +224 -0
- package/dist/__tests__/autonomous.latentSpace.test.js.map +1 -0
- package/dist/__tests__/autonomous.lifecycle.test.d.ts +2 -0
- package/dist/__tests__/autonomous.lifecycle.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.lifecycle.test.js +147 -0
- package/dist/__tests__/autonomous.lifecycle.test.js.map +1 -0
- package/dist/__tests__/autonomous.loadedSkillRefs.test.d.ts +2 -0
- package/dist/__tests__/autonomous.loadedSkillRefs.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.loadedSkillRefs.test.js +150 -0
- package/dist/__tests__/autonomous.loadedSkillRefs.test.js.map +1 -0
- package/dist/__tests__/chatEngine.episodicHook.test.d.ts +2 -0
- package/dist/__tests__/chatEngine.episodicHook.test.d.ts.map +1 -0
- package/dist/__tests__/chatEngine.episodicHook.test.js +160 -0
- package/dist/__tests__/chatEngine.episodicHook.test.js.map +1 -0
- package/dist/__tests__/chatEngine.test.d.ts +2 -0
- package/dist/__tests__/chatEngine.test.d.ts.map +1 -0
- package/dist/__tests__/chatEngine.test.js +482 -0
- package/dist/__tests__/chatEngine.test.js.map +1 -0
- package/dist/__tests__/codegen-drift.test.d.ts +23 -0
- package/dist/__tests__/codegen-drift.test.d.ts.map +1 -0
- package/dist/__tests__/codegen-drift.test.js +185 -0
- package/dist/__tests__/codegen-drift.test.js.map +1 -0
- package/dist/__tests__/contentSafety.test.d.ts +2 -0
- package/dist/__tests__/contentSafety.test.d.ts.map +1 -0
- package/dist/__tests__/contentSafety.test.js +90 -0
- package/dist/__tests__/contentSafety.test.js.map +1 -0
- package/dist/__tests__/conversation/compactionMemory.test.d.ts +2 -0
- package/dist/__tests__/conversation/compactionMemory.test.d.ts.map +1 -0
- package/dist/__tests__/conversation/compactionMemory.test.js +447 -0
- package/dist/__tests__/conversation/compactionMemory.test.js.map +1 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.d.ts +2 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.d.ts.map +1 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.js +79 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.js.map +1 -0
- package/dist/__tests__/doomLoop.test.d.ts +6 -0
- package/dist/__tests__/doomLoop.test.d.ts.map +1 -0
- package/dist/__tests__/doomLoop.test.js +144 -0
- package/dist/__tests__/doomLoop.test.js.map +1 -0
- package/dist/__tests__/guardrails.test.d.ts +2 -0
- package/dist/__tests__/guardrails.test.d.ts.map +1 -0
- package/dist/__tests__/guardrails.test.js +236 -0
- package/dist/__tests__/guardrails.test.js.map +1 -0
- package/dist/__tests__/helpers/mockRuntime.d.ts +11 -0
- package/dist/__tests__/helpers/mockRuntime.d.ts.map +1 -0
- package/dist/__tests__/helpers/mockRuntime.js +146 -0
- package/dist/__tests__/helpers/mockRuntime.js.map +1 -0
- package/dist/__tests__/hooks.test.d.ts +9 -0
- package/dist/__tests__/hooks.test.d.ts.map +1 -0
- package/dist/__tests__/hooks.test.js +192 -0
- package/dist/__tests__/hooks.test.js.map +1 -0
- package/dist/__tests__/manifestActivationHook.test.d.ts +2 -0
- package/dist/__tests__/manifestActivationHook.test.d.ts.map +1 -0
- package/dist/__tests__/manifestActivationHook.test.js +312 -0
- package/dist/__tests__/manifestActivationHook.test.js.map +1 -0
- package/dist/__tests__/memory.test.d.ts +2 -0
- package/dist/__tests__/memory.test.d.ts.map +1 -0
- package/dist/__tests__/memory.test.js +192 -0
- package/dist/__tests__/memory.test.js.map +1 -0
- package/dist/__tests__/onChainActions.parity.test.d.ts +12 -0
- package/dist/__tests__/onChainActions.parity.test.d.ts.map +1 -0
- package/dist/__tests__/onChainActions.parity.test.js +104 -0
- package/dist/__tests__/onChainActions.parity.test.js.map +1 -0
- package/dist/__tests__/querySegmentation.test.d.ts +2 -0
- package/dist/__tests__/querySegmentation.test.d.ts.map +1 -0
- package/dist/__tests__/querySegmentation.test.js +187 -0
- package/dist/__tests__/querySegmentation.test.js.map +1 -0
- package/dist/__tests__/sandbox.test.d.ts +13 -0
- package/dist/__tests__/sandbox.test.d.ts.map +1 -0
- package/dist/__tests__/sandbox.test.js +413 -0
- package/dist/__tests__/sandbox.test.js.map +1 -0
- package/dist/__tests__/signing.test.d.ts +2 -0
- package/dist/__tests__/signing.test.d.ts.map +1 -0
- package/dist/__tests__/signing.test.js +260 -0
- package/dist/__tests__/signing.test.js.map +1 -0
- package/dist/__tests__/wakeUpStack.test.d.ts +2 -0
- package/dist/__tests__/wakeUpStack.test.d.ts.map +1 -0
- package/dist/__tests__/wakeUpStack.test.js +239 -0
- package/dist/__tests__/wakeUpStack.test.js.map +1 -0
- package/dist/actionCatalog.d.ts +57 -0
- package/dist/actionCatalog.d.ts.map +1 -0
- package/dist/actionCatalog.generated.d.ts +4 -0
- package/dist/actionCatalog.generated.d.ts.map +1 -0
- package/dist/actionCatalog.generated.js +2194 -0
- package/dist/actionCatalog.generated.js.map +1 -0
- package/dist/actionCatalog.js +214 -0
- package/dist/actionCatalog.js.map +1 -0
- package/dist/api-marketplace.d.ts +111 -0
- package/dist/api-marketplace.d.ts.map +1 -0
- package/dist/api-marketplace.js +154 -0
- package/dist/api-marketplace.js.map +1 -0
- package/dist/artifactEmbeddings.d.ts +69 -0
- package/dist/artifactEmbeddings.d.ts.map +1 -0
- package/dist/artifactEmbeddings.js +52 -0
- package/dist/artifactEmbeddings.js.map +1 -0
- package/dist/autonomous.d.ts +271 -0
- package/dist/autonomous.d.ts.map +1 -0
- package/dist/autonomous.js +3517 -0
- package/dist/autonomous.js.map +1 -0
- package/dist/bounties.d.ts +112 -0
- package/dist/bounties.d.ts.map +1 -0
- package/dist/bounties.js +140 -0
- package/dist/bounties.js.map +1 -0
- package/dist/bundles.d.ts +174 -0
- package/dist/bundles.d.ts.map +1 -0
- package/dist/bundles.js +208 -0
- package/dist/bundles.js.map +1 -0
- package/dist/channels.d.ts +131 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +227 -0
- package/dist/channels.js.map +1 -0
- package/dist/chat/chatEngine.d.ts +138 -0
- package/dist/chat/chatEngine.d.ts.map +1 -0
- package/dist/chat/chatEngine.js +613 -0
- package/dist/chat/chatEngine.js.map +1 -0
- package/dist/chat/index.d.ts +30 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +29 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/terminal.d.ts +19 -0
- package/dist/chat/terminal.d.ts.map +1 -0
- package/dist/chat/terminal.js +17 -0
- package/dist/chat/terminal.js.map +1 -0
- package/dist/chat/terminals/discordTerminal.d.ts +22 -0
- package/dist/chat/terminals/discordTerminal.d.ts.map +1 -0
- package/dist/chat/terminals/discordTerminal.js +132 -0
- package/dist/chat/terminals/discordTerminal.js.map +1 -0
- package/dist/chat/terminals/openclawTerminal.d.ts +43 -0
- package/dist/chat/terminals/openclawTerminal.d.ts.map +1 -0
- package/dist/chat/terminals/openclawTerminal.js +186 -0
- package/dist/chat/terminals/openclawTerminal.js.map +1 -0
- package/dist/chat/terminals/stdinTerminal.d.ts +18 -0
- package/dist/chat/terminals/stdinTerminal.d.ts.map +1 -0
- package/dist/chat/terminals/stdinTerminal.js +58 -0
- package/dist/chat/terminals/stdinTerminal.js.map +1 -0
- package/dist/chat/terminals/telegramTerminal.d.ts +27 -0
- package/dist/chat/terminals/telegramTerminal.d.ts.map +1 -0
- package/dist/chat/terminals/telegramTerminal.js +123 -0
- package/dist/chat/terminals/telegramTerminal.js.map +1 -0
- package/dist/cognitiveWorkspace.d.ts +107 -0
- package/dist/cognitiveWorkspace.d.ts.map +1 -0
- package/dist/cognitiveWorkspace.js +94 -0
- package/dist/cognitiveWorkspace.js.map +1 -0
- package/dist/communities.d.ts +40 -0
- package/dist/communities.d.ts.map +1 -0
- package/dist/communities.js +53 -0
- package/dist/communities.js.map +1 -0
- package/dist/connection.d.ts +90 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +429 -0
- package/dist/connection.js.map +1 -0
- package/dist/contentSafety.d.ts +64 -0
- package/dist/contentSafety.d.ts.map +1 -0
- package/dist/contentSafety.js +119 -0
- package/dist/contentSafety.js.map +1 -0
- package/dist/conversation/compactionMemory.d.ts +124 -0
- package/dist/conversation/compactionMemory.d.ts.map +1 -0
- package/dist/conversation/compactionMemory.js +379 -0
- package/dist/conversation/compactionMemory.js.map +1 -0
- package/dist/conversation/conversationLogStore.d.ts +111 -0
- package/dist/conversation/conversationLogStore.d.ts.map +1 -0
- package/dist/conversation/conversationLogStore.js +248 -0
- package/dist/conversation/conversationLogStore.js.map +1 -0
- package/dist/conversation/conversationMemory.d.ts +59 -0
- package/dist/conversation/conversationMemory.d.ts.map +1 -0
- package/dist/conversation/conversationMemory.js +32 -0
- package/dist/conversation/conversationMemory.js.map +1 -0
- package/dist/conversation/index.d.ts +16 -0
- package/dist/conversation/index.d.ts.map +1 -0
- package/dist/conversation/index.js +5 -0
- package/dist/conversation/index.js.map +1 -0
- package/dist/conversation/modelLimits.d.ts +43 -0
- package/dist/conversation/modelLimits.d.ts.map +1 -0
- package/dist/conversation/modelLimits.js +67 -0
- package/dist/conversation/modelLimits.js.map +1 -0
- package/dist/cro.d.ts +243 -0
- package/dist/cro.d.ts.map +1 -0
- package/dist/cro.js +263 -0
- package/dist/cro.js.map +1 -0
- package/dist/defaultGuardrails.d.ts +21 -0
- package/dist/defaultGuardrails.d.ts.map +1 -0
- package/dist/defaultGuardrails.js +90 -0
- package/dist/defaultGuardrails.js.map +1 -0
- package/dist/delegations.d.ts +63 -0
- package/dist/delegations.d.ts.map +1 -0
- package/dist/delegations.js +41 -0
- package/dist/delegations.js.map +1 -0
- package/dist/discovery.d.ts +172 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +300 -0
- package/dist/discovery.js.map +1 -0
- package/dist/doomLoop.d.ts +52 -0
- package/dist/doomLoop.d.ts.map +1 -0
- package/dist/doomLoop.js +173 -0
- package/dist/doomLoop.js.map +1 -0
- package/dist/economy.d.ts +244 -0
- package/dist/economy.d.ts.map +1 -0
- package/dist/economy.js +263 -0
- package/dist/economy.js.map +1 -0
- package/dist/email.d.ts +125 -0
- package/dist/email.d.ts.map +1 -0
- package/dist/email.js +91 -0
- package/dist/email.js.map +1 -0
- package/dist/embeddingExchange.d.ts +141 -0
- package/dist/embeddingExchange.d.ts.map +1 -0
- package/dist/embeddingExchange.js +95 -0
- package/dist/embeddingExchange.js.map +1 -0
- package/dist/episodicMemoryHook.d.ts +39 -0
- package/dist/episodicMemoryHook.d.ts.map +1 -0
- package/dist/episodicMemoryHook.js +58 -0
- package/dist/episodicMemoryHook.js.map +1 -0
- package/dist/evaluator.d.ts +113 -0
- package/dist/evaluator.d.ts.map +1 -0
- package/dist/evaluator.js +144 -0
- package/dist/evaluator.js.map +1 -0
- package/dist/events.d.ts +58 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +86 -0
- package/dist/events.js.map +1 -0
- package/dist/formatters.d.ts +31 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +227 -0
- package/dist/formatters.js.map +1 -0
- package/dist/gpu.d.ts +137 -0
- package/dist/gpu.d.ts.map +1 -0
- package/dist/gpu.js +166 -0
- package/dist/gpu.js.map +1 -0
- package/dist/guardrails.d.ts +182 -0
- package/dist/guardrails.d.ts.map +1 -0
- package/dist/guardrails.js +277 -0
- package/dist/guardrails.js.map +1 -0
- package/dist/guilds.d.ts +158 -0
- package/dist/guilds.d.ts.map +1 -0
- package/dist/guilds.js +205 -0
- package/dist/guilds.js.map +1 -0
- package/dist/heartbeat.d.ts +43 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +72 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/hooks.d.ts +172 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +91 -0
- package/dist/hooks.js.map +1 -0
- package/dist/identity.d.ts +61 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +76 -0
- package/dist/identity.js.map +1 -0
- package/dist/inbox.d.ts +77 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +98 -0
- package/dist/inbox.js.map +1 -0
- package/dist/index.d.ts +321 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +361 -0
- package/dist/index.js.map +1 -0
- package/dist/insights.d.ts +166 -0
- package/dist/insights.d.ts.map +1 -0
- package/dist/insights.js +100 -0
- package/dist/insights.js.map +1 -0
- package/dist/intents.d.ts +132 -0
- package/dist/intents.d.ts.map +1 -0
- package/dist/intents.js +81 -0
- package/dist/intents.js.map +1 -0
- package/dist/knowledgeContext.d.ts +68 -0
- package/dist/knowledgeContext.d.ts.map +1 -0
- package/dist/knowledgeContext.js +109 -0
- package/dist/knowledgeContext.js.map +1 -0
- package/dist/leaderboard.d.ts +30 -0
- package/dist/leaderboard.d.ts.map +1 -0
- package/dist/leaderboard.js +34 -0
- package/dist/leaderboard.js.map +1 -0
- package/dist/manifest.d.ts +127 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +123 -0
- package/dist/manifest.js.map +1 -0
- package/dist/manifestActivationHook.d.ts +72 -0
- package/dist/manifestActivationHook.d.ts.map +1 -0
- package/dist/manifestActivationHook.js +180 -0
- package/dist/manifestActivationHook.js.map +1 -0
- package/dist/marketplace.d.ts +156 -0
- package/dist/marketplace.d.ts.map +1 -0
- package/dist/marketplace.js +215 -0
- package/dist/marketplace.js.map +1 -0
- package/dist/matching.d.ts +192 -0
- package/dist/matching.d.ts.map +1 -0
- package/dist/matching.js +138 -0
- package/dist/matching.js.map +1 -0
- package/dist/memory.d.ts +287 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +379 -0
- package/dist/memory.js.map +1 -0
- package/dist/mining.d.ts +155 -0
- package/dist/mining.d.ts.map +1 -0
- package/dist/mining.js +365 -0
- package/dist/mining.js.map +1 -0
- package/dist/oracle.d.ts +30 -0
- package/dist/oracle.d.ts.map +1 -0
- package/dist/oracle.js +31 -0
- package/dist/oracle.js.map +1 -0
- package/dist/policies.d.ts +132 -0
- package/dist/policies.d.ts.map +1 -0
- package/dist/policies.js +62 -0
- package/dist/policies.js.map +1 -0
- package/dist/proactive.d.ts +197 -0
- package/dist/proactive.d.ts.map +1 -0
- package/dist/proactive.js +229 -0
- package/dist/proactive.js.map +1 -0
- package/dist/projects.d.ts +307 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +438 -0
- package/dist/projects.js.map +1 -0
- package/dist/querySegmentation.d.ts +54 -0
- package/dist/querySegmentation.d.ts.map +1 -0
- package/dist/querySegmentation.js +80 -0
- package/dist/querySegmentation.js.map +1 -0
- package/dist/sandbox.d.ts +156 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +425 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/signalActionMap.d.ts +59 -0
- package/dist/signalActionMap.d.ts.map +1 -0
- package/dist/signalActionMap.js +305 -0
- package/dist/signalActionMap.js.map +1 -0
- package/dist/signing.d.ts +94 -0
- package/dist/signing.d.ts.map +1 -0
- package/dist/signing.js +158 -0
- package/dist/signing.js.map +1 -0
- package/dist/social.d.ts +176 -0
- package/dist/social.d.ts.map +1 -0
- package/dist/social.js +232 -0
- package/dist/social.js.map +1 -0
- package/dist/specialization.d.ts +108 -0
- package/dist/specialization.d.ts.map +1 -0
- package/dist/specialization.js +104 -0
- package/dist/specialization.js.map +1 -0
- package/dist/swarms.d.ts +106 -0
- package/dist/swarms.d.ts.map +1 -0
- package/dist/swarms.js +99 -0
- package/dist/swarms.js.map +1 -0
- package/dist/teaching.d.ts +171 -0
- package/dist/teaching.d.ts.map +1 -0
- package/dist/teaching.js +87 -0
- package/dist/teaching.js.map +1 -0
- package/dist/tools.d.ts +223 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +325 -0
- package/dist/tools.js.map +1 -0
- package/dist/treasury-ops.d.ts +101 -0
- package/dist/treasury-ops.d.ts.map +1 -0
- package/dist/treasury-ops.js +59 -0
- package/dist/treasury-ops.js.map +1 -0
- package/dist/types.d.ts +1193 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/wakeUpStack.d.ts +94 -0
- package/dist/wakeUpStack.d.ts.map +1 -0
- package/dist/wakeUpStack.js +215 -0
- package/dist/wakeUpStack.js.map +1 -0
- package/dist/workspace.d.ts +318 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +207 -0
- package/dist/workspace.js.map +1 -0
- package/dist/xmtp.d.ts +85 -0
- package/dist/xmtp.d.ts.map +1 -0
- package/dist/xmtp.js +250 -0
- package/dist/xmtp.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ConversationLogStore` — JSONL-on-disk persistence for `CompactionMemory`.
|
|
3
|
+
*
|
|
4
|
+
* Two implementations:
|
|
5
|
+
* - {@link LocalConversationLogStore} — one JSONL file per session under a
|
|
6
|
+
* fixed base directory. Append-only writes are durable across restarts.
|
|
7
|
+
* - {@link InMemoryConversationLogStore} — in-process map; the standard test
|
|
8
|
+
* double for unit suites that don't want disk IO.
|
|
9
|
+
*
|
|
10
|
+
* **Path-traversal defense.** The disk store hashes every `sessionId` to a safe
|
|
11
|
+
* filename — the LLM never reaches the filesystem because (a) `sessionId` comes
|
|
12
|
+
* from the closure, not LLM args, and (b) even if a caller forgets and pipes
|
|
13
|
+
* something attacker-controlled in, the hash strips path metacharacters.
|
|
14
|
+
*
|
|
15
|
+
* @module conversation/conversationLogStore
|
|
16
|
+
*/
|
|
17
|
+
import { mkdir, readFile, appendFile, access, readdir, unlink } from "node:fs/promises";
|
|
18
|
+
import { join, resolve } from "node:path";
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
// ── In-memory implementation ─────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* In-process log store for tests. Round-trips identically to
|
|
23
|
+
* `LocalConversationLogStore` but never touches disk.
|
|
24
|
+
*/
|
|
25
|
+
export class InMemoryConversationLogStore {
|
|
26
|
+
logs = new Map();
|
|
27
|
+
async append(sessionId, entry) {
|
|
28
|
+
let list = this.logs.get(sessionId);
|
|
29
|
+
if (!list) {
|
|
30
|
+
list = [];
|
|
31
|
+
this.logs.set(sessionId, list);
|
|
32
|
+
}
|
|
33
|
+
list.push(entry);
|
|
34
|
+
}
|
|
35
|
+
async exists(sessionId) {
|
|
36
|
+
return this.logs.has(sessionId);
|
|
37
|
+
}
|
|
38
|
+
async read(sessionId) {
|
|
39
|
+
const list = this.logs.get(sessionId);
|
|
40
|
+
return list ? list.slice() : [];
|
|
41
|
+
}
|
|
42
|
+
async searchMessages(sessionId, query, maxResults) {
|
|
43
|
+
return searchEntries(await this.read(sessionId), query, maxResults);
|
|
44
|
+
}
|
|
45
|
+
async listSessions() {
|
|
46
|
+
return [...this.logs.keys()];
|
|
47
|
+
}
|
|
48
|
+
async delete(sessionId) {
|
|
49
|
+
this.logs.delete(sessionId);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* JSONL-on-disk log. One file per session, named by SHA-256 of the
|
|
54
|
+
* `sessionId` so the on-disk layout is path-traversal-safe even if a caller
|
|
55
|
+
* pipes attacker-controlled input as the session id.
|
|
56
|
+
*
|
|
57
|
+
* The original `sessionId` is stored alongside the hashed filename in a
|
|
58
|
+
* sidecar map (`<baseDir>/_sessions.json`) so {@link listSessions} can return
|
|
59
|
+
* the human-readable identifiers.
|
|
60
|
+
*
|
|
61
|
+
* **Concurrency.** Appends and sidecar writes within ONE instance are
|
|
62
|
+
* serialized via a per-instance promise chain — calling `append()` ten times
|
|
63
|
+
* in parallel produces ten lines in call order, not ten interleaved partial
|
|
64
|
+
* writes. Concurrent writers across *processes* (same baseDir, different
|
|
65
|
+
* runtime instances) are still unsafe; the store is intended for single-
|
|
66
|
+
* process agents. Use separate `baseDir`s per process to avoid cross-process
|
|
67
|
+
* races on `_sessions.json`.
|
|
68
|
+
*/
|
|
69
|
+
export class LocalConversationLogStore {
|
|
70
|
+
baseDir;
|
|
71
|
+
indexLoaded = false;
|
|
72
|
+
index = new Map(); // sessionId → relative filename
|
|
73
|
+
indexFilePromise = null;
|
|
74
|
+
/**
|
|
75
|
+
* In-process mutation chain. Any method that reads *and* writes shared state
|
|
76
|
+
* (`index`, `_sessions.json`, session JSONL files) awaits the previous op
|
|
77
|
+
* before starting. Read-only ops can skip this.
|
|
78
|
+
*/
|
|
79
|
+
mutationChain = Promise.resolve();
|
|
80
|
+
constructor(opts = {}) {
|
|
81
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? ".";
|
|
82
|
+
this.baseDir = resolve(opts.baseDir ?? join(home, ".nookplot", "conversations"));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Run `fn` serialized against any other mutation on this instance. Failures
|
|
86
|
+
* in `fn` are surfaced to the caller but do NOT poison the chain — the next
|
|
87
|
+
* call starts from a resolved state.
|
|
88
|
+
*/
|
|
89
|
+
serialize(fn) {
|
|
90
|
+
const run = this.mutationChain.then(fn, fn);
|
|
91
|
+
this.mutationChain = run.then(() => undefined, () => undefined);
|
|
92
|
+
return run;
|
|
93
|
+
}
|
|
94
|
+
/** Filename for a session: 32-char SHA-256 prefix + `.jsonl`. */
|
|
95
|
+
fileFor(sessionId) {
|
|
96
|
+
const hash = createHash("sha256").update(sessionId).digest("hex").slice(0, 32);
|
|
97
|
+
return `${hash}.jsonl`;
|
|
98
|
+
}
|
|
99
|
+
indexPath() {
|
|
100
|
+
return join(this.baseDir, "_sessions.json");
|
|
101
|
+
}
|
|
102
|
+
async ensureIndex() {
|
|
103
|
+
if (this.indexLoaded)
|
|
104
|
+
return;
|
|
105
|
+
if (this.indexFilePromise) {
|
|
106
|
+
await this.indexFilePromise;
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.indexFilePromise = (async () => {
|
|
110
|
+
try {
|
|
111
|
+
await mkdir(this.baseDir, { recursive: true });
|
|
112
|
+
const raw = await readFile(this.indexPath(), "utf8");
|
|
113
|
+
const parsed = JSON.parse(raw);
|
|
114
|
+
for (const [sid, fname] of Object.entries(parsed)) {
|
|
115
|
+
this.index.set(sid, fname);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// First run — index doesn't exist yet. Leave map empty.
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
this.indexLoaded = true;
|
|
123
|
+
}
|
|
124
|
+
})();
|
|
125
|
+
await this.indexFilePromise;
|
|
126
|
+
}
|
|
127
|
+
async persistIndex() {
|
|
128
|
+
const obj = {};
|
|
129
|
+
for (const [sid, fname] of this.index)
|
|
130
|
+
obj[sid] = fname;
|
|
131
|
+
// Atomic-ish: write tmp + rename. Concurrent writers across processes
|
|
132
|
+
// would race; intended for single-process agent use.
|
|
133
|
+
const tmp = `${this.indexPath()}.tmp`;
|
|
134
|
+
await mkdir(this.baseDir, { recursive: true });
|
|
135
|
+
await appendFile(tmp, ""); // truncate via empty append after delete
|
|
136
|
+
await unlink(tmp).catch(() => { });
|
|
137
|
+
const { writeFile, rename } = await import("node:fs/promises");
|
|
138
|
+
await writeFile(tmp, JSON.stringify(obj, null, 2), "utf8");
|
|
139
|
+
await rename(tmp, this.indexPath());
|
|
140
|
+
}
|
|
141
|
+
async pathFor(sessionId) {
|
|
142
|
+
await this.ensureIndex();
|
|
143
|
+
let fname = this.index.get(sessionId);
|
|
144
|
+
if (!fname) {
|
|
145
|
+
fname = this.fileFor(sessionId);
|
|
146
|
+
this.index.set(sessionId, fname);
|
|
147
|
+
await this.persistIndex();
|
|
148
|
+
}
|
|
149
|
+
return join(this.baseDir, fname);
|
|
150
|
+
}
|
|
151
|
+
async append(sessionId, entry) {
|
|
152
|
+
// Serialize against other append/delete calls on this instance so
|
|
153
|
+
// concurrent `Promise.all([store.append(...), store.append(...)])` lands
|
|
154
|
+
// lines in call order with no interleaving at the page boundary.
|
|
155
|
+
await this.serialize(async () => {
|
|
156
|
+
const path = await this.pathFor(sessionId);
|
|
157
|
+
await mkdir(this.baseDir, { recursive: true });
|
|
158
|
+
await appendFile(path, `${JSON.stringify(entry)}\n`, "utf8");
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
async exists(sessionId) {
|
|
162
|
+
await this.ensureIndex();
|
|
163
|
+
if (!this.index.has(sessionId))
|
|
164
|
+
return false;
|
|
165
|
+
try {
|
|
166
|
+
await access(join(this.baseDir, this.index.get(sessionId)));
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async read(sessionId) {
|
|
174
|
+
if (!(await this.exists(sessionId)))
|
|
175
|
+
return [];
|
|
176
|
+
const path = await this.pathFor(sessionId);
|
|
177
|
+
const raw = await readFile(path, "utf8");
|
|
178
|
+
const lines = raw.split("\n");
|
|
179
|
+
const out = [];
|
|
180
|
+
for (let i = 0; i < lines.length; i++) {
|
|
181
|
+
const line = lines[i];
|
|
182
|
+
if (!line)
|
|
183
|
+
continue;
|
|
184
|
+
try {
|
|
185
|
+
out.push(JSON.parse(line));
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// Skip malformed line. The most common cause is a truncated tail
|
|
189
|
+
// from a crashed write — we don't want restore to fail because of it.
|
|
190
|
+
// Tests assert that this branch is exercised under simulated crash.
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return out;
|
|
194
|
+
}
|
|
195
|
+
async searchMessages(sessionId, query, maxResults) {
|
|
196
|
+
return searchEntries(await this.read(sessionId), query, maxResults);
|
|
197
|
+
}
|
|
198
|
+
async listSessions() {
|
|
199
|
+
await this.ensureIndex();
|
|
200
|
+
return [...this.index.keys()];
|
|
201
|
+
}
|
|
202
|
+
async delete(sessionId) {
|
|
203
|
+
await this.serialize(async () => {
|
|
204
|
+
await this.ensureIndex();
|
|
205
|
+
const fname = this.index.get(sessionId);
|
|
206
|
+
if (!fname)
|
|
207
|
+
return;
|
|
208
|
+
try {
|
|
209
|
+
await unlink(join(this.baseDir, fname));
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
// Already gone.
|
|
213
|
+
}
|
|
214
|
+
this.index.delete(sessionId);
|
|
215
|
+
await this.persistIndex();
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
/** Test helper — list every JSONL file currently on disk. */
|
|
219
|
+
async _debugListFiles() {
|
|
220
|
+
try {
|
|
221
|
+
return (await readdir(this.baseDir)).filter((f) => f.endsWith(".jsonl"));
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return [];
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// ── Shared search helper ─────────────────────────────────────
|
|
229
|
+
function searchEntries(entries, query, maxResults) {
|
|
230
|
+
if (!query)
|
|
231
|
+
return [];
|
|
232
|
+
const needle = query.toLowerCase();
|
|
233
|
+
const out = [];
|
|
234
|
+
// Walk in reverse so the most recent matches come first.
|
|
235
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
236
|
+
const entry = entries[i];
|
|
237
|
+
if (entry.kind !== "message")
|
|
238
|
+
continue;
|
|
239
|
+
const content = entry.msg.content ?? "";
|
|
240
|
+
if (typeof content === "string" && content.toLowerCase().includes(needle)) {
|
|
241
|
+
out.push(entry.msg);
|
|
242
|
+
if (out.length >= maxResults)
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return out;
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=conversationLogStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversationLogStore.js","sourceRoot":"","sources":["../../src/conversation/conversationLogStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ConversationMemory` — abstract per-session chat history with a clean
|
|
3
|
+
* extension point for compaction. The basic implementation is an unbounded
|
|
4
|
+
* append-only list (matches the previous chatEngine behavior); the compacting
|
|
5
|
+
* implementation lives in `compactionMemory.ts`.
|
|
6
|
+
*
|
|
7
|
+
* Reuses {@link InferenceMessage} from `runtime/src/types.ts` deliberately —
|
|
8
|
+
* we don't want a parallel `ChatMessage` shape that drifts from the inference
|
|
9
|
+
* call site.
|
|
10
|
+
*
|
|
11
|
+
* @module conversation/conversationMemory
|
|
12
|
+
*/
|
|
13
|
+
import type { InferenceMessage } from "../types.js";
|
|
14
|
+
/**
|
|
15
|
+
* A per-session conversation history. Implementations decide whether to grow
|
|
16
|
+
* unbounded ({@link BasicConversationMemory}) or compact at a token threshold
|
|
17
|
+
* ({@link import("./compactionMemory.js").CompactionMemory}).
|
|
18
|
+
*
|
|
19
|
+
* Methods are async to leave room for IO-backed implementations (e.g. a future
|
|
20
|
+
* Postgres-backed memory).
|
|
21
|
+
*/
|
|
22
|
+
export interface ConversationMemory {
|
|
23
|
+
/** Append a message. Implementations may choose to compact afterwards. */
|
|
24
|
+
addMessage(msg: InferenceMessage): Promise<void>;
|
|
25
|
+
/** Snapshot of the messages to feed into the next inference call. */
|
|
26
|
+
getContext(): InferenceMessage[];
|
|
27
|
+
/** Drop all messages and reset internal counters. */
|
|
28
|
+
reset(): Promise<void>;
|
|
29
|
+
/** Stable identifier for this session. */
|
|
30
|
+
readonly sessionId: string;
|
|
31
|
+
}
|
|
32
|
+
export interface BasicConversationMemoryOptions {
|
|
33
|
+
/** Override the session id. Defaults to `"__default__"`. */
|
|
34
|
+
sessionId?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Optional message cap. When set, the oldest messages are dropped to keep
|
|
37
|
+
* the array under `maxMessages`. Defaults to undefined (unbounded — matches
|
|
38
|
+
* the old chatEngine semantics for callers that opted out of compaction).
|
|
39
|
+
*/
|
|
40
|
+
maxMessages?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Append-only message log with an optional max-message cap. No compaction.
|
|
44
|
+
*
|
|
45
|
+
* Used by callers who want the legacy unbounded history without paying the
|
|
46
|
+
* compaction setup cost (no model name, no `compactFn`, no log store).
|
|
47
|
+
*/
|
|
48
|
+
export declare class BasicConversationMemory implements ConversationMemory {
|
|
49
|
+
readonly sessionId: string;
|
|
50
|
+
private readonly maxMessages?;
|
|
51
|
+
private messages;
|
|
52
|
+
constructor(opts?: BasicConversationMemoryOptions);
|
|
53
|
+
addMessage(msg: InferenceMessage): Promise<void>;
|
|
54
|
+
getContext(): InferenceMessage[];
|
|
55
|
+
reset(): Promise<void>;
|
|
56
|
+
/** Test inspection — current message count. */
|
|
57
|
+
get length(): number;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=conversationMemory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversationMemory.d.ts","sourceRoot":"","sources":["../../src/conversation/conversationMemory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,UAAU,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,qEAAqE;IACrE,UAAU,IAAI,gBAAgB,EAAE,CAAC;IACjC,qDAAqD;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,8BAA8B;IAC7C,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,kBAAkB;IAChE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAA0B;gBAE9B,IAAI,GAAE,8BAAmC;IAK/C,UAAU,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtD,UAAU,IAAI,gBAAgB,EAAE;IAI1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,+CAA+C;IAC/C,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Append-only message log with an optional max-message cap. No compaction.
|
|
3
|
+
*
|
|
4
|
+
* Used by callers who want the legacy unbounded history without paying the
|
|
5
|
+
* compaction setup cost (no model name, no `compactFn`, no log store).
|
|
6
|
+
*/
|
|
7
|
+
export class BasicConversationMemory {
|
|
8
|
+
sessionId;
|
|
9
|
+
maxMessages;
|
|
10
|
+
messages = [];
|
|
11
|
+
constructor(opts = {}) {
|
|
12
|
+
this.sessionId = opts.sessionId ?? "__default__";
|
|
13
|
+
this.maxMessages = opts.maxMessages;
|
|
14
|
+
}
|
|
15
|
+
async addMessage(msg) {
|
|
16
|
+
this.messages.push(msg);
|
|
17
|
+
if (this.maxMessages !== undefined && this.messages.length > this.maxMessages) {
|
|
18
|
+
this.messages.splice(0, this.messages.length - this.maxMessages);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
getContext() {
|
|
22
|
+
return this.messages.slice();
|
|
23
|
+
}
|
|
24
|
+
async reset() {
|
|
25
|
+
this.messages = [];
|
|
26
|
+
}
|
|
27
|
+
/** Test inspection — current message count. */
|
|
28
|
+
get length() {
|
|
29
|
+
return this.messages.length;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=conversationMemory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversationMemory.js","sourceRoot":"","sources":["../../src/conversation/conversationMemory.ts"],"names":[],"mappings":"AA4CA;;;;;GAKG;AACH,MAAM,OAAO,uBAAuB;IACzB,SAAS,CAAS;IACV,WAAW,CAAU;IAC9B,QAAQ,GAAuB,EAAE,CAAC;IAE1C,YAAY,OAAuC,EAAE;QACnD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAqB;QACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9E,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,+CAA+C;IAC/C,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation memory primitives — see `conversationMemory.ts` for the
|
|
3
|
+
* abstraction, `compactionMemory.ts` for the turn-boundary-aware compactor,
|
|
4
|
+
* and `conversationLogStore.ts` for JSONL persistence.
|
|
5
|
+
*
|
|
6
|
+
* @module conversation
|
|
7
|
+
*/
|
|
8
|
+
export type { ConversationMemory, BasicConversationMemoryOptions } from "./conversationMemory.js";
|
|
9
|
+
export { BasicConversationMemory } from "./conversationMemory.js";
|
|
10
|
+
export type { ConversationLogStore, LogEntry, LocalConversationLogStoreOptions, } from "./conversationLogStore.js";
|
|
11
|
+
export { InMemoryConversationLogStore, LocalConversationLogStore, } from "./conversationLogStore.js";
|
|
12
|
+
export type { CompactionConfig, CompactionStats, CompactFn, MemoryToolDefinition, } from "./compactionMemory.js";
|
|
13
|
+
export { CompactionMemory } from "./compactionMemory.js";
|
|
14
|
+
export type { ModelThreshold } from "./modelLimits.js";
|
|
15
|
+
export { MODEL_THRESHOLDS, DEFAULT_THRESHOLD, DEFAULT_COMPACTION_SYSTEM_PROMPT, estimateTokens, getModelThreshold, } from "./modelLimits.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,YAAY,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,YAAY,EACV,oBAAoB,EACpB,QAAQ,EACR,gCAAgC,GACjC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,gCAAgC,EAChC,cAAc,EACd,iBAAiB,GAClB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { BasicConversationMemory } from "./conversationMemory.js";
|
|
2
|
+
export { InMemoryConversationLogStore, LocalConversationLogStore, } from "./conversationLogStore.js";
|
|
3
|
+
export { CompactionMemory } from "./compactionMemory.js";
|
|
4
|
+
export { MODEL_THRESHOLDS, DEFAULT_THRESHOLD, DEFAULT_COMPACTION_SYSTEM_PROMPT, estimateTokens, getModelThreshold, } from "./modelLimits.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAMlE,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAOnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,gCAAgC,EAChC,cAAc,EACd,iBAAiB,GAClB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model-aware compaction thresholds + token estimator.
|
|
3
|
+
*
|
|
4
|
+
* Lifted from `gateway/src/services/sessionCompactor.ts:29-45`. THIS file is now
|
|
5
|
+
* the canonical source. Gateway's copy is currently kept in sync manually; a
|
|
6
|
+
* follow-up PR will switch the gateway to import from `@nookplot/runtime`.
|
|
7
|
+
*
|
|
8
|
+
* The token estimator deliberately matches the gateway's heuristic
|
|
9
|
+
* (`Math.ceil(content.length / 4)`) so both compactors agree on "when to
|
|
10
|
+
* compact" — important so the two layers don't fight each other on the same
|
|
11
|
+
* conversation viewed through different lenses.
|
|
12
|
+
*
|
|
13
|
+
* @module conversation/modelLimits
|
|
14
|
+
*/
|
|
15
|
+
import type { InferenceMessage } from "../types.js";
|
|
16
|
+
export interface ModelThreshold {
|
|
17
|
+
/** Estimated token count that triggers compaction. */
|
|
18
|
+
compactAt: number;
|
|
19
|
+
/** Number of recent messages preserved uncompacted. */
|
|
20
|
+
preserveRecent: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Per-model compaction thresholds. Add new model IDs here as they become
|
|
24
|
+
* supported on the platform; unknown models fall back to {@link DEFAULT_THRESHOLD}.
|
|
25
|
+
*/
|
|
26
|
+
export declare const MODEL_THRESHOLDS: Record<string, ModelThreshold>;
|
|
27
|
+
/** Fallback for any model not listed in {@link MODEL_THRESHOLDS}. */
|
|
28
|
+
export declare const DEFAULT_THRESHOLD: ModelThreshold;
|
|
29
|
+
export declare function getModelThreshold(modelName: string): ModelThreshold;
|
|
30
|
+
/**
|
|
31
|
+
* Default token estimator: ceil(content.length / 4) per message.
|
|
32
|
+
*
|
|
33
|
+
* Matches `gateway/src/services/sessionCompactor.ts:98-100`. Replace via
|
|
34
|
+
* `CompactionConfig.estimateTokens` if you need a tokenizer-accurate count
|
|
35
|
+
* (the heuristic over-counts code-heavy text and under-counts CJK).
|
|
36
|
+
*/
|
|
37
|
+
export declare function estimateTokens(messages: InferenceMessage[]): number;
|
|
38
|
+
/**
|
|
39
|
+
* Default system preamble passed to the caller-supplied `compactFn`. Same shape
|
|
40
|
+
* the gateway uses so summaries on either layer have the same structure.
|
|
41
|
+
*/
|
|
42
|
+
export declare const DEFAULT_COMPACTION_SYSTEM_PROMPT = "You are a conversation summarizer. Given a conversation history, produce a structured JSON summary that preserves ALL important context.\n\nOutput format (JSON only, no markdown):\n{\n \"activeGoals\": [\"goal 1\", \"goal 2\"],\n \"keyDecisions\": [\"decision 1\"],\n \"pendingActions\": [\"action 1\"],\n \"userPreferences\": [\"preference 1\"],\n \"importantFacts\": [\"fact 1\"],\n \"conversationTone\": \"brief description of the conversation dynamic\"\n}\n\nRules:\n- Include EVERY active goal, pending action, and key decision\n- Be specific \u2014 \"deploy DeFi monitoring agent\" not \"deploy agent\"\n- Drop pleasantries, greetings, and meta-commentary about the conversation\n- If user expressed preferences (model choice, budget, style), capture them\n- Keep each array item under 20 words";
|
|
43
|
+
//# sourceMappingURL=modelLimits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelLimits.d.ts","sourceRoot":"","sources":["../../src/conversation/modelLimits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAkB3D,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,EAAE,cAAuD,CAAC;AAExF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAEnE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAQnE;AAED;;;GAGG;AACH,eAAO,MAAM,gCAAgC,2yBAiBP,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-model compaction thresholds. Add new model IDs here as they become
|
|
3
|
+
* supported on the platform; unknown models fall back to {@link DEFAULT_THRESHOLD}.
|
|
4
|
+
*/
|
|
5
|
+
export const MODEL_THRESHOLDS = {
|
|
6
|
+
// Small models — compact early, preserve fewer messages
|
|
7
|
+
"hermes3": { compactAt: 4800, preserveRecent: 4 },
|
|
8
|
+
"hermes3:8b": { compactAt: 4800, preserveRecent: 4 },
|
|
9
|
+
"hermes-3-llama-3.1-8b": { compactAt: 4800, preserveRecent: 4 },
|
|
10
|
+
"llama3.2:8b": { compactAt: 4800, preserveRecent: 4 },
|
|
11
|
+
"mistral:7b": { compactAt: 4800, preserveRecent: 4 },
|
|
12
|
+
// Large models — more headroom
|
|
13
|
+
"hermes-3-llama-3.1-405b": { compactAt: 12000, preserveRecent: 8 },
|
|
14
|
+
"llama3.3:70b": { compactAt: 12000, preserveRecent: 8 },
|
|
15
|
+
"qwen3:32b": { compactAt: 10000, preserveRecent: 6 },
|
|
16
|
+
"deepseek-r1:32b": { compactAt: 10000, preserveRecent: 6 },
|
|
17
|
+
// Advisor models — larger context windows
|
|
18
|
+
"claude-3-5-sonnet-20241022": { compactAt: 24000, preserveRecent: 12 },
|
|
19
|
+
"claude-sonnet-4-20250514": { compactAt: 24000, preserveRecent: 12 },
|
|
20
|
+
"claude-opus-4-6": { compactAt: 24000, preserveRecent: 12 },
|
|
21
|
+
"gpt-4o": { compactAt: 24000, preserveRecent: 12 },
|
|
22
|
+
"deepseek-r1:70b": { compactAt: 16000, preserveRecent: 10 },
|
|
23
|
+
};
|
|
24
|
+
/** Fallback for any model not listed in {@link MODEL_THRESHOLDS}. */
|
|
25
|
+
export const DEFAULT_THRESHOLD = { compactAt: 6000, preserveRecent: 6 };
|
|
26
|
+
export function getModelThreshold(modelName) {
|
|
27
|
+
return MODEL_THRESHOLDS[modelName] ?? DEFAULT_THRESHOLD;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Default token estimator: ceil(content.length / 4) per message.
|
|
31
|
+
*
|
|
32
|
+
* Matches `gateway/src/services/sessionCompactor.ts:98-100`. Replace via
|
|
33
|
+
* `CompactionConfig.estimateTokens` if you need a tokenizer-accurate count
|
|
34
|
+
* (the heuristic over-counts code-heavy text and under-counts CJK).
|
|
35
|
+
*/
|
|
36
|
+
export function estimateTokens(messages) {
|
|
37
|
+
let total = 0;
|
|
38
|
+
for (const m of messages) {
|
|
39
|
+
if (typeof m.content === "string") {
|
|
40
|
+
total += Math.ceil(m.content.length / 4);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return total;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Default system preamble passed to the caller-supplied `compactFn`. Same shape
|
|
47
|
+
* the gateway uses so summaries on either layer have the same structure.
|
|
48
|
+
*/
|
|
49
|
+
export const DEFAULT_COMPACTION_SYSTEM_PROMPT = `You are a conversation summarizer. Given a conversation history, produce a structured JSON summary that preserves ALL important context.
|
|
50
|
+
|
|
51
|
+
Output format (JSON only, no markdown):
|
|
52
|
+
{
|
|
53
|
+
"activeGoals": ["goal 1", "goal 2"],
|
|
54
|
+
"keyDecisions": ["decision 1"],
|
|
55
|
+
"pendingActions": ["action 1"],
|
|
56
|
+
"userPreferences": ["preference 1"],
|
|
57
|
+
"importantFacts": ["fact 1"],
|
|
58
|
+
"conversationTone": "brief description of the conversation dynamic"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
Rules:
|
|
62
|
+
- Include EVERY active goal, pending action, and key decision
|
|
63
|
+
- Be specific — "deploy DeFi monitoring agent" not "deploy agent"
|
|
64
|
+
- Drop pleasantries, greetings, and meta-commentary about the conversation
|
|
65
|
+
- If user expressed preferences (model choice, budget, style), capture them
|
|
66
|
+
- Keep each array item under 20 words`;
|
|
67
|
+
//# sourceMappingURL=modelLimits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelLimits.js","sourceRoot":"","sources":["../../src/conversation/modelLimits.ts"],"names":[],"mappings":"AAuBA;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAmC;IAC9D,wDAAwD;IACxD,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;IACjD,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;IACpD,uBAAuB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;IAC/D,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;IACrD,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;IACpD,+BAA+B;IAC/B,yBAAyB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE;IAClE,cAAc,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE;IACvD,WAAW,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE;IACpD,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE;IAC1D,0CAA0C;IAC1C,4BAA4B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE;IACtE,0BAA0B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE;IACpE,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE;IAC3D,QAAQ,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE;IAClD,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE;CAC5D,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAmB,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;AAExF,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO,gBAAgB,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,QAA4B;IACzD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAClC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;;;;;;;;;;;sCAiBV,CAAC"}
|