eve 0.72.1 → 0.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/src/channel/agent-description.d.ts +49 -9
  3. package/dist/src/channel/agent-description.js +1 -1
  4. package/dist/src/channel/invoke-tool.d.ts +26 -4
  5. package/dist/src/channel/invoke-tool.js +1 -1
  6. package/dist/src/channel/principal-identity.d.ts +9 -0
  7. package/dist/src/channel/principal-identity.js +1 -0
  8. package/dist/src/channel/prompt-queue.d.ts +31 -0
  9. package/dist/src/channel/prompt-queue.js +1 -0
  10. package/dist/src/channel/routes.d.ts +19 -4
  11. package/dist/src/channel/schedule.js +1 -1
  12. package/dist/src/channel/skill-files.d.ts +114 -0
  13. package/dist/src/channel/skill-files.js +1 -0
  14. package/dist/src/cli/commands/agent-instructions.js +1 -1
  15. package/dist/src/cli/commands/extension-init.js +1 -1
  16. package/dist/src/cli/commands/init-agent-workspace.js +1 -1
  17. package/dist/src/cli/commands/init-project.js +1 -1
  18. package/dist/src/cli/commands/init.js +1 -1
  19. package/dist/src/cli/dev/diagnostic-dump.js +1 -1
  20. package/dist/src/cli/dev/tui/blocks.d.ts +6 -0
  21. package/dist/src/cli/dev/tui/blocks.js +2 -2
  22. package/dist/src/cli/dev/tui/markdown.d.ts +5 -0
  23. package/dist/src/cli/dev/tui/markdown.js +2 -2
  24. package/dist/src/cli/dev/tui/transcript-parts.d.ts +4 -1
  25. package/dist/src/cli/dev/tui/transcript-parts.js +2 -2
  26. package/dist/src/cli/dev/tui/transcript.js +1 -1
  27. package/dist/src/compiled/.vendor-stamp.json +8 -8
  28. package/dist/src/compiled/@eve/catalog/index.js +1 -1
  29. package/dist/src/compiled/@modelcontextprotocol/server/index.d.ts +68 -7
  30. package/dist/src/compiled/@workflow/core/capabilities.d.ts +33 -6
  31. package/dist/src/compiled/@workflow/core/flushable-stream.d.ts +2 -0
  32. package/dist/src/compiled/@workflow/core/index.d.ts +1 -0
  33. package/dist/src/compiled/@workflow/core/index.js +2 -2
  34. package/dist/src/compiled/@workflow/core/private.js +1 -1
  35. package/dist/src/compiled/@workflow/core/runtime/helpers.d.ts +6 -0
  36. package/dist/src/compiled/@workflow/core/runtime/helpers.js +1 -1
  37. package/dist/src/compiled/@workflow/core/runtime.js +3 -3
  38. package/dist/src/compiled/@workflow/core/serialization/codec.d.ts +8 -8
  39. package/dist/src/compiled/@workflow/core/serialization/compression.d.ts +13 -5
  40. package/dist/src/compiled/@workflow/core/serialization.d.ts +9 -9
  41. package/dist/src/compiled/@workflow/core/serialization.js +1 -1
  42. package/dist/src/compiled/@workflow/core/symbols.d.ts +2 -0
  43. package/dist/src/compiled/@workflow/core/telemetry/semantic-conventions.d.ts +2 -2
  44. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  45. package/dist/src/compiled/@workflow/core/workflow/index.d.ts +1 -0
  46. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  47. package/dist/src/compiled/@workflow/errors/index.js +1 -1
  48. package/dist/src/compiled/@workflow/world/events.d.ts +11 -0
  49. package/dist/src/compiled/@workflow/world/hooks.d.ts +2 -0
  50. package/dist/src/compiled/@workflow/world/interfaces.d.ts +6 -0
  51. package/dist/src/compiled/@workflow/world-local/index.js +3 -3
  52. package/dist/src/compiled/@workflow/world-vercel/index.js +13 -13
  53. package/dist/src/compiled/_chunks/workflow/{attribute-changes-VaTKT4K8.js → attribute-changes-CSqvJx6j.js} +2 -2
  54. package/dist/src/compiled/_chunks/workflow/{dist-B7NC1c9-.js → dist-DmXynLVH.js} +1 -1
  55. package/dist/src/compiled/_chunks/workflow/dist-T5NnW-0k.js +3 -0
  56. package/dist/src/compiled/_chunks/workflow/helpers-BXCuoPUb.js +1 -0
  57. package/dist/src/compiled/_chunks/workflow/private-Dlf90Zvn.js +1 -0
  58. package/dist/src/compiled/_chunks/workflow/resume-hook-CvENCrxc.js +1 -0
  59. package/dist/src/compiled/_chunks/workflow/{run-DYKeqbob.js → run-8pLWuR2U.js} +6 -6
  60. package/dist/src/compiled/_chunks/workflow/serialization-vDozzDhh.js +16 -0
  61. package/dist/src/compiled/_chunks/workflow/sleep-BMqbraZM.js +1 -0
  62. package/dist/src/compiled/_chunks/workflow/wait-until-A344L2AG.js +1 -0
  63. package/dist/src/compiled/shadcn-registry/index.js +3408 -35163
  64. package/dist/src/compiler/artifacts.js +1 -1
  65. package/dist/src/compiler/compile-agent.js +1 -1
  66. package/dist/src/compiler/development-extensions.js +1 -1
  67. package/dist/src/compiler/extension-compatibility.d.ts +6 -6
  68. package/dist/src/compiler/extension-compatibility.js +1 -1
  69. package/dist/src/context/providers/session.js +1 -1
  70. package/dist/src/context/turn-principals.d.ts +12 -0
  71. package/dist/src/context/turn-principals.js +1 -0
  72. package/dist/src/evals/cli/eval-client.js +1 -1
  73. package/dist/src/evals/cli/eval.js +1 -1
  74. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  75. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  76. package/dist/src/execution/invoke-tool.d.ts +6 -2
  77. package/dist/src/execution/invoke-tool.js +1 -1
  78. package/dist/src/execution/legacy-session/turn-workflow.js +1 -1
  79. package/dist/src/execution/node-step.d.ts +1 -0
  80. package/dist/src/execution/node-step.js +1 -1
  81. package/dist/src/execution/publish-session-events.js +1 -1
  82. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  83. package/dist/src/execution/sandbox/bindings/vercel-errors.d.ts +11 -0
  84. package/dist/src/execution/sandbox/bindings/vercel-errors.js +2 -1
  85. package/dist/src/execution/sandbox/bindings/vercel-tool-sessions.d.ts +7 -0
  86. package/dist/src/execution/sandbox/bindings/vercel-tool-sessions.js +1 -0
  87. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  88. package/dist/src/execution/sandbox/development-lazy-prewarm.js +1 -1
  89. package/dist/src/execution/sandbox/ensure.d.ts +14 -1
  90. package/dist/src/execution/sandbox/ensure.js +1 -1
  91. package/dist/src/execution/sandbox/prewarm.js +1 -1
  92. package/dist/src/execution/session/active-turn.d.ts +2 -1
  93. package/dist/src/execution/session/active-turn.js +1 -1
  94. package/dist/src/execution/session/entry.d.ts +10 -1
  95. package/dist/src/execution/session/entry.js +1 -1
  96. package/dist/src/execution/session/program.d.ts +4 -0
  97. package/dist/src/execution/session/program.js +1 -1
  98. package/dist/src/execution/session/timeout-control.d.ts +1 -2
  99. package/dist/src/execution/session/timeout-control.js +1 -1
  100. package/dist/src/execution/session/turn-control.d.ts +7 -0
  101. package/dist/src/execution/session/turn-control.js +1 -0
  102. package/dist/src/execution/session/turn-step.js +1 -1
  103. package/dist/src/execution/session/turn.d.ts +2 -0
  104. package/dist/src/execution/session/turn.js +1 -1
  105. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  106. package/dist/src/execution/tool-session/id.d.ts +22 -0
  107. package/dist/src/execution/tool-session/id.js +1 -0
  108. package/dist/src/execution/tool-session/sandbox.d.ts +22 -0
  109. package/dist/src/execution/tool-session/sandbox.js +1 -0
  110. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  111. package/dist/src/harness/hitl/approvals.d.ts +1 -1
  112. package/dist/src/harness/hitl/approvals.js +1 -1
  113. package/dist/src/harness/hitl/delivery.d.ts +9 -2
  114. package/dist/src/harness/hitl/delivery.js +1 -1
  115. package/dist/src/harness/hitl/intake.js +1 -1
  116. package/dist/src/harness/model-call/usage.js +1 -1
  117. package/dist/src/harness/open-input-request.d.ts +8 -0
  118. package/dist/src/harness/open-input-request.js +1 -0
  119. package/dist/src/harness/session-machine/current.js +1 -1
  120. package/dist/src/harness/session-machine/transitions.js +1 -1
  121. package/dist/src/harness/tool-loop.js +1 -1
  122. package/dist/src/harness/types.d.ts +2 -0
  123. package/dist/src/internal/application/cache-metadata.js +1 -1
  124. package/dist/src/internal/application/compiled-artifacts.js +1 -1
  125. package/dist/src/internal/application/package.js +1 -1
  126. package/dist/src/internal/application/paths.js +1 -1
  127. package/dist/src/internal/application/runtime-compiled-artifacts-source.js +1 -1
  128. package/dist/src/internal/authored-definition/connection.js +1 -1
  129. package/dist/src/internal/authored-module-loader.js +1 -1
  130. package/dist/src/internal/authored-package-boundary.js +1 -1
  131. package/dist/src/internal/invocation/metadata.js +1 -1
  132. package/dist/src/internal/mcp/forwarded-principal-header.d.ts +31 -0
  133. package/dist/src/internal/mcp/forwarded-principal-header.js +1 -0
  134. package/dist/src/internal/mcp/published-tools.d.ts +9 -2
  135. package/dist/src/internal/mcp/published-tools.js +1 -1
  136. package/dist/src/internal/mcp/skills.d.ts +57 -0
  137. package/dist/src/internal/mcp/skills.js +1 -0
  138. package/dist/src/internal/mcp/streamable-http-server.d.ts +38 -6
  139. package/dist/src/internal/mcp/streamable-http-server.js +1 -1
  140. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  141. package/dist/src/internal/nitro/host/artifacts-config.js +1 -1
  142. package/dist/src/internal/nitro/host/build-application.js +1 -1
  143. package/dist/src/internal/nitro/host/build-extension.js +1 -1
  144. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  145. package/dist/src/internal/nitro/host/configure-nitro-routes.js +1 -1
  146. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  147. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  148. package/dist/src/internal/nitro/host/dev-runner.js +1 -1
  149. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
  150. package/dist/src/internal/nitro/host/skill-server-assets.d.ts +29 -0
  151. package/dist/src/internal/nitro/host/skill-server-assets.js +1 -0
  152. package/dist/src/internal/nitro/host/start-production-server.js +1 -1
  153. package/dist/src/internal/nitro/host/workspace-extensions.js +1 -1
  154. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  155. package/dist/src/internal/nitro/routes/channel-route-context.d.ts +4 -0
  156. package/dist/src/internal/nitro/routes/channel-route-context.js +1 -1
  157. package/dist/src/internal/vercel/build-agent-workspace.js +1 -1
  158. package/dist/src/internal/workflow/development-world-client.js +1 -1
  159. package/dist/src/internal/workflow/validate-world.js +1 -1
  160. package/dist/src/internal/workflow/vercel-world-defaults.js +1 -1
  161. package/dist/src/internal/workflow-bundle/builder-support.js +1 -1
  162. package/dist/src/internal/workflow-bundle/builder.js +1 -1
  163. package/dist/src/public/channels/chat-sdk/authorization.js +1 -1
  164. package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +7 -1
  165. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  166. package/dist/src/public/channels/discord/defaults.d.ts +8 -7
  167. package/dist/src/public/channels/discord/discordChannel.d.ts +21 -1
  168. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  169. package/dist/src/public/channels/discord/index.d.ts +1 -1
  170. package/dist/src/public/channels/github/defaults.js +3 -3
  171. package/dist/src/public/channels/github/githubChannel.d.ts +4 -1
  172. package/dist/src/public/channels/github/state.d.ts +2 -1
  173. package/dist/src/public/channels/index.d.ts +1 -1
  174. package/dist/src/public/channels/linear/defaults.js +1 -1
  175. package/dist/src/public/channels/linear/linearChannel.d.ts +4 -1
  176. package/dist/src/public/channels/mcp.d.ts +26 -5
  177. package/dist/src/public/channels/mcp.js +1 -1
  178. package/dist/src/public/channels/slack/interactions.js +1 -1
  179. package/dist/src/public/channels/slack/slackChannel.d.ts +6 -0
  180. package/dist/src/public/channels/twilio/defaults.js +2 -4
  181. package/dist/src/public/channels/twilio/twilioChannel.d.ts +4 -1
  182. package/dist/src/public/definitions/channel.d.ts +1 -1
  183. package/dist/src/public/definitions/connections/mcp.d.ts +11 -0
  184. package/dist/src/public/sveltekit/dev-server.js +1 -1
  185. package/dist/src/runtime/cache-key.js +1 -1
  186. package/dist/src/runtime/connections/mcp-client.js +1 -1
  187. package/dist/src/runtime/loaders/compile-metadata.js +1 -1
  188. package/dist/src/runtime/loaders/manifest.js +1 -1
  189. package/dist/src/runtime/loaders/module-map.js +1 -1
  190. package/dist/src/runtime/resolve-connection.js +1 -1
  191. package/dist/src/runtime/sandbox/prepared-artifacts.js +1 -1
  192. package/dist/src/runtime/sessions/compiled-agent-cache.js +1 -1
  193. package/dist/src/runtime/sessions/runtime-session.d.ts +10 -0
  194. package/dist/src/runtime/sessions/runtime-session.js +1 -1
  195. package/dist/src/runtime/types.d.ts +2 -0
  196. package/dist/src/self-modification/config.d.ts +4 -63
  197. package/dist/src/self-modification/config.js +1 -1
  198. package/dist/src/self-modification/credentials.d.ts +1 -1
  199. package/dist/src/self-modification/deployed-sandbox.d.ts +14 -0
  200. package/dist/src/self-modification/deployed-sandbox.js +1 -0
  201. package/dist/src/self-modification/extension/config-schema.d.ts +2 -17
  202. package/dist/src/self-modification/extension/config-schema.js +1 -1
  203. package/dist/src/self-modification/extension/local-only.d.ts +1 -1
  204. package/dist/src/self-modification/extension/local-only.js +1 -1
  205. package/dist/src/self-modification/extension/subagents/agent/agent.d.ts +1 -1
  206. package/dist/src/self-modification/extension/subagents/agent/agent.js +1 -1
  207. package/dist/src/self-modification/extension/subagents/agent/instructions.js +3 -35
  208. package/dist/src/self-modification/extension/subagents/agent/tools/registry_add.d.ts +3 -31
  209. package/dist/src/self-modification/extension/subagents/agent/tools/registry_add.js +1 -1
  210. package/dist/src/self-modification/git-workspace.d.ts +1 -2
  211. package/dist/src/self-modification/git-workspace.js +1 -1
  212. package/dist/src/self-modification/github-publisher.d.ts +1 -1
  213. package/dist/src/self-modification/mode.d.ts +4 -4
  214. package/dist/src/self-modification/mode.js +1 -1
  215. package/dist/src/self-modification/proposal.js +1 -1
  216. package/dist/src/self-modification/remote/config-schema.d.ts +20 -0
  217. package/dist/src/self-modification/remote/config-schema.js +1 -0
  218. package/dist/src/self-modification/remote/config.d.ts +66 -0
  219. package/dist/src/self-modification/remote/config.js +1 -0
  220. package/dist/src/self-modification/remote/extension.d.ts +5 -0
  221. package/dist/src/self-modification/remote/extension.js +1 -0
  222. package/dist/src/self-modification/remote/production-registry-add.js +1 -0
  223. package/dist/src/self-modification/remote/subagents/agent/agent.d.ts +4 -0
  224. package/dist/src/self-modification/remote/subagents/agent/agent.js +1 -0
  225. package/dist/src/self-modification/remote/subagents/agent/instructions.d.ts +2 -0
  226. package/dist/src/self-modification/remote/subagents/agent/instructions.js +5 -0
  227. package/dist/src/self-modification/remote/subagents/agent/sandbox.d.ts +2 -0
  228. package/dist/src/self-modification/remote/subagents/agent/sandbox.js +1 -0
  229. package/dist/src/self-modification/remote/subagents/agent/tools/edit_file.d.ts +1 -0
  230. package/dist/src/self-modification/remote/subagents/agent/tools/edit_file.js +1 -0
  231. package/dist/src/self-modification/remote/subagents/agent/tools/publish.js +1 -0
  232. package/dist/src/self-modification/remote/subagents/agent/tools/registry_add.d.ts +32 -0
  233. package/dist/src/self-modification/remote/subagents/agent/tools/registry_add.js +1 -0
  234. package/dist/src/self-modification/remote/subagents/agent/tools/search_models.d.ts +1 -0
  235. package/dist/src/self-modification/remote/subagents/agent/tools/search_models.js +1 -0
  236. package/dist/src/self-modification/remote/subagents/agent/tools/search_registry.d.ts +1 -0
  237. package/dist/src/self-modification/remote/subagents/agent/tools/search_registry.js +1 -0
  238. package/dist/src/self-modification/sandbox.d.ts +1 -6
  239. package/dist/src/self-modification/sandbox.js +1 -1
  240. package/dist/src/self-modification/scaffold.js +1 -1
  241. package/dist/src/self-modification/setup.d.ts +6 -0
  242. package/dist/src/self-modification/setup.js +46 -48
  243. package/dist/src/self-modification/subagent-guidance.d.ts +15 -0
  244. package/dist/src/self-modification/subagent-guidance.js +29 -0
  245. package/dist/src/services/dev-client/request-headers.js +1 -1
  246. package/dist/src/setup/flows/model-source-change.js +1 -1
  247. package/dist/src/setup/integrations/self-modification/setup.js +1 -1
  248. package/dist/src/setup/project-resolution.js +1 -1
  249. package/dist/src/setup/scaffold/create/project.js +1 -1
  250. package/dist/src/setup/verified-remote-client.d.ts +3 -0
  251. package/dist/src/setup/verified-remote-client.js +1 -1
  252. package/dist/src/shared/framework-eve-server.js +1 -1
  253. package/dist/src/subagents/hitl-proxy.js +1 -1
  254. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  255. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  256. package/dist/src/tracing/invoke-tool-span.d.ts +1 -0
  257. package/docs/channels/chat-sdk.mdx +27 -0
  258. package/docs/channels/custom.mdx +5 -2
  259. package/docs/channels/discord.mdx +22 -0
  260. package/docs/channels/mcp.mdx +102 -4
  261. package/docs/channels/slack.mdx +1 -1
  262. package/docs/connections/mcp.mdx +19 -0
  263. package/docs/evals/targets.mdx +5 -1
  264. package/docs/guides/self-modification.md +50 -3
  265. package/docs/tools/human-in-the-loop.md +14 -2
  266. package/docs/tutorial/guard-the-spend.mdx +1 -1
  267. package/package.json +25 -7
  268. package/dist/src/compiled/@workflow/core/runtime/vm-serde-bundle.generated.d.ts +0 -14
  269. package/dist/src/compiled/_chunks/workflow/dist-CaNNONeg.js +0 -3
  270. package/dist/src/compiled/_chunks/workflow/global-DKbOgrts.js +0 -1
  271. package/dist/src/compiled/_chunks/workflow/helpers-CP9TjeO8.js +0 -1
  272. package/dist/src/compiled/_chunks/workflow/logger-oqfblE3p.js +0 -14
  273. package/dist/src/compiled/_chunks/workflow/resume-hook-yq-NAdBu.js +0 -1
  274. package/dist/src/compiled/_chunks/workflow/serialization-APSKphN5.js +0 -3
  275. package/dist/src/compiled/_chunks/workflow/sleep-Ba8SExMt.js +0 -1
  276. package/dist/src/compiled/_chunks/workflow/wait-until-Dc9s3yyP.js +0 -1
  277. package/dist/src/self-modification/extension/production-registry-add.js +0 -1
  278. package/dist/src/self-modification/extension/subagents/agent/tools/publish.js +0 -1
  279. /package/dist/src/self-modification/{extension → remote}/production-registry-add.d.ts +0 -0
  280. /package/dist/src/self-modification/{extension → remote}/subagents/agent/tools/publish.d.ts +0 -0
@@ -1,41 +1,9 @@
1
- import{resolveSelfModificationConfig}from"../../../config.js";import extension_default from"../../extension.js";import{resolveSelfModificationMode}from"../../../mode.js";import{renderLocalSelfModificationExtension}from"../../../scaffold.js";import{defineDynamic,defineInstructions}from"eve/instructions";const selfModificationSubagentGuidance=`## Changing the self-modification subagent
1
+ import{resolveSelfModificationConfig}from"../../../config.js";import{isLocalSelfModificationEnabled}from"../../../mode.js";import extension_default from"../../extension.js";import{documentationInstructions,registryWorkflowInstructions,renderInstructions,roleInstructions,sourceEditingInstructions,sourceWorkspaceInstructions,toolAuthoringInstructions,workingInstructions}from"../../../subagent-guidance.js";import{renderLocalSelfModificationExtension}from"../../../scaffold.js";import{defineDynamic,defineInstructions}from"eve/instructions";const selfModificationSubagentGuidance=`## Changing the self-modification subagent
2
2
 
3
3
  Only when the requester explicitly names the self-modification subagent, edit whichever of /source/extensions/self-modification.ts or /source/extensions/self-modification/extension.ts exists. If neither exists, create /source/extensions/self-modification/extension.ts with write_file using this content, then make the requested model or reasoning change:
4
4
  \`\`\`ts
5
- ${renderLocalSelfModificationExtension()}\`\`\``;function renderInstructions(e){return e.filter(e=>e.length>0).join(`
6
-
7
- `)}var instructions_default=defineDynamic({events:{"session.started":()=>{let e=resolveSelfModificationMode(resolveSelfModificationConfig(extension_default.config));return e!==`local`&&e!==`deployed`?null:defineInstructions({markdown:renderInstructions([`## Role
8
-
9
- You are an expert coding assistant operating inside of an eve agent. You help users by reading files, editing code, and writing new files that shape the behavior of the agent itself.`,`## Source workspace
10
-
11
- The source code of the eve agent is mounted read-write at /source. /source is the authored agent directory. Locate source files with bash. Read source contents with read_file, not shell commands. Before generating an overwrite, ensure read_file has succeeded for that path. Shell reads do not satisfy write_file's read-before-write requirement. edit_file instead validates exact matches against current contents. Never modify source files with bash, sed, awk, redirection, or scripting.
12
-
13
- Resolve named tools by filename under /source/tools before searching contents. Tool identifiers derive from filenames and may not occur in the implementation.`,`## Implement changes
14
-
15
- Use edit_file for localized changes; include only the unique matching text. For a complete rewrite, use read_file then write_file; do not encode the whole old file as one replacement. If tool arguments fail argument parsing, retry the same tool with corrected encoding.
16
-
17
- Once paths are known, batch independent file reads and edits to different files. Never edit the same file concurrently.`,`## Add model-callable actions
18
-
19
- When the requester wants this agent to gain a reusable action or capability that it can invoke in future turns, implement it as an authored eve tool under /source/tools. This applies even when the request describes the action without using the word “tool.” Follow the path-derived naming and defineTool conventions in the mounted eve tools documentation and existing source.
20
-
21
- Do not substitute a loose Python, shell, or JavaScript file for a model-callable tool. A support script is acceptable only when an authored eve tool invokes it as an implementation detail, or when the requester explicitly asks for a standalone script instead of an agent capability.`,`## Add integrations
22
-
23
- Before adding a new eve-managed channel, connection, extension, instrumentation, or memory integration, call search_registry alongside source discovery. If an item fulfills the requirement, install it with registry_add using its exact address. If no matching item fulfills the requirement, or if the developer asks for a custom implementation, write the integration yourself.
24
-
25
- Modifying the behavior of an existing skill or tool does not require a registry search. Registry search blocks implementation, not source inspection. Serialize registry installation and dependent edits. Run registry_add separately from file edits and other registry installations.
26
-
27
- Registry installation is outside the source sandbox.`,`## Consult documentation
28
-
29
- The eve framework documentation is mounted read-only at /eve-docs. Prefer source and existing local patterns. Before reading docs, identify the specific unresolved API question. Search the relevant file for its heading or term, then read only the bounded surrounding section. Do not concatenate wildcard files or read a full page when a section answers the question. Stop when the question is resolved.`,e===`local`?"## Local environment\n\nThe registry_add tool will complete installation for items that need no setup. In the local dev TUI, a `needs-terminal` result from the tool call automatically opens the existing setup panel for the user to complete setup there. In headless development, if a `needs-terminal` result includes `nextCommand`, present that exact value as the only shell command in your response. Never infer, construct, or rewrite a command: installing an item uses `eve add <item>`; `eve registry add` configures registry namespace mappings and does not install items.\n\nLocal eve dev logs are mounted read-only at /logs. Local trace segments are mounted read-only at /traces when available. For latency, failure, token, or behavior analysis, load and follow the `trace_analysis` skill. Trace searches are scoped to the invoking conversation and exclude the current investigation by default.\n\nThe application package.json is not mounted. Do not search outside /source for application files. You cannot run host binaries such as git, node, pnpm, or tsc. Use existing imports and registry_add for supported registry installations.":"## Deployed environment\n\nThe registry_add tool may return `completed`, `input-required`, `external-action-required`, `cancelled`, or `failed`. Supply only non-secret structured answers when continuing an `input-required` setup; set `installed: true` so the continuation does not reinstall source. Never request, accept, or repeat secret values. External authorization and secret binding are incomplete follow-up boundaries, not evidence that an integration is active.\n\nThe configured target branch is checked out as a disposable workspace under /workspace/repository. Make ordinary changes through /source, which is the writable view of the configured application's agent/ directory. Publication validates the final repository snapshot, including registry, manifest, and lockfile changes. Never modify Git refs, access GitHub directly, or use shell commands to write files. The sandbox has no reusable GitHub credential after checkout.\n\nComplete all edits and registry installations before publication, and call publish by itself. Before publication, review and summarize the complete intended scope. Call publish once with a concise title and summary. A successful result is only a draft pull request. Return its URL and changed paths, and state that merge and deployment have not occurred.",`## Work efficiently
30
-
31
- Skip task lists for simple work - only use them for complex actions. Never spend a turn only reporting status or updating the task list - batch them with other calls.
32
-
33
- Treat a successful file-edit tool result as confirmation; do not reread a file solely to verify that the edit succeeded. Do not approximate unavailable build or test commands with broad source searches.`,selfModificationSubagentGuidance,e===`local`?`## Report results
5
+ ${renderLocalSelfModificationExtension()}\`\`\``;var instructions_default=defineDynamic({events:{"session.started":()=>isLocalSelfModificationEnabled(resolveSelfModificationConfig(extension_default.config))?defineInstructions({markdown:renderInstructions([roleInstructions,sourceWorkspaceInstructions,sourceEditingInstructions,toolAuthoringInstructions,registryWorkflowInstructions,documentationInstructions,"## Local environment\n\nThe registry_add tool will complete installation for items that need no setup. In the local dev TUI, a `needs-terminal` result from the tool call automatically opens the existing setup panel for the user to complete setup there. In headless development, if a `needs-terminal` result includes `nextCommand`, present that exact value as the only shell command in your response. Never infer, construct, or rewrite a command: installing an item uses `eve add <item>`; `eve registry add` configures registry namespace mappings and does not install items.\n\nLocal eve dev logs are mounted read-only at /logs. Local trace segments are mounted read-only at /traces when available. For latency, failure, token, or behavior analysis, load and follow the `trace_analysis` skill. Trace searches are scoped to the invoking conversation and exclude the current investigation by default.\n\nThe application package.json is not mounted. Do not search outside /source for application files. You cannot run host binaries such as git, node, pnpm, or tsc. Use existing imports and registry_add for supported registry installations.",workingInstructions,selfModificationSubagentGuidance,`## Report results
34
6
 
35
7
  For source-modification tasks, return a concise handoff to the caller. Use at most four short bullets covering changed paths and behavior, and any required setup or unresolved issues.
36
8
 
37
- For investigation tasks, report the findings and supporting evidence requested by the caller.`:`## Report results
38
-
39
- For source-modification tasks, return a concise handoff to the caller. Use at most four short bullets covering changed paths and behavior, and any required setup or unresolved issues. Include the draft pull request URL if one was published.
40
-
41
- For investigation tasks, report the findings and supporting evidence requested by the caller.`])})}}});export{instructions_default as default};
9
+ For investigation tasks, report the findings and supporting evidence requested by the caller.`])}):null}});export{instructions_default as default};
@@ -1,6 +1,5 @@
1
1
  import { type LocalDevCapability } from "eve/local-dev";
2
- import { type ToolContext } from "eve/tools";
3
- import { type ResolvedSelfModificationConfig } from "../../../../config.js";
2
+ import type { ResolvedSelfModificationConfig } from "../../../../config.js";
4
3
  import { type SpawnLike } from "../../../eve-add.js";
5
4
  import { type CatalogEntry } from "./search_registry.js";
6
5
  interface RegistryAddDependencies {
@@ -19,29 +18,6 @@ export interface LocalRegistryAddResult {
19
18
  readonly nextCommand?: string;
20
19
  readonly changed?: readonly string[];
21
20
  }
22
- type ProductionRegistryAddResult = {
23
- readonly address: string;
24
- readonly status: "completed";
25
- readonly completedItems: readonly string[];
26
- readonly changedPaths: readonly string[];
27
- readonly deploymentRequired: boolean;
28
- } | {
29
- readonly address: string;
30
- readonly status: "input-required";
31
- readonly installed: boolean;
32
- readonly question: unknown;
33
- } | {
34
- readonly address: string;
35
- readonly status: "external-action-required";
36
- readonly installed: boolean;
37
- readonly message: string;
38
- readonly url: string;
39
- readonly userCode?: string;
40
- } | {
41
- readonly address: string;
42
- readonly status: "failed" | "cancelled";
43
- readonly message: string;
44
- };
45
21
  /**
46
22
  * Names the item's declared environment variables that are not set.
47
23
  *
@@ -72,13 +48,9 @@ export declare function addLocalRegistryItem(address: string, options?: Registry
72
48
  readonly signal?: AbortSignal;
73
49
  }): Promise<LocalRegistryAddResult>;
74
50
  export declare function resolveRegistryAddTool(config: ResolvedSelfModificationConfig): (import("eve/tools").ToolDefinition<Record<string, unknown>, LocalRegistryAddResult> & {
75
- execute(input: Record<string, unknown>, ctx: ToolContext): Promise<LocalRegistryAddResult>;
76
- }) | (import("eve/tools").ToolDefinition<Record<string, unknown>, ProductionRegistryAddResult> & {
77
- execute(input: Record<string, unknown>, ctx: ToolContext): Promise<ProductionRegistryAddResult>;
51
+ execute(input: Record<string, unknown>, ctx: import("eve/tools").ToolContext): Promise<LocalRegistryAddResult>;
78
52
  }) | null;
79
53
  declare const _default: import("eve/tools").DynamicSentinel<(import("eve/tools").ToolDefinition<Record<string, unknown>, LocalRegistryAddResult> & {
80
- execute(input: Record<string, unknown>, ctx: ToolContext): Promise<LocalRegistryAddResult>;
81
- }) | (import("eve/tools").ToolDefinition<Record<string, unknown>, ProductionRegistryAddResult> & {
82
- execute(input: Record<string, unknown>, ctx: ToolContext): Promise<ProductionRegistryAddResult>;
54
+ execute(input: Record<string, unknown>, ctx: import("eve/tools").ToolContext): Promise<LocalRegistryAddResult>;
83
55
  }) | null>;
84
56
  export default _default;
@@ -1 +1 @@
1
- import{resolveSelfModificationConfig}from"../../../../config.js";import{classifyCatalogEntry}from"../../../classify-registry-item.js";import{runEveAdd}from"../../../eve-add.js";import extension_default from"../../../extension.js";import{resolveSelfModificationMode}from"../../../../mode.js";import{assertOfficialRegistryAddress,installProductionRegistryItem}from"../../../production-registry-add.js";import{readPreparedSelfModificationWorkspace}from"../../../../git-workspace.js";import{withSelfModificationWorkspaceLock}from"../../../../workspace-lock.js";import{loadRegistryIndex,officialRegistryIndexUrl,resolveRegistryIndexUrl}from"./search_registry.js";import{defineDynamic,defineTool}from"eve/tools";import{getLocalDevCapability}from"eve/local-dev";const localInputSchema={type:`object`,additionalProperties:!1,properties:{address:{type:`string`,minLength:1,maxLength:200,description:"Exact address of an item in the configured eve registry, for example `channel/slack` or `extension/browserbase`."}},required:[`address`]},localOutputSchema={type:`object`,additionalProperties:!1,properties:{status:{type:`string`,enum:[`installed`,`needs-terminal`,`failed`]},address:{type:`string`},title:{type:`string`},envVars:{type:`array`,items:{type:`string`},description:`Environment variables the item needs that are not set. The item is installed but will not work until the developer sets them. Never ask for or repeat their values.`},reason:{type:`string`,description:`Why the item was not installed here.`},changed:{type:`array`,items:{type:`string`},description:`Project-relative paths a failed install could not restore.`},nextCommand:{type:`string`,description:"The command that completes a `needs-terminal` item."},message:{type:`string`,description:`One-line summary to relay to the developer.`}},required:[`status`,`address`,`message`]},productionInputSchema={type:`object`,additionalProperties:!1,properties:{address:{type:`string`,minLength:1,maxLength:200,description:"Exact official eve registry address, for example `channel/slack` or `extension/browserbase`."},answers:{type:`object`,additionalProperties:!0,description:`Non-secret answers to the setup question returned by the previous call.`},installed:{type:`boolean`,description:`Set to true with answers when the previous input-required result installed the source.`}},required:[`address`]},productionOutputSchema={type:`object`,additionalProperties:!1,properties:{status:{type:`string`,enum:[`completed`,`input-required`,`external-action-required`,`failed`,`cancelled`]},address:{type:`string`},changedPaths:{type:`array`,items:{type:`string`},description:`Repository-relative paths installed into the proposal.`},completedItems:{type:`array`,items:{type:`string`}},deploymentRequired:{type:`boolean`},installed:{type:`boolean`,description:`Whether source installation completed before setup paused.`},question:{type:`object`,additionalProperties:!0,description:`The current setup question. Supply only its non-secret answer on the next call.`},message:{type:`string`},url:{type:`string`,description:`External authorization URL the developer must open.`},userCode:{type:`string`}},required:[`status`,`address`]};function unsetEnvVars(e,t=process.env){return(e.envVars??[]).filter(e=>{let n=t[e];return n===void 0||n===``})}function handoffMessage(e){if(e.interactiveClient)return{message:`${e.title} was not installed by this tool. ${e.reason} Continue in the setup panel that opens here; do not ask the developer to run another command.`};let t=`eve add ${e.address}`;return{message:`${e.title} was not installed. ${e.reason} Run \`${t}\` in a terminal to finish it.`,nextCommand:t}}async function addLocalRegistryItem(e,t={}){let n=(t.getCapability??getLocalDevCapability)();if(n===void 0)throw Error("Registry items can only be installed while `eve dev` is running. Report the item address to the developer instead of installing it.");let r=(await loadRegistryIndex({nowMs:Date.now(),signal:t.signal,url:resolveRegistryIndexUrl()})).find(t=>t.address===e);if(r===void 0)throw Error(`No item in the configured eve registry is published at "${e}". Check the address before trying again.`);let i=classifyCatalogEntry(r);if(i.kind===`self-modification-mount`)throw Error(i.reason);if(i.kind===`needs-terminal`){let t=handoffMessage({address:e,interactiveClient:n.interactiveClient,reason:i.reason,title:r.title});return{address:e,reason:i.reason,status:`needs-terminal`,title:r.title,...t}}let a=await withSelfModificationWorkspaceLock(`local:${n.appRoot}`,async()=>n.withSuspendedSource(()=>runEveAdd({address:e,appRoot:n.appRoot,signal:t.signal,spawn:t.spawn})));if(a.kind===`blocked`){let t=handoffMessage({address:e,interactiveClient:n.interactiveClient,reason:a.message,title:r.title});return{address:e,reason:a.message,status:`needs-terminal`,title:r.title,...t}}if(a.kind===`failed`)return a.changed===void 0?{address:e,status:`failed`,title:r.title,reason:a.message,message:a.message}:{address:e,status:`failed`,title:r.title,reason:a.message,message:a.message,changed:a.changed};let o=unsetEnvVars(r);return{address:e,envVars:[...o],message:o.length===0?`Installed ${r.title}.`:`Installed ${r.title}. It will not work until ${o.join(`, `)} ${o.length===1?`is`:`are`} set.`,status:`installed`,title:r.title}}async function addProductionRegistryItem(e,t,n,r){assertOfficialRegistryAddress(e);let i=(await loadRegistryIndex({nowMs:Date.now(),signal:t.abortSignal,url:officialRegistryIndexUrl()})).find(t=>t.address===e);if(i===void 0)throw Error(`No official eve registry item is published at "${e}".`);let a=classifyCatalogEntry(i);if(a.kind===`self-modification-mount`)throw Error(a.reason);let o=await t.getSandbox(),s=await withSelfModificationWorkspaceLock(`sandbox:${t.session.id}`,async()=>{let i=await readPreparedSelfModificationWorkspace({...n,sandbox:o});return await installProductionRegistryItem({address:e,answers:r.answers,installed:r.installed,sandbox:o,signal:t.abortSignal,workspace:i})});return s.kind===`completed`?{address:e,...s,status:`completed`}:s.kind===`input-required`?{address:e,...s,status:`input-required`}:s.kind===`external-action-required`?{address:e,...s,status:`external-action-required`}:{address:e,...s,status:s.kind}}function localRegistryAddTool(){return defineTool({description:`Install an item from the configured eve registry into this project. Items that need setup are handed to the local setup flow instead. Search first, then call this with the exact item address.`,inputSchema:localInputSchema,outputSchema:localOutputSchema,async execute(e,t){let{address:n}=e;if(typeof n!=`string`||n.length===0)throw Error(`address must be an exact item address from the configured eve registry.`);return await addLocalRegistryItem(n,{signal:t.abortSignal})}})}function productionRegistryAddTool(e){return defineTool({description:`Install an exact item from the official eve registry into the current production change proposal. If setup pauses, call this tool again with the non-secret answers and the installed state from its result. External authorization and secret binding must be completed by the developer.`,inputSchema:productionInputSchema,outputSchema:productionOutputSchema,async execute(t,n){let{address:r}=t;if(typeof r!=`string`||r.length===0)throw Error(`address must be an exact item address from the official eve registry.`);return await addProductionRegistryItem(r,n,e,{answers:`answers`in t&&typeof t.answers==`object`&&t.answers!==null&&!Array.isArray(t.answers)?t.answers:void 0,installed:`installed`in t&&t.installed===!0})}})}function resolveRegistryAddTool(e){let t=resolveSelfModificationMode(e);return t===`local`?localRegistryAddTool():t===`deployed`&&e.deployed!==void 0?productionRegistryAddTool(e.deployed):null}var registry_add_default=defineDynamic({events:{"session.started":()=>resolveRegistryAddTool(resolveSelfModificationConfig(extension_default.config))}});export{addLocalRegistryItem,registry_add_default as default,handoffMessage,resolveRegistryAddTool,unsetEnvVars};
1
+ import{classifyCatalogEntry}from"../../../classify-registry-item.js";import{runEveAdd}from"../../../eve-add.js";import{defineLocalOnlyDynamic,resolveLocalOnly}from"../../../local-only.js";import{withSelfModificationWorkspaceLock}from"../../../../workspace-lock.js";import{loadRegistryIndex,resolveRegistryIndexUrl}from"./search_registry.js";import{defineTool}from"eve/tools";import{getLocalDevCapability}from"eve/local-dev";const localInputSchema={type:`object`,additionalProperties:!1,properties:{address:{type:`string`,minLength:1,maxLength:200,description:"Exact address of an item in the configured eve registry, for example `channel/slack` or `extension/browserbase`."}},required:[`address`]},localOutputSchema={type:`object`,additionalProperties:!1,properties:{status:{type:`string`,enum:[`installed`,`needs-terminal`,`failed`]},address:{type:`string`},title:{type:`string`},envVars:{type:`array`,items:{type:`string`},description:`Environment variables the item needs that are not set. The item is installed but will not work until the developer sets them. Never ask for or repeat their values.`},reason:{type:`string`,description:`Why the item was not installed here.`},changed:{type:`array`,items:{type:`string`},description:`Project-relative paths a failed install could not restore.`},nextCommand:{type:`string`,description:"The command that completes a `needs-terminal` item."},message:{type:`string`,description:`One-line summary to relay to the developer.`}},required:[`status`,`address`,`message`]};function unsetEnvVars(e,t=process.env){return(e.envVars??[]).filter(e=>{let n=t[e];return n===void 0||n===``})}function handoffMessage(e){if(e.interactiveClient)return{message:`${e.title} was not installed by this tool. ${e.reason} Continue in the setup panel that opens here; do not ask the developer to run another command.`};let t=`eve add ${e.address}`;return{message:`${e.title} was not installed. ${e.reason} Run \`${t}\` in a terminal to finish it.`,nextCommand:t}}async function addLocalRegistryItem(e,t={}){let n=(t.getCapability??getLocalDevCapability)();if(n===void 0)throw Error("Registry items can only be installed while `eve dev` is running. Report the item address to the developer instead of installing it.");let r=(await loadRegistryIndex({nowMs:Date.now(),signal:t.signal,url:resolveRegistryIndexUrl()})).find(t=>t.address===e);if(r===void 0)throw Error(`No item in the configured eve registry is published at "${e}". Check the address before trying again.`);let i=classifyCatalogEntry(r);if(i.kind===`self-modification-mount`)throw Error(i.reason);if(i.kind===`needs-terminal`){let t=handoffMessage({address:e,interactiveClient:n.interactiveClient,reason:i.reason,title:r.title});return{address:e,reason:i.reason,status:`needs-terminal`,title:r.title,...t}}let a=await withSelfModificationWorkspaceLock(`local:${n.appRoot}`,async()=>n.withSuspendedSource(()=>runEveAdd({address:e,appRoot:n.appRoot,signal:t.signal,spawn:t.spawn})));if(a.kind===`blocked`){let t=handoffMessage({address:e,interactiveClient:n.interactiveClient,reason:a.message,title:r.title});return{address:e,reason:a.message,status:`needs-terminal`,title:r.title,...t}}if(a.kind===`failed`)return a.changed===void 0?{address:e,status:`failed`,title:r.title,reason:a.message,message:a.message}:{address:e,status:`failed`,title:r.title,reason:a.message,message:a.message,changed:a.changed};let o=unsetEnvVars(r);return{address:e,envVars:[...o],message:o.length===0?`Installed ${r.title}.`:`Installed ${r.title}. It will not work until ${o.join(`, `)} ${o.length===1?`is`:`are`} set.`,status:`installed`,title:r.title}}function localRegistryAddTool(){return defineTool({description:`Install an item from the configured eve registry into this project. Items that need setup are handed to the local setup flow instead. Search first, then call this with the exact item address.`,inputSchema:localInputSchema,outputSchema:localOutputSchema,async execute(e,t){let{address:n}=e;if(typeof n!=`string`||n.length===0)throw Error(`address must be an exact item address from the configured eve registry.`);return await addLocalRegistryItem(n,{signal:t.abortSignal})}})}function resolveRegistryAddTool(e){return resolveLocalOnly(e,localRegistryAddTool())}var registry_add_default=defineLocalOnlyDynamic(localRegistryAddTool());export{addLocalRegistryItem,registry_add_default as default,handoffMessage,resolveRegistryAddTool,unsetEnvVars};
@@ -3,8 +3,7 @@ import type { SandboxNetworkPolicy } from "#shared/sandbox-network-policy.js";
3
3
  type NetworkPolicySandboxSession = SandboxSession & {
4
4
  setNetworkPolicy(policy: SandboxNetworkPolicy): Promise<void>;
5
5
  };
6
- import type { GitHubRepository } from "./config.js";
7
- export declare const SELF_MODIFICATION_CONFIG_PATH = "agent/extensions/self-modification/extension.ts";
6
+ import type { GitHubRepository } from "./remote/config.js";
8
7
  export declare const REPOSITORY_PATH = "/workspace/repository";
9
8
  export interface PreparedSelfModificationWorkspace {
10
9
  readonly baseSha: string;
@@ -1 +1 @@
1
- import{assertFullSha,assertGitRef}from"./identifiers.js";import{gitOutput,runGitCommand,withBrokeredGitHubCredential}from"./git.js";import{shellQuote}from"#shared/shell-quote.js";import{gitHubRemoteUrl}from"#shared/git.js";const SELF_MODIFICATION_CONFIG_PATH=`agent/extensions/self-modification/extension.ts`,REPOSITORY_PATH=`/workspace/repository`,BASE_REF=`refs/eve-self-modification/base`;async function prepareSelfModificationWorkspace(e){assertGitRef(e.targetBranch,`target branch`);let t=gitHubRemoteUrl(e.repository);await withBrokeredGitHubCredential(e.sandbox,e.token,async()=>{await run(e.sandbox,`rm -rf ${quote(REPOSITORY_PATH)} && mkdir -p ${quote(REPOSITORY_PATH)}`),await run(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} init`),await run(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} remote add origin ${quote(t)}`),await run(e.sandbox,`GIT_CONFIG_NOSYSTEM=1 GIT_CONFIG_GLOBAL=/dev/null GIT_LFS_SKIP_SMUDGE=1 GIT_TERMINAL_PROMPT=0 git -C ${quote(REPOSITORY_PATH)} fetch --no-tags origin ${quote(`refs/heads/${e.targetBranch}`)}`),await run(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} update-ref ${BASE_REF} FETCH_HEAD`),await run(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} checkout --detach ${BASE_REF}`)});let n=await gitOutput(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} rev-parse ${BASE_REF}`);return assertFullSha(n,`target branch revision`),await verifyApplicationRoot(e.sandbox,e.directory),{baseSha:n,directory:e.directory,repository:e.repository,repositoryPath:REPOSITORY_PATH,targetBranch:e.targetBranch}}async function readPreparedSelfModificationWorkspace(e){let t=await gitOutput(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} rev-parse ${BASE_REF}`);return assertFullSha(t,`target branch revision`),await verifyApplicationRoot(e.sandbox,e.directory),{baseSha:t,directory:e.directory,repository:e.repository,repositoryPath:REPOSITORY_PATH,targetBranch:e.targetBranch}}async function verifyApplicationRoot(e,t){let n=t===`.`?REPOSITORY_PATH:`${REPOSITORY_PATH}/${t}`;if((await e.run({command:`test -d ${quote(`${n}/agent`)}`})).exitCode!==0)throw Error(`Self-modification source directory does not contain agent/: ${t}`)}function quote(e){return shellQuote(e)}async function run(e,t){await runGitCommand(e,t)}export{REPOSITORY_PATH,SELF_MODIFICATION_CONFIG_PATH,prepareSelfModificationWorkspace,readPreparedSelfModificationWorkspace};
1
+ import{gitOutput,runGitCommand,withBrokeredGitHubCredential}from"./git.js";import{assertFullSha,assertGitRef}from"./identifiers.js";import{shellQuote}from"#shared/shell-quote.js";import{gitHubRemoteUrl}from"#shared/git.js";const REPOSITORY_PATH=`/workspace/repository`,BASE_REF=`refs/eve-self-modification/base`;async function prepareSelfModificationWorkspace(e){assertGitRef(e.targetBranch,`target branch`);let t=gitHubRemoteUrl(e.repository);await withBrokeredGitHubCredential(e.sandbox,e.token,async()=>{await run(e.sandbox,`rm -rf ${quote(REPOSITORY_PATH)} && mkdir -p ${quote(REPOSITORY_PATH)}`),await run(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} init`),await run(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} remote add origin ${quote(t)}`),await run(e.sandbox,`GIT_CONFIG_NOSYSTEM=1 GIT_CONFIG_GLOBAL=/dev/null GIT_LFS_SKIP_SMUDGE=1 GIT_TERMINAL_PROMPT=0 git -C ${quote(REPOSITORY_PATH)} fetch --no-tags origin ${quote(`refs/heads/${e.targetBranch}`)}`),await run(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} update-ref ${BASE_REF} FETCH_HEAD`),await run(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} checkout --detach ${BASE_REF}`)});let n=await gitOutput(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} rev-parse ${BASE_REF}`);return assertFullSha(n,`target branch revision`),await verifyApplicationRoot(e.sandbox,e.directory),{baseSha:n,directory:e.directory,repository:e.repository,repositoryPath:REPOSITORY_PATH,targetBranch:e.targetBranch}}async function readPreparedSelfModificationWorkspace(e){let t=await gitOutput(e.sandbox,`git -C ${quote(REPOSITORY_PATH)} rev-parse ${BASE_REF}`);return assertFullSha(t,`target branch revision`),await verifyApplicationRoot(e.sandbox,e.directory),{baseSha:t,directory:e.directory,repository:e.repository,repositoryPath:REPOSITORY_PATH,targetBranch:e.targetBranch}}async function verifyApplicationRoot(e,t){let n=t===`.`?REPOSITORY_PATH:`${REPOSITORY_PATH}/${t}`;if((await e.run({command:`test -d ${quote(`${n}/agent`)}`})).exitCode!==0)throw Error(`Self-modification source directory does not contain agent/: ${t}`)}function quote(e){return shellQuote(e)}async function run(e,t){await runGitCommand(e,t)}export{REPOSITORY_PATH,prepareSelfModificationWorkspace,readPreparedSelfModificationWorkspace};
@@ -1,4 +1,4 @@
1
- import type { GitHubCredentialProvider } from "./config.js";
1
+ import type { GitHubCredentialProvider } from "./remote/config.js";
2
2
  import type { PreparedSelfModificationWorkspace } from "./git-workspace.js";
3
3
  import { captureSelfModificationProposal } from "./proposal.js";
4
4
  export interface PublishedSelfModificationProposal {
@@ -1,5 +1,5 @@
1
1
  import type { ResolvedSelfModificationConfig } from "./config.js";
2
- type SelfModificationMode = "local" | "disabled" | "deployed";
3
- /** Resolves the mutually exclusive local or deployed editing mode. */
4
- export declare function resolveSelfModificationMode(config: ResolvedSelfModificationConfig): SelfModificationMode;
5
- export {};
2
+ /** Local self-modification runs only inside the development runtime. */
3
+ export declare function isLocalSelfModificationEnabled(config: ResolvedSelfModificationConfig): boolean;
4
+ /** Deployed self-modification is offered only outside the development runtime. */
5
+ export declare function isDeployedRuntime(): boolean;
@@ -1 +1 @@
1
- function resolveSelfModificationMode(e){return process.env.EVE_DEV===`1`?e.localEnabled?`local`:`disabled`:e.deployed===void 0?`disabled`:`deployed`}export{resolveSelfModificationMode};
1
+ function isLocalSelfModificationEnabled(e){return process.env.EVE_DEV===`1`&&e.localEnabled}function isDeployedRuntime(){return process.env.EVE_DEV!==`1`}export{isDeployedRuntime,isLocalSelfModificationEnabled};
@@ -1,2 +1,2 @@
1
- import{assertFullSha}from"./identifiers.js";import{gitOutput,runGitCommand}from"./git.js";import{createHash}from"node:crypto";import{shellQuote}from"#shared/shell-quote.js";const MAX_PROPOSAL_CHANGED_BYTES=1e6;async function captureSelfModificationProposal(e){let t=quote(e.workspace.repositoryPath);assertFullSha(e.workspace.baseSha,`proposal base revision`),await runGitCommand(e.sandbox,`git -C ${t} add -A -- .`);let n=await gitOutput(e.sandbox,`git -C ${t} write-tree`),r=await gitOutput(e.sandbox,`git -C ${t} rev-parse ${quote(`${e.workspace.baseSha}^{tree}`)}`);assertFullSha(n,`proposal tree`),assertFullSha(r,`proposal base tree`);let i=parseRawDiff(await gitOutput(e.sandbox,`git -C ${t} diff-tree -r --no-commit-id --raw -z --no-renames ${quote(e.workspace.baseSha)} ${quote(n)}`,!1));if(i.length===0)throw Error(`Self-modification proposal contains no changes.`);if(i.length>100)throw Error(`Self-modification proposal changes ${i.length} files; limit is 100.`);let a=await selfModificationMountPaths({directory:e.workspace.directory,repositoryPath:e.workspace.repositoryPath,sandbox:e.sandbox,tree:e.workspace.baseSha}),o=await selfModificationMountPaths({directory:e.workspace.directory,repositoryPath:e.workspace.repositoryPath,sandbox:e.sandbox,tree:n}),s=[...new Set([...a,...o])],c=[],l=0;for(let t of i){let n=t.status===`D`?null:proposalMode(t.newMode,t.path),r=t.status===`D`?null:t.newObjectId;assertAllowedChange({mode:n,objectId:r,path:t.path},e.workspace.directory,s);let i=r===null?0:await blobSize(e.sandbox,e.workspace.repositoryPath,r);if(l+=i,l>MAX_PROPOSAL_CHANGED_BYTES)throw Error(`Self-modification proposal changes more than ${MAX_PROPOSAL_CHANGED_BYTES} bytes.`);c.push({bytes:i,kind:t.status===`A`?`add`:t.status===`D`?`delete`:`modify`,mode:n,objectId:r,path:t.path})}return{baseSha:e.workspace.baseSha,baseTreeSha:r,changedBytes:l,changes:c,proposedTreeSha:n}}async function readProposalBlob(e){if(e.change.objectId===null)throw Error(`Cannot read a deleted proposal blob.`);let t=await gitOutput(e.sandbox,`git -C ${quote(e.workspace.repositoryPath)} cat-file blob ${quote(e.change.objectId)} | base64 | tr -d '\\n'`),n=Buffer.from(t,`base64`),r=createHash(`sha1`).update(`blob ${n.byteLength}\0`).update(n).digest(`hex`);if(n.byteLength!==e.change.bytes||r!==e.change.objectId.toLowerCase())throw Error(`Self-modification proposal blob changed after validation: ${JSON.stringify(e.change.path)}.`);return t}function parseRawDiff(e){if(e.length===0)return[];let t=e.split(`\0`);if(t.at(-1)===``&&t.pop(),t.length%2!=0)throw Error(`Git returned malformed raw diff output.`);let n=[];for(let e=0;e<t.length;e+=2){let r=t[e],i=t[e+1],a=r===void 0?null:/^:[0-7]{6} ([0-7]{6}) [a-f0-9]{40} ([a-f0-9]{40}) ([ADM])$/u.exec(r);if(a===null||i===void 0||!isSafePath(i))throw Error(`Git returned malformed raw diff output.`);n.push({newMode:a[1],newObjectId:a[2],path:i,status:a[3]})}return n}function assertAllowedChange(e,t,n=[]){let r=e.path,i=t===`.`?``:`${t}/`,a=`${i}agent/`,o=r.split(`/`),s=o.at(-1)??``;if(!isSafePath(r)||o.includes(`.git`)||s===`.env`||s===`.envrc`||s.startsWith(`.env.`)||o.some(e=>[`node_modules`,`dist`,`build`,`.next`,`.output`,`.turbo`,`.vercel`,`coverage`,`out`].includes(e))||r.startsWith(`.github/workflows/`)||r.startsWith(`${a}subagents/self-modification/`)||r.startsWith(`${a}extensions/self-modification/`)||r===`${i}agent/extensions/self-modification.ts`||n.some(e=>r===e||r.startsWith(`${e}/`))||r===`${i}agent/extensions/selfmod.ts`||r===`${i}agent/self-modification.config.ts`)throw Error(`Self-modification proposal changes a protected path: ${JSON.stringify(r)}.`)}async function selfModificationMountPaths(e){let t=`${e.directory===`.`?``:`${e.directory}/`}agent/extensions`,n=await gitOutput(e.sandbox,`git -C ${quote(e.repositoryPath)} grep -l -z -F -- "eve/self-modification" ${quote(e.tree)} -- ${quote(t)}`,!1).catch(e=>{if(e instanceof Error&&e.message.includes(`failed with exit 1:`))return``;throw e});return[...new Set(n.split(`\0`).filter(Boolean).flatMap(e=>{let n=e.slice(e.indexOf(`:`)+1);if(!n.startsWith(`${t}/`))return[];let r=n.slice(t.length+1);return r.endsWith(`/extension.ts`)?[`${t}/${r.slice(0,-13)}`]:r.includes(`/`)?[`${t}/${r.split(`/`)[0]}`]:[n]}))]}function isSafePath(e){return e.length>0&&!e.startsWith(`/`)&&!e.includes(`\\`)&&!e.includes(`
1
+ import{gitOutput,runGitCommand}from"./git.js";import{assertFullSha}from"./identifiers.js";import{createHash}from"node:crypto";import{shellQuote}from"#shared/shell-quote.js";const MAX_PROPOSAL_CHANGED_BYTES=1e6;async function captureSelfModificationProposal(e){let t=quote(e.workspace.repositoryPath);assertFullSha(e.workspace.baseSha,`proposal base revision`),await runGitCommand(e.sandbox,`git -C ${t} add -A -- .`);let n=await gitOutput(e.sandbox,`git -C ${t} write-tree`),r=await gitOutput(e.sandbox,`git -C ${t} rev-parse ${quote(`${e.workspace.baseSha}^{tree}`)}`);assertFullSha(n,`proposal tree`),assertFullSha(r,`proposal base tree`);let i=parseRawDiff(await gitOutput(e.sandbox,`git -C ${t} diff-tree -r --no-commit-id --raw -z --no-renames ${quote(e.workspace.baseSha)} ${quote(n)}`,!1));if(i.length===0)throw Error(`Self-modification proposal contains no changes.`);if(i.length>100)throw Error(`Self-modification proposal changes ${i.length} files; limit is 100.`);let a=await selfModificationMountPaths({directory:e.workspace.directory,repositoryPath:e.workspace.repositoryPath,sandbox:e.sandbox,tree:e.workspace.baseSha}),o=await selfModificationMountPaths({directory:e.workspace.directory,repositoryPath:e.workspace.repositoryPath,sandbox:e.sandbox,tree:n}),s=[...new Set([...a,...o])],c=[],l=0;for(let t of i){let n=t.status===`D`?null:proposalMode(t.newMode,t.path),r=t.status===`D`?null:t.newObjectId;assertAllowedChange({mode:n,objectId:r,path:t.path},e.workspace.directory,s);let i=r===null?0:await blobSize(e.sandbox,e.workspace.repositoryPath,r);if(l+=i,l>MAX_PROPOSAL_CHANGED_BYTES)throw Error(`Self-modification proposal changes more than ${MAX_PROPOSAL_CHANGED_BYTES} bytes.`);c.push({bytes:i,kind:t.status===`A`?`add`:t.status===`D`?`delete`:`modify`,mode:n,objectId:r,path:t.path})}return{baseSha:e.workspace.baseSha,baseTreeSha:r,changedBytes:l,changes:c,proposedTreeSha:n}}async function readProposalBlob(e){if(e.change.objectId===null)throw Error(`Cannot read a deleted proposal blob.`);let t=await gitOutput(e.sandbox,`git -C ${quote(e.workspace.repositoryPath)} cat-file blob ${quote(e.change.objectId)} | base64 | tr -d '\\n'`),n=Buffer.from(t,`base64`),r=createHash(`sha1`).update(`blob ${n.byteLength}\0`).update(n).digest(`hex`);if(n.byteLength!==e.change.bytes||r!==e.change.objectId.toLowerCase())throw Error(`Self-modification proposal blob changed after validation: ${JSON.stringify(e.change.path)}.`);return t}function parseRawDiff(e){if(e.length===0)return[];let t=e.split(`\0`);if(t.at(-1)===``&&t.pop(),t.length%2!=0)throw Error(`Git returned malformed raw diff output.`);let n=[];for(let e=0;e<t.length;e+=2){let r=t[e],i=t[e+1],a=r===void 0?null:/^:[0-7]{6} ([0-7]{6}) [a-f0-9]{40} ([a-f0-9]{40}) ([ADM])$/u.exec(r);if(a===null||i===void 0||!isSafePath(i))throw Error(`Git returned malformed raw diff output.`);n.push({newMode:a[1],newObjectId:a[2],path:i,status:a[3]})}return n}function assertAllowedChange(e,t,n=[]){let r=e.path,i=t===`.`?``:`${t}/`,a=`${i}agent/`,o=r.split(`/`),s=o.at(-1)??``;if(!isSafePath(r)||o.includes(`.git`)||s===`.env`||s===`.envrc`||s.startsWith(`.env.`)||o.some(e=>[`node_modules`,`dist`,`build`,`.next`,`.output`,`.turbo`,`.vercel`,`coverage`,`out`].includes(e))||r.startsWith(`.github/workflows/`)||r.startsWith(`${a}subagents/self-modification/`)||r.startsWith(`${a}extensions/self-modification/`)||r===`${i}agent/extensions/self-modification.ts`||n.some(e=>r===e||r.startsWith(`${e}/`))||r===`${i}agent/extensions/selfmod.ts`||r===`${i}agent/self-modification.config.ts`)throw Error(`Self-modification proposal changes a protected path: ${JSON.stringify(r)}.`)}async function selfModificationMountPaths(e){let t=`${e.directory===`.`?``:`${e.directory}/`}agent/extensions`,n=await gitOutput(e.sandbox,`git -C ${quote(e.repositoryPath)} grep -l -z -F -- "eve/self-modification" ${quote(e.tree)} -- ${quote(t)}`,!1).catch(e=>{if(e instanceof Error&&e.message.includes(`failed with exit 1:`))return``;throw e});return[...new Set(n.split(`\0`).filter(Boolean).flatMap(e=>{let n=e.slice(e.indexOf(`:`)+1);if(!n.startsWith(`${t}/`))return[];let r=n.slice(t.length+1);return r.endsWith(`/extension.ts`)?[`${t}/${r.slice(0,-13)}`]:r.includes(`/`)?[`${t}/${r.split(`/`)[0]}`]:[n]}))]}function isSafePath(e){return e.length>0&&!e.startsWith(`/`)&&!e.includes(`\\`)&&!e.includes(`
2
2
  `)&&!e.includes(`\r`)&&!e.split(`/`).some(e=>e===``||e===`.`||e===`..`)}function proposalMode(e,t){if(e===`100644`||e===`100755`)return e;throw Error(`Self-modification proposal uses unsafe Git mode ${e}: ${JSON.stringify(t)}.`)}async function blobSize(e,t,n){assertFullSha(n,`proposal blob`);let r=await gitOutput(e,`git -C ${quote(t)} cat-file -s ${quote(n)}`);if(!/^\d+$/u.test(r)||!Number.isSafeInteger(Number(r)))throw Error(`Git returned an invalid blob size.`);return Number(r)}function quote(e){return shellQuote(e)}export{assertAllowedChange,captureSelfModificationProposal,parseRawDiff,readProposalBlob};
@@ -0,0 +1,20 @@
1
+ import { z } from "#compiled/zod/index.js";
2
+ import type { AgentReasoningDefinition, AgentStaticModelDefinition } from "#public/index.js";
3
+ import type { GitHubCredentialProvider, SelfModificationAuthorization } from "./config.js";
4
+ export declare const deployedSelfModificationConfigSchema: z.ZodObject<{
5
+ model: z.ZodOptional<z.ZodCustom<AgentStaticModelDefinition, AgentStaticModelDefinition>>;
6
+ reasoning: z.ZodOptional<z.ZodCustom<AgentReasoningDefinition, AgentReasoningDefinition>>;
7
+ credentials: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
8
+ pat: z.ZodLiteral<true>;
9
+ }, z.core.$strip>, z.ZodCustom<GitHubCredentialProvider, GitHubCredentialProvider>]>>;
10
+ source: z.ZodObject<{
11
+ git: z.ZodObject<{
12
+ directory: z.ZodString;
13
+ repository: z.ZodString;
14
+ }, z.core.$strip>;
15
+ }, z.core.$strip>;
16
+ target: z.ZodObject<{
17
+ branch: z.ZodString;
18
+ }, z.core.$strip>;
19
+ authorize: z.ZodCustom<SelfModificationAuthorization, SelfModificationAuthorization>;
20
+ }, z.core.$strict>;
@@ -0,0 +1 @@
1
+ import{z}from"#compiled/zod/index.js";import{isAgentReasoningDefinition,isRuntimeLanguageModel}from"#internal/runtime-model.js";const deployedSelfModificationConfigSchema=z.object({model:z.custom(e=>typeof e==`string`||isRuntimeLanguageModel(e)).optional(),reasoning:z.custom(isAgentReasoningDefinition).optional(),credentials:z.union([z.object({pat:z.literal(!0)}),z.custom(e=>typeof e==`object`&&!!e&&`resolve`in e&&typeof e.resolve==`function`)]).optional(),source:z.object({git:z.object({directory:z.string(),repository:z.string()})}),target:z.object({branch:z.string()}),authorize:z.custom(e=>typeof e==`function`)}).strict();export{deployedSelfModificationConfigSchema};
@@ -0,0 +1,66 @@
1
+ import type { SessionAuthContext } from "#channel/types.js";
2
+ import type { AgentReasoningDefinition, AgentStaticModelDefinition } from "#public/index.js";
3
+ /** Principal and channel that requested a deployed source modification. */
4
+ export interface SelfModificationAuthorizationContext {
5
+ readonly channel: {
6
+ /** Channel adapter family, such as `"slack"` or `"http"`. */
7
+ readonly kind?: string;
8
+ readonly metadata?: Readonly<Record<string, unknown>>;
9
+ };
10
+ readonly principal: SessionAuthContext | null;
11
+ }
12
+ /** Decides whether a principal may use deployed self-modification. */
13
+ export type SelfModificationAuthorization = (context: SelfModificationAuthorizationContext) => boolean | Promise<boolean>;
14
+ export interface GitHubRepository {
15
+ readonly owner: string;
16
+ readonly repo: string;
17
+ }
18
+ export type GitHubCredentialCapability = "checkout" | "publish";
19
+ export interface GitHubCredentialRequest {
20
+ readonly capability: GitHubCredentialCapability;
21
+ readonly repository: GitHubRepository;
22
+ }
23
+ /** Application-supplied GitHub credentials for deployed self-modification. */
24
+ export interface GitHubCredentialProvider {
25
+ resolve(request: GitHubCredentialRequest): Promise<string>;
26
+ }
27
+ /** Values accepted by the `eve/self-modification/remote` extension mount. */
28
+ export interface DeployedSelfModificationConfig {
29
+ readonly source: {
30
+ readonly git: {
31
+ /** GitHub repository in github.com/owner/repository form. */
32
+ readonly repository: string;
33
+ /** Application directory relative to the repository root. */
34
+ readonly directory: string;
35
+ };
36
+ };
37
+ readonly target: {
38
+ readonly branch: string;
39
+ };
40
+ /** Fail-closed policy for principals that may create draft proposals. */
41
+ readonly authorize: SelfModificationAuthorization;
42
+ readonly credentials?: GitHubCredentialProvider | {
43
+ /**
44
+ * Self-hosted exception. Reads `EVE_SELF_MODIFICATION_GITHUB_TOKEN` from
45
+ * the trusted deployment environment; never injects it into the sandbox.
46
+ */
47
+ readonly pat: true;
48
+ };
49
+ /** Model used by the deployed self-modification subagent; defaults to the parent model. */
50
+ readonly model?: AgentStaticModelDefinition;
51
+ readonly reasoning?: AgentReasoningDefinition;
52
+ }
53
+ export interface ResolvedDeployedSelfModificationConfig {
54
+ readonly authorize: SelfModificationAuthorization;
55
+ readonly credentials: ResolvedGitHubCredentials;
56
+ readonly directory: string;
57
+ readonly repository: GitHubRepository;
58
+ readonly targetBranch: string;
59
+ }
60
+ export type ResolvedGitHubCredentials = {
61
+ readonly kind: "pat";
62
+ } | {
63
+ readonly kind: "provider";
64
+ readonly provider: GitHubCredentialProvider;
65
+ };
66
+ export declare function resolveDeployedSelfModificationConfig(config: DeployedSelfModificationConfig): ResolvedDeployedSelfModificationConfig;
@@ -0,0 +1 @@
1
+ import{assertGitRef,assertRepositoryPart}from"../identifiers.js";function resolveDeployedSelfModificationConfig(e){if(!isRecord(e))throw Error(`Deployed self-modification configuration must be an object.`);let{source:t,target:n,authorize:r,credentials:i}=e;if(t===void 0||n===void 0||r===void 0)throw Error(`Deployed self-modification requires source, target, and authorization configuration.`);if(!isRecord(t))throw Error(`Deployed self-modification source must be an object.`);if(!isRecord(t.git))throw Error(`Deployed self-modification source.git must be an object.`);if(!isRecord(n))throw Error(`Deployed self-modification target must be an object.`);if(typeof r!=`function`)throw Error(`Deployed self-modification authorize must be a function.`);let{git:a}=t;if(typeof a.repository!=`string`||typeof a.directory!=`string`)throw Error(`Deployed self-modification source.git.repository and source.git.directory must be strings.`);if(typeof n.branch!=`string`)throw Error(`Deployed self-modification target.branch must be a string.`);return{authorize:r,credentials:parseCredentials(i),directory:parseDirectory(a.directory),repository:parseGitHubRepository(a.repository),targetBranch:parseBranch(n.branch)}}function parseCredentials(e){if(!isRecord(e))throw Error(`Deployed self-modification credentials must explicitly configure a credential provider or the self-hosted PAT exception.`);let t=e.resolve!==void 0,n=e.pat!==void 0;if(t&&n)throw Error(`Deployed self-modification credentials must configure either a credential provider or pat, not both.`);if(n){if(e.pat!==!0)throw Error(`Deployed self-modification credentials.pat must be true.`);return{kind:`pat`}}if(!isGitHubCredentialProvider(e))throw Error(`Deployed self-modification credentials must be an object with a resolve function.`);return{kind:`provider`,provider:e}}function isGitHubCredentialProvider(e){return isRecord(e)&&typeof e.resolve==`function`}function parseGitHubRepository(e){let t=/^github\.com\/([^/]+)\/([^/]+)$/u.exec(e);if(t?.[1]===void 0||t[2]===void 0)throw Error(`Deployed self-modification source.git.repository must use github.com/owner/repo form.`);return assertRepositoryPart(t[1],`repository owner`),assertRepositoryPart(t[2],`repository name`),{owner:t[1],repo:t[2]}}function parseDirectory(e){if(e!==`.`&&(e.length===0||e.startsWith(`/`)||e.includes(`\\`)||e.split(`/`).some(e=>e===``||e===`.`||e===`..`)))throw Error(`Deployed self-modification source.git.directory must be a safe repository-relative path.`);return e}function parseBranch(e){if(assertGitRef(e,`target branch`),e.startsWith(`refs/`))throw Error(`Deployed self-modification target.branch must be a branch name, not a full Git ref.`);return e}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{resolveDeployedSelfModificationConfig};
@@ -0,0 +1,5 @@
1
+ import type { StandardSchemaV1 } from "#compiled/@standard-schema/spec/index.js";
2
+ import type { DeployedSelfModificationConfig } from "./config.js";
3
+ /** Deployed self-modification mount; independent of the local development extension. */
4
+ declare const _default: import("eve/extension").ExtensionHandle<StandardSchemaV1<DeployedSelfModificationConfig, DeployedSelfModificationConfig>>;
5
+ export default _default;
@@ -0,0 +1 @@
1
+ import{deployedSelfModificationConfigSchema}from"./config-schema.js";import{defineExtension}from"eve/extension";var extension_default=defineExtension({config:deployedSelfModificationConfigSchema});export{extension_default as default};
@@ -0,0 +1 @@
1
+ import{gitOutput,runGitCommand}from"../git.js";import{assertFullSha}from"../identifiers.js";import{readTerminalHeadlessEvent}from"../extension/eve-add.js";import{shellQuote}from"#shared/shell-quote.js";const OFFICIAL_ADDRESS=/^(?:(?:channel|connection|extension|instrumentation)\/)?[a-z0-9][a-z0-9._-]*$/u;function assertOfficialRegistryAddress(e){if(!OFFICIAL_ADDRESS.test(e))throw Error(`Production registry installation requires an exact official eve registry address.`)}async function installProductionRegistryItem(e){assertOfficialRegistryAddress(e.address);let t=e.workspace.directory===`.`?e.workspace.repositoryPath:`${e.workspace.repositoryPath}/${e.workspace.directory}`,n=await locatePackageManagerRoot(e.sandbox,t,e.workspace.repositoryPath,e.signal);if(n===void 0)return{kind:`failed`,message:`The proposal checkout has no supported lockfile.`};if(!await runChecked(e.sandbox,`mkdir -p ${quote(`${e.workspace.repositoryPath}/.git/info`)} && printf '\\nnode_modules/\\n**/node_modules/\\n' >> ${quote(`${e.workspace.repositoryPath}/.git/info/exclude`)}`,e.signal)||!await runChecked(e.sandbox,bootstrapCommand(n),e.signal))return{kind:`failed`,message:`Could not prepare the proposal checkout's locked dependencies.`};let r=await locateEveExecutable(e.sandbox,t,n.root,e.signal);if(r===void 0)return{kind:`failed`,message:`The proposal checkout's locked dependencies do not provide the eve CLI.`};let i=await captureTree(e.sandbox,e.workspace.repositoryPath);if(e.answers!==void 0){if(e.installed!==!0)return{kind:`failed`,message:`Setup answers require a prior installed input-required result.`};let n;try{n=await e.sandbox.run({abortSignal:e.signal,command:isolatedCommand(t,`${quote(r)} add ${quote(e.address)} --non-interactive --skip-install`)})}finally{await restoreTree(e.sandbox,e.workspace.repositoryPath,i)}let a=readTerminalHeadlessEvent(`${String(n.stdout??``)}\n${String(n.stderr??``)}`);if(a?.type!==`blocked`||a.item!==e.address)return{kind:`failed`,message:`Setup continuation is no longer waiting for a validated question.`};let o=setupQuestion(a.question);if(o===void 0)return{kind:`failed`,message:`Registry setup returned an invalid continuation question.`};if(o.kind===`environment`)return{kind:`input-required`,installed:!0,question:a.question};if(!acceptsNonSecretSetupAnswers(o,e.answers))return{kind:`failed`,message:`Setup answers must contain only the current non-secret question.`}}let a=Object.entries(e.answers??{}).flatMap(([e,t])=>[`--answer`,`${e}=${JSON.stringify(t)}`]);try{let n=`${quote(r)} add ${quote(e.address)} --non-interactive ${e.installed===!0?`--skip-install `:``}${a.map(quote).join(` `)}`,o=await e.sandbox.run({abortSignal:e.signal,command:isolatedCommand(t,n)}),s=readTerminalHeadlessEvent(`${String(o.stdout??``)}\n${String(o.stderr??``)}`);if(s?.type===`completed`&&s.item===e.address&&o.exitCode===0){let t=await captureTree(e.sandbox,e.workspace.repositoryPath);return{kind:`completed`,changedPaths:await changedPaths(e.sandbox,e.workspace.repositoryPath,i,t),completedItems:s.completedItems?.filter(e=>OFFICIAL_ADDRESS.test(e))??[],deploymentRequired:s.deploymentRequired===!0}}if(s?.type===`blocked`&&s.item===e.address)return{kind:`input-required`,installed:s.installed===!0,question:s.question??s};if(s?.type===`external_action`&&typeof s.url==`string`&&typeof s.message==`string`){let t={kind:`external-action-required`,installed:e.installed===!0,message:s.message,url:s.url};return typeof s.userCode==`string`&&(t.userCode=s.userCode),t}return await restoreTree(e.sandbox,e.workspace.repositoryPath,i),s?.type===`cancelled`||e.signal?.aborted===!0?{kind:`cancelled`,message:`Installing ${e.address} was cancelled.`}:{kind:`failed`,message:`Installing ${e.address} failed.`}}catch(t){throw await restoreTree(e.sandbox,e.workspace.repositoryPath,i),t}}function acceptsNonSecretSetupAnswers(e,t){return e.kind!==`environment`&&Object.keys(t).length===1&&t[e.key]!==void 0}function setupQuestion(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e;if(typeof t.key==`string`&&t.key.length!==0&&typeof t.kind==`string`)return{key:t.key,kind:t.sensitive===!0?`environment`:t.kind}}async function locatePackageManagerRoot(e,t,n,r){let i=await e.run({abortSignal:r,command:`root=${quote(t)}; repository=${quote(n)}; while :; do if test -f "$root/pnpm-lock.yaml"; then printf 'pnpm\\t%s' "$root"; exit 0; fi; if test -f "$root/package-lock.json"; then printf 'npm\\t%s' "$root"; exit 0; fi; test "$root" = "$repository" && exit 0; root=\${root%/*}; done`});if(i.exitCode!==0)throw Error(`Could not inspect the proposal package workspace.`);let a=/^(pnpm|npm)\t([^\n]+)$/u.exec(String(i.stdout??``));if(a===null)return;let o=a[2];if(o!==n&&!o.startsWith(`${n}/`))throw Error(`Package manager root escaped the proposal repository.`);return{kind:a[1],root:o}}function bootstrapCommand(e){return isolatedCommand(e.root,e.kind===`pnpm`?`corepack pnpm --dir ${quote(e.root)} install --frozen-lockfile --ignore-scripts`:`npm ci --prefix ${quote(e.root)} --ignore-scripts`)}async function locateEveExecutable(e,t,n,r){let i=[`${t}/node_modules/.bin/eve`,`${n}/node_modules/.bin/eve`],a=await e.run({abortSignal:r,command:`for executable in ${i.map(quote).join(` `)}; do if test -x "$executable"; then printf '%s' "$executable"; exit 0; fi; done`});if(a.exitCode!==0)throw Error(`Could not inspect the checkout's eve executable.`);return i.includes(String(a.stdout??``))?String(a.stdout):void 0}async function captureTree(e,t){await runGitCommand(e,`git -C ${quote(t)} add -A -- .`);let n=await gitOutput(e,`git -C ${quote(t)} write-tree`);return assertFullSha(n,`registry tree`),n}async function restoreTree(e,t,n){await runGitCommand(e,`git -C ${quote(t)} read-tree --reset -u ${quote(n)}`),await runGitCommand(e,`git -C ${quote(t)} clean -fd -- .`)}async function changedPaths(e,t,n,r){return(await gitOutput(e,`git -C ${quote(t)} diff-tree -r --no-commit-id --name-only -z ${quote(n)} ${quote(r)}`,!1)).split(`\0`).filter(e=>e.length>0)}async function runChecked(e,t,n){return(await e.run({abortSignal:n,command:t})).exitCode===0}function isolatedCommand(e,t){return`env -i HOME=/tmp/eve-selfmod-home PATH=/usr/local/bin:/usr/bin:/bin CI=1 npm_config_ignore_scripts=true sh -c ${quote(`cd ${quote(e)} && ${t}`)}`}function quote(e){return shellQuote(e)}export{acceptsNonSecretSetupAnswers,assertOfficialRegistryAddress,bootstrapCommand,installProductionRegistryItem,locatePackageManagerRoot};
@@ -0,0 +1,4 @@
1
+ import { type DynamicSentinel, type DynamicSubagentDefinition } from "eve";
2
+ /** Offers the deployed self-modification child only to authorized principals outside `eve dev`. */
3
+ declare const deployedSelfModificationAgent: DynamicSentinel<DynamicSubagentDefinition | null>;
4
+ export default deployedSelfModificationAgent;
@@ -0,0 +1 @@
1
+ import{hasGitHubCredential}from"../../../credentials.js";import{isDeployedRuntime}from"../../../mode.js";import{resolveDeployedSelfModificationConfig}from"../../config.js";import{followUpDelegation,namedInstallationDelegation,persistenceDelegation,renderDescription,repairDelegation,sourceDelegation}from"../../../subagent-guidance.js";import extension_default from"../../extension.js";import{DEFAULT_AGENT_MODEL_ID,DEFAULT_AGENT_REASONING}from"#shared/default-agent-model.js";import{defineAgent,defineDynamic}from"eve";const description=renderDescription([`Delegate here immediately when the user asks to change this eve agent or its authored source.`,sourceDelegation,persistenceDelegation,namedInstallationDelegation,`Delegate requests to add integrations, channels, connections, or capabilities: the subagent searches the official eve registry and can install source changes into the draft proposal. Setup may require non-secret answers or an external action, and secret binding remains separate.`,followUpDelegation,repairDelegation,`Source edits do not affect the caller’s current turn. The subagent can publish only a draft pull request, and changes become effective only after review, merge, and redeployment.`]),resolve=async(e,t)=>{if(!isDeployedRuntime())return null;let n=extension_default.config,r=resolveDeployedSelfModificationConfig(n);if(r.credentials.kind===`pat`&&!hasGitHubCredential())return null;try{if(!await r.authorize({channel:t.channel,principal:t.session.auth.current}))return null}catch{return null}let i=n.model??t.model?.id;return defineAgent({description,model:i??DEFAULT_AGENT_MODEL_ID,reasoning:n.reasoning??(i===void 0?DEFAULT_AGENT_REASONING:void 0)})},deployedSelfModificationAgent=defineDynamic({events:{"session.started":resolve,"turn.started":resolve}});export{deployedSelfModificationAgent as default};
@@ -0,0 +1,2 @@
1
+ declare const _default: import("eve/instructions").DynamicSentinel<import("eve/instructions").DynamicInstructionsResult>;
2
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import{isDeployedRuntime}from"../../../mode.js";import{documentationInstructions,registryWorkflowInstructions,renderInstructions,roleInstructions,sourceEditingInstructions,sourceWorkspaceInstructions,toolAuthoringInstructions,workingInstructions}from"../../../subagent-guidance.js";import{defineDynamic,defineInstructions}from"eve/instructions";var instructions_default=defineDynamic({events:{"session.started":()=>isDeployedRuntime()?defineInstructions({markdown:renderInstructions([roleInstructions,sourceWorkspaceInstructions,sourceEditingInstructions,toolAuthoringInstructions,registryWorkflowInstructions,documentationInstructions,"## Deployed environment\n\nThe registry_add tool may return `completed`, `input-required`, `external-action-required`, `cancelled`, or `failed`. Supply only non-secret structured answers when continuing an `input-required` setup; set `installed: true` so the continuation does not reinstall source. Never request, accept, or repeat secret values. External authorization and secret binding are incomplete follow-up boundaries, not evidence that an integration is active.\n\nThe configured target branch is checked out as a disposable workspace under /workspace/repository. Make ordinary changes through /source, which is the writable view of the configured application's agent/ directory. Publication validates the final repository snapshot, including registry, manifest, and lockfile changes. Never modify Git refs, access GitHub directly, or use shell commands to write files. The sandbox has no reusable GitHub credential after checkout.\n\nComplete all edits and registry installations before publication, and call publish by itself. Before publication, review and summarize the complete intended scope. Call publish once with a concise title and summary. A successful result is only a draft pull request. Return its URL and changed paths, and state that merge and deployment have not occurred.",workingInstructions,`## Report results
2
+
3
+ For source-modification tasks, return a concise handoff to the caller. Use at most four short bullets covering changed paths and behavior, and any required setup or unresolved issues. Include the draft pull request URL if one was published.
4
+
5
+ For investigation tasks, report the findings and supporting evidence requested by the caller.`])}):null}});export{instructions_default as default};
@@ -0,0 +1,2 @@
1
+ declare const _default: import("../../../../shared/sandbox-environment.ts").SandboxSelector;
2
+ export default _default;
@@ -0,0 +1 @@
1
+ import{defineDeployedSelfModificationSandbox}from"../../../deployed-sandbox.js";import extension_default from"../../extension.js";var sandbox_default=defineDeployedSelfModificationSandbox(extension_default.config);export{sandbox_default as default};
@@ -0,0 +1 @@
1
+ export { default } from "../../../../extension/subagents/agent/tools/edit_file.js";
@@ -0,0 +1 @@
1
+ import edit_file_default from"../../../../extension/subagents/agent/tools/edit_file.js";export{edit_file_default as default};
@@ -0,0 +1 @@
1
+ import{createGitHubCredentialProvider}from"../../../../credentials.js";import{readPreparedSelfModificationWorkspace}from"../../../../git-workspace.js";import{isDeployedRuntime}from"../../../../mode.js";import{resolveDeployedSelfModificationConfig}from"../../../config.js";import{withSelfModificationWorkspaceLock}from"../../../../workspace-lock.js";import{publishGitHubDraftPullRequest}from"../../../../github-publisher.js";import extension_default from"../../../extension.js";import{defineDynamic,defineTool}from"eve/tools";const inputSchema={type:`object`,additionalProperties:!1,properties:{summary:{type:`string`,minLength:1,maxLength:1e4,description:`Concise description of the proposed agent source change.`},title:{type:`string`,minLength:1,maxLength:256,description:`Concise draft pull request title.`}},required:[`summary`,`title`]},outputSchema={type:`object`,additionalProperties:!1,properties:{branch:{type:`string`},changedPaths:{type:`array`,items:{type:`string`}},commitSha:{type:`string`},deployed:{type:`boolean`,const:!1},draft:{type:`boolean`,const:!0},merged:{type:`boolean`,const:!1},pullRequestUrl:{type:`string`},repository:{type:`string`},targetBranch:{type:`string`}},required:[`branch`,`changedPaths`,`commitSha`,`deployed`,`draft`,`merged`,`pullRequestUrl`,`repository`,`targetBranch`]};function resolveTool(){return isDeployedRuntime()?defineTool({description:`Publish the complete validated agent source change as one draft pull request. Merge and deployment do not occur.`,inputSchema,outputSchema,execute:publish}):null}async function publish(e,t){if(typeof e!=`object`||!e||!(`summary`in e)||typeof e.summary!=`string`||e.summary.trim().length===0||!(`title`in e)||typeof e.title!=`string`||e.title.trim().length===0)throw Error(`Production publication requires a valid title and summary.`);if(!isDeployedRuntime())throw Error(`Production publication is unavailable during eve dev.`);let n=resolveDeployedSelfModificationConfig(extension_default.config),r=e.summary,i=e.title,a=publicationOperationId(t),o=await t.getSandbox();return await withSelfModificationWorkspaceLock(`sandbox:${t.session.id}`,async()=>{let e=await readPreparedSelfModificationWorkspace({...n,sandbox:o});return await publishGitHubDraftPullRequest({credentialProvider:createGitHubCredentialProvider(n.credentials),description:r,operationId:a,sandbox:o,title:i,workspace:e})})}function publicationOperationId(e){let t=e.session.parent;if(t===void 0)throw Error(`Production publication requires a delegated child session.`);return`${t.rootSessionId}:${t.sessionId}:${t.turn.id}:${t.callId}:${e.session.id}`}var publish_default=defineDynamic({events:{"session.started":resolveTool}});export{publish_default as default,publicationOperationId};
@@ -0,0 +1,32 @@
1
+ import { type ToolContext } from "eve/tools";
2
+ import { type ResolvedDeployedSelfModificationConfig } from "../../../config.js";
3
+ type ProductionRegistryAddResult = {
4
+ readonly address: string;
5
+ readonly status: "completed";
6
+ readonly completedItems: readonly string[];
7
+ readonly changedPaths: readonly string[];
8
+ readonly deploymentRequired: boolean;
9
+ } | {
10
+ readonly address: string;
11
+ readonly status: "input-required";
12
+ readonly installed: boolean;
13
+ readonly question: unknown;
14
+ } | {
15
+ readonly address: string;
16
+ readonly status: "external-action-required";
17
+ readonly installed: boolean;
18
+ readonly message: string;
19
+ readonly url: string;
20
+ readonly userCode?: string;
21
+ } | {
22
+ readonly address: string;
23
+ readonly status: "failed" | "cancelled";
24
+ readonly message: string;
25
+ };
26
+ export declare function productionRegistryAddTool(deployed: ResolvedDeployedSelfModificationConfig): import("eve/tools").ToolDefinition<Record<string, unknown>, ProductionRegistryAddResult> & {
27
+ execute(input: Record<string, unknown>, ctx: ToolContext): Promise<ProductionRegistryAddResult>;
28
+ };
29
+ declare const _default: import("eve/tools").DynamicSentinel<(import("eve/tools").ToolDefinition<Record<string, unknown>, ProductionRegistryAddResult> & {
30
+ execute(input: Record<string, unknown>, ctx: ToolContext): Promise<ProductionRegistryAddResult>;
31
+ }) | null>;
32
+ export default _default;
@@ -0,0 +1 @@
1
+ import{readPreparedSelfModificationWorkspace}from"../../../../git-workspace.js";import{isDeployedRuntime}from"../../../../mode.js";import{resolveDeployedSelfModificationConfig}from"../../../config.js";import{classifyCatalogEntry}from"../../../../extension/classify-registry-item.js";import{withSelfModificationWorkspaceLock}from"../../../../workspace-lock.js";import{loadRegistryIndex,officialRegistryIndexUrl}from"../../../../extension/subagents/agent/tools/search_registry.js";import extension_default from"../../../extension.js";import{assertOfficialRegistryAddress,installProductionRegistryItem}from"../../../production-registry-add.js";import{defineDynamic,defineTool}from"eve/tools";const productionInputSchema={type:`object`,additionalProperties:!1,properties:{address:{type:`string`,minLength:1,maxLength:200,description:"Exact official eve registry address, for example `channel/slack` or `extension/browserbase`."},answers:{type:`object`,additionalProperties:!0,description:`Non-secret answers to the setup question returned by the previous call.`},installed:{type:`boolean`,description:`Set to true with answers when the previous input-required result installed the source.`}},required:[`address`]},productionOutputSchema={type:`object`,additionalProperties:!1,properties:{status:{type:`string`,enum:[`completed`,`input-required`,`external-action-required`,`failed`,`cancelled`]},address:{type:`string`},changedPaths:{type:`array`,items:{type:`string`},description:`Repository-relative paths installed into the proposal.`},completedItems:{type:`array`,items:{type:`string`}},deploymentRequired:{type:`boolean`},installed:{type:`boolean`,description:`Whether source installation completed before setup paused.`},question:{type:`object`,additionalProperties:!0,description:`The current setup question. Supply only its non-secret answer on the next call.`},message:{type:`string`},url:{type:`string`,description:`External authorization URL the developer must open.`},userCode:{type:`string`}},required:[`status`,`address`]};async function addProductionRegistryItem(e,t,n,r){assertOfficialRegistryAddress(e);let i=(await loadRegistryIndex({nowMs:Date.now(),signal:t.abortSignal,url:officialRegistryIndexUrl()})).find(t=>t.address===e);if(i===void 0)throw Error(`No official eve registry item is published at "${e}".`);let a=classifyCatalogEntry(i);if(a.kind===`self-modification-mount`)throw Error(a.reason);let o=await t.getSandbox(),s=await withSelfModificationWorkspaceLock(`sandbox:${t.session.id}`,async()=>{let i=await readPreparedSelfModificationWorkspace({...n,sandbox:o});return await installProductionRegistryItem({address:e,answers:r.answers,installed:r.installed,sandbox:o,signal:t.abortSignal,workspace:i})});return s.kind===`completed`?{address:e,...s,status:`completed`}:s.kind===`input-required`?{address:e,...s,status:`input-required`}:s.kind===`external-action-required`?{address:e,...s,status:`external-action-required`}:{address:e,...s,status:s.kind}}function productionRegistryAddTool(e){return defineTool({description:`Install an exact item from the official eve registry into the current production change proposal. If setup pauses, call this tool again with the non-secret answers and the installed state from its result. External authorization and secret binding must be completed by the developer.`,inputSchema:productionInputSchema,outputSchema:productionOutputSchema,async execute(t,n){let{address:r}=t;if(typeof r!=`string`||r.length===0)throw Error(`address must be an exact item address from the official eve registry.`);return await addProductionRegistryItem(r,n,e,{answers:`answers`in t&&typeof t.answers==`object`&&t.answers!==null&&!Array.isArray(t.answers)?t.answers:void 0,installed:`installed`in t&&t.installed===!0})}})}var registry_add_default=defineDynamic({events:{"session.started":()=>isDeployedRuntime()?productionRegistryAddTool(resolveDeployedSelfModificationConfig(extension_default.config)):null}});export{registry_add_default as default,productionRegistryAddTool};
@@ -0,0 +1 @@
1
+ export { default } from "../../../../extension/subagents/agent/tools/search_models.js";
@@ -0,0 +1 @@
1
+ import search_models_default from"../../../../extension/subagents/agent/tools/search_models.js";export{search_models_default as default};
@@ -0,0 +1 @@
1
+ export { default } from "../../../../extension/subagents/agent/tools/search_registry.js";
@@ -0,0 +1 @@
1
+ import search_registry_default from"../../../../extension/subagents/agent/tools/search_registry.js";export{search_registry_default as default};
@@ -1,7 +1,4 @@
1
1
  import { type RuntimeSandboxSession, type SandboxSelectorContext } from "#public/definitions/sandbox.js";
2
- import { MicrosandboxSandbox } from "#sandbox/providers/microsandbox.js";
3
- import { type DefaultSandboxProbes } from "#sandbox/providers/default.js";
4
- import { VercelSandbox } from "#sandbox/providers/vercel.js";
5
2
  import { type SelfModificationConfig } from "./config.js";
6
3
  export interface SelfModificationSandboxOptions {
7
4
  readonly config?: SelfModificationConfig;
@@ -9,9 +6,7 @@ export interface SelfModificationSandboxOptions {
9
6
  export interface SelfModificationSandbox {
10
7
  (context: SandboxSelectorContext): Promise<RuntimeSandboxSession> | RuntimeSandboxSession;
11
8
  }
12
- type Probes = Pick<DefaultSandboxProbes, "isDeployedOnVercel" | "isMicrosandboxSupported">;
13
- type DeployedSelfModificationEnvironment = ReturnType<typeof MicrosandboxSandbox.environment> | ReturnType<typeof VercelSandbox.environment>;
9
+ /** Defines the local self-modification sandbox; source mounts exist only during development. */
14
10
  export declare function defineSelfModificationSandbox(options?: SelfModificationSandboxOptions): SelfModificationSandbox;
15
- export declare function selectDeployedSelfModificationEnvironment(probes: Probes): DeployedSelfModificationEnvironment;
16
11
  declare const _default: SelfModificationSandbox;
17
12
  export default _default;
@@ -1 +1 @@
1
- import{resolveSelfModificationConfig}from"./config.js";import{createGitHubCredentialProvider}from"./credentials.js";import{resolveSelfModificationMode}from"./mode.js";import{SELF_MODIFICATION_BASELINE_NETWORK_POLICY}from"./network-policy.js";import{REPOSITORY_PATH,prepareSelfModificationWorkspace}from"./git-workspace.js";import{createSelfModificationFilesystem}from"./filesystem.js";import{bindSandboxEnvironment}from"#shared/sandbox-environment.js";import{shellQuote}from"#shared/shell-quote.js";import{defineSandbox}from"#public/definitions/sandbox.js";import{SANDBOX_PROVIDER_PROBES}from"#sandbox/providers/default.js";import{JustBashSandbox}from"#sandbox/providers/just-bash.js";import{MicrosandboxSandbox}from"#sandbox/providers/microsandbox.js";import{VercelSandbox}from"#sandbox/providers/vercel.js";function defineSelfModificationSandbox(e={}){let t=resolveSelfModificationConfig(e.config),n=resolveSelfModificationMode(t);if(n!==`deployed`){let e=n===`local`?JustBashSandbox.environment({filesystem:createSelfModificationFilesystem}):JustBashSandbox.environment();return bindSandboxEnvironment(defineSandbox(()=>e.open()),e)}let r=selectDeployedSelfModificationEnvironment(SANDBOX_PROVIDER_PROBES);return bindSandboxEnvironment(defineSandbox(async({session:e})=>{let n=await r.open({networkPolicy:SELF_MODIFICATION_BASELINE_NETWORK_POLICY});if(t.deployed===void 0)return n;if(e.parent===void 0)throw Error(`Production self-modification requires a child session.`);if(n.setNetworkPolicy===void 0)throw Error(`Production self-modification requires mutable sandbox network policy.`);let i={...n,setNetworkPolicy:n.setNetworkPolicy},a=t.deployed,o=await createGitHubCredentialProvider(a.credentials).resolve({capability:`checkout`,repository:a.repository});await prepareSelfModificationWorkspace({directory:a.directory,repository:a.repository,sandbox:i,targetBranch:a.targetBranch,token:o});let s=a.directory===`.`?REPOSITORY_PATH:`${REPOSITORY_PATH}/${a.directory}`;if((await n.run({command:`rm -rf /source && ln -s ${shellQuote(`${s}/agent`)} /source`})).exitCode!==0)throw Error(`Self-modification could not mount the agent source.`);return n}),r)}function selectDeployedSelfModificationEnvironment(e){if(e.isDeployedOnVercel())return VercelSandbox.environment();if(e.isMicrosandboxSupported())return MicrosandboxSandbox.environment();throw Error(`Deployed self-modification requires runtime credential transforms. No supported provider is available. Use Vercel Sandbox or microsandbox on a supported self-hosted system.`)}var sandbox_default=defineSelfModificationSandbox();export{sandbox_default as default,defineSelfModificationSandbox,selectDeployedSelfModificationEnvironment};
1
+ import{resolveSelfModificationConfig}from"./config.js";import{isLocalSelfModificationEnabled}from"./mode.js";import{createSelfModificationFilesystem}from"./filesystem.js";import{bindSandboxEnvironment}from"#shared/sandbox-environment.js";import{defineSandbox}from"#public/definitions/sandbox.js";import{JustBashSandbox}from"#sandbox/providers/just-bash.js";function defineSelfModificationSandbox(e={}){let t=isLocalSelfModificationEnabled(resolveSelfModificationConfig(e.config))?JustBashSandbox.environment({filesystem:createSelfModificationFilesystem}):JustBashSandbox.environment();return bindSandboxEnvironment(defineSandbox(()=>t.open()),t)}var sandbox_default=defineSelfModificationSandbox();export{sandbox_default as default,defineSelfModificationSandbox};
@@ -1,4 +1,4 @@
1
- function renderLocalSelfModificationExtension(){return`import selfModification from "eve/self-modification";
1
+ function renderLocalSelfModificationExtension(){return`import selfModification from "eve/self-modification/local";
2
2
 
3
3
  export default selfModification({
4
4
  // model: "provider/model",
@@ -1,6 +1,8 @@
1
1
  import { relative } from "node:path";
2
2
  import { captureVercel, runVercelCaptureStdout } from "#setup/primitives/run-vercel.js";
3
3
  import type { VercelProjectReference } from "#setup/project-resolution.js";
4
+ export declare const SELF_MODIFICATION_CONFIG_PATH = "agent/extensions/self-modification/extension.ts";
5
+ export declare const DEPLOYED_SELF_MODIFICATION_CONFIG_PATH = "agent/extensions/self-modification-remote/extension.ts";
4
6
  export interface SelfModificationSetupValues {
5
7
  readonly branch: string;
6
8
  readonly channelNames: readonly string[];
@@ -21,7 +23,11 @@ export interface SelfModificationSetupOperations {
21
23
  detectChannelNames(): Promise<readonly string[]>;
22
24
  detectGitRepository(): Promise<DetectedGitRepository>;
23
25
  findOrCreateConnector(name: string, project: VercelProjectReference): Promise<string>;
26
+ /** Reads the deployed mount at {@link DEPLOYED_SELF_MODIFICATION_CONFIG_PATH}. */
24
27
  readConfig(): Promise<string | undefined>;
28
+ /** Reads the local mount at {@link SELF_MODIFICATION_CONFIG_PATH}. */
29
+ readLocalConfig(): Promise<string | undefined>;
30
+ /** Writes the deployed mount at {@link DEPLOYED_SELF_MODIFICATION_CONFIG_PATH}. */
25
31
  writeConfig(source: string): Promise<void>;
26
32
  }
27
33
  export interface SelfModificationSetupDependencies {