indusagi 0.12.13 → 0.12.16
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/agent/agent-session.d.ts +352 -0
- package/dist/agent/agent-session.d.ts.map +1 -0
- package/dist/agent/agent-session.js +870 -0
- package/dist/agent/agent-session.js.map +1 -0
- package/dist/agent/agent-session.test.d.ts +5 -0
- package/dist/agent/agent-session.test.d.ts.map +1 -0
- package/dist/agent/agent-session.test.js +129 -0
- package/dist/agent/agent-session.test.js.map +1 -0
- package/dist/agent/agent.d.ts +108 -2
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +210 -17
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/bash-executor.d.ts +33 -0
- package/dist/agent/bash-executor.d.ts.map +1 -0
- package/dist/agent/bash-executor.js +197 -0
- package/dist/agent/bash-executor.js.map +1 -0
- package/dist/agent/compaction/compaction.d.ts +87 -0
- package/dist/agent/compaction/compaction.d.ts.map +1 -0
- package/dist/agent/compaction/compaction.js +598 -0
- package/dist/agent/compaction/compaction.js.map +1 -0
- package/dist/agent/compaction/index.d.ts +6 -0
- package/dist/agent/compaction/index.d.ts.map +1 -0
- package/dist/agent/compaction/index.js +6 -0
- package/dist/agent/compaction/index.js.map +1 -0
- package/dist/agent/compaction/utils.d.ts +41 -0
- package/dist/agent/compaction/utils.d.ts.map +1 -0
- package/dist/agent/compaction/utils.js +240 -0
- package/dist/agent/compaction/utils.js.map +1 -0
- package/dist/agent/event-bus.js +1 -3
- package/dist/agent/event-bus.js.map +1 -1
- package/dist/agent/index.d.ts +11 -5
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +19 -8
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/messages.d.ts +2 -48
- package/dist/agent/messages.d.ts.map +1 -1
- package/dist/agent/messages.js.map +1 -1
- package/dist/agent/proxy.js.map +1 -1
- package/dist/agent/session-manager.d.ts +2 -3
- package/dist/agent/session-manager.d.ts.map +1 -1
- package/dist/agent/session-manager.js +10 -6
- package/dist/agent/session-manager.js.map +1 -1
- package/dist/agent/settings-manager.d.ts +204 -0
- package/dist/agent/settings-manager.d.ts.map +1 -0
- package/dist/agent/settings-manager.js +594 -0
- package/dist/agent/settings-manager.js.map +1 -0
- package/dist/agent/state-manager.js +1 -0
- package/dist/agent/state-manager.js.map +1 -1
- package/dist/agent/telemetry.js +1 -3
- package/dist/agent/telemetry.js.map +1 -1
- package/dist/agent/tools/bash.js +1 -0
- package/dist/agent/tools/bash.js.map +1 -1
- package/dist/agent/tools/edit.test.d.ts +6 -0
- package/dist/agent/tools/edit.test.d.ts.map +1 -0
- package/dist/agent/tools/edit.test.js +196 -0
- package/dist/agent/tools/edit.test.js.map +1 -0
- package/dist/agent/tools/index.d.ts +26 -26
- package/dist/agent/tools/registry.d.ts +1 -1
- package/dist/agent/tools/registry.d.ts.map +1 -1
- package/dist/agent/tools/registry.js +2 -4
- package/dist/agent/tools/registry.js.map +1 -1
- package/dist/agent/tools/todo-store.js +2 -1
- package/dist/agent/tools/todo-store.js.map +1 -1
- package/dist/agent/tools/utils/hook-runner.js +1 -3
- package/dist/agent/tools/utils/hook-runner.js.map +1 -1
- package/dist/agent/types.d.ts +139 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/ai/api-registry.js +1 -3
- package/dist/ai/api-registry.js.map +1 -1
- package/dist/ai/models.generated.d.ts +621 -53
- package/dist/ai/models.generated.d.ts.map +1 -1
- package/dist/ai/models.generated.js +548 -0
- package/dist/ai/models.generated.js.map +1 -1
- package/dist/ai/models.js +1 -0
- package/dist/ai/models.js.map +1 -1
- package/dist/ai/providers/amazon-bedrock.d.ts +6 -0
- package/dist/ai/providers/amazon-bedrock.d.ts.map +1 -1
- package/dist/ai/providers/amazon-bedrock.js +47 -9
- package/dist/ai/providers/amazon-bedrock.js.map +1 -1
- package/dist/ai/providers/anthropic.d.ts +8 -0
- package/dist/ai/providers/anthropic.d.ts.map +1 -1
- package/dist/ai/providers/anthropic.js +28 -12
- package/dist/ai/providers/anthropic.js.map +1 -1
- package/dist/ai/providers/azure-openai-responses.js +1 -0
- package/dist/ai/providers/azure-openai-responses.js.map +1 -1
- package/dist/ai/providers/github-copilot-headers.d.ts +33 -0
- package/dist/ai/providers/github-copilot-headers.d.ts.map +1 -0
- package/dist/ai/providers/github-copilot-headers.js +51 -0
- package/dist/ai/providers/github-copilot-headers.js.map +1 -0
- package/dist/ai/providers/google-shared.d.ts.map +1 -1
- package/dist/ai/providers/google-shared.js +16 -22
- package/dist/ai/providers/google-shared.js.map +1 -1
- package/dist/ai/providers/google-vertex.d.ts.map +1 -1
- package/dist/ai/providers/google-vertex.js +28 -5
- package/dist/ai/providers/google-vertex.js.map +1 -1
- package/dist/ai/providers/google.js +1 -0
- package/dist/ai/providers/google.js.map +1 -1
- package/dist/ai/providers/kimi.js +1 -0
- package/dist/ai/providers/kimi.js.map +1 -1
- package/dist/ai/providers/mistral.d.ts +22 -0
- package/dist/ai/providers/mistral.d.ts.map +1 -0
- package/dist/ai/providers/mistral.js +497 -0
- package/dist/ai/providers/mistral.js.map +1 -0
- package/dist/ai/providers/openai-codex-responses.js +1 -0
- package/dist/ai/providers/openai-codex-responses.js.map +1 -1
- package/dist/ai/providers/openai-completions.js +2 -0
- package/dist/ai/providers/openai-completions.js.map +1 -1
- package/dist/ai/providers/openai-responses.d.ts.map +1 -1
- package/dist/ai/providers/openai-responses.js +30 -0
- package/dist/ai/providers/openai-responses.js.map +1 -1
- package/dist/ai/providers/register-builtins.d.ts.map +1 -1
- package/dist/ai/providers/register-builtins.js +6 -0
- package/dist/ai/providers/register-builtins.js.map +1 -1
- package/dist/ai/providers/simple-options.js +2 -0
- package/dist/ai/providers/simple-options.js.map +1 -1
- package/dist/ai/providers/transform-messages.js +3 -9
- package/dist/ai/providers/transform-messages.js.map +1 -1
- package/dist/ai/stream.js +1 -3
- package/dist/ai/stream.js.map +1 -1
- package/dist/ai/types.d.ts +34 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/ai/types.js.map +1 -1
- package/dist/ai/utils/base-stream-handler.js +1 -0
- package/dist/ai/utils/base-stream-handler.js.map +1 -1
- package/dist/ai/utils/event-stream.js +9 -4
- package/dist/ai/utils/event-stream.js.map +1 -1
- package/dist/ai/utils/hash.d.ts +6 -0
- package/dist/ai/utils/hash.d.ts.map +1 -0
- package/dist/ai/utils/hash.js +17 -0
- package/dist/ai/utils/hash.js.map +1 -0
- package/dist/ai/utils/index.d.ts +1 -0
- package/dist/ai/utils/index.d.ts.map +1 -1
- package/dist/ai/utils/index.js +1 -0
- package/dist/ai/utils/index.js.map +1 -1
- package/dist/ai/utils/oauth/github-copilot.d.ts.map +1 -1
- package/dist/ai/utils/oauth/github-copilot.js +19 -8
- package/dist/ai/utils/oauth/github-copilot.js.map +1 -1
- package/dist/ai/utils/overflow.d.ts.map +1 -1
- package/dist/ai/utils/overflow.js +4 -0
- package/dist/ai/utils/overflow.js.map +1 -1
- package/dist/ai/utils/provider-adapter.js +9 -0
- package/dist/ai/utils/provider-adapter.js.map +1 -1
- package/dist/ai/utils/provider-client-builder.js +1 -1
- package/dist/ai/utils/provider-client-builder.js.map +1 -1
- package/dist/ai/utils/provider-errors.js +2 -0
- package/dist/ai/utils/provider-errors.js.map +1 -1
- package/dist/ai/utils/stream-event-helper.js +3 -0
- package/dist/ai/utils/stream-event-helper.js.map +1 -1
- package/dist/ai/utils/stream-handler-types.js +5 -0
- package/dist/ai/utils/stream-handler-types.js.map +1 -1
- package/dist/ai/utils/streaming-state-manager.js +4 -2
- package/dist/ai/utils/streaming-state-manager.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/client-pool.d.ts +106 -0
- package/dist/mcp/client-pool.d.ts.map +1 -0
- package/dist/mcp/client-pool.js +234 -0
- package/dist/mcp/client-pool.js.map +1 -0
- package/dist/mcp/client.d.ts +158 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +599 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config.d.ts +61 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +250 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/errors.d.ts +104 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +146 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/index.d.ts +56 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +83 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/schema-converter.d.ts +68 -0
- package/dist/mcp/schema-converter.d.ts.map +1 -0
- package/dist/mcp/schema-converter.js +230 -0
- package/dist/mcp/schema-converter.js.map +1 -0
- package/dist/mcp/server.d.ts +111 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +305 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tool-factory.d.ts +63 -0
- package/dist/mcp/tool-factory.d.ts.map +1 -0
- package/dist/mcp/tool-factory.js +228 -0
- package/dist/mcp/tool-factory.js.map +1 -0
- package/dist/mcp/types.d.ts +289 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +8 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp.d.ts +6 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +6 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory/embedder/base.d.ts +41 -0
- package/dist/memory/embedder/base.d.ts.map +1 -0
- package/dist/memory/embedder/base.js +10 -0
- package/dist/memory/embedder/base.js.map +1 -0
- package/dist/memory/embedder/index.d.ts +8 -0
- package/dist/memory/embedder/index.d.ts.map +1 -0
- package/dist/memory/embedder/index.js +6 -0
- package/dist/memory/embedder/index.js.map +1 -0
- package/dist/memory/embedder/openai.d.ts +35 -0
- package/dist/memory/embedder/openai.d.ts.map +1 -0
- package/dist/memory/embedder/openai.js +109 -0
- package/dist/memory/embedder/openai.js.map +1 -0
- package/dist/memory/index.d.ts +33 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +31 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/memory.d.ts +126 -0
- package/dist/memory/memory.d.ts.map +1 -0
- package/dist/memory/memory.js +285 -0
- package/dist/memory/memory.js.map +1 -0
- package/dist/memory/processors/base.d.ts +42 -0
- package/dist/memory/processors/base.d.ts.map +1 -0
- package/dist/memory/processors/base.js +6 -0
- package/dist/memory/processors/base.js.map +1 -0
- package/dist/memory/processors/index.d.ts +16 -0
- package/dist/memory/processors/index.d.ts.map +1 -0
- package/dist/memory/processors/index.js +18 -0
- package/dist/memory/processors/index.js.map +1 -0
- package/dist/memory/processors/message-history.d.ts +35 -0
- package/dist/memory/processors/message-history.d.ts.map +1 -0
- package/dist/memory/processors/message-history.js +53 -0
- package/dist/memory/processors/message-history.js.map +1 -0
- package/dist/memory/processors/observational-memory/index.d.ts +82 -0
- package/dist/memory/processors/observational-memory/index.d.ts.map +1 -0
- package/dist/memory/processors/observational-memory/index.js +239 -0
- package/dist/memory/processors/observational-memory/index.js.map +1 -0
- package/dist/memory/processors/observational-memory/observer-agent.d.ts +64 -0
- package/dist/memory/processors/observational-memory/observer-agent.d.ts.map +1 -0
- package/dist/memory/processors/observational-memory/observer-agent.js +362 -0
- package/dist/memory/processors/observational-memory/observer-agent.js.map +1 -0
- package/dist/memory/processors/observational-memory/reflector-agent.d.ts +38 -0
- package/dist/memory/processors/observational-memory/reflector-agent.d.ts.map +1 -0
- package/dist/memory/processors/observational-memory/reflector-agent.js +213 -0
- package/dist/memory/processors/observational-memory/reflector-agent.js.map +1 -0
- package/dist/memory/processors/observational-memory/token-counter.d.ts +35 -0
- package/dist/memory/processors/observational-memory/token-counter.d.ts.map +1 -0
- package/dist/memory/processors/observational-memory/token-counter.js +90 -0
- package/dist/memory/processors/observational-memory/token-counter.js.map +1 -0
- package/dist/memory/processors/semantic-recall.d.ts +55 -0
- package/dist/memory/processors/semantic-recall.d.ts.map +1 -0
- package/dist/memory/processors/semantic-recall.js +152 -0
- package/dist/memory/processors/semantic-recall.js.map +1 -0
- package/dist/memory/processors/working-memory.d.ts +41 -0
- package/dist/memory/processors/working-memory.d.ts.map +1 -0
- package/dist/memory/processors/working-memory.js +87 -0
- package/dist/memory/processors/working-memory.js.map +1 -0
- package/dist/memory/storage/base.d.ts +288 -0
- package/dist/memory/storage/base.d.ts.map +1 -0
- package/dist/memory/storage/base.js +209 -0
- package/dist/memory/storage/base.js.map +1 -0
- package/dist/memory/storage/index.d.ts +9 -0
- package/dist/memory/storage/index.d.ts.map +1 -0
- package/dist/memory/storage/index.js +7 -0
- package/dist/memory/storage/index.js.map +1 -0
- package/dist/memory/storage/inmemory.d.ts +93 -0
- package/dist/memory/storage/inmemory.d.ts.map +1 -0
- package/dist/memory/storage/inmemory.js +647 -0
- package/dist/memory/storage/inmemory.js.map +1 -0
- package/dist/memory/tools/working-memory.d.ts +100 -0
- package/dist/memory/tools/working-memory.d.ts.map +1 -0
- package/dist/memory/tools/working-memory.js +237 -0
- package/dist/memory/tools/working-memory.js.map +1 -0
- package/dist/memory/types.d.ts +386 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +58 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/memory/vector/base.d.ts +145 -0
- package/dist/memory/vector/base.d.ts.map +1 -0
- package/dist/memory/vector/base.js +81 -0
- package/dist/memory/vector/base.js.map +1 -0
- package/dist/memory/vector/index.d.ts +8 -0
- package/dist/memory/vector/index.d.ts.map +1 -0
- package/dist/memory/vector/index.js +7 -0
- package/dist/memory/vector/index.js.map +1 -0
- package/dist/memory/vector/inmemory.d.ts +47 -0
- package/dist/memory/vector/inmemory.d.ts.map +1 -0
- package/dist/memory/vector/inmemory.js +231 -0
- package/dist/memory/vector/inmemory.js.map +1 -0
- package/dist/tui/autocomplete.js +5 -1
- package/dist/tui/autocomplete.js.map +1 -1
- package/dist/tui/components/box.js +9 -1
- package/dist/tui/components/box.js.map +1 -1
- package/dist/tui/components/cancellable-loader.js +3 -4
- package/dist/tui/components/cancellable-loader.js.map +1 -1
- package/dist/tui/components/editor.d.ts +39 -3
- package/dist/tui/components/editor.d.ts.map +1 -1
- package/dist/tui/components/editor.js +162 -133
- package/dist/tui/components/editor.js.map +1 -1
- package/dist/tui/components/image.js +8 -0
- package/dist/tui/components/image.js.map +1 -1
- package/dist/tui/components/input.js +10 -11
- package/dist/tui/components/input.js.map +1 -1
- package/dist/tui/components/loader.js +7 -4
- package/dist/tui/components/loader.js.map +1 -1
- package/dist/tui/components/markdown.js +10 -0
- package/dist/tui/components/markdown.js.map +1 -1
- package/dist/tui/components/select-list.js +8 -4
- package/dist/tui/components/select-list.js.map +1 -1
- package/dist/tui/components/settings-list.js +12 -4
- package/dist/tui/components/settings-list.js.map +1 -1
- package/dist/tui/components/spacer.js +1 -0
- package/dist/tui/components/spacer.js.map +1 -1
- package/dist/tui/components/text.js +5 -0
- package/dist/tui/components/text.js.map +1 -1
- package/dist/tui/components/truncated-text.js +3 -0
- package/dist/tui/components/truncated-text.js.map +1 -1
- package/dist/tui/fuzzy.js +4 -1
- package/dist/tui/fuzzy.js.map +1 -1
- package/dist/tui/keybindings.js +3 -2
- package/dist/tui/keybindings.js.map +1 -1
- package/dist/tui/keys.d.ts +17 -1
- package/dist/tui/keys.d.ts.map +1 -1
- package/dist/tui/keys.js +56 -0
- package/dist/tui/keys.js.map +1 -1
- package/dist/tui/kill-ring.d.ts +28 -0
- package/dist/tui/kill-ring.d.ts.map +1 -0
- package/dist/tui/kill-ring.js +44 -0
- package/dist/tui/kill-ring.js.map +1 -0
- package/dist/tui/stdin-buffer.js +6 -5
- package/dist/tui/stdin-buffer.js.map +1 -1
- package/dist/tui/terminal-image.js +1 -3
- package/dist/tui/terminal-image.js.map +1 -1
- package/dist/tui/terminal.d.ts +13 -0
- package/dist/tui/terminal.d.ts.map +1 -1
- package/dist/tui/terminal.js +70 -7
- package/dist/tui/terminal.js.map +1 -1
- package/dist/tui/tui.d.ts +36 -0
- package/dist/tui/tui.d.ts.map +1 -1
- package/dist/tui/tui.js +101 -29
- package/dist/tui/tui.js.map +1 -1
- package/dist/tui/undo-stack.d.ts +17 -0
- package/dist/tui/undo-stack.d.ts.map +1 -0
- package/dist/tui/undo-stack.js +25 -0
- package/dist/tui/undo-stack.js.map +1 -0
- package/dist/tui/utils.js +12 -16
- package/dist/tui/utils.js.map +1 -1
- package/package.json +32 -2
|
@@ -0,0 +1,647 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Storage Implementation
|
|
3
|
+
* Based on Mastra InMemoryMemory
|
|
4
|
+
*/
|
|
5
|
+
import { MemoryStorage, normalizePerPage, calculatePagination, } from "./base.js";
|
|
6
|
+
/**
|
|
7
|
+
* Create a new in-memory database
|
|
8
|
+
*/
|
|
9
|
+
export function createInMemoryDB() {
|
|
10
|
+
return {
|
|
11
|
+
threads: new Map(),
|
|
12
|
+
messages: new Map(),
|
|
13
|
+
resources: new Map(),
|
|
14
|
+
observationalMemory: new Map(),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* In-Memory Storage Implementation
|
|
19
|
+
*/
|
|
20
|
+
export class InMemoryStorage extends MemoryStorage {
|
|
21
|
+
name = "inmemory";
|
|
22
|
+
supportsObservationalMemory = true;
|
|
23
|
+
db;
|
|
24
|
+
constructor(db) {
|
|
25
|
+
super();
|
|
26
|
+
this.db = db ?? createInMemoryDB();
|
|
27
|
+
}
|
|
28
|
+
async init() {
|
|
29
|
+
// Nothing to initialize for in-memory storage
|
|
30
|
+
}
|
|
31
|
+
async dangerouslyClearAll() {
|
|
32
|
+
this.db.threads.clear();
|
|
33
|
+
this.db.messages.clear();
|
|
34
|
+
this.db.resources.clear();
|
|
35
|
+
this.db.observationalMemory.clear();
|
|
36
|
+
}
|
|
37
|
+
// ========================================================================
|
|
38
|
+
// Thread Operations
|
|
39
|
+
// ========================================================================
|
|
40
|
+
async getThreadById({ threadId }) {
|
|
41
|
+
const thread = this.db.threads.get(threadId);
|
|
42
|
+
return thread ? { ...thread, metadata: thread.metadata ? { ...thread.metadata } : thread.metadata } : null;
|
|
43
|
+
}
|
|
44
|
+
async saveThread({ thread }) {
|
|
45
|
+
this.db.threads.set(thread.id, thread);
|
|
46
|
+
return thread;
|
|
47
|
+
}
|
|
48
|
+
async updateThread({ id, title, metadata, }) {
|
|
49
|
+
const thread = this.db.threads.get(id);
|
|
50
|
+
if (!thread) {
|
|
51
|
+
throw new Error(`Thread with id ${id} not found`);
|
|
52
|
+
}
|
|
53
|
+
if (title !== undefined)
|
|
54
|
+
thread.title = title;
|
|
55
|
+
if (metadata !== undefined)
|
|
56
|
+
thread.metadata = { ...thread.metadata, ...metadata };
|
|
57
|
+
thread.updatedAt = new Date();
|
|
58
|
+
return thread;
|
|
59
|
+
}
|
|
60
|
+
async deleteThread({ threadId }) {
|
|
61
|
+
this.db.threads.delete(threadId);
|
|
62
|
+
// Delete all messages in the thread
|
|
63
|
+
for (const [key, msg] of this.db.messages) {
|
|
64
|
+
if (msg.thread_id === threadId) {
|
|
65
|
+
this.db.messages.delete(key);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async listThreads(args) {
|
|
70
|
+
const { page = 0, perPage: perPageInput, orderBy, filter } = args;
|
|
71
|
+
const { field, direction } = this.parseOrderBy(orderBy);
|
|
72
|
+
this.validatePaginationInput(page, perPageInput ?? 100);
|
|
73
|
+
const perPage = normalizePerPage(perPageInput, 100);
|
|
74
|
+
// Start with all threads
|
|
75
|
+
let threads = Array.from(this.db.threads.values());
|
|
76
|
+
// Apply resourceId filter if provided
|
|
77
|
+
if (filter?.resourceId) {
|
|
78
|
+
threads = threads.filter(t => t.resourceId === filter.resourceId);
|
|
79
|
+
}
|
|
80
|
+
// Validate and apply metadata filter
|
|
81
|
+
this.validateMetadataKeys(filter?.metadata);
|
|
82
|
+
if (filter?.metadata && Object.keys(filter.metadata).length > 0) {
|
|
83
|
+
threads = threads.filter(thread => {
|
|
84
|
+
if (!thread.metadata)
|
|
85
|
+
return false;
|
|
86
|
+
return Object.entries(filter.metadata).every(([key, value]) => deepEquals(thread.metadata[key], value));
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
// Sort threads
|
|
90
|
+
threads.sort((a, b) => {
|
|
91
|
+
const aValue = new Date(a[field]).getTime();
|
|
92
|
+
const bValue = new Date(b[field]).getTime();
|
|
93
|
+
return direction === "ASC" ? aValue - bValue : bValue - aValue;
|
|
94
|
+
});
|
|
95
|
+
// Clone threads for output
|
|
96
|
+
const clonedThreads = threads.map(thread => ({
|
|
97
|
+
...thread,
|
|
98
|
+
metadata: thread.metadata ? { ...thread.metadata } : thread.metadata,
|
|
99
|
+
}));
|
|
100
|
+
const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
|
|
101
|
+
return {
|
|
102
|
+
threads: clonedThreads.slice(offset, offset + perPage),
|
|
103
|
+
total: clonedThreads.length,
|
|
104
|
+
page,
|
|
105
|
+
perPage: perPageForResponse,
|
|
106
|
+
hasMore: offset + perPage < clonedThreads.length,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// ========================================================================
|
|
110
|
+
// Message Operations
|
|
111
|
+
// ========================================================================
|
|
112
|
+
async listMessages({ threadId, resourceId: optionalResourceId, include, filter, perPage: perPageInput, page = 0, orderBy, }) {
|
|
113
|
+
const threadIds = Array.isArray(threadId) ? threadId : [threadId];
|
|
114
|
+
if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {
|
|
115
|
+
throw new Error("threadId must be a non-empty string or array of non-empty strings");
|
|
116
|
+
}
|
|
117
|
+
const threadIdSet = new Set(threadIds);
|
|
118
|
+
const { field, direction } = this.parseOrderBy(orderBy, "ASC");
|
|
119
|
+
const perPage = normalizePerPage(perPageInput, 40);
|
|
120
|
+
if (page < 0) {
|
|
121
|
+
throw new Error("page must be >= 0");
|
|
122
|
+
}
|
|
123
|
+
const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
|
|
124
|
+
// Get messages matching threadId(s)
|
|
125
|
+
let threadMessages = Array.from(this.db.messages.values()).filter(msg => {
|
|
126
|
+
if (threadIdSet && !threadIdSet.has(msg.thread_id))
|
|
127
|
+
return false;
|
|
128
|
+
if (optionalResourceId && msg.resourceId !== optionalResourceId)
|
|
129
|
+
return false;
|
|
130
|
+
return true;
|
|
131
|
+
});
|
|
132
|
+
// Apply date filtering
|
|
133
|
+
if (filter?.dateRange) {
|
|
134
|
+
const { start, end } = filter.dateRange;
|
|
135
|
+
if (start) {
|
|
136
|
+
threadMessages = threadMessages.filter(msg => new Date(msg.createdAt) >= start);
|
|
137
|
+
}
|
|
138
|
+
if (end) {
|
|
139
|
+
threadMessages = threadMessages.filter(msg => new Date(msg.createdAt) <= end);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Sort messages
|
|
143
|
+
threadMessages.sort((a, b) => {
|
|
144
|
+
const aDate = field === "updatedAt" ? a.updatedAt : a.createdAt;
|
|
145
|
+
const bDate = field === "updatedAt" ? b.updatedAt : b.createdAt;
|
|
146
|
+
const aValue = new Date(aDate ?? a.createdAt).getTime();
|
|
147
|
+
const bValue = new Date(bDate ?? b.createdAt).getTime();
|
|
148
|
+
return direction === "ASC" ? aValue - bValue : bValue - aValue;
|
|
149
|
+
});
|
|
150
|
+
const totalThreadMessages = threadMessages.length;
|
|
151
|
+
// Apply pagination
|
|
152
|
+
const paginatedMessages = threadMessages.slice(offset, offset + perPage);
|
|
153
|
+
// Convert to CoreMessage format
|
|
154
|
+
const messages = paginatedMessages.map(msg => this.parseStoredMessage(msg));
|
|
155
|
+
const messageIds = new Set(messages.map(m => m.id));
|
|
156
|
+
// Add included messages
|
|
157
|
+
if (include && include.length > 0) {
|
|
158
|
+
for (const includeItem of include) {
|
|
159
|
+
const targetMessage = this.db.messages.get(includeItem.id);
|
|
160
|
+
if (targetMessage && !messageIds.has(targetMessage.id)) {
|
|
161
|
+
const convertedMessage = this.parseStoredMessage(targetMessage);
|
|
162
|
+
messages.push(convertedMessage);
|
|
163
|
+
messageIds.add(targetMessage.id);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Final sort
|
|
168
|
+
messages.sort((a, b) => {
|
|
169
|
+
const aValue = new Date(a.createdAt).getTime();
|
|
170
|
+
const bValue = new Date(b.createdAt).getTime();
|
|
171
|
+
return direction === "ASC" ? aValue - bValue : bValue - aValue;
|
|
172
|
+
});
|
|
173
|
+
return {
|
|
174
|
+
messages,
|
|
175
|
+
total: totalThreadMessages,
|
|
176
|
+
page,
|
|
177
|
+
perPage: perPageForResponse,
|
|
178
|
+
hasMore: offset + perPage < totalThreadMessages,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
async listMessagesById({ messageIds }) {
|
|
182
|
+
const rawMessages = messageIds
|
|
183
|
+
.map(id => this.db.messages.get(id))
|
|
184
|
+
.filter((msg) => !!msg);
|
|
185
|
+
return {
|
|
186
|
+
messages: rawMessages.map(m => this.parseStoredMessage(m)),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
async saveMessages(args) {
|
|
190
|
+
const { messages } = args;
|
|
191
|
+
// Update thread timestamps
|
|
192
|
+
const threadIds = new Set(messages.map(msg => msg.threadId).filter((id) => Boolean(id)));
|
|
193
|
+
for (const threadId of threadIds) {
|
|
194
|
+
const thread = this.db.threads.get(threadId);
|
|
195
|
+
if (thread) {
|
|
196
|
+
thread.updatedAt = new Date();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Save messages
|
|
200
|
+
for (const message of messages) {
|
|
201
|
+
const storageMessage = {
|
|
202
|
+
id: message.id,
|
|
203
|
+
thread_id: message.threadId || "",
|
|
204
|
+
content: typeof message.content === "string"
|
|
205
|
+
? message.content
|
|
206
|
+
: JSON.stringify(message.content),
|
|
207
|
+
role: message.role,
|
|
208
|
+
type: "text",
|
|
209
|
+
createdAt: message.createdAt,
|
|
210
|
+
resourceId: message.resourceId || null,
|
|
211
|
+
};
|
|
212
|
+
this.db.messages.set(message.id, storageMessage);
|
|
213
|
+
}
|
|
214
|
+
return { messages };
|
|
215
|
+
}
|
|
216
|
+
async updateMessages(args) {
|
|
217
|
+
const updatedMessages = [];
|
|
218
|
+
for (const update of args.messages) {
|
|
219
|
+
const storageMsg = this.db.messages.get(update.id);
|
|
220
|
+
if (!storageMsg)
|
|
221
|
+
continue;
|
|
222
|
+
if (update.role !== undefined)
|
|
223
|
+
storageMsg.role = update.role;
|
|
224
|
+
if (update.resourceId !== undefined)
|
|
225
|
+
storageMsg.resourceId = update.resourceId;
|
|
226
|
+
if (update.threadId !== undefined)
|
|
227
|
+
storageMsg.thread_id = update.threadId;
|
|
228
|
+
if (update.content !== undefined) {
|
|
229
|
+
storageMsg.content = typeof update.content === "string"
|
|
230
|
+
? update.content
|
|
231
|
+
: JSON.stringify(update.content);
|
|
232
|
+
}
|
|
233
|
+
updatedMessages.push(this.parseStoredMessage(storageMsg));
|
|
234
|
+
}
|
|
235
|
+
return updatedMessages;
|
|
236
|
+
}
|
|
237
|
+
async deleteMessages(messageIds) {
|
|
238
|
+
if (!messageIds || messageIds.length === 0)
|
|
239
|
+
return;
|
|
240
|
+
const threadIds = new Set();
|
|
241
|
+
for (const messageId of messageIds) {
|
|
242
|
+
const message = this.db.messages.get(messageId);
|
|
243
|
+
if (message && message.thread_id) {
|
|
244
|
+
threadIds.add(message.thread_id);
|
|
245
|
+
}
|
|
246
|
+
this.db.messages.delete(messageId);
|
|
247
|
+
}
|
|
248
|
+
// Update thread timestamps
|
|
249
|
+
const now = new Date();
|
|
250
|
+
for (const threadId of threadIds) {
|
|
251
|
+
const thread = this.db.threads.get(threadId);
|
|
252
|
+
if (thread) {
|
|
253
|
+
thread.updatedAt = now;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// ========================================================================
|
|
258
|
+
// Resource Operations
|
|
259
|
+
// ========================================================================
|
|
260
|
+
async getResourceById({ resourceId }) {
|
|
261
|
+
const resource = this.db.resources.get(resourceId);
|
|
262
|
+
return resource
|
|
263
|
+
? { ...resource, metadata: resource.metadata ? { ...resource.metadata } : resource.metadata }
|
|
264
|
+
: null;
|
|
265
|
+
}
|
|
266
|
+
async saveResource({ resource }) {
|
|
267
|
+
this.db.resources.set(resource.id, resource);
|
|
268
|
+
return resource;
|
|
269
|
+
}
|
|
270
|
+
async updateResource({ resourceId, workingMemory, metadata, }) {
|
|
271
|
+
let resource = this.db.resources.get(resourceId);
|
|
272
|
+
if (!resource) {
|
|
273
|
+
resource = {
|
|
274
|
+
id: resourceId,
|
|
275
|
+
workingMemory,
|
|
276
|
+
metadata: metadata || {},
|
|
277
|
+
createdAt: new Date(),
|
|
278
|
+
updatedAt: new Date(),
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
resource = {
|
|
283
|
+
...resource,
|
|
284
|
+
workingMemory: workingMemory !== undefined ? workingMemory : resource.workingMemory,
|
|
285
|
+
metadata: {
|
|
286
|
+
...resource.metadata,
|
|
287
|
+
...metadata,
|
|
288
|
+
},
|
|
289
|
+
updatedAt: new Date(),
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
this.db.resources.set(resourceId, resource);
|
|
293
|
+
return resource;
|
|
294
|
+
}
|
|
295
|
+
// ========================================================================
|
|
296
|
+
// Observational Memory Operations
|
|
297
|
+
// ========================================================================
|
|
298
|
+
getObservationalMemoryKey(threadId, resourceId) {
|
|
299
|
+
if (threadId) {
|
|
300
|
+
return `thread:${threadId}`;
|
|
301
|
+
}
|
|
302
|
+
return `resource:${resourceId}`;
|
|
303
|
+
}
|
|
304
|
+
async getObservationalMemory(threadId, resourceId) {
|
|
305
|
+
const key = this.getObservationalMemoryKey(threadId, resourceId);
|
|
306
|
+
const records = this.db.observationalMemory.get(key);
|
|
307
|
+
return records?.[0] ?? null;
|
|
308
|
+
}
|
|
309
|
+
async getObservationalMemoryHistory(threadId, resourceId, limit) {
|
|
310
|
+
const key = this.getObservationalMemoryKey(threadId, resourceId);
|
|
311
|
+
const records = this.db.observationalMemory.get(key) ?? [];
|
|
312
|
+
return limit != null ? records.slice(0, limit) : records;
|
|
313
|
+
}
|
|
314
|
+
async initializeObservationalMemory(input) {
|
|
315
|
+
const { threadId, resourceId, scope, config, observedTimezone } = input;
|
|
316
|
+
const key = this.getObservationalMemoryKey(threadId, resourceId);
|
|
317
|
+
const now = new Date();
|
|
318
|
+
const record = {
|
|
319
|
+
id: crypto.randomUUID(),
|
|
320
|
+
scope,
|
|
321
|
+
threadId,
|
|
322
|
+
resourceId,
|
|
323
|
+
createdAt: now,
|
|
324
|
+
updatedAt: now,
|
|
325
|
+
lastObservedAt: undefined,
|
|
326
|
+
originType: "initial",
|
|
327
|
+
generationCount: 0,
|
|
328
|
+
activeObservations: "",
|
|
329
|
+
bufferedObservationChunks: undefined,
|
|
330
|
+
bufferedReflection: undefined,
|
|
331
|
+
totalTokensObserved: 0,
|
|
332
|
+
observationTokenCount: 0,
|
|
333
|
+
pendingMessageTokens: 0,
|
|
334
|
+
isReflecting: false,
|
|
335
|
+
isObserving: false,
|
|
336
|
+
isBufferingObservation: false,
|
|
337
|
+
isBufferingReflection: false,
|
|
338
|
+
lastBufferedAtTokens: 0,
|
|
339
|
+
lastBufferedAtTime: null,
|
|
340
|
+
config,
|
|
341
|
+
observedTimezone,
|
|
342
|
+
metadata: {},
|
|
343
|
+
};
|
|
344
|
+
const existing = this.db.observationalMemory.get(key) ?? [];
|
|
345
|
+
this.db.observationalMemory.set(key, [record, ...existing]);
|
|
346
|
+
return record;
|
|
347
|
+
}
|
|
348
|
+
async insertObservationalMemoryRecord(record) {
|
|
349
|
+
const key = this.getObservationalMemoryKey(record.threadId, record.resourceId);
|
|
350
|
+
const existing = this.db.observationalMemory.get(key) ?? [];
|
|
351
|
+
let inserted = false;
|
|
352
|
+
for (let i = 0; i < existing.length; i++) {
|
|
353
|
+
if (record.generationCount >= existing[i].generationCount) {
|
|
354
|
+
existing.splice(i, 0, record);
|
|
355
|
+
inserted = true;
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (!inserted)
|
|
360
|
+
existing.push(record);
|
|
361
|
+
this.db.observationalMemory.set(key, existing);
|
|
362
|
+
}
|
|
363
|
+
async updateActiveObservations(input) {
|
|
364
|
+
const { id, observations, tokenCount, lastObservedAt, observedMessageIds } = input;
|
|
365
|
+
const record = this.findObservationalMemoryRecordById(id);
|
|
366
|
+
if (!record) {
|
|
367
|
+
throw new Error(`Observational memory record not found: ${id}`);
|
|
368
|
+
}
|
|
369
|
+
record.activeObservations = observations;
|
|
370
|
+
record.observationTokenCount = tokenCount;
|
|
371
|
+
record.totalTokensObserved += tokenCount;
|
|
372
|
+
record.pendingMessageTokens = 0;
|
|
373
|
+
record.lastObservedAt = lastObservedAt;
|
|
374
|
+
record.updatedAt = new Date();
|
|
375
|
+
if (observedMessageIds) {
|
|
376
|
+
record.observedMessageIds = observedMessageIds;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
async updateBufferedObservations(input) {
|
|
380
|
+
const { id, chunk, lastBufferedAtTime } = input;
|
|
381
|
+
const record = this.findObservationalMemoryRecordById(id);
|
|
382
|
+
if (!record) {
|
|
383
|
+
throw new Error(`Observational memory record not found: ${id}`);
|
|
384
|
+
}
|
|
385
|
+
const newChunk = {
|
|
386
|
+
id: `ombuf-${crypto.randomUUID()}`,
|
|
387
|
+
cycleId: chunk.cycleId,
|
|
388
|
+
observations: chunk.observations,
|
|
389
|
+
tokenCount: chunk.tokenCount,
|
|
390
|
+
messageIds: chunk.messageIds,
|
|
391
|
+
messageTokens: chunk.messageTokens,
|
|
392
|
+
lastObservedAt: chunk.lastObservedAt,
|
|
393
|
+
createdAt: new Date(),
|
|
394
|
+
suggestedContinuation: chunk.suggestedContinuation,
|
|
395
|
+
currentTask: chunk.currentTask,
|
|
396
|
+
};
|
|
397
|
+
const existingChunks = Array.isArray(record.bufferedObservationChunks)
|
|
398
|
+
? record.bufferedObservationChunks
|
|
399
|
+
: [];
|
|
400
|
+
record.bufferedObservationChunks = [...existingChunks, newChunk];
|
|
401
|
+
if (lastBufferedAtTime) {
|
|
402
|
+
record.lastBufferedAtTime = lastBufferedAtTime;
|
|
403
|
+
}
|
|
404
|
+
record.updatedAt = new Date();
|
|
405
|
+
}
|
|
406
|
+
async swapBufferedToActive(input) {
|
|
407
|
+
const { id, activationRatio, lastObservedAt, messageTokensThreshold, currentPendingTokens, forceMaxActivation } = input;
|
|
408
|
+
const record = this.findObservationalMemoryRecordById(id);
|
|
409
|
+
if (!record) {
|
|
410
|
+
throw new Error(`Observational memory record not found: ${id}`);
|
|
411
|
+
}
|
|
412
|
+
const chunks = Array.isArray(record.bufferedObservationChunks)
|
|
413
|
+
? record.bufferedObservationChunks
|
|
414
|
+
: [];
|
|
415
|
+
if (chunks.length === 0) {
|
|
416
|
+
return {
|
|
417
|
+
chunksActivated: 0,
|
|
418
|
+
messageTokensActivated: 0,
|
|
419
|
+
observationTokensActivated: 0,
|
|
420
|
+
messagesActivated: 0,
|
|
421
|
+
activatedCycleIds: [],
|
|
422
|
+
activatedMessageIds: [],
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
const retentionFloor = messageTokensThreshold * (1 - activationRatio);
|
|
426
|
+
const targetMessageTokens = Math.max(0, currentPendingTokens - retentionFloor);
|
|
427
|
+
let cumulativeMessageTokens = 0;
|
|
428
|
+
let chunksToActivate = 1;
|
|
429
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
430
|
+
cumulativeMessageTokens += chunks[i].messageTokens ?? 0;
|
|
431
|
+
if (cumulativeMessageTokens >= targetMessageTokens) {
|
|
432
|
+
chunksToActivate = i + 1;
|
|
433
|
+
break;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
const activatedChunks = chunks.slice(0, chunksToActivate);
|
|
437
|
+
const remainingChunks = chunks.slice(chunksToActivate);
|
|
438
|
+
const activatedContent = activatedChunks.map(c => c.observations).join("\n\n");
|
|
439
|
+
const activatedTokens = activatedChunks.reduce((sum, c) => sum + c.tokenCount, 0);
|
|
440
|
+
const activatedMessageTokens = activatedChunks.reduce((sum, c) => sum + (c.messageTokens ?? 0), 0);
|
|
441
|
+
const activatedMessageCount = activatedChunks.reduce((sum, c) => sum + c.messageIds.length, 0);
|
|
442
|
+
const activatedCycleIds = activatedChunks.map(c => c.cycleId).filter((id) => !!id);
|
|
443
|
+
const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds);
|
|
444
|
+
const latestChunk = activatedChunks[activatedChunks.length - 1];
|
|
445
|
+
const derivedLastObservedAt = lastObservedAt ??
|
|
446
|
+
(latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());
|
|
447
|
+
if (record.activeObservations) {
|
|
448
|
+
record.activeObservations = `${record.activeObservations}\n\n${activatedContent}`;
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
record.activeObservations = activatedContent;
|
|
452
|
+
}
|
|
453
|
+
record.observationTokenCount = (record.observationTokenCount ?? 0) + activatedTokens;
|
|
454
|
+
record.pendingMessageTokens = Math.max(0, (record.pendingMessageTokens ?? 0) - activatedMessageTokens);
|
|
455
|
+
record.bufferedObservationChunks = remainingChunks.length > 0 ? remainingChunks : undefined;
|
|
456
|
+
record.lastObservedAt = derivedLastObservedAt;
|
|
457
|
+
record.updatedAt = new Date();
|
|
458
|
+
return {
|
|
459
|
+
chunksActivated: activatedChunks.length,
|
|
460
|
+
messageTokensActivated: activatedMessageTokens,
|
|
461
|
+
observationTokensActivated: activatedTokens,
|
|
462
|
+
messagesActivated: activatedMessageCount,
|
|
463
|
+
activatedCycleIds,
|
|
464
|
+
activatedMessageIds,
|
|
465
|
+
observations: activatedContent,
|
|
466
|
+
suggestedContinuation: latestChunk?.suggestedContinuation ?? undefined,
|
|
467
|
+
currentTask: latestChunk?.currentTask ?? undefined,
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
async createReflectionGeneration(input) {
|
|
471
|
+
const { currentRecord, reflection, tokenCount } = input;
|
|
472
|
+
const key = this.getObservationalMemoryKey(currentRecord.threadId, currentRecord.resourceId);
|
|
473
|
+
const now = new Date();
|
|
474
|
+
const newRecord = {
|
|
475
|
+
id: crypto.randomUUID(),
|
|
476
|
+
scope: currentRecord.scope,
|
|
477
|
+
threadId: currentRecord.threadId,
|
|
478
|
+
resourceId: currentRecord.resourceId,
|
|
479
|
+
createdAt: now,
|
|
480
|
+
updatedAt: now,
|
|
481
|
+
lastObservedAt: currentRecord.lastObservedAt ?? now,
|
|
482
|
+
originType: "reflection",
|
|
483
|
+
generationCount: currentRecord.generationCount + 1,
|
|
484
|
+
activeObservations: reflection,
|
|
485
|
+
config: currentRecord.config,
|
|
486
|
+
totalTokensObserved: currentRecord.totalTokensObserved,
|
|
487
|
+
observationTokenCount: tokenCount,
|
|
488
|
+
pendingMessageTokens: 0,
|
|
489
|
+
isReflecting: false,
|
|
490
|
+
isObserving: false,
|
|
491
|
+
isBufferingObservation: false,
|
|
492
|
+
isBufferingReflection: false,
|
|
493
|
+
lastBufferedAtTokens: 0,
|
|
494
|
+
lastBufferedAtTime: null,
|
|
495
|
+
observedTimezone: currentRecord.observedTimezone,
|
|
496
|
+
metadata: {},
|
|
497
|
+
};
|
|
498
|
+
const existing = this.db.observationalMemory.get(key) ?? [];
|
|
499
|
+
this.db.observationalMemory.set(key, [newRecord, ...existing]);
|
|
500
|
+
return newRecord;
|
|
501
|
+
}
|
|
502
|
+
async updateBufferedReflection(input) {
|
|
503
|
+
const { id, reflection, tokenCount, inputTokenCount, reflectedObservationLineCount } = input;
|
|
504
|
+
const record = this.findObservationalMemoryRecordById(id);
|
|
505
|
+
if (!record) {
|
|
506
|
+
throw new Error(`Observational memory record not found: ${id}`);
|
|
507
|
+
}
|
|
508
|
+
const existing = record.bufferedReflection || "";
|
|
509
|
+
record.bufferedReflection = existing ? `${existing}\n\n${reflection}` : reflection;
|
|
510
|
+
record.bufferedReflectionTokens = (record.bufferedReflectionTokens || 0) + tokenCount;
|
|
511
|
+
record.bufferedReflectionInputTokens = (record.bufferedReflectionInputTokens || 0) + inputTokenCount;
|
|
512
|
+
record.reflectedObservationLineCount = reflectedObservationLineCount;
|
|
513
|
+
record.updatedAt = new Date();
|
|
514
|
+
}
|
|
515
|
+
async swapBufferedReflectionToActive(input) {
|
|
516
|
+
const { currentRecord, tokenCount } = input;
|
|
517
|
+
const record = this.findObservationalMemoryRecordById(currentRecord.id);
|
|
518
|
+
if (!record) {
|
|
519
|
+
throw new Error(`Observational memory record not found: ${currentRecord.id}`);
|
|
520
|
+
}
|
|
521
|
+
if (!record.bufferedReflection) {
|
|
522
|
+
throw new Error("No buffered reflection to swap");
|
|
523
|
+
}
|
|
524
|
+
const bufferedReflection = record.bufferedReflection;
|
|
525
|
+
const reflectedLineCount = record.reflectedObservationLineCount ?? 0;
|
|
526
|
+
const currentObservations = record.activeObservations ?? "";
|
|
527
|
+
const allLines = currentObservations.split("\n");
|
|
528
|
+
const unreflectedLines = allLines.slice(reflectedLineCount);
|
|
529
|
+
const unreflectedContent = unreflectedLines.join("\n").trim();
|
|
530
|
+
const newObservations = unreflectedContent
|
|
531
|
+
? `${bufferedReflection}\n\n${unreflectedContent}`
|
|
532
|
+
: bufferedReflection;
|
|
533
|
+
const newRecord = await this.createReflectionGeneration({
|
|
534
|
+
currentRecord: record,
|
|
535
|
+
reflection: newObservations,
|
|
536
|
+
tokenCount,
|
|
537
|
+
});
|
|
538
|
+
record.bufferedReflection = undefined;
|
|
539
|
+
record.bufferedReflectionTokens = undefined;
|
|
540
|
+
record.bufferedReflectionInputTokens = undefined;
|
|
541
|
+
record.reflectedObservationLineCount = undefined;
|
|
542
|
+
return newRecord;
|
|
543
|
+
}
|
|
544
|
+
async setReflectingFlag(id, isReflecting) {
|
|
545
|
+
const record = this.findObservationalMemoryRecordById(id);
|
|
546
|
+
if (!record)
|
|
547
|
+
throw new Error(`Observational memory record not found: ${id}`);
|
|
548
|
+
record.isReflecting = isReflecting;
|
|
549
|
+
record.updatedAt = new Date();
|
|
550
|
+
}
|
|
551
|
+
async setObservingFlag(id, isObserving) {
|
|
552
|
+
const record = this.findObservationalMemoryRecordById(id);
|
|
553
|
+
if (!record)
|
|
554
|
+
throw new Error(`Observational memory record not found: ${id}`);
|
|
555
|
+
record.isObserving = isObserving;
|
|
556
|
+
record.updatedAt = new Date();
|
|
557
|
+
}
|
|
558
|
+
async setBufferingObservationFlag(id, isBuffering, lastBufferedAtTokens) {
|
|
559
|
+
const record = this.findObservationalMemoryRecordById(id);
|
|
560
|
+
if (!record)
|
|
561
|
+
throw new Error(`Observational memory record not found: ${id}`);
|
|
562
|
+
record.isBufferingObservation = isBuffering;
|
|
563
|
+
if (lastBufferedAtTokens !== undefined) {
|
|
564
|
+
record.lastBufferedAtTokens = lastBufferedAtTokens;
|
|
565
|
+
}
|
|
566
|
+
record.updatedAt = new Date();
|
|
567
|
+
}
|
|
568
|
+
async setBufferingReflectionFlag(id, isBuffering) {
|
|
569
|
+
const record = this.findObservationalMemoryRecordById(id);
|
|
570
|
+
if (!record)
|
|
571
|
+
throw new Error(`Observational memory record not found: ${id}`);
|
|
572
|
+
record.isBufferingReflection = isBuffering;
|
|
573
|
+
record.updatedAt = new Date();
|
|
574
|
+
}
|
|
575
|
+
async clearObservationalMemory(threadId, resourceId) {
|
|
576
|
+
const key = this.getObservationalMemoryKey(threadId, resourceId);
|
|
577
|
+
this.db.observationalMemory.delete(key);
|
|
578
|
+
}
|
|
579
|
+
async setPendingMessageTokens(id, tokenCount) {
|
|
580
|
+
const record = this.findObservationalMemoryRecordById(id);
|
|
581
|
+
if (!record)
|
|
582
|
+
throw new Error(`Observational memory record not found: ${id}`);
|
|
583
|
+
record.pendingMessageTokens = tokenCount;
|
|
584
|
+
record.updatedAt = new Date();
|
|
585
|
+
}
|
|
586
|
+
// ========================================================================
|
|
587
|
+
// Private Helpers
|
|
588
|
+
// ========================================================================
|
|
589
|
+
parseStoredMessage(message) {
|
|
590
|
+
let parsedContent;
|
|
591
|
+
try {
|
|
592
|
+
const parsed = JSON.parse(message.content);
|
|
593
|
+
if (typeof parsed === "string") {
|
|
594
|
+
parsedContent = {
|
|
595
|
+
format: 2,
|
|
596
|
+
content: parsed,
|
|
597
|
+
parts: [{ type: "text", text: parsed }],
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
else {
|
|
601
|
+
parsedContent = parsed;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
catch {
|
|
605
|
+
parsedContent = {
|
|
606
|
+
format: 2,
|
|
607
|
+
content: message.content,
|
|
608
|
+
parts: [{ type: "text", text: message.content }],
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
return {
|
|
612
|
+
id: message.id,
|
|
613
|
+
threadId: message.thread_id,
|
|
614
|
+
content: parsedContent,
|
|
615
|
+
role: message.role,
|
|
616
|
+
createdAt: message.createdAt,
|
|
617
|
+
resourceId: message.resourceId ?? undefined,
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
findObservationalMemoryRecordById(id) {
|
|
621
|
+
for (const records of this.db.observationalMemory.values()) {
|
|
622
|
+
const record = records.find(r => r.id === id);
|
|
623
|
+
if (record)
|
|
624
|
+
return record;
|
|
625
|
+
}
|
|
626
|
+
return null;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Deep equality check
|
|
631
|
+
*/
|
|
632
|
+
function deepEquals(a, b) {
|
|
633
|
+
if (a === b)
|
|
634
|
+
return true;
|
|
635
|
+
if (typeof a !== typeof b)
|
|
636
|
+
return false;
|
|
637
|
+
if (typeof a !== "object" || a === null || b === null)
|
|
638
|
+
return false;
|
|
639
|
+
const aObj = a;
|
|
640
|
+
const bObj = b;
|
|
641
|
+
const aKeys = Object.keys(aObj);
|
|
642
|
+
const bKeys = Object.keys(bObj);
|
|
643
|
+
if (aKeys.length !== bKeys.length)
|
|
644
|
+
return false;
|
|
645
|
+
return aKeys.every(key => deepEquals(aObj[key], bObj[key]));
|
|
646
|
+
}
|
|
647
|
+
//# sourceMappingURL=inmemory.js.map
|