perstack 0.0.88 → 0.0.89

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.
@@ -1,5 +1,13 @@
1
1
  import { __export } from './chunk-E5EEIGMK.js';
2
2
 
3
+ // ../../packages/core/src/errors.ts
4
+ var PerstackError = class extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "PerstackError";
8
+ }
9
+ };
10
+
3
11
  // ../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/_u64.js
4
12
  var U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);
5
13
  var _32n = /* @__PURE__ */ BigInt(32);
@@ -1720,6 +1728,223 @@ var defaultTimeout = 5 * 1e3 * 60;
1720
1728
  var maxSkillNameLength = 255;
1721
1729
  var maxSkillToolNameLength = 255;
1722
1730
 
1731
+ // ../../packages/core/src/known-models/index.ts
1732
+ var knownModels = [
1733
+ {
1734
+ provider: "anthropic",
1735
+ models: [
1736
+ // https://docs.claude.com/en/docs/about-claude/models/overview#model-comparison-table
1737
+ {
1738
+ name: "claude-opus-4-6",
1739
+ contextWindow: 2e5,
1740
+ maxOutputTokens: 128e3
1741
+ },
1742
+ {
1743
+ name: "claude-opus-4-5",
1744
+ contextWindow: 2e5,
1745
+ maxOutputTokens: 32e3
1746
+ },
1747
+ {
1748
+ name: "claude-opus-4-1",
1749
+ contextWindow: 2e5,
1750
+ maxOutputTokens: 32e3
1751
+ },
1752
+ {
1753
+ name: "claude-opus-4-20250514",
1754
+ contextWindow: 2e5,
1755
+ maxOutputTokens: 32e3
1756
+ },
1757
+ {
1758
+ name: "claude-sonnet-4-5",
1759
+ contextWindow: 2e5,
1760
+ maxOutputTokens: 64e3
1761
+ },
1762
+ {
1763
+ name: "claude-sonnet-4-20250514",
1764
+ contextWindow: 2e5,
1765
+ maxOutputTokens: 64e3
1766
+ },
1767
+ {
1768
+ name: "claude-3-7-sonnet-20250219",
1769
+ contextWindow: 2e5,
1770
+ maxOutputTokens: 64e3
1771
+ },
1772
+ {
1773
+ name: "claude-haiku-4-5",
1774
+ contextWindow: 2e5,
1775
+ maxOutputTokens: 8192
1776
+ },
1777
+ {
1778
+ name: "claude-3-5-haiku-latest",
1779
+ contextWindow: 2e5,
1780
+ maxOutputTokens: 8192
1781
+ }
1782
+ ]
1783
+ },
1784
+ {
1785
+ provider: "google",
1786
+ models: [
1787
+ // https://ai.google.dev/gemini-api/docs/models#gemini-3-flash
1788
+ {
1789
+ name: "gemini-3-flash-preview",
1790
+ contextWindow: 1048576,
1791
+ maxOutputTokens: 65536
1792
+ },
1793
+ // https://ai.google.dev/gemini-api/docs/models#gemini-3-pro
1794
+ {
1795
+ name: "gemini-3-pro-preview",
1796
+ contextWindow: 1048576,
1797
+ maxOutputTokens: 65536
1798
+ },
1799
+ // https://ai.google.dev/gemini-api/docs/models#gemini-2.5-pro
1800
+ {
1801
+ name: "gemini-2.5-pro",
1802
+ contextWindow: 1048576,
1803
+ maxOutputTokens: 65536
1804
+ },
1805
+ // https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash
1806
+ {
1807
+ name: "gemini-2.5-flash",
1808
+ contextWindow: 1048576,
1809
+ maxOutputTokens: 65536
1810
+ },
1811
+ // https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-lite
1812
+ {
1813
+ name: "gemini-2.5-flash-lite",
1814
+ contextWindow: 1048576,
1815
+ maxOutputTokens: 65536
1816
+ }
1817
+ ]
1818
+ },
1819
+ {
1820
+ provider: "openai",
1821
+ models: [
1822
+ // https://platform.openai.com/docs/models/gpt-5
1823
+ {
1824
+ name: "gpt-5",
1825
+ contextWindow: 4e5,
1826
+ maxOutputTokens: 128e3
1827
+ },
1828
+ // https://platform.openai.com/docs/models/gpt-5-mini
1829
+ {
1830
+ name: "gpt-5-mini",
1831
+ contextWindow: 4e5,
1832
+ maxOutputTokens: 128e3
1833
+ },
1834
+ // https://platform.openai.com/docs/models/gpt-5-nano
1835
+ {
1836
+ name: "gpt-5-nano",
1837
+ contextWindow: 4e5,
1838
+ maxOutputTokens: 128e3
1839
+ },
1840
+ // https://platform.openai.com/docs/models/gpt-5.2
1841
+ {
1842
+ name: "gpt-5.2",
1843
+ contextWindow: 4e5,
1844
+ maxOutputTokens: 128e3
1845
+ },
1846
+ // https://platform.openai.com/docs/models/gpt-5.2-pro
1847
+ {
1848
+ name: "gpt-5.2-pro",
1849
+ contextWindow: 4e5,
1850
+ maxOutputTokens: 128e3
1851
+ },
1852
+ // https://platform.openai.com/docs/models/gpt-5.1
1853
+ {
1854
+ name: "gpt-5.1",
1855
+ contextWindow: 4e5,
1856
+ maxOutputTokens: 128e3
1857
+ },
1858
+ // https://platform.openai.com/docs/models/gpt-5-chat-latest
1859
+ {
1860
+ name: "gpt-5-chat-latest",
1861
+ contextWindow: 128e3,
1862
+ maxOutputTokens: 16384
1863
+ },
1864
+ // https://platform.openai.com/docs/models/o4-mini
1865
+ {
1866
+ name: "o4-mini",
1867
+ contextWindow: 2e5,
1868
+ maxOutputTokens: 1e5
1869
+ },
1870
+ // https://platform.openai.com/docs/models/o3
1871
+ {
1872
+ name: "o3",
1873
+ contextWindow: 2e5,
1874
+ maxOutputTokens: 1e4
1875
+ },
1876
+ // https://platform.openai.com/docs/models/o3-mini
1877
+ {
1878
+ name: "o3-mini",
1879
+ contextWindow: 2e5,
1880
+ maxOutputTokens: 1e4
1881
+ },
1882
+ // https://platform.openai.com/docs/models/gpt-4.1
1883
+ {
1884
+ name: "gpt-4.1",
1885
+ contextWindow: 1047576,
1886
+ maxOutputTokens: 32768
1887
+ }
1888
+ ]
1889
+ },
1890
+ {
1891
+ provider: "deepseek",
1892
+ models: [
1893
+ {
1894
+ name: "deepseek-chat",
1895
+ contextWindow: 128e3,
1896
+ maxOutputTokens: 8192
1897
+ },
1898
+ {
1899
+ name: "deepseek-reasoner",
1900
+ contextWindow: 128e3,
1901
+ maxOutputTokens: 64e3
1902
+ }
1903
+ ]
1904
+ },
1905
+ {
1906
+ provider: "ollama",
1907
+ models: [
1908
+ // https://platform.openai.com/docs/models/gpt-oss-20b
1909
+ {
1910
+ name: "gpt-oss:20b",
1911
+ contextWindow: 131072,
1912
+ maxOutputTokens: 131072
1913
+ },
1914
+ // https://platform.openai.com/docs/models/gpt-oss-120b
1915
+ {
1916
+ name: "gpt-oss:120b",
1917
+ contextWindow: 131072,
1918
+ maxOutputTokens: 131072
1919
+ },
1920
+ // https://ai.google.dev/gemma/docs/core/model_card_3
1921
+ {
1922
+ name: "gemma3:1b",
1923
+ contextWindow: 32e3,
1924
+ maxOutputTokens: 32e3
1925
+ },
1926
+ // https://ai.google.dev/gemma/docs/core/model_card_3
1927
+ {
1928
+ name: "gemma3:4b",
1929
+ contextWindow: 128e3,
1930
+ maxOutputTokens: 128e3
1931
+ },
1932
+ // https://ai.google.dev/gemma/docs/core/model_card_3
1933
+ {
1934
+ name: "gemma3:12b",
1935
+ contextWindow: 128e3,
1936
+ maxOutputTokens: 128e3
1937
+ },
1938
+ // https://ai.google.dev/gemma/docs/core/model_card_3
1939
+ {
1940
+ name: "gemma3:27b",
1941
+ contextWindow: 128e3,
1942
+ maxOutputTokens: 128e3
1943
+ }
1944
+ ]
1945
+ }
1946
+ ];
1947
+
1723
1948
  // ../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/external.js
1724
1949
  var external_exports = {};
1725
1950
  __export(external_exports, {
@@ -15827,51 +16052,172 @@ var usageSchema = external_exports.object({
15827
16052
  cachedInputTokens: external_exports.number()
15828
16053
  });
15829
16054
 
15830
- // ../../packages/core/src/schemas/skill.ts
15831
- function isPrivateOrLocalIP(hostname3) {
15832
- if (hostname3 === "localhost" || hostname3 === "127.0.0.1" || hostname3 === "::1" || hostname3 === "0.0.0.0") {
15833
- return true;
15834
- }
15835
- const ipv4Match = hostname3.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
15836
- if (ipv4Match) {
15837
- const a = Number(ipv4Match[1]);
15838
- const b = Number(ipv4Match[2]);
15839
- if (a === 10) return true;
15840
- if (a === 172 && b >= 16 && b <= 31) return true;
15841
- if (a === 192 && b === 168) return true;
15842
- if (a === 169 && b === 254) return true;
15843
- if (a === 127) return true;
15844
- }
15845
- if (hostname3.includes(":")) {
15846
- if (hostname3.startsWith("fe80:") || hostname3.startsWith("fc") || hostname3.startsWith("fd")) {
15847
- return true;
15848
- }
15849
- }
15850
- if (hostname3.startsWith("::ffff:")) {
15851
- const ipv4Part = hostname3.slice(7);
15852
- if (isPrivateOrLocalIP(ipv4Part)) {
15853
- return true;
15854
- }
15855
- }
15856
- return false;
15857
- }
15858
- var sseEndpointSchema = external_exports.string().url().refine(
15859
- (url2) => {
15860
- try {
15861
- const parsed = new URL(url2);
15862
- if (parsed.protocol !== "https:") return false;
15863
- if (isPrivateOrLocalIP(parsed.hostname)) return false;
15864
- return true;
15865
- } catch {
15866
- return false;
15867
- }
15868
- },
15869
- { message: "Endpoint must be a public HTTPS URL" }
15870
- );
15871
- var mcpStdioSkillSchema = external_exports.object({
15872
- type: external_exports.literal("mcpStdioSkill"),
15873
- name: external_exports.string(),
15874
- description: external_exports.string().optional(),
16055
+ // ../../packages/core/src/schemas/checkpoint.ts
16056
+ var checkpointStatusSchema = external_exports.enum([
16057
+ "init",
16058
+ "proceeding",
16059
+ "completed",
16060
+ "stoppedByInteractiveTool",
16061
+ "stoppedByDelegate",
16062
+ "stoppedByExceededMaxSteps",
16063
+ "stoppedByError",
16064
+ "stoppedByCancellation"
16065
+ ]);
16066
+ var delegationTargetSchema = external_exports.object({
16067
+ expert: external_exports.object({
16068
+ key: external_exports.string(),
16069
+ name: external_exports.string(),
16070
+ version: external_exports.string()
16071
+ }),
16072
+ toolCallId: external_exports.string(),
16073
+ toolName: external_exports.string(),
16074
+ query: external_exports.string()
16075
+ });
16076
+ var checkpointSchema = external_exports.object({
16077
+ id: external_exports.string(),
16078
+ jobId: external_exports.string(),
16079
+ runId: external_exports.string(),
16080
+ status: checkpointStatusSchema,
16081
+ stepNumber: external_exports.number(),
16082
+ messages: external_exports.array(messageSchema),
16083
+ expert: external_exports.object({
16084
+ key: external_exports.string(),
16085
+ name: external_exports.string(),
16086
+ version: external_exports.string()
16087
+ }),
16088
+ delegateTo: external_exports.array(delegationTargetSchema).optional(),
16089
+ delegatedBy: external_exports.object({
16090
+ expert: external_exports.object({
16091
+ key: external_exports.string(),
16092
+ name: external_exports.string(),
16093
+ version: external_exports.string()
16094
+ }),
16095
+ toolCallId: external_exports.string(),
16096
+ toolName: external_exports.string(),
16097
+ checkpointId: external_exports.string(),
16098
+ runId: external_exports.string()
16099
+ }).optional(),
16100
+ usage: usageSchema,
16101
+ contextWindow: external_exports.number().optional(),
16102
+ contextWindowUsage: external_exports.number().optional(),
16103
+ pendingToolCalls: external_exports.array(toolCallSchema).optional(),
16104
+ partialToolResults: external_exports.array(toolResultSchema).optional(),
16105
+ metadata: external_exports.object({}).passthrough().optional(),
16106
+ error: external_exports.object({
16107
+ name: external_exports.string(),
16108
+ message: external_exports.string(),
16109
+ statusCode: external_exports.number().optional(),
16110
+ isRetryable: external_exports.boolean()
16111
+ }).optional(),
16112
+ retryCount: external_exports.number().optional()
16113
+ });
16114
+
16115
+ // ../../packages/core/src/schemas/provider-tools.ts
16116
+ external_exports.enum(["webSearch", "webFetch", "codeExecution"]);
16117
+ var builtinAnthropicSkillSchema = external_exports.object({
16118
+ type: external_exports.literal("builtin"),
16119
+ skillId: external_exports.enum(["pdf", "docx", "pptx", "xlsx"])
16120
+ });
16121
+ var customAnthropicSkillSchema = external_exports.object({
16122
+ type: external_exports.literal("custom"),
16123
+ name: external_exports.string().min(1),
16124
+ definition: external_exports.string().min(1)
16125
+ });
16126
+ var anthropicProviderSkillSchema = external_exports.discriminatedUnion("type", [
16127
+ builtinAnthropicSkillSchema,
16128
+ customAnthropicSkillSchema
16129
+ ]);
16130
+ external_exports.enum([
16131
+ "webSearch",
16132
+ "fileSearch",
16133
+ "codeInterpreter",
16134
+ "imageGeneration"
16135
+ ]);
16136
+ external_exports.enum([
16137
+ "googleSearch",
16138
+ "codeExecution",
16139
+ "urlContext",
16140
+ "fileSearch",
16141
+ "googleMaps"
16142
+ ]);
16143
+ external_exports.enum([
16144
+ "webSearchPreview",
16145
+ "fileSearch",
16146
+ "codeInterpreter",
16147
+ "imageGeneration"
16148
+ ]);
16149
+ external_exports.enum([
16150
+ "codeExecution",
16151
+ "urlContext",
16152
+ "googleSearch",
16153
+ "enterpriseWebSearch",
16154
+ "googleMaps"
16155
+ ]);
16156
+ var webSearchOptionsSchema = external_exports.object({
16157
+ maxUses: external_exports.number().int().positive().optional(),
16158
+ allowedDomains: external_exports.array(external_exports.string()).optional()
16159
+ });
16160
+ var webFetchOptionsSchema = external_exports.object({
16161
+ maxUses: external_exports.number().int().positive().optional()
16162
+ });
16163
+ var fileSearchOptionsSchema = external_exports.object({
16164
+ vectorStoreIds: external_exports.array(external_exports.string()).optional(),
16165
+ maxNumResults: external_exports.number().int().positive().optional()
16166
+ });
16167
+ var providerToolOptionsSchema = external_exports.object({
16168
+ webSearch: webSearchOptionsSchema.optional(),
16169
+ webFetch: webFetchOptionsSchema.optional(),
16170
+ fileSearch: fileSearchOptionsSchema.optional()
16171
+ }).optional();
16172
+
16173
+ // ../../packages/core/src/schemas/runtime-version.ts
16174
+ var runtimeVersionSchema = external_exports.string().regex(/^v\d+\.\d+$/, 'Runtime version must be in format "vX.Y" (e.g., "v1.0")').transform((v) => v);
16175
+
16176
+ // ../../packages/core/src/schemas/skill.ts
16177
+ function isPrivateOrLocalIP(hostname3) {
16178
+ if (hostname3 === "localhost" || hostname3 === "127.0.0.1" || hostname3 === "::1" || hostname3 === "0.0.0.0") {
16179
+ return true;
16180
+ }
16181
+ const ipv4Match = hostname3.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
16182
+ if (ipv4Match) {
16183
+ const a = Number(ipv4Match[1]);
16184
+ const b = Number(ipv4Match[2]);
16185
+ if (a === 10) return true;
16186
+ if (a === 172 && b >= 16 && b <= 31) return true;
16187
+ if (a === 192 && b === 168) return true;
16188
+ if (a === 169 && b === 254) return true;
16189
+ if (a === 127) return true;
16190
+ }
16191
+ if (hostname3.includes(":")) {
16192
+ if (hostname3.startsWith("fe80:") || hostname3.startsWith("fc") || hostname3.startsWith("fd")) {
16193
+ return true;
16194
+ }
16195
+ }
16196
+ if (hostname3.startsWith("::ffff:")) {
16197
+ const ipv4Part = hostname3.slice(7);
16198
+ if (isPrivateOrLocalIP(ipv4Part)) {
16199
+ return true;
16200
+ }
16201
+ }
16202
+ return false;
16203
+ }
16204
+ var sseEndpointSchema = external_exports.string().url().refine(
16205
+ (url2) => {
16206
+ try {
16207
+ const parsed = new URL(url2);
16208
+ if (parsed.protocol !== "https:") return false;
16209
+ if (isPrivateOrLocalIP(parsed.hostname)) return false;
16210
+ return true;
16211
+ } catch {
16212
+ return false;
16213
+ }
16214
+ },
16215
+ { message: "Endpoint must be a public HTTPS URL" }
16216
+ );
16217
+ var mcpStdioSkillSchema = external_exports.object({
16218
+ type: external_exports.literal("mcpStdioSkill"),
16219
+ name: external_exports.string(),
16220
+ description: external_exports.string().optional(),
15875
16221
  rule: external_exports.string().optional(),
15876
16222
  pick: external_exports.array(external_exports.string()).optional().default([]),
15877
16223
  omit: external_exports.array(external_exports.string()).optional().default([]),
@@ -15915,6 +16261,72 @@ var skillSchema = external_exports.discriminatedUnion("type", [
15915
16261
  interactiveSkillSchema
15916
16262
  ]);
15917
16263
 
16264
+ // ../../packages/core/src/schemas/expert.ts
16265
+ var expertSchema = external_exports.object({
16266
+ key: external_exports.string().regex(expertKeyRegex).min(1),
16267
+ name: external_exports.string().regex(expertNameRegex).min(1).max(maxExpertNameLength),
16268
+ version: external_exports.string().regex(expertVersionRegex),
16269
+ description: external_exports.string().max(1024 * 2).optional(),
16270
+ instruction: external_exports.string().min(1).max(1024 * 20),
16271
+ skills: external_exports.record(
16272
+ external_exports.string(),
16273
+ external_exports.discriminatedUnion("type", [
16274
+ mcpStdioSkillSchema.omit({ name: true }),
16275
+ mcpSseSkillSchema.omit({ name: true }),
16276
+ interactiveSkillSchema.omit({ name: true })
16277
+ ])
16278
+ ).optional().default({
16279
+ "@perstack/base": {
16280
+ type: "mcpStdioSkill",
16281
+ description: "Base skill",
16282
+ command: "npx",
16283
+ args: ["-y", "@perstack/base"],
16284
+ pick: [],
16285
+ omit: [],
16286
+ requiredEnv: [],
16287
+ lazyInit: false
16288
+ }
16289
+ }).transform((skills) => {
16290
+ return Object.fromEntries(
16291
+ Object.entries(skills).map(([key, skillWithoutName]) => [
16292
+ key,
16293
+ external_exports.discriminatedUnion("type", [
16294
+ mcpStdioSkillSchema,
16295
+ mcpSseSkillSchema,
16296
+ interactiveSkillSchema
16297
+ ]).parse({ ...skillWithoutName, name: key })
16298
+ ])
16299
+ );
16300
+ }),
16301
+ delegates: external_exports.array(external_exports.string().regex(expertKeyRegex).min(1)).optional().default([]),
16302
+ tags: external_exports.array(external_exports.string().regex(tagNameRegex).min(1)).optional().default([]),
16303
+ minRuntimeVersion: runtimeVersionSchema.default("v1.0"),
16304
+ providerTools: external_exports.array(external_exports.string()).optional(),
16305
+ providerSkills: external_exports.array(anthropicProviderSkillSchema).optional(),
16306
+ providerToolOptions: providerToolOptionsSchema
16307
+ });
16308
+
16309
+ // ../../packages/core/src/schemas/job.ts
16310
+ var jobStatusSchema = external_exports.enum([
16311
+ "running",
16312
+ "completed",
16313
+ "stoppedByMaxSteps",
16314
+ "stoppedByInteractiveTool",
16315
+ "stoppedByError",
16316
+ "stoppedByCancellation"
16317
+ ]);
16318
+ var jobSchema = external_exports.object({
16319
+ id: external_exports.string(),
16320
+ status: jobStatusSchema,
16321
+ coordinatorExpertKey: external_exports.string(),
16322
+ runtimeVersion: runtimeVersionSchema,
16323
+ totalSteps: external_exports.number(),
16324
+ maxSteps: external_exports.number().optional(),
16325
+ usage: usageSchema,
16326
+ startedAt: external_exports.number(),
16327
+ finishedAt: external_exports.number().optional()
16328
+ });
16329
+
15918
16330
  // ../../packages/core/src/schemas/lockfile.ts
15919
16331
  var lockfileToolDefinitionSchema = external_exports.object({
15920
16332
  skillName: external_exports.string(),
@@ -16018,73 +16430,12 @@ var providerConfigSchema = external_exports.discriminatedUnion("providerName", [
16018
16430
  deepseekProviderConfigSchema
16019
16431
  ]);
16020
16432
 
16021
- // ../../packages/core/src/schemas/provider-tools.ts
16022
- external_exports.enum(["webSearch", "webFetch", "codeExecution"]);
16023
- var builtinAnthropicSkillSchema = external_exports.object({
16024
- type: external_exports.literal("builtin"),
16025
- skillId: external_exports.enum(["pdf", "docx", "pptx", "xlsx"])
16026
- });
16027
- var customAnthropicSkillSchema = external_exports.object({
16028
- type: external_exports.literal("custom"),
16029
- name: external_exports.string().min(1),
16030
- definition: external_exports.string().min(1)
16031
- });
16032
- var anthropicProviderSkillSchema = external_exports.discriminatedUnion("type", [
16033
- builtinAnthropicSkillSchema,
16034
- customAnthropicSkillSchema
16035
- ]);
16036
- external_exports.enum([
16037
- "webSearch",
16038
- "fileSearch",
16039
- "codeInterpreter",
16040
- "imageGeneration"
16041
- ]);
16042
- external_exports.enum([
16043
- "googleSearch",
16044
- "codeExecution",
16045
- "urlContext",
16046
- "fileSearch",
16047
- "googleMaps"
16048
- ]);
16049
- external_exports.enum([
16050
- "webSearchPreview",
16051
- "fileSearch",
16052
- "codeInterpreter",
16053
- "imageGeneration"
16054
- ]);
16055
- external_exports.enum([
16056
- "codeExecution",
16057
- "urlContext",
16058
- "googleSearch",
16059
- "enterpriseWebSearch",
16060
- "googleMaps"
16061
- ]);
16062
- var webSearchOptionsSchema = external_exports.object({
16063
- maxUses: external_exports.number().int().positive().optional(),
16064
- allowedDomains: external_exports.array(external_exports.string()).optional()
16065
- });
16066
- var webFetchOptionsSchema = external_exports.object({
16067
- maxUses: external_exports.number().int().positive().optional()
16068
- });
16069
- var fileSearchOptionsSchema = external_exports.object({
16070
- vectorStoreIds: external_exports.array(external_exports.string()).optional(),
16071
- maxNumResults: external_exports.number().int().positive().optional()
16072
- });
16073
- var providerToolOptionsSchema = external_exports.object({
16074
- webSearch: webSearchOptionsSchema.optional(),
16075
- webFetch: webFetchOptionsSchema.optional(),
16076
- fileSearch: fileSearchOptionsSchema.optional()
16077
- }).optional();
16078
-
16079
- // ../../packages/core/src/schemas/runtime-version.ts
16080
- var runtimeVersionSchema = external_exports.string().regex(/^v\d+\.\d+$/, 'Runtime version must be in format "vX.Y" (e.g., "v1.0")').transform((v) => v);
16081
-
16082
- // ../../packages/core/src/schemas/perstack-toml.ts
16083
- var defaultReasoningBudget = "low";
16084
- var reasoningBudgetSchema = external_exports.union([
16085
- external_exports.enum(["none", "minimal", "low", "medium", "high"]),
16086
- external_exports.number().int().nonnegative()
16087
- // 0 disables reasoning (same as "none")
16433
+ // ../../packages/core/src/schemas/perstack-toml.ts
16434
+ var defaultReasoningBudget = "low";
16435
+ var reasoningBudgetSchema = external_exports.union([
16436
+ external_exports.enum(["none", "minimal", "low", "medium", "high"]),
16437
+ external_exports.number().int().nonnegative()
16438
+ // 0 disables reasoning (same as "none")
16088
16439
  ]);
16089
16440
  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])?)*$/;
16090
16441
  var punycodeRegex = /(?:^|\.)(xn--)/i;
@@ -16294,579 +16645,179 @@ var runCommandInputSchema = external_exports.object({
16294
16645
  expertKey: external_exports.string(),
16295
16646
  query: external_exports.string(),
16296
16647
  options: commandOptionsSchema
16297
- });
16298
- var startCommandInputSchema = external_exports.object({
16299
- expertKey: external_exports.string().optional(),
16300
- query: external_exports.string().optional(),
16301
- options: commandOptionsSchema
16302
- });
16303
-
16304
- // ../../packages/core/src/schemas/checkpoint.ts
16305
- var checkpointStatusSchema = external_exports.enum([
16306
- "init",
16307
- "proceeding",
16308
- "completed",
16309
- "stoppedByInteractiveTool",
16310
- "stoppedByDelegate",
16311
- "stoppedByExceededMaxSteps",
16312
- "stoppedByError",
16313
- "stoppedByCancellation"
16314
- ]);
16315
- var delegationTargetSchema = external_exports.object({
16316
- expert: external_exports.object({
16317
- key: external_exports.string(),
16318
- name: external_exports.string(),
16319
- version: external_exports.string()
16320
- }),
16321
- toolCallId: external_exports.string(),
16322
- toolName: external_exports.string(),
16323
- query: external_exports.string()
16324
- });
16325
- var checkpointSchema = external_exports.object({
16326
- id: external_exports.string(),
16327
- jobId: external_exports.string(),
16328
- runId: external_exports.string(),
16329
- status: checkpointStatusSchema,
16330
- stepNumber: external_exports.number(),
16331
- messages: external_exports.array(messageSchema),
16332
- expert: external_exports.object({
16333
- key: external_exports.string(),
16334
- name: external_exports.string(),
16335
- version: external_exports.string()
16336
- }),
16337
- delegateTo: external_exports.array(delegationTargetSchema).optional(),
16338
- delegatedBy: external_exports.object({
16339
- expert: external_exports.object({
16340
- key: external_exports.string(),
16341
- name: external_exports.string(),
16342
- version: external_exports.string()
16343
- }),
16344
- toolCallId: external_exports.string(),
16345
- toolName: external_exports.string(),
16346
- checkpointId: external_exports.string(),
16347
- runId: external_exports.string()
16348
- }).optional(),
16349
- usage: usageSchema,
16350
- contextWindow: external_exports.number().optional(),
16351
- contextWindowUsage: external_exports.number().optional(),
16352
- pendingToolCalls: external_exports.array(toolCallSchema).optional(),
16353
- partialToolResults: external_exports.array(toolResultSchema).optional(),
16354
- metadata: external_exports.object({}).passthrough().optional(),
16355
- error: external_exports.object({
16356
- name: external_exports.string(),
16357
- message: external_exports.string(),
16358
- statusCode: external_exports.number().optional(),
16359
- isRetryable: external_exports.boolean()
16360
- }).optional(),
16361
- retryCount: external_exports.number().optional()
16362
- });
16363
-
16364
- // ../../packages/core/src/schemas/expert.ts
16365
- var expertSchema = external_exports.object({
16366
- key: external_exports.string().regex(expertKeyRegex).min(1),
16367
- name: external_exports.string().regex(expertNameRegex).min(1).max(maxExpertNameLength),
16368
- version: external_exports.string().regex(expertVersionRegex),
16369
- description: external_exports.string().max(1024 * 2).optional(),
16370
- instruction: external_exports.string().min(1).max(1024 * 20),
16371
- skills: external_exports.record(
16372
- external_exports.string(),
16373
- external_exports.discriminatedUnion("type", [
16374
- mcpStdioSkillSchema.omit({ name: true }),
16375
- mcpSseSkillSchema.omit({ name: true }),
16376
- interactiveSkillSchema.omit({ name: true })
16377
- ])
16378
- ).optional().default({
16379
- "@perstack/base": {
16380
- type: "mcpStdioSkill",
16381
- description: "Base skill",
16382
- command: "npx",
16383
- args: ["-y", "@perstack/base"],
16384
- pick: [],
16385
- omit: [],
16386
- requiredEnv: [],
16387
- lazyInit: false
16388
- }
16389
- }).transform((skills) => {
16390
- return Object.fromEntries(
16391
- Object.entries(skills).map(([key, skillWithoutName]) => [
16392
- key,
16393
- external_exports.discriminatedUnion("type", [
16394
- mcpStdioSkillSchema,
16395
- mcpSseSkillSchema,
16396
- interactiveSkillSchema
16397
- ]).parse({ ...skillWithoutName, name: key })
16398
- ])
16399
- );
16400
- }),
16401
- delegates: external_exports.array(external_exports.string().regex(expertKeyRegex).min(1)).optional().default([]),
16402
- tags: external_exports.array(external_exports.string().regex(tagNameRegex).min(1)).optional().default([]),
16403
- minRuntimeVersion: runtimeVersionSchema.default("v1.0"),
16404
- providerTools: external_exports.array(external_exports.string()).optional(),
16405
- providerSkills: external_exports.array(anthropicProviderSkillSchema).optional(),
16406
- providerToolOptions: providerToolOptionsSchema
16407
- });
16408
-
16409
- // ../../packages/core/src/schemas/runtime.ts
16410
- var runSettingSchema = external_exports.object({
16411
- model: external_exports.string(),
16412
- providerConfig: providerConfigSchema,
16413
- jobId: external_exports.string(),
16414
- runId: external_exports.string(),
16415
- expertKey: external_exports.string().min(1).regex(expertKeyRegex),
16416
- input: external_exports.object({
16417
- text: external_exports.string().optional(),
16418
- interactiveToolCallResult: external_exports.object({
16419
- toolCallId: external_exports.string(),
16420
- toolName: external_exports.string(),
16421
- skillName: external_exports.string(),
16422
- text: external_exports.string()
16423
- }).optional()
16424
- }),
16425
- experts: external_exports.record(external_exports.string(), expertSchema),
16426
- reasoningBudget: reasoningBudgetSchema.default(defaultReasoningBudget),
16427
- maxSteps: external_exports.number().min(1).optional().default(defaultMaxSteps),
16428
- maxRetries: external_exports.number().min(0),
16429
- timeout: external_exports.number().min(0),
16430
- startedAt: external_exports.number(),
16431
- updatedAt: external_exports.number(),
16432
- perstackApiBaseUrl: external_exports.string().url(),
16433
- perstackApiKey: external_exports.string().optional(),
16434
- perstackBaseSkillCommand: external_exports.array(external_exports.string()).optional(),
16435
- env: external_exports.record(external_exports.string(), external_exports.string()),
16436
- proxyUrl: external_exports.string().optional(),
16437
- verbose: external_exports.boolean().optional()
16438
- });
16439
- var runParamsSchema = external_exports.object({
16440
- setting: external_exports.object({
16441
- model: external_exports.string(),
16442
- providerConfig: providerConfigSchema,
16443
- jobId: external_exports.string().optional().default(() => createId()),
16444
- runId: external_exports.string().optional().default(() => createId()),
16445
- expertKey: external_exports.string().min(1).regex(expertKeyRegex),
16446
- input: external_exports.object({
16447
- text: external_exports.string().optional(),
16448
- interactiveToolCallResult: external_exports.object({
16449
- toolCallId: external_exports.string(),
16450
- toolName: external_exports.string(),
16451
- skillName: external_exports.string(),
16452
- text: external_exports.string()
16453
- }).optional()
16454
- }),
16455
- experts: external_exports.record(external_exports.string().min(1).regex(expertKeyRegex), expertSchema.omit({ key: true })).optional().default({}).transform(
16456
- (experts) => Object.fromEntries(
16457
- Object.entries(experts).map(([key, expertWithoutKey]) => [
16458
- key,
16459
- expertSchema.parse({
16460
- ...expertWithoutKey,
16461
- key
16462
- })
16463
- ])
16464
- )
16465
- ),
16466
- reasoningBudget: reasoningBudgetSchema.optional().default(defaultReasoningBudget),
16467
- maxSteps: external_exports.number().min(1).optional().default(defaultMaxSteps),
16468
- maxRetries: external_exports.number().min(0).optional().default(defaultMaxRetries),
16469
- timeout: external_exports.number().min(0).optional().default(defaultTimeout),
16470
- startedAt: external_exports.number().optional().default(Date.now()),
16471
- updatedAt: external_exports.number().optional().default(Date.now()),
16472
- perstackApiBaseUrl: external_exports.url().optional().default(defaultPerstackApiBaseUrl),
16473
- perstackApiKey: external_exports.string().optional(),
16474
- perstackBaseSkillCommand: external_exports.array(external_exports.string()).optional(),
16475
- env: external_exports.record(external_exports.string(), external_exports.string()).optional().default({}),
16476
- proxyUrl: external_exports.string().optional(),
16477
- verbose: external_exports.boolean().optional()
16478
- }),
16479
- checkpoint: checkpointSchema.optional()
16480
- });
16481
- function createEvent(type) {
16482
- return (setting, checkpoint, data) => {
16483
- return {
16484
- type,
16485
- id: createId(),
16486
- expertKey: checkpoint.expert.key,
16487
- timestamp: Date.now(),
16488
- jobId: setting.jobId,
16489
- runId: setting.runId,
16490
- stepNumber: checkpoint.stepNumber,
16491
- ...data
16492
- };
16493
- };
16494
- }
16495
- function createStreamingEvent(type, setting, checkpoint, data) {
16496
- return {
16497
- type,
16498
- id: createId(),
16499
- expertKey: checkpoint.expert.key,
16500
- timestamp: Date.now(),
16501
- jobId: setting.jobId,
16502
- runId: setting.runId,
16503
- stepNumber: checkpoint.stepNumber,
16504
- ...data
16505
- };
16506
- }
16507
- var startRun = createEvent("startRun");
16508
- var resumeFromStop = createEvent("resumeFromStop");
16509
- var proceedToInteractiveTools = createEvent("proceedToInteractiveTools");
16510
- var startGeneration = createEvent("startGeneration");
16511
- var retry = createEvent("retry");
16512
- var callTools = createEvent("callTools");
16513
- var finishMcpTools = createEvent("finishMcpTools");
16514
- var skipDelegates = createEvent("skipDelegates");
16515
- var resolveToolResults = createEvent("resolveToolResults");
16516
- var attemptCompletion = createEvent("attemptCompletion");
16517
- var finishToolCall = createEvent("finishToolCall");
16518
- var completeRun = createEvent("completeRun");
16519
- var stopRunByInteractiveTool = createEvent("stopRunByInteractiveTool");
16520
- var stopRunByDelegate = createEvent("stopRunByDelegate");
16521
- var stopRunByExceededMaxSteps = createEvent("stopRunByExceededMaxSteps");
16522
- var stopRunByError = createEvent("stopRunByError");
16523
- var continueToNextStep = createEvent("continueToNextStep");
16524
- function createRuntimeEvent(type, jobId, runId, data) {
16525
- return {
16526
- type,
16527
- id: createId(),
16528
- timestamp: Date.now(),
16529
- jobId,
16530
- runId,
16531
- ...data
16532
- };
16533
- }
16534
- var EXPERT_STATE_EVENT_TYPES = /* @__PURE__ */ new Set([
16535
- "startRun",
16536
- "resumeFromStop",
16537
- "proceedToInteractiveTools",
16538
- "startGeneration",
16539
- "retry",
16540
- "callTools",
16541
- "finishMcpTools",
16542
- "skipDelegates",
16543
- "resolveToolResults",
16544
- "attemptCompletion",
16545
- "finishToolCall",
16546
- "resumeToolCalls",
16547
- "continueToNextStep",
16548
- "stopRunByInteractiveTool",
16549
- "stopRunByDelegate",
16550
- "stopRunByExceededMaxSteps",
16551
- "stopRunByError",
16552
- "completeRun"
16553
- ]);
16554
- var STREAMING_EVENT_TYPES = /* @__PURE__ */ new Set([
16555
- "startStreamingReasoning",
16556
- "streamReasoning",
16557
- "completeStreamingReasoning",
16558
- "startStreamingRunResult",
16559
- "streamRunResult",
16560
- "completeStreamingRunResult"
16561
- ]);
16562
- var RUNTIME_EVENT_TYPES = /* @__PURE__ */ new Set([
16563
- "initializeRuntime",
16564
- "skillStarting",
16565
- "skillConnected",
16566
- "skillStderr",
16567
- "skillDisconnected"
16568
- ]);
16569
- function isValidEventType(type) {
16570
- return EXPERT_STATE_EVENT_TYPES.has(type) || STREAMING_EVENT_TYPES.has(type);
16571
- }
16572
- function isValidRuntimeEventType(type) {
16573
- return RUNTIME_EVENT_TYPES.has(type);
16574
- }
16575
-
16576
- // ../../packages/core/src/utils/env-filter.ts
16577
- var SAFE_ENV_VARS = [
16578
- // System
16579
- "PATH",
16580
- "HOME",
16581
- "SHELL",
16582
- "TERM",
16583
- "NODE_PATH",
16584
- // Proxy
16585
- "HTTP_PROXY",
16586
- "HTTPS_PROXY",
16587
- "http_proxy",
16588
- "https_proxy",
16589
- "NO_PROXY",
16590
- "no_proxy",
16591
- "PERSTACK_PROXY_URL",
16592
- "NPM_CONFIG_PROXY",
16593
- "NPM_CONFIG_HTTPS_PROXY"
16594
- ];
16595
- var PROTECTED_ENV_VARS = /* @__PURE__ */ new Set([
16596
- "PATH",
16597
- "HOME",
16598
- "SHELL",
16599
- "NODE_PATH",
16600
- "LD_PRELOAD",
16601
- "LD_LIBRARY_PATH",
16602
- "DYLD_INSERT_LIBRARIES",
16603
- "DYLD_LIBRARY_PATH",
16604
- "NODE_OPTIONS",
16605
- "PYTHONPATH",
16606
- "PERL5LIB",
16607
- "RUBYLIB"
16608
- ]);
16609
- function getFilteredEnv(additional) {
16610
- const filtered = {};
16611
- for (const key of SAFE_ENV_VARS) {
16612
- if (process.env[key]) {
16613
- filtered[key] = process.env[key];
16614
- }
16615
- }
16616
- if (additional) {
16617
- for (const [key, value] of Object.entries(additional)) {
16618
- if (!PROTECTED_ENV_VARS.has(key.toUpperCase())) {
16619
- filtered[key] = value;
16620
- }
16621
- }
16622
- }
16623
- return filtered;
16624
- }
16625
-
16626
- // ../../packages/core/src/utils/event-filter.ts
16627
- function validateEventFilter(filter) {
16628
- const invalid = filter.filter((type) => !isValidEventType(type) && !isValidRuntimeEventType(type));
16629
- if (invalid.length > 0) {
16630
- throw new Error(
16631
- `Invalid event type(s): ${invalid.join(", ")}. Valid event types are: startRun, completeRun, stopRunByError, callTools, etc. See documentation for full list.`
16632
- );
16633
- }
16634
- return filter;
16635
- }
16636
- function createFilteredEventListener(listener, allowedTypes) {
16637
- return (event) => {
16638
- if (allowedTypes.has(event.type)) {
16639
- listener(event);
16640
- }
16641
- };
16642
- }
16643
-
16644
- // ../../packages/core/src/utils/zod-error.ts
16645
- function formatZodError(error48) {
16646
- const issues = error48.issues.map((issue2) => {
16647
- const path = issue2.path.length > 0 ? `${issue2.path.join(".")}: ` : "";
16648
- return ` - ${path}${issue2.message}`;
16649
- });
16650
- return `Validation failed:
16651
- ${issues.join("\n")}`;
16652
- }
16653
- function parseWithFriendlyError(schema, data, context) {
16654
- const result = schema.safeParse(data);
16655
- if (result.success) {
16656
- return result.data;
16657
- }
16658
- const prefix = context ? `${context}: ` : "";
16659
- throw new Error(`${prefix}${formatZodError(result.error)}`);
16660
- }
16661
-
16662
- // ../../packages/core/src/known-models/index.ts
16663
- var knownModels = [
16664
- {
16665
- provider: "anthropic",
16666
- models: [
16667
- // https://docs.claude.com/en/docs/about-claude/models/overview#model-comparison-table
16668
- {
16669
- name: "claude-opus-4-5",
16670
- contextWindow: 2e5,
16671
- maxOutputTokens: 32e3
16672
- },
16673
- {
16674
- name: "claude-opus-4-1",
16675
- contextWindow: 2e5,
16676
- maxOutputTokens: 32e3
16677
- },
16678
- {
16679
- name: "claude-opus-4-20250514",
16680
- contextWindow: 2e5,
16681
- maxOutputTokens: 32e3
16682
- },
16683
- {
16684
- name: "claude-sonnet-4-5",
16685
- contextWindow: 2e5,
16686
- maxOutputTokens: 64e3
16687
- },
16688
- {
16689
- name: "claude-sonnet-4-20250514",
16690
- contextWindow: 2e5,
16691
- maxOutputTokens: 64e3
16692
- },
16693
- {
16694
- name: "claude-3-7-sonnet-20250219",
16695
- contextWindow: 2e5,
16696
- maxOutputTokens: 64e3
16697
- },
16698
- {
16699
- name: "claude-haiku-4-5",
16700
- contextWindow: 2e5,
16701
- maxOutputTokens: 8192
16702
- },
16703
- {
16704
- name: "claude-3-5-haiku-latest",
16705
- contextWindow: 2e5,
16706
- maxOutputTokens: 8192
16707
- }
16708
- ]
16709
- },
16710
- {
16711
- provider: "google",
16712
- models: [
16713
- // https://ai.google.dev/gemini-api/docs/models#gemini-3-pro
16714
- {
16715
- name: "gemini-3-pro-preview",
16716
- contextWindow: 1048576,
16717
- maxOutputTokens: 65536
16718
- },
16719
- // https://ai.google.dev/gemini-api/docs/models#gemini-2.5-pro
16720
- {
16721
- name: "gemini-2.5-pro",
16722
- contextWindow: 1048576,
16723
- maxOutputTokens: 65536
16724
- },
16725
- // https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash
16726
- {
16727
- name: "gemini-2.5-flash",
16728
- contextWindow: 1048576,
16729
- maxOutputTokens: 65536
16730
- },
16731
- // https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-lite
16732
- {
16733
- name: "gemini-2.5-flash-lite",
16734
- contextWindow: 1048576,
16735
- maxOutputTokens: 65536
16736
- }
16737
- ]
16738
- },
16739
- {
16740
- provider: "openai",
16741
- models: [
16742
- // https://platform.openai.com/docs/models/gpt-5
16743
- {
16744
- name: "gpt-5",
16745
- contextWindow: 4e5,
16746
- maxOutputTokens: 128e3
16747
- },
16748
- // https://platform.openai.com/docs/models/gpt-5-mini
16749
- {
16750
- name: "gpt-5-mini",
16751
- contextWindow: 4e5,
16752
- maxOutputTokens: 128e3
16753
- },
16754
- // https://platform.openai.com/docs/models/gpt-5-nano
16755
- {
16756
- name: "gpt-5-nano",
16757
- contextWindow: 4e5,
16758
- maxOutputTokens: 128e3
16759
- },
16760
- // https://platform.openai.com/docs/models/gpt-5-chat-latest
16761
- {
16762
- name: "gpt-5-chat-latest",
16763
- contextWindow: 128e3,
16764
- maxOutputTokens: 16384
16765
- },
16766
- // https://platform.openai.com/docs/models/o4-mini
16767
- {
16768
- name: "o4-mini",
16769
- contextWindow: 2e5,
16770
- maxOutputTokens: 1e5
16771
- },
16772
- // https://platform.openai.com/docs/models/o3
16773
- {
16774
- name: "o3",
16775
- contextWindow: 2e5,
16776
- maxOutputTokens: 1e4
16777
- },
16778
- // https://platform.openai.com/docs/models/o3-mini
16779
- {
16780
- name: "o3-mini",
16781
- contextWindow: 2e5,
16782
- maxOutputTokens: 1e4
16783
- },
16784
- // https://platform.openai.com/docs/models/gpt-4.1
16785
- {
16786
- name: "gpt-4.1",
16787
- contextWindow: 1047576,
16788
- maxOutputTokens: 32768
16789
- }
16790
- ]
16791
- },
16792
- {
16793
- provider: "deepseek",
16794
- models: [
16795
- {
16796
- name: "deepseek-chat",
16797
- contextWindow: 128e3,
16798
- maxOutputTokens: 8192
16799
- },
16800
- {
16801
- name: "deepseek-reasoner",
16802
- contextWindow: 128e3,
16803
- maxOutputTokens: 64e3
16804
- }
16805
- ]
16806
- },
16807
- {
16808
- provider: "ollama",
16809
- models: [
16810
- // https://platform.openai.com/docs/models/gpt-oss-20b
16811
- {
16812
- name: "gpt-oss:20b",
16813
- contextWindow: 131072,
16814
- maxOutputTokens: 131072
16815
- },
16816
- // https://platform.openai.com/docs/models/gpt-oss-120b
16817
- {
16818
- name: "gpt-oss:120b",
16819
- contextWindow: 131072,
16820
- maxOutputTokens: 131072
16821
- },
16822
- // https://ai.google.dev/gemma/docs/core/model_card_3
16823
- {
16824
- name: "gemma3:1b",
16825
- contextWindow: 32e3,
16826
- maxOutputTokens: 32e3
16827
- },
16828
- // https://ai.google.dev/gemma/docs/core/model_card_3
16829
- {
16830
- name: "gemma3:4b",
16831
- contextWindow: 128e3,
16832
- maxOutputTokens: 128e3
16833
- },
16834
- // https://ai.google.dev/gemma/docs/core/model_card_3
16835
- {
16836
- name: "gemma3:12b",
16837
- contextWindow: 128e3,
16838
- maxOutputTokens: 128e3
16839
- },
16840
- // https://ai.google.dev/gemma/docs/core/model_card_3
16841
- {
16842
- name: "gemma3:27b",
16843
- contextWindow: 128e3,
16844
- maxOutputTokens: 128e3
16845
- }
16846
- ]
16847
- }
16848
- ];
16849
-
16850
- // ../../packages/core/src/schemas/job.ts
16851
- var jobStatusSchema = external_exports.enum([
16852
- "running",
16853
- "completed",
16854
- "stoppedByMaxSteps",
16855
- "stoppedByInteractiveTool",
16856
- "stoppedByError",
16857
- "stoppedByCancellation"
16858
- ]);
16859
- var jobSchema = external_exports.object({
16860
- id: external_exports.string(),
16861
- status: jobStatusSchema,
16862
- coordinatorExpertKey: external_exports.string(),
16863
- runtimeVersion: runtimeVersionSchema,
16864
- totalSteps: external_exports.number(),
16865
- maxSteps: external_exports.number().optional(),
16866
- usage: usageSchema,
16648
+ });
16649
+ var startCommandInputSchema = external_exports.object({
16650
+ expertKey: external_exports.string().optional(),
16651
+ query: external_exports.string().optional(),
16652
+ options: commandOptionsSchema
16653
+ });
16654
+
16655
+ // ../../packages/core/src/schemas/runtime.ts
16656
+ var runSettingSchema = external_exports.object({
16657
+ model: external_exports.string(),
16658
+ providerConfig: providerConfigSchema,
16659
+ jobId: external_exports.string(),
16660
+ runId: external_exports.string(),
16661
+ expertKey: external_exports.string().min(1).regex(expertKeyRegex),
16662
+ input: external_exports.object({
16663
+ text: external_exports.string().optional(),
16664
+ interactiveToolCallResult: external_exports.object({
16665
+ toolCallId: external_exports.string(),
16666
+ toolName: external_exports.string(),
16667
+ skillName: external_exports.string(),
16668
+ text: external_exports.string()
16669
+ }).optional()
16670
+ }),
16671
+ experts: external_exports.record(external_exports.string(), expertSchema),
16672
+ reasoningBudget: reasoningBudgetSchema.default(defaultReasoningBudget),
16673
+ maxSteps: external_exports.number().min(1).optional().default(defaultMaxSteps),
16674
+ maxRetries: external_exports.number().min(0),
16675
+ timeout: external_exports.number().min(0),
16867
16676
  startedAt: external_exports.number(),
16868
- finishedAt: external_exports.number().optional()
16677
+ updatedAt: external_exports.number(),
16678
+ perstackApiBaseUrl: external_exports.string().url(),
16679
+ perstackApiKey: external_exports.string().optional(),
16680
+ perstackBaseSkillCommand: external_exports.array(external_exports.string()).optional(),
16681
+ env: external_exports.record(external_exports.string(), external_exports.string()),
16682
+ proxyUrl: external_exports.string().optional(),
16683
+ verbose: external_exports.boolean().optional()
16684
+ });
16685
+ var runParamsSchema = external_exports.object({
16686
+ setting: external_exports.object({
16687
+ model: external_exports.string(),
16688
+ providerConfig: providerConfigSchema,
16689
+ jobId: external_exports.string().optional().default(() => createId()),
16690
+ runId: external_exports.string().optional().default(() => createId()),
16691
+ expertKey: external_exports.string().min(1).regex(expertKeyRegex),
16692
+ input: external_exports.object({
16693
+ text: external_exports.string().optional(),
16694
+ interactiveToolCallResult: external_exports.object({
16695
+ toolCallId: external_exports.string(),
16696
+ toolName: external_exports.string(),
16697
+ skillName: external_exports.string(),
16698
+ text: external_exports.string()
16699
+ }).optional()
16700
+ }),
16701
+ experts: external_exports.record(external_exports.string().min(1).regex(expertKeyRegex), expertSchema.omit({ key: true })).optional().default({}).transform(
16702
+ (experts) => Object.fromEntries(
16703
+ Object.entries(experts).map(([key, expertWithoutKey]) => [
16704
+ key,
16705
+ expertSchema.parse({
16706
+ ...expertWithoutKey,
16707
+ key
16708
+ })
16709
+ ])
16710
+ )
16711
+ ),
16712
+ reasoningBudget: reasoningBudgetSchema.optional().default(defaultReasoningBudget),
16713
+ maxSteps: external_exports.number().min(1).optional().default(defaultMaxSteps),
16714
+ maxRetries: external_exports.number().min(0).optional().default(defaultMaxRetries),
16715
+ timeout: external_exports.number().min(0).optional().default(defaultTimeout),
16716
+ startedAt: external_exports.number().optional().default(Date.now()),
16717
+ updatedAt: external_exports.number().optional().default(Date.now()),
16718
+ perstackApiBaseUrl: external_exports.url().optional().default(defaultPerstackApiBaseUrl),
16719
+ perstackApiKey: external_exports.string().optional(),
16720
+ perstackBaseSkillCommand: external_exports.array(external_exports.string()).optional(),
16721
+ env: external_exports.record(external_exports.string(), external_exports.string()).optional().default({}),
16722
+ proxyUrl: external_exports.string().optional(),
16723
+ verbose: external_exports.boolean().optional()
16724
+ }),
16725
+ checkpoint: checkpointSchema.optional()
16869
16726
  });
16727
+ function createEvent(type) {
16728
+ return (setting, checkpoint, data) => {
16729
+ return {
16730
+ type,
16731
+ id: createId(),
16732
+ expertKey: checkpoint.expert.key,
16733
+ timestamp: Date.now(),
16734
+ jobId: setting.jobId,
16735
+ runId: setting.runId,
16736
+ stepNumber: checkpoint.stepNumber,
16737
+ ...data
16738
+ };
16739
+ };
16740
+ }
16741
+ function createStreamingEvent(type, setting, checkpoint, data) {
16742
+ return {
16743
+ type,
16744
+ id: createId(),
16745
+ expertKey: checkpoint.expert.key,
16746
+ timestamp: Date.now(),
16747
+ jobId: setting.jobId,
16748
+ runId: setting.runId,
16749
+ stepNumber: checkpoint.stepNumber,
16750
+ ...data
16751
+ };
16752
+ }
16753
+ var startRun = createEvent("startRun");
16754
+ var resumeFromStop = createEvent("resumeFromStop");
16755
+ var proceedToInteractiveTools = createEvent("proceedToInteractiveTools");
16756
+ var startGeneration = createEvent("startGeneration");
16757
+ var retry = createEvent("retry");
16758
+ var callTools = createEvent("callTools");
16759
+ var finishMcpTools = createEvent("finishMcpTools");
16760
+ var skipDelegates = createEvent("skipDelegates");
16761
+ var resolveToolResults = createEvent("resolveToolResults");
16762
+ var attemptCompletion = createEvent("attemptCompletion");
16763
+ var finishToolCall = createEvent("finishToolCall");
16764
+ var completeRun = createEvent("completeRun");
16765
+ var stopRunByInteractiveTool = createEvent("stopRunByInteractiveTool");
16766
+ var stopRunByDelegate = createEvent("stopRunByDelegate");
16767
+ var stopRunByExceededMaxSteps = createEvent("stopRunByExceededMaxSteps");
16768
+ var stopRunByError = createEvent("stopRunByError");
16769
+ var continueToNextStep = createEvent("continueToNextStep");
16770
+ function createRuntimeEvent(type, jobId, runId, data) {
16771
+ return {
16772
+ type,
16773
+ id: createId(),
16774
+ timestamp: Date.now(),
16775
+ jobId,
16776
+ runId,
16777
+ ...data
16778
+ };
16779
+ }
16780
+ var EXPERT_STATE_EVENT_TYPES = /* @__PURE__ */ new Set([
16781
+ "startRun",
16782
+ "resumeFromStop",
16783
+ "proceedToInteractiveTools",
16784
+ "startGeneration",
16785
+ "retry",
16786
+ "callTools",
16787
+ "finishMcpTools",
16788
+ "skipDelegates",
16789
+ "resolveToolResults",
16790
+ "attemptCompletion",
16791
+ "finishToolCall",
16792
+ "resumeToolCalls",
16793
+ "continueToNextStep",
16794
+ "stopRunByInteractiveTool",
16795
+ "stopRunByDelegate",
16796
+ "stopRunByExceededMaxSteps",
16797
+ "stopRunByError",
16798
+ "completeRun"
16799
+ ]);
16800
+ var STREAMING_EVENT_TYPES = /* @__PURE__ */ new Set([
16801
+ "startStreamingReasoning",
16802
+ "streamReasoning",
16803
+ "completeStreamingReasoning",
16804
+ "startStreamingRunResult",
16805
+ "streamRunResult",
16806
+ "completeStreamingRunResult"
16807
+ ]);
16808
+ var RUNTIME_EVENT_TYPES = /* @__PURE__ */ new Set([
16809
+ "initializeRuntime",
16810
+ "skillStarting",
16811
+ "skillConnected",
16812
+ "skillStderr",
16813
+ "skillDisconnected"
16814
+ ]);
16815
+ function isValidEventType(type) {
16816
+ return EXPERT_STATE_EVENT_TYPES.has(type) || STREAMING_EVENT_TYPES.has(type);
16817
+ }
16818
+ function isValidRuntimeEventType(type) {
16819
+ return RUNTIME_EVENT_TYPES.has(type);
16820
+ }
16870
16821
 
16871
16822
  // ../../packages/core/src/schemas/step.ts
16872
16823
  external_exports.object({
@@ -17165,12 +17116,98 @@ function parseListDirectoryFromResult(result) {
17165
17116
  return void 0;
17166
17117
  }
17167
17118
  }
17119
+
17120
+ // ../../packages/core/src/utils/env-filter.ts
17121
+ var SAFE_ENV_VARS = [
17122
+ // System
17123
+ "PATH",
17124
+ "HOME",
17125
+ "SHELL",
17126
+ "TERM",
17127
+ "NODE_PATH",
17128
+ // Proxy
17129
+ "HTTP_PROXY",
17130
+ "HTTPS_PROXY",
17131
+ "http_proxy",
17132
+ "https_proxy",
17133
+ "NO_PROXY",
17134
+ "no_proxy",
17135
+ "PERSTACK_PROXY_URL",
17136
+ "NPM_CONFIG_PROXY",
17137
+ "NPM_CONFIG_HTTPS_PROXY"
17138
+ ];
17139
+ var PROTECTED_ENV_VARS = /* @__PURE__ */ new Set([
17140
+ "PATH",
17141
+ "HOME",
17142
+ "SHELL",
17143
+ "NODE_PATH",
17144
+ "LD_PRELOAD",
17145
+ "LD_LIBRARY_PATH",
17146
+ "DYLD_INSERT_LIBRARIES",
17147
+ "DYLD_LIBRARY_PATH",
17148
+ "NODE_OPTIONS",
17149
+ "PYTHONPATH",
17150
+ "PERL5LIB",
17151
+ "RUBYLIB"
17152
+ ]);
17153
+ function getFilteredEnv(additional) {
17154
+ const filtered = {};
17155
+ for (const key of SAFE_ENV_VARS) {
17156
+ if (process.env[key]) {
17157
+ filtered[key] = process.env[key];
17158
+ }
17159
+ }
17160
+ if (additional) {
17161
+ for (const [key, value] of Object.entries(additional)) {
17162
+ if (!PROTECTED_ENV_VARS.has(key.toUpperCase())) {
17163
+ filtered[key] = value;
17164
+ }
17165
+ }
17166
+ }
17167
+ return filtered;
17168
+ }
17169
+
17170
+ // ../../packages/core/src/utils/event-filter.ts
17171
+ function validateEventFilter(filter) {
17172
+ const invalid = filter.filter((type) => !isValidEventType(type) && !isValidRuntimeEventType(type));
17173
+ if (invalid.length > 0) {
17174
+ throw new PerstackError(
17175
+ `Invalid event type(s): ${invalid.join(", ")}. Valid event types are: startRun, completeRun, stopRunByError, callTools, etc. See documentation for full list.`
17176
+ );
17177
+ }
17178
+ return filter;
17179
+ }
17180
+ function createFilteredEventListener(listener, allowedTypes) {
17181
+ return (event) => {
17182
+ if (allowedTypes.has(event.type)) {
17183
+ listener(event);
17184
+ }
17185
+ };
17186
+ }
17187
+
17188
+ // ../../packages/core/src/utils/zod-error.ts
17189
+ function formatZodError(error48) {
17190
+ const issues = error48.issues.map((issue2) => {
17191
+ const path = issue2.path.length > 0 ? `${issue2.path.join(".")}: ` : "";
17192
+ return ` - ${path}${issue2.message}`;
17193
+ });
17194
+ return `Validation failed:
17195
+ ${issues.join("\n")}`;
17196
+ }
17197
+ function parseWithFriendlyError(schema, data, context) {
17198
+ const result = schema.safeParse(data);
17199
+ if (result.success) {
17200
+ return result.data;
17201
+ }
17202
+ const prefix = context ? `${context}: ` : "";
17203
+ throw new PerstackError(`${prefix}${formatZodError(result.error)}`);
17204
+ }
17168
17205
  /*! Bundled license information:
17169
17206
 
17170
17207
  @noble/hashes/utils.js:
17171
17208
  (*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
17172
17209
  */
17173
17210
 
17174
- export { $ZodObject, $ZodType, $constructor, BASE_SKILL_PREFIX, NEVER, ZodIssueCode, ZodOptional, _enum2 as _enum, _null3 as _null, activityOrGroupSchema, any, array, attemptCompletion, boolean2 as boolean, callTools, checkpointSchema, clone2 as clone, coerce_exports, completeRun, continueToNextStep, createBaseToolActivity, createFilteredEventListener, createGeneralToolActivity, createId, createRuntimeEvent, createStreamingEvent, custom, defaultMaxRetries, defaultPerstackApiBaseUrl, defaultTimeout, defineLazy, discriminatedUnion, expertSchema, external_exports, finishMcpTools, finishToolCall, getFilteredEnv, instructionMessageSchema, intersection, iso_exports, jobSchema, knownModels, literal, lockfileSchema, looseObject, messageSchema, normalizeParams, number2 as number, object, optional, parse, parseAsync, parseWithFriendlyError, perstackConfigSchema, preprocess, proceedToInteractiveTools, record, resolveToolResults, resumeFromStop, retry, runCommandInputSchema, runParamsSchema, runSettingSchema, safeParse, safeParseAsync, safeParseAsync2, skipDelegates, startCommandInputSchema, startGeneration, startRun, stopRunByDelegate, stopRunByError, stopRunByExceededMaxSteps, stopRunByInteractiveTool, string2 as string, toJSONSchema, toolCallSchema, toolMessageSchema, toolResultSchema, union, unknown, url, usageSchema, userMessageSchema, validateEventFilter };
17175
- //# sourceMappingURL=chunk-FVVK5V2C.js.map
17176
- //# sourceMappingURL=chunk-FVVK5V2C.js.map
17211
+ export { $ZodObject, $ZodType, $constructor, BASE_SKILL_PREFIX, NEVER, PerstackError, ZodIssueCode, ZodOptional, _enum2 as _enum, _null3 as _null, activityOrGroupSchema, any, array, attemptCompletion, boolean2 as boolean, callTools, checkpointSchema, clone2 as clone, coerce_exports, completeRun, continueToNextStep, createBaseToolActivity, createFilteredEventListener, createGeneralToolActivity, createId, createRuntimeEvent, createStreamingEvent, custom, defaultMaxRetries, defaultPerstackApiBaseUrl, defaultTimeout, defineLazy, discriminatedUnion, expertSchema, external_exports, finishMcpTools, finishToolCall, getFilteredEnv, instructionMessageSchema, intersection, iso_exports, jobSchema, knownModels, literal, lockfileSchema, looseObject, messageSchema, normalizeParams, number2 as number, object, optional, parse, parseAsync, parseWithFriendlyError, perstackConfigSchema, preprocess, proceedToInteractiveTools, record, resolveToolResults, resumeFromStop, retry, runCommandInputSchema, runParamsSchema, runSettingSchema, safeParse, safeParseAsync, safeParseAsync2, skipDelegates, startCommandInputSchema, startGeneration, startRun, stopRunByDelegate, stopRunByError, stopRunByExceededMaxSteps, stopRunByInteractiveTool, string2 as string, toJSONSchema, toolCallSchema, toolMessageSchema, toolResultSchema, union, unknown, url, usageSchema, userMessageSchema, validateEventFilter };
17212
+ //# sourceMappingURL=chunk-6IYHM4GX.js.map
17213
+ //# sourceMappingURL=chunk-6IYHM4GX.js.map