@nervekit/agent 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +5 -0
- package/dist/agent-loop.d.ts +2 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +2 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/agent.d.ts +125 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +427 -0
- package/dist/agent.js.map +1 -0
- package/dist/harness/agent-harness.d.ts +114 -0
- package/dist/harness/agent-harness.d.ts.map +1 -0
- package/dist/harness/agent-harness.js +474 -0
- package/dist/harness/agent-harness.js.map +1 -0
- package/dist/harness/compaction/branch-summarization.d.ts +54 -0
- package/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/harness/compaction/branch-summarization.js +183 -0
- package/dist/harness/compaction/branch-summarization.js.map +1 -0
- package/dist/harness/compaction/compaction.d.ts +19 -0
- package/dist/harness/compaction/compaction.d.ts.map +1 -0
- package/dist/harness/compaction/compaction.js +335 -0
- package/dist/harness/compaction/compaction.js.map +1 -0
- package/dist/harness/compaction/cut-points.d.ts +7 -0
- package/dist/harness/compaction/cut-points.d.ts.map +1 -0
- package/dist/harness/compaction/cut-points.js +106 -0
- package/dist/harness/compaction/cut-points.js.map +1 -0
- package/dist/harness/compaction/overflow.d.ts +3 -0
- package/dist/harness/compaction/overflow.d.ts.map +1 -0
- package/dist/harness/compaction/overflow.js +54 -0
- package/dist/harness/compaction/overflow.js.map +1 -0
- package/dist/harness/compaction/policy.d.ts +8 -0
- package/dist/harness/compaction/policy.d.ts.map +1 -0
- package/dist/harness/compaction/policy.js +57 -0
- package/dist/harness/compaction/policy.js.map +1 -0
- package/dist/harness/compaction/types.d.ts +79 -0
- package/dist/harness/compaction/types.d.ts.map +1 -0
- package/dist/harness/compaction/types.js +2 -0
- package/dist/harness/compaction/types.js.map +1 -0
- package/dist/harness/compaction/usage.d.ts +30 -0
- package/dist/harness/compaction/usage.d.ts.map +1 -0
- package/dist/harness/compaction/usage.js +177 -0
- package/dist/harness/compaction/usage.js.map +1 -0
- package/dist/harness/compaction/utils.d.ts +25 -0
- package/dist/harness/compaction/utils.d.ts.map +1 -0
- package/dist/harness/compaction/utils.js +131 -0
- package/dist/harness/compaction/utils.js.map +1 -0
- package/dist/harness/configuration.d.ts +34 -0
- package/dist/harness/configuration.d.ts.map +1 -0
- package/dist/harness/configuration.js +75 -0
- package/dist/harness/configuration.js.map +1 -0
- package/dist/harness/conversation/context.d.ts +24 -0
- package/dist/harness/conversation/context.d.ts.map +1 -0
- package/dist/harness/conversation/context.js +76 -0
- package/dist/harness/conversation/context.js.map +1 -0
- package/dist/harness/conversation/conversation.d.ts +36 -0
- package/dist/harness/conversation/conversation.d.ts.map +1 -0
- package/dist/harness/conversation/conversation.js +163 -0
- package/dist/harness/conversation/conversation.js.map +1 -0
- package/dist/harness/conversation/entries.d.ts +117 -0
- package/dist/harness/conversation/entries.d.ts.map +1 -0
- package/dist/harness/conversation/entries.js +2 -0
- package/dist/harness/conversation/entries.js.map +1 -0
- package/dist/harness/conversation/jsonl-repo.d.ts +27 -0
- package/dist/harness/conversation/jsonl-repo.d.ts.map +1 -0
- package/dist/harness/conversation/jsonl-repo.js +110 -0
- package/dist/harness/conversation/jsonl-repo.js.map +1 -0
- package/dist/harness/conversation/jsonl-storage.d.ts +34 -0
- package/dist/harness/conversation/jsonl-storage.d.ts.map +1 -0
- package/dist/harness/conversation/jsonl-storage.js +213 -0
- package/dist/harness/conversation/jsonl-storage.js.map +1 -0
- package/dist/harness/conversation/memory-repo.d.ts +18 -0
- package/dist/harness/conversation/memory-repo.d.ts.map +1 -0
- package/dist/harness/conversation/memory-repo.js +45 -0
- package/dist/harness/conversation/memory-repo.js.map +1 -0
- package/dist/harness/conversation/memory-storage.d.ts +25 -0
- package/dist/harness/conversation/memory-storage.d.ts.map +1 -0
- package/dist/harness/conversation/memory-storage.js +88 -0
- package/dist/harness/conversation/memory-storage.js.map +1 -0
- package/dist/harness/conversation/repo-utils.d.ts +13 -0
- package/dist/harness/conversation/repo-utils.d.ts.map +1 -0
- package/dist/harness/conversation/repo-utils.js +39 -0
- package/dist/harness/conversation/repo-utils.js.map +1 -0
- package/dist/harness/conversation/storage-utils.d.ts +11 -0
- package/dist/harness/conversation/storage-utils.d.ts.map +1 -0
- package/dist/harness/conversation/storage-utils.js +32 -0
- package/dist/harness/conversation/storage-utils.js.map +1 -0
- package/dist/harness/conversation/text-extraction.d.ts +8 -0
- package/dist/harness/conversation/text-extraction.d.ts.map +1 -0
- package/dist/harness/conversation/text-extraction.js +24 -0
- package/dist/harness/conversation/text-extraction.js.map +1 -0
- package/dist/harness/conversation/uuid.d.ts +2 -0
- package/dist/harness/conversation/uuid.d.ts.map +1 -0
- package/dist/harness/conversation/uuid.js +54 -0
- package/dist/harness/conversation/uuid.js.map +1 -0
- package/dist/harness/conversation-writes.d.ts +9 -0
- package/dist/harness/conversation-writes.d.ts.map +1 -0
- package/dist/harness/conversation-writes.js +54 -0
- package/dist/harness/conversation-writes.js.map +1 -0
- package/dist/harness/env/nodejs.d.ts +53 -0
- package/dist/harness/env/nodejs.d.ts.map +1 -0
- package/dist/harness/env/nodejs.js +497 -0
- package/dist/harness/env/nodejs.js.map +1 -0
- package/dist/harness/env/types.d.ts +106 -0
- package/dist/harness/env/types.d.ts.map +1 -0
- package/dist/harness/env/types.js +2 -0
- package/dist/harness/env/types.js.map +1 -0
- package/dist/harness/errors.d.ts +48 -0
- package/dist/harness/errors.d.ts.map +1 -0
- package/dist/harness/errors.js +63 -0
- package/dist/harness/errors.js.map +1 -0
- package/dist/harness/events.d.ts +238 -0
- package/dist/harness/events.d.ts.map +1 -0
- package/dist/harness/events.js +2 -0
- package/dist/harness/events.js.map +1 -0
- package/dist/harness/harness-configuration-methods.d.ts +36 -0
- package/dist/harness/harness-configuration-methods.d.ts.map +1 -0
- package/dist/harness/harness-configuration-methods.js +145 -0
- package/dist/harness/harness-configuration-methods.js.map +1 -0
- package/dist/harness/harness-continuation.d.ts +18 -0
- package/dist/harness/harness-continuation.d.ts.map +1 -0
- package/dist/harness/harness-continuation.js +56 -0
- package/dist/harness/harness-continuation.js.map +1 -0
- package/dist/harness/harness-events.d.ts +23 -0
- package/dist/harness/harness-events.d.ts.map +1 -0
- package/dist/harness/harness-events.js +129 -0
- package/dist/harness/harness-events.js.map +1 -0
- package/dist/harness/harness-invocations.d.ts +20 -0
- package/dist/harness/harness-invocations.d.ts.map +1 -0
- package/dist/harness/harness-invocations.js +22 -0
- package/dist/harness/harness-invocations.js.map +1 -0
- package/dist/harness/harness-maintenance.d.ts +30 -0
- package/dist/harness/harness-maintenance.d.ts.map +1 -0
- package/dist/harness/harness-maintenance.js +155 -0
- package/dist/harness/harness-maintenance.js.map +1 -0
- package/dist/harness/harness-queue-methods.d.ts +45 -0
- package/dist/harness/harness-queue-methods.d.ts.map +1 -0
- package/dist/harness/harness-queue-methods.js +51 -0
- package/dist/harness/harness-queue-methods.js.map +1 -0
- package/dist/harness/messages.d.ts +76 -0
- package/dist/harness/messages.d.ts.map +1 -0
- package/dist/harness/messages.js +147 -0
- package/dist/harness/messages.js.map +1 -0
- package/dist/harness/options.d.ts +95 -0
- package/dist/harness/options.d.ts.map +1 -0
- package/dist/harness/options.js +2 -0
- package/dist/harness/options.js.map +1 -0
- package/dist/harness/prompt-templates.d.ts +49 -0
- package/dist/harness/prompt-templates.d.ts.map +1 -0
- package/dist/harness/prompt-templates.js +230 -0
- package/dist/harness/prompt-templates.js.map +1 -0
- package/dist/harness/result.d.ts +19 -0
- package/dist/harness/result.d.ts.map +1 -0
- package/dist/harness/result.js +32 -0
- package/dist/harness/result.js.map +1 -0
- package/dist/harness/run/messages.d.ts +5 -0
- package/dist/harness/run/messages.d.ts.map +1 -0
- package/dist/harness/run/messages.js +37 -0
- package/dist/harness/run/messages.js.map +1 -0
- package/dist/harness/skills/format.d.ts +6 -0
- package/dist/harness/skills/format.d.ts.map +1 -0
- package/dist/harness/skills/format.js +38 -0
- package/dist/harness/skills/format.js.map +1 -0
- package/dist/harness/skills/index.d.ts +5 -0
- package/dist/harness/skills/index.d.ts.map +1 -0
- package/dist/harness/skills/index.js +5 -0
- package/dist/harness/skills/index.js.map +1 -0
- package/dist/harness/skills/loader.d.ts +43 -0
- package/dist/harness/skills/loader.d.ts.map +1 -0
- package/dist/harness/skills/loader.js +279 -0
- package/dist/harness/skills/loader.js.map +1 -0
- package/dist/harness/skills/parser.d.ts +12 -0
- package/dist/harness/skills/parser.d.ts.map +1 -0
- package/dist/harness/skills/parser.js +22 -0
- package/dist/harness/skills/parser.js.map +1 -0
- package/dist/harness/skills/validation.d.ts +3 -0
- package/dist/harness/skills/validation.d.ts.map +1 -0
- package/dist/harness/skills/validation.js +28 -0
- package/dist/harness/skills/validation.js.map +1 -0
- package/dist/harness/skills.d.ts +2 -0
- package/dist/harness/skills.d.ts.map +1 -0
- package/dist/harness/skills.js +2 -0
- package/dist/harness/skills.js.map +1 -0
- package/dist/harness/stream-options.d.ts +5 -0
- package/dist/harness/stream-options.d.ts.map +1 -0
- package/dist/harness/stream-options.js +67 -0
- package/dist/harness/stream-options.js.map +1 -0
- package/dist/harness/system-prompt.d.ts +2 -0
- package/dist/harness/system-prompt.d.ts.map +1 -0
- package/dist/harness/system-prompt.js +2 -0
- package/dist/harness/system-prompt.js.map +1 -0
- package/dist/harness/turn-state.d.ts +27 -0
- package/dist/harness/turn-state.d.ts.map +1 -0
- package/dist/harness/turn-state.js +35 -0
- package/dist/harness/turn-state.js.map +1 -0
- package/dist/harness/types.d.ts +9 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +8 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/harness/utils/env-path.d.ts +14 -0
- package/dist/harness/utils/env-path.d.ts.map +1 -0
- package/dist/harness/utils/env-path.js +99 -0
- package/dist/harness/utils/env-path.js.map +1 -0
- package/dist/harness/utils/shell-output.d.ts +16 -0
- package/dist/harness/utils/shell-output.d.ts.map +1 -0
- package/dist/harness/utils/shell-output.js +137 -0
- package/dist/harness/utils/shell-output.js.map +1 -0
- package/dist/harness/utils/truncate.d.ts +70 -0
- package/dist/harness/utils/truncate.d.ts.map +1 -0
- package/dist/harness/utils/truncate.js +289 -0
- package/dist/harness/utils/truncate.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +3 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -0
- package/dist/proxy.d.ts +67 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +299 -0
- package/dist/proxy.js.map +1 -0
- package/dist/runtime/loop/agent-loop.d.ts +24 -0
- package/dist/runtime/loop/agent-loop.d.ts.map +1 -0
- package/dist/runtime/loop/agent-loop.js +72 -0
- package/dist/runtime/loop/agent-loop.js.map +1 -0
- package/dist/runtime/loop/events.d.ts +5 -0
- package/dist/runtime/loop/events.d.ts.map +1 -0
- package/dist/runtime/loop/events.js +5 -0
- package/dist/runtime/loop/events.js.map +1 -0
- package/dist/runtime/loop/index.d.ts +6 -0
- package/dist/runtime/loop/index.d.ts.map +1 -0
- package/dist/runtime/loop/index.js +6 -0
- package/dist/runtime/loop/index.js.map +1 -0
- package/dist/runtime/loop/stream-assistant.d.ts +9 -0
- package/dist/runtime/loop/stream-assistant.d.ts.map +1 -0
- package/dist/runtime/loop/stream-assistant.js +87 -0
- package/dist/runtime/loop/stream-assistant.js.map +1 -0
- package/dist/runtime/loop/tool-execution.d.ts +15 -0
- package/dist/runtime/loop/tool-execution.d.ts.map +1 -0
- package/dist/runtime/loop/tool-execution.js +271 -0
- package/dist/runtime/loop/tool-execution.js.map +1 -0
- package/dist/runtime/loop/turn-loop.d.ts +7 -0
- package/dist/runtime/loop/turn-loop.d.ts.map +1 -0
- package/dist/runtime/loop/turn-loop.js +84 -0
- package/dist/runtime/loop/turn-loop.js.map +1 -0
- package/dist/runtime.d.ts +63 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +170 -0
- package/dist/runtime.js.map +1 -0
- package/dist/suspension.d.ts +18 -0
- package/dist/suspension.d.ts.map +1 -0
- package/dist/suspension.js +19 -0
- package/dist/suspension.js.map +1 -0
- package/dist/types.d.ts +395 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +88 -0
- package/dist/worker.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { ImageContent, TextContent } from "@earendil-works/pi-ai";
|
|
2
|
+
import type { AgentMessage } from "../../types.js";
|
|
3
|
+
import type { Conversation } from "./conversation.js";
|
|
4
|
+
export interface ConversationTreeEntryBase {
|
|
5
|
+
type: string;
|
|
6
|
+
id: string;
|
|
7
|
+
parentId: string | null;
|
|
8
|
+
timestamp: string;
|
|
9
|
+
}
|
|
10
|
+
export interface MessageEntry extends ConversationTreeEntryBase {
|
|
11
|
+
type: "message";
|
|
12
|
+
message: AgentMessage;
|
|
13
|
+
}
|
|
14
|
+
export interface ThinkingLevelChangeEntry extends ConversationTreeEntryBase {
|
|
15
|
+
type: "thinking_level_change";
|
|
16
|
+
thinkingLevel: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ModelChangeEntry extends ConversationTreeEntryBase {
|
|
19
|
+
type: "model_change";
|
|
20
|
+
provider: string;
|
|
21
|
+
modelId: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ActiveToolsChangeEntry extends ConversationTreeEntryBase {
|
|
24
|
+
type: "active_tools_change";
|
|
25
|
+
activeToolNames: string[];
|
|
26
|
+
}
|
|
27
|
+
export interface CompactionEntry<T = unknown> extends ConversationTreeEntryBase {
|
|
28
|
+
type: "compaction";
|
|
29
|
+
summary: string;
|
|
30
|
+
firstKeptEntryId: string;
|
|
31
|
+
tokensBefore: number;
|
|
32
|
+
details?: T;
|
|
33
|
+
fromHook?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface BranchSummaryEntry<T = unknown> extends ConversationTreeEntryBase {
|
|
36
|
+
type: "branch_summary";
|
|
37
|
+
fromId: string;
|
|
38
|
+
summary: string;
|
|
39
|
+
details?: T;
|
|
40
|
+
fromHook?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface CustomEntry<T = unknown> extends ConversationTreeEntryBase {
|
|
43
|
+
type: "custom";
|
|
44
|
+
customType: string;
|
|
45
|
+
data?: T;
|
|
46
|
+
}
|
|
47
|
+
export interface CustomMessageEntry<T = unknown> extends ConversationTreeEntryBase {
|
|
48
|
+
type: "custom_message";
|
|
49
|
+
customType: string;
|
|
50
|
+
content: string | (TextContent | ImageContent)[];
|
|
51
|
+
details?: T;
|
|
52
|
+
display: boolean;
|
|
53
|
+
}
|
|
54
|
+
export interface LabelEntry extends ConversationTreeEntryBase {
|
|
55
|
+
type: "label";
|
|
56
|
+
targetId: string;
|
|
57
|
+
label: string | undefined;
|
|
58
|
+
}
|
|
59
|
+
export interface ConversationInfoEntry extends ConversationTreeEntryBase {
|
|
60
|
+
type: "conversation_info";
|
|
61
|
+
name?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface LeafEntry extends ConversationTreeEntryBase {
|
|
64
|
+
type: "leaf";
|
|
65
|
+
targetId: string | null;
|
|
66
|
+
}
|
|
67
|
+
export type ConversationTreeEntry = MessageEntry | ThinkingLevelChangeEntry | ModelChangeEntry | ActiveToolsChangeEntry | CompactionEntry | BranchSummaryEntry | CustomEntry | CustomMessageEntry | LabelEntry | ConversationInfoEntry | LeafEntry;
|
|
68
|
+
export interface ConversationMetadata {
|
|
69
|
+
id: string;
|
|
70
|
+
createdAt: string;
|
|
71
|
+
}
|
|
72
|
+
export interface JsonlConversationMetadata extends ConversationMetadata {
|
|
73
|
+
cwd: string;
|
|
74
|
+
path: string;
|
|
75
|
+
parentConversationPath?: string;
|
|
76
|
+
}
|
|
77
|
+
export interface ConversationStorage<TMetadata extends ConversationMetadata = ConversationMetadata> {
|
|
78
|
+
getMetadata(): Promise<TMetadata>;
|
|
79
|
+
getLeafId(): Promise<string | null>;
|
|
80
|
+
/** Persist a leaf entry that records the active conversation-tree leaf. */
|
|
81
|
+
setLeafId(leafId: string | null): Promise<void>;
|
|
82
|
+
createEntryId(): Promise<string>;
|
|
83
|
+
appendEntry(entry: ConversationTreeEntry): Promise<void>;
|
|
84
|
+
getEntry(id: string): Promise<ConversationTreeEntry | undefined>;
|
|
85
|
+
findEntries<TType extends ConversationTreeEntry["type"]>(type: TType): Promise<Array<Extract<ConversationTreeEntry, {
|
|
86
|
+
type: TType;
|
|
87
|
+
}>>>;
|
|
88
|
+
getLabel(id: string): Promise<string | undefined>;
|
|
89
|
+
getPathToRoot(leafId: string | null): Promise<ConversationTreeEntry[]>;
|
|
90
|
+
getEntries(): Promise<ConversationTreeEntry[]>;
|
|
91
|
+
}
|
|
92
|
+
export type { Conversation } from "./conversation.js";
|
|
93
|
+
export interface ConversationCreateOptions {
|
|
94
|
+
id?: string;
|
|
95
|
+
}
|
|
96
|
+
export interface ConversationForkOptions {
|
|
97
|
+
entryId?: string;
|
|
98
|
+
position?: "before" | "at";
|
|
99
|
+
id?: string;
|
|
100
|
+
}
|
|
101
|
+
export interface ConversationRepo<TMetadata extends ConversationMetadata = ConversationMetadata, TCreateOptions extends ConversationCreateOptions = ConversationCreateOptions, TListOptions = void> {
|
|
102
|
+
create(options: TCreateOptions): Promise<Conversation<TMetadata>>;
|
|
103
|
+
open(metadata: TMetadata): Promise<Conversation<TMetadata>>;
|
|
104
|
+
list(options?: TListOptions): Promise<TMetadata[]>;
|
|
105
|
+
delete(metadata: TMetadata): Promise<void>;
|
|
106
|
+
fork(source: TMetadata, options: ConversationForkOptions & TCreateOptions): Promise<Conversation<TMetadata>>;
|
|
107
|
+
}
|
|
108
|
+
export interface JsonlConversationCreateOptions extends ConversationCreateOptions {
|
|
109
|
+
cwd: string;
|
|
110
|
+
parentConversationPath?: string;
|
|
111
|
+
}
|
|
112
|
+
export interface JsonlConversationListOptions {
|
|
113
|
+
cwd?: string;
|
|
114
|
+
}
|
|
115
|
+
export interface JsonlConversationRepoApi extends ConversationRepo<JsonlConversationMetadata, JsonlConversationCreateOptions, JsonlConversationListOptions> {
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=entries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../src/harness/conversation/entries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entries.js","sourceRoot":"","sources":["../../../src/harness/conversation/entries.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { FileSystem } from "../env/types.js";
|
|
2
|
+
import type { Conversation, JsonlConversationCreateOptions, JsonlConversationListOptions, JsonlConversationMetadata, JsonlConversationRepoApi } from "./entries.js";
|
|
3
|
+
type JsonlConversationRepoFileSystem = Pick<FileSystem, "cwd" | "absolutePath" | "joinPath" | "readTextFile" | "readTextLines" | "writeFile" | "appendFile" | "listDir" | "exists" | "createDir" | "remove">;
|
|
4
|
+
export declare class JsonlConversationRepo implements JsonlConversationRepoApi {
|
|
5
|
+
private readonly fs;
|
|
6
|
+
private readonly conversationsRootInput;
|
|
7
|
+
private conversationsRoot;
|
|
8
|
+
constructor(options: {
|
|
9
|
+
fs: JsonlConversationRepoFileSystem;
|
|
10
|
+
conversationsRoot: string;
|
|
11
|
+
});
|
|
12
|
+
private getConversationsRoot;
|
|
13
|
+
private getConversationDir;
|
|
14
|
+
private createConversationFilePath;
|
|
15
|
+
create(options: JsonlConversationCreateOptions): Promise<Conversation<JsonlConversationMetadata>>;
|
|
16
|
+
open(metadata: JsonlConversationMetadata): Promise<Conversation<JsonlConversationMetadata>>;
|
|
17
|
+
list(options?: JsonlConversationListOptions): Promise<JsonlConversationMetadata[]>;
|
|
18
|
+
delete(metadata: JsonlConversationMetadata): Promise<void>;
|
|
19
|
+
fork(sourceMetadata: JsonlConversationMetadata, options: JsonlConversationCreateOptions & {
|
|
20
|
+
entryId?: string;
|
|
21
|
+
position?: "before" | "at";
|
|
22
|
+
id?: string;
|
|
23
|
+
}): Promise<Conversation<JsonlConversationMetadata>>;
|
|
24
|
+
private listConversationDirs;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=jsonl-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-repo.d.ts","sourceRoot":"","sources":["../../../src/harness/conversation/jsonl-repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,KAAK,EACV,YAAY,EACZ,8BAA8B,EAC9B,4BAA4B,EAC5B,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,cAAc,CAAC;AAatB,KAAK,+BAA+B,GAAG,IAAI,CACzC,UAAU,EACR,KAAK,GACL,cAAc,GACd,UAAU,GACV,cAAc,GACd,eAAe,GACf,WAAW,GACX,YAAY,GACZ,SAAS,GACT,QAAQ,GACR,WAAW,GACX,QAAQ,CACX,CAAC;AAMF,qBAAa,qBAAsB,YAAW,wBAAwB;IACpE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAkC;IACrD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,iBAAiB,CAAqB;gBAElC,OAAO,EAAE;QACnB,EAAE,EAAE,+BAA+B,CAAC;QACpC,iBAAiB,EAAE,MAAM,CAAC;KAC3B;YAKa,oBAAoB;YAUpB,kBAAkB;YAUlB,0BAA0B;IAclC,MAAM,CACV,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAqB7C,IAAI,CACR,QAAQ,EAAE,yBAAyB,GAClC,OAAO,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAgB7C,IAAI,CACR,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,yBAAyB,EAAE,CAAC;IA0CjC,MAAM,CAAC,QAAQ,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1D,IAAI,CACR,cAAc,EAAE,yBAAyB,EACzC,OAAO,EAAE,8BAA8B,GAAG;QACxC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;QAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,GACA,OAAO,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;YA0BrC,oBAAoB;CAkBnC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { ConversationError } from "../errors.js";
|
|
2
|
+
import { toError } from "../result.js";
|
|
3
|
+
import { JsonlConversationStorage, loadJsonlConversationMetadata, } from "./jsonl-storage.js";
|
|
4
|
+
import { createConversationId, createTimestamp, getEntriesToFork, getFileSystemResultOrThrow, toConversation, } from "./repo-utils.js";
|
|
5
|
+
function encodeCwd(cwd) {
|
|
6
|
+
return `--${cwd.replace(/^[/\\]/, "").replace(/[/\\:]/g, "-")}--`;
|
|
7
|
+
}
|
|
8
|
+
export class JsonlConversationRepo {
|
|
9
|
+
fs;
|
|
10
|
+
conversationsRootInput;
|
|
11
|
+
conversationsRoot;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.fs = options.fs;
|
|
14
|
+
this.conversationsRootInput = options.conversationsRoot;
|
|
15
|
+
}
|
|
16
|
+
async getConversationsRoot() {
|
|
17
|
+
if (!this.conversationsRoot) {
|
|
18
|
+
this.conversationsRoot = getFileSystemResultOrThrow(await this.fs.absolutePath(this.conversationsRootInput), `Failed to resolve conversations root ${this.conversationsRootInput}`);
|
|
19
|
+
}
|
|
20
|
+
return this.conversationsRoot;
|
|
21
|
+
}
|
|
22
|
+
async getConversationDir(cwd) {
|
|
23
|
+
return getFileSystemResultOrThrow(await this.fs.joinPath([
|
|
24
|
+
await this.getConversationsRoot(),
|
|
25
|
+
encodeCwd(cwd),
|
|
26
|
+
]), `Failed to resolve conversation directory for ${cwd}`);
|
|
27
|
+
}
|
|
28
|
+
async createConversationFilePath(cwd, conversationId, timestamp) {
|
|
29
|
+
return getFileSystemResultOrThrow(await this.fs.joinPath([
|
|
30
|
+
await this.getConversationDir(cwd),
|
|
31
|
+
`${timestamp.replace(/[:.]/g, "-")}_${conversationId}.jsonl`,
|
|
32
|
+
]), `Failed to resolve conversation file path for ${conversationId}`);
|
|
33
|
+
}
|
|
34
|
+
async create(options) {
|
|
35
|
+
const id = options.id ?? createConversationId();
|
|
36
|
+
const createdAt = createTimestamp();
|
|
37
|
+
const conversationDir = await this.getConversationDir(options.cwd);
|
|
38
|
+
getFileSystemResultOrThrow(await this.fs.createDir(conversationDir, { recursive: true }), `Failed to create conversation directory ${conversationDir}`);
|
|
39
|
+
const filePath = await this.createConversationFilePath(options.cwd, id, createdAt);
|
|
40
|
+
const storage = await JsonlConversationStorage.create(this.fs, filePath, {
|
|
41
|
+
cwd: options.cwd,
|
|
42
|
+
conversationId: id,
|
|
43
|
+
parentConversationPath: options.parentConversationPath,
|
|
44
|
+
});
|
|
45
|
+
return toConversation(storage);
|
|
46
|
+
}
|
|
47
|
+
async open(metadata) {
|
|
48
|
+
if (!getFileSystemResultOrThrow(await this.fs.exists(metadata.path), `Failed to check conversation ${metadata.path}`)) {
|
|
49
|
+
throw new ConversationError("not_found", `Conversation not found: ${metadata.path}`);
|
|
50
|
+
}
|
|
51
|
+
const storage = await JsonlConversationStorage.open(this.fs, metadata.path);
|
|
52
|
+
return toConversation(storage);
|
|
53
|
+
}
|
|
54
|
+
async list(options = {}) {
|
|
55
|
+
const dirs = options.cwd
|
|
56
|
+
? [await this.getConversationDir(options.cwd)]
|
|
57
|
+
: await this.listConversationDirs();
|
|
58
|
+
const conversations = [];
|
|
59
|
+
for (const dir of dirs) {
|
|
60
|
+
if (!getFileSystemResultOrThrow(await this.fs.exists(dir), `Failed to check conversation directory ${dir}`)) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const files = getFileSystemResultOrThrow(await this.fs.listDir(dir), `Failed to list conversations in ${dir}`).filter((file) => file.kind !== "directory" && file.name.endsWith(".jsonl"));
|
|
64
|
+
for (const file of files) {
|
|
65
|
+
try {
|
|
66
|
+
conversations.push(await loadJsonlConversationMetadata(this.fs, file.path));
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
const cause = toError(error);
|
|
70
|
+
if (!(cause instanceof ConversationError) ||
|
|
71
|
+
cause.code !== "invalid_conversation")
|
|
72
|
+
throw cause;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
conversations.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
77
|
+
return conversations;
|
|
78
|
+
}
|
|
79
|
+
async delete(metadata) {
|
|
80
|
+
getFileSystemResultOrThrow(await this.fs.remove(metadata.path, { force: true }), `Failed to delete conversation ${metadata.path}`);
|
|
81
|
+
}
|
|
82
|
+
async fork(sourceMetadata, options) {
|
|
83
|
+
const source = await this.open(sourceMetadata);
|
|
84
|
+
const forkedEntries = await getEntriesToFork(source.getStorage(), options);
|
|
85
|
+
const id = options.id ?? createConversationId();
|
|
86
|
+
const createdAt = createTimestamp();
|
|
87
|
+
const conversationDir = await this.getConversationDir(options.cwd);
|
|
88
|
+
getFileSystemResultOrThrow(await this.fs.createDir(conversationDir, { recursive: true }), `Failed to create conversation directory ${conversationDir}`);
|
|
89
|
+
const storage = await JsonlConversationStorage.create(this.fs, await this.createConversationFilePath(options.cwd, id, createdAt), {
|
|
90
|
+
cwd: options.cwd,
|
|
91
|
+
conversationId: id,
|
|
92
|
+
parentConversationPath: options.parentConversationPath ?? sourceMetadata.path,
|
|
93
|
+
});
|
|
94
|
+
for (const entry of forkedEntries) {
|
|
95
|
+
await storage.appendEntry(entry);
|
|
96
|
+
}
|
|
97
|
+
return toConversation(storage);
|
|
98
|
+
}
|
|
99
|
+
async listConversationDirs() {
|
|
100
|
+
const conversationsRoot = await this.getConversationsRoot();
|
|
101
|
+
if (!getFileSystemResultOrThrow(await this.fs.exists(conversationsRoot), `Failed to check conversations root ${conversationsRoot}`)) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
const entries = getFileSystemResultOrThrow(await this.fs.listDir(conversationsRoot), `Failed to list conversations root ${conversationsRoot}`);
|
|
105
|
+
return entries
|
|
106
|
+
.filter((entry) => entry.kind === "directory")
|
|
107
|
+
.map((entry) => entry.path);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=jsonl-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-repo.js","sourceRoot":"","sources":["../../../src/harness/conversation/jsonl-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { FileSystem } from "../env/types.js";
|
|
2
|
+
import type { ConversationStorage, ConversationTreeEntry, JsonlConversationMetadata } from "./entries.js";
|
|
3
|
+
type JsonlConversationStorageFileSystem = Pick<FileSystem, "readTextFile" | "readTextLines" | "writeFile" | "appendFile">;
|
|
4
|
+
export declare function loadJsonlConversationMetadata(fs: JsonlConversationStorageFileSystem, filePath: string): Promise<JsonlConversationMetadata>;
|
|
5
|
+
export declare class JsonlConversationStorage implements ConversationStorage<JsonlConversationMetadata> {
|
|
6
|
+
private readonly fs;
|
|
7
|
+
private readonly filePath;
|
|
8
|
+
private readonly metadata;
|
|
9
|
+
private entries;
|
|
10
|
+
private byId;
|
|
11
|
+
private labelsById;
|
|
12
|
+
private currentLeafId;
|
|
13
|
+
private constructor();
|
|
14
|
+
static open(fs: JsonlConversationStorageFileSystem, filePath: string): Promise<JsonlConversationStorage>;
|
|
15
|
+
static create(fs: JsonlConversationStorageFileSystem, filePath: string, options: {
|
|
16
|
+
cwd: string;
|
|
17
|
+
conversationId: string;
|
|
18
|
+
parentConversationPath?: string;
|
|
19
|
+
}): Promise<JsonlConversationStorage>;
|
|
20
|
+
getMetadata(): Promise<JsonlConversationMetadata>;
|
|
21
|
+
getLeafId(): Promise<string | null>;
|
|
22
|
+
setLeafId(leafId: string | null): Promise<void>;
|
|
23
|
+
createEntryId(): Promise<string>;
|
|
24
|
+
appendEntry(entry: ConversationTreeEntry): Promise<void>;
|
|
25
|
+
getEntry(id: string): Promise<ConversationTreeEntry | undefined>;
|
|
26
|
+
findEntries<TType extends ConversationTreeEntry["type"]>(type: TType): Promise<Array<Extract<ConversationTreeEntry, {
|
|
27
|
+
type: TType;
|
|
28
|
+
}>>>;
|
|
29
|
+
getLabel(id: string): Promise<string | undefined>;
|
|
30
|
+
getPathToRoot(leafId: string | null): Promise<ConversationTreeEntry[]>;
|
|
31
|
+
getEntries(): Promise<ConversationTreeEntry[]>;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=jsonl-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-storage.d.ts","sourceRoot":"","sources":["../../../src/harness/conversation/jsonl-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EAE1B,MAAM,cAAc,CAAC;AAStB,KAAK,kCAAkC,GAAG,IAAI,CAC5C,UAAU,EACV,cAAc,GAAG,eAAe,GAAG,WAAW,GAAG,YAAY,CAC9D,CAAC;AAmJF,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,kCAAkC,EACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,yBAAyB,CAAC,CAYpC;AAoCD,qBAAa,wBACX,YAAW,mBAAmB,CAAC,yBAAyB,CAAC;IAEzD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAqC;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,IAAI,CAAqC;IACjD,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO;WAgBM,IAAI,CACf,EAAE,EAAE,kCAAkC,EACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,wBAAwB,CAAC;WAWvB,MAAM,CACjB,EAAE,EAAE,kCAAkC,EACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,EAAE,MAAM,CAAC;QACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,GACA,OAAO,CAAC,wBAAwB,CAAC;IAgB9B,WAAW,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAIjD,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUnC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB/C,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,WAAW,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAIhE,WAAW,CAAC,KAAK,SAAS,qBAAqB,CAAC,MAAM,CAAC,EAC3D,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC,CAAC;IAO5D,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIjD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAoBtE,UAAU,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;CAGrD"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { ConversationError } from "../errors.js";
|
|
2
|
+
import { toError } from "../result.js";
|
|
3
|
+
import { getFileSystemResultOrThrow } from "./repo-utils.js";
|
|
4
|
+
import { buildLabelsById, generateEntryId, leafIdAfterEntry, updateLabelCache, } from "./storage-utils.js";
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return typeof value === "object" && value !== null;
|
|
7
|
+
}
|
|
8
|
+
function invalidConversation(filePath, message, cause) {
|
|
9
|
+
return new ConversationError("invalid_conversation", `Invalid JSONL conversation file ${filePath}: ${message}`, cause);
|
|
10
|
+
}
|
|
11
|
+
function invalidEntry(filePath, lineNumber, message, cause) {
|
|
12
|
+
return new ConversationError("invalid_entry", `Invalid JSONL conversation file ${filePath}: line ${lineNumber} ${message}`, cause);
|
|
13
|
+
}
|
|
14
|
+
function parseHeaderLine(line, filePath) {
|
|
15
|
+
let parsed;
|
|
16
|
+
try {
|
|
17
|
+
parsed = JSON.parse(line);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
throw invalidConversation(filePath, "first line is not a valid conversation header", toError(error));
|
|
21
|
+
}
|
|
22
|
+
if (!isRecord(parsed))
|
|
23
|
+
throw invalidConversation(filePath, "first line is not a valid conversation header");
|
|
24
|
+
if (parsed.type !== "conversation")
|
|
25
|
+
throw invalidConversation(filePath, "first line is not a valid conversation header");
|
|
26
|
+
if (parsed.version !== 3)
|
|
27
|
+
throw invalidConversation(filePath, "unsupported conversation version");
|
|
28
|
+
if (typeof parsed.id !== "string" || !parsed.id)
|
|
29
|
+
throw invalidConversation(filePath, "conversation header is missing id");
|
|
30
|
+
if (typeof parsed.timestamp !== "string" || !parsed.timestamp) {
|
|
31
|
+
throw invalidConversation(filePath, "conversation header is missing timestamp");
|
|
32
|
+
}
|
|
33
|
+
if (typeof parsed.cwd !== "string" || !parsed.cwd)
|
|
34
|
+
throw invalidConversation(filePath, "conversation header is missing cwd");
|
|
35
|
+
if (parsed.parentConversation !== undefined &&
|
|
36
|
+
typeof parsed.parentConversation !== "string") {
|
|
37
|
+
throw invalidConversation(filePath, "conversation header parentConversation must be a string");
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
type: "conversation",
|
|
41
|
+
version: 3,
|
|
42
|
+
id: parsed.id,
|
|
43
|
+
timestamp: parsed.timestamp,
|
|
44
|
+
cwd: parsed.cwd,
|
|
45
|
+
parentConversation: parsed.parentConversation,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function parseEntryLine(line, filePath, lineNumber) {
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = JSON.parse(line);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw invalidEntry(filePath, lineNumber, "is not valid JSON", toError(error));
|
|
55
|
+
}
|
|
56
|
+
if (!isRecord(parsed))
|
|
57
|
+
throw invalidEntry(filePath, lineNumber, "is not a valid conversation entry");
|
|
58
|
+
if (typeof parsed.type !== "string")
|
|
59
|
+
throw invalidEntry(filePath, lineNumber, "is missing entry type");
|
|
60
|
+
if (typeof parsed.id !== "string" || !parsed.id)
|
|
61
|
+
throw invalidEntry(filePath, lineNumber, "is missing entry id");
|
|
62
|
+
if (parsed.parentId !== null && typeof parsed.parentId !== "string") {
|
|
63
|
+
throw invalidEntry(filePath, lineNumber, "has invalid parentId");
|
|
64
|
+
}
|
|
65
|
+
if (typeof parsed.timestamp !== "string" || !parsed.timestamp) {
|
|
66
|
+
throw invalidEntry(filePath, lineNumber, "is missing timestamp");
|
|
67
|
+
}
|
|
68
|
+
if (parsed.type === "leaf" &&
|
|
69
|
+
parsed.targetId !== null &&
|
|
70
|
+
typeof parsed.targetId !== "string") {
|
|
71
|
+
throw invalidEntry(filePath, lineNumber, "has invalid targetId");
|
|
72
|
+
}
|
|
73
|
+
return parsed;
|
|
74
|
+
}
|
|
75
|
+
function headerToConversationMetadata(header, path) {
|
|
76
|
+
return {
|
|
77
|
+
id: header.id,
|
|
78
|
+
createdAt: header.timestamp,
|
|
79
|
+
cwd: header.cwd,
|
|
80
|
+
path,
|
|
81
|
+
parentConversationPath: header.parentConversation,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export async function loadJsonlConversationMetadata(fs, filePath) {
|
|
85
|
+
const lines = getFileSystemResultOrThrow(await fs.readTextLines(filePath, { maxLines: 1 }), `Failed to read conversation header ${filePath}`);
|
|
86
|
+
const line = lines[0];
|
|
87
|
+
if (line?.trim())
|
|
88
|
+
return headerToConversationMetadata(parseHeaderLine(line, filePath), filePath);
|
|
89
|
+
throw invalidConversation(filePath, "missing conversation header");
|
|
90
|
+
}
|
|
91
|
+
async function loadJsonlStorage(fs, filePath) {
|
|
92
|
+
const content = getFileSystemResultOrThrow(await fs.readTextFile(filePath), `Failed to read conversation ${filePath}`);
|
|
93
|
+
const lines = content.split("\n").filter((line) => line.trim());
|
|
94
|
+
if (lines.length === 0) {
|
|
95
|
+
throw invalidConversation(filePath, "missing conversation header");
|
|
96
|
+
}
|
|
97
|
+
const headerLine = lines[0];
|
|
98
|
+
if (!headerLine) {
|
|
99
|
+
throw invalidConversation(filePath, "missing conversation header");
|
|
100
|
+
}
|
|
101
|
+
const header = parseHeaderLine(headerLine, filePath);
|
|
102
|
+
const entries = [];
|
|
103
|
+
let leafId = null;
|
|
104
|
+
for (let i = 1; i < lines.length; i++) {
|
|
105
|
+
const line = lines[i];
|
|
106
|
+
if (!line)
|
|
107
|
+
continue;
|
|
108
|
+
const entry = parseEntryLine(line, filePath, i + 1);
|
|
109
|
+
entries.push(entry);
|
|
110
|
+
leafId = leafIdAfterEntry(entry);
|
|
111
|
+
}
|
|
112
|
+
return { header, entries, leafId };
|
|
113
|
+
}
|
|
114
|
+
export class JsonlConversationStorage {
|
|
115
|
+
fs;
|
|
116
|
+
filePath;
|
|
117
|
+
metadata;
|
|
118
|
+
entries;
|
|
119
|
+
byId;
|
|
120
|
+
labelsById;
|
|
121
|
+
currentLeafId;
|
|
122
|
+
constructor(fs, filePath, header, entries, leafId) {
|
|
123
|
+
this.fs = fs;
|
|
124
|
+
this.filePath = filePath;
|
|
125
|
+
this.metadata = headerToConversationMetadata(header, this.filePath);
|
|
126
|
+
this.entries = entries;
|
|
127
|
+
this.byId = new Map(entries.map((entry) => [entry.id, entry]));
|
|
128
|
+
this.labelsById = buildLabelsById(entries);
|
|
129
|
+
this.currentLeafId = leafId;
|
|
130
|
+
}
|
|
131
|
+
static async open(fs, filePath) {
|
|
132
|
+
const loaded = await loadJsonlStorage(fs, filePath);
|
|
133
|
+
return new JsonlConversationStorage(fs, filePath, loaded.header, loaded.entries, loaded.leafId);
|
|
134
|
+
}
|
|
135
|
+
static async create(fs, filePath, options) {
|
|
136
|
+
const header = {
|
|
137
|
+
type: "conversation",
|
|
138
|
+
version: 3,
|
|
139
|
+
id: options.conversationId,
|
|
140
|
+
timestamp: new Date().toISOString(),
|
|
141
|
+
cwd: options.cwd,
|
|
142
|
+
parentConversation: options.parentConversationPath,
|
|
143
|
+
};
|
|
144
|
+
getFileSystemResultOrThrow(await fs.writeFile(filePath, `${JSON.stringify(header)}\n`), `Failed to create conversation ${filePath}`);
|
|
145
|
+
return new JsonlConversationStorage(fs, filePath, header, [], null);
|
|
146
|
+
}
|
|
147
|
+
async getMetadata() {
|
|
148
|
+
return this.metadata;
|
|
149
|
+
}
|
|
150
|
+
async getLeafId() {
|
|
151
|
+
if (this.currentLeafId !== null && !this.byId.has(this.currentLeafId)) {
|
|
152
|
+
throw new ConversationError("invalid_conversation", `Entry ${this.currentLeafId} not found`);
|
|
153
|
+
}
|
|
154
|
+
return this.currentLeafId;
|
|
155
|
+
}
|
|
156
|
+
async setLeafId(leafId) {
|
|
157
|
+
if (leafId !== null && !this.byId.has(leafId)) {
|
|
158
|
+
throw new ConversationError("not_found", `Entry ${leafId} not found`);
|
|
159
|
+
}
|
|
160
|
+
const entry = {
|
|
161
|
+
type: "leaf",
|
|
162
|
+
id: generateEntryId(this.byId),
|
|
163
|
+
parentId: this.currentLeafId,
|
|
164
|
+
timestamp: new Date().toISOString(),
|
|
165
|
+
targetId: leafId,
|
|
166
|
+
};
|
|
167
|
+
getFileSystemResultOrThrow(await this.fs.appendFile(this.filePath, `${JSON.stringify(entry)}\n`), `Failed to append conversation leaf ${entry.id}`);
|
|
168
|
+
this.entries.push(entry);
|
|
169
|
+
this.byId.set(entry.id, entry);
|
|
170
|
+
this.currentLeafId = leafId;
|
|
171
|
+
}
|
|
172
|
+
async createEntryId() {
|
|
173
|
+
return generateEntryId(this.byId);
|
|
174
|
+
}
|
|
175
|
+
async appendEntry(entry) {
|
|
176
|
+
getFileSystemResultOrThrow(await this.fs.appendFile(this.filePath, `${JSON.stringify(entry)}\n`), `Failed to append conversation entry ${entry.id}`);
|
|
177
|
+
this.entries.push(entry);
|
|
178
|
+
this.byId.set(entry.id, entry);
|
|
179
|
+
updateLabelCache(this.labelsById, entry);
|
|
180
|
+
this.currentLeafId = leafIdAfterEntry(entry);
|
|
181
|
+
}
|
|
182
|
+
async getEntry(id) {
|
|
183
|
+
return this.byId.get(id);
|
|
184
|
+
}
|
|
185
|
+
async findEntries(type) {
|
|
186
|
+
return this.entries.filter((entry) => entry.type === type);
|
|
187
|
+
}
|
|
188
|
+
async getLabel(id) {
|
|
189
|
+
return this.labelsById.get(id);
|
|
190
|
+
}
|
|
191
|
+
async getPathToRoot(leafId) {
|
|
192
|
+
if (leafId === null)
|
|
193
|
+
return [];
|
|
194
|
+
const path = [];
|
|
195
|
+
let current = this.byId.get(leafId);
|
|
196
|
+
if (!current)
|
|
197
|
+
throw new ConversationError("not_found", `Entry ${leafId} not found`);
|
|
198
|
+
while (current) {
|
|
199
|
+
path.unshift(current);
|
|
200
|
+
if (!current.parentId)
|
|
201
|
+
break;
|
|
202
|
+
const parent = this.byId.get(current.parentId);
|
|
203
|
+
if (!parent)
|
|
204
|
+
throw new ConversationError("invalid_conversation", `Entry ${current.parentId} not found`);
|
|
205
|
+
current = parent;
|
|
206
|
+
}
|
|
207
|
+
return path;
|
|
208
|
+
}
|
|
209
|
+
async getEntries() {
|
|
210
|
+
return [...this.entries];
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=jsonl-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-storage.js","sourceRoot":"","sources":["../../../src/harness/conversation/jsonl-storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAOvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EACL,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAgB5B,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,OAAe,EACf,KAAa;IAEb,OAAO,IAAI,iBAAiB,CAC1B,sBAAsB,EACtB,mCAAmC,QAAQ,KAAK,OAAO,EAAE,EACzD,KAAK,CACN,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,QAAgB,EAChB,UAAkB,EAClB,OAAe,EACf,KAAa;IAEb,OAAO,IAAI,iBAAiB,CAC1B,eAAe,EACf,mCAAmC,QAAQ,UAAU,UAAU,IAAI,OAAO,EAAE,EAC5E,KAAK,CACN,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,QAAgB;IACrD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,mBAAmB,CACvB,QAAQ,EACR,+CAA+C,EAC/C,OAAO,CAAC,KAAK,CAAC,CACf,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnB,MAAM,mBAAmB,CACvB,QAAQ,EACR,+CAA+C,CAChD,CAAC;IACJ,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc;QAChC,MAAM,mBAAmB,CACvB,QAAQ,EACR,+CAA+C,CAChD,CAAC;IACJ,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;QACtB,MAAM,mBAAmB,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;IAC1E,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE;QAC7C,MAAM,mBAAmB,CAAC,QAAQ,EAAE,mCAAmC,CAAC,CAAC;IAC3E,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC9D,MAAM,mBAAmB,CACvB,QAAQ,EACR,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG;QAC/C,MAAM,mBAAmB,CAAC,QAAQ,EAAE,oCAAoC,CAAC,CAAC;IAC5E,IACE,MAAM,CAAC,kBAAkB,KAAK,SAAS;QACvC,OAAO,MAAM,CAAC,kBAAkB,KAAK,QAAQ,EAC7C,CAAC;QACD,MAAM,mBAAmB,CACvB,QAAQ,EACR,yDAAyD,CAC1D,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,CAAC;QACV,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;KAC9C,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,IAAY,EACZ,QAAgB,EAChB,UAAkB;IAElB,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,CAChB,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,OAAO,CAAC,KAAK,CAAC,CACf,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnB,MAAM,YAAY,CAChB,QAAQ,EACR,UAAU,EACV,mCAAmC,CACpC,CAAC;IACJ,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QACjC,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,uBAAuB,CAAC,CAAC;IACpE,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE;QAC7C,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACpE,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,sBAAsB,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC9D,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,sBAAsB,CAAC,CAAC;IACnE,CAAC;IACD,IACE,MAAM,CAAC,IAAI,KAAK,MAAM;QACtB,MAAM,CAAC,QAAQ,KAAK,IAAI;QACxB,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EACnC,CAAC;QACD,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,sBAAsB,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAA0C,CAAC;AACpD,CAAC;AAED,SAAS,4BAA4B,CACnC,MAA0B,EAC1B,IAAY;IAEZ,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI;QACJ,sBAAsB,EAAE,MAAM,CAAC,kBAAkB;KAClD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,EAAsC,EACtC,QAAgB;IAEhB,MAAM,KAAK,GAAG,0BAA0B,CACtC,MAAM,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EACjD,sCAAsC,QAAQ,EAAE,CACjD,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,IAAI,EAAE,IAAI,EAAE;QACd,OAAO,4BAA4B,CACjC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,EAC/B,QAAQ,CACT,CAAC;IACJ,MAAM,mBAAmB,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,EAAsC,EACtC,QAAgB;IAMhB,MAAM,OAAO,GAAG,0BAA0B,CACxC,MAAM,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAC/B,+BAA+B,QAAQ,EAAE,CAC1C,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,mBAAmB,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,mBAAmB,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACrD,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,OAAO,wBAAwB;IAGlB,EAAE,CAAqC;IACvC,QAAQ,CAAS;IACjB,QAAQ,CAA4B;IAC7C,OAAO,CAA0B;IACjC,IAAI,CAAqC;IACzC,UAAU,CAAsB;IAChC,aAAa,CAAgB;IAErC,YACE,EAAsC,EACtC,QAAgB,EAChB,MAA0B,EAC1B,OAAgC,EAChC,MAAqB;QAErB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,4BAA4B,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CACf,EAAsC,EACtC,QAAgB;QAEhB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO,IAAI,wBAAwB,CACjC,EAAE,EACF,QAAQ,EACR,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,MAAM,CACd,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,EAAsC,EACtC,QAAgB,EAChB,OAIC;QAED,MAAM,MAAM,GAAuB;YACjC,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,CAAC;YACV,EAAE,EAAE,OAAO,CAAC,cAAc;YAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,kBAAkB,EAAE,OAAO,CAAC,sBAAsB;SACnD,CAAC;QACF,0BAA0B,CACxB,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAC3D,iCAAiC,QAAQ,EAAE,CAC5C,CAAC;QACF,OAAO,IAAI,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,iBAAiB,CACzB,sBAAsB,EACtB,SAAS,IAAI,CAAC,aAAa,YAAY,CACxC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAqB;QACnC,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,iBAAiB,CAAC,WAAW,EAAE,SAAS,MAAM,YAAY,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,KAAK,GAAc;YACvB,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9B,QAAQ,EAAE,IAAI,CAAC,aAAa;YAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ,EAAE,MAAM;SACjB,CAAC;QACF,0BAA0B,CACxB,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EACrE,sCAAsC,KAAK,CAAC,EAAE,EAAE,CACjD,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAA4B;QAC5C,0BAA0B,CACxB,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EACrE,uCAAuC,KAAK,CAAC,EAAE,EAAE,CAClD,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/B,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,WAAW,CACf,IAAW;QAEX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CACxB,CAAC,KAAK,EAA4D,EAAE,CAClE,KAAK,CAAC,IAAI,KAAK,IAAI,CACtB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAqB;QACvC,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC/B,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YACV,MAAM,IAAI,iBAAiB,CAAC,WAAW,EAAE,SAAS,MAAM,YAAY,CAAC,CAAC;QACxE,OAAO,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,CAAC,OAAO,CAAC,QAAQ;gBAAE,MAAM;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM;gBACT,MAAM,IAAI,iBAAiB,CACzB,sBAAsB,EACtB,SAAS,OAAO,CAAC,QAAQ,YAAY,CACtC,CAAC;YACJ,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Conversation, ConversationMetadata, ConversationRepo } from "./entries.js";
|
|
2
|
+
export declare class InMemoryConversationRepo implements ConversationRepo<ConversationMetadata, {
|
|
3
|
+
id?: string;
|
|
4
|
+
}, void> {
|
|
5
|
+
private conversations;
|
|
6
|
+
create(options?: {
|
|
7
|
+
id?: string;
|
|
8
|
+
}): Promise<Conversation<ConversationMetadata>>;
|
|
9
|
+
open(metadata: ConversationMetadata): Promise<Conversation<ConversationMetadata>>;
|
|
10
|
+
list(): Promise<ConversationMetadata[]>;
|
|
11
|
+
delete(metadata: ConversationMetadata): Promise<void>;
|
|
12
|
+
fork(sourceMetadata: ConversationMetadata, options: {
|
|
13
|
+
entryId?: string;
|
|
14
|
+
position?: "before" | "at";
|
|
15
|
+
id?: string;
|
|
16
|
+
}): Promise<Conversation<ConversationMetadata>>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=memory-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-repo.d.ts","sourceRoot":"","sources":["../../../src/harness/conversation/memory-repo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAStB,qBAAa,wBACX,YAAW,gBAAgB,CAAC,oBAAoB,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,CAAC;IAExE,OAAO,CAAC,aAAa,CAAyD;IAExE,MAAM,CACV,OAAO,GAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAO,GAC5B,OAAO,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;IAWxC,IAAI,CACR,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;IAWxC,IAAI,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAQvC,MAAM,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,IAAI,CACR,cAAc,EAAE,oBAAoB,EACpC,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GACrE,OAAO,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;CAe/C"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ConversationError } from "../errors.js";
|
|
2
|
+
import { InMemoryConversationStorage } from "./memory-storage.js";
|
|
3
|
+
import { createConversationId, createTimestamp, getEntriesToFork, toConversation, } from "./repo-utils.js";
|
|
4
|
+
export class InMemoryConversationRepo {
|
|
5
|
+
conversations = new Map();
|
|
6
|
+
async create(options = {}) {
|
|
7
|
+
const metadata = {
|
|
8
|
+
id: options.id ?? createConversationId(),
|
|
9
|
+
createdAt: createTimestamp(),
|
|
10
|
+
};
|
|
11
|
+
const storage = new InMemoryConversationStorage({ metadata });
|
|
12
|
+
const conversation = toConversation(storage);
|
|
13
|
+
this.conversations.set(metadata.id, conversation);
|
|
14
|
+
return conversation;
|
|
15
|
+
}
|
|
16
|
+
async open(metadata) {
|
|
17
|
+
const conversation = this.conversations.get(metadata.id);
|
|
18
|
+
if (!conversation) {
|
|
19
|
+
throw new ConversationError("not_found", `Conversation not found: ${metadata.id}`);
|
|
20
|
+
}
|
|
21
|
+
return conversation;
|
|
22
|
+
}
|
|
23
|
+
async list() {
|
|
24
|
+
return Promise.all([...this.conversations.values()].map((conversation) => conversation.getMetadata()));
|
|
25
|
+
}
|
|
26
|
+
async delete(metadata) {
|
|
27
|
+
this.conversations.delete(metadata.id);
|
|
28
|
+
}
|
|
29
|
+
async fork(sourceMetadata, options) {
|
|
30
|
+
const source = await this.open(sourceMetadata);
|
|
31
|
+
const forkedEntries = await getEntriesToFork(source.getStorage(), options);
|
|
32
|
+
const metadata = {
|
|
33
|
+
id: options.id ?? createConversationId(),
|
|
34
|
+
createdAt: createTimestamp(),
|
|
35
|
+
};
|
|
36
|
+
const storage = new InMemoryConversationStorage({
|
|
37
|
+
metadata,
|
|
38
|
+
entries: forkedEntries,
|
|
39
|
+
});
|
|
40
|
+
const conversation = toConversation(storage);
|
|
41
|
+
this.conversations.set(metadata.id, conversation);
|
|
42
|
+
return conversation;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=memory-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-repo.js","sourceRoot":"","sources":["../../../src/harness/conversation/memory-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAMjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,MAAM,OAAO,wBAAwB;IAG3B,aAAa,GAAG,IAAI,GAAG,EAA8C,CAAC;IAE9E,KAAK,CAAC,MAAM,CACV,UAA2B,EAAE;QAE7B,MAAM,QAAQ,GAAyB;YACrC,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,oBAAoB,EAAE;YACxC,SAAS,EAAE,eAAe,EAAE;SAC7B,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,2BAA2B,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAClD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,QAA8B;QAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,iBAAiB,CACzB,WAAW,EACX,2BAA2B,QAAQ,CAAC,EAAE,EAAE,CACzC,CAAC;QACJ,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,OAAO,CAAC,GAAG,CAChB,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CACpD,YAAY,CAAC,WAAW,EAAE,CAC3B,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAA8B;QACzC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CACR,cAAoC,EACpC,OAAsE;QAEtE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAyB;YACrC,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,oBAAoB,EAAE;YACxC,SAAS,EAAE,eAAe,EAAE;SAC7B,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,2BAA2B,CAAC;YAC9C,QAAQ;YACR,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAClD,OAAO,YAAY,CAAC;IACtB,CAAC;CACF"}
|