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,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmwtcmVwby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWdlbnQtY29yZS9zcmMvaGFybmVzcy9zZXNzaW9uL2pzb25sLXJlcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQix3QkFBd0IsR0FDekIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLFNBQVMsR0FDVixNQUFNLGlCQUFpQixDQUFDO0FBaUJ6QixTQUFTLFNBQVMsQ0FBQyxHQUFXO0lBQzVCLE9BQU8sS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDcEUsQ0FBQztBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFDVixFQUFFLENBQTZCO0lBQy9CLGlCQUFpQixDQUFTO0lBQ25DLFlBQVksQ0FBcUI7SUFFekMsWUFBWSxPQUdYO1FBQ0MsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ2hELENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZTtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsMEJBQTBCLENBQzVDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQ2xELG1DQUFtQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FDNUQsQ0FBQztRQUNK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
@@ -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 {};