psadk 1.3.7 → 1.4.3

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 (136) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +150 -0
  3. package/build/main/index.d.ts +1 -0
  4. package/build/main/index.js +2 -1
  5. package/build/main/lib/PSAI.d.ts +16 -1
  6. package/build/main/lib/PSAI.js +264 -79
  7. package/build/main/lib/PSAgent.js +77 -60
  8. package/build/main/lib/PSAgentConfig.d.ts +3 -0
  9. package/build/main/lib/PSAgentLogger.js +12 -9
  10. package/build/main/lib/PSAgentTask.js +4 -1
  11. package/build/main/lib/PSAgentTool.js +12 -2
  12. package/build/main/lib/agent-core/agent-loop.d.ts +23 -0
  13. package/build/main/lib/agent-core/agent-loop.js +483 -0
  14. package/build/main/lib/agent-core/agent.d.ts +124 -0
  15. package/build/main/lib/agent-core/agent.js +419 -0
  16. package/build/main/lib/agent-core/harness/agent-harness.d.ts +84 -0
  17. package/build/main/lib/agent-core/harness/agent-harness.js +772 -0
  18. package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +87 -0
  19. package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +246 -0
  20. package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +121 -0
  21. package/build/main/lib/agent-core/harness/compaction/compaction.js +637 -0
  22. package/build/main/lib/agent-core/harness/compaction/utils.d.ts +37 -0
  23. package/build/main/lib/agent-core/harness/compaction/utils.js +153 -0
  24. package/build/main/lib/agent-core/harness/env/nodejs.d.ts +43 -0
  25. package/build/main/lib/agent-core/harness/env/nodejs.js +353 -0
  26. package/build/main/lib/agent-core/harness/execution-env.d.ts +3 -0
  27. package/build/main/lib/agent-core/harness/execution-env.js +3 -0
  28. package/build/main/lib/agent-core/harness/messages.d.ts +50 -0
  29. package/build/main/lib/agent-core/harness/messages.js +116 -0
  30. package/build/main/lib/agent-core/harness/prompt-templates.d.ts +44 -0
  31. package/build/main/lib/agent-core/harness/prompt-templates.js +204 -0
  32. package/build/main/lib/agent-core/harness/session/repo/jsonl.d.ts +19 -0
  33. package/build/main/lib/agent-core/harness/session/repo/jsonl.js +98 -0
  34. package/build/main/lib/agent-core/harness/session/repo/memory.d.ts +17 -0
  35. package/build/main/lib/agent-core/harness/session/repo/memory.js +46 -0
  36. package/build/main/lib/agent-core/harness/session/repo/shared.d.ts +9 -0
  37. package/build/main/lib/agent-core/harness/session/repo/shared.js +31 -0
  38. package/build/main/lib/agent-core/harness/session/session.d.ts +31 -0
  39. package/build/main/lib/agent-core/harness/session/session.js +199 -0
  40. package/build/main/lib/agent-core/harness/session/storage/jsonl.d.ts +29 -0
  41. package/build/main/lib/agent-core/harness/session/storage/jsonl.js +170 -0
  42. package/build/main/lib/agent-core/harness/session/storage/memory.d.ts +25 -0
  43. package/build/main/lib/agent-core/harness/session/storage/memory.js +94 -0
  44. package/build/main/lib/agent-core/harness/skills.d.ts +40 -0
  45. package/build/main/lib/agent-core/harness/skills.js +266 -0
  46. package/build/main/lib/agent-core/harness/system-prompt.d.ts +2 -0
  47. package/build/main/lib/agent-core/harness/system-prompt.js +30 -0
  48. package/build/main/lib/agent-core/harness/types.d.ts +524 -0
  49. package/build/main/lib/agent-core/harness/types.js +16 -0
  50. package/build/main/lib/agent-core/harness/utils/shell-output.d.ts +13 -0
  51. package/build/main/lib/agent-core/harness/utils/shell-output.js +101 -0
  52. package/build/main/lib/agent-core/harness/utils/truncate.d.ts +69 -0
  53. package/build/main/lib/agent-core/harness/utils/truncate.js +208 -0
  54. package/build/main/lib/agent-core/index.d.ts +19 -0
  55. package/build/main/lib/agent-core/index.js +25 -0
  56. package/build/main/lib/agent-core/package.json +3 -0
  57. package/build/main/lib/agent-core/proxy.d.ts +68 -0
  58. package/build/main/lib/agent-core/proxy.js +294 -0
  59. package/build/main/lib/agent-core/types.d.ts +385 -0
  60. package/build/main/lib/agent-core/types.js +2 -0
  61. package/build/main/lib/skills/constants.js +6 -4
  62. package/build/main/lib/skills/skillParser.js +2 -2
  63. package/build/main/lib/skills/utils.js +8 -10
  64. package/build/main/lib/tools/BraveWebSearchTool.js +4 -3
  65. package/build/main/lib/tools/PSArtifactTool.js +3 -3
  66. package/build/main/lib/tools/PSClarifyTool.js +3 -2
  67. package/build/main/lib/tools/PSCommandLineTool.js +8 -7
  68. package/build/main/lib/tools/PSMemoryTool.js +9 -7
  69. package/build/main/lib/tools/PSReadFileTool.js +3 -3
  70. package/build/main/lib/tools/PSRetrievalTool.d.ts +127 -0
  71. package/build/main/lib/tools/PSRetrievalTool.js +172 -0
  72. package/build/main/lib/tools/PSSkillTool.js +6 -4
  73. package/build/main/lib/tools/PSSubAgentTool.js +4 -5
  74. package/build/main/lib/tools/PSWriteFileTool.js +3 -3
  75. package/build/main/lib/tools/TodoTool.js +8 -4
  76. package/build/main/lib/utils/helpers.d.ts +34 -0
  77. package/build/main/lib/utils/helpers.js +281 -13
  78. package/build/module/index.d.ts +1 -0
  79. package/build/module/index.js +2 -1
  80. package/build/module/lib/PSAI.d.ts +16 -1
  81. package/build/module/lib/PSAI.js +229 -85
  82. package/build/module/lib/PSAgentConfig.d.ts +3 -0
  83. package/build/module/lib/agent-core/agent-loop.d.ts +23 -0
  84. package/build/module/lib/agent-core/agent-loop.js +483 -0
  85. package/build/module/lib/agent-core/agent.d.ts +124 -0
  86. package/build/module/lib/agent-core/agent.js +419 -0
  87. package/build/module/lib/agent-core/harness/agent-harness.d.ts +84 -0
  88. package/build/module/lib/agent-core/harness/agent-harness.js +772 -0
  89. package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +87 -0
  90. package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +246 -0
  91. package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +121 -0
  92. package/build/module/lib/agent-core/harness/compaction/compaction.js +637 -0
  93. package/build/module/lib/agent-core/harness/compaction/utils.d.ts +37 -0
  94. package/build/module/lib/agent-core/harness/compaction/utils.js +153 -0
  95. package/build/module/lib/agent-core/harness/env/nodejs.d.ts +43 -0
  96. package/build/module/lib/agent-core/harness/env/nodejs.js +353 -0
  97. package/build/module/lib/agent-core/harness/execution-env.d.ts +3 -0
  98. package/build/module/lib/agent-core/harness/execution-env.js +3 -0
  99. package/build/module/lib/agent-core/harness/messages.d.ts +50 -0
  100. package/build/module/lib/agent-core/harness/messages.js +116 -0
  101. package/build/module/lib/agent-core/harness/prompt-templates.d.ts +44 -0
  102. package/build/module/lib/agent-core/harness/prompt-templates.js +204 -0
  103. package/build/module/lib/agent-core/harness/session/repo/jsonl.d.ts +19 -0
  104. package/build/module/lib/agent-core/harness/session/repo/jsonl.js +98 -0
  105. package/build/module/lib/agent-core/harness/session/repo/memory.d.ts +17 -0
  106. package/build/module/lib/agent-core/harness/session/repo/memory.js +46 -0
  107. package/build/module/lib/agent-core/harness/session/repo/shared.d.ts +9 -0
  108. package/build/module/lib/agent-core/harness/session/repo/shared.js +31 -0
  109. package/build/module/lib/agent-core/harness/session/session.d.ts +31 -0
  110. package/build/module/lib/agent-core/harness/session/session.js +199 -0
  111. package/build/module/lib/agent-core/harness/session/storage/jsonl.d.ts +29 -0
  112. package/build/module/lib/agent-core/harness/session/storage/jsonl.js +170 -0
  113. package/build/module/lib/agent-core/harness/session/storage/memory.d.ts +25 -0
  114. package/build/module/lib/agent-core/harness/session/storage/memory.js +94 -0
  115. package/build/module/lib/agent-core/harness/skills.d.ts +40 -0
  116. package/build/module/lib/agent-core/harness/skills.js +266 -0
  117. package/build/module/lib/agent-core/harness/system-prompt.d.ts +2 -0
  118. package/build/module/lib/agent-core/harness/system-prompt.js +30 -0
  119. package/build/module/lib/agent-core/harness/types.d.ts +524 -0
  120. package/build/module/lib/agent-core/harness/types.js +16 -0
  121. package/build/module/lib/agent-core/harness/utils/shell-output.d.ts +13 -0
  122. package/build/module/lib/agent-core/harness/utils/shell-output.js +101 -0
  123. package/build/module/lib/agent-core/harness/utils/truncate.d.ts +69 -0
  124. package/build/module/lib/agent-core/harness/utils/truncate.js +208 -0
  125. package/build/module/lib/agent-core/index.d.ts +19 -0
  126. package/build/module/lib/agent-core/index.js +25 -0
  127. package/build/module/lib/agent-core/proxy.d.ts +68 -0
  128. package/build/module/lib/agent-core/proxy.js +294 -0
  129. package/build/module/lib/agent-core/types.d.ts +385 -0
  130. package/build/module/lib/agent-core/types.js +2 -0
  131. package/build/module/lib/tools/PSRetrievalTool.d.ts +127 -0
  132. package/build/module/lib/tools/PSRetrievalTool.js +172 -0
  133. package/build/module/lib/tools/PSSkillTool.js +1 -1
  134. package/build/module/lib/utils/helpers.d.ts +34 -0
  135. package/build/module/lib/utils/helpers.js +280 -1
  136. package/package.json +20 -3
@@ -0,0 +1,294 @@
1
+ /**
2
+ * Proxy stream function for apps that route LLM calls through a server.
3
+ * The server manages auth and proxies requests to LLM providers.
4
+ */
5
+ // Internal import for JSON parsing utility
6
+ import { EventStream, parseStreamingJson, } from '@earendil-works/pi-ai';
7
+ // Create stream class matching ProxyMessageEventStream
8
+ class ProxyMessageEventStream extends EventStream {
9
+ constructor() {
10
+ super((event) => event.type === 'done' || event.type === 'error', (event) => {
11
+ if (event.type === 'done')
12
+ return event.message;
13
+ if (event.type === 'error')
14
+ return event.error;
15
+ throw new Error('Unexpected event type');
16
+ });
17
+ }
18
+ }
19
+ /**
20
+ * Stream function that proxies through a server instead of calling LLM providers directly.
21
+ * The server strips the partial field from delta events to reduce bandwidth.
22
+ * We reconstruct the partial message client-side.
23
+ *
24
+ * Use this as the `streamFn` option when creating an Agent that needs to go through a proxy.
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const agent = new Agent({
29
+ * streamFn: (model, context, options) =>
30
+ * streamProxy(model, context, {
31
+ * ...options,
32
+ * authToken: await getAuthToken(),
33
+ * proxyUrl: "https://genai.example.com",
34
+ * }),
35
+ * });
36
+ * ```
37
+ */
38
+ function buildProxyRequestOptions(options) {
39
+ return {
40
+ temperature: options.temperature,
41
+ maxTokens: options.maxTokens,
42
+ reasoning: options.reasoning,
43
+ cacheRetention: options.cacheRetention,
44
+ sessionId: options.sessionId,
45
+ headers: options.headers,
46
+ metadata: options.metadata,
47
+ transport: options.transport,
48
+ thinkingBudgets: options.thinkingBudgets,
49
+ maxRetryDelayMs: options.maxRetryDelayMs,
50
+ };
51
+ }
52
+ export function streamProxy(model, context, options) {
53
+ const stream = new ProxyMessageEventStream();
54
+ (async () => {
55
+ // Initialize the partial message that we'll build up from events
56
+ const partial = {
57
+ role: 'assistant',
58
+ stopReason: 'stop',
59
+ content: [],
60
+ api: model.api,
61
+ provider: model.provider,
62
+ model: model.id,
63
+ usage: {
64
+ input: 0,
65
+ output: 0,
66
+ cacheRead: 0,
67
+ cacheWrite: 0,
68
+ totalTokens: 0,
69
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
70
+ },
71
+ timestamp: Date.now(),
72
+ };
73
+ let reader;
74
+ const abortHandler = () => {
75
+ if (reader) {
76
+ reader.cancel('Request aborted by user').catch(() => { });
77
+ }
78
+ };
79
+ if (options.signal) {
80
+ options.signal.addEventListener('abort', abortHandler);
81
+ }
82
+ try {
83
+ const response = await fetch(`${options.proxyUrl}/api/stream`, {
84
+ method: 'POST',
85
+ headers: {
86
+ Authorization: `Bearer ${options.authToken}`,
87
+ 'Content-Type': 'application/json',
88
+ },
89
+ body: JSON.stringify({
90
+ model,
91
+ context,
92
+ options: buildProxyRequestOptions(options),
93
+ }),
94
+ signal: options.signal,
95
+ });
96
+ if (!response.ok) {
97
+ let errorMessage = `Proxy error: ${response.status} ${response.statusText}`;
98
+ try {
99
+ const errorData = (await response.json());
100
+ if (errorData.error) {
101
+ errorMessage = `Proxy error: ${errorData.error}`;
102
+ }
103
+ }
104
+ catch {
105
+ // Couldn't parse error response
106
+ }
107
+ throw new Error(errorMessage);
108
+ }
109
+ reader = response.body.getReader();
110
+ const decoder = new TextDecoder();
111
+ let buffer = '';
112
+ while (true) {
113
+ const { done, value } = await reader.read();
114
+ if (done)
115
+ break;
116
+ if (options.signal?.aborted) {
117
+ throw new Error('Request aborted by user');
118
+ }
119
+ buffer += decoder.decode(value, { stream: true });
120
+ const lines = buffer.split('\n');
121
+ buffer = lines.pop() || '';
122
+ for (const line of lines) {
123
+ if (line.startsWith('data: ')) {
124
+ const data = line.slice(6).trim();
125
+ if (data) {
126
+ const proxyEvent = JSON.parse(data);
127
+ const event = processProxyEvent(proxyEvent, partial);
128
+ if (event) {
129
+ stream.push(event);
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ if (options.signal?.aborted) {
136
+ throw new Error('Request aborted by user');
137
+ }
138
+ stream.end();
139
+ }
140
+ catch (error) {
141
+ const errorMessage = error instanceof Error ? error.message : String(error);
142
+ const reason = options.signal?.aborted ? 'aborted' : 'error';
143
+ partial.stopReason = reason;
144
+ partial.errorMessage = errorMessage;
145
+ stream.push({
146
+ type: 'error',
147
+ reason,
148
+ error: partial,
149
+ });
150
+ stream.end();
151
+ }
152
+ finally {
153
+ if (options.signal) {
154
+ options.signal.removeEventListener('abort', abortHandler);
155
+ }
156
+ }
157
+ })();
158
+ return stream;
159
+ }
160
+ /**
161
+ * Process a proxy event and update the partial message.
162
+ */
163
+ function processProxyEvent(proxyEvent, partial) {
164
+ switch (proxyEvent.type) {
165
+ case 'start':
166
+ return { type: 'start', partial };
167
+ case 'text_start':
168
+ partial.content[proxyEvent.contentIndex] = { type: 'text', text: '' };
169
+ return {
170
+ type: 'text_start',
171
+ contentIndex: proxyEvent.contentIndex,
172
+ partial,
173
+ };
174
+ case 'text_delta': {
175
+ const content = partial.content[proxyEvent.contentIndex];
176
+ if (content?.type === 'text') {
177
+ content.text += proxyEvent.delta;
178
+ return {
179
+ type: 'text_delta',
180
+ contentIndex: proxyEvent.contentIndex,
181
+ delta: proxyEvent.delta,
182
+ partial,
183
+ };
184
+ }
185
+ throw new Error('Received text_delta for non-text content');
186
+ }
187
+ case 'text_end': {
188
+ const content = partial.content[proxyEvent.contentIndex];
189
+ if (content?.type === 'text') {
190
+ content.textSignature = proxyEvent.contentSignature;
191
+ return {
192
+ type: 'text_end',
193
+ contentIndex: proxyEvent.contentIndex,
194
+ content: content.text,
195
+ partial,
196
+ };
197
+ }
198
+ throw new Error('Received text_end for non-text content');
199
+ }
200
+ case 'thinking_start':
201
+ partial.content[proxyEvent.contentIndex] = {
202
+ type: 'thinking',
203
+ thinking: '',
204
+ };
205
+ return {
206
+ type: 'thinking_start',
207
+ contentIndex: proxyEvent.contentIndex,
208
+ partial,
209
+ };
210
+ case 'thinking_delta': {
211
+ const content = partial.content[proxyEvent.contentIndex];
212
+ if (content?.type === 'thinking') {
213
+ content.thinking += proxyEvent.delta;
214
+ return {
215
+ type: 'thinking_delta',
216
+ contentIndex: proxyEvent.contentIndex,
217
+ delta: proxyEvent.delta,
218
+ partial,
219
+ };
220
+ }
221
+ throw new Error('Received thinking_delta for non-thinking content');
222
+ }
223
+ case 'thinking_end': {
224
+ const content = partial.content[proxyEvent.contentIndex];
225
+ if (content?.type === 'thinking') {
226
+ content.thinkingSignature = proxyEvent.contentSignature;
227
+ return {
228
+ type: 'thinking_end',
229
+ contentIndex: proxyEvent.contentIndex,
230
+ content: content.thinking,
231
+ partial,
232
+ };
233
+ }
234
+ throw new Error('Received thinking_end for non-thinking content');
235
+ }
236
+ case 'toolcall_start':
237
+ partial.content[proxyEvent.contentIndex] = {
238
+ type: 'toolCall',
239
+ id: proxyEvent.id,
240
+ name: proxyEvent.toolName,
241
+ arguments: {},
242
+ partialJson: '',
243
+ };
244
+ return {
245
+ type: 'toolcall_start',
246
+ contentIndex: proxyEvent.contentIndex,
247
+ partial,
248
+ };
249
+ case 'toolcall_delta': {
250
+ const content = partial.content[proxyEvent.contentIndex];
251
+ if (content?.type === 'toolCall') {
252
+ content.partialJson += proxyEvent.delta;
253
+ content.arguments =
254
+ parseStreamingJson(content.partialJson) || {};
255
+ partial.content[proxyEvent.contentIndex] = { ...content }; // Trigger reactivity
256
+ return {
257
+ type: 'toolcall_delta',
258
+ contentIndex: proxyEvent.contentIndex,
259
+ delta: proxyEvent.delta,
260
+ partial,
261
+ };
262
+ }
263
+ throw new Error('Received toolcall_delta for non-toolCall content');
264
+ }
265
+ case 'toolcall_end': {
266
+ const content = partial.content[proxyEvent.contentIndex];
267
+ if (content?.type === 'toolCall') {
268
+ delete content.partialJson;
269
+ return {
270
+ type: 'toolcall_end',
271
+ contentIndex: proxyEvent.contentIndex,
272
+ toolCall: content,
273
+ partial,
274
+ };
275
+ }
276
+ return undefined;
277
+ }
278
+ case 'done':
279
+ partial.stopReason = proxyEvent.reason;
280
+ partial.usage = proxyEvent.usage;
281
+ return { type: 'done', reason: proxyEvent.reason, message: partial };
282
+ case 'error':
283
+ partial.stopReason = proxyEvent.reason;
284
+ partial.errorMessage = proxyEvent.errorMessage;
285
+ partial.usage = proxyEvent.usage;
286
+ return { type: 'error', reason: proxyEvent.reason, error: partial };
287
+ default: {
288
+ void proxyEvent;
289
+ console.warn(`Unhandled proxy event type: ${proxyEvent.type}`);
290
+ return undefined;
291
+ }
292
+ }
293
+ }
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2FnZW50LWNvcmUvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsMkNBQTJDO0FBQzNDLE9BQU8sRUFJTCxXQUFXLEVBRVgsa0JBQWtCLEdBSW5CLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsdURBQXVEO0FBQ3ZELE1BQU0sdUJBQXdCLFNBQVEsV0FHckM7SUFDQztRQUNFLEtBQUssQ0FDSCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQzFELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTTtnQkFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDaEQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU87Z0JBQUUsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXdERDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FDL0IsT0FBMkI7SUFFM0IsT0FBTztRQUNMLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztRQUN0QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7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