psadk 1.4.8 → 1.5.1

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 (211) hide show
  1. package/build/main/index.d.ts +1 -0
  2. package/build/main/lib/PSAI.js +1 -2
  3. package/build/main/lib/PSAgent.d.ts +46 -44
  4. package/build/main/lib/PSAgent.js +176 -961
  5. package/build/main/lib/PSAgentConfig.d.ts +110 -26
  6. package/build/main/lib/PSAgentLogger.js +1 -2
  7. package/build/main/lib/PSAgentTool.d.ts +8 -3
  8. package/build/main/lib/PSAgentTool.js +3 -3
  9. package/build/main/lib/agent-core/{agent-loop.d.ts → src/agent-loop.d.ts} +1 -1
  10. package/build/main/lib/agent-core/src/agent-loop.js +514 -0
  11. package/build/{module/lib/agent-core → main/lib/agent-core/src}/agent.d.ts +2 -2
  12. package/build/main/lib/agent-core/src/agent.js +419 -0
  13. package/build/main/lib/agent-core/{harness → src/harness}/agent-harness.d.ts +36 -26
  14. package/build/main/lib/agent-core/src/harness/agent-harness.js +1028 -0
  15. package/build/main/lib/agent-core/src/harness/compaction/branch-summarization.d.ts +52 -0
  16. package/build/main/lib/agent-core/src/harness/compaction/branch-summarization.js +182 -0
  17. package/build/main/lib/agent-core/src/harness/compaction/compaction.d.ts +94 -0
  18. package/build/main/lib/agent-core/src/harness/compaction/compaction.js +550 -0
  19. package/build/main/lib/agent-core/src/harness/compaction/utils.d.ts +24 -0
  20. package/build/main/lib/agent-core/src/harness/compaction/utils.js +131 -0
  21. package/build/main/lib/agent-core/src/harness/env/nodejs.d.ts +50 -0
  22. package/build/main/lib/agent-core/src/harness/env/nodejs.js +494 -0
  23. package/build/main/lib/agent-core/{harness → src/harness}/messages.d.ts +2 -2
  24. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/messages.js +1 -1
  25. package/build/main/lib/agent-core/{harness → src/harness}/prompt-templates.d.ts +4 -1
  26. package/build/main/lib/agent-core/src/harness/prompt-templates.js +235 -0
  27. package/build/{module/lib/agent-core/harness/session/repo/jsonl.d.ts → main/lib/agent-core/src/harness/session/jsonl-repo.d.ts} +7 -1
  28. package/build/main/lib/agent-core/src/harness/session/jsonl-repo.js +106 -0
  29. package/build/{module/lib/agent-core/harness/session/storage/jsonl.d.ts → main/lib/agent-core/src/harness/session/jsonl-storage.d.ts} +7 -4
  30. package/build/main/lib/agent-core/src/harness/session/jsonl-storage.js +234 -0
  31. package/build/main/lib/agent-core/{harness/session/repo/memory.d.ts → src/harness/session/memory-repo.d.ts} +1 -1
  32. package/build/main/lib/agent-core/src/harness/session/memory-repo.js +45 -0
  33. package/build/main/lib/agent-core/{harness/session/storage/memory.d.ts → src/harness/session/memory-storage.d.ts} +4 -5
  34. package/build/main/lib/agent-core/src/harness/session/memory-storage.js +116 -0
  35. package/build/main/lib/agent-core/{harness/session/repo/shared.d.ts → src/harness/session/repo-utils.d.ts} +3 -2
  36. package/build/main/lib/agent-core/src/harness/session/repo-utils.js +39 -0
  37. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/session/session.d.ts +3 -2
  38. package/build/main/lib/agent-core/src/harness/session/session.js +213 -0
  39. package/build/main/lib/agent-core/src/harness/session/uuid.d.ts +1 -0
  40. package/build/main/lib/agent-core/src/harness/session/uuid.js +54 -0
  41. package/build/main/lib/agent-core/{harness → src/harness}/skills.d.ts +4 -1
  42. package/build/main/lib/agent-core/src/harness/skills.js +353 -0
  43. package/build/main/lib/agent-core/{harness → src/harness}/system-prompt.d.ts +1 -1
  44. package/build/main/lib/agent-core/src/harness/system-prompt.js +30 -0
  45. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/types.d.ts +160 -70
  46. package/build/main/lib/agent-core/src/harness/types.js +94 -0
  47. package/build/main/lib/agent-core/{harness → src/harness}/utils/shell-output.d.ts +2 -2
  48. package/build/main/lib/agent-core/src/harness/utils/shell-output.js +134 -0
  49. package/build/main/lib/agent-core/src/harness/utils/truncate.js +294 -0
  50. package/build/main/lib/agent-core/src/index.d.ts +19 -0
  51. package/build/main/lib/agent-core/src/index.js +25 -0
  52. package/build/main/lib/agent-core/src/node.d.ts +2 -0
  53. package/build/main/lib/agent-core/src/node.js +3 -0
  54. package/build/main/lib/agent-core/{proxy.js → src/proxy.js} +3 -2
  55. package/build/{module/lib/agent-core → main/lib/agent-core/src}/types.d.ts +13 -1
  56. package/build/{module/lib/agent-core → main/lib/agent-core/src}/types.js +1 -1
  57. package/build/main/lib/localAgent.d.ts +35 -0
  58. package/build/main/lib/localAgent.js +329 -0
  59. package/build/main/lib/remoteAgent.d.ts +25 -0
  60. package/build/main/lib/remoteAgent.js +311 -0
  61. package/build/main/lib/skills/skillParser.d.ts +13 -3
  62. package/build/main/lib/skills/skillParser.js +61 -12
  63. package/build/main/lib/skills/utils.js +18 -10
  64. package/build/main/lib/tools/BraveWebSearchTool.js +1 -2
  65. package/build/main/lib/tools/PSArtifactTool.js +1 -2
  66. package/build/main/lib/tools/PSClarifyTool.js +1 -2
  67. package/build/main/lib/tools/PSCommandLineTool.js +1 -2
  68. package/build/main/lib/tools/PSMemoryTool.js +1 -2
  69. package/build/main/lib/tools/PSReadFileTool.js +1 -2
  70. package/build/main/lib/tools/PSRetrievalTool.js +1 -2
  71. package/build/main/lib/tools/PSSkillTool.js +1 -2
  72. package/build/main/lib/tools/PSSubAgentTool.js +1 -1
  73. package/build/main/lib/tools/PSWriteFileTool.js +1 -2
  74. package/build/main/lib/tools/TodoTool.js +1 -2
  75. package/build/main/lib/utils/debuglogger.js +1 -2
  76. package/build/main/lib/utils/helpers.js +1 -6
  77. package/build/module/index.d.ts +1 -0
  78. package/build/module/lib/PSAI.js +1 -2
  79. package/build/module/lib/PSAgent.d.ts +46 -44
  80. package/build/module/lib/PSAgent.js +176 -961
  81. package/build/module/lib/PSAgentConfig.d.ts +110 -26
  82. package/build/module/lib/PSAgentLogger.js +1 -2
  83. package/build/module/lib/PSAgentTool.d.ts +8 -3
  84. package/build/module/lib/PSAgentTool.js +3 -3
  85. package/build/module/lib/agent-core/{agent-loop.d.ts → src/agent-loop.d.ts} +1 -1
  86. package/build/module/lib/agent-core/src/agent-loop.js +514 -0
  87. package/build/{main/lib/agent-core → module/lib/agent-core/src}/agent.d.ts +2 -2
  88. package/build/module/lib/agent-core/src/agent.js +419 -0
  89. package/build/module/lib/agent-core/{harness → src/harness}/agent-harness.d.ts +36 -26
  90. package/build/module/lib/agent-core/src/harness/agent-harness.js +1028 -0
  91. package/build/module/lib/agent-core/src/harness/compaction/branch-summarization.d.ts +52 -0
  92. package/build/module/lib/agent-core/src/harness/compaction/branch-summarization.js +182 -0
  93. package/build/module/lib/agent-core/src/harness/compaction/compaction.d.ts +94 -0
  94. package/build/module/lib/agent-core/src/harness/compaction/compaction.js +550 -0
  95. package/build/module/lib/agent-core/src/harness/compaction/utils.d.ts +24 -0
  96. package/build/module/lib/agent-core/src/harness/compaction/utils.js +131 -0
  97. package/build/module/lib/agent-core/src/harness/env/nodejs.d.ts +50 -0
  98. package/build/module/lib/agent-core/src/harness/env/nodejs.js +494 -0
  99. package/build/module/lib/agent-core/{harness → src/harness}/messages.d.ts +2 -2
  100. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/messages.js +1 -1
  101. package/build/module/lib/agent-core/{harness → src/harness}/prompt-templates.d.ts +4 -1
  102. package/build/module/lib/agent-core/src/harness/prompt-templates.js +235 -0
  103. package/build/{main/lib/agent-core/harness/session/repo/jsonl.d.ts → module/lib/agent-core/src/harness/session/jsonl-repo.d.ts} +7 -1
  104. package/build/module/lib/agent-core/src/harness/session/jsonl-repo.js +106 -0
  105. package/build/{main/lib/agent-core/harness/session/storage/jsonl.d.ts → module/lib/agent-core/src/harness/session/jsonl-storage.d.ts} +7 -4
  106. package/build/module/lib/agent-core/src/harness/session/jsonl-storage.js +234 -0
  107. package/build/module/lib/agent-core/{harness/session/repo/memory.d.ts → src/harness/session/memory-repo.d.ts} +1 -1
  108. package/build/module/lib/agent-core/src/harness/session/memory-repo.js +45 -0
  109. package/build/module/lib/agent-core/{harness/session/storage/memory.d.ts → src/harness/session/memory-storage.d.ts} +4 -5
  110. package/build/module/lib/agent-core/src/harness/session/memory-storage.js +116 -0
  111. package/build/module/lib/agent-core/{harness/session/repo/shared.d.ts → src/harness/session/repo-utils.d.ts} +3 -2
  112. package/build/module/lib/agent-core/src/harness/session/repo-utils.js +39 -0
  113. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/session/session.d.ts +3 -2
  114. package/build/module/lib/agent-core/src/harness/session/session.js +213 -0
  115. package/build/module/lib/agent-core/src/harness/session/uuid.d.ts +1 -0
  116. package/build/module/lib/agent-core/src/harness/session/uuid.js +54 -0
  117. package/build/module/lib/agent-core/{harness → src/harness}/skills.d.ts +4 -1
  118. package/build/module/lib/agent-core/src/harness/skills.js +353 -0
  119. package/build/module/lib/agent-core/{harness → src/harness}/system-prompt.d.ts +1 -1
  120. package/build/module/lib/agent-core/src/harness/system-prompt.js +30 -0
  121. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/types.d.ts +160 -70
  122. package/build/module/lib/agent-core/src/harness/types.js +94 -0
  123. package/build/module/lib/agent-core/{harness → src/harness}/utils/shell-output.d.ts +2 -2
  124. package/build/module/lib/agent-core/src/harness/utils/shell-output.js +134 -0
  125. package/build/module/lib/agent-core/src/harness/utils/truncate.js +294 -0
  126. package/build/module/lib/agent-core/src/index.d.ts +19 -0
  127. package/build/module/lib/agent-core/src/index.js +25 -0
  128. package/build/module/lib/agent-core/src/node.d.ts +2 -0
  129. package/build/module/lib/agent-core/src/node.js +3 -0
  130. package/build/module/lib/agent-core/{proxy.js → src/proxy.js} +3 -2
  131. package/build/{main/lib/agent-core → module/lib/agent-core/src}/types.d.ts +13 -1
  132. package/build/{main/lib/agent-core → module/lib/agent-core/src}/types.js +1 -1
  133. package/build/module/lib/localAgent.d.ts +35 -0
  134. package/build/module/lib/localAgent.js +329 -0
  135. package/build/module/lib/remoteAgent.d.ts +25 -0
  136. package/build/module/lib/remoteAgent.js +311 -0
  137. package/build/module/lib/skills/skillParser.d.ts +13 -3
  138. package/build/module/lib/skills/skillParser.js +61 -12
  139. package/build/module/lib/skills/utils.js +18 -10
  140. package/build/module/lib/tools/BraveWebSearchTool.js +1 -2
  141. package/build/module/lib/tools/PSArtifactTool.js +1 -2
  142. package/build/module/lib/tools/PSClarifyTool.js +1 -2
  143. package/build/module/lib/tools/PSCommandLineTool.js +1 -2
  144. package/build/module/lib/tools/PSMemoryTool.js +1 -2
  145. package/build/module/lib/tools/PSReadFileTool.js +1 -2
  146. package/build/module/lib/tools/PSRetrievalTool.js +1 -2
  147. package/build/module/lib/tools/PSSkillTool.js +1 -2
  148. package/build/module/lib/tools/PSSubAgentTool.js +1 -1
  149. package/build/module/lib/tools/PSWriteFileTool.js +1 -2
  150. package/build/module/lib/tools/TodoTool.js +1 -2
  151. package/build/module/lib/utils/debuglogger.js +1 -2
  152. package/build/module/lib/utils/helpers.js +1 -6
  153. package/package.json +2 -1
  154. package/build/main/lib/agent-core/agent-loop.js +0 -483
  155. package/build/main/lib/agent-core/agent.js +0 -419
  156. package/build/main/lib/agent-core/harness/agent-harness.js +0 -772
  157. package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +0 -87
  158. package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +0 -246
  159. package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +0 -121
  160. package/build/main/lib/agent-core/harness/compaction/compaction.js +0 -637
  161. package/build/main/lib/agent-core/harness/compaction/utils.d.ts +0 -37
  162. package/build/main/lib/agent-core/harness/compaction/utils.js +0 -153
  163. package/build/main/lib/agent-core/harness/env/nodejs.d.ts +0 -43
  164. package/build/main/lib/agent-core/harness/env/nodejs.js +0 -353
  165. package/build/main/lib/agent-core/harness/execution-env.d.ts +0 -3
  166. package/build/main/lib/agent-core/harness/execution-env.js +0 -3
  167. package/build/main/lib/agent-core/harness/prompt-templates.js +0 -204
  168. package/build/main/lib/agent-core/harness/session/repo/jsonl.js +0 -98
  169. package/build/main/lib/agent-core/harness/session/repo/memory.js +0 -46
  170. package/build/main/lib/agent-core/harness/session/repo/shared.js +0 -31
  171. package/build/main/lib/agent-core/harness/session/session.js +0 -199
  172. package/build/main/lib/agent-core/harness/session/storage/jsonl.js +0 -170
  173. package/build/main/lib/agent-core/harness/session/storage/memory.js +0 -94
  174. package/build/main/lib/agent-core/harness/skills.js +0 -266
  175. package/build/main/lib/agent-core/harness/system-prompt.js +0 -30
  176. package/build/main/lib/agent-core/harness/types.js +0 -16
  177. package/build/main/lib/agent-core/harness/utils/shell-output.js +0 -101
  178. package/build/main/lib/agent-core/harness/utils/truncate.js +0 -208
  179. package/build/main/lib/agent-core/index.d.ts +0 -19
  180. package/build/main/lib/agent-core/index.js +0 -25
  181. package/build/module/lib/agent-core/agent-loop.js +0 -483
  182. package/build/module/lib/agent-core/agent.js +0 -419
  183. package/build/module/lib/agent-core/harness/agent-harness.js +0 -772
  184. package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +0 -87
  185. package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +0 -246
  186. package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +0 -121
  187. package/build/module/lib/agent-core/harness/compaction/compaction.js +0 -637
  188. package/build/module/lib/agent-core/harness/compaction/utils.d.ts +0 -37
  189. package/build/module/lib/agent-core/harness/compaction/utils.js +0 -153
  190. package/build/module/lib/agent-core/harness/env/nodejs.d.ts +0 -43
  191. package/build/module/lib/agent-core/harness/env/nodejs.js +0 -353
  192. package/build/module/lib/agent-core/harness/execution-env.d.ts +0 -3
  193. package/build/module/lib/agent-core/harness/execution-env.js +0 -3
  194. package/build/module/lib/agent-core/harness/prompt-templates.js +0 -204
  195. package/build/module/lib/agent-core/harness/session/repo/jsonl.js +0 -98
  196. package/build/module/lib/agent-core/harness/session/repo/memory.js +0 -46
  197. package/build/module/lib/agent-core/harness/session/repo/shared.js +0 -31
  198. package/build/module/lib/agent-core/harness/session/session.js +0 -199
  199. package/build/module/lib/agent-core/harness/session/storage/jsonl.js +0 -170
  200. package/build/module/lib/agent-core/harness/session/storage/memory.js +0 -94
  201. package/build/module/lib/agent-core/harness/skills.js +0 -266
  202. package/build/module/lib/agent-core/harness/system-prompt.js +0 -30
  203. package/build/module/lib/agent-core/harness/types.js +0 -16
  204. package/build/module/lib/agent-core/harness/utils/shell-output.js +0 -101
  205. package/build/module/lib/agent-core/harness/utils/truncate.js +0 -208
  206. package/build/module/lib/agent-core/index.d.ts +0 -19
  207. package/build/module/lib/agent-core/index.js +0 -25
  208. /package/build/main/lib/agent-core/{harness → src/harness}/utils/truncate.d.ts +0 -0
  209. /package/build/main/lib/agent-core/{proxy.d.ts → src/proxy.d.ts} +0 -0
  210. /package/build/module/lib/agent-core/{harness → src/harness}/utils/truncate.d.ts +0 -0
  211. /package/build/module/lib/agent-core/{proxy.d.ts → src/proxy.d.ts} +0 -0
@@ -0,0 +1,234 @@
1
+ import { SessionError, toError } from "../types.js";
2
+ import { getFileSystemResultOrThrow } from "./repo-utils.js";
3
+ import { uuidv7 } from "./uuid.js";
4
+ function updateLabelCache(labelsById, entry) {
5
+ if (entry.type !== 'label')
6
+ return;
7
+ const label = entry.label?.trim();
8
+ if (label) {
9
+ labelsById.set(entry.targetId, label);
10
+ }
11
+ else {
12
+ labelsById.delete(entry.targetId);
13
+ }
14
+ }
15
+ function buildLabelsById(entries) {
16
+ const labelsById = new Map();
17
+ for (const entry of entries) {
18
+ updateLabelCache(labelsById, entry);
19
+ }
20
+ return labelsById;
21
+ }
22
+ function generateEntryId(byId) {
23
+ for (let i = 0; i < 100; i++) {
24
+ const id = uuidv7().slice(0, 8);
25
+ if (!byId.has(id))
26
+ return id;
27
+ }
28
+ return uuidv7();
29
+ }
30
+ function isRecord(value) {
31
+ return typeof value === 'object' && value !== null;
32
+ }
33
+ function invalidSession(filePath, message, cause) {
34
+ return new SessionError('invalid_session', `Invalid JSONL session file ${filePath}: ${message}`, cause);
35
+ }
36
+ function invalidEntry(filePath, lineNumber, message, cause) {
37
+ return new SessionError('invalid_entry', `Invalid JSONL session file ${filePath}: line ${lineNumber} ${message}`, cause);
38
+ }
39
+ function parseHeaderLine(line, filePath) {
40
+ let parsed;
41
+ try {
42
+ parsed = JSON.parse(line);
43
+ }
44
+ catch (error) {
45
+ throw invalidSession(filePath, 'first line is not a valid session header', toError(error));
46
+ }
47
+ if (!isRecord(parsed))
48
+ throw invalidSession(filePath, 'first line is not a valid session header');
49
+ if (parsed.type !== 'session')
50
+ throw invalidSession(filePath, 'first line is not a valid session header');
51
+ if (parsed.version !== 3)
52
+ throw invalidSession(filePath, 'unsupported session version');
53
+ if (typeof parsed.id !== 'string' || !parsed.id)
54
+ throw invalidSession(filePath, 'session header is missing id');
55
+ if (typeof parsed.timestamp !== 'string' || !parsed.timestamp) {
56
+ throw invalidSession(filePath, 'session header is missing timestamp');
57
+ }
58
+ if (typeof parsed.cwd !== 'string' || !parsed.cwd)
59
+ throw invalidSession(filePath, 'session header is missing cwd');
60
+ if (parsed.parentSession !== undefined &&
61
+ typeof parsed.parentSession !== 'string') {
62
+ throw invalidSession(filePath, 'session header parentSession must be a string');
63
+ }
64
+ return {
65
+ type: 'session',
66
+ version: 3,
67
+ id: parsed.id,
68
+ timestamp: parsed.timestamp,
69
+ cwd: parsed.cwd,
70
+ parentSession: parsed.parentSession,
71
+ };
72
+ }
73
+ function parseEntryLine(line, filePath, lineNumber) {
74
+ let parsed;
75
+ try {
76
+ parsed = JSON.parse(line);
77
+ }
78
+ catch (error) {
79
+ throw invalidEntry(filePath, lineNumber, 'is not valid JSON', toError(error));
80
+ }
81
+ if (!isRecord(parsed))
82
+ throw invalidEntry(filePath, lineNumber, 'is not a valid session entry');
83
+ if (typeof parsed.type !== 'string')
84
+ throw invalidEntry(filePath, lineNumber, 'is missing entry type');
85
+ if (typeof parsed.id !== 'string' || !parsed.id)
86
+ throw invalidEntry(filePath, lineNumber, 'is missing entry id');
87
+ if (parsed.parentId !== null && typeof parsed.parentId !== 'string') {
88
+ throw invalidEntry(filePath, lineNumber, 'has invalid parentId');
89
+ }
90
+ if (typeof parsed.timestamp !== 'string' || !parsed.timestamp) {
91
+ throw invalidEntry(filePath, lineNumber, 'is missing timestamp');
92
+ }
93
+ if (parsed.type === 'leaf' &&
94
+ parsed.targetId !== null &&
95
+ typeof parsed.targetId !== 'string') {
96
+ throw invalidEntry(filePath, lineNumber, 'has invalid targetId');
97
+ }
98
+ return parsed;
99
+ }
100
+ function leafIdAfterEntry(entry) {
101
+ return entry.type === 'leaf' ? entry.targetId : entry.id;
102
+ }
103
+ function headerToSessionMetadata(header, path) {
104
+ return {
105
+ id: header.id,
106
+ createdAt: header.timestamp,
107
+ cwd: header.cwd,
108
+ path,
109
+ parentSessionPath: header.parentSession,
110
+ };
111
+ }
112
+ export async function loadJsonlSessionMetadata(fs, filePath) {
113
+ const lines = getFileSystemResultOrThrow(await fs.readTextLines(filePath, { maxLines: 1 }), `Failed to read session header ${filePath}`);
114
+ const line = lines[0];
115
+ if (line?.trim())
116
+ return headerToSessionMetadata(parseHeaderLine(line, filePath), filePath);
117
+ throw invalidSession(filePath, 'missing session header');
118
+ }
119
+ async function loadJsonlStorage(fs, filePath) {
120
+ const content = getFileSystemResultOrThrow(await fs.readTextFile(filePath), `Failed to read session ${filePath}`);
121
+ const lines = content.split('\n').filter((line) => line.trim());
122
+ if (lines.length === 0) {
123
+ throw invalidSession(filePath, 'missing session header');
124
+ }
125
+ const header = parseHeaderLine(lines[0], filePath);
126
+ const entries = [];
127
+ let leafId = null;
128
+ for (let i = 1; i < lines.length; i++) {
129
+ const entry = parseEntryLine(lines[i], filePath, i + 1);
130
+ entries.push(entry);
131
+ leafId = leafIdAfterEntry(entry);
132
+ }
133
+ return { header, entries, leafId };
134
+ }
135
+ export class JsonlSessionStorage {
136
+ fs;
137
+ filePath;
138
+ metadata;
139
+ entries;
140
+ byId;
141
+ labelsById;
142
+ currentLeafId;
143
+ constructor(fs, filePath, header, entries, leafId) {
144
+ this.fs = fs;
145
+ this.filePath = filePath;
146
+ this.metadata = headerToSessionMetadata(header, this.filePath);
147
+ this.entries = entries;
148
+ this.byId = new Map(entries.map((entry) => [entry.id, entry]));
149
+ this.labelsById = buildLabelsById(entries);
150
+ this.currentLeafId = leafId;
151
+ }
152
+ static async open(fs, filePath) {
153
+ const loaded = await loadJsonlStorage(fs, filePath);
154
+ return new JsonlSessionStorage(fs, filePath, loaded.header, loaded.entries, loaded.leafId);
155
+ }
156
+ static async create(fs, filePath, options) {
157
+ const header = {
158
+ type: 'session',
159
+ version: 3,
160
+ id: options.sessionId,
161
+ timestamp: new Date().toISOString(),
162
+ cwd: options.cwd,
163
+ parentSession: options.parentSessionPath,
164
+ };
165
+ getFileSystemResultOrThrow(await fs.writeFile(filePath, `${JSON.stringify(header)}\n`), `Failed to create session ${filePath}`);
166
+ return new JsonlSessionStorage(fs, filePath, header, [], null);
167
+ }
168
+ async getMetadata() {
169
+ return this.metadata;
170
+ }
171
+ async getLeafId() {
172
+ if (this.currentLeafId !== null && !this.byId.has(this.currentLeafId)) {
173
+ throw new SessionError('invalid_session', `Entry ${this.currentLeafId} not found`);
174
+ }
175
+ return this.currentLeafId;
176
+ }
177
+ async setLeafId(leafId) {
178
+ if (leafId !== null && !this.byId.has(leafId)) {
179
+ throw new SessionError('not_found', `Entry ${leafId} not found`);
180
+ }
181
+ const entry = {
182
+ type: 'leaf',
183
+ id: generateEntryId(this.byId),
184
+ parentId: this.currentLeafId,
185
+ timestamp: new Date().toISOString(),
186
+ targetId: leafId,
187
+ };
188
+ getFileSystemResultOrThrow(await this.fs.appendFile(this.filePath, `${JSON.stringify(entry)}\n`), `Failed to append session leaf ${entry.id}`);
189
+ this.entries.push(entry);
190
+ this.byId.set(entry.id, entry);
191
+ this.currentLeafId = leafId;
192
+ }
193
+ async createEntryId() {
194
+ return generateEntryId(this.byId);
195
+ }
196
+ async appendEntry(entry) {
197
+ getFileSystemResultOrThrow(await this.fs.appendFile(this.filePath, `${JSON.stringify(entry)}\n`), `Failed to append session entry ${entry.id}`);
198
+ this.entries.push(entry);
199
+ this.byId.set(entry.id, entry);
200
+ updateLabelCache(this.labelsById, entry);
201
+ this.currentLeafId = leafIdAfterEntry(entry);
202
+ }
203
+ async getEntry(id) {
204
+ return this.byId.get(id);
205
+ }
206
+ async findEntries(type) {
207
+ return this.entries.filter((entry) => entry.type === type);
208
+ }
209
+ async getLabel(id) {
210
+ return this.labelsById.get(id);
211
+ }
212
+ async getPathToRoot(leafId) {
213
+ if (leafId === null)
214
+ return [];
215
+ const path = [];
216
+ let current = this.byId.get(leafId);
217
+ if (!current)
218
+ throw new SessionError('not_found', `Entry ${leafId} not found`);
219
+ while (current) {
220
+ path.unshift(current);
221
+ if (!current.parentId)
222
+ break;
223
+ const parent = this.byId.get(current.parentId);
224
+ if (!parent)
225
+ throw new SessionError('invalid_session', `Entry ${current.parentId} not found`);
226
+ current = parent;
227
+ }
228
+ return path;
229
+ }
230
+ async getEntries() {
231
+ return [...this.entries];
232
+ }
233
+ }
234
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmwtc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWdlbnQtY29yZS9zcmMvaGFybmVzcy9zZXNzaW9uL2pzb25sLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQWdCbkMsU0FBUyxnQkFBZ0IsQ0FDdkIsVUFBK0IsRUFDL0IsS0FBdUI7SUFFdkIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU87UUFBRSxPQUFPO0lBQ25DLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbEMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO1NBQU0sQ0FBQztRQUNOLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBMkI7SUFDbEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDN0MsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM1QixnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxJQUFrQztJQUN6RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBQ0QsT0FBTyxNQUFNLEVBQUUsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM5QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FDckIsUUFBZ0IsRUFDaEIsT0FBZSxFQUNmLEtBQWE7SUFFYixPQUFPLElBQUksWUFBWSxDQUNyQixpQkFBaUIsRUFDakIsOEJBQThCLFFBQVEsS0FBSyxPQUFPLEVBQUUsRUFDcEQsS0FBSyxDQUNOLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ25CLFFBQWdCLEVBQ2hCLFVBQWtCLEVBQ2xCLE9BQWUsRUFDZixLQUFhO0lBRWIsT0FBTyxJQUFJLFlBQVksQ0FDckIsZUFBZSxFQUNmLDhCQUE4QixRQUFRLFVBQVUsVUFBVSxJQUFJLE9BQU8sRUFBRSxFQUN2RSxLQUFLLENBQ04sQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxJQUFZLEVBQUUsUUFBZ0I7SUFDckQsSUFBSSxNQUFlLENBQUM7SUFDcEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLGNBQWMsQ0FDbEIsUUFBUSxFQUNSLDBDQUEwQyxFQUMxQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQ2YsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNuQixNQUFNLGNBQWMsQ0FBQyxRQUFRLEVBQUUsMENBQTBDLENBQUMsQ0FBQztJQUM3RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUztRQUMzQixNQUFNLGNBQWMsQ0FBQyxRQUFRLEVBQUUsMENBQTBDLENBQUMsQ0FBQztJQUM3RSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssQ0FBQztRQUN0QixNQUFNLGNBQWMsQ0FBQyxRQUFRLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztJQUNoRSxJQUFJLE9BQU8sTUFBTSxDQUFDLEVBQUUsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUM3QyxNQUFNLGNBQWMsQ0FBQyxRQUFRLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUNqRSxJQUFJLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDOUQsTUFBTSxjQUFjLENBQUMsUUFBUSxFQUFFLHFDQUFxQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUNELElBQUksT0FBTyxNQUFNLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHO1FBQy9DLE1BQU0sY0FBYyxDQUFDLFFBQVEsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQ2xFLElBQ0UsTUFBTSxDQUFDLGFBQWEsS0FBSyxTQUFTO1FBQ2xDLE9BQU8sTUFBTSxDQUFDLGFBQWEsS0FBSyxRQUFRLEVBQ3hDLENBQUM7UUFDRCxNQUFNLGNBQWMsQ0FDbEIsUUFBUSxFQUNSLCtDQUErQyxDQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU87UUFDTCxJQUFJLEVBQUUsU0FBUztRQUNmLE9BQU8sRUFBRSxDQUFDO1FBQ1YsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1FBQ2IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1FBQzNCLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztRQUNmLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtLQUNwQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsY0FBYyxDQUNyQixJQUFZLEVBQ1osUUFBZ0IsRUFDaEIsVUFBa0I7SUFFbEIsSUFBSSxNQUFlLENBQUM7SUFDcEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLFlBQVksQ0FDaEIsUUFBUSxFQUNSLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUNmLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDbkIsTUFBTSxZQUFZLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO0lBQzNFLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFDakMsTUFBTSxZQUFZLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3BFLElBQUksT0FBTyxNQUFNLENBQUMsRUFBRSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzdDLE1BQU0sWUFBWSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUNsRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNwRSxNQUFNLFlBQVksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELElBQUksT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM5RCxNQUFNLFlBQVksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELElBQ0UsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNO1FBQ3RCLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSTtRQUN4QixPQUFPLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUNuQyxDQUFDO1FBQ0QsTUFBTSxZQUFZLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxPQUFPLE1BQXFDLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBdUI7SUFDL0MsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUMzRCxDQUFDO0FBRUQsU0FBUyx1QkFBdUIsQ0FDOUIsTUFBcUIsRUFDckIsSUFBWTtJQUVaLE9BQU87UUFDTCxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7UUFDYixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDM0IsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHO1FBQ2YsSUFBSTtRQUNKLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxhQUFhO0tBQ3hDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsRUFBaUMsRUFDakMsUUFBZ0I7SUFFaEIsTUFBTSxLQUFLLEdBQUcsMEJBQTBCLENBQ3RDLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFDakQsaUNBQWlDLFFBQVEsRUFBRSxDQUM1QyxDQUFDO0lBQ0YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLElBQUksSUFBSSxFQUFFLElBQUksRUFBRTtRQUNkLE9BQU8sdUJBQXVCLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM1RSxNQUFNLGNBQWMsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUM3QixFQUFpQyxFQUNqQyxRQUFnQjtJQU1oQixNQUFNLE9BQU8sR0FBRywwQkFBMEIsQ0FDeEMsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUMvQiwwQkFBMEIsUUFBUSxFQUFFLENBQ3JDLENBQUM7SUFDRixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sY0FBYyxDQUFDLFFBQVEsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sT0FBTyxHQUF1QixFQUFFLENBQUM7SUFDdkMsSUFBSSxNQUFNLEdBQWtCLElBQUksQ0FBQztJQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDckMsQ0FBQztBQUVELE1BQU0sT0FBTyxtQkFBbUI7SUFDYixFQUFFLENBQWdDO0lBQ2xDLFFBQVEsQ0FBUztJQUNqQixRQUFRLENBQXVCO0lBQ3hDLE9BQU8sQ0FBcUI7SUFDNUIsSUFBSSxDQUFnQztJQUNwQyxVQUFVLENBQXNCO0lBQ2hDLGFBQWEsQ0FBZ0I7SUFFckMsWUFDRSxFQUFpQyxFQUNqQyxRQUFnQixFQUNoQixNQUFxQixFQUNyQixPQUEyQixFQUMzQixNQUFxQjtRQUVyQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7SUFDOUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNmLEVBQWlDLEVBQ2pDLFFBQWdCO1FBRWhCLE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxtQkFBbUIsQ0FDNUIsRUFBRSxFQUNGLFFBQVEsRUFDUixNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxPQUFPLEVBQ2QsTUFBTSxDQUFDLE1BQU0sQ0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUNqQixFQUFpQyxFQUNqQyxRQUFnQixFQUNoQixPQUlDO1FBRUQsTUFBTSxNQUFNLEdBQWtCO1lBQzVCLElBQUksRUFBRSxTQUFTO1lBQ2YsT0FBTyxFQUFFLENBQUM7WUFDVixFQUFFLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDckIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ25DLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztZQUNoQixhQUFhLEVBQUUsT0FBTyxDQUFDLGlCQUFpQjtTQUN6QyxDQUFDO1FBQ0YsMEJBQTBCLENBQ3hCLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDM0QsNEJBQTRCLFFBQVEsRUFBRSxDQUN2QyxDQUFDO1FBQ0YsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDZixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTO1FBQ2IsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sSUFBSSxZQUFZLENBQ3BCLGlCQUFpQixFQUNqQixTQUFTLElBQUksQ0FBQyxhQUFhLFlBQVksQ0FDeEMsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBcUI7UUFDbkMsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxNQUFNLElBQUksWUFBWSxDQUFDLFdBQVcsRUFBRSxTQUFTLE1BQU0sWUFBWSxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFjO1lBQ3ZCLElBQUksRUFBRSxNQUFNO1lBQ1osRUFBRSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUM1QixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDbkMsUUFBUSxFQUFFLE1BQU07U0FDakIsQ0FBQztRQUNGLDBCQUEwQixDQUN4QixNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFDckUsaUNBQWlDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FDNUMsQ0FBQztRQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7SUFDOUIsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhO1FBQ2pCLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUF1QjtRQUN2QywwQkFBMEIsQ0FDeEIsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQ3JFLGtDQUFrQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQzdDLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9CLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFVO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQ2YsSUFBVztRQUVYLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3hCLENBQUMsS0FBSyxFQUF1RCxFQUFFLENBQzdELEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUN0QixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBVTtRQUN2QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQXFCO1FBQ3ZDLElBQUksTUFBTSxLQUFLLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksR0FBdUIsRUFBRSxDQUFDO1FBQ3BDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPO1lBQ1YsTUFBTSxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUUsU0FBUyxNQUFNLFlBQVksQ0FBQyxDQUFDO1FBQ25FLE9BQU8sT0FBTyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtnQkFBRSxNQUFNO1lBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsTUFBTTtnQkFDVCxNQUFNLElBQUksWUFBWSxDQUNwQixpQkFBaUIsRUFDakIsU0FBUyxPQUFPLENBQUMsUUFBUSxZQUFZLENBQ3RDLENBQUM7WUFDSixPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVTtRQUNkLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQixDQUFDO0NBQ0YifQ==
@@ -1,4 +1,4 @@
1
- import type { Session, SessionMetadata, SessionRepo } from '../../types.js';
1
+ import { type Session, type SessionMetadata, type SessionRepo } from '../types.ts';
2
2
  export declare class InMemorySessionRepo implements SessionRepo<SessionMetadata, {
3
3
  id?: string;
4
4
  }, void> {
@@ -0,0 +1,45 @@
1
+ import { SessionError, } from "../types.js";
2
+ import { InMemorySessionStorage } from "./memory-storage.js";
3
+ import { createSessionId, createTimestamp, getEntriesToFork, toSession, } from "./repo-utils.js";
4
+ export class InMemorySessionRepo {
5
+ sessions = new Map();
6
+ async create(options = {}) {
7
+ const metadata = {
8
+ id: options.id ?? createSessionId(),
9
+ createdAt: createTimestamp(),
10
+ };
11
+ const storage = new InMemorySessionStorage({ metadata });
12
+ const session = toSession(storage);
13
+ this.sessions.set(metadata.id, session);
14
+ return session;
15
+ }
16
+ async open(metadata) {
17
+ const session = this.sessions.get(metadata.id);
18
+ if (!session) {
19
+ throw new SessionError('not_found', `Session not found: ${metadata.id}`);
20
+ }
21
+ return session;
22
+ }
23
+ async list() {
24
+ return Promise.all([...this.sessions.values()].map((session) => session.getMetadata()));
25
+ }
26
+ async delete(metadata) {
27
+ this.sessions.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 ?? createSessionId(),
34
+ createdAt: createTimestamp(),
35
+ };
36
+ const storage = new InMemorySessionStorage({
37
+ metadata,
38
+ entries: forkedEntries,
39
+ });
40
+ const session = toSession(storage);
41
+ this.sessions.set(metadata.id, session);
42
+ return session;
43
+ }
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LXJlcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FnZW50LWNvcmUvc3JjL2hhcm5lc3Mvc2Vzc2lvbi9tZW1vcnktcmVwby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsWUFBWSxHQUdiLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFDTCxlQUFlLEVBQ2YsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixTQUFTLEdBQ1YsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixNQUFNLE9BQU8sbUJBQW1CO0lBS3RCLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBb0MsQ0FBQztJQUUvRCxLQUFLLENBQUMsTUFBTSxDQUNWLFVBQTJCLEVBQUU7UUFFN0IsTUFBTSxRQUFRLEdBQW9CO1lBQ2hDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFJLGVBQWUsRUFBRTtZQUNuQyxTQUFTLEVBQUUsZUFBZSxFQUFFO1NBQzdCLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLHNCQUFzQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN6RCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUF5QjtRQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQ2hCLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FDcEUsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQXlCO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FDUixjQUErQixFQUMvQixPQUFzRTtRQUV0RSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0MsTUFBTSxhQUFhLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0UsTUFBTSxRQUFRLEdBQW9CO1lBQ2hDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFJLGVBQWUsRUFBRTtZQUNuQyxTQUFTLEVBQUUsZUFBZSxFQUFFO1NBQzdCLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLHNCQUFzQixDQUFDO1lBQ3pDLFFBQVE7WUFDUixPQUFPLEVBQUUsYUFBYTtTQUN2QixDQUFDLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YifQ==
@@ -1,5 +1,5 @@
1
- import type { SessionMetadata, SessionStorage, SessionTreeEntry } from '../../types.js';
2
- export declare class InMemorySessionStorage implements SessionStorage {
1
+ import { type SessionMetadata, type SessionStorage, type SessionTreeEntry } from '../types.ts';
2
+ export declare class InMemorySessionStorage<TMetadata extends SessionMetadata = SessionMetadata> implements SessionStorage<TMetadata> {
3
3
  private readonly metadata;
4
4
  private entries;
5
5
  private byId;
@@ -7,10 +7,9 @@ export declare class InMemorySessionStorage implements SessionStorage {
7
7
  private leafId;
8
8
  constructor(options?: {
9
9
  entries?: SessionTreeEntry[];
10
- leafId?: string | null;
11
- metadata?: SessionMetadata;
10
+ metadata?: TMetadata;
12
11
  });
13
- getMetadata(): Promise<SessionMetadata>;
12
+ getMetadata(): Promise<TMetadata>;
14
13
  getLeafId(): Promise<string | null>;
15
14
  setLeafId(leafId: string | null): Promise<void>;
16
15
  createEntryId(): Promise<string>;
@@ -0,0 +1,116 @@
1
+ import { SessionError, } from "../types.js";
2
+ import { uuidv7 } from "./uuid.js";
3
+ function updateLabelCache(labelsById, entry) {
4
+ if (entry.type !== 'label')
5
+ return;
6
+ const label = entry.label?.trim();
7
+ if (label) {
8
+ labelsById.set(entry.targetId, label);
9
+ }
10
+ else {
11
+ labelsById.delete(entry.targetId);
12
+ }
13
+ }
14
+ function buildLabelsById(entries) {
15
+ const labelsById = new Map();
16
+ for (const entry of entries) {
17
+ updateLabelCache(labelsById, entry);
18
+ }
19
+ return labelsById;
20
+ }
21
+ function generateEntryId(byId) {
22
+ for (let i = 0; i < 100; i++) {
23
+ const id = uuidv7().slice(0, 8);
24
+ if (!byId.has(id))
25
+ return id;
26
+ }
27
+ return uuidv7();
28
+ }
29
+ function leafIdAfterEntry(entry) {
30
+ return entry.type === 'leaf' ? entry.targetId : entry.id;
31
+ }
32
+ export class InMemorySessionStorage {
33
+ metadata;
34
+ entries;
35
+ byId;
36
+ labelsById;
37
+ leafId;
38
+ constructor(options) {
39
+ this.entries = options?.entries ? [...options.entries] : [];
40
+ this.byId = new Map(this.entries.map((entry) => [entry.id, entry]));
41
+ this.labelsById = buildLabelsById(this.entries);
42
+ this.leafId = null;
43
+ for (const entry of this.entries)
44
+ this.leafId = leafIdAfterEntry(entry);
45
+ if (this.leafId !== null && !this.byId.has(this.leafId)) {
46
+ throw new SessionError('invalid_session', `Entry ${this.leafId} not found`);
47
+ }
48
+ this.metadata =
49
+ options?.metadata ??
50
+ { id: uuidv7(), createdAt: new Date().toISOString() };
51
+ }
52
+ async getMetadata() {
53
+ return this.metadata;
54
+ }
55
+ async getLeafId() {
56
+ if (this.leafId !== null && !this.byId.has(this.leafId)) {
57
+ throw new SessionError('invalid_session', `Entry ${this.leafId} not found`);
58
+ }
59
+ return this.leafId;
60
+ }
61
+ async setLeafId(leafId) {
62
+ if (leafId !== null && !this.byId.has(leafId)) {
63
+ throw new SessionError('not_found', `Entry ${leafId} not found`);
64
+ }
65
+ const entry = {
66
+ type: 'leaf',
67
+ id: generateEntryId(this.byId),
68
+ parentId: this.leafId,
69
+ timestamp: new Date().toISOString(),
70
+ targetId: leafId,
71
+ };
72
+ this.entries.push(entry);
73
+ this.byId.set(entry.id, entry);
74
+ this.leafId = leafId;
75
+ }
76
+ async createEntryId() {
77
+ return generateEntryId(this.byId);
78
+ }
79
+ async appendEntry(entry) {
80
+ this.entries.push(entry);
81
+ this.byId.set(entry.id, entry);
82
+ updateLabelCache(this.labelsById, entry);
83
+ this.leafId = leafIdAfterEntry(entry);
84
+ }
85
+ async getEntry(id) {
86
+ return this.byId.get(id);
87
+ }
88
+ async findEntries(type) {
89
+ return this.entries.filter((entry) => entry.type === type);
90
+ }
91
+ async getLabel(id) {
92
+ return this.labelsById.get(id);
93
+ }
94
+ async getPathToRoot(leafId) {
95
+ if (leafId === null)
96
+ return [];
97
+ const path = [];
98
+ let current = this.byId.get(leafId);
99
+ if (!current)
100
+ throw new SessionError('not_found', `Entry ${leafId} not found`);
101
+ while (current) {
102
+ path.unshift(current);
103
+ if (!current.parentId)
104
+ break;
105
+ const parent = this.byId.get(current.parentId);
106
+ if (!parent)
107
+ throw new SessionError('invalid_session', `Entry ${current.parentId} not found`);
108
+ current = parent;
109
+ }
110
+ return path;
111
+ }
112
+ async getEntries() {
113
+ return [...this.entries];
114
+ }
115
+ }
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FnZW50LWNvcmUvc3JjL2hhcm5lc3Mvc2Vzc2lvbi9tZW1vcnktc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsWUFBWSxHQUliLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbkMsU0FBUyxnQkFBZ0IsQ0FDdkIsVUFBK0IsRUFDL0IsS0FBdUI7SUFFdkIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU87UUFBRSxPQUFPO0lBQ25DLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbEMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO1NBQU0sQ0FBQztRQUNOLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBMkI7SUFDbEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDN0MsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM1QixnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxJQUFrQztJQUN6RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFF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
@@ -1,8 +1,9 @@
1
- import type { SessionMetadata, SessionStorage, SessionTreeEntry } from '../../types.js';
2
- import { Session } from '../session.js';
1
+ import { type FileError, type Result, type SessionMetadata, type SessionStorage, type SessionTreeEntry } from '../types.ts';
2
+ import { Session } from './session.ts';
3
3
  export declare function createSessionId(): string;
4
4
  export declare function createTimestamp(): string;
5
5
  export declare function toSession<TMetadata extends SessionMetadata>(storage: SessionStorage<TMetadata>): Session<TMetadata>;
6
+ export declare function getFileSystemResultOrThrow<TValue>(result: Result<TValue, FileError>, message: string): TValue;
6
7
  export declare function getEntriesToFork(storage: SessionStorage, options: {
7
8
  entryId?: string;
8
9
  position?: 'before' | 'at';
@@ -0,0 +1,39 @@
1
+ import { SessionError, } from "../types.js";
2
+ import { Session } from "./session.js";
3
+ import { uuidv7 } from "./uuid.js";
4
+ export function createSessionId() {
5
+ return uuidv7();
6
+ }
7
+ export function createTimestamp() {
8
+ return new Date().toISOString();
9
+ }
10
+ export function toSession(storage) {
11
+ return new Session(storage);
12
+ }
13
+ export function getFileSystemResultOrThrow(result, message) {
14
+ if (!result.ok) {
15
+ const code = result.error.code === 'not_found' ? 'not_found' : 'storage';
16
+ throw new SessionError(code, `${message}: ${result.error.message}`, result.error);
17
+ }
18
+ return result.value;
19
+ }
20
+ export async function getEntriesToFork(storage, options) {
21
+ if (!options.entryId)
22
+ return storage.getEntries();
23
+ const target = await storage.getEntry(options.entryId);
24
+ if (!target) {
25
+ throw new SessionError('invalid_fork_target', `Entry ${options.entryId} not found`);
26
+ }
27
+ let effectiveLeafId;
28
+ if ((options.position ?? 'before') === 'at') {
29
+ effectiveLeafId = target.id;
30
+ }
31
+ else {
32
+ if (target.type !== 'message' || target.message.role !== 'user') {
33
+ throw new SessionError('invalid_fork_target', `Entry ${options.entryId} is not a user message`);
34
+ }
35
+ effectiveLeafId = target.parentId;
36
+ }
37
+ return storage.getPathToRoot(effectiveLeafId);
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwby11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWdlbnQtY29yZS9zcmMvaGFybmVzcy9zZXNzaW9uL3JlcG8tdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFlBQVksR0FJYixNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbkMsTUFBTSxVQUFVLGVBQWU7SUFDN0IsT0FBTyxNQUFNLEVBQUUsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUN2QixPQUFrQztJQUVsQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLE1BQWlDLEVBQ2pDLE9BQWU7SUFFZixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN6RSxNQUFNLElBQUksWUFBWSxDQUNwQixJQUFJLEVBQ0osR0FBRyxPQUFPLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFDckMsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsT0FBdUIsRUFDdkIsT0FBeUQ7SUFFekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO1FBQUUsT0FBTyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksWUFBWSxDQUNwQixxQkFBcUIsRUFDckIsU0FBUyxPQUFPLENBQUMsT0FBTyxZQUFZLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxlQUE4QixDQUFDO0lBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzVDLGVBQWUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQzlCLENBQUM7U0FBTSxDQUFDO1FBQ04sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNoRSxNQUFNLElBQUksWUFBWSxDQUNwQixxQkFBcUIsRUFDckIsU0FBUyxPQUFPLENBQUMsT0FBTyx3QkFBd0IsQ0FDakQsQ0FBQztRQUNKLENBQUM7UUFDRCxlQUFlLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ2hELENBQUMifQ==
@@ -1,6 +1,6 @@
1
1
  import type { ImageContent, TextContent } from '@earendil-works/pi-ai';
2
- import type { AgentMessage } from '../../types.js';
3
- import type { SessionContext, SessionMetadata, SessionStorage, SessionTreeEntry } from '../types.js';
2
+ import type { AgentMessage } from '../../types.ts';
3
+ import type { SessionContext, SessionMetadata, SessionStorage, SessionTreeEntry } from '../types.ts';
4
4
  export declare function buildSessionContext(pathEntries: SessionTreeEntry[]): SessionContext;
5
5
  export declare class Session<TMetadata extends SessionMetadata = SessionMetadata> {
6
6
  private storage;
@@ -18,6 +18,7 @@ export declare class Session<TMetadata extends SessionMetadata = SessionMetadata
18
18
  appendMessage(message: AgentMessage): Promise<string>;
19
19
  appendThinkingLevelChange(thinkingLevel: string): Promise<string>;
20
20
  appendModelChange(provider: string, modelId: string): Promise<string>;
21
+ appendActiveToolsChange(activeToolNames: string[]): Promise<string>;
21
22
  appendCompaction<T = unknown>(summary: string, firstKeptEntryId: string, tokensBefore: number, details?: T, fromHook?: boolean): Promise<string>;
22
23
  appendCustomEntry(customType: string, data?: unknown): Promise<string>;
23
24
  appendCustomMessageEntry<T = unknown>(customType: string, content: string | (TextContent | ImageContent)[], display: boolean, details?: T): Promise<string>;