@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.
Files changed (93) hide show
  1. package/dist/auth/__tests__/env.test.d.ts +2 -0
  2. package/dist/auth/__tests__/env.test.d.ts.map +1 -0
  3. package/dist/auth/__tests__/env.test.js +42 -0
  4. package/dist/auth/__tests__/env.test.js.map +1 -0
  5. package/dist/auth/__tests__/firefox.test.d.ts +2 -0
  6. package/dist/auth/__tests__/firefox.test.d.ts.map +1 -0
  7. package/dist/auth/__tests__/firefox.test.js +291 -0
  8. package/dist/auth/__tests__/firefox.test.js.map +1 -0
  9. package/dist/auth/env.d.ts +10 -0
  10. package/dist/auth/env.d.ts.map +1 -0
  11. package/dist/auth/env.js +46 -0
  12. package/dist/auth/env.js.map +1 -0
  13. package/dist/auth/errors.d.ts +4 -0
  14. package/dist/auth/errors.d.ts.map +1 -0
  15. package/dist/auth/errors.js +7 -0
  16. package/dist/auth/errors.js.map +1 -0
  17. package/dist/auth/firefox.d.ts +12 -0
  18. package/dist/auth/firefox.d.ts.map +1 -0
  19. package/dist/auth/firefox.js +190 -0
  20. package/dist/auth/firefox.js.map +1 -0
  21. package/dist/auth/types.d.ts +10 -0
  22. package/dist/auth/types.d.ts.map +1 -0
  23. package/dist/auth/types.js +2 -0
  24. package/dist/auth/types.js.map +1 -0
  25. package/dist/client/__tests__/client.test.d.ts +2 -0
  26. package/dist/client/__tests__/client.test.d.ts.map +1 -0
  27. package/dist/client/__tests__/client.test.js +50 -0
  28. package/dist/client/__tests__/client.test.js.map +1 -0
  29. package/dist/client/__tests__/endpoints.test.d.ts +2 -0
  30. package/dist/client/__tests__/endpoints.test.d.ts.map +1 -0
  31. package/dist/client/__tests__/endpoints.test.js +26 -0
  32. package/dist/client/__tests__/endpoints.test.js.map +1 -0
  33. package/dist/client/client.d.ts +54 -0
  34. package/dist/client/client.d.ts.map +1 -0
  35. package/dist/client/client.js +144 -0
  36. package/dist/client/client.js.map +1 -0
  37. package/dist/client/endpoints.d.ts +18 -0
  38. package/dist/client/endpoints.d.ts.map +1 -0
  39. package/dist/client/endpoints.js +25 -0
  40. package/dist/client/endpoints.js.map +1 -0
  41. package/dist/client/errors.d.ts +11 -0
  42. package/dist/client/errors.d.ts.map +1 -0
  43. package/dist/client/errors.js +22 -0
  44. package/dist/client/errors.js.map +1 -0
  45. package/dist/export/__tests__/bundle-builder.test.d.ts +2 -0
  46. package/dist/export/__tests__/bundle-builder.test.d.ts.map +1 -0
  47. package/dist/export/__tests__/bundle-builder.test.js +272 -0
  48. package/dist/export/__tests__/bundle-builder.test.js.map +1 -0
  49. package/dist/export/__tests__/conversation-formatter.test.d.ts +2 -0
  50. package/dist/export/__tests__/conversation-formatter.test.d.ts.map +1 -0
  51. package/dist/export/__tests__/conversation-formatter.test.js +99 -0
  52. package/dist/export/__tests__/conversation-formatter.test.js.map +1 -0
  53. package/dist/export/bundle-builder.d.ts +24 -0
  54. package/dist/export/bundle-builder.d.ts.map +1 -0
  55. package/dist/export/bundle-builder.js +94 -0
  56. package/dist/export/bundle-builder.js.map +1 -0
  57. package/dist/export/conversation-formatter.d.ts +23 -0
  58. package/dist/export/conversation-formatter.d.ts.map +1 -0
  59. package/dist/export/conversation-formatter.js +40 -0
  60. package/dist/export/conversation-formatter.js.map +1 -0
  61. package/dist/export/git-exporter.d.ts +12 -0
  62. package/dist/export/git-exporter.d.ts.map +1 -0
  63. package/dist/export/git-exporter.js +68 -0
  64. package/dist/export/git-exporter.js.map +1 -0
  65. package/dist/export/types.d.ts +27 -0
  66. package/dist/export/types.d.ts.map +1 -0
  67. package/dist/export/types.js +2 -0
  68. package/dist/export/types.js.map +1 -0
  69. package/dist/index.d.ts +18 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +14 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/models/__tests__/schemas.test.d.ts +2 -0
  74. package/dist/models/__tests__/schemas.test.d.ts.map +1 -0
  75. package/dist/models/__tests__/schemas.test.js +189 -0
  76. package/dist/models/__tests__/schemas.test.js.map +1 -0
  77. package/dist/models/schemas.d.ts +805 -0
  78. package/dist/models/schemas.d.ts.map +1 -0
  79. package/dist/models/schemas.js +119 -0
  80. package/dist/models/schemas.js.map +1 -0
  81. package/dist/models/types.d.ts +15 -0
  82. package/dist/models/types.d.ts.map +1 -0
  83. package/dist/models/types.js +2 -0
  84. package/dist/models/types.js.map +1 -0
  85. package/dist/tree/__tests__/message-tree.test.d.ts +2 -0
  86. package/dist/tree/__tests__/message-tree.test.d.ts.map +1 -0
  87. package/dist/tree/__tests__/message-tree.test.js +176 -0
  88. package/dist/tree/__tests__/message-tree.test.js.map +1 -0
  89. package/dist/tree/message-tree.d.ts +35 -0
  90. package/dist/tree/message-tree.d.ts.map +1 -0
  91. package/dist/tree/message-tree.js +70 -0
  92. package/dist/tree/message-tree.js.map +1 -0
  93. package/package.json +31 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/models/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;gCASf,CAAC;AAKjB,eAAO,MAAM,0BAA0B;;;;;;;;;gCAKvB,CAAC;AAEjB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;gCAMb,CAAC;AAEjB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAgBd,CAAC;AAEjB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCActB,CAAC;AAEjB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAEf,CAAC;AAEjB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAed,CAAC;AAEjB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE/B,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAYvB,CAAC;AAEjB,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIrC,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAWV,CAAC;AAEjB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;gCAMb,CAAC"}
@@ -0,0 +1,119 @@
1
+ import { z } from "zod";
2
+ export const OrganizationSchema = z
3
+ .object({
4
+ uuid: z.string(),
5
+ name: z.string(),
6
+ capabilities: z.array(z.string()).default([]),
7
+ active_flags: z.array(z.string()).default([]),
8
+ created_at: z.string(),
9
+ updated_at: z.string(),
10
+ })
11
+ .passthrough();
12
+ // ConversationSettings uses .passthrough() because field names are
13
+ // unstable codenames (bananagrams, sourdough, foccacia) that Anthropic
14
+ // changes without notice. Only stable fields are typed explicitly.
15
+ export const ConversationSettingsSchema = z
16
+ .object({
17
+ enabled_web_search: z.boolean().nullable().optional(),
18
+ enabled_mcp_tools: z.record(z.string(), z.boolean()).nullable().optional(),
19
+ })
20
+ .passthrough();
21
+ export const AttachmentSchema = z
22
+ .object({
23
+ file_name: z.string(),
24
+ file_size: z.union([z.string(), z.number()]),
25
+ file_type: z.string(),
26
+ })
27
+ .passthrough();
28
+ export const ChatMessageSchema = z
29
+ .object({
30
+ uuid: z.string(),
31
+ text: z.string(),
32
+ sender: z.enum(["human", "assistant"]),
33
+ index: z.number(),
34
+ created_at: z.string(),
35
+ updated_at: z.string(),
36
+ parent_message_uuid: z.string(),
37
+ attachments: z.array(AttachmentSchema).default([]),
38
+ files_v2: z.array(z.unknown()).default([]),
39
+ sync_sources: z.array(z.unknown()).default([]),
40
+ truncated: z.boolean().optional(),
41
+ stop_reason: z.string().optional(),
42
+ input_mode: z.string().optional(),
43
+ })
44
+ .passthrough();
45
+ export const ConversationSummarySchema = z
46
+ .object({
47
+ uuid: z.string(),
48
+ name: z.string(),
49
+ model: z.string().nullable(),
50
+ created_at: z.string(),
51
+ updated_at: z.string(),
52
+ current_leaf_message_uuid: z.string().nullable(),
53
+ settings: ConversationSettingsSchema.optional(),
54
+ is_starred: z.boolean().optional(),
55
+ is_temporary: z.boolean().optional(),
56
+ project_uuid: z.string().nullable().optional(),
57
+ summary: z.string().optional(),
58
+ })
59
+ .passthrough();
60
+ export const ConversationSchema = ConversationSummarySchema.extend({
61
+ chat_messages: z.array(ChatMessageSchema),
62
+ }).passthrough();
63
+ export const SearchChunkSchema = z
64
+ .object({
65
+ doc_uuid: z.string(),
66
+ start: z.number(),
67
+ end: z.number(),
68
+ name: z.string(),
69
+ text: z.string(),
70
+ extras: z
71
+ .object({
72
+ conversation_uuid: z.string(),
73
+ conversation_title: z.string().optional(),
74
+ doc_type: z.string().optional(),
75
+ })
76
+ .passthrough(),
77
+ })
78
+ .passthrough();
79
+ export const SearchResponseSchema = z.object({
80
+ chunks: z.array(SearchChunkSchema),
81
+ });
82
+ export const ArtifactFileMetadataSchema = z
83
+ .object({
84
+ path: z.string(),
85
+ size: z.number(),
86
+ content_type: z.string(),
87
+ created_at: z.string(),
88
+ custom_metadata: z
89
+ .object({
90
+ filename: z.string(),
91
+ })
92
+ .passthrough(),
93
+ })
94
+ .passthrough();
95
+ export const ArtifactListResponseSchema = z.object({
96
+ success: z.boolean(),
97
+ files: z.array(z.string()),
98
+ files_metadata: z.array(ArtifactFileMetadataSchema),
99
+ });
100
+ export const ProjectSchema = z
101
+ .object({
102
+ uuid: z.string(),
103
+ name: z.string(),
104
+ description: z.string().optional(),
105
+ is_private: z.boolean().optional(),
106
+ docs_count: z.number().nullable().optional(),
107
+ files_count: z.number().nullable().optional(),
108
+ created_at: z.string(),
109
+ updated_at: z.string(),
110
+ })
111
+ .passthrough();
112
+ export const ProjectDocSchema = z
113
+ .object({
114
+ uuid: z.string(),
115
+ file_name: z.string(),
116
+ content: z.string(),
117
+ })
118
+ .passthrough();
119
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/models/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { z } from "zod";
2
+ import type { OrganizationSchema, ConversationSettingsSchema, AttachmentSchema, ChatMessageSchema, ConversationSummarySchema, ConversationSchema, SearchChunkSchema, SearchResponseSchema, ArtifactFileMetadataSchema, ArtifactListResponseSchema, ProjectSchema, ProjectDocSchema } from "./schemas.js";
3
+ export type Organization = z.infer<typeof OrganizationSchema>;
4
+ export type ConversationSettings = z.infer<typeof ConversationSettingsSchema>;
5
+ export type Attachment = z.infer<typeof AttachmentSchema>;
6
+ export type ChatMessage = z.infer<typeof ChatMessageSchema>;
7
+ export type ConversationSummary = z.infer<typeof ConversationSummarySchema>;
8
+ export type Conversation = z.infer<typeof ConversationSchema>;
9
+ export type SearchChunk = z.infer<typeof SearchChunkSchema>;
10
+ export type SearchResponse = z.infer<typeof SearchResponseSchema>;
11
+ export type ArtifactFileMetadata = z.infer<typeof ArtifactFileMetadataSchema>;
12
+ export type ArtifactListResponse = z.infer<typeof ArtifactListResponseSchema>;
13
+ export type Project = z.infer<typeof ProjectSchema>;
14
+ export type ProjectDoc = z.infer<typeof ProjectDocSchema>;
15
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/models/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,kBAAkB,EAClB,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,EAC1B,aAAa,EACb,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AACpD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/models/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=message-tree.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-tree.test.d.ts","sourceRoot":"","sources":["../../../src/tree/__tests__/message-tree.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,176 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildMessageTree, findLeafMessages, getLinearBranch, } from "../message-tree.js";
3
+ /**
4
+ * Helper to create a minimal ChatMessage for testing.
5
+ * Only uuid, parent_message_uuid, index, and sender are meaningful
6
+ * for tree operations; other fields get sensible defaults.
7
+ */
8
+ function makeMessage(uuid, parentUuid, index, sender = "human") {
9
+ return {
10
+ uuid,
11
+ parent_message_uuid: parentUuid,
12
+ index,
13
+ sender,
14
+ text: `Message ${uuid}`,
15
+ created_at: "2026-01-01T00:00:00Z",
16
+ updated_at: "2026-01-01T00:00:00Z",
17
+ attachments: [],
18
+ files_v2: [],
19
+ sync_sources: [],
20
+ };
21
+ }
22
+ describe("buildMessageTree", () => {
23
+ it("builds a tree from a flat list of messages", () => {
24
+ const messages = [
25
+ makeMessage("root", "sentinel", 0, "human"),
26
+ makeMessage("a1", "root", 1, "assistant"),
27
+ makeMessage("h2", "a1", 2, "human"),
28
+ makeMessage("a3", "h2", 3, "assistant"),
29
+ ];
30
+ const tree = buildMessageTree(messages);
31
+ expect(tree.size).toBe(4);
32
+ expect(tree.get("root").children).toHaveLength(1);
33
+ expect(tree.get("root").children[0].message.uuid).toBe("a1");
34
+ expect(tree.get("a1").children[0].message.uuid).toBe("h2");
35
+ expect(tree.get("h2").children[0].message.uuid).toBe("a3");
36
+ expect(tree.get("a3").children).toHaveLength(0);
37
+ });
38
+ it("handles branching (multiple children for one parent)", () => {
39
+ const messages = [
40
+ makeMessage("root", "sentinel", 0, "human"),
41
+ makeMessage("a1", "root", 1, "assistant"),
42
+ // Branch 1: user edits their follow-up
43
+ makeMessage("h2-v1", "a1", 2, "human"),
44
+ // Branch 2: user tries a different follow-up
45
+ makeMessage("h2-v2", "a1", 3, "human"),
46
+ ];
47
+ const tree = buildMessageTree(messages);
48
+ const a1Node = tree.get("a1");
49
+ expect(a1Node.children).toHaveLength(2);
50
+ // Children sorted by index
51
+ expect(a1Node.children[0].message.uuid).toBe("h2-v1");
52
+ expect(a1Node.children[1].message.uuid).toBe("h2-v2");
53
+ });
54
+ it("returns an empty map for empty input", () => {
55
+ const tree = buildMessageTree([]);
56
+ expect(tree.size).toBe(0);
57
+ });
58
+ it("sorts children by index", () => {
59
+ const messages = [
60
+ makeMessage("root", "sentinel", 0, "human"),
61
+ // Insert out of order
62
+ makeMessage("c", "root", 5, "human"),
63
+ makeMessage("a", "root", 1, "assistant"),
64
+ makeMessage("b", "root", 3, "human"),
65
+ ];
66
+ const tree = buildMessageTree(messages);
67
+ const rootChildren = tree.get("root").children;
68
+ expect(rootChildren[0].message.uuid).toBe("a");
69
+ expect(rootChildren[1].message.uuid).toBe("b");
70
+ expect(rootChildren[2].message.uuid).toBe("c");
71
+ });
72
+ });
73
+ describe("findLeafMessages", () => {
74
+ it("finds single leaf in a linear conversation", () => {
75
+ const messages = [
76
+ makeMessage("root", "sentinel", 0, "human"),
77
+ makeMessage("a1", "root", 1, "assistant"),
78
+ makeMessage("h2", "a1", 2, "human"),
79
+ ];
80
+ const tree = buildMessageTree(messages);
81
+ const leaves = findLeafMessages(tree);
82
+ expect(leaves).toHaveLength(1);
83
+ expect(leaves[0].uuid).toBe("h2");
84
+ });
85
+ it("finds multiple leaves in a branching conversation", () => {
86
+ const messages = [
87
+ makeMessage("root", "sentinel", 0, "human"),
88
+ makeMessage("a1", "root", 1, "assistant"),
89
+ // Branch A
90
+ makeMessage("h2-a", "a1", 2, "human"),
91
+ makeMessage("a3-a", "h2-a", 3, "assistant"),
92
+ // Branch B
93
+ makeMessage("h2-b", "a1", 4, "human"),
94
+ makeMessage("a3-b", "h2-b", 5, "assistant"),
95
+ makeMessage("h4-b", "a3-b", 6, "human"),
96
+ ];
97
+ const tree = buildMessageTree(messages);
98
+ const leaves = findLeafMessages(tree);
99
+ const leafUuids = leaves.map((l) => l.uuid).sort();
100
+ expect(leaves).toHaveLength(2);
101
+ expect(leafUuids).toEqual(["a3-a", "h4-b"]);
102
+ });
103
+ it("returns all messages as leaves when none are connected", () => {
104
+ const messages = [
105
+ makeMessage("orphan-1", "missing-1", 0, "human"),
106
+ makeMessage("orphan-2", "missing-2", 1, "human"),
107
+ ];
108
+ const tree = buildMessageTree(messages);
109
+ const leaves = findLeafMessages(tree);
110
+ expect(leaves).toHaveLength(2);
111
+ });
112
+ it("returns empty array for empty tree", () => {
113
+ const tree = buildMessageTree([]);
114
+ const leaves = findLeafMessages(tree);
115
+ expect(leaves).toHaveLength(0);
116
+ });
117
+ });
118
+ describe("getLinearBranch", () => {
119
+ it("returns root-to-leaf path for a linear conversation", () => {
120
+ const messages = [
121
+ makeMessage("root", "sentinel", 0, "human"),
122
+ makeMessage("a1", "root", 1, "assistant"),
123
+ makeMessage("h2", "a1", 2, "human"),
124
+ makeMessage("a3", "h2", 3, "assistant"),
125
+ ];
126
+ const tree = buildMessageTree(messages);
127
+ const branch = getLinearBranch(tree, "a3");
128
+ expect(branch.map((m) => m.uuid)).toEqual(["root", "a1", "h2", "a3"]);
129
+ });
130
+ it("follows the correct branch in a forking conversation", () => {
131
+ const messages = [
132
+ makeMessage("root", "sentinel", 0, "human"),
133
+ makeMessage("a1", "root", 1, "assistant"),
134
+ // Branch A
135
+ makeMessage("h2-a", "a1", 2, "human"),
136
+ makeMessage("a3-a", "h2-a", 3, "assistant"),
137
+ // Branch B
138
+ makeMessage("h2-b", "a1", 4, "human"),
139
+ makeMessage("a3-b", "h2-b", 5, "assistant"),
140
+ ];
141
+ const tree = buildMessageTree(messages);
142
+ const branchA = getLinearBranch(tree, "a3-a");
143
+ expect(branchA.map((m) => m.uuid)).toEqual(["root", "a1", "h2-a", "a3-a"]);
144
+ const branchB = getLinearBranch(tree, "a3-b");
145
+ expect(branchB.map((m) => m.uuid)).toEqual(["root", "a1", "h2-b", "a3-b"]);
146
+ });
147
+ it("returns empty array for unknown uuid", () => {
148
+ const messages = [
149
+ makeMessage("root", "sentinel", 0, "human"),
150
+ ];
151
+ const tree = buildMessageTree(messages);
152
+ const branch = getLinearBranch(tree, "nonexistent");
153
+ expect(branch).toEqual([]);
154
+ });
155
+ it("returns single-element array for root message", () => {
156
+ const messages = [
157
+ makeMessage("root", "sentinel", 0, "human"),
158
+ makeMessage("a1", "root", 1, "assistant"),
159
+ ];
160
+ const tree = buildMessageTree(messages);
161
+ const branch = getLinearBranch(tree, "root");
162
+ expect(branch).toEqual([messages[0]]);
163
+ });
164
+ it("works with a mid-conversation node (not a leaf)", () => {
165
+ const messages = [
166
+ makeMessage("root", "sentinel", 0, "human"),
167
+ makeMessage("a1", "root", 1, "assistant"),
168
+ makeMessage("h2", "a1", 2, "human"),
169
+ makeMessage("a3", "h2", 3, "assistant"),
170
+ ];
171
+ const tree = buildMessageTree(messages);
172
+ const branch = getLinearBranch(tree, "a1");
173
+ expect(branch.map((m) => m.uuid)).toEqual(["root", "a1"]);
174
+ });
175
+ });
176
+ //# sourceMappingURL=message-tree.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-tree.test.js","sourceRoot":"","sources":["../../../src/tree/__tests__/message-tree.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { ChatMessage } from "../models/types.js";
2
+ /**
3
+ * A node in the message tree, wrapping a ChatMessage with child references.
4
+ */
5
+ export interface MessageTreeNode {
6
+ message: ChatMessage;
7
+ children: MessageTreeNode[];
8
+ }
9
+ /**
10
+ * Builds a tree structure from a flat array of ChatMessages.
11
+ *
12
+ * Messages are linked via `parent_message_uuid`. The root message has a
13
+ * `parent_message_uuid` that does not correspond to any other message's uuid
14
+ * (the API uses a sentinel value for the first message).
15
+ *
16
+ * @returns A Map from message uuid to its MessageTreeNode. To find root nodes,
17
+ * look for nodes whose parent_message_uuid is not a key in the map.
18
+ */
19
+ export declare function buildMessageTree(messages: ChatMessage[]): Map<string, MessageTreeNode>;
20
+ /**
21
+ * Finds all leaf messages -- messages that have no children in the tree.
22
+ * Each leaf represents the tip of a conversation branch.
23
+ */
24
+ export declare function findLeafMessages(nodeMap: Map<string, MessageTreeNode>): ChatMessage[];
25
+ /**
26
+ * Returns the linear path from the root to a specific leaf message,
27
+ * following parent_message_uuid links upward and then reversing.
28
+ *
29
+ * @param nodeMap - The tree built by buildMessageTree()
30
+ * @param leafUuid - The uuid of the target leaf message
31
+ * @returns Ordered array of ChatMessages from root to the specified leaf,
32
+ * or an empty array if the leafUuid is not found in the tree.
33
+ */
34
+ export declare function getLinearBranch(nodeMap: Map<string, MessageTreeNode>, leafUuid: string): ChatMessage[];
35
+ //# sourceMappingURL=message-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-tree.d.ts","sourceRoot":"","sources":["../../src/tree/message-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EAAE,GACtB,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAuB9B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GACpC,WAAW,EAAE,CAQf;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EACrC,QAAQ,EAAE,MAAM,GACf,WAAW,EAAE,CAmBf"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Builds a tree structure from a flat array of ChatMessages.
3
+ *
4
+ * Messages are linked via `parent_message_uuid`. The root message has a
5
+ * `parent_message_uuid` that does not correspond to any other message's uuid
6
+ * (the API uses a sentinel value for the first message).
7
+ *
8
+ * @returns A Map from message uuid to its MessageTreeNode. To find root nodes,
9
+ * look for nodes whose parent_message_uuid is not a key in the map.
10
+ */
11
+ export function buildMessageTree(messages) {
12
+ const nodeMap = new Map();
13
+ // First pass: create a node for every message
14
+ for (const message of messages) {
15
+ nodeMap.set(message.uuid, { message, children: [] });
16
+ }
17
+ // Second pass: wire up parent -> child relationships
18
+ for (const node of nodeMap.values()) {
19
+ const parentId = node.message.parent_message_uuid;
20
+ const parentNode = nodeMap.get(parentId);
21
+ if (parentNode) {
22
+ parentNode.children.push(node);
23
+ }
24
+ }
25
+ // Sort children by index for deterministic ordering
26
+ for (const node of nodeMap.values()) {
27
+ node.children.sort((a, b) => a.message.index - b.message.index);
28
+ }
29
+ return nodeMap;
30
+ }
31
+ /**
32
+ * Finds all leaf messages -- messages that have no children in the tree.
33
+ * Each leaf represents the tip of a conversation branch.
34
+ */
35
+ export function findLeafMessages(nodeMap) {
36
+ const leaves = [];
37
+ for (const node of nodeMap.values()) {
38
+ if (node.children.length === 0) {
39
+ leaves.push(node.message);
40
+ }
41
+ }
42
+ return leaves;
43
+ }
44
+ /**
45
+ * Returns the linear path from the root to a specific leaf message,
46
+ * following parent_message_uuid links upward and then reversing.
47
+ *
48
+ * @param nodeMap - The tree built by buildMessageTree()
49
+ * @param leafUuid - The uuid of the target leaf message
50
+ * @returns Ordered array of ChatMessages from root to the specified leaf,
51
+ * or an empty array if the leafUuid is not found in the tree.
52
+ */
53
+ export function getLinearBranch(nodeMap, leafUuid) {
54
+ const startNode = nodeMap.get(leafUuid);
55
+ if (!startNode) {
56
+ return [];
57
+ }
58
+ // Walk upward from the leaf to the root
59
+ const path = [];
60
+ let current = startNode;
61
+ while (current) {
62
+ path.push(current.message);
63
+ const parentId = current.message.parent_message_uuid;
64
+ current = nodeMap.get(parentId);
65
+ }
66
+ // Reverse so the result is root -> leaf order
67
+ path.reverse();
68
+ return path;
69
+ }
70
+ //# sourceMappingURL=message-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-tree.js","sourceRoot":"","sources":["../../src/tree/message-tree.ts"],"names":[],"mappings":"AAUA;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAuB;IAEvB,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,8CAA8C;IAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,qDAAqD;IACrD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAClD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAqC;IAErC,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAqC,EACrC,QAAgB;IAEhB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,wCAAwC;IACxC,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAgC,SAAS,CAAC;IAErD,OAAO,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACrD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,8CAA8C;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;IACf,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@infinite-room-labs/claudesync-core",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "import": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "development": "./src/index.ts"
10
+ }
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "dependencies": {
16
+ "better-sqlite3": "^11.0.0",
17
+ "isomorphic-git": "^1.37.4",
18
+ "zod": "^3.24.0"
19
+ },
20
+ "devDependencies": {
21
+ "@types/better-sqlite3": "^7.6.0",
22
+ "typescript": "^5.8.0",
23
+ "vitest": "^3.1.0"
24
+ },
25
+ "scripts": {
26
+ "build": "tsc -p tsconfig.json",
27
+ "test": "vitest run",
28
+ "test:watch": "vitest",
29
+ "typecheck": "tsc --noEmit"
30
+ }
31
+ }