@agentstep/agent-sdk 0.4.31 → 0.4.32

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 (164) hide show
  1. package/dist/auth/middleware.js +5 -5
  2. package/dist/backends/claude/args.js +3 -3
  3. package/dist/backends/claude/index.js +4 -4
  4. package/dist/backends/codex/auth.js +3 -3
  5. package/dist/backends/codex/index.js +7 -7
  6. package/dist/backends/factory/auth.js +3 -3
  7. package/dist/backends/factory/index.js +4 -4
  8. package/dist/backends/gemini/auth.js +3 -3
  9. package/dist/backends/gemini/index.js +7 -7
  10. package/dist/backends/opencode/auth.js +3 -3
  11. package/dist/backends/opencode/index.js +7 -7
  12. package/dist/backends/pi/auth.js +3 -3
  13. package/dist/backends/pi/index.js +4 -4
  14. package/dist/backends/registry.js +21 -21
  15. package/dist/{chunk-KFORPY7J.js → chunk-2CPZFRJJ.js} +6 -6
  16. package/dist/{chunk-TGEDOUUD.js → chunk-2GIX4HAT.js} +1 -1
  17. package/dist/{chunk-JIURGVRG.js → chunk-2I35VGHX.js} +4 -4
  18. package/dist/{chunk-ULS4X3UQ.js → chunk-2PPB644A.js} +1 -1
  19. package/dist/{chunk-RCF2SVUO.js → chunk-2VED3F37.js} +20 -16
  20. package/dist/{chunk-G6JKWW2S.js → chunk-3HL62Y77.js} +1 -1
  21. package/dist/{chunk-A7CS7RTM.js → chunk-3HTE2CIM.js} +3 -3
  22. package/dist/{chunk-4MDF5N2L.js → chunk-3K4KIYEZ.js} +2 -2
  23. package/dist/{chunk-BNXUV6NZ.js → chunk-3NQH2EUI.js} +3 -3
  24. package/dist/{chunk-UCOSSYKZ.js → chunk-45JXGYJK.js} +8 -7
  25. package/dist/{chunk-UBFEHVPY.js → chunk-47XDZFF4.js} +2 -2
  26. package/dist/chunk-4XXQAVKE.js +34 -0
  27. package/dist/{chunk-O5B7GRUK.js → chunk-5EQJOUWM.js} +1 -1
  28. package/dist/{chunk-AJPZY6EJ.js → chunk-5IGBMS2U.js} +1 -1
  29. package/dist/{chunk-IN5KO2L2.js → chunk-6IYCBW4J.js} +1 -1
  30. package/dist/{chunk-TLH4JLC7.js → chunk-7CD4QT5R.js} +2 -2
  31. package/dist/{chunk-Y2VQ65PM.js → chunk-7VVH435L.js} +3 -3
  32. package/dist/{chunk-XVK7YFZP.js → chunk-C46UG6GQ.js} +1 -1
  33. package/dist/{chunk-I2SLDKCN.js → chunk-C6AXM3M7.js} +2 -2
  34. package/dist/{chunk-NJ4JTJJM.js → chunk-CREPPDHX.js} +1 -1
  35. package/dist/{chunk-NIW3B4V2.js → chunk-DYK2WTYW.js} +5 -5
  36. package/dist/{chunk-FOOPNRHA.js → chunk-EA4JOLDI.js} +2 -2
  37. package/dist/{chunk-YS5UPMTH.js → chunk-EUIR2ADY.js} +8 -8
  38. package/dist/{chunk-Q3DOTREK.js → chunk-FXLUSECC.js} +1 -1
  39. package/dist/chunk-G7KUVNDY.js +80 -0
  40. package/dist/{chunk-UZQLLGX4.js → chunk-GUXT2F26.js} +12 -12
  41. package/dist/{chunk-WORPHTCS.js → chunk-IDIOFF35.js} +33 -4
  42. package/dist/{chunk-MHL3EXDR.js → chunk-JCW3ZRES.js} +1 -1
  43. package/dist/{chunk-7RJNOZLB.js → chunk-JVNWYWAT.js} +14 -14
  44. package/dist/{chunk-RKL2NK3V.js → chunk-JZL4L54R.js} +4 -4
  45. package/dist/{chunk-M7W3PCFS.js → chunk-K7NOZ7LV.js} +1 -1
  46. package/dist/{chunk-BQRKJAOP.js → chunk-MPTQYBVB.js} +1 -1
  47. package/dist/{chunk-ZOWT6X6Y.js → chunk-MQQ44IGX.js} +4 -4
  48. package/dist/{chunk-GNHRAWOX.js → chunk-N3QIXC2B.js} +2 -2
  49. package/dist/{chunk-JWSR5TZ3.js → chunk-OGJUSGF7.js} +1 -1
  50. package/dist/{chunk-KLFJTFDB.js → chunk-P26WOAA3.js} +1 -1
  51. package/dist/{chunk-LHQD4KLV.js → chunk-P3PHXVMA.js} +1 -1
  52. package/dist/{chunk-OLF7H564.js → chunk-PKYFFSLU.js} +5 -5
  53. package/dist/{chunk-UW4T4TG3.js → chunk-QBMPITYC.js} +1 -1
  54. package/dist/{chunk-33OBMYKV.js → chunk-QEIG7FXY.js} +1 -1
  55. package/dist/{chunk-MVC2FD32.js → chunk-QHBXWPSO.js} +3 -3
  56. package/dist/{chunk-TLEGXMX7.js → chunk-QO2C2PBW.js} +3 -3
  57. package/dist/{chunk-FEXR57M4.js → chunk-R6V363NP.js} +4 -4
  58. package/dist/{chunk-KRLVSKID.js → chunk-RRASSOJX.js} +4 -4
  59. package/dist/{chunk-S4AYCMMB.js → chunk-RVR6C22M.js} +1 -1
  60. package/dist/{chunk-WU52LOGJ.js → chunk-S7HHYBY3.js} +1 -1
  61. package/dist/{chunk-JJGAQMPS.js → chunk-S7W3KJYH.js} +1 -1
  62. package/dist/{chunk-CGKRD37R.js → chunk-TIHUJDA6.js} +2 -2
  63. package/dist/{chunk-ZKHUJB7A.js → chunk-TPPLYCJF.js} +1 -1
  64. package/dist/{chunk-PTYMGYNJ.js → chunk-TQYD3NYI.js} +1 -1
  65. package/dist/{chunk-PVITAFPJ.js → chunk-UJAD2NQ7.js} +2 -2
  66. package/dist/{chunk-4LKSYF4M.js → chunk-V2R7RWVY.js} +1 -1
  67. package/dist/{chunk-6YZ5WTLB.js → chunk-V7MTIMPB.js} +7 -5
  68. package/dist/{chunk-R3Q62FVO.js → chunk-WCNGMBIE.js} +2 -2
  69. package/dist/{chunk-CIUFOD65.js → chunk-WQARLGBG.js} +3 -3
  70. package/dist/{chunk-W63RBT7H.js → chunk-WQHRP3JL.js} +181 -15
  71. package/dist/{chunk-OZJG5G7V.js → chunk-X7VVDJ6T.js} +3 -3
  72. package/dist/{chunk-V5XH43NK.js → chunk-XMTKYR64.js} +7 -7
  73. package/dist/{chunk-ZG7FD2KD.js → chunk-YD3T4PBA.js} +2 -2
  74. package/dist/{chunk-55SVTKOM.js → chunk-YDZ7PCQO.js} +2 -2
  75. package/dist/{chunk-UZHSDRAK.js → chunk-YNOONYPO.js} +3 -3
  76. package/dist/{chunk-5H2CQ6L4.js → chunk-YVHFSCAX.js} +2 -2
  77. package/dist/{chunk-DKBNLGZO.js → chunk-YYEDFQJY.js} +11 -11
  78. package/dist/{chunk-O3XR457F.js → chunk-ZUDHZG7B.js} +2 -2
  79. package/dist/config/index.js +2 -2
  80. package/dist/containers/client.js +3 -3
  81. package/dist/containers/exec.js +3 -3
  82. package/dist/containers/lifecycle.js +38 -33
  83. package/dist/containers/setup.js +4 -4
  84. package/dist/containers/warm-pool.js +21 -0
  85. package/dist/db/agents.js +2 -2
  86. package/dist/db/api_keys.js +2 -2
  87. package/dist/db/batch.js +6 -6
  88. package/dist/db/environments.js +2 -2
  89. package/dist/db/events.js +2 -2
  90. package/dist/db/files.js +2 -2
  91. package/dist/db/memory.js +2 -2
  92. package/dist/db/proxy.js +2 -2
  93. package/dist/db/session-resources.js +2 -2
  94. package/dist/db/sessions.js +3 -3
  95. package/dist/db/sync.js +2 -2
  96. package/dist/db/vaults.js +2 -2
  97. package/dist/handlers/agents.js +48 -47
  98. package/dist/handlers/api_keys.js +48 -47
  99. package/dist/handlers/audit.js +48 -47
  100. package/dist/handlers/batch.js +49 -48
  101. package/dist/handlers/credentials.js +49 -48
  102. package/dist/handlers/environments.js +49 -48
  103. package/dist/handlers/events.js +51 -50
  104. package/dist/handlers/files.js +49 -48
  105. package/dist/handlers/index.js +96 -95
  106. package/dist/handlers/license.js +48 -47
  107. package/dist/handlers/memory.js +49 -48
  108. package/dist/handlers/metrics.js +48 -47
  109. package/dist/handlers/models.js +49 -48
  110. package/dist/handlers/providers.js +48 -47
  111. package/dist/handlers/resources.js +48 -47
  112. package/dist/handlers/sessions.js +51 -50
  113. package/dist/handlers/settings.js +48 -47
  114. package/dist/handlers/skills-write.js +48 -47
  115. package/dist/handlers/skills.js +49 -48
  116. package/dist/handlers/stream.js +48 -47
  117. package/dist/handlers/tenants.js +48 -47
  118. package/dist/handlers/threads.js +48 -47
  119. package/dist/handlers/traces.js +48 -47
  120. package/dist/handlers/upstream_keys.js +49 -48
  121. package/dist/handlers/vaults.js +48 -47
  122. package/dist/handlers/whoami.js +48 -47
  123. package/dist/http.js +47 -46
  124. package/dist/index.js +60 -59
  125. package/dist/init.js +44 -43
  126. package/dist/lib/model-registry.js +3 -3
  127. package/dist/lib/skills-cache.js +3 -3
  128. package/dist/observability/otlp.js +8 -8
  129. package/dist/observability/redactor.js +4 -4
  130. package/dist/providers/apple-container.js +2 -2
  131. package/dist/providers/docker.js +1 -1
  132. package/dist/providers/fly.js +2 -2
  133. package/dist/providers/modal.js +2 -2
  134. package/dist/providers/podman.js +24 -21
  135. package/dist/providers/registry.js +1 -1
  136. package/dist/providers/resolve-secrets.js +3 -3
  137. package/dist/providers/sprites.js +5 -4
  138. package/dist/providers/upstream-keys.js +6 -6
  139. package/dist/providers/vercel.js +2 -2
  140. package/dist/proxy/forward.js +3 -3
  141. package/dist/queue/index.js +3 -3
  142. package/dist/sessions/bus.js +6 -6
  143. package/dist/sessions/driver.js +37 -36
  144. package/dist/sessions/grader.js +2 -2
  145. package/dist/sessions/secrets.js +3 -3
  146. package/dist/sessions/sweeper.js +35 -34
  147. package/dist/sessions/threads.js +38 -37
  148. package/dist/shutdown.js +36 -35
  149. package/dist/sync/anthropic.js +6 -6
  150. package/dist/sync/container-file-sync.js +3 -3
  151. package/dist/sync/file-sync.js +12 -12
  152. package/package.json +1 -1
  153. package/dist/chunk-RMZRSYIJ.js +0 -31
  154. package/dist/{chunk-2COVNKOK.js → chunk-5EKQBD2H.js} +5 -5
  155. package/dist/{chunk-WNHJTUPW.js → chunk-A3KHFT7I.js} +5 -5
  156. package/dist/{chunk-VND46TDY.js → chunk-E7DD7F7J.js} +4 -4
  157. package/dist/{chunk-BCUBVYE3.js → chunk-L2RX552S.js} +4 -4
  158. package/dist/{chunk-LASUEMN6.js → chunk-SUGSHXND.js} +5 -5
  159. package/dist/{chunk-NDVC4J3H.js → chunk-TH7WJLZC.js} +5 -5
  160. package/dist/{chunk-XTZWBXAO.js → chunk-USYY3L7G.js} +4 -4
  161. package/dist/{chunk-C4II4GGZ.js → chunk-WPK4ZPMG.js} +0 -0
  162. package/dist/{chunk-QVFRPABA.js → chunk-X6IQ57SC.js} +5 -5
  163. package/dist/{chunk-P2IGNOJI.js → chunk-ZTH5JRZG.js} +5 -5
  164. package/dist/{chunk-J37F7PXJ.js → chunk-ZVXIZ2JD.js} +5 -5
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  jsonOk,
12
12
  routeWrap
13
- } from "./chunk-4MDF5N2L.js";
13
+ } from "./chunk-3K4KIYEZ.js";
14
14
  import {
15
15
  archiveTenant,
16
16
  createTenant,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  jsonOk,
3
3
  routeWrap
4
- } from "./chunk-4MDF5N2L.js";
4
+ } from "./chunk-3K4KIYEZ.js";
5
5
 
6
6
  // src/handlers/whoami.ts
7
7
  function handleWhoami(request) {
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  getSession
3
- } from "./chunk-KFORPY7J.js";
3
+ } from "./chunk-2CPZFRJJ.js";
4
4
  import {
5
5
  appendEvent,
6
6
  appendEventsBatch,
7
7
  listEvents,
8
8
  rowToManagedEvent
9
- } from "./chunk-NDVC4J3H.js";
9
+ } from "./chunk-TH7WJLZC.js";
10
10
  import {
11
11
  getAgent
12
- } from "./chunk-P2IGNOJI.js";
12
+ } from "./chunk-ZTH5JRZG.js";
13
13
  import {
14
14
  getDb,
15
15
  init_client
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  jsonOk,
3
3
  routeWrap
4
- } from "./chunk-4MDF5N2L.js";
4
+ } from "./chunk-3K4KIYEZ.js";
5
5
  import {
6
6
  resolveContainerProvider
7
- } from "./chunk-C4II4GGZ.js";
7
+ } from "./chunk-WPK4ZPMG.js";
8
8
  import {
9
9
  getConfig
10
- } from "./chunk-6YZ5WTLB.js";
10
+ } from "./chunk-V7MTIMPB.js";
11
11
 
12
12
  // src/handlers/providers.ts
13
13
  var LOCAL_PROVIDERS = ["docker", "apple-container", "podman"];
@@ -2,19 +2,19 @@ import {
2
2
  getSyncRow,
3
3
  getSyncedRemoteId,
4
4
  upsertSync
5
- } from "./chunk-BCUBVYE3.js";
5
+ } from "./chunk-L2RX552S.js";
6
6
  import {
7
7
  injectMcpAuthHeaders
8
8
  } from "./chunk-SV2B3P6B.js";
9
9
  import {
10
10
  listEntries
11
- } from "./chunk-J37F7PXJ.js";
11
+ } from "./chunk-ZVXIZ2JD.js";
12
12
  import {
13
13
  getEnvironment
14
- } from "./chunk-QVFRPABA.js";
14
+ } from "./chunk-X6IQ57SC.js";
15
15
  import {
16
16
  getAgent
17
- } from "./chunk-P2IGNOJI.js";
17
+ } from "./chunk-ZTH5JRZG.js";
18
18
 
19
19
  // src/sync/anthropic.ts
20
20
  import { createHash } from "crypto";
@@ -4,14 +4,14 @@ import {
4
4
  import {
5
5
  jsonOk,
6
6
  routeWrap
7
- } from "./chunk-4MDF5N2L.js";
7
+ } from "./chunk-3K4KIYEZ.js";
8
8
  import {
9
9
  getProxiedTenantId
10
- } from "./chunk-VND46TDY.js";
10
+ } from "./chunk-E7DD7F7J.js";
11
11
  import {
12
12
  getSession,
13
13
  updateSessionResources
14
- } from "./chunk-KFORPY7J.js";
14
+ } from "./chunk-2CPZFRJJ.js";
15
15
  import {
16
16
  countResources,
17
17
  createResource,
@@ -19,7 +19,7 @@ import {
19
19
  getResource,
20
20
  init_session_resources,
21
21
  listResources
22
- } from "./chunk-2COVNKOK.js";
22
+ } from "./chunk-5EKQBD2H.js";
23
23
  import {
24
24
  getDb,
25
25
  init_client
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getConfig
3
- } from "./chunk-6YZ5WTLB.js";
3
+ } from "./chunk-V7MTIMPB.js";
4
4
 
5
5
  // src/backends/pi/auth.ts
6
6
  function buildPiAuthEnv() {
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  jsonOk,
10
10
  routeWrap
11
- } from "./chunk-4MDF5N2L.js";
11
+ } from "./chunk-3K4KIYEZ.js";
12
12
  import {
13
13
  badRequest
14
14
  } from "./chunk-EZYKRG4W.js";
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-XBHDQK4Z.js";
7
7
  import {
8
8
  getConfig
9
- } from "./chunk-6YZ5WTLB.js";
9
+ } from "./chunk-V7MTIMPB.js";
10
10
 
11
11
  // src/backends/claude/args.ts
12
12
  function buildClaudeArgs(input) {
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  BatchError,
3
3
  executeBatch
4
- } from "./chunk-Y2VQ65PM.js";
4
+ } from "./chunk-7VVH435L.js";
5
5
  import {
6
6
  jsonOk,
7
7
  routeWrap
8
- } from "./chunk-4MDF5N2L.js";
8
+ } from "./chunk-3K4KIYEZ.js";
9
9
  import {
10
10
  badRequest
11
11
  } from "./chunk-EZYKRG4W.js";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-L5RW66H5.js";
4
4
  import {
5
5
  listEntries
6
- } from "./chunk-J37F7PXJ.js";
6
+ } from "./chunk-ZVXIZ2JD.js";
7
7
 
8
8
  // src/sessions/secrets.ts
9
9
  function loadSessionSecrets(vaultIds) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  routeWrap
3
- } from "./chunk-4MDF5N2L.js";
3
+ } from "./chunk-3K4KIYEZ.js";
4
4
  import {
5
5
  ApiError
6
6
  } from "./chunk-EZYKRG4W.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  loadVaultForCaller
3
- } from "./chunk-BNXUV6NZ.js";
3
+ } from "./chunk-3NQH2EUI.js";
4
4
  import {
5
5
  jsonOk,
6
6
  routeWrap
7
- } from "./chunk-4MDF5N2L.js";
7
+ } from "./chunk-3K4KIYEZ.js";
8
8
  import {
9
9
  createCredential,
10
10
  deleteCredential,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getConfig
3
- } from "./chunk-6YZ5WTLB.js";
3
+ } from "./chunk-V7MTIMPB.js";
4
4
 
5
5
  // src/backends/gemini/auth.ts
6
6
  function buildGeminiAuthEnv() {
@@ -1,3 +1,7 @@
1
+ import {
2
+ init_clock,
3
+ nowMs
4
+ } from "./chunk-HFDLUBWN.js";
1
5
  import {
2
6
  getDrizzle,
3
7
  init_drizzle
@@ -5,10 +9,6 @@ import {
5
9
  import {
6
10
  schema_exports
7
11
  } from "./chunk-ZMJ4EP4C.js";
8
- import {
9
- init_clock,
10
- nowMs
11
- } from "./chunk-HFDLUBWN.js";
12
12
 
13
13
  // src/config/index.ts
14
14
  init_drizzle();
@@ -53,7 +53,9 @@ function loadConfig() {
53
53
  ollamaUrl: process.env.OLLAMA_URL || readSetting("ollama_url") || "http://localhost:11434",
54
54
  anthropicPassthroughEnabled: parseBool(
55
55
  process.env.ANTHROPIC_PASSTHROUGH_ENABLED ?? readSetting("anthropic_passthrough_enabled")
56
- )
56
+ ),
57
+ warmPoolSize: num(process.env.WARM_POOL_SIZE, 0),
58
+ warmPoolTtlMs: num(process.env.WARM_POOL_TTL_MS, 3e5)
57
59
  };
58
60
  }
59
61
  function parseBool(v) {
@@ -12,11 +12,11 @@ import {
12
12
  listMemories,
13
13
  listMemoryStores,
14
14
  updateMemory
15
- } from "./chunk-LASUEMN6.js";
15
+ } from "./chunk-SUGSHXND.js";
16
16
  import {
17
17
  jsonOk,
18
18
  routeWrap
19
- } from "./chunk-4MDF5N2L.js";
19
+ } from "./chunk-3K4KIYEZ.js";
20
20
  import {
21
21
  getDb,
22
22
  init_client
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  forwardToAnthropic
3
- } from "./chunk-MHL3EXDR.js";
3
+ } from "./chunk-JCW3ZRES.js";
4
4
  import {
5
5
  isAnthropicApiKey,
6
6
  isPassthroughAllowedPath
@@ -8,10 +8,10 @@ import {
8
8
  import {
9
9
  findByRawKey,
10
10
  hydratePermissions
11
- } from "./chunk-XTZWBXAO.js";
11
+ } from "./chunk-USYY3L7G.js";
12
12
  import {
13
13
  getConfig
14
- } from "./chunk-6YZ5WTLB.js";
14
+ } from "./chunk-V7MTIMPB.js";
15
15
  import {
16
16
  unauthorized
17
17
  } from "./chunk-EZYKRG4W.js";
@@ -1,21 +1,21 @@
1
- import {
2
- resolveVaultSecrets
3
- } from "./chunk-AJPZY6EJ.js";
4
1
  import {
5
2
  dockerProvider
6
- } from "./chunk-RMZRSYIJ.js";
3
+ } from "./chunk-4XXQAVKE.js";
4
+ import {
5
+ resolveVaultSecrets
6
+ } from "./chunk-5IGBMS2U.js";
7
7
  import {
8
8
  appendEvent
9
- } from "./chunk-MVC2FD32.js";
9
+ } from "./chunk-QHBXWPSO.js";
10
10
  import {
11
11
  getSession,
12
12
  getSessionRow,
13
13
  setSessionSandbox
14
- } from "./chunk-KFORPY7J.js";
14
+ } from "./chunk-2CPZFRJJ.js";
15
15
  import {
16
16
  deleteSprite,
17
17
  listSprites
18
- } from "./chunk-Q3DOTREK.js";
18
+ } from "./chunk-FXLUSECC.js";
19
19
  import {
20
20
  allSessionSandboxes,
21
21
  countInEnv,
@@ -24,20 +24,29 @@ import {
24
24
  } from "./chunk-EFOIR7R3.js";
25
25
  import {
26
26
  resolveContainerProvider
27
- } from "./chunk-C4II4GGZ.js";
27
+ } from "./chunk-WPK4ZPMG.js";
28
28
  import {
29
29
  getEnvironment,
30
- getEnvironmentRow
31
- } from "./chunk-QVFRPABA.js";
30
+ getEnvironmentRow,
31
+ listEnvironments
32
+ } from "./chunk-X6IQ57SC.js";
33
+ import {
34
+ addWarm,
35
+ claimWarm,
36
+ countInflight,
37
+ countWarm,
38
+ decrementInflight,
39
+ incrementInflight
40
+ } from "./chunk-G7KUVNDY.js";
32
41
  import {
33
42
  getAgent
34
- } from "./chunk-P2IGNOJI.js";
43
+ } from "./chunk-ZTH5JRZG.js";
35
44
  import {
36
45
  resolveBackend
37
- } from "./chunk-YS5UPMTH.js";
46
+ } from "./chunk-EUIR2ADY.js";
38
47
  import {
39
48
  getConfig
40
- } from "./chunk-6YZ5WTLB.js";
49
+ } from "./chunk-V7MTIMPB.js";
41
50
  import {
42
51
  init_clock,
43
52
  nowMs
@@ -48,6 +57,7 @@ import {
48
57
 
49
58
  // src/containers/lifecycle.ts
50
59
  init_clock();
60
+ import { ulid } from "ulid";
51
61
  var lcLog = (...args) => {
52
62
  if (process.env.DEBUG_LIFECYCLE === "1") console.log(...args);
53
63
  };
@@ -94,7 +104,8 @@ async function installSkills(sandboxName, provider, skills, engine) {
94
104
  }
95
105
  }
96
106
  function deriveSandboxName(sessionId) {
97
- return `${SANDBOX_NAME_PREFIX}${sessionId.replace(/^sess_/, "").toLowerCase()}`;
107
+ const tail = sessionId.replace(/^[a-z]+_/, "").toLowerCase();
108
+ return `${SANDBOX_NAME_PREFIX}${tail}`;
98
109
  }
99
110
  async function acquireForFirstTurn(sessionId) {
100
111
  const row = getSessionRow(sessionId);
@@ -109,7 +120,8 @@ async function acquireForFirstTurn(sessionId) {
109
120
  `environment is not ready (state=${env.state})`
110
121
  );
111
122
  }
112
- if (countInEnv(env.id) >= getConfig().maxSandboxesPerEnv) {
123
+ const config = getConfig();
124
+ if (countInEnv(env.id) + countWarm(env.id) >= config.maxSandboxesPerEnv) {
113
125
  throw new ApiError(503, "server_busy", "env sandbox pool exhausted");
114
126
  }
115
127
  const agent = getAgent(row.agent_id, row.agent_version);
@@ -128,6 +140,84 @@ async function acquireForFirstTurn(sessionId) {
128
140
  }
129
141
  }
130
142
  const sp = wrapProviderWithSecrets(provider, secrets);
143
+ const warm = claimWarm(env.id, backend.name, provider.name);
144
+ if (warm) {
145
+ lcLog(`[lifecycle] ${sessionId} claimed warm container: ${warm.sandboxName}`);
146
+ const name2 = warm.sandboxName;
147
+ try {
148
+ if (agent.engine === "claude") {
149
+ const customTools = agent.tools.filter(
150
+ (t) => t.type === "custom"
151
+ );
152
+ const allBridgeTools = [...customTools];
153
+ if (agent.threads_enabled) {
154
+ allBridgeTools.push({
155
+ type: "custom",
156
+ name: "spawn_agent",
157
+ description: "Spawn a sub-agent to handle a task. Returns the sub-agent's response.",
158
+ input_schema: {
159
+ type: "object",
160
+ properties: {
161
+ agent_id: { type: "string", description: "ID of the agent to spawn" },
162
+ prompt: { type: "string", description: "Task for the sub-agent" }
163
+ },
164
+ required: ["agent_id", "prompt"]
165
+ }
166
+ });
167
+ }
168
+ if (allBridgeTools.length > 0) {
169
+ const { installToolBridge } = await import("./backends/claude/index.js");
170
+ await installToolBridge(name2, allBridgeTools, sp);
171
+ }
172
+ if (agent.confirmation_mode) {
173
+ const { installPermissionHook } = await import("./backends/claude/index.js");
174
+ await installPermissionHook(name2, sp);
175
+ }
176
+ }
177
+ if (agent.skills && agent.skills.length > 0) {
178
+ lcLog(`[lifecycle] ${sessionId} installing ${agent.skills.length} skill(s) on warm container...`);
179
+ await installSkills(name2, sp, agent.skills, agent.engine);
180
+ }
181
+ } catch (err) {
182
+ await sp.delete(name2).catch(() => {
183
+ });
184
+ throw err;
185
+ }
186
+ const { listResources: listSessionResources2 } = await import("./db/session-resources.js");
187
+ const tableResources2 = listSessionResources2(sessionId);
188
+ if (tableResources2.length > 0) {
189
+ const mapped = tableResources2.map((r) => {
190
+ if (r.type === "file") return { type: "file", file_id: r.file_id, mount_path: r.mount_path };
191
+ if (r.type === "github_repository") {
192
+ const checkout = r.checkout;
193
+ return {
194
+ type: "github_repository",
195
+ repository_url: r.url,
196
+ mount_path: r.mount_path,
197
+ branch: checkout?.type === "branch" ? checkout.name : void 0,
198
+ commit: checkout?.type === "commit" ? checkout.name : void 0
199
+ };
200
+ }
201
+ return { type: "uri", uri: r.url, mount_path: r.mount_path };
202
+ });
203
+ await provisionResources(name2, mapped, sp);
204
+ } else {
205
+ const session = getSession(sessionId);
206
+ if (session?.resources && session.resources.length > 0) {
207
+ await provisionResources(name2, session.resources, sp);
208
+ }
209
+ }
210
+ register({
211
+ sandboxName: name2,
212
+ envId: env.id,
213
+ sessionId,
214
+ createdAt: nowMs(),
215
+ vaultSecrets: Object.keys(secrets).length > 0 ? secrets : void 0
216
+ });
217
+ setSessionSandbox(sessionId, name2);
218
+ void replenishWarmPool(env.id, backend.name, provider, secrets);
219
+ return name2;
220
+ }
131
221
  const name = deriveSandboxName(sessionId);
132
222
  lcLog(`[lifecycle] ${sessionId} creating container via ${sp.name}...`);
133
223
  try {
@@ -234,6 +324,80 @@ async function acquireForFirstTurn(sessionId) {
234
324
  setSessionSandbox(sessionId, name);
235
325
  return name;
236
326
  }
327
+ function effectiveWarmPoolSize(envId) {
328
+ const cfg = getConfig();
329
+ const envObj = getEnvironment(envId);
330
+ return envObj?.config?.warm_pool_size ?? cfg.warmPoolSize;
331
+ }
332
+ async function replenishWarmPool(envId, engine, provider, secrets) {
333
+ if (!provider.supportsWarmPool) return;
334
+ const target = effectiveWarmPoolSize(envId);
335
+ if (target <= 0) return;
336
+ if (countWarm(envId) + countInflight(envId) >= target) return;
337
+ const cfg = getConfig();
338
+ if (countInEnv(envId) + countWarm(envId) + countInflight(envId) >= cfg.maxSandboxesPerEnv) return;
339
+ incrementInflight(envId);
340
+ try {
341
+ const sp = wrapProviderWithSecrets(provider, secrets);
342
+ const name = `ca-warm-${ulid().toLowerCase()}`;
343
+ lcLog(`[warm-pool] creating warm container for env=${envId} engine=${engine}: ${name}`);
344
+ await sp.create({ name });
345
+ const backend = resolveBackend(engine);
346
+ await backend.prepareOnSandbox(name, sp);
347
+ const cfg2 = getConfig();
348
+ addWarm({
349
+ sandboxName: name,
350
+ envId,
351
+ engine,
352
+ provider: provider.name,
353
+ createdAt: nowMs(),
354
+ expiresAt: nowMs() + cfg2.warmPoolTtlMs,
355
+ vaultSecrets: Object.keys(secrets).length > 0 ? secrets : void 0
356
+ });
357
+ lcLog(`[warm-pool] warm container ready: ${name} (env=${envId})`);
358
+ } catch (err) {
359
+ console.warn(`[warm-pool] replenish failed for env=${envId} engine=${engine}:`, err);
360
+ } finally {
361
+ decrementInflight(envId);
362
+ }
363
+ }
364
+ async function fillWarmPools() {
365
+ const cfg = getConfig();
366
+ if (cfg.warmPoolSize <= 0) return;
367
+ const envs = listEnvironments({ includeArchived: false, limit: 100 });
368
+ const readyEnvs = envs.filter((e) => e.state === "ready");
369
+ if (readyEnvs.length === 0) return;
370
+ const CONCURRENCY = 3;
371
+ let active = 0;
372
+ let idx = 0;
373
+ async function processNext() {
374
+ while (idx < readyEnvs.length) {
375
+ if (active >= CONCURRENCY) {
376
+ await new Promise((r) => setTimeout(r, 0));
377
+ continue;
378
+ }
379
+ const env = readyEnvs[idx++];
380
+ active++;
381
+ void fillOneEnv(env).finally(() => active--);
382
+ }
383
+ }
384
+ void processNext();
385
+ }
386
+ async function fillOneEnv(env) {
387
+ const target = effectiveWarmPoolSize(env.id);
388
+ if (target <= 0) return;
389
+ try {
390
+ const provider = await resolveContainerProvider(env.config?.provider);
391
+ if (!provider.supportsWarmPool) return;
392
+ const backend = resolveBackend("claude");
393
+ const needed = target - countWarm(env.id) - countInflight(env.id);
394
+ for (let i = 0; i < needed; i++) {
395
+ void replenishWarmPool(env.id, backend.name, provider, {});
396
+ }
397
+ } catch (err) {
398
+ console.warn(`[warm-pool] fillOneEnv failed for env=${env.id}:`, err);
399
+ }
400
+ }
237
401
  async function provisionResources(sandboxName, resources, provider) {
238
402
  await provider.exec(sandboxName, ["mkdir", "-p", "/mnt/session/resources", "/mnt/session/uploads", "/mnt/session/outputs"]);
239
403
  const MAX_RESOURCE_BYTES = 50 * 1024 * 1024;
@@ -405,6 +569,8 @@ export {
405
569
  wrapProviderWithSecrets,
406
570
  installSkills,
407
571
  acquireForFirstTurn,
572
+ replenishWarmPool,
573
+ fillWarmPools,
408
574
  provisionResources,
409
575
  releaseSession,
410
576
  reconcileOrphanSandboxes,
@@ -4,14 +4,14 @@ import {
4
4
  import {
5
5
  jsonOk,
6
6
  routeWrap
7
- } from "./chunk-4MDF5N2L.js";
7
+ } from "./chunk-3K4KIYEZ.js";
8
8
  import {
9
9
  exportTrace
10
- } from "./chunk-NIW3B4V2.js";
10
+ } from "./chunk-DYK2WTYW.js";
11
11
  import {
12
12
  listEventsByTrace,
13
13
  rowToManagedEvent
14
- } from "./chunk-NDVC4J3H.js";
14
+ } from "./chunk-TH7WJLZC.js";
15
15
  import {
16
16
  badRequest,
17
17
  notFound
@@ -1,28 +1,28 @@
1
1
  import {
2
2
  resolveRemoteSessionId
3
- } from "./chunk-BCUBVYE3.js";
3
+ } from "./chunk-L2RX552S.js";
4
4
  import {
5
5
  assertResourceTenant
6
6
  } from "./chunk-23UKWXJH.js";
7
7
  import {
8
8
  authenticateAndIntercept
9
- } from "./chunk-CIUFOD65.js";
9
+ } from "./chunk-WQARLGBG.js";
10
10
  import {
11
11
  forwardToAnthropic
12
- } from "./chunk-MHL3EXDR.js";
12
+ } from "./chunk-JCW3ZRES.js";
13
13
  import {
14
14
  ensureInitialized
15
- } from "./chunk-RCF2SVUO.js";
15
+ } from "./chunk-2VED3F37.js";
16
16
  import {
17
17
  getProxiedTenantId,
18
18
  isProxied
19
- } from "./chunk-VND46TDY.js";
19
+ } from "./chunk-E7DD7F7J.js";
20
20
  import {
21
21
  subscribe
22
- } from "./chunk-MVC2FD32.js";
22
+ } from "./chunk-QHBXWPSO.js";
23
23
  import {
24
24
  getSession
25
- } from "./chunk-KFORPY7J.js";
25
+ } from "./chunk-2CPZFRJJ.js";
26
26
  import {
27
27
  getDb,
28
28
  init_client
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  jsonOk,
3
3
  routeWrap
4
- } from "./chunk-4MDF5N2L.js";
4
+ } from "./chunk-3K4KIYEZ.js";
5
5
  import {
6
6
  readSetting,
7
7
  writeSetting
8
- } from "./chunk-6YZ5WTLB.js";
8
+ } from "./chunk-V7MTIMPB.js";
9
9
  import {
10
10
  badRequest
11
11
  } from "./chunk-EZYKRG4W.js";
@@ -5,11 +5,11 @@ import {
5
5
  import {
6
6
  jsonOk,
7
7
  routeWrap
8
- } from "./chunk-4MDF5N2L.js";
8
+ } from "./chunk-3K4KIYEZ.js";
9
9
  import {
10
10
  getSession,
11
11
  listSessions
12
- } from "./chunk-KFORPY7J.js";
12
+ } from "./chunk-2CPZFRJJ.js";
13
13
  import {
14
14
  getDb,
15
15
  init_client
@@ -4,13 +4,13 @@ import {
4
4
  } from "./chunk-H7UKW666.js";
5
5
  import {
6
6
  listEntries
7
- } from "./chunk-J37F7PXJ.js";
7
+ } from "./chunk-ZVXIZ2JD.js";
8
8
  import {
9
9
  getSession
10
- } from "./chunk-KFORPY7J.js";
10
+ } from "./chunk-2CPZFRJJ.js";
11
11
  import {
12
12
  getConfig
13
- } from "./chunk-6YZ5WTLB.js";
13
+ } from "./chunk-V7MTIMPB.js";
14
14
 
15
15
  // src/providers/upstream-keys.ts
16
16
  var CONSECUTIVE_FAIL_THRESHOLD = 3;
@@ -4,11 +4,11 @@ import {
4
4
  getSources,
5
5
  getStats,
6
6
  searchSkills
7
- } from "./chunk-LHQD4KLV.js";
7
+ } from "./chunk-P3PHXVMA.js";
8
8
  import {
9
9
  jsonOk,
10
10
  routeWrap
11
- } from "./chunk-4MDF5N2L.js";
11
+ } from "./chunk-3K4KIYEZ.js";
12
12
 
13
13
  // src/handlers/skills.ts
14
14
  async function handleGetSkillsCatalog(request) {