@agentstep/agent-sdk 0.4.39 → 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 (197) 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-FZFICXAN.js → chunk-3XGUMXGR.js} +2 -2
  27. package/dist/{chunk-H7UKW666.js → chunk-445EL6J5.js} +1 -1
  28. package/dist/{chunk-2RSL5SO7.js → chunk-4D345E27.js} +2 -2
  29. package/dist/{chunk-D6ZQXOSQ.js → chunk-4RDILRIO.js} +5 -5
  30. package/dist/{chunk-MHBLVGRF.js → chunk-5MERXOLJ.js} +4 -4
  31. package/dist/{chunk-E7DD7F7J.js → chunk-5U5LRAFJ.js} +2 -2
  32. package/dist/{chunk-34EB622U.js → chunk-64IQEPSD.js} +2 -2
  33. package/dist/{chunk-ENGKR2JT.js → chunk-6CVQDSTS.js} +1 -1
  34. package/dist/{chunk-T5VRE77P.js → chunk-6KWJASEO.js} +1 -1
  35. package/dist/{chunk-W2NHS4IF.js → chunk-6QZ23WRF.js} +15 -19
  36. package/dist/{chunk-DU7LSFQQ.js → chunk-7SY65LWY.js} +6 -9
  37. package/dist/{chunk-C46UG6GQ.js → chunk-A6VORSKD.js} +1 -1
  38. package/dist/{chunk-3FDE3BPB.js → chunk-AB7MPL3H.js} +6 -6
  39. package/dist/{chunk-RP6WQ4IH.js → chunk-AJL3T5JS.js} +3 -3
  40. package/dist/{chunk-KKCLTWG7.js → chunk-AXBM7HAR.js} +1 -1
  41. package/dist/{chunk-ZTH5JRZG.js → chunk-BCIFFAGW.js} +41 -10
  42. package/dist/{chunk-OXWELRJL.js → chunk-CBPO2P4I.js} +101 -16
  43. package/dist/{chunk-32XS3Y6P.js → chunk-CLSGNQ7J.js} +8 -8
  44. package/dist/{chunk-SV2B3P6B.js → chunk-DBFPJSOY.js} +19 -17
  45. package/dist/{chunk-JWH4OIBP.js → chunk-DJZSPWG2.js} +4 -4
  46. package/dist/{chunk-JZL4L54R.js → chunk-DKLHYSPW.js} +2 -2
  47. package/dist/{chunk-NQVRZAIX.js → chunk-DMMNAQUM.js} +2 -2
  48. package/dist/{chunk-Y6SFUNGO.js → chunk-EOJ66GY7.js} +4 -4
  49. package/dist/{chunk-EUINGLHA.js → chunk-EWIWVXXP.js} +30 -20
  50. package/dist/{chunk-5EKQBD2H.js → chunk-FCUXFLNK.js} +2 -2
  51. package/dist/{chunk-LAVHQCRP.js → chunk-FSQ4HGHX.js} +3 -3
  52. package/dist/{chunk-WQARLGBG.js → chunk-GCQDNUS2.js} +3 -3
  53. package/dist/{chunk-MXOG5SAO.js → chunk-GFSRNOPI.js} +11 -14
  54. package/dist/{chunk-S7W3KJYH.js → chunk-GIMDS46L.js} +9 -4
  55. package/dist/{chunk-FP4E3QUS.js → chunk-GLKWJESP.js} +2 -2
  56. package/dist/{chunk-FDBR634Z.js → chunk-GV6GUSCP.js} +6 -6
  57. package/dist/{chunk-X6IQ57SC.js → chunk-H6OT5GUL.js} +9 -5
  58. package/dist/{chunk-TPPLYCJF.js → chunk-HMOSAXVZ.js} +2 -2
  59. package/dist/{chunk-L5RW66H5.js → chunk-HVLYE4S5.js} +1 -1
  60. package/dist/{chunk-RVR6C22M.js → chunk-HWR2HYQJ.js} +1 -1
  61. package/dist/{chunk-HH4OXSOV.js → chunk-HY3T4YJV.js} +5 -5
  62. package/dist/{chunk-AR2TM7CR.js → chunk-I26QP3A3.js} +1 -1
  63. package/dist/{chunk-D2TRWKVQ.js → chunk-I2WVMCYN.js} +80 -2
  64. package/dist/{chunk-JHGJG2Z2.js → chunk-IBYOMAZ3.js} +1 -1
  65. package/dist/{chunk-SUGSHXND.js → chunk-IEZFRNLC.js} +2 -2
  66. package/dist/{chunk-ZMJ4EP4C.js → chunk-ILHIHMO3.js} +7 -2
  67. package/dist/{chunk-XWWLMJXT.js → chunk-IRW7AYTP.js} +6 -15
  68. package/dist/{chunk-N76ZVITA.js → chunk-JFOHGHW5.js} +9 -9
  69. package/dist/{chunk-DAVYI5H4.js → chunk-JLUCJMAQ.js} +23 -23
  70. package/dist/{chunk-GVPJL3XS.js → chunk-JP7Y3TKK.js} +5 -5
  71. package/dist/{chunk-TH7WJLZC.js → chunk-KGBKIJPF.js} +3 -3
  72. package/dist/{chunk-MQQ44IGX.js → chunk-KKAJC3Z2.js} +3 -3
  73. package/dist/{chunk-3NK6YTA5.js → chunk-KUWJJD6O.js} +42 -8
  74. package/dist/{chunk-2GIX4HAT.js → chunk-L26TVIB6.js} +2 -2
  75. package/dist/{chunk-KLN6HPYM.js → chunk-L3IACZ72.js} +1 -1
  76. package/dist/{chunk-C6AXM3M7.js → chunk-LQP6XGFU.js} +2 -2
  77. package/dist/{chunk-JX627GQF.js → chunk-MAJWADF7.js} +2 -2
  78. package/dist/{chunk-7GG3FEK2.js → chunk-MCWCRZM4.js} +4 -4
  79. package/dist/{chunk-JCW3ZRES.js → chunk-MQBMXAPU.js} +1 -1
  80. package/dist/{chunk-CREPPDHX.js → chunk-NDTIDWBE.js} +1 -1
  81. package/dist/{chunk-5EQJOUWM.js → chunk-NHAYKVXG.js} +2 -2
  82. package/dist/{chunk-FXLUSECC.js → chunk-NKQVOAWN.js} +1 -1
  83. package/dist/{chunk-ZYISLRS6.js → chunk-OKT2J4ZB.js} +114 -37
  84. package/dist/{chunk-P3PHXVMA.js → chunk-OSNMIPHV.js} +54 -8
  85. package/dist/{chunk-ZFJPOQSY.js → chunk-OZFSKR2W.js} +69 -30
  86. package/dist/{chunk-3IV56JJW.js → chunk-P56WU3UT.js} +3 -2
  87. package/dist/{chunk-NQX7WBA4.js → chunk-PJYCPDV5.js} +14 -9
  88. package/dist/{chunk-LMNFIJ6M.js → chunk-PN3AWRMX.js} +15 -15
  89. package/dist/{chunk-ZMNQ2YJ6.js → chunk-PNZF7HIU.js} +3 -3
  90. package/dist/{chunk-R5T4LJSK.js → chunk-PZNAQBHQ.js} +2 -2
  91. package/dist/{chunk-RH4GKU52.js → chunk-QTXAWC5J.js} +18 -3
  92. package/dist/{chunk-2I35VGHX.js → chunk-R3QHLKJG.js} +2 -2
  93. package/dist/{chunk-OGJUSGF7.js → chunk-R6EEBWM3.js} +1 -1
  94. package/dist/{chunk-V66YKIW6.js → chunk-RYJXSXCV.js} +5 -5
  95. package/dist/{chunk-CHDQ3HIR.js → chunk-S7DFMJR5.js} +5 -9
  96. package/dist/{chunk-V2R7RWVY.js → chunk-STJNO6SL.js} +1 -1
  97. package/dist/{chunk-USYY3L7G.js → chunk-T3FQPTOA.js} +2 -2
  98. package/dist/{chunk-5IGBMS2U.js → chunk-T3HMVHDG.js} +1 -1
  99. package/dist/{chunk-IAF6VMPO.js → chunk-TPMZO6S2.js} +1 -1
  100. package/dist/{chunk-P26WOAA3.js → chunk-TUEBRYPZ.js} +1 -1
  101. package/dist/{chunk-HOIDGDU5.js → chunk-TVODT2UR.js} +1 -1
  102. package/dist/{chunk-Z25I7DRV.js → chunk-V5DH3OAC.js} +10 -5
  103. package/dist/{chunk-ZVXIZ2JD.js → chunk-VP527YC5.js} +35 -6
  104. package/dist/{chunk-6POQAFEC.js → chunk-W3JMIUHV.js} +1 -1
  105. package/dist/{chunk-6IYCBW4J.js → chunk-WEC625LQ.js} +1 -1
  106. package/dist/{chunk-V7MTIMPB.js → chunk-X6QIWZ33.js} +2 -2
  107. package/dist/{chunk-6GP5IKXE.js → chunk-XSNJ7NT2.js} +1 -1
  108. package/dist/{chunk-LZFB3HRK.js → chunk-XTKTIFHC.js} +5 -10
  109. package/dist/{chunk-QSUGIJWV.js → chunk-YMCS6AB7.js} +4 -9
  110. package/dist/{chunk-FOOH6SCB.js → chunk-YXOCKQZU.js} +2 -2
  111. package/dist/{chunk-2PPB644A.js → chunk-Z4LFLXRR.js} +1 -1
  112. package/dist/{chunk-N3QIXC2B.js → chunk-Z6VZYRVN.js} +2 -2
  113. package/dist/config/index.js +5 -5
  114. package/dist/containers/client.js +6 -6
  115. package/dist/containers/exec.js +6 -6
  116. package/dist/containers/lifecycle.js +36 -36
  117. package/dist/containers/setup.js +8 -8
  118. package/dist/db/agents.js +8 -6
  119. package/dist/db/api_keys.js +5 -5
  120. package/dist/db/audit.js +3 -3
  121. package/dist/db/batch.js +10 -10
  122. package/dist/db/client.js +2 -2
  123. package/dist/db/credentials.js +3 -3
  124. package/dist/db/drizzle.js +4 -4
  125. package/dist/db/environments.js +6 -6
  126. package/dist/db/events.js +5 -5
  127. package/dist/db/files.js +5 -5
  128. package/dist/db/memory.js +5 -5
  129. package/dist/db/migrations.js +1 -1
  130. package/dist/db/proxy.js +5 -5
  131. package/dist/db/schema.js +1 -1
  132. package/dist/db/session-resources.js +5 -5
  133. package/dist/db/sessions.js +8 -7
  134. package/dist/db/sync.js +5 -5
  135. package/dist/db/tenants.js +3 -3
  136. package/dist/db/traces.js +5 -5
  137. package/dist/db/upstream_keys.js +3 -3
  138. package/dist/db/vaults.js +12 -8
  139. package/dist/handlers/agents.js +56 -52
  140. package/dist/handlers/api_keys.js +53 -53
  141. package/dist/handlers/audit.js +53 -53
  142. package/dist/handlers/batch.js +53 -53
  143. package/dist/handlers/credentials.js +53 -53
  144. package/dist/handlers/environments.js +53 -53
  145. package/dist/handlers/events.js +56 -56
  146. package/dist/handlers/files.js +53 -53
  147. package/dist/handlers/index.js +101 -93
  148. package/dist/handlers/license.js +52 -52
  149. package/dist/handlers/memory.js +53 -53
  150. package/dist/handlers/metrics.js +52 -52
  151. package/dist/handlers/models.js +53 -53
  152. package/dist/handlers/openapi.js +3 -3
  153. package/dist/handlers/providers.js +52 -52
  154. package/dist/handlers/resources.js +52 -52
  155. package/dist/handlers/sessions.js +55 -55
  156. package/dist/handlers/settings.js +52 -52
  157. package/dist/handlers/skills-write.js +52 -52
  158. package/dist/handlers/skills.js +53 -53
  159. package/dist/handlers/stream.js +52 -52
  160. package/dist/handlers/tenants.js +53 -53
  161. package/dist/handlers/threads.js +52 -52
  162. package/dist/handlers/traces.js +53 -53
  163. package/dist/handlers/ui.js +1 -1
  164. package/dist/handlers/upstream_keys.js +55 -55
  165. package/dist/handlers/vaults.js +56 -52
  166. package/dist/handlers/whoami.js +52 -52
  167. package/dist/http.js +55 -51
  168. package/dist/index.js +57 -57
  169. package/dist/init.js +48 -48
  170. package/dist/lib/model-registry.js +6 -6
  171. package/dist/lib/skills-cache.js +6 -6
  172. package/dist/observability/otlp.js +12 -12
  173. package/dist/observability/redactor.js +8 -8
  174. package/dist/openapi/schemas.js +3 -1
  175. package/dist/openapi/spec.js +2 -2
  176. package/dist/providers/fly.js +5 -5
  177. package/dist/providers/modal.js +5 -5
  178. package/dist/providers/registry.js +1 -1
  179. package/dist/providers/resolve-secrets.js +7 -7
  180. package/dist/providers/sprites.js +7 -7
  181. package/dist/providers/upstream-keys.js +12 -11
  182. package/dist/providers/vercel.js +5 -5
  183. package/dist/proxy/forward.js +6 -6
  184. package/dist/queue/index.js +6 -6
  185. package/dist/sessions/bus.js +10 -10
  186. package/dist/sessions/driver.js +41 -41
  187. package/dist/sessions/grader.js +5 -5
  188. package/dist/sessions/mcp-auth.js +1 -1
  189. package/dist/sessions/secrets.js +8 -8
  190. package/dist/sessions/sweeper.js +37 -37
  191. package/dist/sessions/threads.js +41 -41
  192. package/dist/shutdown.js +38 -38
  193. package/dist/sync/anthropic.js +11 -11
  194. package/dist/sync/container-file-sync.js +6 -6
  195. package/dist/sync/file-sync.js +17 -17
  196. package/package.json +2 -2
  197. /package/dist/{chunk-WPK4ZPMG.js → chunk-UE6DNLSV.js} +0 -0
@@ -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";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  buildClaudeArgs,
3
3
  buildClaudeAuthEnv
4
- } from "./chunk-S7W3KJYH.js";
4
+ } from "./chunk-GIMDS46L.js";
5
5
  import {
6
6
  PERMISSION_BRIDGE_DIR,
7
7
  PERMISSION_HOOK_SCRIPT_PATH,
@@ -25,7 +25,7 @@ import {
25
25
  } from "./chunk-IU457W7Q.js";
26
26
  import {
27
27
  getConfig
28
- } from "./chunk-V7MTIMPB.js";
28
+ } from "./chunk-X6QIWZ33.js";
29
29
 
30
30
  // src/backends/claude/index.ts
31
31
  function buildTurn(input) {
@@ -38,7 +38,7 @@ function buildTurn(input) {
38
38
  const env = buildClaudeAuthEnv();
39
39
  const customTools = agent.tools.filter((t) => t.type === "custom");
40
40
  const hasBridgeTools = customTools.length > 0 || agent.threads_enabled;
41
- if (hasBridgeTools || agent.mcp_servers && Object.keys(agent.mcp_servers).length > 0) {
41
+ if (hasBridgeTools || agent.mcp_servers && agent.mcp_servers.length > 0) {
42
42
  const mcpIdx = argsBase.indexOf("--mcp-config");
43
43
  let existingServers = {};
44
44
  if (mcpIdx >= 0 && mcpIdx + 1 < argsBase.length) {
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  init_schema,
3
3
  schema_exports
4
- } from "./chunk-ZMJ4EP4C.js";
4
+ } from "./chunk-ILHIHMO3.js";
5
5
  import {
6
6
  getDb,
7
7
  init_client
8
- } from "./chunk-6POQAFEC.js";
8
+ } from "./chunk-W3JMIUHV.js";
9
9
  import {
10
10
  __esm
11
11
  } from "./chunk-2ESYSVXG.js";
@@ -4,13 +4,13 @@ import {
4
4
  } from "./chunk-D2XITRN6.js";
5
5
  import {
6
6
  authenticateAndIntercept
7
- } from "./chunk-WQARLGBG.js";
7
+ } from "./chunk-GCQDNUS2.js";
8
8
  import {
9
9
  checkAndBump
10
10
  } from "./chunk-HVUWXUUI.js";
11
11
  import {
12
12
  ensureInitialized
13
- } from "./chunk-LMNFIJ6M.js";
13
+ } from "./chunk-PN3AWRMX.js";
14
14
  import {
15
15
  captureException
16
16
  } from "./chunk-3MQ2FWXS.js";
@@ -64,8 +64,23 @@ async function routeWrap(request, handler) {
64
64
  function jsonOk(body, status = 200) {
65
65
  return Response.json(body, { status });
66
66
  }
67
+ function paginatedOk(data, requestedLimit) {
68
+ const hasMore = data.length === requestedLimit;
69
+ const nextPage = hasMore && data.length > 0 ? Buffer.from(data[data.length - 1].id).toString("base64url") : null;
70
+ return jsonOk({ data, next_page: nextPage });
71
+ }
72
+ function decodeCursor(page) {
73
+ if (!page) return void 0;
74
+ try {
75
+ return Buffer.from(page, "base64url").toString("utf8");
76
+ } catch {
77
+ return void 0;
78
+ }
79
+ }
67
80
 
68
81
  export {
69
82
  routeWrap,
70
- jsonOk
83
+ jsonOk,
84
+ paginatedOk,
85
+ decodeCursor
71
86
  };
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  buildCodexArgs
3
- } from "./chunk-NQX7WBA4.js";
3
+ } from "./chunk-PJYCPDV5.js";
4
4
  import {
5
5
  buildCodexAuthEnv,
6
6
  validateCodexRuntime
7
- } from "./chunk-6IYCBW4J.js";
7
+ } from "./chunk-WEC625LQ.js";
8
8
  import {
9
9
  prepareCodexOnSandbox
10
10
  } from "./chunk-M2LUXIXU.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/opencode/auth.ts
6
6
  function buildOpencodeAuthEnv() {
@@ -4,14 +4,14 @@ import {
4
4
  import {
5
5
  jsonOk,
6
6
  routeWrap
7
- } from "./chunk-RH4GKU52.js";
7
+ } from "./chunk-QTXAWC5J.js";
8
8
  import {
9
9
  getProxiedTenantId
10
- } from "./chunk-E7DD7F7J.js";
10
+ } from "./chunk-5U5LRAFJ.js";
11
11
  import {
12
12
  getSession,
13
13
  updateSessionResources
14
- } from "./chunk-3NK6YTA5.js";
14
+ } from "./chunk-KUWJJD6O.js";
15
15
  import {
16
16
  countResources,
17
17
  createResource,
@@ -19,11 +19,11 @@ import {
19
19
  getResource,
20
20
  init_session_resources,
21
21
  listResources
22
- } from "./chunk-5EKQBD2H.js";
22
+ } from "./chunk-FCUXFLNK.js";
23
23
  import {
24
24
  getDb,
25
25
  init_client
26
- } from "./chunk-6POQAFEC.js";
26
+ } from "./chunk-W3JMIUHV.js";
27
27
  import {
28
28
  badRequest,
29
29
  notFound
@@ -1,17 +1,18 @@
1
1
  import {
2
2
  loadVaultForCaller
3
- } from "./chunk-ZFJPOQSY.js";
3
+ } from "./chunk-OZFSKR2W.js";
4
4
  import {
5
5
  jsonOk,
6
+ paginatedOk,
6
7
  routeWrap
7
- } from "./chunk-RH4GKU52.js";
8
+ } from "./chunk-QTXAWC5J.js";
8
9
  import {
9
10
  createCredential,
10
11
  deleteCredential,
11
12
  getCredential,
12
13
  listCredentials,
13
14
  updateCredential
14
- } from "./chunk-L5RW66H5.js";
15
+ } from "./chunk-HVLYE4S5.js";
15
16
  import {
16
17
  badRequest,
17
18
  conflict,
@@ -123,12 +124,7 @@ function handleListCredentials(request, vaultId) {
123
124
  const url = new URL(req.url);
124
125
  const requestedLimit = Number(url.searchParams.get("limit") || "100");
125
126
  const data = listCredentials(vaultId);
126
- return jsonOk({
127
- data,
128
- has_more: data.length === requestedLimit,
129
- first_id: data.length > 0 ? data[0].id : null,
130
- last_id: data.length > 0 ? data[data.length - 1].id : null
131
- });
127
+ return paginatedOk(data, requestedLimit);
132
128
  });
133
129
  }
134
130
  function handleGetCredential(request, vaultId, credentialId) {
@@ -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/gemini/auth.ts
6
6
  function buildGeminiAuthEnv() {
@@ -9,10 +9,10 @@ import {
9
9
  import {
10
10
  getDrizzle,
11
11
  init_drizzle
12
- } from "./chunk-R5T4LJSK.js";
12
+ } from "./chunk-PZNAQBHQ.js";
13
13
  import {
14
14
  schema_exports
15
- } from "./chunk-ZMJ4EP4C.js";
15
+ } from "./chunk-ILHIHMO3.js";
16
16
 
17
17
  // src/db/api_keys.ts
18
18
  init_drizzle();
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  listEntries
3
- } from "./chunk-ZVXIZ2JD.js";
3
+ } from "./chunk-VP527YC5.js";
4
4
 
5
5
  // src/providers/resolve-secrets.ts
6
6
  var BLOCKED_ENV_KEYS = /* @__PURE__ */ new Set([
@@ -11,7 +11,7 @@ function buildFactoryArgs(input) {
11
11
  args.push("--session-id", input.backendSessionId);
12
12
  }
13
13
  if (input.agent.model) {
14
- args.push("--model", input.agent.model);
14
+ args.push("--model", input.agent.model.id);
15
15
  }
16
16
  return args;
17
17
  }
@@ -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,7 +4,7 @@ import {
4
4
  import {
5
5
  jsonOk,
6
6
  routeWrap
7
- } from "./chunk-RH4GKU52.js";
7
+ } from "./chunk-QTXAWC5J.js";
8
8
 
9
9
  // src/handlers/license.ts
10
10
  function handleGetLicense(request) {
@@ -27,21 +27,26 @@ function isOllamaModel(model) {
27
27
  return !cloudPrefixes.some((p) => model.startsWith(p));
28
28
  }
29
29
  function buildOpencodeConfigEnv(agent, ollamaBaseUrl) {
30
- if (ollamaBaseUrl === void 0 && isOllamaModel(agent.model)) {
30
+ if (ollamaBaseUrl === void 0 && isOllamaModel(agent.model.id)) {
31
31
  ollamaBaseUrl = "http://localhost:11434/v1";
32
32
  }
33
33
  const config = {};
34
- if (agent.mcp_servers && Object.keys(agent.mcp_servers).length > 0) {
35
- config.mcp = mcpConfigToOpencode(agent.mcp_servers);
34
+ if (agent.mcp_servers && agent.mcp_servers.length > 0) {
35
+ const mcpRecord = {};
36
+ for (const s of agent.mcp_servers) {
37
+ const { name, ...rest } = s;
38
+ mcpRecord[name] = rest;
39
+ }
40
+ config.mcp = mcpConfigToOpencode(mcpRecord);
36
41
  }
37
- if (isOllamaModel(agent.model) && ollamaBaseUrl) {
42
+ if (isOllamaModel(agent.model.id) && ollamaBaseUrl) {
38
43
  config.provider = {
39
44
  ollama: {
40
45
  npm: "@ai-sdk/openai-compatible",
41
46
  name: "Ollama (local)",
42
47
  options: { baseURL: ollamaBaseUrl },
43
48
  models: {
44
- [agent.model]: { name: agent.model }
49
+ [agent.model.id]: { name: agent.model.id }
45
50
  }
46
51
  }
47
52
  };
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-AIBH32FN.js";
5
5
  import {
6
6
  DEFAULT_TENANT_ID
7
- } from "./chunk-AR2TM7CR.js";
7
+ } from "./chunk-I26QP3A3.js";
8
8
  import {
9
9
  init_ids,
10
10
  newId
@@ -17,24 +17,32 @@ import {
17
17
  import {
18
18
  getDrizzle,
19
19
  init_drizzle
20
- } from "./chunk-R5T4LJSK.js";
20
+ } from "./chunk-PZNAQBHQ.js";
21
21
  import {
22
22
  schema_exports
23
- } from "./chunk-ZMJ4EP4C.js";
23
+ } from "./chunk-ILHIHMO3.js";
24
24
 
25
25
  // src/db/vaults.ts
26
26
  init_drizzle();
27
27
  init_ids();
28
28
  init_clock();
29
- import { eq, and, asc, desc } from "drizzle-orm";
29
+ import { eq, and, asc, desc, isNull } from "drizzle-orm";
30
30
  function hydrateVault(row) {
31
+ let metadata = {};
32
+ try {
33
+ metadata = JSON.parse(row.metadata_json || "{}");
34
+ } catch {
35
+ }
31
36
  return {
37
+ type: "vault",
32
38
  id: row.id,
33
39
  agent_id: row.agent_id,
34
40
  name: row.name,
35
41
  display_name: row.name,
42
+ metadata,
36
43
  created_at: toIso(row.created_at),
37
- updated_at: toIso(row.updated_at)
44
+ updated_at: toIso(row.updated_at),
45
+ archived_at: row.archived_at ? toIso(row.archived_at) : null
38
46
  };
39
47
  }
40
48
  function createVault(input) {
@@ -43,8 +51,9 @@ function createVault(input) {
43
51
  const now = nowMs();
44
52
  db.insert(schema_exports.vaults).values({
45
53
  id,
46
- agent_id: input.agent_id,
54
+ agent_id: input.agent_id ?? null,
47
55
  name: input.name,
56
+ metadata_json: JSON.stringify(input.metadata ?? {}),
48
57
  tenant_id: input.tenant_id ?? DEFAULT_TENANT_ID,
49
58
  created_at: now,
50
59
  updated_at: now
@@ -69,6 +78,24 @@ function listVaults(opts) {
69
78
  const rows = where ? db.select().from(schema_exports.vaults).where(where).orderBy(desc(schema_exports.vaults.created_at)).all() : db.select().from(schema_exports.vaults).orderBy(desc(schema_exports.vaults.created_at)).all();
70
79
  return rows.map(hydrateVault);
71
80
  }
81
+ function updateVault(id, fields) {
82
+ const db = getDrizzle();
83
+ const now = nowMs();
84
+ const updates = { updated_at: now };
85
+ if (fields.display_name !== void 0) {
86
+ updates.name = fields.display_name;
87
+ }
88
+ if (fields.metadata !== void 0) {
89
+ updates.metadata_json = JSON.stringify(fields.metadata);
90
+ }
91
+ db.update(schema_exports.vaults).set(updates).where(eq(schema_exports.vaults.id, id)).run();
92
+ return getVault(id);
93
+ }
94
+ function archiveVault(id) {
95
+ const db = getDrizzle();
96
+ const res = db.update(schema_exports.vaults).set({ archived_at: nowMs() }).where(and(eq(schema_exports.vaults.id, id), isNull(schema_exports.vaults.archived_at))).run();
97
+ return res.changes > 0;
98
+ }
72
99
  function deleteVault(id) {
73
100
  const db = getDrizzle();
74
101
  const res = db.delete(schema_exports.vaults).where(eq(schema_exports.vaults.id, id)).run();
@@ -114,6 +141,8 @@ export {
114
141
  createVault,
115
142
  getVault,
116
143
  listVaults,
144
+ updateVault,
145
+ archiveVault,
117
146
  deleteVault,
118
147
  setEntry,
119
148
  getEntry,