psadk 1.4.1 → 1.4.4

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 (111) hide show
  1. package/build/main/index.d.ts +1 -0
  2. package/build/main/index.js +2 -1
  3. package/build/main/lib/PSAI.d.ts +11 -2
  4. package/build/main/lib/PSAI.js +145 -28
  5. package/build/main/lib/agent-core/agent-loop.d.ts +2 -2
  6. package/build/main/lib/agent-core/agent-loop.js +69 -65
  7. package/build/main/lib/agent-core/agent.d.ts +8 -8
  8. package/build/main/lib/agent-core/agent.js +61 -44
  9. package/build/main/lib/agent-core/harness/agent-harness.d.ts +4 -4
  10. package/build/main/lib/agent-core/harness/agent-harness.js +156 -112
  11. package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +5 -5
  12. package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +31 -28
  13. package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +5 -5
  14. package/build/main/lib/agent-core/harness/compaction/compaction.js +99 -78
  15. package/build/main/lib/agent-core/harness/compaction/utils.d.ts +2 -2
  16. package/build/main/lib/agent-core/harness/compaction/utils.js +30 -30
  17. package/build/main/lib/agent-core/harness/env/nodejs.d.ts +1 -1
  18. package/build/main/lib/agent-core/harness/env/nodejs.js +80 -75
  19. package/build/main/lib/agent-core/harness/execution-env.d.ts +3 -3
  20. package/build/main/lib/agent-core/harness/execution-env.js +3 -3
  21. package/build/main/lib/agent-core/harness/messages.d.ts +7 -7
  22. package/build/main/lib/agent-core/harness/messages.js +36 -22
  23. package/build/main/lib/agent-core/harness/prompt-templates.d.ts +2 -2
  24. package/build/main/lib/agent-core/harness/prompt-templates.js +31 -27
  25. package/build/main/lib/agent-core/harness/session/repo/jsonl.d.ts +2 -2
  26. package/build/main/lib/agent-core/harness/session/repo/jsonl.js +17 -11
  27. package/build/main/lib/agent-core/harness/session/repo/memory.d.ts +2 -2
  28. package/build/main/lib/agent-core/harness/session/repo/memory.js +8 -4
  29. package/build/main/lib/agent-core/harness/session/repo/shared.d.ts +3 -3
  30. package/build/main/lib/agent-core/harness/session/repo/shared.js +5 -5
  31. package/build/main/lib/agent-core/harness/session/session.d.ts +3 -3
  32. package/build/main/lib/agent-core/harness/session/session.js +26 -23
  33. package/build/main/lib/agent-core/harness/session/storage/jsonl.d.ts +2 -2
  34. package/build/main/lib/agent-core/harness/session/storage/jsonl.js +11 -11
  35. package/build/main/lib/agent-core/harness/session/storage/memory.d.ts +2 -2
  36. package/build/main/lib/agent-core/harness/session/storage/memory.js +10 -6
  37. package/build/main/lib/agent-core/harness/skills.d.ts +2 -2
  38. package/build/main/lib/agent-core/harness/skills.js +55 -48
  39. package/build/main/lib/agent-core/harness/system-prompt.d.ts +1 -1
  40. package/build/main/lib/agent-core/harness/system-prompt.js +16 -16
  41. package/build/main/lib/agent-core/harness/types.d.ts +43 -43
  42. package/build/main/lib/agent-core/harness/types.js +2 -2
  43. package/build/main/lib/agent-core/harness/utils/shell-output.d.ts +2 -2
  44. package/build/main/lib/agent-core/harness/utils/shell-output.js +18 -14
  45. package/build/main/lib/agent-core/harness/utils/truncate.d.ts +1 -1
  46. package/build/main/lib/agent-core/harness/utils/truncate.js +27 -24
  47. package/build/main/lib/agent-core/index.d.ts +19 -19
  48. package/build/main/lib/agent-core/index.js +20 -20
  49. package/build/main/lib/agent-core/proxy.d.ts +18 -18
  50. package/build/main/lib/agent-core/proxy.js +77 -61
  51. package/build/main/lib/agent-core/types.d.ts +16 -16
  52. package/build/main/lib/tools/PSRetrievalTool.d.ts +127 -0
  53. package/build/main/lib/tools/PSRetrievalTool.js +172 -0
  54. package/build/main/lib/utils/helpers.d.ts +34 -0
  55. package/build/main/lib/utils/helpers.js +280 -1
  56. package/build/module/index.d.ts +1 -0
  57. package/build/module/index.js +2 -1
  58. package/build/module/lib/PSAI.d.ts +11 -2
  59. package/build/module/lib/PSAI.js +145 -28
  60. package/build/module/lib/agent-core/agent-loop.d.ts +2 -2
  61. package/build/module/lib/agent-core/agent-loop.js +69 -65
  62. package/build/module/lib/agent-core/agent.d.ts +8 -8
  63. package/build/module/lib/agent-core/agent.js +61 -44
  64. package/build/module/lib/agent-core/harness/agent-harness.d.ts +4 -4
  65. package/build/module/lib/agent-core/harness/agent-harness.js +156 -112
  66. package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +5 -5
  67. package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +31 -28
  68. package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +5 -5
  69. package/build/module/lib/agent-core/harness/compaction/compaction.js +99 -78
  70. package/build/module/lib/agent-core/harness/compaction/utils.d.ts +2 -2
  71. package/build/module/lib/agent-core/harness/compaction/utils.js +30 -30
  72. package/build/module/lib/agent-core/harness/env/nodejs.d.ts +1 -1
  73. package/build/module/lib/agent-core/harness/env/nodejs.js +80 -75
  74. package/build/module/lib/agent-core/harness/execution-env.d.ts +3 -3
  75. package/build/module/lib/agent-core/harness/execution-env.js +3 -3
  76. package/build/module/lib/agent-core/harness/messages.d.ts +7 -7
  77. package/build/module/lib/agent-core/harness/messages.js +36 -22
  78. package/build/module/lib/agent-core/harness/prompt-templates.d.ts +2 -2
  79. package/build/module/lib/agent-core/harness/prompt-templates.js +31 -27
  80. package/build/module/lib/agent-core/harness/session/repo/jsonl.d.ts +2 -2
  81. package/build/module/lib/agent-core/harness/session/repo/jsonl.js +17 -11
  82. package/build/module/lib/agent-core/harness/session/repo/memory.d.ts +2 -2
  83. package/build/module/lib/agent-core/harness/session/repo/memory.js +8 -4
  84. package/build/module/lib/agent-core/harness/session/repo/shared.d.ts +3 -3
  85. package/build/module/lib/agent-core/harness/session/repo/shared.js +5 -5
  86. package/build/module/lib/agent-core/harness/session/session.d.ts +3 -3
  87. package/build/module/lib/agent-core/harness/session/session.js +26 -23
  88. package/build/module/lib/agent-core/harness/session/storage/jsonl.d.ts +2 -2
  89. package/build/module/lib/agent-core/harness/session/storage/jsonl.js +11 -11
  90. package/build/module/lib/agent-core/harness/session/storage/memory.d.ts +2 -2
  91. package/build/module/lib/agent-core/harness/session/storage/memory.js +10 -6
  92. package/build/module/lib/agent-core/harness/skills.d.ts +2 -2
  93. package/build/module/lib/agent-core/harness/skills.js +55 -48
  94. package/build/module/lib/agent-core/harness/system-prompt.d.ts +1 -1
  95. package/build/module/lib/agent-core/harness/system-prompt.js +16 -16
  96. package/build/module/lib/agent-core/harness/types.d.ts +43 -43
  97. package/build/module/lib/agent-core/harness/types.js +2 -2
  98. package/build/module/lib/agent-core/harness/utils/shell-output.d.ts +2 -2
  99. package/build/module/lib/agent-core/harness/utils/shell-output.js +18 -14
  100. package/build/module/lib/agent-core/harness/utils/truncate.d.ts +1 -1
  101. package/build/module/lib/agent-core/harness/utils/truncate.js +27 -24
  102. package/build/module/lib/agent-core/index.d.ts +19 -19
  103. package/build/module/lib/agent-core/index.js +20 -20
  104. package/build/module/lib/agent-core/proxy.d.ts +18 -18
  105. package/build/module/lib/agent-core/proxy.js +77 -61
  106. package/build/module/lib/agent-core/types.d.ts +16 -16
  107. package/build/module/lib/tools/PSRetrievalTool.d.ts +127 -0
  108. package/build/module/lib/tools/PSRetrievalTool.js +172 -0
  109. package/build/module/lib/utils/helpers.d.ts +34 -0
  110. package/build/module/lib/utils/helpers.js +280 -1
  111. package/package.json +1 -1
@@ -3,16 +3,16 @@
3
3
  * The server manages auth and proxies requests to LLM providers.
4
4
  */
5
5
  // Internal import for JSON parsing utility
6
- import { EventStream, parseStreamingJson, } from "@earendil-works/pi-ai";
6
+ import { EventStream, parseStreamingJson, } from '@earendil-works/pi-ai';
7
7
  // Create stream class matching ProxyMessageEventStream
8
8
  class ProxyMessageEventStream extends EventStream {
9
9
  constructor() {
10
- super((event) => event.type === "done" || event.type === "error", (event) => {
11
- if (event.type === "done")
10
+ super((event) => event.type === 'done' || event.type === 'error', (event) => {
11
+ if (event.type === 'done')
12
12
  return event.message;
13
- if (event.type === "error")
13
+ if (event.type === 'error')
14
14
  return event.error;
15
- throw new Error("Unexpected event type");
15
+ throw new Error('Unexpected event type');
16
16
  });
17
17
  }
18
18
  }
@@ -54,8 +54,8 @@ export function streamProxy(model, context, options) {
54
54
  (async () => {
55
55
  // Initialize the partial message that we'll build up from events
56
56
  const partial = {
57
- role: "assistant",
58
- stopReason: "stop",
57
+ role: 'assistant',
58
+ stopReason: 'stop',
59
59
  content: [],
60
60
  api: model.api,
61
61
  provider: model.provider,
@@ -73,18 +73,18 @@ export function streamProxy(model, context, options) {
73
73
  let reader;
74
74
  const abortHandler = () => {
75
75
  if (reader) {
76
- reader.cancel("Request aborted by user").catch(() => { });
76
+ reader.cancel('Request aborted by user').catch(() => { });
77
77
  }
78
78
  };
79
79
  if (options.signal) {
80
- options.signal.addEventListener("abort", abortHandler);
80
+ options.signal.addEventListener('abort', abortHandler);
81
81
  }
82
82
  try {
83
83
  const response = await fetch(`${options.proxyUrl}/api/stream`, {
84
- method: "POST",
84
+ method: 'POST',
85
85
  headers: {
86
86
  Authorization: `Bearer ${options.authToken}`,
87
- "Content-Type": "application/json",
87
+ 'Content-Type': 'application/json',
88
88
  },
89
89
  body: JSON.stringify({
90
90
  model,
@@ -108,19 +108,19 @@ export function streamProxy(model, context, options) {
108
108
  }
109
109
  reader = response.body.getReader();
110
110
  const decoder = new TextDecoder();
111
- let buffer = "";
111
+ let buffer = '';
112
112
  while (true) {
113
113
  const { done, value } = await reader.read();
114
114
  if (done)
115
115
  break;
116
116
  if (options.signal?.aborted) {
117
- throw new Error("Request aborted by user");
117
+ throw new Error('Request aborted by user');
118
118
  }
119
119
  buffer += decoder.decode(value, { stream: true });
120
- const lines = buffer.split("\n");
121
- buffer = lines.pop() || "";
120
+ const lines = buffer.split('\n');
121
+ buffer = lines.pop() || '';
122
122
  for (const line of lines) {
123
- if (line.startsWith("data: ")) {
123
+ if (line.startsWith('data: ')) {
124
124
  const data = line.slice(6).trim();
125
125
  if (data) {
126
126
  const proxyEvent = JSON.parse(data);
@@ -133,17 +133,17 @@ export function streamProxy(model, context, options) {
133
133
  }
134
134
  }
135
135
  if (options.signal?.aborted) {
136
- throw new Error("Request aborted by user");
136
+ throw new Error('Request aborted by user');
137
137
  }
138
138
  stream.end();
139
139
  }
140
140
  catch (error) {
141
141
  const errorMessage = error instanceof Error ? error.message : String(error);
142
- const reason = options.signal?.aborted ? "aborted" : "error";
142
+ const reason = options.signal?.aborted ? 'aborted' : 'error';
143
143
  partial.stopReason = reason;
144
144
  partial.errorMessage = errorMessage;
145
145
  stream.push({
146
- type: "error",
146
+ type: 'error',
147
147
  reason,
148
148
  error: partial,
149
149
  });
@@ -151,7 +151,7 @@ export function streamProxy(model, context, options) {
151
151
  }
152
152
  finally {
153
153
  if (options.signal) {
154
- options.signal.removeEventListener("abort", abortHandler);
154
+ options.signal.removeEventListener('abort', abortHandler);
155
155
  }
156
156
  }
157
157
  })();
@@ -162,96 +162,112 @@ export function streamProxy(model, context, options) {
162
162
  */
163
163
  function processProxyEvent(proxyEvent, partial) {
164
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 { type: "text_start", contentIndex: proxyEvent.contentIndex, partial };
170
- case "text_delta": {
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': {
171
175
  const content = partial.content[proxyEvent.contentIndex];
172
- if (content?.type === "text") {
176
+ if (content?.type === 'text') {
173
177
  content.text += proxyEvent.delta;
174
178
  return {
175
- type: "text_delta",
179
+ type: 'text_delta',
176
180
  contentIndex: proxyEvent.contentIndex,
177
181
  delta: proxyEvent.delta,
178
182
  partial,
179
183
  };
180
184
  }
181
- throw new Error("Received text_delta for non-text content");
185
+ throw new Error('Received text_delta for non-text content');
182
186
  }
183
- case "text_end": {
187
+ case 'text_end': {
184
188
  const content = partial.content[proxyEvent.contentIndex];
185
- if (content?.type === "text") {
189
+ if (content?.type === 'text') {
186
190
  content.textSignature = proxyEvent.contentSignature;
187
191
  return {
188
- type: "text_end",
192
+ type: 'text_end',
189
193
  contentIndex: proxyEvent.contentIndex,
190
194
  content: content.text,
191
195
  partial,
192
196
  };
193
197
  }
194
- throw new Error("Received text_end for non-text content");
198
+ throw new Error('Received text_end for non-text content');
195
199
  }
196
- case "thinking_start":
197
- partial.content[proxyEvent.contentIndex] = { type: "thinking", thinking: "" };
198
- return { type: "thinking_start", contentIndex: proxyEvent.contentIndex, partial };
199
- case "thinking_delta": {
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': {
200
211
  const content = partial.content[proxyEvent.contentIndex];
201
- if (content?.type === "thinking") {
212
+ if (content?.type === 'thinking') {
202
213
  content.thinking += proxyEvent.delta;
203
214
  return {
204
- type: "thinking_delta",
215
+ type: 'thinking_delta',
205
216
  contentIndex: proxyEvent.contentIndex,
206
217
  delta: proxyEvent.delta,
207
218
  partial,
208
219
  };
209
220
  }
210
- throw new Error("Received thinking_delta for non-thinking content");
221
+ throw new Error('Received thinking_delta for non-thinking content');
211
222
  }
212
- case "thinking_end": {
223
+ case 'thinking_end': {
213
224
  const content = partial.content[proxyEvent.contentIndex];
214
- if (content?.type === "thinking") {
225
+ if (content?.type === 'thinking') {
215
226
  content.thinkingSignature = proxyEvent.contentSignature;
216
227
  return {
217
- type: "thinking_end",
228
+ type: 'thinking_end',
218
229
  contentIndex: proxyEvent.contentIndex,
219
230
  content: content.thinking,
220
231
  partial,
221
232
  };
222
233
  }
223
- throw new Error("Received thinking_end for non-thinking content");
234
+ throw new Error('Received thinking_end for non-thinking content');
224
235
  }
225
- case "toolcall_start":
236
+ case 'toolcall_start':
226
237
  partial.content[proxyEvent.contentIndex] = {
227
- type: "toolCall",
238
+ type: 'toolCall',
228
239
  id: proxyEvent.id,
229
240
  name: proxyEvent.toolName,
230
241
  arguments: {},
231
- partialJson: "",
242
+ partialJson: '',
243
+ };
244
+ return {
245
+ type: 'toolcall_start',
246
+ contentIndex: proxyEvent.contentIndex,
247
+ partial,
232
248
  };
233
- return { type: "toolcall_start", contentIndex: proxyEvent.contentIndex, partial };
234
- case "toolcall_delta": {
249
+ case 'toolcall_delta': {
235
250
  const content = partial.content[proxyEvent.contentIndex];
236
- if (content?.type === "toolCall") {
251
+ if (content?.type === 'toolCall') {
237
252
  content.partialJson += proxyEvent.delta;
238
- content.arguments = parseStreamingJson(content.partialJson) || {};
253
+ content.arguments =
254
+ parseStreamingJson(content.partialJson) || {};
239
255
  partial.content[proxyEvent.contentIndex] = { ...content }; // Trigger reactivity
240
256
  return {
241
- type: "toolcall_delta",
257
+ type: 'toolcall_delta',
242
258
  contentIndex: proxyEvent.contentIndex,
243
259
  delta: proxyEvent.delta,
244
260
  partial,
245
261
  };
246
262
  }
247
- throw new Error("Received toolcall_delta for non-toolCall content");
263
+ throw new Error('Received toolcall_delta for non-toolCall content');
248
264
  }
249
- case "toolcall_end": {
265
+ case 'toolcall_end': {
250
266
  const content = partial.content[proxyEvent.contentIndex];
251
- if (content?.type === "toolCall") {
267
+ if (content?.type === 'toolCall') {
252
268
  delete content.partialJson;
253
269
  return {
254
- type: "toolcall_end",
270
+ type: 'toolcall_end',
255
271
  contentIndex: proxyEvent.contentIndex,
256
272
  toolCall: content,
257
273
  partial,
@@ -259,15 +275,15 @@ function processProxyEvent(proxyEvent, partial) {
259
275
  }
260
276
  return undefined;
261
277
  }
262
- case "done":
278
+ case 'done':
263
279
  partial.stopReason = proxyEvent.reason;
264
280
  partial.usage = proxyEvent.usage;
265
- return { type: "done", reason: proxyEvent.reason, message: partial };
266
- case "error":
281
+ return { type: 'done', reason: proxyEvent.reason, message: partial };
282
+ case 'error':
267
283
  partial.stopReason = proxyEvent.reason;
268
284
  partial.errorMessage = proxyEvent.errorMessage;
269
285
  partial.usage = proxyEvent.usage;
270
- return { type: "error", reason: proxyEvent.reason, error: partial };
286
+ return { type: 'error', reason: proxyEvent.reason, error: partial };
271
287
  default: {
272
288
  void proxyEvent;
273
289
  console.warn(`Unhandled proxy event type: ${proxyEvent.type}`);
@@ -275,4 +291,4 @@ function processProxyEvent(proxyEvent, partial) {
275
291
  }
276
292
  }
277
293
  }
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2FnZW50LWNvcmUvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsMkNBQTJDO0FBQzNDLE9BQU8sRUFJTixXQUFXLEVBRVgsa0JBQWtCLEdBSWxCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsdURBQXVEO0FBQ3ZELE1BQU0sdUJBQXdCLFNBQVEsV0FBb0Q7SUFDekY7UUFDQyxLQUFLLENBQ0osQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUMxRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU07Z0JBQUUsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2hELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPO2dCQUFFLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUNELENBQUM7SUFDSCxDQUFDO0NBQ0Q7QUFtREQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILFNBQVMsd0JBQXdCLENBQUMsT0FBMkI7SUFDNUQsT0FBTztRQUNOLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztRQUN0QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7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
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2FnZW50LWNvcmUvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsMkNBQTJDO0FBQzNDLE9BQU8sRUFJTCxXQUFXLEVBRVgsa0JBQWtCLEdBSW5CLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsdURBQXVEO0FBQ3ZELE1BQU0sdUJBQXdCLFNBQVEsV0FHckM7SUFDQztRQUNFLEtBQUssQ0FDSCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQzFELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTTtnQkFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDaEQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU87Z0JBQUUsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXdERDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FDL0IsT0FBMkI7SUFFM0IsT0FBTztRQUNMLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztRQUN0QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7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
@@ -1,5 +1,5 @@
1
- import type { AssistantMessage, AssistantMessageEvent, ImageContent, Message, Model, SimpleStreamOptions, streamSimple, TextContent, Tool, ToolResultMessage } from "@earendil-works/pi-ai";
2
- import type { Static, TSchema } from "typebox";
1
+ import type { AssistantMessage, AssistantMessageEvent, ImageContent, Message, Model, SimpleStreamOptions, streamSimple, TextContent, Tool, ToolResultMessage } from '@earendil-works/pi-ai';
2
+ import type { Static, TSchema } from 'typebox';
3
3
  /**
4
4
  * Stream function used by the agent loop.
5
5
  *
@@ -18,10 +18,10 @@ export type StreamFn = (...args: Parameters<typeof streamSimple>) => ReturnType<
18
18
  * `tool_execution_end` is emitted in tool completion order after each tool is finalized,
19
19
  * while tool-result message artifacts are emitted later in assistant source order.
20
20
  */
21
- export type ToolExecutionMode = "sequential" | "parallel";
21
+ export type ToolExecutionMode = 'sequential' | 'parallel';
22
22
  /** A single tool call content block emitted by an assistant message. */
23
- export type AgentToolCall = Extract<AssistantMessage["content"][number], {
24
- type: "toolCall";
23
+ export type AgentToolCall = Extract<AssistantMessage['content'][number], {
24
+ type: 'toolCall';
25
25
  }>;
26
26
  /**
27
27
  * Result returned from `beforeToolCall`.
@@ -239,7 +239,7 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
239
239
  * Note: "xhigh" is only supported by selected model families. Use model thinking-level metadata
240
240
  * from @earendil-works/pi-ai to detect support for a concrete model.
241
241
  */
242
- export type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
242
+ export type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
243
243
  /**
244
244
  * Extensible interface for custom app messages.
245
245
  * Apps can extend via declaration merging:
@@ -345,39 +345,39 @@ export interface AgentContext {
345
345
  * idle only after those listeners finish.
346
346
  */
347
347
  export type AgentEvent = {
348
- type: "agent_start";
348
+ type: 'agent_start';
349
349
  } | {
350
- type: "agent_end";
350
+ type: 'agent_end';
351
351
  messages: AgentMessage[];
352
352
  } | {
353
- type: "turn_start";
353
+ type: 'turn_start';
354
354
  } | {
355
- type: "turn_end";
355
+ type: 'turn_end';
356
356
  message: AgentMessage;
357
357
  toolResults: ToolResultMessage[];
358
358
  } | {
359
- type: "message_start";
359
+ type: 'message_start';
360
360
  message: AgentMessage;
361
361
  } | {
362
- type: "message_update";
362
+ type: 'message_update';
363
363
  message: AgentMessage;
364
364
  assistantMessageEvent: AssistantMessageEvent;
365
365
  } | {
366
- type: "message_end";
366
+ type: 'message_end';
367
367
  message: AgentMessage;
368
368
  } | {
369
- type: "tool_execution_start";
369
+ type: 'tool_execution_start';
370
370
  toolCallId: string;
371
371
  toolName: string;
372
372
  args: any;
373
373
  } | {
374
- type: "tool_execution_update";
374
+ type: 'tool_execution_update';
375
375
  toolCallId: string;
376
376
  toolName: string;
377
377
  args: any;
378
378
  partialResult: any;
379
379
  } | {
380
- type: "tool_execution_end";
380
+ type: 'tool_execution_end';
381
381
  toolCallId: string;
382
382
  toolName: string;
383
383
  result: any;
@@ -0,0 +1,127 @@
1
+ import { IStreamLogger } from '../PSAgentLogger';
2
+ import { PSAgentTool } from '../PSAgentTool';
3
+ /**
4
+ * Minimum shape for an embedding entity. Consumers extend this with
5
+ * their own fields (metadata, source, timestamps, etc.).
6
+ */
7
+ export interface IEmbeddingEntity {
8
+ content: string;
9
+ }
10
+ /**
11
+ * Anything that can turn text into a vector.
12
+ *
13
+ * `PSAI` satisfies this interface out of the box, but consumers can
14
+ * provide their own OpenAI client, Cohere SDK, local model wrapper, etc.
15
+ */
16
+ export interface IEmbeddingProvider {
17
+ embedQuery(text: string): Promise<number[]>;
18
+ }
19
+ /**
20
+ * A single search result returned by the repository.
21
+ */
22
+ export interface IEmbeddingSearchResult<T extends IEmbeddingEntity> {
23
+ /** The matched entity. */
24
+ entity: T;
25
+ /** Similarity score in the range [0, 1] where 1 is an exact match. */
26
+ similarity: number;
27
+ }
28
+ /**
29
+ * Storage-agnostic repository interface for similarity search.
30
+ *
31
+ * Consumers implement this for their own stack — TypeORM + pgvector,
32
+ * Prisma, Pinecone, Weaviate, in-memory, etc.
33
+ */
34
+ export interface IEmbeddingRepository<T extends IEmbeddingEntity> {
35
+ /**
36
+ * Find the `limit` most similar entities to `queryEmbedding`.
37
+ *
38
+ * Implementations must return results ordered by similarity descending
39
+ * and clamp similarity values to [0, 1].
40
+ */
41
+ findSimilar(queryEmbedding: number[], limit: number): Promise<Array<IEmbeddingSearchResult<T>>>;
42
+ }
43
+ /**
44
+ * Configuration for PSRetrievalTool.
45
+ */
46
+ export interface PSRetrievalToolOptions<T extends IEmbeddingEntity = IEmbeddingEntity> {
47
+ /** Repository that performs the actual similarity search. */
48
+ repository: IEmbeddingRepository<T>;
49
+ /** Provider that converts text queries into embedding vectors. */
50
+ embeddingProvider: IEmbeddingProvider;
51
+ /** Default number of results to return (1–20, default: 5). */
52
+ topK?: number;
53
+ /**
54
+ * Override the default tool name (`search_knowledge_base`).
55
+ * Useful when an agent has multiple retrieval tools (docs, tickets, FAQ).
56
+ */
57
+ name?: string;
58
+ /**
59
+ * Override the default tool description.
60
+ */
61
+ description?: string;
62
+ /**
63
+ * Custom result formatter. Receives each entity, its similarity score
64
+ * (0–1), and its 0-based index. Returns a markdown string for that result.
65
+ *
66
+ * When omitted, the default formatter renders content in a code block
67
+ * with a similarity percentage header.
68
+ */
69
+ formatResult?: (entity: T, similarity: number, index: number) => string;
70
+ }
71
+ /**
72
+ * PSRetrievalTool — A tool for semantic similarity search over embedded
73
+ * documents.
74
+ *
75
+ * The tool is storage-agnostic: consumers provide an {@link IEmbeddingRepository}
76
+ * implementation for their own database/vector store, and an
77
+ * {@link IEmbeddingProvider} for embedding queries.
78
+ *
79
+ * @example
80
+ * ```ts
81
+ * // Basic usage (PSAI implements IEmbeddingProvider)
82
+ * const tool = new PSRetrievalTool({
83
+ * repository: myEmbeddingRepo,
84
+ * embeddingProvider: psai,
85
+ * });
86
+ * ```
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * // Multiple retrieval tools with custom names
91
+ * const docsTool = new PSRetrievalTool({
92
+ * repository: docsRepo,
93
+ * embeddingProvider: psai,
94
+ * name: 'search_docs',
95
+ * description: 'Search the documentation knowledge base.',
96
+ * });
97
+ *
98
+ * const ticketsTool = new PSRetrievalTool({
99
+ * repository: ticketsRepo,
100
+ * embeddingProvider: psai,
101
+ * name: 'search_tickets',
102
+ * description: 'Search past support tickets.',
103
+ * });
104
+ * ```
105
+ *
106
+ * @example
107
+ * ```ts
108
+ * // Custom result formatting
109
+ * const tool = new PSRetrievalTool({
110
+ * repository: myRepo,
111
+ * embeddingProvider: psai,
112
+ * formatResult: (entity, similarity, index) => {
113
+ * const meta = (entity as any).metadata || {};
114
+ * return `**${index + 1}.** [${(similarity * 100).toFixed(0)}%] ${meta.title ?? 'Untitled'}\n${entity.content}\n`;
115
+ * },
116
+ * });
117
+ * ```
118
+ */
119
+ export declare class PSRetrievalTool<T extends IEmbeddingEntity = IEmbeddingEntity> extends PSAgentTool {
120
+ static readonly toolName = "search_knowledge_base";
121
+ private repository;
122
+ private embeddingProvider;
123
+ private topK;
124
+ private formatResult;
125
+ constructor(options: PSRetrievalToolOptions<T>);
126
+ run(input: Record<string, any>, log?: IStreamLogger): Promise<Record<string, any>>;
127
+ }