@perstack/core 0.0.52 → 0.0.54

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 (122) hide show
  1. package/dist/src/adapters/event-creators.d.ts +26 -0
  2. package/dist/src/adapters/event-creators.d.ts.map +1 -0
  3. package/dist/src/adapters/event-creators.js +126 -0
  4. package/dist/src/adapters/event-creators.js.map +1 -0
  5. package/dist/src/adapters/index.d.ts +2 -0
  6. package/dist/src/adapters/index.d.ts.map +1 -0
  7. package/dist/src/adapters/index.js +2 -0
  8. package/dist/src/adapters/index.js.map +1 -0
  9. package/dist/src/constants/constants.d.ts +11 -0
  10. package/dist/src/constants/constants.d.ts.map +1 -0
  11. package/dist/src/constants/constants.js +13 -0
  12. package/dist/src/constants/constants.js.map +1 -0
  13. package/dist/src/errors.d.ts +4 -0
  14. package/dist/src/errors.d.ts.map +1 -0
  15. package/dist/src/errors.js +7 -0
  16. package/dist/src/errors.js.map +1 -0
  17. package/dist/src/index.d.ts +28 -6219
  18. package/dist/src/index.d.ts.map +1 -0
  19. package/dist/src/index.js +28 -1904
  20. package/dist/src/index.js.map +1 -1
  21. package/dist/src/known-models/index.d.ts +9 -0
  22. package/dist/src/known-models/index.d.ts.map +1 -0
  23. package/dist/src/known-models/index.js +216 -0
  24. package/dist/src/known-models/index.js.map +1 -0
  25. package/dist/src/schemas/activity.d.ts +2159 -0
  26. package/dist/src/schemas/activity.d.ts.map +1 -0
  27. package/dist/src/schemas/activity.js +209 -0
  28. package/dist/src/schemas/activity.js.map +1 -0
  29. package/dist/src/schemas/checkpoint.d.ts +338 -0
  30. package/dist/src/schemas/checkpoint.d.ts.map +1 -0
  31. package/dist/src/schemas/checkpoint.js +69 -0
  32. package/dist/src/schemas/checkpoint.js.map +1 -0
  33. package/dist/src/schemas/expert.d.ts +309 -0
  34. package/dist/src/schemas/expert.d.ts.map +1 -0
  35. package/dist/src/schemas/expert.js +70 -0
  36. package/dist/src/schemas/expert.js.map +1 -0
  37. package/dist/src/schemas/job.d.ts +44 -0
  38. package/dist/src/schemas/job.d.ts.map +1 -0
  39. package/dist/src/schemas/job.js +22 -0
  40. package/dist/src/schemas/job.js.map +1 -0
  41. package/dist/src/schemas/lockfile.d.ts +143 -0
  42. package/dist/src/schemas/lockfile.d.ts.map +1 -0
  43. package/dist/src/schemas/lockfile.js +26 -0
  44. package/dist/src/schemas/lockfile.js.map +1 -0
  45. package/dist/src/schemas/message-part.d.ts +239 -0
  46. package/dist/src/schemas/message-part.d.ts.map +1 -0
  47. package/dist/src/schemas/message-part.js +80 -0
  48. package/dist/src/schemas/message-part.js.map +1 -0
  49. package/dist/src/schemas/message.d.ts +236 -0
  50. package/dist/src/schemas/message.d.ts.map +1 -0
  51. package/dist/src/schemas/message.js +44 -0
  52. package/dist/src/schemas/message.js.map +1 -0
  53. package/dist/src/schemas/perstack-toml.d.ts +366 -0
  54. package/dist/src/schemas/perstack-toml.d.ts.map +1 -0
  55. package/dist/src/schemas/perstack-toml.js +175 -0
  56. package/dist/src/schemas/perstack-toml.js.map +1 -0
  57. package/dist/src/schemas/provider-config.d.ts +216 -0
  58. package/dist/src/schemas/provider-config.d.ts.map +1 -0
  59. package/dist/src/schemas/provider-config.js +86 -0
  60. package/dist/src/schemas/provider-config.js.map +1 -0
  61. package/dist/src/schemas/provider-tools.d.ts +93 -0
  62. package/dist/src/schemas/provider-tools.d.ts.map +1 -0
  63. package/dist/src/schemas/provider-tools.js +60 -0
  64. package/dist/src/schemas/provider-tools.js.map +1 -0
  65. package/dist/src/schemas/run-command.d.ts +127 -0
  66. package/dist/src/schemas/run-command.d.ts.map +1 -0
  67. package/dist/src/schemas/run-command.js +82 -0
  68. package/dist/src/schemas/run-command.js.map +1 -0
  69. package/dist/src/schemas/runtime-version.d.ts +4 -0
  70. package/dist/src/schemas/runtime-version.d.ts.map +1 -0
  71. package/dist/src/schemas/runtime-version.js +6 -0
  72. package/dist/src/schemas/runtime-version.js.map +1 -0
  73. package/dist/src/schemas/runtime.d.ts +1317 -0
  74. package/dist/src/schemas/runtime.d.ts.map +1 -0
  75. package/dist/src/schemas/runtime.js +205 -0
  76. package/dist/src/schemas/runtime.js.map +1 -0
  77. package/dist/src/schemas/skill-manager.d.ts +64 -0
  78. package/dist/src/schemas/skill-manager.d.ts.map +1 -0
  79. package/dist/src/schemas/skill-manager.js +2 -0
  80. package/dist/src/schemas/skill-manager.js.map +1 -0
  81. package/dist/src/schemas/skill.d.ts +147 -0
  82. package/dist/src/schemas/skill.d.ts.map +1 -0
  83. package/dist/src/schemas/skill.js +99 -0
  84. package/dist/src/schemas/skill.js.map +1 -0
  85. package/dist/src/schemas/step.d.ts +370 -0
  86. package/dist/src/schemas/step.d.ts.map +1 -0
  87. package/dist/src/schemas/step.js +21 -0
  88. package/dist/src/schemas/step.js.map +1 -0
  89. package/dist/src/schemas/tool-call.d.ts +19 -0
  90. package/dist/src/schemas/tool-call.d.ts.map +1 -0
  91. package/dist/src/schemas/tool-call.js +10 -0
  92. package/dist/src/schemas/tool-call.js.map +1 -0
  93. package/dist/src/schemas/tool-result.d.ts +86 -0
  94. package/dist/src/schemas/tool-result.d.ts.map +1 -0
  95. package/dist/src/schemas/tool-result.js +11 -0
  96. package/dist/src/schemas/tool-result.js.map +1 -0
  97. package/dist/src/schemas/usage.d.ts +22 -0
  98. package/dist/src/schemas/usage.d.ts.map +1 -0
  99. package/dist/src/schemas/usage.js +10 -0
  100. package/dist/src/schemas/usage.js.map +1 -0
  101. package/dist/src/utils/activity.d.ts +20 -0
  102. package/dist/src/utils/activity.d.ts.map +1 -0
  103. package/dist/src/utils/activity.js +449 -0
  104. package/dist/src/utils/activity.js.map +1 -0
  105. package/dist/src/utils/env-filter.d.ts +4 -0
  106. package/dist/src/utils/env-filter.d.ts.map +1 -0
  107. package/dist/src/utils/env-filter.js +50 -0
  108. package/dist/src/utils/env-filter.js.map +1 -0
  109. package/dist/src/utils/event-filter.d.ts +16 -0
  110. package/dist/src/utils/event-filter.d.ts.map +1 -0
  111. package/dist/src/utils/event-filter.js +31 -0
  112. package/dist/src/utils/event-filter.js.map +1 -0
  113. package/dist/src/utils/expert-type.d.ts +38 -0
  114. package/dist/src/utils/expert-type.d.ts.map +1 -0
  115. package/dist/src/utils/expert-type.js +88 -0
  116. package/dist/src/utils/expert-type.js.map +1 -0
  117. package/dist/src/utils/zod-error.d.ts +4 -0
  118. package/dist/src/utils/zod-error.d.ts.map +1 -0
  119. package/dist/src/utils/zod-error.js +17 -0
  120. package/dist/src/utils/zod-error.js.map +1 -0
  121. package/package.json +19 -17
  122. package/LICENSE +0 -202
@@ -0,0 +1,449 @@
1
+ export const BASE_SKILL_PREFIX = "@perstack/base";
2
+ /**
3
+ * Extracts reasoning from Step.newMessages by finding thinkingParts.
4
+ */
5
+ function extractReasoning(newMessages) {
6
+ const thinkingParts = [];
7
+ for (const message of newMessages) {
8
+ for (const content of message.contents) {
9
+ if (content.type === "thinkingPart") {
10
+ thinkingParts.push(content);
11
+ }
12
+ }
13
+ }
14
+ if (thinkingParts.length === 0)
15
+ return undefined;
16
+ return thinkingParts.map((p) => p.thinking).join("\n\n");
17
+ }
18
+ /**
19
+ * Wraps multiple activities into a ParallelActivitiesGroup when they share reasoning.
20
+ * Single activities are returned as-is.
21
+ */
22
+ function wrapInGroupIfParallel(activities, reasoning, expertKey, runId, stepNumber) {
23
+ if (activities.length <= 1) {
24
+ // Single activity - return as-is with reasoning
25
+ return activities;
26
+ }
27
+ // Multiple activities - wrap in a group with shared reasoning
28
+ // Remove reasoning from individual activities since it's on the group
29
+ const activitiesWithoutReasoning = activities.map((a) => {
30
+ const { reasoning: _, ...rest } = a;
31
+ return rest;
32
+ });
33
+ const group = {
34
+ type: "parallelGroup",
35
+ id: `parallel-${runId}-step${stepNumber}`,
36
+ expertKey,
37
+ runId,
38
+ reasoning,
39
+ activities: activitiesWithoutReasoning,
40
+ };
41
+ return [group];
42
+ }
43
+ /**
44
+ * Computes activities from a checkpoint and step.
45
+ * Returns an array of activities or activity groups, supporting parallel tool calls and delegations.
46
+ * When multiple activities are produced from a single step, they are wrapped in a ParallelActivitiesGroup
47
+ * with shared reasoning.
48
+ */
49
+ export function getActivities(params) {
50
+ const { checkpoint, step } = params;
51
+ const { status, delegateTo, runId, stepNumber } = checkpoint;
52
+ const expertKey = checkpoint.expert.key;
53
+ const reasoning = extractReasoning(step.newMessages);
54
+ // Generate QueryActivity for first step (parity with processRunEventToActivity)
55
+ let queryActivity;
56
+ if (stepNumber === 1 && step.inputMessages) {
57
+ const userMessage = step.inputMessages.find((m) => m.type === "userMessage");
58
+ if (userMessage) {
59
+ const textPart = userMessage.contents.find((c) => c.type === "textPart");
60
+ if (textPart && "text" in textPart) {
61
+ queryActivity = {
62
+ type: "query",
63
+ id: "",
64
+ expertKey,
65
+ runId,
66
+ text: textPart.text,
67
+ };
68
+ }
69
+ }
70
+ }
71
+ const prependQuery = (result) => queryActivity ? [queryActivity, ...result] : result;
72
+ // Error status - use checkpoint error information
73
+ if (status === "stoppedByError") {
74
+ return prependQuery([createErrorActivity(checkpoint, reasoning)]);
75
+ }
76
+ // Parallel delegate activities - each delegation becomes a separate activity
77
+ if (status === "stoppedByDelegate") {
78
+ if (!delegateTo || delegateTo.length === 0) {
79
+ return prependQuery([
80
+ createRetryActivity(step.newMessages, reasoning, "Delegate status but no delegation targets"),
81
+ ]);
82
+ }
83
+ const delegateActivities = delegateTo.map((d) => createDelegateActivity(d, reasoning));
84
+ return prependQuery(wrapInGroupIfParallel(delegateActivities, reasoning, expertKey, runId, stepNumber));
85
+ }
86
+ // Interactive tool activities - may be parallel
87
+ if (status === "stoppedByInteractiveTool") {
88
+ const toolCalls = step.toolCalls ?? [];
89
+ if (toolCalls.length === 0) {
90
+ return prependQuery([createRetryActivity(step.newMessages, reasoning)]);
91
+ }
92
+ const interactiveActivities = toolCalls.map((tc) => createInteractiveToolActivity(tc.skillName, tc.toolName, tc, reasoning));
93
+ return prependQuery(wrapInGroupIfParallel(interactiveActivities, reasoning, expertKey, runId, stepNumber));
94
+ }
95
+ // Normal tool activities - may be parallel
96
+ const toolCalls = step.toolCalls ?? [];
97
+ const toolResults = step.toolResults ?? [];
98
+ // For completed status with no tool calls, return CompleteActivity only
99
+ if (toolCalls.length === 0) {
100
+ if (status === "completed") {
101
+ return prependQuery([createCompleteActivity(step.newMessages, reasoning)]);
102
+ }
103
+ if (status === "proceeding" || status === "init") {
104
+ return prependQuery([]);
105
+ }
106
+ return prependQuery([createRetryActivity(step.newMessages, reasoning)]);
107
+ }
108
+ const toolActivities = [];
109
+ for (const toolCall of toolCalls) {
110
+ const toolResult = toolResults.find((tr) => tr.id === toolCall.id);
111
+ if (!toolResult) {
112
+ // No result yet for this tool call, skip
113
+ continue;
114
+ }
115
+ const { skillName, toolName } = toolCall;
116
+ if (skillName.startsWith(BASE_SKILL_PREFIX)) {
117
+ toolActivities.push(createBaseToolActivity(toolName, toolCall, toolResult, reasoning));
118
+ }
119
+ else {
120
+ toolActivities.push(createGeneralToolActivity(skillName, toolName, toolCall, toolResult, reasoning));
121
+ }
122
+ }
123
+ if (toolActivities.length === 0) {
124
+ if (status === "completed") {
125
+ return prependQuery([createCompleteActivity(step.newMessages, reasoning)]);
126
+ }
127
+ if (status === "proceeding" || status === "init") {
128
+ return prependQuery([]);
129
+ }
130
+ return prependQuery([createRetryActivity(step.newMessages, reasoning)]);
131
+ }
132
+ const result = wrapInGroupIfParallel(toolActivities, reasoning, expertKey, runId, stepNumber);
133
+ // Append CompleteActivity for completed status
134
+ if (status === "completed") {
135
+ result.push(createCompleteActivity(step.newMessages, undefined));
136
+ }
137
+ return prependQuery(result);
138
+ }
139
+ function createCompleteActivity(newMessages, reasoning) {
140
+ // Extract final text from the last expertMessage's textPart
141
+ const lastExpertMessage = [...newMessages].reverse().find((m) => m.type === "expertMessage");
142
+ const textPart = lastExpertMessage?.contents.find((c) => c.type === "textPart");
143
+ return {
144
+ type: "complete",
145
+ id: "",
146
+ expertKey: "",
147
+ runId: "",
148
+ reasoning,
149
+ text: textPart?.text ?? "",
150
+ };
151
+ }
152
+ function createDelegateActivity(delegate, reasoning) {
153
+ return {
154
+ type: "delegate",
155
+ id: "",
156
+ expertKey: "",
157
+ runId: "",
158
+ reasoning,
159
+ delegateExpertKey: delegate.expert.key,
160
+ query: delegate.query,
161
+ };
162
+ }
163
+ function createInteractiveToolActivity(skillName, toolName, toolCall, reasoning) {
164
+ return {
165
+ type: "interactiveTool",
166
+ id: "",
167
+ expertKey: "",
168
+ runId: "",
169
+ reasoning,
170
+ skillName,
171
+ toolName,
172
+ args: toolCall.args,
173
+ };
174
+ }
175
+ function createRetryActivity(newMessages, reasoning, customError) {
176
+ const lastMessage = newMessages[newMessages.length - 1];
177
+ const textPart = lastMessage?.contents.find((c) => c.type === "textPart");
178
+ return {
179
+ type: "retry",
180
+ id: "",
181
+ expertKey: "",
182
+ runId: "",
183
+ reasoning,
184
+ error: customError ?? "No tool call or result found",
185
+ message: textPart?.text ?? "",
186
+ };
187
+ }
188
+ function createErrorActivity(checkpoint, reasoning) {
189
+ const error = checkpoint.error;
190
+ return {
191
+ type: "error",
192
+ id: "",
193
+ expertKey: "",
194
+ runId: "",
195
+ reasoning,
196
+ error: error?.message ?? "Unknown error",
197
+ errorName: error?.name,
198
+ isRetryable: error?.isRetryable,
199
+ };
200
+ }
201
+ export function createBaseToolActivity(toolName, toolCall, toolResult, reasoning) {
202
+ const args = toolCall.args;
203
+ const resultContents = toolResult.result;
204
+ const errorText = getErrorFromResult(resultContents);
205
+ const baseFields = { id: "", expertKey: "", runId: "", reasoning };
206
+ switch (toolName) {
207
+ case "attemptCompletion": {
208
+ const remainingTodos = parseRemainingTodosFromResult(resultContents);
209
+ return {
210
+ type: "attemptCompletion",
211
+ ...baseFields,
212
+ remainingTodos,
213
+ error: errorText,
214
+ };
215
+ }
216
+ case "todo": {
217
+ const todos = parseTodosFromResult(resultContents);
218
+ return {
219
+ type: "todo",
220
+ ...baseFields,
221
+ newTodos: Array.isArray(args["newTodos"]) ? args["newTodos"].map(String) : undefined,
222
+ completedTodos: Array.isArray(args["completedTodos"])
223
+ ? args["completedTodos"].map(Number)
224
+ : undefined,
225
+ todos,
226
+ error: errorText,
227
+ };
228
+ }
229
+ case "clearTodo":
230
+ return {
231
+ type: "clearTodo",
232
+ ...baseFields,
233
+ error: errorText,
234
+ };
235
+ case "readImageFile":
236
+ return {
237
+ type: "readImageFile",
238
+ ...baseFields,
239
+ path: String(args["path"] ?? ""),
240
+ mimeType: parseStringField(resultContents, "mimeType"),
241
+ size: parseNumberField(resultContents, "size"),
242
+ error: errorText,
243
+ };
244
+ case "readPdfFile":
245
+ return {
246
+ type: "readPdfFile",
247
+ ...baseFields,
248
+ path: String(args["path"] ?? ""),
249
+ mimeType: parseStringField(resultContents, "mimeType"),
250
+ size: parseNumberField(resultContents, "size"),
251
+ error: errorText,
252
+ };
253
+ case "readTextFile":
254
+ return {
255
+ type: "readTextFile",
256
+ ...baseFields,
257
+ path: String(args["path"] ?? ""),
258
+ content: parseStringField(resultContents, "content"),
259
+ from: typeof args["from"] === "number" ? args["from"] : undefined,
260
+ to: typeof args["to"] === "number" ? args["to"] : undefined,
261
+ error: errorText,
262
+ };
263
+ case "editTextFile":
264
+ return {
265
+ type: "editTextFile",
266
+ ...baseFields,
267
+ path: String(args["path"] ?? ""),
268
+ newText: String(args["newText"] ?? ""),
269
+ oldText: String(args["oldText"] ?? ""),
270
+ error: errorText,
271
+ };
272
+ case "writeTextFile":
273
+ return {
274
+ type: "writeTextFile",
275
+ ...baseFields,
276
+ path: String(args["path"] ?? ""),
277
+ text: String(args["text"] ?? ""),
278
+ error: errorText,
279
+ };
280
+ case "exec":
281
+ return {
282
+ type: "exec",
283
+ ...baseFields,
284
+ command: String(args["command"] ?? ""),
285
+ args: Array.isArray(args["args"]) ? args["args"].map(String) : [],
286
+ cwd: String(args["cwd"] ?? ""),
287
+ output: parseStringField(resultContents, "output"),
288
+ error: errorText,
289
+ stdout: parseStringField(resultContents, "stdout"),
290
+ stderr: parseStringField(resultContents, "stderr"),
291
+ };
292
+ case "addSkill":
293
+ return {
294
+ type: "addSkill",
295
+ ...baseFields,
296
+ name: String(args["name"] ?? ""),
297
+ skillType: String(args["type"] ?? ""),
298
+ tools: parseStringArrayField(resultContents, "tools"),
299
+ error: errorText,
300
+ };
301
+ case "removeSkill":
302
+ return {
303
+ type: "removeSkill",
304
+ ...baseFields,
305
+ skillName: String(args["skillName"] ?? ""),
306
+ error: errorText,
307
+ };
308
+ case "addDelegate":
309
+ return {
310
+ type: "addDelegate",
311
+ ...baseFields,
312
+ targetExpertKey: String(args["expertKey"] ?? ""),
313
+ delegateToolName: parseStringField(resultContents, "delegateToolName"),
314
+ error: errorText,
315
+ };
316
+ case "removeDelegate":
317
+ return {
318
+ type: "removeDelegate",
319
+ ...baseFields,
320
+ expertName: String(args["expertName"] ?? ""),
321
+ error: errorText,
322
+ };
323
+ case "createExpert":
324
+ return {
325
+ type: "createExpert",
326
+ ...baseFields,
327
+ targetKey: String(args["key"] ?? ""),
328
+ description: typeof args["description"] === "string" ? args["description"] : undefined,
329
+ resultExpertKey: parseStringField(resultContents, "expertKey"),
330
+ error: errorText,
331
+ };
332
+ default:
333
+ // Use actual skillName from toolCall, not the constant
334
+ return createGeneralToolActivity(toolCall.skillName, toolName, toolCall, toolResult, reasoning);
335
+ }
336
+ }
337
+ export function createGeneralToolActivity(skillName, toolName, toolCall, toolResult, reasoning) {
338
+ const errorText = getErrorFromResult(toolResult.result);
339
+ return {
340
+ type: "generalTool",
341
+ id: "",
342
+ expertKey: "",
343
+ runId: "",
344
+ reasoning,
345
+ skillName,
346
+ toolName,
347
+ args: toolCall.args,
348
+ result: toolResult.result,
349
+ error: errorText,
350
+ };
351
+ }
352
+ function getErrorFromResult(result) {
353
+ const textPart = result.find((p) => p.type === "textPart");
354
+ if (!textPart?.text)
355
+ return undefined;
356
+ try {
357
+ const parsed = JSON.parse(textPart.text);
358
+ if (typeof parsed.error === "string") {
359
+ return parsed.error;
360
+ }
361
+ }
362
+ catch {
363
+ // Not JSON - only treat as error if it starts with "Error:" or "error:"
364
+ // This avoids false positives from text containing "error" in other contexts
365
+ const trimmed = textPart.text.trim();
366
+ if (trimmed.toLowerCase().startsWith("error:") || trimmed.toLowerCase().startsWith("error ")) {
367
+ return textPart.text;
368
+ }
369
+ }
370
+ return undefined;
371
+ }
372
+ function parseStringField(result, field) {
373
+ const textPart = result.find((p) => p.type === "textPart");
374
+ if (!textPart?.text)
375
+ return undefined;
376
+ try {
377
+ const parsed = JSON.parse(textPart.text);
378
+ return typeof parsed[field] === "string" ? parsed[field] : undefined;
379
+ }
380
+ catch {
381
+ return undefined;
382
+ }
383
+ }
384
+ function parseNumberField(result, field) {
385
+ const textPart = result.find((p) => p.type === "textPart");
386
+ if (!textPart?.text)
387
+ return undefined;
388
+ try {
389
+ const parsed = JSON.parse(textPart.text);
390
+ return typeof parsed[field] === "number" ? parsed[field] : undefined;
391
+ }
392
+ catch {
393
+ return undefined;
394
+ }
395
+ }
396
+ function parseStringArrayField(result, field) {
397
+ const textPart = result.find((p) => p.type === "textPart");
398
+ if (!textPart?.text)
399
+ return undefined;
400
+ try {
401
+ const parsed = JSON.parse(textPart.text);
402
+ if (Array.isArray(parsed[field])) {
403
+ return parsed[field].map(String);
404
+ }
405
+ }
406
+ catch {
407
+ // Ignore parse errors
408
+ }
409
+ return undefined;
410
+ }
411
+ function parseRemainingTodosFromResult(result) {
412
+ const textPart = result.find((p) => p.type === "textPart");
413
+ if (!textPart?.text)
414
+ return undefined;
415
+ try {
416
+ const parsed = JSON.parse(textPart.text);
417
+ if (Array.isArray(parsed.remainingTodos)) {
418
+ return parsed.remainingTodos.map((t, i) => ({
419
+ id: typeof t.id === "number" ? t.id : i,
420
+ title: typeof t.title === "string" ? t.title : "",
421
+ completed: typeof t.completed === "boolean" ? t.completed : false,
422
+ }));
423
+ }
424
+ }
425
+ catch {
426
+ // Ignore parse errors
427
+ }
428
+ return undefined;
429
+ }
430
+ function parseTodosFromResult(result) {
431
+ const textPart = result.find((p) => p.type === "textPart");
432
+ if (!textPart?.text)
433
+ return [];
434
+ try {
435
+ const parsed = JSON.parse(textPart.text);
436
+ if (Array.isArray(parsed.todos)) {
437
+ return parsed.todos.map((t, i) => ({
438
+ id: typeof t.id === "number" ? t.id : i,
439
+ title: typeof t.title === "string" ? t.title : "",
440
+ completed: typeof t.completed === "boolean" ? t.completed : false,
441
+ }));
442
+ }
443
+ }
444
+ catch {
445
+ // Ignore parse errors
446
+ }
447
+ return [];
448
+ }
449
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/utils/activity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ declare const SAFE_ENV_VARS: string[];
2
+ export declare function getFilteredEnv(additional?: Record<string, string>): Record<string, string>;
3
+ export { SAFE_ENV_VARS };
4
+ //# sourceMappingURL=env-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-filter.d.ts","sourceRoot":"","sources":["../../../src/utils/env-filter.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,aAAa,UAiBlB,CAAA;AAeD,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAe1F;AACD,OAAO,EAAE,aAAa,EAAE,CAAA"}
@@ -0,0 +1,50 @@
1
+ const SAFE_ENV_VARS = [
2
+ // System
3
+ "PATH",
4
+ "HOME",
5
+ "SHELL",
6
+ "TERM",
7
+ "NODE_PATH",
8
+ // Proxy
9
+ "HTTP_PROXY",
10
+ "HTTPS_PROXY",
11
+ "http_proxy",
12
+ "https_proxy",
13
+ "NO_PROXY",
14
+ "no_proxy",
15
+ "PERSTACK_PROXY_URL",
16
+ "NPM_CONFIG_PROXY",
17
+ "NPM_CONFIG_HTTPS_PROXY",
18
+ ];
19
+ const PROTECTED_ENV_VARS = new Set([
20
+ "PATH",
21
+ "HOME",
22
+ "SHELL",
23
+ "NODE_PATH",
24
+ "LD_PRELOAD",
25
+ "LD_LIBRARY_PATH",
26
+ "DYLD_INSERT_LIBRARIES",
27
+ "DYLD_LIBRARY_PATH",
28
+ "NODE_OPTIONS",
29
+ "PYTHONPATH",
30
+ "PERL5LIB",
31
+ "RUBYLIB",
32
+ ]);
33
+ export function getFilteredEnv(additional) {
34
+ const filtered = {};
35
+ for (const key of SAFE_ENV_VARS) {
36
+ if (process.env[key]) {
37
+ filtered[key] = process.env[key];
38
+ }
39
+ }
40
+ if (additional) {
41
+ for (const [key, value] of Object.entries(additional)) {
42
+ if (!PROTECTED_ENV_VARS.has(key.toUpperCase())) {
43
+ filtered[key] = value;
44
+ }
45
+ }
46
+ }
47
+ return filtered;
48
+ }
49
+ export { SAFE_ENV_VARS };
50
+ //# sourceMappingURL=env-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-filter.js","sourceRoot":"","sources":["../../../src/utils/env-filter.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG;IACpB,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,aAAa;IACb,UAAU;IACV,UAAU;IACV,oBAAoB;IACpB,kBAAkB;IAClB,wBAAwB;CACzB,CAAA;AACD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,MAAM;IACN,MAAM;IACN,OAAO;IACP,WAAW;IACX,YAAY;IACZ,iBAAiB;IACjB,uBAAuB;IACvB,mBAAmB;IACnB,cAAc;IACd,YAAY;IACZ,UAAU;IACV,SAAS;CACV,CAAC,CAAA;AACF,MAAM,UAAU,cAAc,CAAC,UAAmC;IAChE,MAAM,QAAQ,GAA2B,EAAE,CAAA;IAC3C,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC/C,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AACD,OAAO,EAAE,aAAa,EAAE,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type { PerstackEvent } from "../schemas/runtime.js";
2
+ /**
3
+ * Validate and parse event filter option
4
+ * @param filter - Array of event type strings to validate
5
+ * @returns The validated filter array
6
+ * @throws Error if any event type is invalid
7
+ */
8
+ export declare function validateEventFilter(filter: string[]): string[];
9
+ /**
10
+ * Create a filtered event listener that only emits events of allowed types
11
+ * @param listener - The original event listener to wrap
12
+ * @param allowedTypes - Set of event types to allow through
13
+ * @returns A filtered event listener
14
+ */
15
+ export declare function createFilteredEventListener(listener: (event: PerstackEvent) => void, allowedTypes: Set<string>): (event: PerstackEvent) => void;
16
+ //# sourceMappingURL=event-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-filter.d.ts","sourceRoot":"","sources":["../../../src/utils/event-filter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAG1D;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAY9D;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EACxC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GACxB,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAMhC"}
@@ -0,0 +1,31 @@
1
+ import { PerstackError } from "../errors.js";
2
+ import { isValidEventType, isValidRuntimeEventType } from "../schemas/runtime.js";
3
+ /**
4
+ * Validate and parse event filter option
5
+ * @param filter - Array of event type strings to validate
6
+ * @returns The validated filter array
7
+ * @throws Error if any event type is invalid
8
+ */
9
+ export function validateEventFilter(filter) {
10
+ const invalid = filter.filter((type) => !isValidEventType(type) && !isValidRuntimeEventType(type));
11
+ if (invalid.length > 0) {
12
+ throw new PerstackError(`Invalid event type(s): ${invalid.join(", ")}. ` +
13
+ "Valid event types are: startRun, completeRun, stopRunByError, callTools, etc. " +
14
+ "See documentation for full list.");
15
+ }
16
+ return filter;
17
+ }
18
+ /**
19
+ * Create a filtered event listener that only emits events of allowed types
20
+ * @param listener - The original event listener to wrap
21
+ * @param allowedTypes - Set of event types to allow through
22
+ * @returns A filtered event listener
23
+ */
24
+ export function createFilteredEventListener(listener, allowedTypes) {
25
+ return (event) => {
26
+ if (allowedTypes.has(event.type)) {
27
+ listener(event);
28
+ }
29
+ };
30
+ }
31
+ //# sourceMappingURL=event-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-filter.js","sourceRoot":"","sources":["../../../src/utils/event-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAgB;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAA;IAElG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,aAAa,CACrB,0BAA0B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC9C,gFAAgF;YAChF,kCAAkC,CACrC,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,QAAwC,EACxC,YAAyB;IAEzB,OAAO,CAAC,KAAoB,EAAE,EAAE;QAC9B,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ export type ExpertType = "coordinator" | "delegate";
2
+ export declare function getExpertType(expertName: string): ExpertType;
3
+ export declare function isCoordinatorExpert(expertName: string): boolean;
4
+ export declare function isDelegateExpert(expertName: string): boolean;
5
+ /**
6
+ * Returns the scope of an expert.
7
+ * Handles both bare names and versioned keys (with @version/@tag suffix).
8
+ * - Coordinator "game-producer" -> "game-producer"
9
+ * - Coordinator "game-producer@1.0.0" -> "game-producer"
10
+ * - Delegate "@game-producer/designer" -> "game-producer"
11
+ * - Delegate "@game-producer/designer@1.0.0" -> "game-producer"
12
+ */
13
+ export declare function getExpertScope(expertName: string): string;
14
+ /**
15
+ * Returns the short name of an expert.
16
+ * Handles both bare names and versioned keys (with @version/@tag suffix).
17
+ * - Coordinator "game-producer" -> "game-producer"
18
+ * - Coordinator "game-producer@1.0.0" -> "game-producer"
19
+ * - Delegate "@game-producer/designer" -> "designer"
20
+ * - Delegate "@game-producer/designer@1.0.0" -> "designer"
21
+ */
22
+ export declare function getExpertShortName(expertName: string): string;
23
+ /**
24
+ * Validates whether a delegation from source to target is allowed.
25
+ * Returns null if valid, an error message string if invalid.
26
+ *
27
+ * Rules:
28
+ * - No self-delegation
29
+ * - If target is a delegate (@scope/name), source must be in the same scope
30
+ * - A delegate cannot delegate to its own coordinator
31
+ */
32
+ export declare function validateDelegation(source: string, target: string): string | null;
33
+ /**
34
+ * Validates all delegations for an expert.
35
+ * Returns an array of error messages (empty if all valid).
36
+ */
37
+ export declare function validateAllDelegations(expertName: string, delegates: string[]): string[];
38
+ //# sourceMappingURL=expert-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expert-type.d.ts","sourceRoot":"","sources":["../../../src/utils/expert-type.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,UAAU,CAAA;AAEnD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAE5D;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAS7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBhF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CASxF"}