@agentstep/agent-sdk 0.4.41 → 0.5.0

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 (195) hide show
  1. package/dist/auth/middleware.js +8 -8
  2. package/dist/backends/claude/args.js +6 -6
  3. package/dist/backends/claude/index.js +7 -7
  4. package/dist/backends/codex/args.js +1 -1
  5. package/dist/backends/codex/auth.js +6 -6
  6. package/dist/backends/codex/index.js +8 -8
  7. package/dist/backends/factory/args.js +1 -1
  8. package/dist/backends/factory/auth.js +6 -6
  9. package/dist/backends/factory/index.js +8 -8
  10. package/dist/backends/gemini/args.js +1 -1
  11. package/dist/backends/gemini/auth.js +6 -6
  12. package/dist/backends/gemini/index.js +8 -8
  13. package/dist/backends/opencode/args.js +1 -1
  14. package/dist/backends/opencode/auth.js +6 -6
  15. package/dist/backends/opencode/index.js +9 -9
  16. package/dist/backends/opencode/mcp.js +1 -1
  17. package/dist/backends/pi/args.js +1 -1
  18. package/dist/backends/pi/auth.js +6 -6
  19. package/dist/backends/pi/index.js +8 -8
  20. package/dist/backends/registry.js +24 -24
  21. package/dist/{chunk-L2RX552S.js → chunk-22OUZJAV.js} +3 -3
  22. package/dist/{chunk-PIJKJNGB.js → chunk-24IDJ7LY.js} +4 -4
  23. package/dist/{chunk-WCDWL6ED.js → chunk-2YZOIFVN.js} +49 -0
  24. package/dist/{chunk-RDGOGAQ5.js → chunk-3FLQ7KZP.js} +1 -1
  25. package/dist/{chunk-ZQXBHNEZ.js → chunk-3PA4NXRP.js} +2 -2
  26. package/dist/{chunk-H7UKW666.js → chunk-445EL6J5.js} +1 -1
  27. package/dist/{chunk-2RSL5SO7.js → chunk-4D345E27.js} +2 -2
  28. package/dist/{chunk-2Z2KAPUL.js → chunk-4RDILRIO.js} +3 -3
  29. package/dist/{chunk-MHBLVGRF.js → chunk-5MERXOLJ.js} +4 -4
  30. package/dist/{chunk-E7DD7F7J.js → chunk-5U5LRAFJ.js} +2 -2
  31. package/dist/{chunk-34EB622U.js → chunk-64IQEPSD.js} +2 -2
  32. package/dist/{chunk-ENGKR2JT.js → chunk-6CVQDSTS.js} +1 -1
  33. package/dist/{chunk-T5VRE77P.js → chunk-6KWJASEO.js} +1 -1
  34. package/dist/{chunk-W2NHS4IF.js → chunk-6QZ23WRF.js} +15 -19
  35. package/dist/{chunk-DU7LSFQQ.js → chunk-7SY65LWY.js} +6 -9
  36. package/dist/{chunk-C46UG6GQ.js → chunk-A6VORSKD.js} +1 -1
  37. package/dist/{chunk-3FDE3BPB.js → chunk-AB7MPL3H.js} +6 -6
  38. package/dist/{chunk-RP6WQ4IH.js → chunk-AJL3T5JS.js} +3 -3
  39. package/dist/{chunk-KKCLTWG7.js → chunk-AXBM7HAR.js} +1 -1
  40. package/dist/{chunk-ZTH5JRZG.js → chunk-BCIFFAGW.js} +41 -10
  41. package/dist/{chunk-OXWELRJL.js → chunk-CBPO2P4I.js} +101 -16
  42. package/dist/{chunk-32XS3Y6P.js → chunk-CLSGNQ7J.js} +8 -8
  43. package/dist/{chunk-SV2B3P6B.js → chunk-DBFPJSOY.js} +19 -17
  44. package/dist/{chunk-JWH4OIBP.js → chunk-DJZSPWG2.js} +4 -4
  45. package/dist/{chunk-JZL4L54R.js → chunk-DKLHYSPW.js} +2 -2
  46. package/dist/{chunk-NQVRZAIX.js → chunk-DMMNAQUM.js} +2 -2
  47. package/dist/{chunk-Y6SFUNGO.js → chunk-EOJ66GY7.js} +4 -4
  48. package/dist/{chunk-EUINGLHA.js → chunk-EWIWVXXP.js} +30 -20
  49. package/dist/{chunk-5EKQBD2H.js → chunk-FCUXFLNK.js} +2 -2
  50. package/dist/{chunk-LAVHQCRP.js → chunk-FSQ4HGHX.js} +3 -3
  51. package/dist/{chunk-WQARLGBG.js → chunk-GCQDNUS2.js} +3 -3
  52. package/dist/{chunk-MXOG5SAO.js → chunk-GFSRNOPI.js} +11 -14
  53. package/dist/{chunk-S7W3KJYH.js → chunk-GIMDS46L.js} +9 -4
  54. package/dist/{chunk-FP4E3QUS.js → chunk-GLKWJESP.js} +2 -2
  55. package/dist/{chunk-FDBR634Z.js → chunk-GV6GUSCP.js} +6 -6
  56. package/dist/{chunk-X6IQ57SC.js → chunk-H6OT5GUL.js} +9 -5
  57. package/dist/{chunk-TPPLYCJF.js → chunk-HMOSAXVZ.js} +2 -2
  58. package/dist/{chunk-L5RW66H5.js → chunk-HVLYE4S5.js} +1 -1
  59. package/dist/{chunk-RVR6C22M.js → chunk-HWR2HYQJ.js} +1 -1
  60. package/dist/{chunk-HH4OXSOV.js → chunk-HY3T4YJV.js} +5 -5
  61. package/dist/{chunk-AR2TM7CR.js → chunk-I26QP3A3.js} +1 -1
  62. package/dist/{chunk-D2TRWKVQ.js → chunk-I2WVMCYN.js} +80 -2
  63. package/dist/{chunk-JHGJG2Z2.js → chunk-IBYOMAZ3.js} +1 -1
  64. package/dist/{chunk-SUGSHXND.js → chunk-IEZFRNLC.js} +2 -2
  65. package/dist/{chunk-ZMJ4EP4C.js → chunk-ILHIHMO3.js} +7 -2
  66. package/dist/{chunk-XWWLMJXT.js → chunk-IRW7AYTP.js} +6 -15
  67. package/dist/{chunk-N76ZVITA.js → chunk-JFOHGHW5.js} +9 -9
  68. package/dist/{chunk-DAVYI5H4.js → chunk-JLUCJMAQ.js} +23 -23
  69. package/dist/{chunk-GVPJL3XS.js → chunk-JP7Y3TKK.js} +5 -5
  70. package/dist/{chunk-TH7WJLZC.js → chunk-KGBKIJPF.js} +3 -3
  71. package/dist/{chunk-MQQ44IGX.js → chunk-KKAJC3Z2.js} +3 -3
  72. package/dist/{chunk-3NK6YTA5.js → chunk-KUWJJD6O.js} +42 -8
  73. package/dist/{chunk-2GIX4HAT.js → chunk-L26TVIB6.js} +2 -2
  74. package/dist/{chunk-KLN6HPYM.js → chunk-L3IACZ72.js} +1 -1
  75. package/dist/{chunk-C6AXM3M7.js → chunk-LQP6XGFU.js} +2 -2
  76. package/dist/{chunk-YBZJHDSE.js → chunk-MAJWADF7.js} +2 -2
  77. package/dist/{chunk-7GG3FEK2.js → chunk-MCWCRZM4.js} +4 -4
  78. package/dist/{chunk-JCW3ZRES.js → chunk-MQBMXAPU.js} +1 -1
  79. package/dist/{chunk-CREPPDHX.js → chunk-NDTIDWBE.js} +1 -1
  80. package/dist/{chunk-5EQJOUWM.js → chunk-NHAYKVXG.js} +2 -2
  81. package/dist/{chunk-FXLUSECC.js → chunk-NKQVOAWN.js} +1 -1
  82. package/dist/{chunk-ZYISLRS6.js → chunk-OKT2J4ZB.js} +114 -37
  83. package/dist/{chunk-V5HWHJ4P.js → chunk-OSNMIPHV.js} +1 -1
  84. package/dist/{chunk-ZFJPOQSY.js → chunk-OZFSKR2W.js} +69 -30
  85. package/dist/{chunk-3IV56JJW.js → chunk-P56WU3UT.js} +3 -2
  86. package/dist/{chunk-NQX7WBA4.js → chunk-PJYCPDV5.js} +14 -9
  87. package/dist/{chunk-LMNFIJ6M.js → chunk-PN3AWRMX.js} +15 -15
  88. package/dist/{chunk-ZMNQ2YJ6.js → chunk-PNZF7HIU.js} +3 -3
  89. package/dist/{chunk-R5T4LJSK.js → chunk-PZNAQBHQ.js} +2 -2
  90. package/dist/{chunk-RH4GKU52.js → chunk-QTXAWC5J.js} +18 -3
  91. package/dist/{chunk-2I35VGHX.js → chunk-R3QHLKJG.js} +2 -2
  92. package/dist/{chunk-OGJUSGF7.js → chunk-R6EEBWM3.js} +1 -1
  93. package/dist/{chunk-V66YKIW6.js → chunk-RYJXSXCV.js} +5 -5
  94. package/dist/{chunk-CHDQ3HIR.js → chunk-S7DFMJR5.js} +5 -9
  95. package/dist/{chunk-V2R7RWVY.js → chunk-STJNO6SL.js} +1 -1
  96. package/dist/{chunk-USYY3L7G.js → chunk-T3FQPTOA.js} +2 -2
  97. package/dist/{chunk-5IGBMS2U.js → chunk-T3HMVHDG.js} +1 -1
  98. package/dist/{chunk-IAF6VMPO.js → chunk-TPMZO6S2.js} +1 -1
  99. package/dist/{chunk-P26WOAA3.js → chunk-TUEBRYPZ.js} +1 -1
  100. package/dist/{chunk-HOIDGDU5.js → chunk-TVODT2UR.js} +1 -1
  101. package/dist/{chunk-Z25I7DRV.js → chunk-V5DH3OAC.js} +10 -5
  102. package/dist/{chunk-ZVXIZ2JD.js → chunk-VP527YC5.js} +35 -6
  103. package/dist/{chunk-6POQAFEC.js → chunk-W3JMIUHV.js} +1 -1
  104. package/dist/{chunk-6IYCBW4J.js → chunk-WEC625LQ.js} +1 -1
  105. package/dist/{chunk-V7MTIMPB.js → chunk-X6QIWZ33.js} +2 -2
  106. package/dist/{chunk-6GP5IKXE.js → chunk-XSNJ7NT2.js} +1 -1
  107. package/dist/{chunk-LZFB3HRK.js → chunk-XTKTIFHC.js} +5 -10
  108. package/dist/{chunk-QSUGIJWV.js → chunk-YMCS6AB7.js} +4 -9
  109. package/dist/{chunk-FOOH6SCB.js → chunk-YXOCKQZU.js} +2 -2
  110. package/dist/{chunk-2PPB644A.js → chunk-Z4LFLXRR.js} +1 -1
  111. package/dist/{chunk-N3QIXC2B.js → chunk-Z6VZYRVN.js} +2 -2
  112. package/dist/config/index.js +5 -5
  113. package/dist/containers/client.js +6 -6
  114. package/dist/containers/exec.js +6 -6
  115. package/dist/containers/lifecycle.js +36 -36
  116. package/dist/containers/setup.js +8 -8
  117. package/dist/db/agents.js +8 -6
  118. package/dist/db/api_keys.js +5 -5
  119. package/dist/db/audit.js +3 -3
  120. package/dist/db/batch.js +10 -10
  121. package/dist/db/client.js +2 -2
  122. package/dist/db/credentials.js +3 -3
  123. package/dist/db/drizzle.js +4 -4
  124. package/dist/db/environments.js +6 -6
  125. package/dist/db/events.js +5 -5
  126. package/dist/db/files.js +5 -5
  127. package/dist/db/memory.js +5 -5
  128. package/dist/db/migrations.js +1 -1
  129. package/dist/db/proxy.js +5 -5
  130. package/dist/db/schema.js +1 -1
  131. package/dist/db/session-resources.js +5 -5
  132. package/dist/db/sessions.js +8 -7
  133. package/dist/db/sync.js +5 -5
  134. package/dist/db/tenants.js +3 -3
  135. package/dist/db/traces.js +5 -5
  136. package/dist/db/upstream_keys.js +3 -3
  137. package/dist/db/vaults.js +12 -8
  138. package/dist/handlers/agents.js +56 -52
  139. package/dist/handlers/api_keys.js +53 -53
  140. package/dist/handlers/audit.js +53 -53
  141. package/dist/handlers/batch.js +53 -53
  142. package/dist/handlers/credentials.js +53 -53
  143. package/dist/handlers/environments.js +53 -53
  144. package/dist/handlers/events.js +56 -56
  145. package/dist/handlers/files.js +53 -53
  146. package/dist/handlers/index.js +100 -92
  147. package/dist/handlers/license.js +52 -52
  148. package/dist/handlers/memory.js +53 -53
  149. package/dist/handlers/metrics.js +52 -52
  150. package/dist/handlers/models.js +53 -53
  151. package/dist/handlers/openapi.js +3 -3
  152. package/dist/handlers/providers.js +52 -52
  153. package/dist/handlers/resources.js +52 -52
  154. package/dist/handlers/sessions.js +55 -55
  155. package/dist/handlers/settings.js +52 -52
  156. package/dist/handlers/skills-write.js +52 -52
  157. package/dist/handlers/skills.js +53 -53
  158. package/dist/handlers/stream.js +52 -52
  159. package/dist/handlers/tenants.js +53 -53
  160. package/dist/handlers/threads.js +52 -52
  161. package/dist/handlers/traces.js +53 -53
  162. package/dist/handlers/upstream_keys.js +55 -55
  163. package/dist/handlers/vaults.js +56 -52
  164. package/dist/handlers/whoami.js +52 -52
  165. package/dist/http.js +55 -51
  166. package/dist/index.js +57 -57
  167. package/dist/init.js +48 -48
  168. package/dist/lib/model-registry.js +6 -6
  169. package/dist/lib/skills-cache.js +6 -6
  170. package/dist/observability/otlp.js +12 -12
  171. package/dist/observability/redactor.js +8 -8
  172. package/dist/openapi/schemas.js +3 -1
  173. package/dist/openapi/spec.js +2 -2
  174. package/dist/providers/fly.js +5 -5
  175. package/dist/providers/modal.js +5 -5
  176. package/dist/providers/registry.js +1 -1
  177. package/dist/providers/resolve-secrets.js +7 -7
  178. package/dist/providers/sprites.js +7 -7
  179. package/dist/providers/upstream-keys.js +12 -11
  180. package/dist/providers/vercel.js +5 -5
  181. package/dist/proxy/forward.js +6 -6
  182. package/dist/queue/index.js +6 -6
  183. package/dist/sessions/bus.js +10 -10
  184. package/dist/sessions/driver.js +41 -41
  185. package/dist/sessions/grader.js +5 -5
  186. package/dist/sessions/mcp-auth.js +1 -1
  187. package/dist/sessions/secrets.js +8 -8
  188. package/dist/sessions/sweeper.js +37 -37
  189. package/dist/sessions/threads.js +41 -41
  190. package/dist/shutdown.js +38 -38
  191. package/dist/sync/anthropic.js +11 -11
  192. package/dist/sync/container-file-sync.js +6 -6
  193. package/dist/sync/file-sync.js +17 -17
  194. package/package.json +1 -1
  195. /package/dist/{chunk-WPK4ZPMG.js → chunk-UE6DNLSV.js} +0 -0
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  createSession
3
- } from "./chunk-3NK6YTA5.js";
3
+ } from "./chunk-KUWJJD6O.js";
4
4
  import {
5
5
  createEnvironment,
6
6
  deleteEnvironment,
7
7
  getEnvironment
8
- } from "./chunk-X6IQ57SC.js";
8
+ } from "./chunk-H6OT5GUL.js";
9
9
  import {
10
10
  archiveAgent,
11
11
  createAgent,
12
12
  getAgent
13
- } from "./chunk-ZTH5JRZG.js";
13
+ } from "./chunk-BCIFFAGW.js";
14
14
  import {
15
15
  getDrizzle,
16
16
  init_drizzle
17
- } from "./chunk-R5T4LJSK.js";
17
+ } from "./chunk-PZNAQBHQ.js";
18
18
 
19
19
  // src/db/batch.ts
20
20
  init_drizzle();
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getConfig
3
- } from "./chunk-V7MTIMPB.js";
3
+ } from "./chunk-X6QIWZ33.js";
4
4
  import {
5
5
  ApiError
6
6
  } from "./chunk-EZYKRG4W.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getConfig
3
- } from "./chunk-V7MTIMPB.js";
3
+ } from "./chunk-X6QIWZ33.js";
4
4
 
5
5
  // src/backends/factory/auth.ts
6
6
  function buildFactoryAuthEnv() {
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  buildPiArgs
3
- } from "./chunk-T5VRE77P.js";
3
+ } from "./chunk-6KWJASEO.js";
4
4
  import {
5
5
  buildPiAuthEnv,
6
6
  validatePiRuntime
7
- } from "./chunk-RVR6C22M.js";
7
+ } from "./chunk-HWR2HYQJ.js";
8
8
  import {
9
9
  preparePiOnSandbox
10
10
  } from "./chunk-QYSDP6V5.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getConfig
3
- } from "./chunk-V7MTIMPB.js";
3
+ } from "./chunk-X6QIWZ33.js";
4
4
  import {
5
5
  ApiError
6
6
  } from "./chunk-EZYKRG4W.js";
@@ -4,33 +4,36 @@ import {
4
4
  tenantFilter
5
5
  } from "./chunk-23UKWXJH.js";
6
6
  import {
7
+ decodeCursor,
7
8
  jsonOk,
9
+ paginatedOk,
8
10
  routeWrap
9
- } from "./chunk-RH4GKU52.js";
11
+ } from "./chunk-QTXAWC5J.js";
10
12
  import {
11
13
  forwardToAnthropic,
12
14
  validateAnthropicProxy
13
- } from "./chunk-JCW3ZRES.js";
15
+ } from "./chunk-MQBMXAPU.js";
14
16
  import {
15
17
  getProxiedTenantId,
16
18
  isProxied,
17
19
  markProxied,
18
20
  unmarkProxied
19
- } from "./chunk-E7DD7F7J.js";
21
+ } from "./chunk-5U5LRAFJ.js";
20
22
  import {
21
23
  archiveAgent,
22
24
  createAgent,
23
25
  getAgent,
26
+ listAgentVersions,
24
27
  listAgents,
25
28
  updateAgent
26
- } from "./chunk-ZTH5JRZG.js";
29
+ } from "./chunk-BCIFFAGW.js";
27
30
  import {
28
31
  resolveBackend
29
- } from "./chunk-FDBR634Z.js";
32
+ } from "./chunk-GV6GUSCP.js";
30
33
  import {
31
34
  getDb,
32
35
  init_client
33
- } from "./chunk-6POQAFEC.js";
36
+ } from "./chunk-W3JMIUHV.js";
34
37
  import {
35
38
  badRequest,
36
39
  conflict,
@@ -77,25 +80,23 @@ var ToolSchema = z.union([
77
80
  input_schema: z.record(z.unknown())
78
81
  })
79
82
  ]);
80
- var McpServerSchema = z.record(
81
- z.object({
82
- type: z.enum(["stdio", "http", "sse"]).optional(),
83
- url: z.string().optional(),
84
- command: z.union([z.string(), z.array(z.string())]).optional(),
85
- args: z.array(z.string()).optional(),
86
- headers: z.record(z.string()).optional(),
87
- env: z.record(z.string()).optional()
88
- })
89
- );
90
83
  var ModelConfigSchema = z.object({
91
84
  speed: z.enum(["standard", "fast"]).optional()
92
85
  });
93
86
  var CreateSchema = z.object({
94
87
  name: z.string().min(1),
95
- model: z.string().min(1),
88
+ model: z.object({ id: z.string().min(1), speed: z.enum(["standard", "fast"]).optional() }),
89
+ description: z.string().max(2048).optional(),
90
+ metadata: z.record(z.string(), z.string().max(512)).optional(),
96
91
  system: z.string().nullish(),
97
92
  tools: z.array(ToolSchema).optional(),
98
- mcp_servers: McpServerSchema.optional(),
93
+ mcp_servers: z.array(
94
+ z.object({
95
+ name: z.string(),
96
+ type: z.string().optional(),
97
+ url: z.string().optional()
98
+ }).passthrough()
99
+ ).optional(),
99
100
  engine: z.enum(["claude", "opencode", "codex", "anthropic", "gemini", "factory", "pi"]).optional(),
100
101
  webhook_url: z.string().url().optional(),
101
102
  webhook_events: z.array(z.string()).optional(),
@@ -117,16 +118,28 @@ var CreateSchema = z.object({
117
118
  /** v0.5: required for global admin, ignored for tenant users. */
118
119
  tenant_id: z.string().optional()
119
120
  }).refine((data) => {
121
+ if (!data.metadata) return true;
122
+ return Object.keys(data.metadata).length <= 16;
123
+ }, "metadata exceeds 16 key limit").refine((data) => {
120
124
  if (!data.skills) return true;
121
125
  const total = data.skills.reduce((sum, s) => sum + s.content.length, 0);
122
126
  return total <= 1024 * 1024;
123
127
  }, "Total skills content exceeds 1MB limit");
124
128
  var UpdateSchema = z.object({
129
+ version: z.number().int().min(1),
125
130
  name: z.string().min(1).optional(),
126
- model: z.string().min(1).optional(),
131
+ model: z.object({ id: z.string().min(1), speed: z.enum(["standard", "fast"]).optional() }).optional(),
132
+ description: z.string().max(2048).optional(),
133
+ metadata: z.record(z.string(), z.string().max(512)).optional(),
127
134
  system: z.string().nullish(),
128
135
  tools: z.array(z.unknown()).optional(),
129
- mcp_servers: z.record(z.unknown()).optional(),
136
+ mcp_servers: z.array(
137
+ z.object({
138
+ name: z.string(),
139
+ type: z.string().optional(),
140
+ url: z.string().optional()
141
+ }).passthrough()
142
+ ).optional(),
130
143
  webhook_url: z.string().url().nullish(),
131
144
  webhook_events: z.array(z.string()).optional(),
132
145
  /** Null clears the secret (unsigned webhooks); string rotates it. */
@@ -140,6 +153,9 @@ var UpdateSchema = z.object({
140
153
  skills: z.array(SkillSchema).max(20).optional(),
141
154
  model_config: ModelConfigSchema.optional()
142
155
  }).refine((data) => {
156
+ if (!data.metadata) return true;
157
+ return Object.keys(data.metadata).length <= 16;
158
+ }, "metadata exceeds 16 key limit").refine((data) => {
143
159
  if (!data.skills) return true;
144
160
  const total = data.skills.reduce((sum, s) => sum + s.content.length, 0);
145
161
  return total <= 1024 * 1024;
@@ -172,10 +188,12 @@ function handleCreateAgent(request) {
172
188
  return proxyRes;
173
189
  }
174
190
  const backend = resolveBackend(backendName);
191
+ const modelId = parsed.data.model.id;
192
+ const modelSpeed = parsed.data.model.speed;
175
193
  const { isValidModelForEngine, FALLBACK_MODELS } = await import("./backends/models.js");
176
- if (!isValidModelForEngine(backendName, parsed.data.model)) {
194
+ if (!isValidModelForEngine(backendName, modelId)) {
177
195
  throw badRequest(
178
- `Model "${parsed.data.model}" is not supported by the ${backendName} engine. Supported models: ${(FALLBACK_MODELS[backendName] ?? []).join(", ")}`
196
+ `Model "${modelId}" is not supported by the ${backendName} engine. Supported models: ${(FALLBACK_MODELS[backendName] ?? []).join(", ")}`
179
197
  );
180
198
  }
181
199
  if (backendName !== "claude" && parsed.data.tools && parsed.data.tools.length > 0) {
@@ -185,13 +203,27 @@ function handleCreateAgent(request) {
185
203
  }
186
204
  const createErr = backend.validateAgentCreation?.();
187
205
  if (createErr) throw badRequest(createErr);
206
+ const mcpInput = parsed.data.mcp_servers;
207
+ let mcpRecord = {};
208
+ if (mcpInput) {
209
+ for (const s of mcpInput) {
210
+ const { name, ...rest } = s;
211
+ mcpRecord[name] = { type: rest.type ?? "url", ...rest };
212
+ }
213
+ }
214
+ const mergedModelConfig = {
215
+ ...parsed.data.model_config ?? {},
216
+ ...modelSpeed ? { speed: modelSpeed } : {}
217
+ };
188
218
  const nowIso = (/* @__PURE__ */ new Date()).toISOString();
189
219
  const agent = createAgent({
190
220
  name: parsed.data.name,
191
- model: parsed.data.model,
221
+ model: modelId,
222
+ description: parsed.data.description,
223
+ metadata: parsed.data.metadata,
192
224
  system: parsed.data.system ?? null,
193
225
  tools: parsed.data.tools ?? [{ type: "agent_toolset_20260401" }],
194
- mcp_servers: parsed.data.mcp_servers ?? {},
226
+ mcp_servers: mcpRecord,
195
227
  backend: backendName,
196
228
  webhook_url: parsed.data.webhook_url ?? null,
197
229
  webhook_events: parsed.data.webhook_events,
@@ -203,7 +235,7 @@ function handleCreateAgent(request) {
203
235
  ...s,
204
236
  installed_at: s.installed_at ?? nowIso
205
237
  })),
206
- model_config: parsed.data.model_config,
238
+ model_config: mergedModelConfig,
207
239
  tenant_id: createTenantId
208
240
  });
209
241
  return jsonOk(agent, 201);
@@ -215,7 +247,7 @@ function handleListAgents(request) {
215
247
  const limit = url.searchParams.get("limit");
216
248
  const order = url.searchParams.get("order");
217
249
  const includeArchived = url.searchParams.get("include_archived") === "true";
218
- const cursor = url.searchParams.get("page") ?? void 0;
250
+ const cursor = decodeCursor(url.searchParams.get("page"));
219
251
  const requestedLimit = limit ? Number(limit) : 20;
220
252
  const data = listAgents({
221
253
  limit: requestedLimit,
@@ -224,12 +256,7 @@ function handleListAgents(request) {
224
256
  cursor,
225
257
  tenantFilter: tenantFilter(auth)
226
258
  });
227
- return jsonOk({
228
- data,
229
- has_more: data.length === requestedLimit,
230
- first_id: data.length > 0 ? data[0].id : null,
231
- last_id: data.length > 0 ? data[data.length - 1].id : null
232
- });
259
+ return paginatedOk(data, requestedLimit);
233
260
  });
234
261
  }
235
262
  function handleGetAgent(request, id) {
@@ -251,20 +278,36 @@ function handleUpdateAgent(request, id) {
251
278
  assertProxiedAgentTenant(auth, id);
252
279
  return forwardToAnthropic(request, `/v1/agents/${id}`);
253
280
  }
254
- loadAgentForCaller(auth, id);
281
+ const current = loadAgentForCaller(auth, id);
255
282
  const body = await request.json().catch(() => null);
256
283
  if (body && typeof body === "object" && "backend" in body) {
257
284
  throw badRequest("backend cannot be changed after agent creation");
258
285
  }
259
286
  const parsed = UpdateSchema.safeParse(body);
260
287
  if (!parsed.success) throw badRequest(parsed.error.message);
288
+ if (current.version !== parsed.data.version) {
289
+ throw conflict(`Version mismatch: expected ${current.version}, got ${parsed.data.version}`);
290
+ }
291
+ const modelId = parsed.data.model?.id;
292
+ const modelSpeed = parsed.data.model?.speed;
293
+ let mcpRecord;
294
+ if (parsed.data.mcp_servers !== void 0) {
295
+ mcpRecord = {};
296
+ for (const s of parsed.data.mcp_servers) {
297
+ const { name, ...rest } = s;
298
+ mcpRecord[name] = { type: rest.type ?? "url", ...rest };
299
+ }
300
+ }
301
+ const mergedModelConfig = parsed.data.model_config || modelSpeed ? { ...parsed.data.model_config ?? {}, ...modelSpeed ? { speed: modelSpeed } : {} } : void 0;
261
302
  const nowIso = (/* @__PURE__ */ new Date()).toISOString();
262
303
  const updated = updateAgent(id, {
263
304
  name: parsed.data.name,
264
- model: parsed.data.model,
305
+ model: modelId,
306
+ description: parsed.data.description,
307
+ metadata: parsed.data.metadata,
265
308
  system: parsed.data.system,
266
309
  tools: parsed.data.tools,
267
- mcp_servers: parsed.data.mcp_servers,
310
+ mcp_servers: mcpRecord,
268
311
  webhook_url: parsed.data.webhook_url,
269
312
  webhook_events: parsed.data.webhook_events,
270
313
  webhook_secret: parsed.data.webhook_secret,
@@ -274,7 +317,7 @@ function handleUpdateAgent(request, id) {
274
317
  ...s,
275
318
  installed_at: s.installed_at ?? nowIso
276
319
  })),
277
- model_config: parsed.data.model_config
320
+ model_config: mergedModelConfig
278
321
  });
279
322
  if (!updated) throw notFound(`agent ${id} not found`);
280
323
  return jsonOk(updated);
@@ -294,11 +337,45 @@ function handleDeleteAgent(request, id) {
294
337
  return jsonOk({ id, type: "agent_deleted" });
295
338
  });
296
339
  }
340
+ function handleArchiveAgent(request, id) {
341
+ return routeWrap(request, async ({ auth }) => {
342
+ if (isProxied(id)) {
343
+ assertProxiedAgentTenant(auth, id);
344
+ const res = await forwardToAnthropic(request, `/v1/agents/${id}/archive`);
345
+ if (res.ok) unmarkProxied(id);
346
+ return res;
347
+ }
348
+ loadAgentForCaller(auth, id);
349
+ const ok = archiveAgent(id);
350
+ if (!ok) throw notFound(`agent ${id} not found`);
351
+ const agent = getAgent(id);
352
+ return jsonOk(agent);
353
+ });
354
+ }
355
+ function handleListAgentVersions(request, id) {
356
+ return routeWrap(request, async ({ auth, request: req }) => {
357
+ loadAgentForCaller(auth, id);
358
+ const url = new URL(req.url);
359
+ const limit = url.searchParams.get("limit");
360
+ const cursorRaw = decodeCursor(url.searchParams.get("page"));
361
+ const cursor = cursorRaw ? Number(cursorRaw) : void 0;
362
+ const requestedLimit = limit ? Number(limit) : 20;
363
+ const data = listAgentVersions(id, {
364
+ limit: requestedLimit,
365
+ cursor
366
+ });
367
+ const hasMore = data.length === requestedLimit;
368
+ const nextPage = hasMore && data.length > 0 ? Buffer.from(String(data[data.length - 1].version)).toString("base64url") : null;
369
+ return jsonOk({ data, next_page: nextPage });
370
+ });
371
+ }
297
372
 
298
373
  export {
299
374
  handleCreateAgent,
300
375
  handleListAgents,
301
376
  handleGetAgent,
302
377
  handleUpdateAgent,
303
- handleDeleteAgent
378
+ handleDeleteAgent,
379
+ handleArchiveAgent,
380
+ handleListAgentVersions
304
381
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  readSetting
3
- } from "./chunk-V7MTIMPB.js";
3
+ } from "./chunk-X6QIWZ33.js";
4
4
 
5
5
  // src/lib/skills-cache.ts
6
6
  var DEFAULT_FEED_URL = "https://www.agentstep.com/v1/skills/feed";
@@ -5,9 +5,11 @@ import {
5
5
  } from "./chunk-23UKWXJH.js";
6
6
  import {
7
7
  jsonOk,
8
+ paginatedOk,
8
9
  routeWrap
9
- } from "./chunk-RH4GKU52.js";
10
+ } from "./chunk-QTXAWC5J.js";
10
11
  import {
12
+ archiveVault,
11
13
  createVault,
12
14
  deleteEntry,
13
15
  deleteVault,
@@ -15,15 +17,16 @@ import {
15
17
  getVault,
16
18
  listEntries,
17
19
  listVaults,
18
- setEntry
19
- } from "./chunk-ZVXIZ2JD.js";
20
+ setEntry,
21
+ updateVault
22
+ } from "./chunk-VP527YC5.js";
20
23
  import {
21
24
  getAgent
22
- } from "./chunk-ZTH5JRZG.js";
25
+ } from "./chunk-BCIFFAGW.js";
23
26
  import {
24
27
  getDb,
25
28
  init_client
26
- } from "./chunk-6POQAFEC.js";
29
+ } from "./chunk-W3JMIUHV.js";
27
30
  import {
28
31
  badRequest,
29
32
  conflict,
@@ -54,14 +57,17 @@ function maskValue(value) {
54
57
  return `${value.slice(0, 4)}****${value.slice(-2)}`;
55
58
  }
56
59
  var CreateVaultSchema = z.object({
57
- agent_id: z.string().min(1),
60
+ agent_id: z.string().min(1).optional(),
58
61
  name: z.string().min(1).optional(),
59
62
  /** Anthropic-compatible alias for `name`. */
60
63
  display_name: z.string().min(1).optional(),
64
+ metadata: z.record(z.string().max(512)).optional(),
61
65
  /** v0.5: required for global admin, ignored for tenant users. */
62
66
  tenant_id: z.string().optional()
63
67
  }).refine((data) => data.name || data.display_name, {
64
68
  message: "Either name or display_name is required"
69
+ }).refine((data) => !data.metadata || Object.keys(data.metadata).length <= 16, {
70
+ message: "metadata must have at most 16 key-value pairs"
65
71
  });
66
72
  var PutEntrySchema = z.object({
67
73
  value: z.string()
@@ -71,30 +77,37 @@ function handleCreateVault(request) {
71
77
  const body = await request.json();
72
78
  const parsed = CreateVaultSchema.safeParse(body);
73
79
  if (!parsed.success) throw badRequest(parsed.error.message);
74
- const agentTenantId = getAgentTenantId(parsed.data.agent_id);
75
- if (agentTenantId === void 0) {
76
- throw notFound(`agent not found: ${parsed.data.agent_id}`);
77
- }
78
- assertResourceTenant(auth, agentTenantId, `agent not found: ${parsed.data.agent_id}`);
79
- const agent = getAgent(parsed.data.agent_id);
80
- if (!agent) throw notFound(`agent not found: ${parsed.data.agent_id}`);
81
- const createTenantId = resolveCreateTenant(auth, parsed.data.tenant_id);
82
- if (createTenantId !== agentTenantId) {
83
- throw badRequest(
84
- `vault tenant_id must match agent tenant_id (${agentTenantId})`
85
- );
80
+ let createTenantId;
81
+ if (parsed.data.agent_id) {
82
+ const agentTenantId = getAgentTenantId(parsed.data.agent_id);
83
+ if (agentTenantId === void 0) {
84
+ throw notFound(`agent not found: ${parsed.data.agent_id}`);
85
+ }
86
+ assertResourceTenant(auth, agentTenantId, `agent not found: ${parsed.data.agent_id}`);
87
+ const agent = getAgent(parsed.data.agent_id);
88
+ if (!agent) throw notFound(`agent not found: ${parsed.data.agent_id}`);
89
+ createTenantId = resolveCreateTenant(auth, parsed.data.tenant_id);
90
+ if (createTenantId !== agentTenantId) {
91
+ throw badRequest(
92
+ `vault tenant_id must match agent tenant_id (${agentTenantId})`
93
+ );
94
+ }
95
+ const vaultName2 = parsed.data.name ?? parsed.data.display_name;
96
+ const existing = listVaults({ agent_id: parsed.data.agent_id, tenantFilter: tenantFilter(auth) });
97
+ if (existing.some((v) => v.name === vaultName2)) {
98
+ throw conflict(`Vault "${vaultName2}" already exists for this agent`);
99
+ }
100
+ } else {
101
+ createTenantId = resolveCreateTenant(auth, parsed.data.tenant_id);
86
102
  }
87
103
  const vaultName = parsed.data.name ?? parsed.data.display_name;
88
- const existing = listVaults({ agent_id: parsed.data.agent_id, tenantFilter: tenantFilter(auth) });
89
- if (existing.some((v) => v.name === vaultName)) {
90
- throw conflict(`Vault "${vaultName}" already exists for this agent`);
91
- }
92
104
  const vault = createVault({
93
- agent_id: parsed.data.agent_id,
105
+ agent_id: parsed.data.agent_id ?? null,
94
106
  name: vaultName,
107
+ metadata: parsed.data.metadata,
95
108
  tenant_id: createTenantId
96
109
  });
97
- return jsonOk({ ...vault, display_name: vault.name }, 201);
110
+ return jsonOk(vault, 201);
98
111
  });
99
112
  }
100
113
  function handleListVaults(request) {
@@ -103,12 +116,7 @@ function handleListVaults(request) {
103
116
  const agentId = url.searchParams.get("agent_id") ?? void 0;
104
117
  const requestedLimit = Number(url.searchParams.get("limit") || "100");
105
118
  const data = listVaults({ agent_id: agentId, tenantFilter: tenantFilter(auth) });
106
- return jsonOk({
107
- data,
108
- has_more: data.length === requestedLimit,
109
- first_id: data.length > 0 ? data[0].id : null,
110
- last_id: data.length > 0 ? data[data.length - 1].id : null
111
- });
119
+ return paginatedOk(data, requestedLimit);
112
120
  });
113
121
  }
114
122
  function handleGetVault(request, id) {
@@ -124,6 +132,35 @@ function handleDeleteVault(request, id) {
124
132
  return jsonOk({ id, type: "vault_deleted" });
125
133
  });
126
134
  }
135
+ var UpdateVaultSchema = z.object({
136
+ display_name: z.string().min(1).max(255).optional(),
137
+ metadata: z.record(z.string().max(512)).optional()
138
+ }).refine((data) => !data.metadata || Object.keys(data.metadata).length <= 16, {
139
+ message: "metadata must have at most 16 key-value pairs"
140
+ });
141
+ function handleUpdateVault(request, id) {
142
+ return routeWrap(request, async ({ auth }) => {
143
+ loadVaultForCaller(auth, id);
144
+ const body = await request.json();
145
+ const parsed = UpdateVaultSchema.safeParse(body);
146
+ if (!parsed.success) throw badRequest(parsed.error.message);
147
+ const vault = updateVault(id, {
148
+ display_name: parsed.data.display_name,
149
+ metadata: parsed.data.metadata
150
+ });
151
+ if (!vault) throw notFound(`vault not found: ${id}`);
152
+ return jsonOk(vault);
153
+ });
154
+ }
155
+ function handleArchiveVault(request, id) {
156
+ return routeWrap(request, async ({ auth }) => {
157
+ loadVaultForCaller(auth, id);
158
+ const ok = archiveVault(id);
159
+ if (!ok) throw notFound(`vault not found: ${id}`);
160
+ const vault = getVault(id);
161
+ return jsonOk(vault);
162
+ });
163
+ }
127
164
  function handleListEntries(request, vaultId) {
128
165
  return routeWrap(request, async ({ auth }) => {
129
166
  loadVaultForCaller(auth, vaultId);
@@ -165,6 +202,8 @@ export {
165
202
  handleListVaults,
166
203
  handleGetVault,
167
204
  handleDeleteVault,
205
+ handleUpdateVault,
206
+ handleArchiveVault,
168
207
  handleListEntries,
169
208
  handleGetEntry,
170
209
  handlePutEntry,
@@ -5,9 +5,10 @@ function buildOpencodeArgs(input) {
5
5
  args.push("--session", input.backendSessionId);
6
6
  }
7
7
  if (input.agent.model) {
8
+ const modelId = input.agent.model.id;
8
9
  const cloudPrefixes = ["claude-", "gpt-", "o1-", "o3-", "o4-", "codex-", "chatgpt-", "gemini-"];
9
- const isOllama = !input.agent.model.includes("/") && !cloudPrefixes.some((p) => input.agent.model.startsWith(p));
10
- const modelArg = isOllama ? `ollama/${input.agent.model}` : input.agent.model;
10
+ const isOllama = !modelId.includes("/") && !cloudPrefixes.some((p) => modelId.startsWith(p));
11
+ const modelArg = isOllama ? `ollama/${modelId}` : modelId;
11
12
  args.push("--model", modelArg);
12
13
  }
13
14
  return args;
@@ -7,32 +7,37 @@ function buildCodexArgs(input) {
7
7
  "--skip-git-repo-check"
8
8
  ];
9
9
  if (input.agent.model) {
10
- args.push("--model", input.agent.model);
10
+ const modelId = input.agent.model.id;
11
+ args.push("--model", modelId);
11
12
  const cloudPrefixes = ["claude-", "gpt-", "o1-", "o3-", "o4-", "codex-", "chatgpt-"];
12
- const isOllama = !input.agent.model.includes("/") && !cloudPrefixes.some((p) => input.agent.model.startsWith(p));
13
+ const isOllama = !modelId.includes("/") && !cloudPrefixes.some((p) => modelId.startsWith(p));
13
14
  if (isOllama) {
14
15
  args.push("--oss", "--local-provider", "ollama");
15
16
  }
16
17
  }
17
18
  if (input.agent.mcp_servers) {
18
- for (const [name, server] of Object.entries(input.agent.mcp_servers)) {
19
+ for (const server of input.agent.mcp_servers) {
20
+ const name = server.name;
19
21
  if (server.type) {
20
22
  args.push("-c", `mcp_servers.${name}.type="${server.type}"`);
21
23
  }
22
24
  if (server.url) {
23
25
  args.push("-c", `mcp_servers.${name}.url="${server.url}"`);
24
26
  }
25
- if (typeof server.command === "string") {
26
- args.push("-c", `mcp_servers.${name}.command="${server.command}"`);
27
+ const command = server.command;
28
+ if (typeof command === "string") {
29
+ args.push("-c", `mcp_servers.${name}.command="${command}"`);
27
30
  }
28
- if (server.args && server.args.length > 0) {
31
+ const sArgs = server.args;
32
+ if (sArgs && sArgs.length > 0) {
29
33
  args.push(
30
34
  "-c",
31
- `mcp_servers.${name}.args=${JSON.stringify(server.args)}`
35
+ `mcp_servers.${name}.args=${JSON.stringify(sArgs)}`
32
36
  );
33
37
  }
34
- if (server.headers) {
35
- for (const [hk, hv] of Object.entries(server.headers)) {
38
+ const headers = server.headers;
39
+ if (headers) {
40
+ for (const [hk, hv] of Object.entries(headers)) {
36
41
  args.push("-c", `mcp_servers.${name}.http_headers.${hk}="${hv}"`);
37
42
  }
38
43
  }
@@ -1,60 +1,60 @@
1
1
  import {
2
2
  runTurn
3
- } from "./chunk-DAVYI5H4.js";
3
+ } from "./chunk-JLUCJMAQ.js";
4
4
  import {
5
5
  enqueueTurn
6
- } from "./chunk-2PPB644A.js";
6
+ } from "./chunk-Z4LFLXRR.js";
7
7
  import {
8
8
  installOtlpExporter
9
- } from "./chunk-GVPJL3XS.js";
9
+ } from "./chunk-JP7Y3TKK.js";
10
10
  import {
11
11
  redactAppendInput
12
- } from "./chunk-N3QIXC2B.js";
12
+ } from "./chunk-Z6VZYRVN.js";
13
13
  import {
14
14
  createApiKey,
15
15
  listApiKeys
16
- } from "./chunk-USYY3L7G.js";
16
+ } from "./chunk-T3FQPTOA.js";
17
17
  import {
18
18
  initSentry
19
19
  } from "./chunk-3MQ2FWXS.js";
20
20
  import {
21
21
  installShutdownHandlers
22
- } from "./chunk-34EB622U.js";
22
+ } from "./chunk-64IQEPSD.js";
23
23
  import {
24
24
  runSweep
25
- } from "./chunk-3FDE3BPB.js";
25
+ } from "./chunk-AB7MPL3H.js";
26
26
  import {
27
27
  fillWarmPools,
28
28
  reconcileDockerOrphanSandboxes,
29
29
  reconcileOrphanSandboxes
30
- } from "./chunk-N76ZVITA.js";
30
+ } from "./chunk-JFOHGHW5.js";
31
31
  import {
32
32
  appendEvent,
33
33
  installPayloadRedactor
34
- } from "./chunk-MHBLVGRF.js";
34
+ } from "./chunk-5MERXOLJ.js";
35
35
  import {
36
36
  setSessionSandbox
37
- } from "./chunk-3NK6YTA5.js";
37
+ } from "./chunk-KUWJJD6O.js";
38
38
  import {
39
39
  readEnvValue,
40
40
  upsertEnvLine
41
41
  } from "./chunk-YPXI7Q2M.js";
42
42
  import {
43
43
  getLastUnprocessedUserMessage
44
- } from "./chunk-TH7WJLZC.js";
44
+ } from "./chunk-KGBKIJPF.js";
45
45
  import {
46
46
  getBySession,
47
47
  register
48
48
  } from "./chunk-EFOIR7R3.js";
49
49
  import {
50
50
  resolveContainerProvider
51
- } from "./chunk-WPK4ZPMG.js";
51
+ } from "./chunk-UE6DNLSV.js";
52
52
  import {
53
53
  getEnvironment
54
- } from "./chunk-X6IQ57SC.js";
54
+ } from "./chunk-H6OT5GUL.js";
55
55
  import {
56
56
  getConfig
57
- } from "./chunk-V7MTIMPB.js";
57
+ } from "./chunk-X6QIWZ33.js";
58
58
  import {
59
59
  init_clock,
60
60
  nowMs
@@ -62,7 +62,7 @@ import {
62
62
  import {
63
63
  getDb,
64
64
  init_client
65
- } from "./chunk-6POQAFEC.js";
65
+ } from "./chunk-W3JMIUHV.js";
66
66
  import {
67
67
  getRuntime
68
68
  } from "./chunk-UYTSKFGK.js";