psadk 1.4.7 → 1.5.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 (207) hide show
  1. package/README.md +153 -0
  2. package/build/main/index.d.ts +1 -0
  3. package/build/main/lib/PSAI.js +1 -2
  4. package/build/main/lib/PSAgent.d.ts +50 -13
  5. package/build/main/lib/PSAgent.js +179 -502
  6. package/build/main/lib/PSAgentConfig.d.ts +114 -2
  7. package/build/main/lib/PSAgentLogger.js +1 -2
  8. package/build/main/lib/PSAgentTool.d.ts +8 -3
  9. package/build/main/lib/PSAgentTool.js +3 -3
  10. package/build/main/lib/agent-core/package.json +1 -1
  11. package/build/main/lib/agent-core/{agent-loop.d.ts → src/agent-loop.d.ts} +1 -1
  12. package/build/main/lib/agent-core/src/agent-loop.js +514 -0
  13. package/build/{module/lib/agent-core → main/lib/agent-core/src}/agent.d.ts +2 -2
  14. package/build/main/lib/agent-core/src/agent.js +419 -0
  15. package/build/main/lib/agent-core/{harness → src/harness}/agent-harness.d.ts +36 -26
  16. package/build/main/lib/agent-core/src/harness/agent-harness.js +1028 -0
  17. package/build/main/lib/agent-core/src/harness/compaction/branch-summarization.d.ts +52 -0
  18. package/build/main/lib/agent-core/src/harness/compaction/branch-summarization.js +182 -0
  19. package/build/main/lib/agent-core/src/harness/compaction/compaction.d.ts +94 -0
  20. package/build/main/lib/agent-core/src/harness/compaction/compaction.js +550 -0
  21. package/build/main/lib/agent-core/src/harness/compaction/utils.d.ts +24 -0
  22. package/build/main/lib/agent-core/src/harness/compaction/utils.js +131 -0
  23. package/build/main/lib/agent-core/src/harness/env/nodejs.d.ts +50 -0
  24. package/build/main/lib/agent-core/src/harness/env/nodejs.js +494 -0
  25. package/build/main/lib/agent-core/{harness → src/harness}/messages.d.ts +2 -2
  26. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/messages.js +1 -1
  27. package/build/main/lib/agent-core/{harness → src/harness}/prompt-templates.d.ts +4 -1
  28. package/build/main/lib/agent-core/src/harness/prompt-templates.js +235 -0
  29. 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
  30. package/build/main/lib/agent-core/src/harness/session/jsonl-repo.js +106 -0
  31. 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
  32. package/build/main/lib/agent-core/src/harness/session/jsonl-storage.js +234 -0
  33. package/build/main/lib/agent-core/{harness/session/repo/memory.d.ts → src/harness/session/memory-repo.d.ts} +1 -1
  34. package/build/main/lib/agent-core/src/harness/session/memory-repo.js +45 -0
  35. package/build/main/lib/agent-core/{harness/session/storage/memory.d.ts → src/harness/session/memory-storage.d.ts} +4 -5
  36. package/build/main/lib/agent-core/src/harness/session/memory-storage.js +116 -0
  37. package/build/main/lib/agent-core/{harness/session/repo/shared.d.ts → src/harness/session/repo-utils.d.ts} +3 -2
  38. package/build/main/lib/agent-core/src/harness/session/repo-utils.js +39 -0
  39. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/session/session.d.ts +3 -2
  40. package/build/main/lib/agent-core/src/harness/session/session.js +213 -0
  41. package/build/main/lib/agent-core/src/harness/session/uuid.d.ts +1 -0
  42. package/build/main/lib/agent-core/src/harness/session/uuid.js +54 -0
  43. package/build/main/lib/agent-core/{harness → src/harness}/skills.d.ts +4 -1
  44. package/build/main/lib/agent-core/src/harness/skills.js +353 -0
  45. package/build/main/lib/agent-core/{harness → src/harness}/system-prompt.d.ts +1 -1
  46. package/build/main/lib/agent-core/src/harness/system-prompt.js +30 -0
  47. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/types.d.ts +160 -70
  48. package/build/main/lib/agent-core/src/harness/types.js +94 -0
  49. package/build/main/lib/agent-core/{harness → src/harness}/utils/shell-output.d.ts +2 -2
  50. package/build/main/lib/agent-core/src/harness/utils/shell-output.js +134 -0
  51. package/build/main/lib/agent-core/src/harness/utils/truncate.js +294 -0
  52. package/build/main/lib/agent-core/src/index.d.ts +19 -0
  53. package/build/main/lib/agent-core/src/index.js +25 -0
  54. package/build/main/lib/agent-core/src/node.d.ts +2 -0
  55. package/build/main/lib/agent-core/src/node.js +3 -0
  56. package/build/main/lib/agent-core/{proxy.js → src/proxy.js} +3 -2
  57. package/build/{module/lib/agent-core → main/lib/agent-core/src}/types.d.ts +13 -1
  58. package/build/{module/lib/agent-core → main/lib/agent-core/src}/types.js +1 -1
  59. package/build/main/lib/localAgent.d.ts +35 -0
  60. package/build/main/lib/localAgent.js +329 -0
  61. package/build/main/lib/remoteAgent.d.ts +25 -0
  62. package/build/main/lib/remoteAgent.js +311 -0
  63. package/build/main/lib/tools/BraveWebSearchTool.js +1 -2
  64. package/build/main/lib/tools/PSArtifactTool.js +1 -2
  65. package/build/main/lib/tools/PSClarifyTool.js +1 -2
  66. package/build/main/lib/tools/PSCommandLineTool.js +1 -2
  67. package/build/main/lib/tools/PSMemoryTool.js +1 -2
  68. package/build/main/lib/tools/PSReadFileTool.js +1 -2
  69. package/build/main/lib/tools/PSRetrievalTool.js +1 -2
  70. package/build/main/lib/tools/PSSkillTool.js +1 -2
  71. package/build/main/lib/tools/PSSubAgentTool.js +1 -1
  72. package/build/main/lib/tools/PSWriteFileTool.js +1 -2
  73. package/build/main/lib/tools/TodoTool.js +1 -2
  74. package/build/main/lib/utils/debuglogger.js +1 -2
  75. package/build/main/lib/utils/helpers.js +1 -6
  76. package/build/module/index.d.ts +1 -0
  77. package/build/module/lib/PSAI.js +1 -2
  78. package/build/module/lib/PSAgent.d.ts +50 -13
  79. package/build/module/lib/PSAgent.js +179 -502
  80. package/build/module/lib/PSAgentConfig.d.ts +114 -2
  81. package/build/module/lib/PSAgentLogger.js +1 -2
  82. package/build/module/lib/PSAgentTool.d.ts +8 -3
  83. package/build/module/lib/PSAgentTool.js +3 -3
  84. package/build/module/lib/agent-core/{agent-loop.d.ts → src/agent-loop.d.ts} +1 -1
  85. package/build/module/lib/agent-core/src/agent-loop.js +514 -0
  86. package/build/{main/lib/agent-core → module/lib/agent-core/src}/agent.d.ts +2 -2
  87. package/build/module/lib/agent-core/src/agent.js +419 -0
  88. package/build/module/lib/agent-core/{harness → src/harness}/agent-harness.d.ts +36 -26
  89. package/build/module/lib/agent-core/src/harness/agent-harness.js +1028 -0
  90. package/build/module/lib/agent-core/src/harness/compaction/branch-summarization.d.ts +52 -0
  91. package/build/module/lib/agent-core/src/harness/compaction/branch-summarization.js +182 -0
  92. package/build/module/lib/agent-core/src/harness/compaction/compaction.d.ts +94 -0
  93. package/build/module/lib/agent-core/src/harness/compaction/compaction.js +550 -0
  94. package/build/module/lib/agent-core/src/harness/compaction/utils.d.ts +24 -0
  95. package/build/module/lib/agent-core/src/harness/compaction/utils.js +131 -0
  96. package/build/module/lib/agent-core/src/harness/env/nodejs.d.ts +50 -0
  97. package/build/module/lib/agent-core/src/harness/env/nodejs.js +494 -0
  98. package/build/module/lib/agent-core/{harness → src/harness}/messages.d.ts +2 -2
  99. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/messages.js +1 -1
  100. package/build/module/lib/agent-core/{harness → src/harness}/prompt-templates.d.ts +4 -1
  101. package/build/module/lib/agent-core/src/harness/prompt-templates.js +235 -0
  102. 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
  103. package/build/module/lib/agent-core/src/harness/session/jsonl-repo.js +106 -0
  104. 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
  105. package/build/module/lib/agent-core/src/harness/session/jsonl-storage.js +234 -0
  106. package/build/module/lib/agent-core/{harness/session/repo/memory.d.ts → src/harness/session/memory-repo.d.ts} +1 -1
  107. package/build/module/lib/agent-core/src/harness/session/memory-repo.js +45 -0
  108. package/build/module/lib/agent-core/{harness/session/storage/memory.d.ts → src/harness/session/memory-storage.d.ts} +4 -5
  109. package/build/module/lib/agent-core/src/harness/session/memory-storage.js +116 -0
  110. package/build/module/lib/agent-core/{harness/session/repo/shared.d.ts → src/harness/session/repo-utils.d.ts} +3 -2
  111. package/build/module/lib/agent-core/src/harness/session/repo-utils.js +39 -0
  112. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/session/session.d.ts +3 -2
  113. package/build/module/lib/agent-core/src/harness/session/session.js +213 -0
  114. package/build/module/lib/agent-core/src/harness/session/uuid.d.ts +1 -0
  115. package/build/module/lib/agent-core/src/harness/session/uuid.js +54 -0
  116. package/build/module/lib/agent-core/{harness → src/harness}/skills.d.ts +4 -1
  117. package/build/module/lib/agent-core/src/harness/skills.js +353 -0
  118. package/build/module/lib/agent-core/{harness → src/harness}/system-prompt.d.ts +1 -1
  119. package/build/module/lib/agent-core/src/harness/system-prompt.js +30 -0
  120. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/types.d.ts +160 -70
  121. package/build/module/lib/agent-core/src/harness/types.js +94 -0
  122. package/build/module/lib/agent-core/{harness → src/harness}/utils/shell-output.d.ts +2 -2
  123. package/build/module/lib/agent-core/src/harness/utils/shell-output.js +134 -0
  124. package/build/module/lib/agent-core/src/harness/utils/truncate.js +294 -0
  125. package/build/module/lib/agent-core/src/index.d.ts +19 -0
  126. package/build/module/lib/agent-core/src/index.js +25 -0
  127. package/build/module/lib/agent-core/src/node.d.ts +2 -0
  128. package/build/module/lib/agent-core/src/node.js +3 -0
  129. package/build/module/lib/agent-core/{proxy.js → src/proxy.js} +3 -2
  130. package/build/{main/lib/agent-core → module/lib/agent-core/src}/types.d.ts +13 -1
  131. package/build/{main/lib/agent-core → module/lib/agent-core/src}/types.js +1 -1
  132. package/build/module/lib/localAgent.d.ts +35 -0
  133. package/build/module/lib/localAgent.js +329 -0
  134. package/build/module/lib/remoteAgent.d.ts +25 -0
  135. package/build/module/lib/remoteAgent.js +311 -0
  136. package/build/module/lib/tools/BraveWebSearchTool.js +1 -2
  137. package/build/module/lib/tools/PSArtifactTool.js +1 -2
  138. package/build/module/lib/tools/PSClarifyTool.js +1 -2
  139. package/build/module/lib/tools/PSCommandLineTool.js +1 -2
  140. package/build/module/lib/tools/PSMemoryTool.js +1 -2
  141. package/build/module/lib/tools/PSReadFileTool.js +1 -2
  142. package/build/module/lib/tools/PSRetrievalTool.js +1 -2
  143. package/build/module/lib/tools/PSSkillTool.js +1 -2
  144. package/build/module/lib/tools/PSSubAgentTool.js +1 -1
  145. package/build/module/lib/tools/PSWriteFileTool.js +1 -2
  146. package/build/module/lib/tools/TodoTool.js +1 -2
  147. package/build/module/lib/utils/debuglogger.js +1 -2
  148. package/build/module/lib/utils/helpers.js +1 -6
  149. package/package.json +3 -2
  150. package/build/main/lib/agent-core/agent-loop.js +0 -483
  151. package/build/main/lib/agent-core/agent.js +0 -419
  152. package/build/main/lib/agent-core/harness/agent-harness.js +0 -772
  153. package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +0 -87
  154. package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +0 -246
  155. package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +0 -121
  156. package/build/main/lib/agent-core/harness/compaction/compaction.js +0 -637
  157. package/build/main/lib/agent-core/harness/compaction/utils.d.ts +0 -37
  158. package/build/main/lib/agent-core/harness/compaction/utils.js +0 -153
  159. package/build/main/lib/agent-core/harness/env/nodejs.d.ts +0 -43
  160. package/build/main/lib/agent-core/harness/env/nodejs.js +0 -353
  161. package/build/main/lib/agent-core/harness/execution-env.d.ts +0 -3
  162. package/build/main/lib/agent-core/harness/execution-env.js +0 -3
  163. package/build/main/lib/agent-core/harness/prompt-templates.js +0 -204
  164. package/build/main/lib/agent-core/harness/session/repo/jsonl.js +0 -98
  165. package/build/main/lib/agent-core/harness/session/repo/memory.js +0 -46
  166. package/build/main/lib/agent-core/harness/session/repo/shared.js +0 -31
  167. package/build/main/lib/agent-core/harness/session/session.js +0 -199
  168. package/build/main/lib/agent-core/harness/session/storage/jsonl.js +0 -170
  169. package/build/main/lib/agent-core/harness/session/storage/memory.js +0 -94
  170. package/build/main/lib/agent-core/harness/skills.js +0 -266
  171. package/build/main/lib/agent-core/harness/system-prompt.js +0 -30
  172. package/build/main/lib/agent-core/harness/types.js +0 -16
  173. package/build/main/lib/agent-core/harness/utils/shell-output.js +0 -101
  174. package/build/main/lib/agent-core/harness/utils/truncate.js +0 -208
  175. package/build/main/lib/agent-core/index.d.ts +0 -19
  176. package/build/main/lib/agent-core/index.js +0 -25
  177. package/build/module/lib/agent-core/agent-loop.js +0 -483
  178. package/build/module/lib/agent-core/agent.js +0 -419
  179. package/build/module/lib/agent-core/harness/agent-harness.js +0 -772
  180. package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +0 -87
  181. package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +0 -246
  182. package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +0 -121
  183. package/build/module/lib/agent-core/harness/compaction/compaction.js +0 -637
  184. package/build/module/lib/agent-core/harness/compaction/utils.d.ts +0 -37
  185. package/build/module/lib/agent-core/harness/compaction/utils.js +0 -153
  186. package/build/module/lib/agent-core/harness/env/nodejs.d.ts +0 -43
  187. package/build/module/lib/agent-core/harness/env/nodejs.js +0 -353
  188. package/build/module/lib/agent-core/harness/execution-env.d.ts +0 -3
  189. package/build/module/lib/agent-core/harness/execution-env.js +0 -3
  190. package/build/module/lib/agent-core/harness/prompt-templates.js +0 -204
  191. package/build/module/lib/agent-core/harness/session/repo/jsonl.js +0 -98
  192. package/build/module/lib/agent-core/harness/session/repo/memory.js +0 -46
  193. package/build/module/lib/agent-core/harness/session/repo/shared.js +0 -31
  194. package/build/module/lib/agent-core/harness/session/session.js +0 -199
  195. package/build/module/lib/agent-core/harness/session/storage/jsonl.js +0 -170
  196. package/build/module/lib/agent-core/harness/session/storage/memory.js +0 -94
  197. package/build/module/lib/agent-core/harness/skills.js +0 -266
  198. package/build/module/lib/agent-core/harness/system-prompt.js +0 -30
  199. package/build/module/lib/agent-core/harness/types.js +0 -16
  200. package/build/module/lib/agent-core/harness/utils/shell-output.js +0 -101
  201. package/build/module/lib/agent-core/harness/utils/truncate.js +0 -208
  202. package/build/module/lib/agent-core/index.d.ts +0 -19
  203. package/build/module/lib/agent-core/index.js +0 -25
  204. /package/build/main/lib/agent-core/{harness → src/harness}/utils/truncate.d.ts +0 -0
  205. /package/build/main/lib/agent-core/{proxy.d.ts → src/proxy.d.ts} +0 -0
  206. /package/build/module/lib/agent-core/{harness → src/harness}/utils/truncate.d.ts +0 -0
  207. /package/build/module/lib/agent-core/{proxy.d.ts → src/proxy.d.ts} +0 -0
@@ -0,0 +1,235 @@
1
+ import { parse } from 'yaml';
2
+ import { toError, } from "./types.js";
3
+ /**
4
+ * Load prompt templates from one or more paths.
5
+ *
6
+ * Directory inputs load direct `.md` children non-recursively. File inputs load explicit `.md` files. Missing paths and
7
+ * non-markdown files are skipped. Read and parse failures are returned as diagnostics.
8
+ */
9
+ export async function loadPromptTemplates(env, paths) {
10
+ const promptTemplates = [];
11
+ const diagnostics = [];
12
+ for (const path of Array.isArray(paths) ? paths : [paths]) {
13
+ const infoResult = await env.fileInfo(path);
14
+ if (!infoResult.ok) {
15
+ if (infoResult.error.code !== 'not_found') {
16
+ diagnostics.push({
17
+ type: 'warning',
18
+ code: 'file_info_failed',
19
+ message: infoResult.error.message,
20
+ path,
21
+ });
22
+ }
23
+ continue;
24
+ }
25
+ const info = infoResult.value;
26
+ const kind = await resolveKind(env, info, diagnostics);
27
+ if (kind === 'directory') {
28
+ const result = await loadTemplatesFromDir(env, info.path);
29
+ promptTemplates.push(...result.promptTemplates);
30
+ diagnostics.push(...result.diagnostics);
31
+ }
32
+ else if (kind === 'file' && info.name.endsWith('.md')) {
33
+ const result = await loadTemplateFromFile(env, info.path);
34
+ if (result.promptTemplate)
35
+ promptTemplates.push(result.promptTemplate);
36
+ diagnostics.push(...result.diagnostics);
37
+ }
38
+ }
39
+ return { promptTemplates, diagnostics };
40
+ }
41
+ /**
42
+ * Load prompt templates from source-tagged paths.
43
+ *
44
+ * Source values are preserved exactly and attached to every loaded prompt template and diagnostic. The agent package does
45
+ * not interpret source values; applications define their own provenance shape.
46
+ */
47
+ export async function loadSourcedPromptTemplates(env, inputs, mapPromptTemplate) {
48
+ const promptTemplates = [];
49
+ const diagnostics = [];
50
+ for (const input of inputs) {
51
+ const result = await loadPromptTemplates(env, input.path);
52
+ for (const promptTemplate of result.promptTemplates) {
53
+ promptTemplates.push({
54
+ promptTemplate: mapPromptTemplate
55
+ ? mapPromptTemplate(promptTemplate, input.source)
56
+ : promptTemplate,
57
+ source: input.source,
58
+ });
59
+ }
60
+ for (const diagnostic of result.diagnostics)
61
+ diagnostics.push({ ...diagnostic, source: input.source });
62
+ }
63
+ return { promptTemplates, diagnostics };
64
+ }
65
+ async function loadTemplatesFromDir(env, dir) {
66
+ const promptTemplates = [];
67
+ const diagnostics = [];
68
+ const entriesResult = await env.listDir(dir);
69
+ if (!entriesResult.ok) {
70
+ diagnostics.push({
71
+ type: 'warning',
72
+ code: 'list_failed',
73
+ message: entriesResult.error.message,
74
+ path: dir,
75
+ });
76
+ return { promptTemplates, diagnostics };
77
+ }
78
+ const entries = entriesResult.value;
79
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
80
+ const kind = await resolveKind(env, entry, diagnostics);
81
+ if (kind !== 'file' || !entry.name.endsWith('.md'))
82
+ continue;
83
+ const result = await loadTemplateFromFile(env, entry.path);
84
+ if (result.promptTemplate)
85
+ promptTemplates.push(result.promptTemplate);
86
+ diagnostics.push(...result.diagnostics);
87
+ }
88
+ return { promptTemplates, diagnostics };
89
+ }
90
+ async function loadTemplateFromFile(env, filePath) {
91
+ const diagnostics = [];
92
+ const rawContent = await env.readTextFile(filePath);
93
+ if (!rawContent.ok) {
94
+ diagnostics.push({
95
+ type: 'warning',
96
+ code: 'read_failed',
97
+ message: rawContent.error.message,
98
+ path: filePath,
99
+ });
100
+ return { promptTemplate: null, diagnostics };
101
+ }
102
+ const parsed = parseFrontmatter(rawContent.value);
103
+ if (!parsed.ok) {
104
+ diagnostics.push({
105
+ type: 'warning',
106
+ code: 'parse_failed',
107
+ message: parsed.error.message,
108
+ path: filePath,
109
+ });
110
+ return { promptTemplate: null, diagnostics };
111
+ }
112
+ const { frontmatter, body } = parsed.value;
113
+ const firstLine = body.split('\n').find((line) => line.trim());
114
+ let description = typeof frontmatter.description === 'string' ? frontmatter.description : '';
115
+ if (!description && firstLine) {
116
+ description = firstLine.slice(0, 60);
117
+ if (firstLine.length > 60)
118
+ description += '...';
119
+ }
120
+ return {
121
+ promptTemplate: {
122
+ name: basenameEnvPath(filePath).replace(/\.md$/i, ''),
123
+ description,
124
+ content: body,
125
+ },
126
+ diagnostics,
127
+ };
128
+ }
129
+ async function resolveKind(env, info, diagnostics) {
130
+ if (info.kind === 'file' || info.kind === 'directory')
131
+ return info.kind;
132
+ const canonicalPath = await env.canonicalPath(info.path);
133
+ if (!canonicalPath.ok) {
134
+ if (canonicalPath.error.code !== 'not_found') {
135
+ diagnostics.push({
136
+ type: 'warning',
137
+ code: 'file_info_failed',
138
+ message: canonicalPath.error.message,
139
+ path: info.path,
140
+ });
141
+ }
142
+ return undefined;
143
+ }
144
+ const target = await env.fileInfo(canonicalPath.value);
145
+ if (!target.ok) {
146
+ if (target.error.code !== 'not_found') {
147
+ diagnostics.push({
148
+ type: 'warning',
149
+ code: 'file_info_failed',
150
+ message: target.error.message,
151
+ path: info.path,
152
+ });
153
+ }
154
+ return undefined;
155
+ }
156
+ return target.value.kind === 'file' || target.value.kind === 'directory'
157
+ ? target.value.kind
158
+ : undefined;
159
+ }
160
+ function parseFrontmatter(content) {
161
+ try {
162
+ const normalized = content.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
163
+ if (!normalized.startsWith('---'))
164
+ return { ok: true, value: { frontmatter: {}, body: normalized } };
165
+ const endIndex = normalized.indexOf('\n---', 3);
166
+ if (endIndex === -1)
167
+ return { ok: true, value: { frontmatter: {}, body: normalized } };
168
+ const yamlString = normalized.slice(4, endIndex);
169
+ const body = normalized.slice(endIndex + 4).trim();
170
+ return {
171
+ ok: true,
172
+ value: { frontmatter: (parse(yamlString) ?? {}), body },
173
+ };
174
+ }
175
+ catch (error) {
176
+ return { ok: false, error: toError(error) };
177
+ }
178
+ }
179
+ function basenameEnvPath(path) {
180
+ const normalized = path.replace(/\/+$/, '');
181
+ const slashIndex = normalized.lastIndexOf('/');
182
+ return slashIndex === -1 ? normalized : normalized.slice(slashIndex + 1);
183
+ }
184
+ /** Parse an argument string using simple shell-style single and double quotes. */
185
+ export function parseCommandArgs(argsString) {
186
+ const args = [];
187
+ let current = '';
188
+ let inQuote = null;
189
+ for (let i = 0; i < argsString.length; i++) {
190
+ const char = argsString[i];
191
+ if (inQuote) {
192
+ if (char === inQuote)
193
+ inQuote = null;
194
+ else
195
+ current += char;
196
+ }
197
+ else if (char === '"' || char === "'") {
198
+ inQuote = char;
199
+ }
200
+ else if (char === ' ' || char === '\t') {
201
+ if (current) {
202
+ args.push(current);
203
+ current = '';
204
+ }
205
+ }
206
+ else {
207
+ current += char;
208
+ }
209
+ }
210
+ if (current)
211
+ args.push(current);
212
+ return args;
213
+ }
214
+ /** Substitute prompt template placeholders (`$1`, `$@`, `$ARGUMENTS`, `${@:N}`, `${@:N:L}`) with command arguments. */
215
+ export function substituteArgs(content, args) {
216
+ let result = content;
217
+ result = result.replace(/\$(\d+)/g, (_, num) => args[parseInt(num, 10) - 1] ?? '');
218
+ result = result.replace(/\$\{@:(\d+)(?::(\d+))?\}/g, (_, startStr, lengthStr) => {
219
+ let start = parseInt(startStr, 10) - 1;
220
+ if (start < 0)
221
+ start = 0;
222
+ if (lengthStr)
223
+ return args.slice(start, start + parseInt(lengthStr, 10)).join(' ');
224
+ return args.slice(start).join(' ');
225
+ });
226
+ const allArgs = args.join(' ');
227
+ result = result.replace(/\$ARGUMENTS/g, allArgs);
228
+ result = result.replace(/\$@/g, allArgs);
229
+ return result;
230
+ }
231
+ /** Format a prompt template invocation with positional arguments. */
232
+ export function formatPromptTemplateInvocation(template, args = []) {
233
+ return substituteArgs(template.content, args);
234
+ }
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbXB0LXRlbXBsYXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWdlbnQtY29yZS9zcmMvaGFybmVzcy9wcm9tcHQtdGVtcGxhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUtMLE9BQU8sR0FDUixNQUFNLFlBQVksQ0FBQztBQTBCcEI7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxHQUFpQixFQUNqQixLQUF3QjtJQUt4QixNQUFNLGVBQWUsR0FBcUIsRUFBRSxDQUFDO0lBQzdDLE1BQU0sV0FBVyxHQUErQixFQUFFLENBQUM7SUFDbkQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQixJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUMxQyxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUNmLElBQUksRUFBRSxTQUFTO29CQUNmLElBQUksRUFBRSxrQkFBa0I7b0JBQ3hCLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU87b0JBQ2pDLElBQUk7aUJBQ0wsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLFdBQVcsQ0FB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
@@ -1,9 +1,14 @@
1
- import type { JsonlSessionCreateOptions, JsonlSessionListOptions, JsonlSessionMetadata, JsonlSessionRepoApi, Session } from '../../types.js';
1
+ import type { FileSystem, JsonlSessionCreateOptions, JsonlSessionListOptions, JsonlSessionMetadata, JsonlSessionRepoApi, Session } from '../types.ts';
2
+ type JsonlSessionRepoFileSystem = Pick<FileSystem, 'cwd' | 'absolutePath' | 'joinPath' | 'readTextFile' | 'readTextLines' | 'writeFile' | 'appendFile' | 'listDir' | 'exists' | 'createDir' | 'remove'>;
2
3
  export declare class JsonlSessionRepo implements JsonlSessionRepoApi {
4
+ private readonly fs;
5
+ private readonly sessionsRootInput;
3
6
  private sessionsRoot;
4
7
  constructor(options: {
8
+ fs: JsonlSessionRepoFileSystem;
5
9
  sessionsRoot: string;
6
10
  });
11
+ private getSessionsRoot;
7
12
  private getSessionDir;
8
13
  private createSessionFilePath;
9
14
  create(options: JsonlSessionCreateOptions): Promise<Session<JsonlSessionMetadata>>;
@@ -17,3 +22,4 @@ export declare class JsonlSessionRepo implements JsonlSessionRepoApi {
17
22
  }): Promise<Session<JsonlSessionMetadata>>;
18
23
  private listSessionDirs;
19
24
  }
25
+ export {};
@@ -0,0 +1,106 @@
1
+ import { SessionError, toError } from "../types.js";
2
+ import { JsonlSessionStorage, loadJsonlSessionMetadata, } from "./jsonl-storage.js";
3
+ import { createSessionId, createTimestamp, getEntriesToFork, getFileSystemResultOrThrow, toSession, } from "./repo-utils.js";
4
+ function encodeCwd(cwd) {
5
+ return `--${cwd.replace(/^[/\\]/, '').replace(/[/\\:]/g, '-')}--`;
6
+ }
7
+ export class JsonlSessionRepo {
8
+ fs;
9
+ sessionsRootInput;
10
+ sessionsRoot;
11
+ constructor(options) {
12
+ this.fs = options.fs;
13
+ this.sessionsRootInput = options.sessionsRoot;
14
+ }
15
+ async getSessionsRoot() {
16
+ if (!this.sessionsRoot) {
17
+ this.sessionsRoot = getFileSystemResultOrThrow(await this.fs.absolutePath(this.sessionsRootInput), `Failed to resolve sessions root ${this.sessionsRootInput}`);
18
+ }
19
+ return this.sessionsRoot;
20
+ }
21
+ async getSessionDir(cwd) {
22
+ return getFileSystemResultOrThrow(await this.fs.joinPath([await this.getSessionsRoot(), encodeCwd(cwd)]), `Failed to resolve session directory for ${cwd}`);
23
+ }
24
+ async createSessionFilePath(cwd, sessionId, timestamp) {
25
+ return getFileSystemResultOrThrow(await this.fs.joinPath([
26
+ await this.getSessionDir(cwd),
27
+ `${timestamp.replace(/[:.]/g, '-')}_${sessionId}.jsonl`,
28
+ ]), `Failed to resolve session file path for ${sessionId}`);
29
+ }
30
+ async create(options) {
31
+ const id = options.id ?? createSessionId();
32
+ const createdAt = createTimestamp();
33
+ const sessionDir = await this.getSessionDir(options.cwd);
34
+ getFileSystemResultOrThrow(await this.fs.createDir(sessionDir, { recursive: true }), `Failed to create session directory ${sessionDir}`);
35
+ const filePath = await this.createSessionFilePath(options.cwd, id, createdAt);
36
+ const storage = await JsonlSessionStorage.create(this.fs, filePath, {
37
+ cwd: options.cwd,
38
+ sessionId: id,
39
+ parentSessionPath: options.parentSessionPath,
40
+ });
41
+ return toSession(storage);
42
+ }
43
+ async open(metadata) {
44
+ if (!getFileSystemResultOrThrow(await this.fs.exists(metadata.path), `Failed to check session ${metadata.path}`)) {
45
+ throw new SessionError('not_found', `Session not found: ${metadata.path}`);
46
+ }
47
+ const storage = await JsonlSessionStorage.open(this.fs, metadata.path);
48
+ return toSession(storage);
49
+ }
50
+ async list(options = {}) {
51
+ const dirs = options.cwd
52
+ ? [await this.getSessionDir(options.cwd)]
53
+ : await this.listSessionDirs();
54
+ const sessions = [];
55
+ for (const dir of dirs) {
56
+ if (!getFileSystemResultOrThrow(await this.fs.exists(dir), `Failed to check session directory ${dir}`)) {
57
+ continue;
58
+ }
59
+ const files = getFileSystemResultOrThrow(await this.fs.listDir(dir), `Failed to list sessions in ${dir}`).filter((file) => file.kind !== 'directory' && file.name.endsWith('.jsonl'));
60
+ for (const file of files) {
61
+ try {
62
+ sessions.push(await loadJsonlSessionMetadata(this.fs, file.path));
63
+ }
64
+ catch (error) {
65
+ const cause = toError(error);
66
+ if (!(cause instanceof SessionError) ||
67
+ cause.code !== 'invalid_session')
68
+ throw cause;
69
+ }
70
+ }
71
+ }
72
+ sessions.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
73
+ return sessions;
74
+ }
75
+ async delete(metadata) {
76
+ getFileSystemResultOrThrow(await this.fs.remove(metadata.path, { force: true }), `Failed to delete session ${metadata.path}`);
77
+ }
78
+ async fork(sourceMetadata, options) {
79
+ const source = await this.open(sourceMetadata);
80
+ const forkedEntries = await getEntriesToFork(source.getStorage(), options);
81
+ const id = options.id ?? createSessionId();
82
+ const createdAt = createTimestamp();
83
+ const sessionDir = await this.getSessionDir(options.cwd);
84
+ getFileSystemResultOrThrow(await this.fs.createDir(sessionDir, { recursive: true }), `Failed to create session directory ${sessionDir}`);
85
+ const storage = await JsonlSessionStorage.create(this.fs, await this.createSessionFilePath(options.cwd, id, createdAt), {
86
+ cwd: options.cwd,
87
+ sessionId: id,
88
+ parentSessionPath: options.parentSessionPath ?? sourceMetadata.path,
89
+ });
90
+ for (const entry of forkedEntries) {
91
+ await storage.appendEntry(entry);
92
+ }
93
+ return toSession(storage);
94
+ }
95
+ async listSessionDirs() {
96
+ const sessionsRoot = await this.getSessionsRoot();
97
+ if (!getFileSystemResultOrThrow(await this.fs.exists(sessionsRoot), `Failed to check sessions root ${sessionsRoot}`)) {
98
+ return [];
99
+ }
100
+ const entries = getFileSystemResultOrThrow(await this.fs.listDir(sessionsRoot), `Failed to list sessions root ${sessionsRoot}`);
101
+ return entries
102
+ .filter((entry) => entry.kind === 'directory')
103
+ .map((entry) => entry.path);
104
+ }
105
+ }
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmwtcmVwby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWdlbnQtY29yZS9zcmMvaGFybmVzcy9zZXNzaW9uL2pzb25sLXJlcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQix3QkFBd0IsR0FDekIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLFNBQVMsR0FDVixNQUFNLGlCQUFpQixDQUFDO0FBaUJ6QixTQUFTLFNBQVMsQ0FBQyxHQUFXO0lBQzVCLE9BQU8sS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDcEUsQ0FBQztBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFDVixFQUFFLENBQTZCO0lBQy9CLGlCQUFpQixDQUFTO0lBQ25DLFlBQVksQ0FBcUI7SUFFekMsWUFBWSxPQUdYO1FBQ0MsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ2hELENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZTtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsMEJBQTBCLENBQzVDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQ2xELG1DQUFtQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FDNUQsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBVztRQUNyQyxPQUFPLDBCQUEwQixDQUMvQixNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFDdEUsMkNBQTJDLEdBQUcsRUFBRSxDQUNqRCxDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxxQkFBcUIsQ0FDakMsR0FBVyxFQUNYLFNBQWlCLEVBQ2pCLFNBQWlCO1FBRWpCLE9BQU8sMEJBQTBCLENBQy9CLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDckIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQztZQUM3QixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJLFNBQVMsUUFBUTtTQUN4RCxDQUFDLEVBQ0YsMkNBQTJDLFNBQVMsRUFBRSxDQUN2RCxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQ1YsT0FBa0M7UUFFbEMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELDBCQUEwQixDQUN4QixNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUN4RCxzQ0FBc0MsVUFBVSxFQUFFLENBQ25ELENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FDL0MsT0FBTyxDQUFDLEdBQUcsRUFDWCxFQUFFLEVBQ0YsU0FBUyxDQUNWLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRTtZQUNsRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsU0FBUyxFQUFFLEVBQUU7WUFDYixpQkFBaUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCO1NBQzdDLENBQUMsQ0FBQztRQUNILE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUNSLFFBQThCO1FBRTlCLElBQ0UsQ0FBQywwQkFBMEIsQ0FDekIsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQ25DLDJCQUEyQixRQUFRLENBQUMsSUFBSSxFQUFFLENBQzNDLEVBQ0QsQ0FBQztZQUNELE1BQU0sSUFBSSxZQUFZLENBQ3BCLFdBQVcsRUFDWCxzQkFBc0IsUUFBUSxDQUFDLElBQUksRUFBRSxDQUN0QyxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUNSLFVBQW1DLEVBQUU7UUFFckMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUc7WUFDdEIsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQTJCLEVBQUUsQ0FBQztRQUM1QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQ0UsQ0FBQywwQkFBMEIsQ0FDekIsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFDekIscUNBQXFDLEdBQUcsRUFBRSxDQUMzQyxFQUNELENBQUM7Z0JBQ0QsU0FBUztZQUNYLENBQUM7WUFDRCxNQUFNLEtBQUssR0FBRywwQkFBMEIsQ0FDdEMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFDMUIsOEJBQThCLEdBQUcsRUFBRSxDQUNwQyxDQUFDLE1BQU0sQ0FDTixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQ3BFLENBQUM7WUFDRixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUM7b0JBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLHdCQUF3QixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzdCLElBQ0UsQ0FBQyxDQUFDLEtBQUssWUFBWSxZQUFZLENBQUM7d0JBQ2hDLEtBQUssQ0FBQyxJQUFJLEtBQUssaUJBQWlCO3dCQUVoQyxNQUFNLEtBQUssQ0FBQztnQkFDaEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsUUFBUSxDQUFDLElBQUksQ0FDWCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNQLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQ3BFLENBQUM7UUFDRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUE4QjtRQUN6QywwQkFBMEIsQ0FDeEIsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQ3BELDRCQUE0QixRQUFRLENBQUMsSUFBSSxFQUFFLENBQzVDLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FDUixjQUFvQyxFQUNwQyxPQUlDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sYUFBYSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksZUFBZSxFQUFFLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6RCwwQkFBMEIsQ0FDeEIsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFDeEQsc0NBQXNDLFVBQVUsRUFBRSxDQUNuRCxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxNQUFNLENBQzlDLElBQUksQ0FBQyxFQUFFLEVBQ1AsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLEVBQzVEO1lBQ0UsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQ2hCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixJQUFJLGNBQWMsQ0FBQyxJQUFJO1NBQ3BFLENBQ0YsQ0FBQztRQUNGLEtBQUssTUFBTSxLQUFLLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEMsTUFBTSxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWU7UUFDM0IsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbEQsSUFDRSxDQUFDLDBCQUEwQixDQUN6QixNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUNsQyxpQ0FBaUMsWUFBWSxFQUFFLENBQ2hELEVBQ0QsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLDBCQUEwQixDQUN4QyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUNuQyxnQ0FBZ0MsWUFBWSxFQUFFLENBQy9DLENBQUM7UUFDRixPQUFPLE9BQU87YUFDWCxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDO2FBQzdDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Q0FDRiJ9
@@ -1,6 +1,8 @@
1
- import type { JsonlSessionMetadata, SessionStorage, SessionTreeEntry } from '../../types.js';
2
- export declare function loadJsonlSessionMetadata(filePath: string): Promise<JsonlSessionMetadata>;
1
+ import type { FileSystem, JsonlSessionMetadata, SessionStorage, SessionTreeEntry } from '../types.ts';
2
+ type JsonlSessionStorageFileSystem = Pick<FileSystem, 'readTextFile' | 'readTextLines' | 'writeFile' | 'appendFile'>;
3
+ export declare function loadJsonlSessionMetadata(fs: JsonlSessionStorageFileSystem, filePath: string): Promise<JsonlSessionMetadata>;
3
4
  export declare class JsonlSessionStorage implements SessionStorage<JsonlSessionMetadata> {
5
+ private readonly fs;
4
6
  private readonly filePath;
5
7
  private readonly metadata;
6
8
  private entries;
@@ -8,8 +10,8 @@ export declare class JsonlSessionStorage implements SessionStorage<JsonlSessionM
8
10
  private labelsById;
9
11
  private currentLeafId;
10
12
  private constructor();
11
- static open(filePath: string): Promise<JsonlSessionStorage>;
12
- static create(filePath: string, options: {
13
+ static open(fs: JsonlSessionStorageFileSystem, filePath: string): Promise<JsonlSessionStorage>;
14
+ static create(fs: JsonlSessionStorageFileSystem, filePath: string, options: {
13
15
  cwd: string;
14
16
  sessionId: string;
15
17
  parentSessionPath?: string;
@@ -27,3 +29,4 @@ export declare class JsonlSessionStorage implements SessionStorage<JsonlSessionM
27
29
  getPathToRoot(leafId: string | null): Promise<SessionTreeEntry[]>;
28
30
  getEntries(): Promise<SessionTreeEntry[]>;
29
31
  }
32
+ export {};