eve 0.27.5 → 0.27.7

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 (311) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/src/channel/forwarded-principal.d.ts +74 -0
  3. package/dist/src/channel/forwarded-principal.js +1 -0
  4. package/dist/src/channel/routes.d.ts +7 -0
  5. package/dist/src/channel/send.js +1 -1
  6. package/dist/src/channel/session.d.ts +5 -0
  7. package/dist/src/channel/session.js +1 -1
  8. package/dist/src/channel/types.d.ts +7 -0
  9. package/dist/src/chunks/{use-eve-agent-BtkhbY2I.js → use-eve-agent-JPfBHZJr.js} +37 -7
  10. package/dist/src/chunks/{use-eve-agent-NUjD28Iu.js → use-eve-agent-r5tkzjmt.js} +37 -7
  11. package/dist/src/cli/commands/channels.d.ts +5 -2
  12. package/dist/src/cli/commands/channels.js +1 -1
  13. package/dist/src/cli/dev/local-server-child.d.ts +1 -0
  14. package/dist/src/cli/dev/local-server-child.js +1 -0
  15. package/dist/src/cli/dev/local-server-cleanup.d.ts +5 -0
  16. package/dist/src/cli/dev/local-server-cleanup.js +1 -0
  17. package/dist/src/cli/dev/local-server-process.d.ts +35 -0
  18. package/dist/src/cli/dev/local-server-process.js +1 -0
  19. package/dist/src/cli/dev/tui/remote-auth.js +1 -1
  20. package/dist/src/cli/dev/tui/runner.d.ts +4 -0
  21. package/dist/src/cli/dev/tui/runner.js +1 -1
  22. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +3 -0
  23. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  24. package/dist/src/cli/dev/tui/tui.d.ts +2 -0
  25. package/dist/src/cli/dev/tui/tui.js +1 -1
  26. package/dist/src/cli/dev/wait-for-ui.d.ts +13 -0
  27. package/dist/src/cli/dev/wait-for-ui.js +1 -0
  28. package/dist/src/cli/run.js +2 -2
  29. package/dist/src/cli/shutdown.d.ts +23 -0
  30. package/dist/src/cli/shutdown.js +1 -0
  31. package/dist/src/client/client.js +1 -1
  32. package/dist/src/client/open-stream.d.ts +17 -2
  33. package/dist/src/client/open-stream.js +1 -1
  34. package/dist/src/client/session.d.ts +5 -1
  35. package/dist/src/client/session.js +1 -1
  36. package/dist/src/client/types.d.ts +9 -1
  37. package/dist/src/compiled/@workflow/core/index.js +1 -1
  38. package/dist/src/compiled/@workflow/core/runtime.js +1 -1
  39. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  40. package/dist/src/compiled/_chunks/workflow/{attribute-changes-Dk1fP6vt.js → attribute-changes-CB7nRYoY.js} +1 -1
  41. package/dist/src/compiled/_chunks/workflow/{functions-Dv8dc_-I.js → functions-DareOZz_.js} +1 -1
  42. package/dist/src/compiled/_chunks/workflow/{resume-hook-czpG5xnP.js → resume-hook-g1vh0WRC.js} +1 -1
  43. package/dist/src/compiled/_chunks/workflow/{run-6zaMjFY6.js → run-lsS-QDok.js} +1 -1
  44. package/dist/src/compiled/_chunks/workflow/{sleep-B2u06FWc.js → sleep-BXg5I9l2.js} +1 -1
  45. package/dist/src/compiled/_chunks/workflow/wrapper-DnoQohyD.js +8 -0
  46. package/dist/src/compiler/normalize-subagent.js +1 -1
  47. package/dist/src/evals/autoevals-client.js +1 -1
  48. package/dist/src/evals/cli/eval.js +2 -2
  49. package/dist/src/evals/expect/index.js +1 -1
  50. package/dist/src/evals/judge.js +1 -1
  51. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  52. package/dist/src/execution/remote-agent-dispatch.d.ts +5 -1
  53. package/dist/src/execution/remote-agent-dispatch.js +1 -1
  54. package/dist/src/execution/sandbox/bash-tool.js +1 -1
  55. package/dist/src/execution/sandbox/bindings/docker-container.js +1 -1
  56. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  57. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  58. package/dist/src/execution/sandbox/development-cleanup.js +1 -1
  59. package/dist/src/execution/sandbox/ensure.js +1 -1
  60. package/dist/src/execution/subagent-invocation.d.ts +10 -0
  61. package/dist/src/execution/subagent-invocation.js +2 -2
  62. package/dist/src/execution/subagent-tool.js +1 -1
  63. package/dist/src/execution/workflow-runtime.js +1 -1
  64. package/dist/src/harness/emission.js +1 -1
  65. package/dist/src/harness/input-requests.js +1 -1
  66. package/dist/src/harness/runtime-actions.d.ts +4 -0
  67. package/dist/src/harness/runtime-actions.js +1 -1
  68. package/dist/src/harness/tool-call-input-errors.d.ts +20 -0
  69. package/dist/src/harness/tool-call-input-errors.js +1 -1
  70. package/dist/src/internal/application/build-workspace.d.ts +0 -1
  71. package/dist/src/internal/application/build-workspace.js +1 -1
  72. package/dist/src/internal/application/optional-package-install.js +1 -1
  73. package/dist/src/internal/application/package.js +1 -1
  74. package/dist/src/internal/application/paths.d.ts +1 -6
  75. package/dist/src/internal/application/paths.js +1 -1
  76. package/dist/src/internal/authored-module-map-loader.js +1 -1
  77. package/dist/src/internal/nitro/host/build-application.js +1 -1
  78. package/dist/src/internal/nitro/host/configure-nitro-routes.d.ts +4 -4
  79. package/dist/src/internal/nitro/host/configure-nitro-routes.js +2 -2
  80. package/dist/src/internal/nitro/host/create-application-nitro.d.ts +11 -7
  81. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  82. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  83. package/dist/src/internal/nitro/host/sandbox-shutdown-plugin.js +1 -1
  84. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  85. package/dist/src/internal/nitro/host/types.d.ts +0 -4
  86. package/dist/src/internal/nitro/host/vercel-build-output-config.d.ts +29 -1
  87. package/dist/src/internal/nitro/host/vercel-build-output-config.js +1 -1
  88. package/dist/src/internal/workflow/queue-namespace.d.ts +8 -0
  89. package/dist/src/internal/workflow/queue-namespace.js +1 -1
  90. package/dist/src/internal/workflow-bundle/builder-support.d.ts +0 -5
  91. package/dist/src/internal/workflow-bundle/builder.d.ts +0 -5
  92. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  93. package/dist/src/internal/workflow-bundle/vercel-workflow-output.d.ts +0 -51
  94. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -3
  95. package/dist/src/internal/workflow-bundle/workflow-builders.d.ts +0 -7
  96. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  97. package/dist/src/node_modules/.pnpm/{autoevals@0.0.132_ws@8.21.1 → autoevals@0.0.132_ws@8.21.1_bufferutil@4.1.0_}/node_modules/autoevals/jsdist/index.js +1 -1
  98. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  99. package/dist/src/protocol/message.d.ts +1 -0
  100. package/dist/src/protocol/message.js +2 -2
  101. package/dist/src/public/channels/eve.d.ts +20 -0
  102. package/dist/src/public/channels/eve.js +2 -2
  103. package/dist/src/public/definitions/remote-agent.d.ts +15 -0
  104. package/dist/src/public/sandbox/backends/default.js +1 -1
  105. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  106. package/dist/src/runtime/sessions/compiled-agent-cache.js +1 -1
  107. package/dist/src/runtime/types.d.ts +1 -0
  108. package/dist/src/setup/boxes/add-channels.d.ts +9 -7
  109. package/dist/src/setup/boxes/add-channels.js +2 -2
  110. package/dist/src/setup/boxes/select-channels.d.ts +4 -5
  111. package/dist/src/setup/channel-setup-deployment.d.ts +11 -0
  112. package/dist/src/setup/channel-setup-deployment.js +1 -0
  113. package/dist/src/setup/channel-setup-environment.d.ts +16 -0
  114. package/dist/src/setup/channel-setup-environment.js +1 -0
  115. package/dist/src/setup/channel-setup-integration.d.ts +31 -0
  116. package/dist/src/setup/channel-setup-integration.js +1 -0
  117. package/dist/src/setup/channel-setup-integrations.d.ts +7 -0
  118. package/dist/src/setup/channel-setup-integrations.js +1 -0
  119. package/dist/src/setup/channel-setup-runner.d.ts +7 -0
  120. package/dist/src/setup/channel-setup-runner.js +1 -0
  121. package/dist/src/setup/channel-setup-slack.d.ts +3 -0
  122. package/dist/src/setup/channel-setup-slack.js +1 -0
  123. package/dist/src/setup/channel-setup-ui.d.ts +18 -0
  124. package/dist/src/setup/channel-setup-ui.js +2 -0
  125. package/dist/src/setup/channel-setup-web.d.ts +3 -0
  126. package/dist/src/setup/channel-setup-web.js +1 -0
  127. package/dist/src/setup/flows/channels.d.ts +5 -10
  128. package/dist/src/setup/flows/channels.js +1 -1
  129. package/dist/src/setup/flows/install-vercel-cli.js +1 -1
  130. package/dist/src/setup/flows/login.js +1 -1
  131. package/dist/src/setup/index.js +1 -1
  132. package/dist/src/setup/scaffold/channels-catalog.d.ts +0 -2
  133. package/dist/src/setup/scaffold/channels-catalog.js +1 -1
  134. package/dist/src/setup/scaffold/create/project.js +1 -1
  135. package/dist/src/setup/scaffold/update/channels.d.ts +5 -3
  136. package/dist/src/setup/scaffold/update/channels.js +5 -2
  137. package/dist/src/setup/slack-connect-lifecycle.d.ts +3 -2
  138. package/dist/src/setup/slack-connect-lifecycle.js +1 -1
  139. package/dist/src/setup/slack-connect.d.ts +2 -0
  140. package/dist/src/setup/slack-connect.js +1 -1
  141. package/dist/src/setup/slackbot.d.ts +4 -0
  142. package/dist/src/setup/slackbot.js +1 -1
  143. package/dist/src/svelte/index.js +1 -1
  144. package/dist/src/svelte/use-eve-agent.js +1 -1
  145. package/dist/src/vue/index.js +1 -1
  146. package/dist/src/vue/use-eve-agent.js +1 -1
  147. package/docs/README.md +21 -20
  148. package/docs/channels/custom.mdx +1 -1
  149. package/docs/channels/overview.mdx +2 -0
  150. package/docs/channels/slack.mdx +2 -0
  151. package/docs/concepts/{execution-model-and-durability.md → execution-model-and-durability.mdx} +16 -0
  152. package/docs/concepts/security-model.md +2 -0
  153. package/docs/concepts/sessions-runs-and-streaming.md +9 -0
  154. package/docs/getting-started.mdx +13 -196
  155. package/docs/guides/auth-and-route-protection.md +20 -0
  156. package/docs/guides/client/overview.mdx +2 -0
  157. package/docs/guides/client/streaming.mdx +15 -0
  158. package/docs/guides/remote-agents.md +31 -8
  159. package/docs/installation.mdx +60 -0
  160. package/docs/meta.json +7 -6
  161. package/docs/project-structure.mdx +53 -0
  162. package/docs/reference/cli.md +1 -1
  163. package/docs/tutorial/meta.json +1 -1
  164. package/package.json +1 -1
  165. package/dist/src/compiled/_chunks/workflow/wrapper-Cc2otuUR.js +0 -6
  166. package/docs/introduction.mdx +0 -103
  167. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/_vendor/partial-json-parser/parser.js +0 -0
  168. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/auth/workload-identity-auth.js +0 -0
  169. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/azure.js +0 -0
  170. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/client.js +0 -0
  171. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/core/api-promise.js +0 -0
  172. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/core/error.js +0 -0
  173. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/core/pagination.js +0 -0
  174. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/core/resource.js +0 -0
  175. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/core/streaming.js +0 -0
  176. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/core/uploads.js +0 -0
  177. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/error.js +0 -0
  178. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/index.js +0 -0
  179. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/decoders/line.js +0 -0
  180. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/detect-platform.js +0 -0
  181. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/errors.js +0 -0
  182. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/headers.js +0 -0
  183. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/parse.js +0 -0
  184. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/qs/formats.js +0 -0
  185. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/qs/stringify.js +0 -0
  186. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/qs/utils.js +0 -0
  187. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/request-options.js +0 -0
  188. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/shims.js +0 -0
  189. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/to-file.js +0 -0
  190. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/tslib.js +0 -0
  191. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/uploads.js +0 -0
  192. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/utils/base64.js +0 -0
  193. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/utils/bytes.js +0 -0
  194. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/utils/env.js +0 -0
  195. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/utils/log.js +0 -0
  196. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/utils/path.js +0 -0
  197. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/utils/query.js +0 -0
  198. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/utils/sleep.js +0 -0
  199. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/utils/uuid.js +0 -0
  200. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/utils/values.js +0 -0
  201. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/internal/utils.js +0 -0
  202. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/AbstractChatCompletionRunner.js +0 -0
  203. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/AssistantStream.js +0 -0
  204. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/ChatCompletionRunner.js +0 -0
  205. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/ChatCompletionStream.js +0 -0
  206. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/ChatCompletionStreamingRunner.js +0 -0
  207. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/EventStream.js +0 -0
  208. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/ResponsesParser.js +0 -0
  209. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/RunnableFunction.js +0 -0
  210. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/Util.js +0 -0
  211. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/chatCompletionUtils.js +0 -0
  212. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/parser.js +0 -0
  213. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/lib/responses/ResponseStream.js +0 -0
  214. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/admin.js +0 -0
  215. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/admin-api-keys.js +0 -0
  216. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/audit-logs.js +0 -0
  217. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/certificates.js +0 -0
  218. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/data-retention.js +0 -0
  219. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/groups/groups.js +0 -0
  220. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/groups/roles.js +0 -0
  221. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/groups/users.js +0 -0
  222. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/invites.js +0 -0
  223. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/organization.js +0 -0
  224. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/api-keys.js +0 -0
  225. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/certificates.js +0 -0
  226. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/data-retention.js +0 -0
  227. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/groups/groups.js +0 -0
  228. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/groups/roles.js +0 -0
  229. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.js +0 -0
  230. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/model-permissions.js +0 -0
  231. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/projects.js +0 -0
  232. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/rate-limits.js +0 -0
  233. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/roles.js +0 -0
  234. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/service-accounts.js +0 -0
  235. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/spend-alerts.js +0 -0
  236. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/users/roles.js +0 -0
  237. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/projects/users/users.js +0 -0
  238. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/roles.js +0 -0
  239. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/spend-alerts.js +0 -0
  240. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/usage.js +0 -0
  241. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/users/roles.js +0 -0
  242. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/admin/organization/users/users.js +0 -0
  243. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/audio/audio.js +0 -0
  244. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/audio/speech.js +0 -0
  245. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/audio/transcriptions.js +0 -0
  246. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/audio/translations.js +0 -0
  247. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/batches.js +0 -0
  248. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/assistants.js +0 -0
  249. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/beta.js +0 -0
  250. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/chatkit/chatkit.js +0 -0
  251. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/chatkit/sessions.js +0 -0
  252. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/chatkit/threads.js +0 -0
  253. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/realtime/realtime.js +0 -0
  254. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/realtime/sessions.js +0 -0
  255. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/realtime/transcription-sessions.js +0 -0
  256. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/threads/messages.js +0 -0
  257. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/threads/runs/runs.js +0 -0
  258. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/threads/runs/steps.js +0 -0
  259. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/beta/threads/threads.js +0 -0
  260. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/chat/chat.js +0 -0
  261. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/chat/completions/completions.js +0 -0
  262. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/chat/completions/index.js +0 -0
  263. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/chat/completions/messages.js +0 -0
  264. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/chat/index.js +0 -0
  265. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/completions.js +0 -0
  266. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/containers/containers.js +0 -0
  267. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/containers/files/content.js +0 -0
  268. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/containers/files/files.js +0 -0
  269. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/conversations/conversations.js +0 -0
  270. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/conversations/items.js +0 -0
  271. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/embeddings.js +0 -0
  272. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/evals/evals.js +0 -0
  273. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/evals/runs/output-items.js +0 -0
  274. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/evals/runs/runs.js +0 -0
  275. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/files.js +0 -0
  276. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/fine-tuning/alpha/alpha.js +0 -0
  277. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/fine-tuning/alpha/graders.js +0 -0
  278. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.js +0 -0
  279. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/fine-tuning/checkpoints/permissions.js +0 -0
  280. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/fine-tuning/fine-tuning.js +0 -0
  281. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/fine-tuning/jobs/checkpoints.js +0 -0
  282. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/fine-tuning/jobs/jobs.js +0 -0
  283. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/fine-tuning/methods.js +0 -0
  284. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/graders/grader-models.js +0 -0
  285. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/graders/graders.js +0 -0
  286. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/images.js +0 -0
  287. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/index.js +0 -0
  288. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/models.js +0 -0
  289. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/moderations.js +0 -0
  290. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/realtime/calls.js +0 -0
  291. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/realtime/client-secrets.js +0 -0
  292. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/realtime/realtime.js +0 -0
  293. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/responses/input-items.js +0 -0
  294. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/responses/input-tokens.js +0 -0
  295. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/responses/responses.js +0 -0
  296. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/shared.js +0 -0
  297. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/skills/content.js +0 -0
  298. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/skills/skills.js +0 -0
  299. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/skills/versions/content.js +0 -0
  300. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/skills/versions/versions.js +0 -0
  301. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/uploads/parts.js +0 -0
  302. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/uploads/uploads.js +0 -0
  303. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/vector-stores/file-batches.js +0 -0
  304. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/vector-stores/files.js +0 -0
  305. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/vector-stores/vector-stores.js +0 -0
  306. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/videos.js +0 -0
  307. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/webhooks/index.js +0 -0
  308. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/webhooks/webhooks.js +0 -0
  309. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/resources/webhooks.js +0 -0
  310. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/streaming.js +0 -0
  311. /package/dist/src/node_modules/.pnpm/{openai@6.39.1_ws@8.21.1_zod@3.25.76 → openai@6.39.1_ws@8.21.1_bufferutil@4.1.0__zod@3.25.76}/node_modules/openai/version.js +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # eve
2
2
 
3
+ ## 0.27.7
4
+
5
+ ### Patch Changes
6
+
7
+ - 3c53306: Vercel builds now run a single Nitro build. The workflow flow function is emitted through Nitro's per-route `functionRules` (queue trigger, `maxDuration: "max"`, precondition guard) instead of a second standalone Nitro build that was copied and retargeted into the output, making `eve build` on Vercel roughly twice as fast.
8
+ - e368fcd: The client's `session.stream()` accepts `follow: false` for bounded catch-up reads (`follow` defaults to `true`, following the live stream): it consumes events from the cursor to the durable tail observed when the stream opens — surviving reconnects and still advancing the stored `streamIndex` — then returns instead of following the live stream. The HTTP stream route reports the durable tail as the `x-eve-stream-tail-index` response header when a request opts in with `includeTailIndex=1`, and channel-authoring `Session` objects gain `getStreamTailIndex()` for serving bounded reads from custom routes.
9
+ - 7e4f7ef: Tool calls whose arguments arrive as a raw JSON string (e.g. provider-executed server tools) are now parsed, and arguments that cannot be parsed at all — such as malformed JSON emitted by the model — surface as a failed tool result the model can react to instead of failing the whole turn.
10
+
11
+ ## 0.27.6
12
+
13
+ ### Patch Changes
14
+
15
+ - 0a8b63c: `eve channels add` now scaffolds portable channel variants when Vercel is unavailable and asks before deploying Vercel-integrated channels. Portable Slack setup uses environment credentials and records the required variables in `.env.example`.
16
+ - ad0dfa7: Remote agents can now forward the end user's identity across deployments. `defineRemoteAgent({ forwardPrincipal: true })` sends the dispatching turn's session principal (metadata only — never tokens) on the create-session request, and the receiving deployment opts in with `eveChannel({ trustedForwarders })`, a predicate over the verified transport forwarder. Accepted forwarding replaces the session principal so per-user connections, local subagents, and chained remote hops see the original user; a receiver that refuses the forwarder (or accepts no forwarded principal) rejects with 403 and the dispatch fails instead of silently downgrading to the calling service's identity.
17
+ - ad0dfa7: Remote agent dispatch now ignores an empty `outputSchema` (`{}`) passed by the model on the lowered subagent tool call, matching local subagent dispatch. An empty schema constrains nothing, but forwarding it flipped the remote child into structured-output mode and replaced its text reply with `{}`.
18
+ - 5cf8ae0: Make `eve dev` return the terminal after one Ctrl+C or termination signal. The local server gets a bounded cleanup window before process-group termination, and interrupted sandbox cleanup resumes on the next start. A forced exit (second Ctrl+C or the shutdown backstop) now restores the terminal — raw mode, cursor, bracketed paste — before the process ends.
19
+ - c2079a4: Preserve remote agent base paths when creating sessions and cancelling turns, so same-origin agents mounted below a route prefix no longer receive requests at the wrong endpoint.
20
+
3
21
  ## 0.27.5
4
22
 
5
23
  ### Patch Changes
@@ -0,0 +1,74 @@
1
+ import type { SessionAuthContext } from "#channel/types.js";
2
+ /**
3
+ * Attribute key the receiving deployment stamps onto accepted forwarded
4
+ * principal contexts. Holds the verified transport forwarder's `principalId`,
5
+ * always overwriting any sender-supplied value — a forwarder must not be able
6
+ * to falsify the audit trail. On multi-hop chains the attribute names the
7
+ * most recent hop only.
8
+ */
9
+ export declare const FORWARDED_BY_ATTRIBUTE = "eve:forwarded-by";
10
+ /**
11
+ * Wire shape of the create-session `forwardedPrincipal` body field: the
12
+ * dispatching turn's session principals, asserted by a trusted forwarder.
13
+ * Only principal metadata crosses the wire — never tokens or credentials.
14
+ */
15
+ export interface ForwardedPrincipal {
16
+ readonly current: SessionAuthContext;
17
+ readonly initiator?: SessionAuthContext;
18
+ }
19
+ /**
20
+ * Authorizes which transport-authenticated forwarders may assert a forwarded
21
+ * principal. Receives the *verified* route-auth principal (who is asserting),
22
+ * never the forwarded identity (what is asserted).
23
+ */
24
+ export type TrustedForwarders = (forwarder: SessionAuthContext) => boolean | Promise<boolean>;
25
+ export type ForwardedPrincipalParseResult = {
26
+ readonly forwardedPrincipal: ForwardedPrincipal;
27
+ readonly ok: true;
28
+ } | {
29
+ readonly cause: unknown;
30
+ readonly message: string;
31
+ readonly ok: false;
32
+ };
33
+ /**
34
+ * The create route's effective session principals after the forwarded
35
+ * principal gate: the transport principal untouched when the body carries no
36
+ * assertion, or the stamped forwarded contexts once a trusted forwarder's
37
+ * assertion is accepted.
38
+ */
39
+ export type ResolvedForwardedPrincipal = {
40
+ readonly accepted: false;
41
+ readonly auth: SessionAuthContext;
42
+ } | {
43
+ readonly accepted: true;
44
+ readonly auth: SessionAuthContext;
45
+ readonly initiatorAuth: SessionAuthContext;
46
+ };
47
+ /**
48
+ * Gates the create-session `forwardedPrincipal` body field and resolves the
49
+ * effective session principals. Returns the failure `Response` on rejection:
50
+ * 403 when the channel accepts no forwarded principal or the predicate
51
+ * refuses the forwarder, 400 on a malformed payload, 500 when the authored
52
+ * predicate throws. Accepted contexts are stamped with
53
+ * {@link FORWARDED_BY_ATTRIBUTE} before they are returned, so a custom
54
+ * `onMessage` always sees the transport forwarder on the replaced principal.
55
+ */
56
+ export declare function resolveForwardedPrincipal(input: {
57
+ readonly trustedForwarders: TrustedForwarders | undefined;
58
+ readonly forwarder: SessionAuthContext;
59
+ readonly payload: Record<string, unknown>;
60
+ }): Promise<ResolvedForwardedPrincipal | Response>;
61
+ /**
62
+ * Parses the create-session `forwardedPrincipal` body field against the
63
+ * strict wire schema. Mirrors `parseSessionCallback` for `callback`: strict
64
+ * keys, formatted error strings, and no exceptions.
65
+ */
66
+ export declare function parseForwardedPrincipal(value: unknown): ForwardedPrincipalParseResult;
67
+ /**
68
+ * Returns a copy of `context` with {@link FORWARDED_BY_ATTRIBUTE} set to the
69
+ * verified transport forwarder's `principalId`, overwriting any
70
+ * sender-supplied value. Attributes never affect Connect token-cache keying
71
+ * (`principalKey` reads only issuer + id), so stamping is purely an audit
72
+ * trail.
73
+ */
74
+ export declare function stampForwardedBy(context: SessionAuthContext, forwardedBy: string): SessionAuthContext;
@@ -0,0 +1 @@
1
+ import{createLogger,logError}from"#internal/logging.js";import{z}from"#compiled/zod/index.js";const log=createLogger(`channel.forwarded-principal`),FORWARDED_BY_ATTRIBUTE=`eve:forwarded-by`,attributeValueSchema=z.union([z.string(),z.array(z.string()).readonly()]),forwardedPrincipalContextSchema=z.object({attributes:z.record(z.string(),attributeValueSchema).readonly(),authenticator:z.string().min(1),issuer:z.string().min(1).optional(),principalId:z.string().min(1),principalType:z.string().min(1),subject:z.string().min(1).optional()}).strict(),forwardedPrincipalSchema=z.object({current:forwardedPrincipalContextSchema,initiator:forwardedPrincipalContextSchema.optional()}).strict();async function resolveForwardedPrincipal(e){let n=e.payload.forwardedPrincipal;if(n===void 0)return{accepted:!1,auth:e.forwarder};if(e.trustedForwarders===void 0)return Response.json({error:`This deployment does not accept a forwarded principal.`,ok:!1},{status:403});let r=parseForwardedPrincipal(n);if(!r.ok)return Response.json({error:r.message,ok:!1},{status:400});let i;try{i=await e.trustedForwarders(e.forwarder)}catch(n){let r=logError(log,`trustedForwarders handler failed`,n,{forwarder:e.forwarder.principalId});return Response.json({error:`trustedForwarders handler failed.`,errorId:r,ok:!1},{status:500})}if(!i)return Response.json({error:`Caller is not authorized to assert a forwarded principal.`,ok:!1},{status:403});let a=stampForwardedBy(r.forwardedPrincipal.current,e.forwarder.principalId);return{accepted:!0,auth:a,initiatorAuth:r.forwardedPrincipal.initiator===void 0?a:stampForwardedBy(r.forwardedPrincipal.initiator,e.forwarder.principalId)}}function parseForwardedPrincipal(e){let t=forwardedPrincipalSchema.safeParse(e);if(t.success){let e=toSessionAuthContext(t.data.current);return{forwardedPrincipal:t.data.initiator===void 0?{current:e}:{current:e,initiator:toSessionAuthContext(t.data.initiator)},ok:!0}}return{cause:t.error,message:formatForwardedPrincipalParseError(t.error),ok:!1}}function stampForwardedBy(e,t){return{...e,attributes:{...e.attributes,[FORWARDED_BY_ATTRIBUTE]:t}}}function toSessionAuthContext(e){let t={attributes:e.attributes,authenticator:e.authenticator,principalId:e.principalId,principalType:e.principalType};return e.issuer!==void 0&&(t.issuer=e.issuer),e.subject!==void 0&&(t.subject=e.subject),t}function formatForwardedPrincipalParseError(e){return`Invalid forwardedPrincipal metadata: ${e.issues.map(e=>`${e.path.length===0?`forwardedPrincipal`:`forwardedPrincipal.${e.path.join(`.`)}`}: ${e.message}`).join(`; `)}`}export{FORWARDED_BY_ATTRIBUTE,parseForwardedPrincipal,resolveForwardedPrincipal,stampForwardedBy};
@@ -71,6 +71,13 @@ type BaseSendOptions = {
71
71
  auth: SessionAuthContext | null;
72
72
  callback?: SessionCallback;
73
73
  continuationToken: string;
74
+ /**
75
+ * The original (top-level) caller's auth for a newly started session,
76
+ * becoming `session.auth.initiator`. Defaults to {@link auth} when omitted
77
+ * (root session behavior). Ignored when the send resolves to an existing
78
+ * session, whose initiator never changes after start.
79
+ */
80
+ initiatorAuth?: SessionAuthContext | null;
74
81
  mode?: RunMode;
75
82
  /**
76
83
  * Human-readable title for a newly started workflow session. Defaults to
@@ -1 +1 @@
1
- import{createSession}from"#channel/session.js";import{isRuntimeNoActiveSessionError}from"#execution/runtime-errors.js";import{serializeUrlFilePart}from"#internal/attachments/url-refs.js";function createSendFn(n,r,i,a={}){return async(o,s)=>{let c=s.auth,l=s.callback,u=s.mode??`conversation`,d=s.state,f=s.title,p=s.continuationToken,m=`${i}:${p}`,{message:h,inputResponses:g,context:_,outputSchema:v}=normalizeSendInput(o),y=serializeUrlFilePartsInMessage(h);try{let t={auth:c,continuationToken:m,requestId:a.requestId,payload:{inputResponses:g,message:y,context:_,outputSchema:v}},{sessionId:r}=await n.deliver(t);return createSession(r,p,n)}catch(e){if(!isRuntimeNoActiveSessionError(e))throw e}if(g&&g.length>0)throw Error(`Cannot deliver inputResponses — the target session was not found via continuation token.`);let b={adapter:d?{...r,state:{...r.state,...d}}:r,auth:c,capabilities:u===`conversation`?{requestInput:!0}:void 0,channelName:i,callback:l,continuationToken:m,input:{message:y??``,context:_,outputSchema:v},mode:u,requestId:a.requestId,title:f};return createSession((await n.run(b)).sessionId,p,n)}}function serializeUrlFilePartsInMessage(e){if(e===void 0||typeof e==`string`)return e;let t=!1,r=e.map(e=>e.type===`file`&&e.data instanceof URL&&e.data.protocol!==`data:`?(t=!0,{...e,data:serializeUrlFilePart(e.data)}):e);return t?r:e}function normalizeSendInput(e){return typeof e==`string`||Array.isArray(e)?{message:e}:e}export{createSendFn};
1
+ import{createSession}from"#channel/session.js";import{isRuntimeNoActiveSessionError}from"#execution/runtime-errors.js";import{serializeUrlFilePart}from"#internal/attachments/url-refs.js";function createSendFn(n,r,i,a={}){return async(o,s)=>{let c=s.auth,l=s.initiatorAuth,u=s.callback,d=s.mode??`conversation`,f=s.state,p=s.title,m=s.continuationToken,h=`${i}:${m}`,{message:g,inputResponses:_,context:v,outputSchema:y}=normalizeSendInput(o),b=serializeUrlFilePartsInMessage(g);try{let t={auth:c,continuationToken:h,requestId:a.requestId,payload:{inputResponses:_,message:b,context:v,outputSchema:y}},{sessionId:r}=await n.deliver(t);return createSession(r,m,n)}catch(e){if(!isRuntimeNoActiveSessionError(e))throw e}if(_&&_.length>0)throw Error(`Cannot deliver inputResponses — the target session was not found via continuation token.`);let x={adapter:f?{...r,state:{...r.state,...f}}:r,auth:c,capabilities:d===`conversation`?{requestInput:!0}:void 0,channelName:i,callback:u,continuationToken:h,input:{message:b??``,context:v,outputSchema:y},mode:d,requestId:a.requestId,title:p};return l!==void 0&&(x.initiatorAuth=l),createSession((await n.run(x)).sessionId,m,n)}}function serializeUrlFilePartsInMessage(e){if(e===void 0||typeof e==`string`)return e;let t=!1,r=e.map(e=>e.type===`file`&&e.data instanceof URL&&e.data.protocol!==`data:`?(t=!0,{...e,data:serializeUrlFilePart(e.data)}):e);return t?r:e}function normalizeSendInput(e){return typeof e==`string`||Array.isArray(e)?{message:e}:e}export{createSendFn};
@@ -30,6 +30,11 @@ export interface Session {
30
30
  getEventStream(options?: {
31
31
  startIndex?: number;
32
32
  }): Promise<ReadableStream<HandleMessageStreamEvent>>;
33
+ /**
34
+ * Resolves the durable tail of the event stream: the zero-based index of
35
+ * the last recorded event, or `-1` before the first.
36
+ */
37
+ getStreamTailIndex(): Promise<number>;
33
38
  }
34
39
  /**
35
40
  * Live handle to the current session, exposed on `ctx.session` to
@@ -1 +1 @@
1
- import{AuthKey,ContinuationTokenKey,InitiatorAuthKey,SessionIdKey}from"#context/keys.js";function createSession(e,t,n){return{id:e,continuationToken:t,async cancel(t){return n.cancelTurn({sessionId:e,turnId:t?.turnId})},async getEventStream(t){return n.getEventStream(e,t)}}}function createGetSessionFn(e){return t=>createSession(t,``,e)}function buildSessionHandle(i){return{get id(){return i.get(SessionIdKey)??``},get continuationToken(){return i.get(ContinuationTokenKey)??``},get auth(){return{current:i.get(AuthKey)??null,initiator:i.get(InitiatorAuthKey)??null}},setContinuationToken(e){let n=i.get(ContinuationTokenKey)??``,r=namespaceContinuationToken(n,e);n!==r&&i.set(ContinuationTokenKey,r)}}}function namespaceContinuationToken(e,t){let n=e.indexOf(`:`);if(n<=0)throw Error(`Cannot set session continuation token without an existing namespaced continuation token. Start the session with a placeholder continuationToken.`);return`${e.slice(0,n+1)}${t}`}export{buildSessionHandle,createGetSessionFn,createSession};
1
+ import{AuthKey,ContinuationTokenKey,InitiatorAuthKey,SessionIdKey}from"#context/keys.js";function createSession(e,t,n){return{id:e,continuationToken:t,async cancel(t){return n.cancelTurn({sessionId:e,turnId:t?.turnId})},async getEventStream(t){return n.getEventStream(e,t)},async getStreamTailIndex(){return n.getStreamTailIndex(e)}}}function createGetSessionFn(e){return t=>createSession(t,``,e)}function buildSessionHandle(i){return{get id(){return i.get(SessionIdKey)??``},get continuationToken(){return i.get(ContinuationTokenKey)??``},get auth(){return{current:i.get(AuthKey)??null,initiator:i.get(InitiatorAuthKey)??null}},setContinuationToken(e){let n=i.get(ContinuationTokenKey)??``,r=namespaceContinuationToken(n,e);n!==r&&i.set(ContinuationTokenKey,r)}}}function namespaceContinuationToken(e,t){let n=e.indexOf(`:`);if(n<=0)throw Error(`Cannot set session continuation token without an existing namespaced continuation token. Start the session with a placeholder continuationToken.`);return`${e.slice(0,n+1)}${t}`}export{buildSessionHandle,createGetSessionFn,createSession};
@@ -368,6 +368,13 @@ export interface Runtime {
368
368
  * parameter unchanged.
369
369
  */
370
370
  getEventStream(sessionId: string, options?: GetEventStreamOptions): Promise<ReadableStream<HandleMessageStreamEvent>>;
371
+ /**
372
+ * Resolves the durable tail of a session's event stream: the zero-based
373
+ * index of the last recorded event, or `-1` before the first. Callers use
374
+ * it to bound a read at the tail they observed instead of following the
375
+ * live stream.
376
+ */
377
+ getStreamTailIndex(sessionId: string): Promise<number>;
371
378
  }
372
379
  /**
373
380
  * Options accepted by {@link Runtime.getEventStream}.
@@ -299,6 +299,7 @@ function safeJsonStringify(value) {
299
299
  //#endregion
300
300
  //#region src/protocol/message.ts
301
301
  const EVE_SESSION_ID_HEADER = "x-eve-session-id";
302
+ const EVE_STREAM_TAIL_INDEX_HEADER = "x-eve-stream-tail-index";
302
303
  const textEncoder = new TextEncoder();
303
304
  function isCurrentTurnBoundaryEvent(event) {
304
305
  return event.type === "session.completed" || event.type === "session.failed" || event.type === "session.waiting";
@@ -531,32 +532,47 @@ function resolveStreamReconnectPolicy(policy) {
531
532
  };
532
533
  }
533
534
  async function* followStreamIterable(input) {
535
+ if (input.follow === false && input.startIndex < 0) throw new Error("stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.");
534
536
  const retryPolicy = resolveStreamReconnectPolicy(input.streamReconnectPolicy);
535
537
  const idleRetryPolicy = retryPolicy.streamIdleReconnectPolicy;
536
538
  let startIndex = input.startIndex;
537
539
  let reconnectDelayMs = idleRetryPolicy.baseDelayMs;
538
540
  let idleReconnects = 0;
539
541
  let initialConnection = true;
542
+ let tailIndex;
540
543
  while (true) {
541
- let body;
544
+ let connection;
542
545
  try {
543
- body = await openStreamBody({
546
+ connection = await openStreamBody({
544
547
  ...input,
545
548
  retryPolicy,
546
- startIndex
549
+ startIndex,
550
+ requestTailIndex: input.follow === false && tailIndex === void 0
547
551
  });
548
552
  } catch (error) {
549
553
  if (input.signal?.aborted) return;
550
554
  throw error;
551
555
  }
556
+ if (input.follow === false && tailIndex === void 0) {
557
+ tailIndex = connection.tailIndex;
558
+ if (tailIndex === void 0) {
559
+ await connection.body.cancel().catch(() => {});
560
+ throw new Error(`stream({ follow: false }) requires the server to report the ${EVE_STREAM_TAIL_INDEX_HEADER} header. The agent may be running an older eve version.`);
561
+ }
562
+ }
563
+ if (tailIndex !== void 0 && startIndex > tailIndex) {
564
+ await connection.body.cancel().catch(() => {});
565
+ return;
566
+ }
552
567
  let deliveredEvent = false;
553
568
  try {
554
- for await (const event of readNdjsonStream(body)) {
569
+ for await (const event of readNdjsonStream(connection.body)) {
555
570
  startIndex += 1;
556
571
  deliveredEvent = true;
557
572
  reconnectDelayMs = idleRetryPolicy.baseDelayMs;
558
573
  idleReconnects = 0;
559
574
  yield event;
575
+ if (tailIndex !== void 0 && startIndex > tailIndex) return;
560
576
  }
561
577
  } catch (error) {
562
578
  if (!isStreamDisconnectError(error)) throw error;
@@ -576,8 +592,11 @@ async function openStreamBody(input) {
576
592
  let lastBody;
577
593
  let lastHeaders;
578
594
  let retryDelayMs = openRetryPolicy.baseDelayMs;
595
+ const searchParams = {};
596
+ if (input.startIndex !== 0) searchParams.startIndex = String(input.startIndex);
597
+ if (input.requestTailIndex === true) searchParams.includeTailIndex = "1";
579
598
  for (let attempt = 0; attempt < openRetryPolicy.maxAttempts; attempt += 1) {
580
- const url = createClientUrl(input.host, createEveMessageStreamRoutePath(input.sessionId), input.startIndex !== 0 ? { startIndex: String(input.startIndex) } : void 0);
599
+ const url = createClientUrl(input.host, createEveMessageStreamRoutePath(input.sessionId), Object.keys(searchParams).length > 0 ? searchParams : void 0);
581
600
  const headers = await input.resolveHeaders();
582
601
  let response;
583
602
  try {
@@ -594,7 +613,10 @@ async function openStreamBody(input) {
594
613
  }
595
614
  if (response.ok) {
596
615
  if (!response.body) throw new ClientError(response.status, "Response body is null.", response.headers);
597
- return response.body;
616
+ return {
617
+ body: response.body,
618
+ tailIndex: parseTailIndexHeader(response.headers)
619
+ };
598
620
  }
599
621
  lastStatus = response.status;
600
622
  lastBody = await response.text();
@@ -607,6 +629,12 @@ async function openStreamBody(input) {
607
629
  }
608
630
  throw new ClientError(lastStatus ?? 0, lastBody ?? "Failed to open message stream.", lastHeaders);
609
631
  }
632
+ function parseTailIndexHeader(headers) {
633
+ const raw = headers.get(EVE_STREAM_TAIL_INDEX_HEADER);
634
+ if (raw === null || !/^-?\d+$/.test(raw)) return;
635
+ const parsed = Number(raw);
636
+ return Number.isSafeInteger(parsed) ? parsed : void 0;
637
+ }
610
638
  async function sleep$1(ms, signal) {
611
639
  if (signal?.aborted) return;
612
640
  await new Promise((resolve) => {
@@ -784,6 +812,7 @@ var ClientSession = class {
784
812
  stream(options) {
785
813
  const sessionId = this.#state.sessionId;
786
814
  if (!sessionId) throw new Error("Session has no session ID. Send a message first.");
815
+ if (options?.follow === false && (options.startIndex ?? this.#state.streamIndex) < 0) throw new Error("stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.");
787
816
  return this.#streamAndAdvance(sessionId, options);
788
817
  }
789
818
  async #postTurn(input, session) {
@@ -845,6 +874,7 @@ var ClientSession = class {
845
874
  const events = [];
846
875
  try {
847
876
  for await (const event of followStreamIterable({
877
+ follow: options?.follow,
848
878
  host: this.#context.host,
849
879
  resolveHeaders: () => this.#context.resolveHeaders(),
850
880
  redirect: this.#context.redirect,
@@ -996,8 +1026,8 @@ var Client = class {
996
1026
  const headers = new Headers();
997
1027
  const [baseHeaders, authHeaders] = await Promise.all([resolveHeadersValue(this.#headers), this.#resolveAuthHeaders()]);
998
1028
  for (const [key, value] of Object.entries(baseHeaders)) headers.set(key, value);
999
- if (perRequest) for (const [key, value] of Object.entries(perRequest)) headers.set(key, value);
1000
1029
  for (const [key, value] of Object.entries(authHeaders)) headers.set(key, value);
1030
+ if (perRequest) for (const [key, value] of Object.entries(perRequest)) headers.set(key, value);
1001
1031
  return headers;
1002
1032
  }
1003
1033
  async #resolveAuthHeaders() {
@@ -299,6 +299,7 @@ function safeJsonStringify(value) {
299
299
  //#endregion
300
300
  //#region src/protocol/message.ts
301
301
  const EVE_SESSION_ID_HEADER = "x-eve-session-id";
302
+ const EVE_STREAM_TAIL_INDEX_HEADER = "x-eve-stream-tail-index";
302
303
  const textEncoder = new TextEncoder();
303
304
  function isCurrentTurnBoundaryEvent(event) {
304
305
  return event.type === "session.completed" || event.type === "session.failed" || event.type === "session.waiting";
@@ -531,32 +532,47 @@ function resolveStreamReconnectPolicy(policy) {
531
532
  };
532
533
  }
533
534
  async function* followStreamIterable(input) {
535
+ if (input.follow === false && input.startIndex < 0) throw new Error("stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.");
534
536
  const retryPolicy = resolveStreamReconnectPolicy(input.streamReconnectPolicy);
535
537
  const idleRetryPolicy = retryPolicy.streamIdleReconnectPolicy;
536
538
  let startIndex = input.startIndex;
537
539
  let reconnectDelayMs = idleRetryPolicy.baseDelayMs;
538
540
  let idleReconnects = 0;
539
541
  let initialConnection = true;
542
+ let tailIndex;
540
543
  while (true) {
541
- let body;
544
+ let connection;
542
545
  try {
543
- body = await openStreamBody({
546
+ connection = await openStreamBody({
544
547
  ...input,
545
548
  retryPolicy,
546
- startIndex
549
+ startIndex,
550
+ requestTailIndex: input.follow === false && tailIndex === void 0
547
551
  });
548
552
  } catch (error) {
549
553
  if (input.signal?.aborted) return;
550
554
  throw error;
551
555
  }
556
+ if (input.follow === false && tailIndex === void 0) {
557
+ tailIndex = connection.tailIndex;
558
+ if (tailIndex === void 0) {
559
+ await connection.body.cancel().catch(() => {});
560
+ throw new Error(`stream({ follow: false }) requires the server to report the ${EVE_STREAM_TAIL_INDEX_HEADER} header. The agent may be running an older eve version.`);
561
+ }
562
+ }
563
+ if (tailIndex !== void 0 && startIndex > tailIndex) {
564
+ await connection.body.cancel().catch(() => {});
565
+ return;
566
+ }
552
567
  let deliveredEvent = false;
553
568
  try {
554
- for await (const event of readNdjsonStream(body)) {
569
+ for await (const event of readNdjsonStream(connection.body)) {
555
570
  startIndex += 1;
556
571
  deliveredEvent = true;
557
572
  reconnectDelayMs = idleRetryPolicy.baseDelayMs;
558
573
  idleReconnects = 0;
559
574
  yield event;
575
+ if (tailIndex !== void 0 && startIndex > tailIndex) return;
560
576
  }
561
577
  } catch (error) {
562
578
  if (!isStreamDisconnectError(error)) throw error;
@@ -576,8 +592,11 @@ async function openStreamBody(input) {
576
592
  let lastBody;
577
593
  let lastHeaders;
578
594
  let retryDelayMs = openRetryPolicy.baseDelayMs;
595
+ const searchParams = {};
596
+ if (input.startIndex !== 0) searchParams.startIndex = String(input.startIndex);
597
+ if (input.requestTailIndex === true) searchParams.includeTailIndex = "1";
579
598
  for (let attempt = 0; attempt < openRetryPolicy.maxAttempts; attempt += 1) {
580
- const url = createClientUrl(input.host, createEveMessageStreamRoutePath(input.sessionId), input.startIndex !== 0 ? { startIndex: String(input.startIndex) } : void 0);
599
+ const url = createClientUrl(input.host, createEveMessageStreamRoutePath(input.sessionId), Object.keys(searchParams).length > 0 ? searchParams : void 0);
581
600
  const headers = await input.resolveHeaders();
582
601
  let response;
583
602
  try {
@@ -594,7 +613,10 @@ async function openStreamBody(input) {
594
613
  }
595
614
  if (response.ok) {
596
615
  if (!response.body) throw new ClientError(response.status, "Response body is null.", response.headers);
597
- return response.body;
616
+ return {
617
+ body: response.body,
618
+ tailIndex: parseTailIndexHeader(response.headers)
619
+ };
598
620
  }
599
621
  lastStatus = response.status;
600
622
  lastBody = await response.text();
@@ -607,6 +629,12 @@ async function openStreamBody(input) {
607
629
  }
608
630
  throw new ClientError(lastStatus ?? 0, lastBody ?? "Failed to open message stream.", lastHeaders);
609
631
  }
632
+ function parseTailIndexHeader(headers) {
633
+ const raw = headers.get(EVE_STREAM_TAIL_INDEX_HEADER);
634
+ if (raw === null || !/^-?\d+$/.test(raw)) return;
635
+ const parsed = Number(raw);
636
+ return Number.isSafeInteger(parsed) ? parsed : void 0;
637
+ }
610
638
  async function sleep$1(ms, signal) {
611
639
  if (signal?.aborted) return;
612
640
  await new Promise((resolve) => {
@@ -784,6 +812,7 @@ var ClientSession = class {
784
812
  stream(options) {
785
813
  const sessionId = this.#state.sessionId;
786
814
  if (!sessionId) throw new Error("Session has no session ID. Send a message first.");
815
+ if (options?.follow === false && (options.startIndex ?? this.#state.streamIndex) < 0) throw new Error("stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.");
787
816
  return this.#streamAndAdvance(sessionId, options);
788
817
  }
789
818
  async #postTurn(input, session) {
@@ -845,6 +874,7 @@ var ClientSession = class {
845
874
  const events = [];
846
875
  try {
847
876
  for await (const event of followStreamIterable({
877
+ follow: options?.follow,
848
878
  host: this.#context.host,
849
879
  resolveHeaders: () => this.#context.resolveHeaders(),
850
880
  redirect: this.#context.redirect,
@@ -996,8 +1026,8 @@ var Client = class {
996
1026
  const headers = new Headers();
997
1027
  const [baseHeaders, authHeaders] = await Promise.all([resolveHeadersValue(this.#headers), this.#resolveAuthHeaders()]);
998
1028
  for (const [key, value] of Object.entries(baseHeaders)) headers.set(key, value);
999
- if (perRequest) for (const [key, value] of Object.entries(perRequest)) headers.set(key, value);
1000
1029
  for (const [key, value] of Object.entries(authHeaders)) headers.set(key, value);
1030
+ if (perRequest) for (const [key, value] of Object.entries(perRequest)) headers.set(key, value);
1001
1031
  return headers;
1002
1032
  }
1003
1033
  async #resolveAuthHeaders() {
@@ -1,7 +1,8 @@
1
- import { type AddChannelsDeps } from "#setup/boxes/add-channels.js";
2
- import { type DeployProjectDeps } from "#setup/boxes/deploy-project.js";
1
+ import type { AddChannelsDeps } from "#setup/boxes/add-channels.js";
2
+ import type { DeployProjectDeps } from "#setup/boxes/deploy-project.js";
3
3
  import { type DeploymentInfo } from "#setup/project-resolution.js";
4
4
  import { type Prompter } from "#setup/prompter.js";
5
+ import { type VercelAuthStatus } from "#setup/vercel-project.js";
5
6
  export interface CliLogger {
6
7
  error(message: string): void;
7
8
  log(message: string): void;
@@ -14,6 +15,8 @@ export interface AddChannelCommandOptions {
14
15
  export interface ChannelsAddDependencies {
15
16
  createPrompter?: () => Prompter;
16
17
  detectDeployment(projectPath: string): Promise<DeploymentInfo>;
18
+ /** Read-only Vercel session probe. Optional only for legacy test seams. */
19
+ getVercelAuthStatus(projectPath: string): Promise<VercelAuthStatus>;
17
20
  /** Test seam into the add-channels box's scaffold/Connect/Vercel effects. */
18
21
  addChannelsDeps?: AddChannelsDeps;
19
22
  /** Test seam into the deploy box's subprocess effects. */
@@ -1 +1 @@
1
- import{assertCanAddSelectedChannels,inspectExistingChannelRegistrations}from"./channel-add-conflicts.js";import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject,listAuthoredChannels}from"#setup/scaffold/index.js";import{interactiveAsker}from"#setup/ask.js";import{addChannels}from"#setup/boxes/add-channels.js";import{deployProject}from"#setup/boxes/deploy-project.js";import{selectChannels}from"#setup/boxes/select-channels.js";import{detectDeployment,projectResolutionFromDeployment}from"#setup/project-resolution.js";import{createPrompter}from"#setup/prompter.js";import{runInteractive}from"#setup/runner.js";import{createDefaultSetupState,snapshotSetupState}from"#setup/state.js";const KNOWN_CHANNEL_KINDS=[`slack`,`web`];function isChannelKind(e){return KNOWN_CHANNEL_KINDS.includes(e)}function parseChannelKind(e){if(!isChannelKind(e))throw Error(`Unknown channel kind "${e}". Known: ${KNOWN_CHANNEL_KINDS.join(`, `)}.`);return e}const defaultChannelsAddDependencies={detectDeployment};async function runAddChannelsFlow(n,r,i,s){if(r===void 0&&(i.yes||!process.stdin.isTTY||!process.stdout.isTTY))throw Error(`Pass a channel kind: \`eve channels add <${KNOWN_CHANNEL_KINDS.join(`|`)}>\`.`);let c=s.createPrompter?.()??createPrompter();c.intro(`Add channels to your eve agent`),c.log.message(`Checking the current Vercel project...`);let l={...createDefaultSetupState(),project:projectResolutionFromDeployment(await s.detectDeployment(n)),projectPath:{kind:`resolved`,inPlace:!0,path:n}},u;function inspectRegistrations(){return u===void 0&&(c.log.message(`Inspecting existing channel registrations...`),u=inspectExistingChannelRegistrations(n)),u}let d=r===void 0?(await inspectRegistrations()).disabledChannelReasons:void 0,f=await runInteractive([selectChannels({asker:interactiveAsker(c),variant:`channels-add`,presetChannels:r===void 0?void 0:[r],disabledChannelReasons:d,validateSelection:async t=>{!t.includes(`web`)&&!t.includes(`slack`)||assertCanAddSelectedChannels(t,await inspectRegistrations())}}),addChannels({asker:interactiveAsker(c),prompter:c,presetCreateSlackbot:i.yes?!0:void 0,force:i.force,configureVercelServices:!0,ensureLinkedProject:`interactive-vercel-link`,deps:s.addChannelsDeps}),deployProject({prompter:c,ensureLinkedProject:`interactive-vercel-link`,deps:s.deployProjectDeps})],l,{write:e=>c.log.message(e)},{snapshot:snapshotSetupState});f.kind!==`cancelled`&&c.outro(f.state.channels.length===0?`No channels added.`:`Channels added.`)}async function runChannelsAddCommand(e,t,i,a=defaultChannelsAddDependencies){if(!await isEveProject(t)){e.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{await runAddChannelsFlow(t,i.kind===void 0?void 0:parseChannelKind(i.kind),i.options,a)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}async function runChannelsListCommand(e,t,a){if(!await isEveProject(t)){e.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}let o=await listAuthoredChannels(t);if(a.json){e.log(JSON.stringify({channels:o},null,2));return}if(o.length===0){e.log("No channels defined. Run `eve channels add` to add one.");return}for(let t of o)e.log(t)}export{runChannelsAddCommand,runChannelsListCommand};
1
+ import{assertCanAddSelectedChannels,inspectExistingChannelRegistrations}from"./channel-add-conflicts.js";import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject,listAuthoredChannels}from"#setup/scaffold/index.js";import{interactiveAsker}from"#setup/ask.js";import{channelSetupEnvironment,describeChannelSetupEnvironment}from"#setup/channel-setup-environment.js";import{deployChannelSetup}from"#setup/channel-setup-deployment.js";import{channelSetupIntegration,createChannelSetupUi}from"#setup/channel-setup-integrations.js";import{selectChannels}from"#setup/boxes/select-channels.js";import{detectDeployment,projectResolutionFromDeployment}from"#setup/project-resolution.js";import{createPrompter}from"#setup/prompter.js";import{runInteractive}from"#setup/runner.js";import{createDefaultSetupState,snapshotSetupState}from"#setup/state.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";const KNOWN_CHANNEL_KINDS=[`slack`,`web`];function isChannelKind(e){return KNOWN_CHANNEL_KINDS.includes(e)}function parseChannelKind(e){if(!isChannelKind(e))throw Error(`Unknown channel kind "${e}". Known: ${KNOWN_CHANNEL_KINDS.join(`, `)}.`);return e}const defaultChannelsAddDependencies={detectDeployment,getVercelAuthStatus};async function runAddChannelsFlow(n,r,i,s){if(r===void 0&&(i.yes||!process.stdin.isTTY||!process.stdout.isTTY))throw Error(`Pass a channel kind: \`eve channels add <${KNOWN_CHANNEL_KINDS.join(`|`)}>\`.`);let c=s.createPrompter?.()??createPrompter();c.intro(`Add channels to your eve agent`),c.log.message(`Checking Vercel setup...`);let l=await s.detectDeployment(n),u=channelSetupEnvironment(await s.getVercelAuthStatus(n),projectResolutionFromDeployment(l));c.log.info(describeChannelSetupEnvironment(u));let d={...createDefaultSetupState(),project:projectResolutionFromDeployment(l),projectPath:{kind:`resolved`,inPlace:!0,path:n}},f;function inspectRegistrations(){return f===void 0&&(c.log.message(`Inspecting existing channel registrations...`),f=inspectExistingChannelRegistrations(n)),f}let p=r===void 0?(await inspectRegistrations()).disabledChannelReasons:void 0,m=await runInteractive([selectChannels({asker:interactiveAsker(c),variant:`channels-add`,presetChannels:r===void 0?void 0:[r],disabledChannelReasons:p,validateSelection:async t=>{!t.includes(`web`)&&!t.includes(`slack`)||assertCanAddSelectedChannels(t,await inspectRegistrations())}})],d,{write:e=>c.log.message(e)},{snapshot:snapshotSetupState});if(m.kind===`cancelled`)return;let h=m.state,g=createChannelSetupUi({asker:interactiveAsker(c),prompter:c});for(let e of m.state.channelSelection){let t=await channelSetupIntegration(e).setup({environment:u,state:{...h,channelSelection:[e]},ui:g,force:i.force,presetCreateSlackbot:i.yes?!0:void 0,presetPortableCredentials:i.yes===!0?!0:void 0,deps:s.addChannelsDeps});if(t.kind===`cancelled`)return;h=t.state}(h.slackbotAttached||u.vercel.kind===`available`&&h.channels.includes(`web`))&&(h=await deployChannelSetup({state:h,ui:g,presetDeploy:i.yes===!0?!0:!process.stdin.isTTY||!process.stdout.isTTY?!1:void 0,deps:s.deployProjectDeps})),c.outro(h.channels.length===0?`No channels added.`:`Channels added.`)}async function runChannelsAddCommand(e,t,i,a=defaultChannelsAddDependencies){if(!await isEveProject(t)){e.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{await runAddChannelsFlow(t,i.kind===void 0?void 0:parseChannelKind(i.kind),i.options,a)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}async function runChannelsListCommand(e,t,a){if(!await isEveProject(t)){e.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}let o=await listAuthoredChannels(t);if(a.json){e.log(JSON.stringify({channels:o},null,2));return}if(o.length===0){e.log("No channels defined. Run `eve channels add` to add one.");return}for(let t of o)e.log(t)}export{runChannelsAddCommand,runChannelsListCommand};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{createDevelopmentServer}from"#internal/nitro/host.js";import{getDevelopmentSandboxRunId}from"#execution/sandbox/development-run.js";import{reconcileCleanupIntents,recordCleanupIntent}from"#cli/dev/local-server-cleanup.js";const options=JSON.parse(process.argv[2]??`{}`),server=createDevelopmentServer(process.cwd(),{...options,onBootProgress:e=>send({type:`progress`,event:e})});let stopping=!1,removeCleanupIntent;reconcileCleanupIntents(process.cwd()).catch(()=>void 0);const send=e=>{try{process.connected&&process.send?.(e,()=>{})}catch{}},stop=()=>{if(stopping)return;stopping=!0,console.log=console.warn=console.error=()=>{},process.stdout.on(`error`,()=>{}),process.stderr.on(`error`,()=>{});let e=server.close();process.connected&&process.disconnect?.(),e.then(async()=>{await intentReady.catch(()=>void 0),await removeCleanupIntent?.().catch(()=>void 0),process.exit(0)},()=>process.exit(1))};process.on(`message`,e=>{e.type===`shutdown`&&stop()}),process.once(`disconnect`,stop),process.once(`SIGINT`,stop),process.once(`SIGTERM`,stop);const intentReady=server.start().then(async e=>{let n=getDevelopmentSandboxRunId();e.kind===`started`&&n!==void 0&&(removeCleanupIntent=await recordCleanupIntent(process.cwd(),{ownerPid:process.pid,runId:n})),send({type:`started`,handle:e}),e.kind===`existing`&&process.connected&&process.disconnect?.()},e=>{let t=e instanceof Error?e:Error(String(e));send({type:`failed`,message:t.message,stack:t.stack}),process.exitCode=1,process.connected&&process.disconnect?.()});export{};
@@ -0,0 +1,5 @@
1
+ export declare function recordCleanupIntent(appRoot: string, input: {
2
+ readonly ownerPid: number;
3
+ readonly runId: string;
4
+ }): Promise<() => Promise<void>>;
5
+ export declare function reconcileCleanupIntents(appRoot: string): Promise<void>;
@@ -0,0 +1 @@
1
+ import{join}from"node:path";import{mkdir,readFile,readdir,rm,writeFile}from"node:fs/promises";import{stopDevelopmentSandboxResources}from"#execution/sandbox/bindings/local.js";const PREFIX=`dev-cleanup-intent.`,SUFFIX=`.json`;async function recordCleanupIntent(n,r){let a=join(n,`.eve`),c=join(a,`${PREFIX}${r.runId}${SUFFIX}`);return await mkdir(a,{recursive:!0}),await writeFile(c,`${JSON.stringify(r)}\n`,`utf8`),async()=>await rm(c,{force:!0})}async function reconcileCleanupIntents(t){let i=join(t,`.eve`),c;try{c=await readdir(i)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}await Promise.all(c.filter(e=>e.startsWith(PREFIX)&&e.endsWith(SUFFIX)).map(async r=>{try{let o=join(i,r),s=JSON.parse(await readFile(o,`utf8`));if(typeof s.runId!=`string`||typeof s.ownerPid!=`number`||!Number.isInteger(s.ownerPid)||s.ownerPid<=0||isProcessAlive(s.ownerPid))return;await stopDevelopmentSandboxResources({appRoot:t,devRunId:s.runId}),await rm(o,{force:!0})}catch{}}))}function isProcessAlive(e){try{return process.kill(e,0),!0}catch(e){return e instanceof Error&&`code`in e&&e.code===`EPERM`}}export{reconcileCleanupIntents,recordCleanupIntent};
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The `eve dev` server child: forked `detached` (its own process group) and
3
+ * bound to the CLI's lifetime through the IPC channel, never through the OS.
4
+ *
5
+ * Why the child is not bound to the parent at the OS level (shared process
6
+ * group, inherited terminal signals):
7
+ *
8
+ * - The TUI puts stdin in raw mode, which disables ISIG: Ctrl+C never becomes
9
+ * a terminal-generated SIGINT, so same-group signal delivery does nothing in
10
+ * the mode where Ctrl+C matters most.
11
+ * - In headless mode, same-group delivery would signal parent and child
12
+ * simultaneously, racing the parent's graceful IPC shutdown against the
13
+ * child's own signal handler.
14
+ * - macOS has no parent-death signal. IPC `disconnect` is the portable
15
+ * equivalent: the child self-stops whenever this process exits, for any
16
+ * reason including SIGKILL (see local-server-child.ts).
17
+ *
18
+ * `detached` makes the child a process-group leader, so close() can escalate
19
+ * to a group-wide SIGTERM/SIGKILL that reaps the entire server tree. Sandbox
20
+ * resources leaked by a crash are reconciled by the cleanup-intent janitor on
21
+ * the next run (see local-server-cleanup.ts).
22
+ */
23
+ import type { DevelopmentServer, DevelopmentServerOptions } from "#internal/nitro/host/types.js";
24
+ /**
25
+ * Worst-case close() duration. Must stay below the forced-exit backstop the
26
+ * dev command arms on its lifecycle (FORCED_EXIT_BACKSTOP_MS in
27
+ * `#cli/shutdown.js`), so a graceful close always beats the backstop and
28
+ * `eve dev` exits 0 after Ctrl+C. Enforced by local-server-process.test.ts.
29
+ */
30
+ export declare const DEV_SERVER_CLOSE_BUDGET_MS: number;
31
+ export interface DevelopmentServerProcess extends DevelopmentServer {
32
+ wait(): Promise<void>;
33
+ }
34
+ /** Runs the CLI-owned local server outside the foreground TUI process. */
35
+ export declare function createDevelopmentServer(appRoot: string, options?: DevelopmentServerOptions): DevelopmentServerProcess;
@@ -0,0 +1 @@
1
+ import{fork}from"node:child_process";import{fileURLToPath}from"node:url";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{EVE_DEV_ENV_FLAG}from"#internal/application/optional-package-install.js";const childPath=fileURLToPath(new URL(`./local-server-child.js`,import.meta.url)),DEV_SERVER_CLOSE_BUDGET_MS=800;function createDevelopmentServer(t,i={}){let a,o,s=!1,c=Promise.withResolvers(),l=Promise.withResolvers();c.promise.catch(()=>void 0);let release=()=>{let e=a;e!==void 0&&(a=void 0,e.stdout?.destroy(),e.stderr?.destroy(),e.connected&&e.disconnect(),e.unref())};return{start:()=>{if(a!==void 0)throw Error(`DevelopmentServer.start() was already called.`);let o={...process.env};loadDevelopmentEnvironmentFiles(t),process.env[EVE_DEV_ENV_FLAG]??=`1`;let u=fork(childPath,[JSON.stringify({existing:i.existing,host:i.host,port:i.port})],{cwd:t,detached:!0,env:{...o,[EVE_DEV_ENV_FLAG]:`1`},stdio:[`ignore`,`pipe`,`pipe`,`ipc`]});return a=u,u.stdout?.on(`data`,e=>process.stdout.write(e)),u.stderr?.on(`data`,e=>process.stderr.write(e)),new Promise((e,t)=>{let n=!1;u.once(`error`,t),u.once(`exit`,(e,r)=>{l.resolve(),release(),n?s?c.resolve():c.reject(Error(`Development server exited unexpectedly (${String(e)}, ${String(r)}).`)):t(Error(`Development server exited during startup (${String(e)}, ${String(r)}).`))}),u.on(`message`,r=>{if(r.type===`progress`&&i.onBootProgress?.(r.event),r.type===`started`&&!n&&(n=!0,e(r.handle),r.handle.kind===`existing`&&(s=!0,release())),r.type===`failed`&&!n){n=!0;let e=Error(r.message);r.stack!==void 0&&(e.stack=r.stack),t(e)}})})},close(){if(o!==void 0)return o;let e=a;return e===void 0?Promise.resolve():(s=!0,o=(async()=>{e.connected&&e.send({type:`shutdown`}),!await settlesWithin(l.promise,550)&&(signalProcessGroup(e,`SIGTERM`),!await settlesWithin(l.promise,150)&&(signalProcessGroup(e,`SIGKILL`),await settlesWithin(l.promise,100),release()))})(),o)},wait:()=>c.promise}}async function settlesWithin(e,t){let n;try{return await Promise.race([e.then(()=>!0),new Promise(e=>{n=setTimeout(()=>e(!1),t)})])}finally{n!==void 0&&clearTimeout(n)}}function signalProcessGroup(e,t){if(process.platform!==`win32`&&e.pid!==void 0)try{process.kill(-e.pid,t);return}catch{}e.kill(t)}export{DEV_SERVER_CLOSE_BUDGET_MS,createDevelopmentServer};
@@ -1 +1 @@
1
- import{__toESM}from"../../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{applyVercelTrustedSourceAccess,prepareVercelTrustedSourceAccess}from"./vercel-trusted-sources.js";import{appendRemoteAuthMutationSummary}from"./remote-auth-result.js";import{WizardCancelledError}from"#setup/step.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{formatDevelopmentOidcTokenFailure}from"#services/dev-client/vercel-auth-error.js";import{runLoginFlow}from"#setup/flows/login.js";import{pickTeam}from"#setup/vercel-project.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";var import_picocolors=__toESM(require_picocolors(),1);const defaultDeps={runLoginFlow,pickTeam,resolveVercelDeployment,resolveOidcToken:resolveDevelopmentOidcToken,prepareVercelTrustedSourceAccess,applyVercelTrustedSourceAccess};function failed(e,t=[]){return{kind:`failed`,message:appendRemoteAuthMutationSummary(e,t),completedMutations:[...t]}}function cancelled(e=[]){return{kind:`cancelled`,completedMutations:[...e]}}function loginFailure(e){switch(e.kind){case`already`:case`logged-in`:return;case`cancelled`:return cancelled();case`cli-missing`:return failed("The Vercel CLI is not installed. Install it with `npm i -g vercel@latest`, then retry /vc:login.");case`failed`:return failed(`Vercel login did not complete. Retry /vc:login.`);case`unavailable`:return failed(`Vercel could not verify your account. Check your connection, then retry /vc:login.`)}}function deploymentFailureMessage(e){return e.cause===`vercel`?e.failure.message:e.message}async function selectVercelDeploymentScope(e,t,n,r,i){return await e.pickTeam(r,t,void 0,{signal:i,selectMessage:e=>`${import_picocolors.default.blue(n)} is not accessible via current team (${import_picocolors.default.bold(e)})\nYou can try selecting another team:`})}async function runRemoteAuthFlow(e){let{workspaceRoot:t,serverUrl:n,prompter:r,signal:i}=e,a=new URL(n).host,o={...defaultDeps,...e.deps},s=[],c=!1;try{let n=await o.runLoginFlow({appRoot:t,prompter:r,signal:i}),l=loginFailure(n);if(l!==void 0)return l;n.kind===`logged-in`&&s.push({kind:`vercel-login`});let u=await o.resolveVercelDeployment({workspaceRoot:t,host:a,signal:i});if(u.kind===`forbidden`){let e=await o.runLoginFlow({appRoot:t,force:!0,prompter:r,signal:i}),n=loginFailure(e);if(n!==void 0)return n;e.kind===`logged-in`&&s.push({kind:`vercel-login`}),i?.throwIfAborted(),u=await o.resolveVercelDeployment({workspaceRoot:t,host:a,signal:i})}if(u.kind===`not-found`)try{let e=await selectVercelDeploymentScope(o,t,a,r,i);i?.throwIfAborted(),u=await o.resolveVercelDeployment({workspaceRoot:t,host:a,scope:e,signal:i})}catch(e){return e instanceof WizardCancelledError?cancelled(s):(i?.throwIfAborted(),failed(`Could not select a Vercel team: ${toErrorMessage(e)}`,s))}let d;switch(u.kind){case`resolved`:d=u.target;break;case`cancelled`:return cancelled(s);case`forbidden`:return failed(`Could not access ${a}. Re-authenticate (for example to complete a team's SSO), then retry /vc:login.`,s);case`not-found`:return failed(`Vercel did not resolve ${a} for the selected Vercel team.`,s);case`project-mismatch`:return failed(`Could not verify ${a}: Vercel resolved project ${u.actualProjectId}, not ${u.expectedProjectId}.`,s);case`failed`:return failed(`Could not verify ${a} through Vercel: ${deploymentFailureMessage(u.failure)}`,s)}let f;if(e.configureTrustedSources===!0){let e=await o.prepareVercelTrustedSourceAccess({workspaceRoot:t,target:d,prompter:r,signal:i});if(i?.throwIfAborted(),e.kind===`cancelled`)return cancelled(s);if(e.kind===`failed`)return failed(e.message,s);e.kind===`approved`&&(f=e.grant)}if(i?.throwIfAborted(),f!==void 0){c=!0;let e=await o.applyVercelTrustedSourceAccess({workspaceRoot:t,grant:f,signal:i});if(e.kind===`failed`)return failed(e.message,s);e.kind===`updated`&&s.push({kind:`trusted-sources-updated`,targetProjectName:e.targetProjectName})}let p=await o.resolveOidcToken({ownerId:d.deployment.ownerId,projectId:d.deployment.projectId,forceRefresh:!0});if(i?.throwIfAborted(),p.kind!==`resolved`)return failed(formatDevelopmentOidcTokenFailure(p),s);let m=p.token.trim();return{kind:`prepared`,target:d,resolveToken:async()=>{let e=await o.resolveOidcToken(d.deployment);return e.kind===`resolved`&&(m=e.token.trim()),m},completedMutations:[...s]}}catch(e){return!c&&(e instanceof WizardCancelledError||i?.aborted===!0)?cancelled(s):failed(`Could not authenticate ${a}: ${toErrorMessage(e)}`,s)}}export{runRemoteAuthFlow};
1
+ import{__toESM}from"../../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{applyVercelTrustedSourceAccess,prepareVercelTrustedSourceAccess}from"./vercel-trusted-sources.js";import{appendRemoteAuthMutationSummary}from"./remote-auth-result.js";import{pickTeam}from"#setup/vercel-project.js";import{WizardCancelledError}from"#setup/step.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{formatDevelopmentOidcTokenFailure}from"#services/dev-client/vercel-auth-error.js";import{runLoginFlow}from"#setup/flows/login.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";var import_picocolors=__toESM(require_picocolors(),1);const defaultDeps={runLoginFlow,pickTeam,resolveVercelDeployment,resolveOidcToken:resolveDevelopmentOidcToken,prepareVercelTrustedSourceAccess,applyVercelTrustedSourceAccess};function failed(e,t=[]){return{kind:`failed`,message:appendRemoteAuthMutationSummary(e,t),completedMutations:[...t]}}function cancelled(e=[]){return{kind:`cancelled`,completedMutations:[...e]}}function loginFailure(e){switch(e.kind){case`already`:case`logged-in`:return;case`cancelled`:return cancelled();case`cli-missing`:return failed("The Vercel CLI is not installed. Install it with `npm i -g vercel@latest`, then retry /vc:login.");case`failed`:return failed(`Vercel login did not complete. Retry /vc:login.`);case`unavailable`:return failed(`Vercel could not verify your account. Check your connection, then retry /vc:login.`)}}function deploymentFailureMessage(e){return e.cause===`vercel`?e.failure.message:e.message}async function selectVercelDeploymentScope(e,t,n,r,i){return await e.pickTeam(r,t,void 0,{signal:i,selectMessage:e=>`${import_picocolors.default.blue(n)} is not accessible via current team (${import_picocolors.default.bold(e)})\nYou can try selecting another team:`})}async function runRemoteAuthFlow(e){let{workspaceRoot:t,serverUrl:n,prompter:r,signal:i}=e,a=new URL(n).host,o={...defaultDeps,...e.deps},s=[],c=!1;try{let n=await o.runLoginFlow({appRoot:t,prompter:r,signal:i}),l=loginFailure(n);if(l!==void 0)return l;n.kind===`logged-in`&&s.push({kind:`vercel-login`});let u=await o.resolveVercelDeployment({workspaceRoot:t,host:a,signal:i});if(u.kind===`forbidden`){let e=await o.runLoginFlow({appRoot:t,force:!0,prompter:r,signal:i}),n=loginFailure(e);if(n!==void 0)return n;e.kind===`logged-in`&&s.push({kind:`vercel-login`}),i?.throwIfAborted(),u=await o.resolveVercelDeployment({workspaceRoot:t,host:a,signal:i})}if(u.kind===`not-found`)try{let e=await selectVercelDeploymentScope(o,t,a,r,i);i?.throwIfAborted(),u=await o.resolveVercelDeployment({workspaceRoot:t,host:a,scope:e,signal:i})}catch(e){return e instanceof WizardCancelledError?cancelled(s):(i?.throwIfAborted(),failed(`Could not select a Vercel team: ${toErrorMessage(e)}`,s))}let d;switch(u.kind){case`resolved`:d=u.target;break;case`cancelled`:return cancelled(s);case`forbidden`:return failed(`Could not access ${a}. Re-authenticate (for example to complete a team's SSO), then retry /vc:login.`,s);case`not-found`:return failed(`Vercel did not resolve ${a} for the selected Vercel team.`,s);case`project-mismatch`:return failed(`Could not verify ${a}: Vercel resolved project ${u.actualProjectId}, not ${u.expectedProjectId}.`,s);case`failed`:return failed(`Could not verify ${a} through Vercel: ${deploymentFailureMessage(u.failure)}`,s)}let f;if(e.configureTrustedSources===!0){let e=await o.prepareVercelTrustedSourceAccess({workspaceRoot:t,target:d,prompter:r,signal:i});if(i?.throwIfAborted(),e.kind===`cancelled`)return cancelled(s);if(e.kind===`failed`)return failed(e.message,s);e.kind===`approved`&&(f=e.grant)}if(i?.throwIfAborted(),f!==void 0){c=!0;let e=await o.applyVercelTrustedSourceAccess({workspaceRoot:t,grant:f,signal:i});if(e.kind===`failed`)return failed(e.message,s);e.kind===`updated`&&s.push({kind:`trusted-sources-updated`,targetProjectName:e.targetProjectName})}let p=await o.resolveOidcToken({ownerId:d.deployment.ownerId,projectId:d.deployment.projectId,forceRefresh:!0});if(i?.throwIfAborted(),p.kind!==`resolved`)return failed(formatDevelopmentOidcTokenFailure(p),s);let m=p.token.trim();return{kind:`prepared`,target:d,resolveToken:async()=>{let e=await o.resolveOidcToken(d.deployment);return e.kind===`resolved`&&(m=e.token.trim()),m},completedMutations:[...s]}}catch(e){return!c&&(e instanceof WizardCancelledError||i?.aborted===!0)?cancelled(s):failed(`Could not authenticate ${a}: ${toErrorMessage(e)}`,s)}}export{runRemoteAuthFlow};
@@ -15,6 +15,7 @@ import { type McpConnectionProbe } from "./mcp-connection-status.js";
15
15
  import type { detectProjectIdentity } from "#setup/project-resolution.js";
16
16
  import { getVercelAuthStatus } from "#setup/vercel-project.js";
17
17
  import type { DevDiagnostics } from "../diagnostics.js";
18
+ import type { CommandLifecycle } from "../../shutdown.js";
18
19
  export { parsePromptCommand, type PromptCommand } from "./prompt-commands.js";
19
20
  export type AgentTUIStreamResult = {
20
21
  events: AsyncIterable<AgentTUIStreamEvent> | ReadableStream<AgentTUIStreamEvent>;
@@ -268,6 +269,8 @@ export type AgentTUIRenderer = {
268
269
  * lifecycle ends.
269
270
  */
270
271
  shutdown?(): void;
272
+ requestInterrupt?(): void;
273
+ exitRequested?(): boolean;
271
274
  };
272
275
  export interface PromptCommandHandlerContext {
273
276
  readonly renderer: AgentTUIRenderer;
@@ -356,6 +359,7 @@ export type EveTUIRunnerOptions = TuiDisplayOptions & {
356
359
  onBootProgress?: DevBootProgressReporter;
357
360
  /** Parent-owned diagnostics recorder; omitted for remote and test renderers. */
358
361
  diagnostics?: DevDiagnostics;
362
+ lifecycle?: CommandLifecycle;
359
363
  };
360
364
  export declare class EveTUIRunner {
361
365
  #private;