@infinite-room-labs/claudesync-core 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/dist/auth/__tests__/env.test.d.ts +2 -0
- package/dist/auth/__tests__/env.test.d.ts.map +1 -0
- package/dist/auth/__tests__/env.test.js +42 -0
- package/dist/auth/__tests__/env.test.js.map +1 -0
- package/dist/auth/__tests__/firefox.test.d.ts +2 -0
- package/dist/auth/__tests__/firefox.test.d.ts.map +1 -0
- package/dist/auth/__tests__/firefox.test.js +291 -0
- package/dist/auth/__tests__/firefox.test.js.map +1 -0
- package/dist/auth/env.d.ts +10 -0
- package/dist/auth/env.d.ts.map +1 -0
- package/dist/auth/env.js +46 -0
- package/dist/auth/env.js.map +1 -0
- package/dist/auth/errors.d.ts +4 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +7 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/firefox.d.ts +12 -0
- package/dist/auth/firefox.d.ts.map +1 -0
- package/dist/auth/firefox.js +190 -0
- package/dist/auth/firefox.js.map +1 -0
- package/dist/auth/types.d.ts +10 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/client/__tests__/client.test.d.ts +2 -0
- package/dist/client/__tests__/client.test.d.ts.map +1 -0
- package/dist/client/__tests__/client.test.js +50 -0
- package/dist/client/__tests__/client.test.js.map +1 -0
- package/dist/client/__tests__/endpoints.test.d.ts +2 -0
- package/dist/client/__tests__/endpoints.test.d.ts.map +1 -0
- package/dist/client/__tests__/endpoints.test.js +26 -0
- package/dist/client/__tests__/endpoints.test.js.map +1 -0
- package/dist/client/client.d.ts +54 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +144 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/endpoints.d.ts +18 -0
- package/dist/client/endpoints.d.ts.map +1 -0
- package/dist/client/endpoints.js +25 -0
- package/dist/client/endpoints.js.map +1 -0
- package/dist/client/errors.d.ts +11 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +22 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/export/__tests__/bundle-builder.test.d.ts +2 -0
- package/dist/export/__tests__/bundle-builder.test.d.ts.map +1 -0
- package/dist/export/__tests__/bundle-builder.test.js +272 -0
- package/dist/export/__tests__/bundle-builder.test.js.map +1 -0
- package/dist/export/__tests__/conversation-formatter.test.d.ts +2 -0
- package/dist/export/__tests__/conversation-formatter.test.d.ts.map +1 -0
- package/dist/export/__tests__/conversation-formatter.test.js +99 -0
- package/dist/export/__tests__/conversation-formatter.test.js.map +1 -0
- package/dist/export/bundle-builder.d.ts +24 -0
- package/dist/export/bundle-builder.d.ts.map +1 -0
- package/dist/export/bundle-builder.js +94 -0
- package/dist/export/bundle-builder.js.map +1 -0
- package/dist/export/conversation-formatter.d.ts +23 -0
- package/dist/export/conversation-formatter.d.ts.map +1 -0
- package/dist/export/conversation-formatter.js +40 -0
- package/dist/export/conversation-formatter.js.map +1 -0
- package/dist/export/git-exporter.d.ts +12 -0
- package/dist/export/git-exporter.d.ts.map +1 -0
- package/dist/export/git-exporter.js +68 -0
- package/dist/export/git-exporter.js.map +1 -0
- package/dist/export/types.d.ts +27 -0
- package/dist/export/types.d.ts.map +1 -0
- package/dist/export/types.js +2 -0
- package/dist/export/types.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/models/__tests__/schemas.test.d.ts +2 -0
- package/dist/models/__tests__/schemas.test.d.ts.map +1 -0
- package/dist/models/__tests__/schemas.test.js +189 -0
- package/dist/models/__tests__/schemas.test.js.map +1 -0
- package/dist/models/schemas.d.ts +805 -0
- package/dist/models/schemas.d.ts.map +1 -0
- package/dist/models/schemas.js +119 -0
- package/dist/models/schemas.js.map +1 -0
- package/dist/models/types.d.ts +15 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +2 -0
- package/dist/models/types.js.map +1 -0
- package/dist/tree/__tests__/message-tree.test.d.ts +2 -0
- package/dist/tree/__tests__/message-tree.test.d.ts.map +1 -0
- package/dist/tree/__tests__/message-tree.test.js +176 -0
- package/dist/tree/__tests__/message-tree.test.js.map +1 -0
- package/dist/tree/message-tree.d.ts +35 -0
- package/dist/tree/message-tree.d.ts.map +1 -0
- package/dist/tree/message-tree.js +70 -0
- package/dist/tree/message-tree.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAGtB;IAFlB,YACE,OAAe,EACC,UAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,eAAe;IAE/B;IADlB,YACkB,QAAgB,EAChC,OAAgB;QAEhB,KAAK,CACH,OAAO;YACL,2BAA2B,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,EACtE,GAAG,CACJ,CAAC;QAPc,aAAQ,GAAR,QAAQ,CAAQ;QAQhC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;IAED,sCAAsC;IACtC,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-builder.test.d.ts","sourceRoot":"","sources":["../../../src/export/__tests__/bundle-builder.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { buildGitBundle } from "../bundle-builder.js";
|
|
3
|
+
/**
|
|
4
|
+
* Helper to create a minimal ChatMessage for testing.
|
|
5
|
+
*/
|
|
6
|
+
function makeMessage(uuid, parentUuid, index, sender, text = `Message ${uuid}`) {
|
|
7
|
+
return {
|
|
8
|
+
uuid,
|
|
9
|
+
parent_message_uuid: parentUuid,
|
|
10
|
+
index,
|
|
11
|
+
sender,
|
|
12
|
+
text,
|
|
13
|
+
created_at: "2026-01-15T10:30:00Z",
|
|
14
|
+
updated_at: "2026-01-15T10:30:00Z",
|
|
15
|
+
attachments: [],
|
|
16
|
+
files_v2: [],
|
|
17
|
+
sync_sources: [],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Helper to create a minimal Conversation for testing.
|
|
22
|
+
*/
|
|
23
|
+
function makeConversation(messages, leafUuid = null, name = "Test Conversation") {
|
|
24
|
+
return {
|
|
25
|
+
uuid: "conv-123",
|
|
26
|
+
name,
|
|
27
|
+
model: "claude-opus-4-6",
|
|
28
|
+
created_at: "2026-01-15T10:00:00Z",
|
|
29
|
+
updated_at: "2026-01-15T11:00:00Z",
|
|
30
|
+
current_leaf_message_uuid: leafUuid,
|
|
31
|
+
chat_messages: messages,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Helper to create an ArtifactListResponse.
|
|
36
|
+
*/
|
|
37
|
+
function makeArtifacts(files) {
|
|
38
|
+
return {
|
|
39
|
+
success: true,
|
|
40
|
+
files: files.map((f) => f.path),
|
|
41
|
+
files_metadata: files.map((f) => ({
|
|
42
|
+
path: f.path,
|
|
43
|
+
size: f.size ?? 100,
|
|
44
|
+
content_type: "text/plain",
|
|
45
|
+
created_at: "2026-01-15T10:35:00Z",
|
|
46
|
+
custom_metadata: { filename: f.filename },
|
|
47
|
+
})),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const emptyArtifacts = {
|
|
51
|
+
success: true,
|
|
52
|
+
files: [],
|
|
53
|
+
files_metadata: [],
|
|
54
|
+
};
|
|
55
|
+
describe("buildGitBundle", () => {
|
|
56
|
+
it("produces correct structure with 2 commits when conversation and artifacts exist", () => {
|
|
57
|
+
const messages = [
|
|
58
|
+
makeMessage("h1", "sentinel", 0, "human", "Hello"),
|
|
59
|
+
makeMessage("a1", "h1", 1, "assistant", "Hi there!"),
|
|
60
|
+
];
|
|
61
|
+
const conversation = makeConversation(messages, "a1");
|
|
62
|
+
const artifacts = makeArtifacts([
|
|
63
|
+
{
|
|
64
|
+
path: "/mnt/user-data/outputs/app.tsx",
|
|
65
|
+
filename: "app.tsx",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
path: "/mnt/user-data/outputs/styles.css",
|
|
69
|
+
filename: "styles.css",
|
|
70
|
+
},
|
|
71
|
+
]);
|
|
72
|
+
const contents = new Map();
|
|
73
|
+
contents.set("/mnt/user-data/outputs/app.tsx", "export default function App() {}");
|
|
74
|
+
contents.set("/mnt/user-data/outputs/styles.css", "body { margin: 0; }");
|
|
75
|
+
const bundle = buildGitBundle(conversation, artifacts, contents);
|
|
76
|
+
// Metadata
|
|
77
|
+
expect(bundle.metadata.conversationId).toBe("conv-123");
|
|
78
|
+
expect(bundle.metadata.conversationName).toBe("Test Conversation");
|
|
79
|
+
expect(bundle.metadata.model).toBe("claude-opus-4-6");
|
|
80
|
+
expect(bundle.metadata.createdAt).toBe("2026-01-15T10:00:00Z");
|
|
81
|
+
expect(bundle.metadata.exportedAt).toBeTruthy();
|
|
82
|
+
// Should have exactly 2 commits
|
|
83
|
+
expect(bundle.commits).toHaveLength(2);
|
|
84
|
+
// Commit 1: conversation + README
|
|
85
|
+
const commit1 = bundle.commits[0];
|
|
86
|
+
expect(commit1.message).toBe("Export conversation: Test Conversation");
|
|
87
|
+
expect(commit1.files).toHaveProperty("conversation.md");
|
|
88
|
+
expect(commit1.files).toHaveProperty("README.md");
|
|
89
|
+
expect(commit1.author.name).toBe("Claude");
|
|
90
|
+
expect(commit1.author.email).toBe("claude@anthropic.com");
|
|
91
|
+
// Commit 2: artifacts
|
|
92
|
+
const commit2 = bundle.commits[1];
|
|
93
|
+
expect(commit2.message).toBe("Add artifacts (2 files)");
|
|
94
|
+
expect(commit2.files).toHaveProperty("artifacts/app.tsx");
|
|
95
|
+
expect(commit2.files).toHaveProperty("artifacts/styles.css");
|
|
96
|
+
expect(commit2.files["artifacts/app.tsx"]).toBe("export default function App() {}");
|
|
97
|
+
expect(commit2.files["artifacts/styles.css"]).toBe("body { margin: 0; }");
|
|
98
|
+
});
|
|
99
|
+
it("conversation.md contains formatted messages from linear branch", () => {
|
|
100
|
+
const messages = [
|
|
101
|
+
makeMessage("h1", "sentinel", 0, "human", "Can you write a function?"),
|
|
102
|
+
makeMessage("a1", "h1", 1, "assistant", "Sure, here you go!"),
|
|
103
|
+
];
|
|
104
|
+
const conversation = makeConversation(messages, "a1");
|
|
105
|
+
const bundle = buildGitBundle(conversation, emptyArtifacts, new Map());
|
|
106
|
+
const conversationMd = bundle.commits[0].files["conversation.md"];
|
|
107
|
+
expect(conversationMd).toContain("## Human");
|
|
108
|
+
expect(conversationMd).toContain("Can you write a function?");
|
|
109
|
+
expect(conversationMd).toContain("## Assistant");
|
|
110
|
+
expect(conversationMd).toContain("Sure, here you go!");
|
|
111
|
+
});
|
|
112
|
+
it("handles conversations with no artifacts (1 commit only)", () => {
|
|
113
|
+
const messages = [
|
|
114
|
+
makeMessage("h1", "sentinel", 0, "human", "Just chatting"),
|
|
115
|
+
makeMessage("a1", "h1", 1, "assistant", "Me too!"),
|
|
116
|
+
];
|
|
117
|
+
const conversation = makeConversation(messages, "a1");
|
|
118
|
+
const bundle = buildGitBundle(conversation, emptyArtifacts, new Map());
|
|
119
|
+
expect(bundle.commits).toHaveLength(1);
|
|
120
|
+
expect(bundle.commits[0].message).toBe("Export conversation: Test Conversation");
|
|
121
|
+
expect(bundle.commits[0].files).toHaveProperty("conversation.md");
|
|
122
|
+
expect(bundle.commits[0].files).toHaveProperty("README.md");
|
|
123
|
+
});
|
|
124
|
+
it("uses path.basename for artifact filenames (security)", () => {
|
|
125
|
+
const artifacts = makeArtifacts([
|
|
126
|
+
{
|
|
127
|
+
path: "/mnt/user-data/outputs/../../etc/passwd",
|
|
128
|
+
filename: "passwd",
|
|
129
|
+
},
|
|
130
|
+
]);
|
|
131
|
+
const contents = new Map();
|
|
132
|
+
contents.set("/mnt/user-data/outputs/../../etc/passwd", "not really");
|
|
133
|
+
const messages = [
|
|
134
|
+
makeMessage("h1", "sentinel", 0, "human", "test"),
|
|
135
|
+
];
|
|
136
|
+
const conversation = makeConversation(messages, "h1");
|
|
137
|
+
const bundle = buildGitBundle(conversation, artifacts, contents);
|
|
138
|
+
// Should use basename, not the full traversal path
|
|
139
|
+
const artifactCommit = bundle.commits[1];
|
|
140
|
+
expect(artifactCommit.files).toHaveProperty("artifacts/passwd");
|
|
141
|
+
expect(artifactCommit.files).not.toHaveProperty("artifacts/../../etc/passwd");
|
|
142
|
+
});
|
|
143
|
+
it("respects custom author name and email", () => {
|
|
144
|
+
const messages = [
|
|
145
|
+
makeMessage("h1", "sentinel", 0, "human", "Hello"),
|
|
146
|
+
];
|
|
147
|
+
const conversation = makeConversation(messages, "h1");
|
|
148
|
+
const bundle = buildGitBundle(conversation, emptyArtifacts, new Map(), {
|
|
149
|
+
authorName: "Wes",
|
|
150
|
+
authorEmail: "wes@example.com",
|
|
151
|
+
});
|
|
152
|
+
expect(bundle.commits[0].author.name).toBe("Wes");
|
|
153
|
+
expect(bundle.commits[0].author.email).toBe("wes@example.com");
|
|
154
|
+
});
|
|
155
|
+
it("skips conversation commit when includeConversation is false", () => {
|
|
156
|
+
const messages = [
|
|
157
|
+
makeMessage("h1", "sentinel", 0, "human", "Hello"),
|
|
158
|
+
];
|
|
159
|
+
const conversation = makeConversation(messages, "h1");
|
|
160
|
+
const artifacts = makeArtifacts([
|
|
161
|
+
{
|
|
162
|
+
path: "/mnt/user-data/outputs/code.py",
|
|
163
|
+
filename: "code.py",
|
|
164
|
+
},
|
|
165
|
+
]);
|
|
166
|
+
const contents = new Map();
|
|
167
|
+
contents.set("/mnt/user-data/outputs/code.py", "print('hi')");
|
|
168
|
+
const bundle = buildGitBundle(conversation, artifacts, contents, {
|
|
169
|
+
includeConversation: false,
|
|
170
|
+
});
|
|
171
|
+
// Only the artifacts commit
|
|
172
|
+
expect(bundle.commits).toHaveLength(1);
|
|
173
|
+
expect(bundle.commits[0].message).toBe("Add artifacts (1 files)");
|
|
174
|
+
});
|
|
175
|
+
it("skips artifacts whose content was not downloaded", () => {
|
|
176
|
+
const messages = [
|
|
177
|
+
makeMessage("h1", "sentinel", 0, "human", "Hello"),
|
|
178
|
+
];
|
|
179
|
+
const conversation = makeConversation(messages, "h1");
|
|
180
|
+
const artifacts = makeArtifacts([
|
|
181
|
+
{
|
|
182
|
+
path: "/mnt/user-data/outputs/downloaded.ts",
|
|
183
|
+
filename: "downloaded.ts",
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
path: "/mnt/user-data/outputs/missing.ts",
|
|
187
|
+
filename: "missing.ts",
|
|
188
|
+
},
|
|
189
|
+
]);
|
|
190
|
+
// Only provide content for one of the two artifacts
|
|
191
|
+
const contents = new Map();
|
|
192
|
+
contents.set("/mnt/user-data/outputs/downloaded.ts", "const x = 1;");
|
|
193
|
+
const bundle = buildGitBundle(conversation, artifacts, contents);
|
|
194
|
+
const artifactCommit = bundle.commits[1];
|
|
195
|
+
expect(artifactCommit.message).toBe("Add artifacts (1 files)");
|
|
196
|
+
expect(artifactCommit.files).toHaveProperty("artifacts/downloaded.ts");
|
|
197
|
+
expect(artifactCommit.files).not.toHaveProperty("artifacts/missing.ts");
|
|
198
|
+
});
|
|
199
|
+
it("handles Uint8Array content for binary artifacts", () => {
|
|
200
|
+
const messages = [
|
|
201
|
+
makeMessage("h1", "sentinel", 0, "human", "Hello"),
|
|
202
|
+
];
|
|
203
|
+
const conversation = makeConversation(messages, "h1");
|
|
204
|
+
const artifacts = makeArtifacts([
|
|
205
|
+
{
|
|
206
|
+
path: "/mnt/user-data/outputs/image.png",
|
|
207
|
+
filename: "image.png",
|
|
208
|
+
},
|
|
209
|
+
]);
|
|
210
|
+
const binaryContent = new Uint8Array([0x89, 0x50, 0x4e, 0x47]);
|
|
211
|
+
const contents = new Map();
|
|
212
|
+
contents.set("/mnt/user-data/outputs/image.png", binaryContent);
|
|
213
|
+
const bundle = buildGitBundle(conversation, artifacts, contents);
|
|
214
|
+
const artifactCommit = bundle.commits[1];
|
|
215
|
+
expect(artifactCommit.files["artifacts/image.png"]).toBeInstanceOf(Uint8Array);
|
|
216
|
+
expect(artifactCommit.files["artifacts/image.png"]).toEqual(binaryContent);
|
|
217
|
+
});
|
|
218
|
+
it("follows current_leaf_message_uuid for branch selection", () => {
|
|
219
|
+
// Create a branching conversation
|
|
220
|
+
const messages = [
|
|
221
|
+
makeMessage("root", "sentinel", 0, "human", "Start"),
|
|
222
|
+
makeMessage("a1", "root", 1, "assistant", "Response"),
|
|
223
|
+
// Branch A
|
|
224
|
+
makeMessage("h2-a", "a1", 2, "human", "Branch A question"),
|
|
225
|
+
makeMessage("a3-a", "h2-a", 3, "assistant", "Branch A answer"),
|
|
226
|
+
// Branch B (current leaf)
|
|
227
|
+
makeMessage("h2-b", "a1", 4, "human", "Branch B question"),
|
|
228
|
+
makeMessage("a3-b", "h2-b", 5, "assistant", "Branch B answer"),
|
|
229
|
+
];
|
|
230
|
+
// current_leaf_message_uuid points to branch B
|
|
231
|
+
const conversation = makeConversation(messages, "a3-b");
|
|
232
|
+
const bundle = buildGitBundle(conversation, emptyArtifacts, new Map());
|
|
233
|
+
const conversationMd = bundle.commits[0].files["conversation.md"];
|
|
234
|
+
// Should contain branch B messages
|
|
235
|
+
expect(conversationMd).toContain("Branch B question");
|
|
236
|
+
expect(conversationMd).toContain("Branch B answer");
|
|
237
|
+
// Should NOT contain branch A messages
|
|
238
|
+
expect(conversationMd).not.toContain("Branch A question");
|
|
239
|
+
expect(conversationMd).not.toContain("Branch A answer");
|
|
240
|
+
});
|
|
241
|
+
it("README.md contains conversation metadata", () => {
|
|
242
|
+
const messages = [
|
|
243
|
+
makeMessage("h1", "sentinel", 0, "human", "Hello"),
|
|
244
|
+
];
|
|
245
|
+
const conversation = makeConversation(messages, "h1", "My Cool Chat");
|
|
246
|
+
const bundle = buildGitBundle(conversation, emptyArtifacts, new Map());
|
|
247
|
+
const readme = bundle.commits[0].files["README.md"];
|
|
248
|
+
expect(readme).toContain("# My Cool Chat");
|
|
249
|
+
expect(readme).toContain("conv-123");
|
|
250
|
+
expect(readme).toContain("claude-opus-4-6");
|
|
251
|
+
expect(readme).toContain("2026-01-15T10:00:00Z");
|
|
252
|
+
expect(readme).toContain("ClaudeSync");
|
|
253
|
+
});
|
|
254
|
+
it("produces no artifact commit when all artifact contents are missing", () => {
|
|
255
|
+
const messages = [
|
|
256
|
+
makeMessage("h1", "sentinel", 0, "human", "Hello"),
|
|
257
|
+
];
|
|
258
|
+
const conversation = makeConversation(messages, "h1");
|
|
259
|
+
const artifacts = makeArtifacts([
|
|
260
|
+
{
|
|
261
|
+
path: "/mnt/user-data/outputs/missing.ts",
|
|
262
|
+
filename: "missing.ts",
|
|
263
|
+
},
|
|
264
|
+
]);
|
|
265
|
+
// Empty contents map -- nothing was downloaded
|
|
266
|
+
const contents = new Map();
|
|
267
|
+
const bundle = buildGitBundle(conversation, artifacts, contents);
|
|
268
|
+
// Only the conversation commit, no artifact commit
|
|
269
|
+
expect(bundle.commits).toHaveLength(1);
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
//# sourceMappingURL=bundle-builder.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-builder.test.js","sourceRoot":"","sources":["../../../src/export/__tests__/bundle-builder.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-formatter.test.d.ts","sourceRoot":"","sources":["../../../src/export/__tests__/conversation-formatter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { formatConversation } from "../conversation-formatter.js";
|
|
3
|
+
/**
|
|
4
|
+
* Helper to create a minimal ChatMessage for testing.
|
|
5
|
+
*/
|
|
6
|
+
function makeMessage(uuid, sender, text, createdAt = "2026-01-15T10:30:00Z") {
|
|
7
|
+
return {
|
|
8
|
+
uuid,
|
|
9
|
+
parent_message_uuid: "sentinel",
|
|
10
|
+
index: 0,
|
|
11
|
+
sender,
|
|
12
|
+
text,
|
|
13
|
+
created_at: createdAt,
|
|
14
|
+
updated_at: createdAt,
|
|
15
|
+
attachments: [],
|
|
16
|
+
files_v2: [],
|
|
17
|
+
sync_sources: [],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
describe("formatConversation", () => {
|
|
21
|
+
it("formats a simple human-assistant exchange", () => {
|
|
22
|
+
const messages = [
|
|
23
|
+
makeMessage("h1", "human", "Hello, Claude!"),
|
|
24
|
+
makeMessage("a1", "assistant", "Hello! How can I help you?"),
|
|
25
|
+
];
|
|
26
|
+
const result = formatConversation(messages);
|
|
27
|
+
expect(result).toContain("## Human");
|
|
28
|
+
expect(result).toContain("## Assistant");
|
|
29
|
+
expect(result).toContain("Hello, Claude!");
|
|
30
|
+
expect(result).toContain("Hello! How can I help you?");
|
|
31
|
+
});
|
|
32
|
+
it("includes timestamps for each message", () => {
|
|
33
|
+
const messages = [
|
|
34
|
+
makeMessage("h1", "human", "Hello", "2026-01-15T10:30:00Z"),
|
|
35
|
+
makeMessage("a1", "assistant", "Hi", "2026-01-15T10:30:05Z"),
|
|
36
|
+
];
|
|
37
|
+
const result = formatConversation(messages);
|
|
38
|
+
expect(result).toContain("_2026-01-15T10:30:00Z_");
|
|
39
|
+
expect(result).toContain("_2026-01-15T10:30:05Z_");
|
|
40
|
+
});
|
|
41
|
+
it("returns empty string for empty messages array", () => {
|
|
42
|
+
const result = formatConversation([]);
|
|
43
|
+
expect(result).toBe("");
|
|
44
|
+
});
|
|
45
|
+
it("handles empty message text gracefully", () => {
|
|
46
|
+
const messages = [
|
|
47
|
+
makeMessage("h1", "human", ""),
|
|
48
|
+
makeMessage("a1", "assistant", " "),
|
|
49
|
+
];
|
|
50
|
+
const result = formatConversation(messages);
|
|
51
|
+
// Both empty messages should render the placeholder
|
|
52
|
+
expect(result).toContain("_[empty message]_");
|
|
53
|
+
// Should appear twice (one for each empty/whitespace-only message)
|
|
54
|
+
const matches = result.match(/_\[empty message\]_/g);
|
|
55
|
+
expect(matches).toHaveLength(2);
|
|
56
|
+
});
|
|
57
|
+
it("preserves message ordering", () => {
|
|
58
|
+
const messages = [
|
|
59
|
+
makeMessage("h1", "human", "First message"),
|
|
60
|
+
makeMessage("a1", "assistant", "Second message"),
|
|
61
|
+
makeMessage("h2", "human", "Third message"),
|
|
62
|
+
];
|
|
63
|
+
const result = formatConversation(messages);
|
|
64
|
+
const firstIdx = result.indexOf("First message");
|
|
65
|
+
const secondIdx = result.indexOf("Second message");
|
|
66
|
+
const thirdIdx = result.indexOf("Third message");
|
|
67
|
+
expect(firstIdx).toBeLessThan(secondIdx);
|
|
68
|
+
expect(secondIdx).toBeLessThan(thirdIdx);
|
|
69
|
+
});
|
|
70
|
+
it("formats a single message", () => {
|
|
71
|
+
const messages = [
|
|
72
|
+
makeMessage("h1", "human", "Just one message"),
|
|
73
|
+
];
|
|
74
|
+
const result = formatConversation(messages);
|
|
75
|
+
expect(result).toContain("## Human");
|
|
76
|
+
expect(result).toContain("Just one message");
|
|
77
|
+
expect(result).not.toContain("## Assistant");
|
|
78
|
+
});
|
|
79
|
+
it("trims whitespace from message text", () => {
|
|
80
|
+
const messages = [
|
|
81
|
+
makeMessage("h1", "human", " padded text \n\n"),
|
|
82
|
+
];
|
|
83
|
+
const result = formatConversation(messages);
|
|
84
|
+
expect(result).toContain("padded text");
|
|
85
|
+
// The trimmed text should not have leading/trailing whitespace
|
|
86
|
+
const lines = result.split("\n");
|
|
87
|
+
const textLine = lines.find((l) => l.includes("padded text"));
|
|
88
|
+
expect(textLine).toBe("padded text");
|
|
89
|
+
});
|
|
90
|
+
it("handles multi-line message text", () => {
|
|
91
|
+
const messages = [
|
|
92
|
+
makeMessage("a1", "assistant", "Here is some code:\n```typescript\nconst x = 1;\n```\nDone!"),
|
|
93
|
+
];
|
|
94
|
+
const result = formatConversation(messages);
|
|
95
|
+
expect(result).toContain("```typescript");
|
|
96
|
+
expect(result).toContain("const x = 1;");
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=conversation-formatter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-formatter.test.js","sourceRoot":"","sources":["../../../src/export/__tests__/conversation-formatter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Conversation, ArtifactListResponse } from "../models/types.js";
|
|
2
|
+
import type { GitBundle } from "./types.js";
|
|
3
|
+
export interface BuildGitBundleOptions {
|
|
4
|
+
/** Git author name. Default: "Claude" */
|
|
5
|
+
authorName?: string;
|
|
6
|
+
/** Git author email. Default: "claude@anthropic.com" */
|
|
7
|
+
authorEmail?: string;
|
|
8
|
+
/** Include conversation.md and README.md in the first commit. Default: true */
|
|
9
|
+
includeConversation?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Builds a GitBundle from conversation data and downloaded artifact content.
|
|
13
|
+
*
|
|
14
|
+
* The bundle contains 1 or 2 commits:
|
|
15
|
+
* - Commit 1 (if includeConversation is true): conversation.md + README.md
|
|
16
|
+
* - Commit 2 (if artifacts exist): all artifact files under artifacts/
|
|
17
|
+
*
|
|
18
|
+
* @param conversation - Full conversation with chat_messages
|
|
19
|
+
* @param artifacts - Artifact list response from the wiggle API
|
|
20
|
+
* @param artifactContents - Map of artifact path -> downloaded content
|
|
21
|
+
* @param options - Optional overrides for author name/email and conversation inclusion
|
|
22
|
+
*/
|
|
23
|
+
export declare function buildGitBundle(conversation: Conversation, artifacts: ArtifactListResponse, artifactContents: Map<string, string | Uint8Array>, options?: BuildGitBundleOptions): GitBundle;
|
|
24
|
+
//# sourceMappingURL=bundle-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-builder.d.ts","sourceRoot":"","sources":["../../src/export/bundle-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAC;AAK7D,MAAM,WAAW,qBAAqB;IACpC,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,oBAAoB,EAC/B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,EAClD,OAAO,CAAC,EAAE,qBAAqB,GAC9B,SAAS,CAkEX"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { buildMessageTree, getLinearBranch } from "../tree/message-tree.js";
|
|
2
|
+
import { formatConversation } from "./conversation-formatter.js";
|
|
3
|
+
import { ClaudeSyncClient } from "../client/client.js";
|
|
4
|
+
/**
|
|
5
|
+
* Builds a GitBundle from conversation data and downloaded artifact content.
|
|
6
|
+
*
|
|
7
|
+
* The bundle contains 1 or 2 commits:
|
|
8
|
+
* - Commit 1 (if includeConversation is true): conversation.md + README.md
|
|
9
|
+
* - Commit 2 (if artifacts exist): all artifact files under artifacts/
|
|
10
|
+
*
|
|
11
|
+
* @param conversation - Full conversation with chat_messages
|
|
12
|
+
* @param artifacts - Artifact list response from the wiggle API
|
|
13
|
+
* @param artifactContents - Map of artifact path -> downloaded content
|
|
14
|
+
* @param options - Optional overrides for author name/email and conversation inclusion
|
|
15
|
+
*/
|
|
16
|
+
export function buildGitBundle(conversation, artifacts, artifactContents, options) {
|
|
17
|
+
const authorName = options?.authorName ?? "Claude";
|
|
18
|
+
const authorEmail = options?.authorEmail ?? "claude@anthropic.com";
|
|
19
|
+
const includeConversation = options?.includeConversation ?? true;
|
|
20
|
+
const author = { name: authorName, email: authorEmail };
|
|
21
|
+
const commits = [];
|
|
22
|
+
// Commit 1: conversation text + metadata README
|
|
23
|
+
if (includeConversation) {
|
|
24
|
+
const nodeMap = buildMessageTree(conversation.chat_messages);
|
|
25
|
+
const leafUuid = conversation.current_leaf_message_uuid;
|
|
26
|
+
const linearMessages = leafUuid
|
|
27
|
+
? getLinearBranch(nodeMap, leafUuid)
|
|
28
|
+
: conversation.chat_messages;
|
|
29
|
+
const conversationMd = formatConversation(linearMessages);
|
|
30
|
+
const readmeMd = buildReadme(conversation);
|
|
31
|
+
const files = {
|
|
32
|
+
"conversation.md": conversationMd,
|
|
33
|
+
"README.md": readmeMd,
|
|
34
|
+
};
|
|
35
|
+
commits.push({
|
|
36
|
+
message: `Export conversation: ${conversation.name}`,
|
|
37
|
+
timestamp: conversation.created_at,
|
|
38
|
+
author,
|
|
39
|
+
files,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Commit 2: artifact files (only if there are artifacts)
|
|
43
|
+
if (artifacts.files_metadata.length > 0) {
|
|
44
|
+
const artifactFiles = {};
|
|
45
|
+
for (const meta of artifacts.files_metadata) {
|
|
46
|
+
const filename = ClaudeSyncClient.safeFilename(meta.path);
|
|
47
|
+
const content = artifactContents.get(meta.path);
|
|
48
|
+
if (content !== undefined) {
|
|
49
|
+
artifactFiles[`artifacts/${filename}`] = content;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (Object.keys(artifactFiles).length > 0) {
|
|
53
|
+
const count = Object.keys(artifactFiles).length;
|
|
54
|
+
commits.push({
|
|
55
|
+
message: `Add artifacts (${count} files)`,
|
|
56
|
+
timestamp: artifacts.files_metadata[0].created_at,
|
|
57
|
+
author,
|
|
58
|
+
files: artifactFiles,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
metadata: {
|
|
64
|
+
conversationId: conversation.uuid,
|
|
65
|
+
conversationName: conversation.name,
|
|
66
|
+
model: conversation.model,
|
|
67
|
+
createdAt: conversation.created_at,
|
|
68
|
+
exportedAt: new Date().toISOString(),
|
|
69
|
+
},
|
|
70
|
+
commits,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Builds a README.md with conversation metadata.
|
|
75
|
+
*/
|
|
76
|
+
function buildReadme(conversation) {
|
|
77
|
+
const lines = [];
|
|
78
|
+
lines.push(`# ${conversation.name}`);
|
|
79
|
+
lines.push("");
|
|
80
|
+
lines.push(`- **Conversation ID:** ${conversation.uuid}`);
|
|
81
|
+
lines.push(`- **Model:** ${conversation.model ?? "unknown"}`);
|
|
82
|
+
lines.push(`- **Created:** ${conversation.created_at}`);
|
|
83
|
+
lines.push(`- **Updated:** ${conversation.updated_at}`);
|
|
84
|
+
if (conversation.is_starred) {
|
|
85
|
+
lines.push(`- **Starred:** yes`);
|
|
86
|
+
}
|
|
87
|
+
lines.push("");
|
|
88
|
+
lines.push("---");
|
|
89
|
+
lines.push("");
|
|
90
|
+
lines.push("Exported by [ClaudeSync](https://github.com/infiniteroomlabs/claudesync)");
|
|
91
|
+
lines.push("");
|
|
92
|
+
return lines.join("\n");
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=bundle-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-builder.js","sourceRoot":"","sources":["../../src/export/bundle-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ChatMessage } from "../models/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Formats a linear branch of ChatMessages as a readable markdown document.
|
|
4
|
+
*
|
|
5
|
+
* Output format:
|
|
6
|
+
* ```
|
|
7
|
+
* ## Human
|
|
8
|
+
* _2026-01-15T10:30:00Z_
|
|
9
|
+
*
|
|
10
|
+
* Hello, can you help me with...
|
|
11
|
+
*
|
|
12
|
+
* ## Assistant
|
|
13
|
+
* _2026-01-15T10:30:05Z_
|
|
14
|
+
*
|
|
15
|
+
* Of course! Here's how...
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @param messages - Ordered array of ChatMessages (root to leaf), typically
|
|
19
|
+
* from getLinearBranch().
|
|
20
|
+
* @returns Formatted markdown string.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatConversation(messages: ChatMessage[]): string;
|
|
23
|
+
//# sourceMappingURL=conversation-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-formatter.d.ts","sourceRoot":"","sources":["../../src/export/conversation-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAuBlE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formats a linear branch of ChatMessages as a readable markdown document.
|
|
3
|
+
*
|
|
4
|
+
* Output format:
|
|
5
|
+
* ```
|
|
6
|
+
* ## Human
|
|
7
|
+
* _2026-01-15T10:30:00Z_
|
|
8
|
+
*
|
|
9
|
+
* Hello, can you help me with...
|
|
10
|
+
*
|
|
11
|
+
* ## Assistant
|
|
12
|
+
* _2026-01-15T10:30:05Z_
|
|
13
|
+
*
|
|
14
|
+
* Of course! Here's how...
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @param messages - Ordered array of ChatMessages (root to leaf), typically
|
|
18
|
+
* from getLinearBranch().
|
|
19
|
+
* @returns Formatted markdown string.
|
|
20
|
+
*/
|
|
21
|
+
export function formatConversation(messages) {
|
|
22
|
+
if (messages.length === 0) {
|
|
23
|
+
return "";
|
|
24
|
+
}
|
|
25
|
+
const sections = [];
|
|
26
|
+
for (const msg of messages) {
|
|
27
|
+
const role = msg.sender === "human" ? "Human" : "Assistant";
|
|
28
|
+
const timestamp = msg.created_at;
|
|
29
|
+
const text = msg.text.trim();
|
|
30
|
+
const lines = [];
|
|
31
|
+
lines.push(`## ${role}`);
|
|
32
|
+
lines.push(`_${timestamp}_`);
|
|
33
|
+
lines.push("");
|
|
34
|
+
lines.push(text || "_[empty message]_");
|
|
35
|
+
lines.push("");
|
|
36
|
+
sections.push(lines.join("\n"));
|
|
37
|
+
}
|
|
38
|
+
return sections.join("\n");
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=conversation-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-formatter.js","sourceRoot":"","sources":["../../src/export/conversation-formatter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAuB;IACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;QAC5D,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAE7B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,mBAAmB,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GitBundle } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a real git repository from a GitBundle.
|
|
4
|
+
*
|
|
5
|
+
* Uses a staging approach: writes to `{outputPath}.tmp`, then renames on
|
|
6
|
+
* success. On failure, cleans up the `.tmp` directory.
|
|
7
|
+
*
|
|
8
|
+
* @param bundle - The GitBundle describing commits to create
|
|
9
|
+
* @param outputPath - Absolute path for the output git repository
|
|
10
|
+
*/
|
|
11
|
+
export declare function exportToGit(bundle: GitBundle, outputPath: string): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=git-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-exporter.d.ts","sourceRoot":"","sources":["../../src/export/git-exporter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA+Df"}
|