@perstack/core 0.0.22 → 0.0.23

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.
package/dist/src/index.js CHANGED
@@ -1,12 +1,213 @@
1
- import { z } from 'zod';
1
+ import { spawn } from 'child_process';
2
2
  import { createId } from '@paralleldrive/cuid2';
3
+ import { z } from 'zod';
4
+
5
+ // src/adapters/base-adapter.ts
6
+ var BaseAdapter = class {
7
+ convertExpert(expert) {
8
+ return { instruction: expert.instruction };
9
+ }
10
+ execCommand(args) {
11
+ return new Promise((resolve) => {
12
+ const [cmd, ...cmdArgs] = args;
13
+ if (!cmd) {
14
+ resolve({ stdout: "", stderr: "", exitCode: 127 });
15
+ return;
16
+ }
17
+ const proc = spawn(cmd, cmdArgs, { cwd: process.cwd(), stdio: ["pipe", "pipe", "pipe"] });
18
+ let stdout = "";
19
+ let stderr = "";
20
+ proc.stdout.on("data", (data) => {
21
+ stdout += data.toString();
22
+ });
23
+ proc.stderr.on("data", (data) => {
24
+ stderr += data.toString();
25
+ });
26
+ proc.on("close", (code) => {
27
+ resolve({ stdout, stderr, exitCode: code ?? 127 });
28
+ });
29
+ proc.on("error", () => {
30
+ resolve({ stdout: "", stderr: "", exitCode: 127 });
31
+ });
32
+ });
33
+ }
34
+ executeWithTimeout(proc, timeout) {
35
+ return new Promise((resolve, reject) => {
36
+ let stdout = "";
37
+ let stderr = "";
38
+ const timer = setTimeout(() => {
39
+ proc.kill("SIGTERM");
40
+ reject(new Error(`${this.name} timed out after ${timeout}ms`));
41
+ }, timeout);
42
+ proc.stdout?.on("data", (data) => {
43
+ stdout += data.toString();
44
+ });
45
+ proc.stderr?.on("data", (data) => {
46
+ stderr += data.toString();
47
+ });
48
+ proc.on("close", (code) => {
49
+ clearTimeout(timer);
50
+ resolve({ stdout, stderr, exitCode: code ?? 127 });
51
+ });
52
+ proc.on("error", (err) => {
53
+ clearTimeout(timer);
54
+ reject(err);
55
+ });
56
+ });
57
+ }
58
+ };
59
+ function createEmptyUsage() {
60
+ return {
61
+ inputTokens: 0,
62
+ outputTokens: 0,
63
+ reasoningTokens: 0,
64
+ totalTokens: 0,
65
+ cachedInputTokens: 0
66
+ };
67
+ }
68
+ function createNormalizedCheckpoint(params) {
69
+ const { jobId, runId, expert, output, runtime } = params;
70
+ const checkpointId = createId();
71
+ const expertMessage = {
72
+ id: createId(),
73
+ type: "expertMessage",
74
+ contents: [{ type: "textPart", id: createId(), text: output }]
75
+ };
76
+ return {
77
+ id: checkpointId,
78
+ jobId,
79
+ runId,
80
+ status: "completed",
81
+ stepNumber: 1,
82
+ messages: [expertMessage],
83
+ expert: { key: expert.key, name: expert.name, version: expert.version },
84
+ usage: createEmptyUsage(),
85
+ metadata: { runtime }
86
+ };
87
+ }
88
+ function createRuntimeInitEvent(jobId, runId, expertName, runtime, version, query) {
89
+ return {
90
+ type: "initializeRuntime",
91
+ id: createId(),
92
+ timestamp: Date.now(),
93
+ jobId,
94
+ runId,
95
+ runtimeVersion: version,
96
+ runtime,
97
+ expertName,
98
+ experts: [],
99
+ model: `${runtime}:default`,
100
+ temperature: 0,
101
+ maxRetries: 0,
102
+ timeout: 0,
103
+ query
104
+ };
105
+ }
106
+ function createCompleteRunEvent(jobId, runId, expertKey, checkpoint, output, startedAt) {
107
+ const lastMessage = checkpoint.messages[checkpoint.messages.length - 1];
108
+ return {
109
+ type: "completeRun",
110
+ id: createId(),
111
+ expertKey,
112
+ timestamp: Date.now(),
113
+ jobId,
114
+ runId,
115
+ stepNumber: checkpoint.stepNumber,
116
+ checkpoint,
117
+ step: {
118
+ stepNumber: checkpoint.stepNumber,
119
+ newMessages: lastMessage ? [lastMessage] : [],
120
+ usage: createEmptyUsage(),
121
+ startedAt: startedAt ?? Date.now()
122
+ },
123
+ text: output,
124
+ usage: createEmptyUsage()
125
+ };
126
+ }
127
+ function createStreamingTextEvent(jobId, runId, text) {
128
+ return {
129
+ type: "streamingText",
130
+ id: createId(),
131
+ timestamp: Date.now(),
132
+ jobId,
133
+ runId,
134
+ text
135
+ };
136
+ }
137
+ function createCallToolsEvent(jobId, runId, expertKey, stepNumber, toolCalls, _checkpoint) {
138
+ const expertMessage = {
139
+ id: createId(),
140
+ type: "expertMessage",
141
+ contents: []
142
+ };
143
+ return {
144
+ type: "callTools",
145
+ id: createId(),
146
+ expertKey,
147
+ timestamp: Date.now(),
148
+ jobId,
149
+ runId,
150
+ stepNumber,
151
+ newMessage: expertMessage,
152
+ toolCalls,
153
+ usage: createEmptyUsage()
154
+ };
155
+ }
156
+ function createResolveToolResultsEvent(jobId, runId, expertKey, stepNumber, toolResults) {
157
+ return {
158
+ type: "resolveToolResults",
159
+ id: createId(),
160
+ expertKey,
161
+ timestamp: Date.now(),
162
+ jobId,
163
+ runId,
164
+ stepNumber,
165
+ toolResults
166
+ };
167
+ }
168
+ function createToolMessage(toolCallId, toolName, resultText) {
169
+ return {
170
+ id: createId(),
171
+ type: "toolMessage",
172
+ contents: [
173
+ {
174
+ type: "toolResultPart",
175
+ id: createId(),
176
+ toolCallId,
177
+ toolName,
178
+ contents: [{ type: "textPart", id: createId(), text: resultText }]
179
+ }
180
+ ]
181
+ };
182
+ }
183
+
184
+ // src/adapters/registry.ts
185
+ var adapters = /* @__PURE__ */ new Map();
186
+ function registerAdapter(runtime, factory) {
187
+ adapters.set(runtime, factory);
188
+ }
189
+ function getAdapter(runtime) {
190
+ const factory = adapters.get(runtime);
191
+ if (!factory) {
192
+ throw new Error(
193
+ `Runtime "${runtime}" is not registered. Available runtimes: ${Array.from(adapters.keys()).join(", ")}`
194
+ );
195
+ }
196
+ return factory();
197
+ }
198
+ function isAdapterAvailable(runtime) {
199
+ return adapters.has(runtime);
200
+ }
201
+ function getRegisteredRuntimes() {
202
+ return Array.from(adapters.keys());
203
+ }
3
204
 
4
205
  // src/constants/constants.ts
5
206
  var defaultPerstackApiBaseUrl = "https://api.perstack.ai";
6
- var organizationNameRegex = /^[a-z0-9][a-z0-9_\.-]*$/;
207
+ var organizationNameRegex = /^[a-z0-9][a-z0-9_.-]*$/;
7
208
  var maxOrganizationNameLength = 128;
8
209
  var maxApplicationNameLength = 255;
9
- var expertKeyRegex = /^((?:@[a-z0-9][a-z0-9_\.-]*\/)?[a-z0-9][a-z0-9_\.-]*)(?:@((?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?)|@([a-z0-9][a-z0-9_\.-]*))?$/;
210
+ var expertKeyRegex = /^((?:@[a-z0-9][a-z0-9_.-]*\/)?[a-z0-9][a-z0-9_.-]*)(?:@((?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?)|@([a-z0-9][a-z0-9_.-]*))?$/;
10
211
  var expertNameRegex = /^(@[a-z0-9][a-z0-9_-]*\/)?[a-z0-9][a-z0-9_-]*$/;
11
212
  var expertVersionRegex = /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?$/;
12
213
  var tagNameRegex = /^[a-z0-9][a-z0-9_-]*$/;
@@ -24,7 +225,7 @@ var defaultMaxRetries = 5;
24
225
  var defaultTimeout = 5 * 1e3 * 60;
25
226
  var maxExpertJobQueryLength = 1024 * 20;
26
227
  var maxExpertJobFileNameLength = 1024 * 10;
27
- var packageWithVersionRegex = /^(?:@[a-z0-9][a-z0-9_\.-]*\/)?[a-z0-9][a-z0-9_\.-]*(?:@(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?|@[a-z0-9][a-z0-9_\.-]*)?$/;
228
+ var packageWithVersionRegex = /^(?:@[a-z0-9][a-z0-9_.-]*\/)?[a-z0-9][a-z0-9_.-]*(?:@(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?|@[a-z0-9][a-z0-9_.-]*)?$/;
28
229
  var urlSafeRegex = /^[a-z0-9][a-z0-9_-]*$/;
29
230
  var maxSkillNameLength = 255;
30
231
  var maxSkillDescriptionLength = 1024 * 2;
@@ -328,6 +529,7 @@ var messageSchema = z.union([
328
529
  expertMessageSchema,
329
530
  toolMessageSchema
330
531
  ]);
532
+ var runtimeNameSchema = z.enum(["perstack", "cursor", "claude-code", "gemini", "docker"]);
331
533
  var toolCallSchema = z.object({
332
534
  id: z.string().min(1).max(255),
333
535
  skillName: z.string().min(1).max(maxSkillNameLength),
@@ -395,7 +597,10 @@ var checkpointSchema = z.object({
395
597
  contextWindow: z.number().optional(),
396
598
  contextWindowUsage: z.number().optional(),
397
599
  pendingToolCalls: z.array(toolCallSchema).optional(),
398
- partialToolResults: z.array(toolResultSchema).optional()
600
+ partialToolResults: z.array(toolResultSchema).optional(),
601
+ metadata: z.object({
602
+ runtime: runtimeNameSchema.optional()
603
+ }).passthrough().optional()
399
604
  });
400
605
  var mcpStdioSkillSchema = z.object({
401
606
  type: z.literal("mcpStdioSkill"),
@@ -579,6 +784,10 @@ var providerConfigSchema = z.discriminatedUnion("providerName", [
579
784
  ]);
580
785
 
581
786
  // src/schemas/perstack-toml.ts
787
+ var domainPatternRegex = /^(\*\.)?[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*$/;
788
+ var domainPatternSchema = z.string().regex(domainPatternRegex, {
789
+ message: "Invalid domain pattern. Use exact domain (example.com) or wildcard prefix (*.example.com)"
790
+ });
582
791
  var anthropicSettingSchema = z.object({
583
792
  baseUrl: z.string().optional(),
584
793
  headers: headersSchema
@@ -656,6 +865,7 @@ var perstackConfigSchema = z.object({
656
865
  provider: providerTableSchema.optional(),
657
866
  model: z.string().optional(),
658
867
  temperature: z.number().optional(),
868
+ runtime: runtimeNameSchema.optional(),
659
869
  maxSteps: z.number().optional(),
660
870
  maxRetries: z.number().optional(),
661
871
  timeout: z.number().optional(),
@@ -678,7 +888,8 @@ var perstackConfigSchema = z.object({
678
888
  command: z.string(),
679
889
  packageName: z.string().optional(),
680
890
  args: z.array(z.string()).optional(),
681
- requiredEnv: z.array(z.string()).optional()
891
+ requiredEnv: z.array(z.string()).optional(),
892
+ allowedDomains: z.array(domainPatternSchema).optional()
682
893
  }),
683
894
  z.object({
684
895
  type: z.literal("mcpSseSkill"),
@@ -686,7 +897,8 @@ var perstackConfigSchema = z.object({
686
897
  rule: z.string().optional(),
687
898
  pick: z.array(z.string()).optional(),
688
899
  omit: z.array(z.string()).optional(),
689
- endpoint: z.string()
900
+ endpoint: z.string(),
901
+ allowedDomains: z.array(domainPatternSchema).optional()
690
902
  }),
691
903
  z.object({
692
904
  type: z.literal("interactiveSkill"),
@@ -745,7 +957,8 @@ var commandOptionsSchema = z.object({
745
957
  continue: z.boolean().optional(),
746
958
  continueJob: z.string().optional(),
747
959
  resumeFrom: z.string().optional(),
748
- interactiveToolCallResult: z.boolean().optional()
960
+ interactiveToolCallResult: z.boolean().optional(),
961
+ runtime: runtimeNameSchema.optional()
749
962
  });
750
963
  var runCommandInputSchema = z.object({
751
964
  expertKey: z.string(),
@@ -793,7 +1006,8 @@ var runSettingSchema = z.object({
793
1006
  perstackApiBaseUrl: z.string().url(),
794
1007
  perstackApiKey: z.string().optional(),
795
1008
  perstackBaseSkillCommand: z.array(z.string()).optional(),
796
- env: z.record(z.string(), z.string())
1009
+ env: z.record(z.string(), z.string()),
1010
+ proxyUrl: z.string().optional()
797
1011
  });
798
1012
  var runParamsSchema = z.object({
799
1013
  setting: z.object({
@@ -831,7 +1045,8 @@ var runParamsSchema = z.object({
831
1045
  perstackApiBaseUrl: z.url().optional().default(defaultPerstackApiBaseUrl),
832
1046
  perstackApiKey: z.string().optional(),
833
1047
  perstackBaseSkillCommand: z.array(z.string()).optional(),
834
- env: z.record(z.string(), z.string()).optional().default({})
1048
+ env: z.record(z.string(), z.string()).optional().default({}),
1049
+ proxyUrl: z.string().optional()
835
1050
  }),
836
1051
  checkpoint: checkpointSchema.optional()
837
1052
  });
@@ -907,6 +1122,6 @@ function parseWithFriendlyError(schema, data, context) {
907
1122
  throw new Error(`${prefix}${formatZodError(result.error)}`);
908
1123
  }
909
1124
 
910
- export { amazonBedrockProviderConfigSchema, anthropicProviderConfigSchema, attemptCompletion, azureOpenAiProviderConfigSchema, basePartSchema, callDelegate, callInteractiveTool, callTools, checkpointSchema, checkpointStatusSchema, completeRun, continueToNextStep, createEvent, createRuntimeEvent, deepseekProviderConfigSchema, defaultMaxRetries, defaultMaxSteps, defaultPerstackApiBaseUrl, defaultTemperature, defaultTimeout, delegationTargetSchema, envNameRegex, expertKeyRegex, expertMessageSchema, expertNameRegex, expertSchema, expertVersionRegex, fileBinaryPartSchema, fileInlinePartSchema, fileUrlPartSchema, finishAllToolCalls, finishToolCall, formatZodError, googleGenerativeAiProviderConfigSchema, googleVertexProviderConfigSchema, headersSchema, imageBinaryPartSchema, imageInlinePartSchema, imageUrlPartSchema, instructionMessageSchema, interactiveSkillSchema, interactiveToolSchema, jobSchema, jobStatusSchema, knownModels, maxApplicationNameLength, maxCheckpointToolCallIdLength, maxEnvNameLength, maxExpertDelegateItems, maxExpertDescriptionLength, maxExpertInstructionLength, maxExpertJobFileNameLength, maxExpertJobQueryLength, maxExpertKeyLength, maxExpertNameLength, maxExpertSkillItems, maxExpertTagItems, maxExpertVersionTagLength, maxOrganizationNameLength, maxSkillDescriptionLength, maxSkillEndpointLength, maxSkillInputJsonSchemaLength, maxSkillNameLength, maxSkillPickOmitItems, maxSkillRequiredEnvItems, maxSkillRuleLength, maxSkillToolItems, maxSkillToolNameLength, mcpSseSkillSchema, mcpStdioSkillSchema, messagePartSchema, messageSchema, ollamaProviderConfigSchema, openAiProviderConfigSchema, organizationNameRegex, packageWithVersionRegex, parseExpertKey, parseWithFriendlyError, perstackConfigSchema, providerConfigSchema, providerNameSchema, providerTableSchema, resolveThought, resolveToolResults, resumeToolCalls, retry, runCommandInputSchema, runParamsSchema, runSettingSchema, skillSchema, startCommandInputSchema, startGeneration, startRun, stepSchema, stopRunByDelegate, stopRunByExceededMaxSteps, stopRunByInteractiveTool, tagNameRegex, textPartSchema, toolCallPartSchema, toolCallSchema, toolMessageSchema, toolResultPartSchema, toolResultSchema, urlSafeRegex, usageSchema, userMessageSchema };
1125
+ export { BaseAdapter, amazonBedrockProviderConfigSchema, anthropicProviderConfigSchema, attemptCompletion, azureOpenAiProviderConfigSchema, basePartSchema, callDelegate, callInteractiveTool, callTools, checkpointSchema, checkpointStatusSchema, completeRun, continueToNextStep, createCallToolsEvent, createCompleteRunEvent, createEmptyUsage, createEvent, createNormalizedCheckpoint, createResolveToolResultsEvent, createRuntimeEvent, createRuntimeInitEvent, createStreamingTextEvent, createToolMessage, deepseekProviderConfigSchema, defaultMaxRetries, defaultMaxSteps, defaultPerstackApiBaseUrl, defaultTemperature, defaultTimeout, delegationTargetSchema, domainPatternSchema, envNameRegex, expertKeyRegex, expertMessageSchema, expertNameRegex, expertSchema, expertVersionRegex, fileBinaryPartSchema, fileInlinePartSchema, fileUrlPartSchema, finishAllToolCalls, finishToolCall, formatZodError, getAdapter, getRegisteredRuntimes, googleGenerativeAiProviderConfigSchema, googleVertexProviderConfigSchema, headersSchema, imageBinaryPartSchema, imageInlinePartSchema, imageUrlPartSchema, instructionMessageSchema, interactiveSkillSchema, interactiveToolSchema, isAdapterAvailable, jobSchema, jobStatusSchema, knownModels, maxApplicationNameLength, maxCheckpointToolCallIdLength, maxEnvNameLength, maxExpertDelegateItems, maxExpertDescriptionLength, maxExpertInstructionLength, maxExpertJobFileNameLength, maxExpertJobQueryLength, maxExpertKeyLength, maxExpertNameLength, maxExpertSkillItems, maxExpertTagItems, maxExpertVersionTagLength, maxOrganizationNameLength, maxSkillDescriptionLength, maxSkillEndpointLength, maxSkillInputJsonSchemaLength, maxSkillNameLength, maxSkillPickOmitItems, maxSkillRequiredEnvItems, maxSkillRuleLength, maxSkillToolItems, maxSkillToolNameLength, mcpSseSkillSchema, mcpStdioSkillSchema, messagePartSchema, messageSchema, ollamaProviderConfigSchema, openAiProviderConfigSchema, organizationNameRegex, packageWithVersionRegex, parseExpertKey, parseWithFriendlyError, perstackConfigSchema, providerConfigSchema, providerNameSchema, providerTableSchema, registerAdapter, resolveThought, resolveToolResults, resumeToolCalls, retry, runCommandInputSchema, runParamsSchema, runSettingSchema, runtimeNameSchema, skillSchema, startCommandInputSchema, startGeneration, startRun, stepSchema, stopRunByDelegate, stopRunByExceededMaxSteps, stopRunByInteractiveTool, tagNameRegex, textPartSchema, toolCallPartSchema, toolCallSchema, toolMessageSchema, toolResultPartSchema, toolResultSchema, urlSafeRegex, usageSchema, userMessageSchema };
911
1126
  //# sourceMappingURL=index.js.map
912
1127
  //# sourceMappingURL=index.js.map