zidane 5.12.9 → 5.13.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 (103) hide show
  1. package/README.md +6 -0
  2. package/dist/{agent-DFxjgQx5.d.ts → agent-Db4ojCSV.d.ts} +358 -49
  3. package/dist/agent-Db4ojCSV.d.ts.map +1 -0
  4. package/dist/atomic-write-Bgtr5JPu.js +100 -0
  5. package/dist/atomic-write-Bgtr5JPu.js.map +1 -0
  6. package/dist/chat/pure.d.ts +3 -3
  7. package/dist/chat.d.ts +17 -117
  8. package/dist/chat.d.ts.map +1 -1
  9. package/dist/chat.js +3 -3
  10. package/dist/contexts/daytona.d.ts +123 -0
  11. package/dist/contexts/daytona.d.ts.map +1 -0
  12. package/dist/contexts/daytona.js +282 -0
  13. package/dist/contexts/daytona.js.map +1 -0
  14. package/dist/contexts/e2b.d.ts +1 -1
  15. package/dist/{contexts-DglWSzmR.js → contexts-VhV4Af8x.js} +32 -6
  16. package/dist/contexts-VhV4Af8x.js.map +1 -0
  17. package/dist/contexts.js +1 -1
  18. package/dist/eval.d.ts +1 -1
  19. package/dist/eval.js +4 -4
  20. package/dist/{headless-Cbknpgjo.js → headless-tVN-g6IR.js} +7 -7
  21. package/dist/headless-tVN-g6IR.js.map +1 -0
  22. package/dist/headless.d.ts +1 -1
  23. package/dist/headless.js +1 -1
  24. package/dist/{index-C3wPsOFw.d.ts → index-BEblm0Hu.d.ts} +2 -2
  25. package/dist/{index-C3wPsOFw.d.ts.map → index-BEblm0Hu.d.ts.map} +1 -1
  26. package/dist/{index-DoQ0MHlp.d.ts → index-CJ-2g7bY.d.ts} +86 -18
  27. package/dist/index-CJ-2g7bY.d.ts.map +1 -0
  28. package/dist/index-CrMb8jCE.d.ts.map +1 -1
  29. package/dist/index.d.ts +6 -5
  30. package/dist/index.js +12 -12
  31. package/dist/{interpolate-Da6kPCXn.js → interpolate-ConAiXGy.js} +2 -2
  32. package/dist/{interpolate-Da6kPCXn.js.map → interpolate-ConAiXGy.js.map} +1 -1
  33. package/dist/{logger-DZcTJ3YX.d.ts → logger-Dcrj48qY.d.ts} +2 -2
  34. package/dist/{logger-DZcTJ3YX.d.ts.map → logger-Dcrj48qY.d.ts.map} +1 -1
  35. package/dist/login-D5rb4IG8.js +267 -0
  36. package/dist/login-D5rb4IG8.js.map +1 -0
  37. package/dist/{mcp-Bl0n3bNL.js → mcp-C_TIj91j.js} +2 -2
  38. package/dist/{mcp-Bl0n3bNL.js.map → mcp-C_TIj91j.js.map} +1 -1
  39. package/dist/mcp.d.ts +1 -1
  40. package/dist/mcp.js +1 -1
  41. package/dist/{messages-CV_K9I6j.js → messages-CGazSyTL.js} +16 -13
  42. package/dist/messages-CGazSyTL.js.map +1 -0
  43. package/dist/output/stream-json.d.ts +2 -2
  44. package/dist/output/stream-json.js +1 -1
  45. package/dist/output/terminal.d.ts +2 -2
  46. package/dist/policy-DcGlpaNs.d.ts +129 -0
  47. package/dist/policy-DcGlpaNs.d.ts.map +1 -0
  48. package/dist/{presets-BsMR5nn6.js → presets-kPEMOCmE.js} +2 -2
  49. package/dist/{presets-BsMR5nn6.js.map → presets-kPEMOCmE.js.map} +1 -1
  50. package/dist/presets.d.ts +2 -2
  51. package/dist/presets.js +1 -1
  52. package/dist/{providers-C6rpOk0l.js → providers-Bo2biCyT.js} +47 -116
  53. package/dist/providers-Bo2biCyT.js.map +1 -0
  54. package/dist/providers.d.ts +1 -1
  55. package/dist/providers.js +2 -2
  56. package/dist/restate.d.ts +1 -1
  57. package/dist/restate.js +2 -1
  58. package/dist/restate.js.map +1 -1
  59. package/dist/session/sqlite.d.ts +1 -1
  60. package/dist/{session-nRmW_P8d.js → session-B69BQSn1.js} +2 -2
  61. package/dist/{session-nRmW_P8d.js.map → session-B69BQSn1.js.map} +1 -1
  62. package/dist/session.d.ts +1 -1
  63. package/dist/session.js +2 -2
  64. package/dist/skills.d.ts +2 -2
  65. package/dist/skills.js +1 -1
  66. package/dist/{tool-formatters-CCTIq3A-.d.ts → tool-formatters-CkqBgPH4.d.ts} +9 -31
  67. package/dist/tool-formatters-CkqBgPH4.d.ts.map +1 -0
  68. package/dist/tools/fetch-url.d.ts +1 -1
  69. package/dist/tools/web-search.d.ts +1 -1
  70. package/dist/{tools-fqToqHik.js → tools-5Bnlq68O.js} +2105 -1320
  71. package/dist/tools-5Bnlq68O.js.map +1 -0
  72. package/dist/tools.d.ts +2 -2
  73. package/dist/tools.js +1 -1
  74. package/dist/{transcript-anchors-DxAfqo4i.d.ts → transcript-anchors-BnLZmASt.d.ts} +17 -5
  75. package/dist/transcript-anchors-BnLZmASt.d.ts.map +1 -0
  76. package/dist/{transcript-anchors-Br_NijUC.js → transcript-anchors-D4PwUMyO.js} +1202 -103
  77. package/dist/transcript-anchors-D4PwUMyO.js.map +1 -0
  78. package/dist/tui.d.ts +3 -3
  79. package/dist/tui.d.ts.map +1 -1
  80. package/dist/tui.js +102 -148
  81. package/dist/tui.js.map +1 -1
  82. package/dist/{turn-operations-BTxf15kt.d.ts → turn-operations-B6FaQAZN.d.ts} +3 -3
  83. package/dist/{turn-operations-BTxf15kt.d.ts.map → turn-operations-B6FaQAZN.d.ts.map} +1 -1
  84. package/dist/types-DxHDaqN7.js.map +1 -1
  85. package/dist/types.d.ts +2 -2
  86. package/dist/types.js +1 -1
  87. package/docs/ARCHITECTURE.md +6 -2
  88. package/docs/CHAT.md +29 -28
  89. package/docs/SKILL.md +1 -1
  90. package/docs/TUI.md +8 -8
  91. package/package.json +15 -5
  92. package/dist/agent-DFxjgQx5.d.ts.map +0 -1
  93. package/dist/contexts-DglWSzmR.js.map +0 -1
  94. package/dist/headless-Cbknpgjo.js.map +0 -1
  95. package/dist/index-DoQ0MHlp.d.ts.map +0 -1
  96. package/dist/login-uf01y_Yj.js +0 -1272
  97. package/dist/login-uf01y_Yj.js.map +0 -1
  98. package/dist/messages-CV_K9I6j.js.map +0 -1
  99. package/dist/providers-C6rpOk0l.js.map +0 -1
  100. package/dist/tool-formatters-CCTIq3A-.d.ts.map +0 -1
  101. package/dist/tools-fqToqHik.js.map +0 -1
  102. package/dist/transcript-anchors-Br_NijUC.js.map +0 -1
  103. package/dist/transcript-anchors-DxAfqo4i.d.ts.map +0 -1
package/dist/chat.js CHANGED
@@ -1,5 +1,5 @@
1
- import { $ as useMcpAuthDispatch, $n as findGitRoot, $t as createStateStore, A as runOAuthLogin, An as bootTick, Ar as PLAN_MODE_DOCTRINE_NO_PROMPTS, At as SettingsProvider, B as refreshMcpToolsCatalog, Bn as resolvePlatformPackage, Bt as CATPPUCCIN_FRAPPE, C as projectsFilePath, Cn as mergeKeybindings, Cr as ACTIONS_WITH_CARE_DOCTRINE, Ct as shortChord, D as formatPathForCwd, Dn as useCompletion, Dr as INTERACTION_GUIDANCE, Dt as SETTINGS_CATEGORIES, E as writeProjects, En as stripJsonComments, Er as IDENTITY_PREFIX, Et as DEFAULT_SETTINGS, F as parseMcpsFile, Fn as detectLibc, Fr as envSection, Ft as resolveChipColor, G as useMcpToolToggleSet, Gn as credentialsPath, Gt as DiscoveryProvider, H as subscribeMcpToolsCache, Hn as shouldAutoCompact, Ht as CATPPUCCIN_MACCHIATO, I as projectUserPaths, In as detectPackageManager, It as resolveTheme, J as parentServerName, Jn as removeProviderCredential, Jt as ConfigProvider, K as buildVisibleMcpRows, Kn as readCredentials, Kt as useDiscovery, L as clearMcpToolsCache, Ln as parseSemver, Lt as VAPORWAVE_THEME, M as buildMcpServers, Mn as useUpdateCheck, Mr as TOKEN_DISCIPLINE_DOCTRINE, Mt as useSettings, N as defaultMcpsConfigPaths, Nn as checkForUpdate, Nr as buildBuildSystem, Nt as BUILTIN_THEMES, O as fetchOAuthRedirect, On as tryOpenBrowser, Or as INTERACTION_GUIDANCE_NO_PROMPTS, Ot as SETTINGS_CHOICES, P as discoverProjectMcps, Pn as compareSemver, Pr as buildPlanSystem, Pt as DEFAULT_THEME, Q as McpAuthProvider, Qn as renderAgentsMdBlock, Qt as resolveStorageDirs, R as loadMcpToolsCache, Rn as performInPlaceSelfUpdate, Rt as GRUVBOX_DARK, S as matchesSafelistEntry, Sn as matchesBinding, Sr as useActiveTodos, St as buildHints, T as suggestSafelistEntry, Tn as readKeybindings, Tr as DOING_TASKS_DOCTRINE, Tt as useEnabledToggleSet, U as buildToolToggle, Un as detectAuth, Ut as CATPPUCCIN_MOCHA, V as saveMcpToolsCache, Vn as AUTO_COMPACT_MIN_GROWTH_FRACTION, Vt as CATPPUCCIN_LATTE, W as useMcpToolToggleMap, Wn as applyApiKeyEnv, Wt as createDiscoverySlot, X as mcpCredentialsPath, Xn as writeCredentials, Xt as resolveConfig, Y as createFileMcpCredentialStore, Yn as setProviderCredential, Yt as useConfig, Z as patchMcpCredential, Zn as discoverAgentsMd, Zt as resolveStoragePaths, _ as useSafeModeQueue, _n as KEYBINDING_KEY_COL_WIDTH, _r as isTodoTool, _t as clipHintsToWidth, a as useSurfaces, an as marginTopFor, ar as PLAN_AGENT, at as ASK_USER_TOOL, b as getSafelist, bn as groupBindings, br as selectActiveTodos, bt as cleanTitle, c as useStreamBuffer, cn as stripSpawnTokensLine, cr as singleAgentRegistry, ct as buildResumedToolResultsTurn, d as discoverProjectSkills, dn as toolCallPreview, dr as TODOWRITE_TOOL, dt as makeRequestInteraction, en as deriveSessionTitle, er as BUILD_AGENT, et as useMcpAuthState, f as renderSession, fn as toolResultText, fr as TODO_STATUS_GLYPHS, ft as pendingInteractionsFromTurns, g as useSafeModeActions, gn as KEYBINDING_DEF_BY_ACTION, gr as getTodosForRun, gt as EMPTY_HINTS, h as SafeModeProvider, hn as KEYBINDING_DEFS, hr as getArchivedTodosForRun, ht as useInteractionsQueue, i as useSelectStyle, in as loadState, ir as DEFAULT_PERSIST_EXCLUDE_TOOLS, it as splitMarkdownCodeBlocks, j as supportsOAuth, jn as buildUpdateHint, jr as SUBAGENT_GUIDANCE, k as oauthUsesManualCodePaste, kn as bootProfileEnabled, kr as PLAN_MODE_DOCTRINE, kt as SETTINGS_TOGGLES, l as buildSkillsConfig, ln as sumRunCosts, lr as TODOREAD_TOOL, lt as createInteractionTools, m as writeSessionExport, mn as DEFAULT_KEYBINDINGS, mr as createTodoTools, mt as useInteractionsActions, n as ThemeProvider, nn as lastContextSizeFromTurns, nr as DEFAULT_AGENT_ID, nt as reduceMcpAuth, o as useSyntaxStyles, on as saveState, or as accentColor, ot as InteractionsProvider, p as resolveSessionExportTarget, pn as updateToolEventOutcomes, pr as TODO_WRITE_COUNTS_METADATA_KEY, pt as serializeInteractionResponse, q as indexOfServerRow, qn as readProviderCredential, qt as useDiscoveryOptional, r as useColors, rn as listSessionMeta, rr as DEFAULT_BUDGET_EXCLUDE_TOOLS, s as useTheme, sr as resolveAgentId, st as PRESENT_PLAN_TOOL, t as computeTurnAnchors, tn as eventsFromTurns, tr as BUILTIN_AGENTS, tt as getMcpAuthStatus, u as defaultSkillScanPaths, un as titleFromTurns, ur as TODOS_METADATA_KEY, ut as isInteractionTool, v as IMPLICITLY_SAFE_TOOLS, vn as ensureKeybindingsFile, vr as pickActiveRunId, vt as hintsLength, w as readProjects, wn as parseBindingSpec, wr as COMMUNICATION_DOCTRINE, wt as listProjectFiles, x as isOnSafelist, xn as keybindingsPath, xr as setTodosForRun, xt as generateSessionTitle, y as addToSafelist, yn as formatBindingForDisplay, yr as pruneTodosByRun, yt as truncateTrailing, z as mcpToolsCachePath, zn as performSelfUpdate, zt as GRUVBOX_LIGHT } from "./transcript-anchors-Br_NijUC.js";
2
- import { $ as restoreModelOptions, B as cerebrasDescriptor, G as getModelInfo, H as effectiveContextWindow, J as modelSupportsReasoning, K as localDescriptor, L as BUILTIN_PROVIDERS, Q as piIdOf, R as OUTPUT_RESERVE_TOKENS, U as enabledModelOptions, V as credKeyOf, W as getContextWindow, X as openaiDescriptor, Y as modelsForDescriptor, Z as openrouterDescriptor, q as modelOptionsFor, z as anthropicDescriptor } from "./tools-fqToqHik.js";
1
+ import { $ as useMcpAuthDispatch, $n as cerebrasDescriptor, $t as compactSummaryEvent, A as runOAuthLogin, An as bootProfileEnabled, Ar as getArchivedTodosForRun, At as SettingsProvider, B as refreshMcpToolsCatalog, Bn as performSelfUpdate, Br as DOING_TASKS_DOCTRINE, Bt as CATPPUCCIN_FRAPPE, C as projectsFilePath, Cn as matchesBinding, Cr as singleAgentRegistry, Ct as shortChord, D as formatPathForCwd, Dn as stripJsonComments, Dr as TODO_STATUS_GLYPHS, Dt as SETTINGS_CATEGORIES, E as writeProjects, En as readKeybindings, Er as TODOWRITE_TOOL, Et as DEFAULT_SETTINGS, F as parseMcpsFile, Fn as compareSemver, Fr as selectActiveTodos, Ft as resolveChipColor, G as useMcpToolToggleSet, Gn as credentialsPath, Gr as PLAN_MODE_DOCTRINE_NO_PROMPTS, Gt as DiscoveryProvider, H as subscribeMcpToolsCache, Hn as chatAutoCompactBehavior, Hr as INTERACTION_GUIDANCE, Ht as CATPPUCCIN_MACCHIATO, I as projectUserPaths, In as detectLibc, Ir as setTodosForRun, It as resolveTheme, J as parentServerName, Jn as removeProviderCredential, Jr as buildBuildSystem, Jt as ConfigProvider, K as buildVisibleMcpRows, Kn as readCredentials, Kr as SUBAGENT_GUIDANCE, Kt as useDiscovery, L as clearMcpToolsCache, Ln as detectPackageManager, Lr as useActiveTodos, Lt as VAPORWAVE_THEME, M as buildMcpServers, Mn as buildUpdateHint, Mr as isTodoTool, Mt as useSettings, N as defaultMcpsConfigPaths, Nn as useUpdateCheck, Nr as pickActiveRunId, Nt as BUILTIN_THEMES, O as fetchOAuthRedirect, On as useCompletion, Or as TODO_WRITE_COUNTS_METADATA_KEY, Ot as SETTINGS_CHOICES, P as discoverProjectMcps, Pn as checkForUpdate, Pr as pruneTodosByRun, Pt as DEFAULT_THEME, Q as McpAuthProvider, Qn as anthropicDescriptor, Qt as resolveStorageDirs, R as loadMcpToolsCache, Rn as parseSemver, Rr as ACTIONS_WITH_CARE_DOCTRINE, Rt as GRUVBOX_DARK, S as matchesSafelistEntry, Sn as keybindingsPath, Sr as resolveAgentId, St as buildHints, T as suggestSafelistEntry, Tn as parseBindingSpec, Tr as TODOS_METADATA_KEY, Tt as useEnabledToggleSet, U as buildToolToggle, Un as detectAuth, Ur as INTERACTION_GUIDANCE_NO_PROMPTS, Ut as CATPPUCCIN_MOCHA, V as saveMcpToolsCache, Vn as resolvePlatformPackage, Vr as IDENTITY_PREFIX, Vt as CATPPUCCIN_LATTE, W as useMcpToolToggleMap, Wn as applyApiKeyEnv, Wr as PLAN_MODE_DOCTRINE, Wt as createDiscoverySlot, X as mcpCredentialsPath, Xn as writeCredentials, Xr as envSection, Xt as resolveConfig, Y as createFileMcpCredentialStore, Yn as setProviderCredential, Yr as buildPlanSystem, Yt as useConfig, Z as patchMcpCredential, Zn as BUILTIN_PROVIDERS, Zt as resolveStoragePaths, _ as useSafeModeQueue, _n as KEYBINDING_DEF_BY_ACTION, _r as DEFAULT_AGENT_ID, _t as clipHintsToWidth, a as useSurfaces, an as loadState, ar as modelOptionsFor, at as ASK_USER_TOOL, b as getSafelist, bn as formatBindingForDisplay, br as PLAN_AGENT, bt as cleanTitle, c as useStreamBuffer, cr as openaiDescriptor, ct as buildResumedToolResultsTurn, d as discoverProjectSkills, dn as titleFromTurns, dr as restoreModelOptions, dt as makeRequestInteraction, en as createStateStore, er as credKeyOf, et as useMcpAuthState, f as renderSession, fn as toolCallPreview, fr as discoverAgentsMd, ft as pendingInteractionsFromTurns, g as useSafeModeActions, gn as KEYBINDING_DEFS, gr as BUILTIN_AGENTS, gt as EMPTY_HINTS, h as SafeModeProvider, hn as DEFAULT_KEYBINDINGS, hr as BUILD_AGENT, ht as useInteractionsQueue, i as useSelectStyle, in as listSessionMeta, ir as localDescriptor, it as splitMarkdownCodeBlocks, j as supportsOAuth, jn as bootTick, jr as getTodosForRun, k as oauthUsesManualCodePaste, kn as tryOpenBrowser, kr as createTodoTools, kt as SETTINGS_TOGGLES, l as buildSkillsConfig, ln as stripSpawnTokensLine, lr as openrouterDescriptor, lt as createInteractionTools, m as writeSessionExport, mn as updateToolEventOutcomes, mr as findGitRoot, mt as useInteractionsActions, n as ThemeProvider, nn as eventsFromTurns, nr as getContextWindow, nt as reduceMcpAuth, o as useSyntaxStyles, on as marginTopFor, or as modelSupportsReasoning, ot as InteractionsProvider, p as resolveSessionExportTarget, pn as toolResultText, pr as renderAgentsMdBlock, pt as serializeInteractionResponse, q as indexOfServerRow, qn as readProviderCredential, qr as TOKEN_DISCIPLINE_DOCTRINE, qt as useDiscoveryOptional, r as useColors, rn as lastContextSizeFromTurns, rr as getModelInfo, s as useTheme, sn as saveState, sr as modelsForDescriptor, st as PRESENT_PLAN_TOOL, t as computeTurnAnchors, tn as deriveSessionTitle, tr as enabledModelOptions, tt as getMcpAuthStatus, u as defaultSkillScanPaths, un as sumRunCosts, ur as piIdOf, ut as isInteractionTool, v as IMPLICITLY_SAFE_TOOLS, vn as KEYBINDING_KEY_COL_WIDTH, vr as DEFAULT_BUDGET_EXCLUDE_TOOLS, vt as hintsLength, w as readProjects, wn as mergeKeybindings, wr as TODOREAD_TOOL, wt as listProjectFiles, x as isOnSafelist, xn as groupBindings, xr as accentColor, xt as generateSessionTitle, y as addToSafelist, yn as ensureKeybindingsFile, yr as DEFAULT_PERSIST_EXCLUDE_TOOLS, yt as truncateTrailing, z as mcpToolsCachePath, zn as performInPlaceSelfUpdate, zr as COMMUNICATION_DOCTRINE, zt as GRUVBOX_LIGHT } from "./transcript-anchors-D4PwUMyO.js";
2
+ import { ct as effectiveContextWindow, lt as shouldAutoCompact, ot as AUTO_COMPACT_MIN_GROWTH_FRACTION, st as OUTPUT_RESERVE_TOKENS } from "./tools-5Bnlq68O.js";
3
3
  import { t as buildContextBreakdown } from "./context-breakdown-kO-pDsay.js";
4
4
  import { a as formatTaskStatus, c as shortId, i as formatDuration, n as compactPath, o as formatTaskSummary, r as fmtTokens, s as previewLine, t as ageString } from "./format-BNOXpl-1.js";
5
5
  import { A as splitLines, B as summarizeOutcomes, C as buildContextualDiff, D as extractEditPayload, E as computeLineDiff, F as mergeApprovalAndBodyOutcomes, G as createFilesCompletionProvider, H as createSkillsCompletionProvider, I as parseEditOutcomesFromResult, J as collectReferences, K as uniqueFilesFromReferences, L as resolveApprovalForPayload, M as tokenize, N as buildEditOutcomesAnnotation, O as filetypeFromPath, P as maskToOutcomeKinds, Q as buildLinearRamp, R as rewriteMultiEditHeader, S as applyEditPayload, T as computeInlineDiff, U as uniqueSkillNamesFromReferences, V as SKILLS_TRIGGER, W as FILES_TRIGGER, X as mergeReferences, Y as findActiveTrigger, Z as blendHsl, _ as isEditErrorResult, a as TOOL_DISPLAY, b as selectableTurnIds, c as finalizeStreamingMarkdown, d as turnContextSize, f as splitPromptSegments, h as indexOfEntry, i as turnAsText, j as summarizeEditPayload, k as previewEditPayload, l as finalizeStreamingMarkdownForOwner, m as filterModelCatalog, n as deleteTurnSafely, o as displayNameFor, p as buildModelCatalog, q as applyInsert, r as truncateTurnsAt, s as formatToolCall, t as countNeighbors, v as isTurnHighlighted, w as buildUnifiedDiff, x as turnSelectionOwnership, y as isVisible, z as stripEditOutcomesAnnotation } from "./turn-operations-DLWN2J7f.js";
@@ -201,6 +201,6 @@ function parseArgs(argv) {
201
201
  };
202
202
  }
203
203
  //#endregion
204
- export { ACTIONS_WITH_CARE_DOCTRINE, ASK_USER_TOOL, AUTO_COMPACT_MIN_GROWTH_FRACTION, BUILD_AGENT, BUILTIN_AGENTS, BUILTIN_PROVIDERS, BUILTIN_THEMES, CATPPUCCIN_FRAPPE, CATPPUCCIN_LATTE, CATPPUCCIN_MACCHIATO, CATPPUCCIN_MOCHA, COMMUNICATION_DOCTRINE, ConfigProvider, DEFAULT_AGENT_ID, DEFAULT_BUDGET_EXCLUDE_TOOLS, DEFAULT_KEYBINDINGS, DEFAULT_PERSIST_EXCLUDE_TOOLS, DEFAULT_SETTINGS, DEFAULT_THEME, DOING_TASKS_DOCTRINE, DiscoveryProvider, EMPTY_HINTS, FILES_TRIGGER, GRUVBOX_DARK, GRUVBOX_LIGHT, IDENTITY_PREFIX, IMPLICITLY_SAFE_TOOLS, INTERACTION_GUIDANCE, INTERACTION_GUIDANCE_NO_PROMPTS, InteractionsProvider, KEYBINDING_DEFS, KEYBINDING_DEF_BY_ACTION, KEYBINDING_KEY_COL_WIDTH, McpAuthProvider, OUTPUT_RESERVE_TOKENS, PLAN_AGENT, PLAN_MODE_DOCTRINE, PLAN_MODE_DOCTRINE_NO_PROMPTS, PRESENT_PLAN_TOOL, SETTINGS_CATEGORIES, SETTINGS_CHOICES, SETTINGS_TOGGLES, SKILLS_TRIGGER, SUBAGENT_GUIDANCE, SafeModeProvider, SettingsProvider, TODOREAD_TOOL, TODOS_METADATA_KEY, TODOWRITE_TOOL, TODO_STATUS_GLYPHS, TODO_WRITE_COUNTS_METADATA_KEY, TOKEN_DISCIPLINE_DOCTRINE, TOOL_DISPLAY, ThemeProvider, VAPORWAVE_THEME, accentColor, addToSafelist, ageString, anthropicDescriptor, applyApiKeyEnv, applyEditPayload, applyInsert, blendHsl, bootProfileEnabled, bootTick, buildBuildSystem, buildContextBreakdown, buildContextualDiff, buildEditOutcomesAnnotation, buildHints, buildLinearRamp, buildMcpServers, buildModelCatalog, buildPlanSystem, buildResumedToolResultsTurn, buildSkillsConfig, buildToolToggle, buildUnifiedDiff, buildUpdateHint, buildVisibleMcpRows, cerebrasDescriptor, checkForUpdate, cleanTitle, clearMcpToolsCache, clipHintsToWidth, collectReferences, compactPath, compareSemver, computeInlineDiff, computeLineDiff, computeTurnAnchors, countNeighbors, createDiscoverySlot, createFileMcpCredentialStore, createFilesCompletionProvider, createInteractionTools, createSkillsCompletionProvider, createStateStore, createTodoTools, credKeyOf, credentialsPath, defaultMcpsConfigPaths, defaultSkillScanPaths, deleteTurnSafely, deriveSessionTitle, detectAuth, detectLibc, detectPackageManager, discoverAgentsMd, discoverProjectMcps, discoverProjectSkills, displayNameFor, effectiveContextWindow, enabledModelOptions, ensureKeybindingsFile, envSection, eventsFromTurns, extractEditPayload, fetchOAuthRedirect, filetypeFromPath, filterModelCatalog, finalizeStreamingMarkdown, finalizeStreamingMarkdownForOwner, findActiveTrigger, findGitRoot, fmtTokens, formatBindingForDisplay, formatDuration, formatPathForCwd, formatTaskStatus, formatTaskSummary, formatToolCall, generateSessionTitle, getArchivedTodosForRun, getContextWindow, getMcpAuthStatus, getModelInfo, getSafelist, getTodosForRun, groupBindings, hintsLength, indexOfEntry, indexOfServerRow, isEditErrorResult, isInteractionTool, isOnSafelist, isTodoTool, isTurnHighlighted, isVisible, keybindingsPath, lastContextSizeFromTurns, listProjectFiles, listSessionMeta, loadMcpToolsCache, loadState, localDescriptor, makeRequestInteraction, marginTopFor, maskToOutcomeKinds, matchesBinding, matchesSafelistEntry, mcpCredentialsPath, mcpToolsCachePath, mergeApprovalAndBodyOutcomes, mergeKeybindings, mergeReferences, modelOptionsFor, modelSupportsReasoning, modelsForDescriptor, oauthUsesManualCodePaste, openaiDescriptor, openrouterDescriptor, parentServerName, parseBindingSpec, parseEditOutcomesFromResult, parseMcpsFile, parseSemver, patchMcpCredential, pendingInteractionsFromTurns, performInPlaceSelfUpdate, performSelfUpdate, piIdOf, pickActiveRunId, previewEditPayload, previewLine, projectUserPaths, projectsFilePath, pruneTodosByRun, readCredentials, readKeybindings, readProjects, readProviderCredential, reduceMcpAuth, refreshMcpToolsCatalog, removeProviderCredential, renderAgentsMdBlock, renderSession, resolveAgentId, resolveApprovalForPayload, resolveChipColor, resolveConfig, resolvePlatformPackage, resolveSessionExportTarget, resolveStorageDirs, resolveStoragePaths, resolveTheme, restoreModelOptions, rewriteMultiEditHeader, runOAuthLogin, runUpdateCommand, saveMcpToolsCache, saveState, selectActiveTodos, selectableTurnIds, serializeInteractionResponse, setProviderCredential, setTodosForRun, shortChord, shortId, shouldAutoCompact, singleAgentRegistry, splitLines, splitMarkdownCodeBlocks, splitPromptSegments, stripEditOutcomesAnnotation, stripJsonComments, stripSpawnTokensLine, subscribeMcpToolsCache, suggestSafelistEntry, sumRunCosts, summarizeEditPayload, summarizeOutcomes, supportsOAuth, titleFromTurns, tokenize, toolCallPreview, toolResultText, truncateTrailing, truncateTurnsAt, tryOpenBrowser, turnAsText, turnContextSize, turnSelectionOwnership, uniqueFilesFromReferences, uniqueSkillNamesFromReferences, updateToolEventOutcomes, useActiveTodos, useColors, useCompletion, useConfig, useDiscovery, useDiscoveryOptional, useEnabledToggleSet, useInteractionsActions, useInteractionsQueue, useMcpAuthDispatch, useMcpAuthState, useMcpToolToggleMap, useMcpToolToggleSet, useSafeModeActions, useSafeModeQueue, useSelectStyle, useSettings, useStreamBuffer, useSurfaces, useSyntaxStyles, useTheme, useUpdateCheck, writeCredentials, writeProjects, writeSessionExport };
204
+ export { ACTIONS_WITH_CARE_DOCTRINE, ASK_USER_TOOL, AUTO_COMPACT_MIN_GROWTH_FRACTION, BUILD_AGENT, BUILTIN_AGENTS, BUILTIN_PROVIDERS, BUILTIN_THEMES, CATPPUCCIN_FRAPPE, CATPPUCCIN_LATTE, CATPPUCCIN_MACCHIATO, CATPPUCCIN_MOCHA, COMMUNICATION_DOCTRINE, ConfigProvider, DEFAULT_AGENT_ID, DEFAULT_BUDGET_EXCLUDE_TOOLS, DEFAULT_KEYBINDINGS, DEFAULT_PERSIST_EXCLUDE_TOOLS, DEFAULT_SETTINGS, DEFAULT_THEME, DOING_TASKS_DOCTRINE, DiscoveryProvider, EMPTY_HINTS, FILES_TRIGGER, GRUVBOX_DARK, GRUVBOX_LIGHT, IDENTITY_PREFIX, IMPLICITLY_SAFE_TOOLS, INTERACTION_GUIDANCE, INTERACTION_GUIDANCE_NO_PROMPTS, InteractionsProvider, KEYBINDING_DEFS, KEYBINDING_DEF_BY_ACTION, KEYBINDING_KEY_COL_WIDTH, McpAuthProvider, OUTPUT_RESERVE_TOKENS, PLAN_AGENT, PLAN_MODE_DOCTRINE, PLAN_MODE_DOCTRINE_NO_PROMPTS, PRESENT_PLAN_TOOL, SETTINGS_CATEGORIES, SETTINGS_CHOICES, SETTINGS_TOGGLES, SKILLS_TRIGGER, SUBAGENT_GUIDANCE, SafeModeProvider, SettingsProvider, TODOREAD_TOOL, TODOS_METADATA_KEY, TODOWRITE_TOOL, TODO_STATUS_GLYPHS, TODO_WRITE_COUNTS_METADATA_KEY, TOKEN_DISCIPLINE_DOCTRINE, TOOL_DISPLAY, ThemeProvider, VAPORWAVE_THEME, accentColor, addToSafelist, ageString, anthropicDescriptor, applyApiKeyEnv, applyEditPayload, applyInsert, blendHsl, bootProfileEnabled, bootTick, buildBuildSystem, buildContextBreakdown, buildContextualDiff, buildEditOutcomesAnnotation, buildHints, buildLinearRamp, buildMcpServers, buildModelCatalog, buildPlanSystem, buildResumedToolResultsTurn, buildSkillsConfig, buildToolToggle, buildUnifiedDiff, buildUpdateHint, buildVisibleMcpRows, cerebrasDescriptor, chatAutoCompactBehavior, checkForUpdate, cleanTitle, clearMcpToolsCache, clipHintsToWidth, collectReferences, compactPath, compactSummaryEvent, compareSemver, computeInlineDiff, computeLineDiff, computeTurnAnchors, countNeighbors, createDiscoverySlot, createFileMcpCredentialStore, createFilesCompletionProvider, createInteractionTools, createSkillsCompletionProvider, createStateStore, createTodoTools, credKeyOf, credentialsPath, defaultMcpsConfigPaths, defaultSkillScanPaths, deleteTurnSafely, deriveSessionTitle, detectAuth, detectLibc, detectPackageManager, discoverAgentsMd, discoverProjectMcps, discoverProjectSkills, displayNameFor, effectiveContextWindow, enabledModelOptions, ensureKeybindingsFile, envSection, eventsFromTurns, extractEditPayload, fetchOAuthRedirect, filetypeFromPath, filterModelCatalog, finalizeStreamingMarkdown, finalizeStreamingMarkdownForOwner, findActiveTrigger, findGitRoot, fmtTokens, formatBindingForDisplay, formatDuration, formatPathForCwd, formatTaskStatus, formatTaskSummary, formatToolCall, generateSessionTitle, getArchivedTodosForRun, getContextWindow, getMcpAuthStatus, getModelInfo, getSafelist, getTodosForRun, groupBindings, hintsLength, indexOfEntry, indexOfServerRow, isEditErrorResult, isInteractionTool, isOnSafelist, isTodoTool, isTurnHighlighted, isVisible, keybindingsPath, lastContextSizeFromTurns, listProjectFiles, listSessionMeta, loadMcpToolsCache, loadState, localDescriptor, makeRequestInteraction, marginTopFor, maskToOutcomeKinds, matchesBinding, matchesSafelistEntry, mcpCredentialsPath, mcpToolsCachePath, mergeApprovalAndBodyOutcomes, mergeKeybindings, mergeReferences, modelOptionsFor, modelSupportsReasoning, modelsForDescriptor, oauthUsesManualCodePaste, openaiDescriptor, openrouterDescriptor, parentServerName, parseBindingSpec, parseEditOutcomesFromResult, parseMcpsFile, parseSemver, patchMcpCredential, pendingInteractionsFromTurns, performInPlaceSelfUpdate, performSelfUpdate, piIdOf, pickActiveRunId, previewEditPayload, previewLine, projectUserPaths, projectsFilePath, pruneTodosByRun, readCredentials, readKeybindings, readProjects, readProviderCredential, reduceMcpAuth, refreshMcpToolsCatalog, removeProviderCredential, renderAgentsMdBlock, renderSession, resolveAgentId, resolveApprovalForPayload, resolveChipColor, resolveConfig, resolvePlatformPackage, resolveSessionExportTarget, resolveStorageDirs, resolveStoragePaths, resolveTheme, restoreModelOptions, rewriteMultiEditHeader, runOAuthLogin, runUpdateCommand, saveMcpToolsCache, saveState, selectActiveTodos, selectableTurnIds, serializeInteractionResponse, setProviderCredential, setTodosForRun, shortChord, shortId, shouldAutoCompact, singleAgentRegistry, splitLines, splitMarkdownCodeBlocks, splitPromptSegments, stripEditOutcomesAnnotation, stripJsonComments, stripSpawnTokensLine, subscribeMcpToolsCache, suggestSafelistEntry, sumRunCosts, summarizeEditPayload, summarizeOutcomes, supportsOAuth, titleFromTurns, tokenize, toolCallPreview, toolResultText, truncateTrailing, truncateTurnsAt, tryOpenBrowser, turnAsText, turnContextSize, turnSelectionOwnership, uniqueFilesFromReferences, uniqueSkillNamesFromReferences, updateToolEventOutcomes, useActiveTodos, useColors, useCompletion, useConfig, useDiscovery, useDiscoveryOptional, useEnabledToggleSet, useInteractionsActions, useInteractionsQueue, useMcpAuthDispatch, useMcpAuthState, useMcpToolToggleMap, useMcpToolToggleSet, useSafeModeActions, useSafeModeQueue, useSelectStyle, useSettings, useStreamBuffer, useSurfaces, useSyntaxStyles, useTheme, useUpdateCheck, writeCredentials, writeProjects, writeSessionExport };
205
205
 
206
206
  //# sourceMappingURL=chat.js.map
@@ -0,0 +1,123 @@
1
+ import { s as ExecResult } from "../types-B39tBba1.js";
2
+ import { t as SandboxProvider } from "../index-CrMb8jCE.js";
3
+ import { a as Logger } from "../logger-Dcrj48qY.js";
4
+ import { Buffer } from "node:buffer";
5
+
6
+ //#region src/contexts/daytona.d.ts
7
+ interface DaytonaExecuteResponse {
8
+ exitCode?: number | null;
9
+ result?: string | null;
10
+ output?: string | null;
11
+ stdout?: string | null;
12
+ stderr?: string | null;
13
+ artifacts?: {
14
+ stdout?: string | null;
15
+ };
16
+ }
17
+ interface DaytonaFileEntry {
18
+ name: string;
19
+ }
20
+ interface DaytonaSandbox {
21
+ id: string;
22
+ state?: string;
23
+ process: {
24
+ executeCommand: (command: string, cwd?: string, env?: Record<string, string>, timeout?: number) => Promise<DaytonaExecuteResponse>;
25
+ };
26
+ fs: {
27
+ downloadFile: (path: string) => Promise<Uint8Array | ArrayBuffer | {
28
+ toString: (encoding?: BufferEncoding) => string;
29
+ }>;
30
+ uploadFile: (content: Uint8Array | Buffer, path: string) => Promise<unknown>;
31
+ listFiles: (path: string) => Promise<DaytonaFileEntry[]>;
32
+ };
33
+ getWorkDir?: () => Promise<string>;
34
+ start?: (timeout?: number) => Promise<unknown>;
35
+ delete: (timeout?: number) => Promise<unknown>;
36
+ stop?: (timeout?: number) => Promise<unknown>;
37
+ archive?: () => Promise<unknown>;
38
+ }
39
+ interface DaytonaResources {
40
+ cpu?: number;
41
+ memory?: number;
42
+ disk?: number;
43
+ gpu?: number;
44
+ [key: string]: unknown;
45
+ }
46
+ interface DaytonaCreateParams {
47
+ language?: string;
48
+ snapshot?: string;
49
+ image?: unknown;
50
+ resources?: DaytonaResources;
51
+ envVars?: Record<string, string>;
52
+ [key: string]: unknown;
53
+ }
54
+ type DaytonaOnDestroy = 'delete' | 'kill' | 'stop' | 'pause' | 'archive' | 'leave';
55
+ interface DaytonaProviderOptions {
56
+ /** Daytona API key. Falls back to the `DAYTONA_API_KEY` env var when omitted. */
57
+ apiKey?: string;
58
+ /** Daytona API URL. Falls back to `DAYTONA_API_URL`, then Daytona's hosted default. */
59
+ apiUrl?: string;
60
+ /** Daytona target / region. Falls back to `DAYTONA_TARGET`, then the org default. */
61
+ target?: string;
62
+ /**
63
+ * Attach to a pre-existing sandbox by id or name instead of creating a fresh
64
+ * one. The provider treats attached sandboxes as externally owned and leaves
65
+ * them running on destroy/failure.
66
+ */
67
+ sandboxId?: string;
68
+ /** Daytona snapshot used when creating a fresh sandbox. */
69
+ snapshot?: string;
70
+ /** Runtime used for Daytona's code tooling. Shell execution works either way. */
71
+ language?: string;
72
+ /** Daytona image/declarative builder input used when creating a fresh sandbox. */
73
+ image?: unknown;
74
+ /** Daytona sandbox resources. */
75
+ resources?: DaytonaResources;
76
+ /** Default working directory, applied when a spawn doesn't set `SpawnConfig.cwd`. */
77
+ cwd?: string;
78
+ /** Environment variables baked into the sandbox and re-sent on every command. */
79
+ env?: Record<string, string>;
80
+ /** Logger for provider-level lifecycle lines. */
81
+ logger?: Logger;
82
+ /** Total deadline, in seconds, for the post-create readiness probe. Defaults to `60`. */
83
+ readinessTimeoutSeconds?: number;
84
+ /** Setup script to upload and run once the sandbox is ready. */
85
+ pregame?: {
86
+ name: string;
87
+ content: string;
88
+ };
89
+ /**
90
+ * What to do with an owned sandbox on destroy:
91
+ *
92
+ * - `'delete'` / `'kill'` (default) — call `sandbox.delete()`.
93
+ * - `'stop'` / `'pause'` — call `sandbox.stop()` so Daytona preserves state
94
+ * according to the runner's stop semantics.
95
+ * - `'archive'` — stop, then archive for longer-term persistence.
96
+ * - `'leave'` — make no API call.
97
+ */
98
+ onDestroy?: DaytonaOnDestroy;
99
+ }
100
+ interface DaytonaReadinessOptions {
101
+ /** Total deadline in seconds. `<= 0` disables the probe entirely. */
102
+ timeoutSeconds: number;
103
+ /** Optional cleanup for owned sandboxes that never become ready. */
104
+ cleanupOnTimeout?: () => Promise<void>;
105
+ /** Clock source — injectable for deterministic tests. */
106
+ now?: () => number;
107
+ /** Sleep between probes — injectable for deterministic tests. */
108
+ sleep?: (ms: number) => Promise<void>;
109
+ }
110
+ declare function resolveDaytonaEnv(optionEnv: Record<string, string> | undefined, perSpawnEnv: Record<string, string> | undefined): Record<string, string> | undefined;
111
+ declare function normalizeDaytonaExecResult(response: DaytonaExecuteResponse): ExecResult;
112
+ declare function resolveDaytonaCreateParams(sandboxConfig: Record<string, unknown>, options: DaytonaProviderOptions, envVars: Record<string, string> | undefined): DaytonaCreateParams | undefined;
113
+ declare function waitForDaytonaReady(sandbox: DaytonaSandbox, logger: Logger, opts: DaytonaReadinessOptions): Promise<void>;
114
+ declare function runDaytonaPregame(sandbox: DaytonaSandbox, logger: Logger, opts: {
115
+ name: string;
116
+ content: string;
117
+ cwd?: string;
118
+ envVars?: Record<string, string>;
119
+ }): Promise<void>;
120
+ declare function createDaytonaProvider(options?: DaytonaProviderOptions): SandboxProvider;
121
+ //#endregion
122
+ export { DaytonaOnDestroy, DaytonaProviderOptions, DaytonaReadinessOptions, createDaytonaProvider, normalizeDaytonaExecResult, resolveDaytonaCreateParams, resolveDaytonaEnv, runDaytonaPregame, waitForDaytonaReady };
123
+ //# sourceMappingURL=daytona.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daytona.d.ts","names":[],"sources":["../../src/contexts/daytona.ts"],"mappings":";;;;;;UA6BU,sBAAA;EACR,QAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,SAAA;IAAc,MAAA;EAAA;AAAA;AAAA,UAGN,gBAAA;EACR,IAAI;AAAA;AAAA,UAGI,cAAA;EACR,EAAA;EACA,KAAA;EACA,OAAA;IACE,cAAA,GAAiB,OAAA,UAAiB,GAAA,WAAc,GAAA,GAAM,MAAA,kBAAwB,OAAA,cAAqB,OAAA,CAAQ,sBAAA;EAAA;EAE7G,EAAA;IACE,YAAA,GAAe,IAAA,aAAiB,OAAA,CAAQ,UAAA,GAAa,WAAA;MAAgB,QAAA,GAAW,QAAA,GAAW,cAAA;IAAA;IAC3F,UAAA,GAAa,OAAA,EAAS,UAAA,GAAa,MAAA,EAAQ,IAAA,aAAiB,OAAA;IAC5D,SAAA,GAAY,IAAA,aAAiB,OAAA,CAAQ,gBAAA;EAAA;EAEvC,UAAA,SAAmB,OAAA;EACnB,KAAA,IAAS,OAAA,cAAqB,OAAA;EAC9B,MAAA,GAAS,OAAA,cAAqB,OAAA;EAC9B,IAAA,IAAQ,OAAA,cAAqB,OAAA;EAC7B,OAAA,SAAgB,OAAA;AAAA;AAAA,UASR,gBAAA;EACR,GAAA;EACA,MAAA;EACA,IAAA;EACA,GAAA;EAAA,CACC,GAAA;AAAA;AAAA,UAGO,mBAAA;EACR,QAAA;EACA,QAAA;EACA,KAAA;EACA,SAAA,GAAY,gBAAA;EACZ,OAAA,GAAU,MAAM;EAAA,CACf,GAAA;AAAA;AAAA,KAcS,gBAAA;AAAA,UAEK,sBAAA;EA9C8B;EAgD7C,MAAA;EA/CE;EAiDF,MAAA;EAjD+B;EAmD/B,MAAA;EAjDA;;;;;EAuDA,SAAA;EArDS;EAuDT,QAAA;EAtDA;EAwDA,QAAA;EAxD6B;EA0D7B,KAAA;EAzDgB;EA2DhB,SAAA,GAAY,gBAAA;EA3DW;EA6DvB,GAAA;EApDwB;EAsDxB,GAAA,GAAM,MAAA;EAtDkB;EAwDxB,MAAA,GAAS,MAAA;EAtDT;EAwDA,uBAAA;EAtDA;EAwDA,OAAA;IAAY,IAAA;IAAc,OAAA;EAAA;EApDC;;;;;;;;;EA8D3B,SAAA,GAAY,gBAAA;AAAA;AAAA,UAUG,uBAAA;EAlEH;EAoEZ,cAAA;EAtD0B;EAwD1B,gBAAA,SAAyB,OAAA;EAxDC;EA0D1B,GAAA;EAxDe;EA0Df,KAAA,IAAS,EAAA,aAAe,OAAO;AAAA;AAAA,iBAGjB,iBAAA,CACd,SAAA,EAAW,MAAA,8BACX,WAAA,EAAa,MAAA,+BACZ,MAAA;AAAA,iBAKa,0BAAA,CAA2B,QAAA,EAAU,sBAAA,GAAyB,UAAU;AAAA,iBAmDxE,0BAAA,CACd,aAAA,EAAe,MAAA,mBACf,OAAA,EAAS,sBAAA,EACT,OAAA,EAAS,MAAA,+BACR,mBAAA;AAAA,iBA8BmB,mBAAA,CACpB,OAAA,EAAS,cAAA,EACT,MAAA,EAAQ,MAAA,EACR,IAAA,EAAM,uBAAA,GACL,OAAA;AAAA,iBA2BmB,iBAAA,CACpB,OAAA,EAAS,cAAA,EACT,MAAA,EAAQ,MAAA,EACR,IAAA;EAAQ,IAAA;EAAc,OAAA;EAAiB,GAAA;EAAc,OAAA,GAAU,MAAA;AAAA,IAC9D,OAAA;AAAA,iBA4Ba,qBAAA,CAAsB,OAAA,GAAS,sBAAA,GAA8B,eAAe"}
@@ -0,0 +1,282 @@
1
+ import { n as createLogger, t as consoleSink } from "../logger-Ktm-lj1s.js";
2
+ import { Buffer } from "node:buffer";
3
+ //#region src/contexts/daytona.ts
4
+ /** Per-probe timeout for the readiness `true` command. */
5
+ const READINESS_PROBE_TIMEOUT_SECONDS = 5;
6
+ /** Pause between readiness probes while the sandbox is still warming up. */
7
+ const READINESS_BACKOFF_MS = 250;
8
+ /** Setup scripts commonly install dependencies, so give them a generous cap. */
9
+ const PREGAME_TIMEOUT_SECONDS = 1800;
10
+ function resolveDaytonaEnv(optionEnv, perSpawnEnv) {
11
+ const merged = {
12
+ ...optionEnv,
13
+ ...perSpawnEnv
14
+ };
15
+ return Object.keys(merged).length > 0 ? merged : void 0;
16
+ }
17
+ function normalizeDaytonaExecResult(response) {
18
+ return {
19
+ stdout: response.stdout ?? response.artifacts?.stdout ?? response.result ?? response.output ?? "",
20
+ stderr: response.stderr ?? "",
21
+ exitCode: typeof response.exitCode === "number" ? response.exitCode : 0
22
+ };
23
+ }
24
+ function normalizeDaytonaExecError(error) {
25
+ const err = error;
26
+ if (typeof err.exitCode === "number") return {
27
+ stdout: typeof err.stdout === "string" ? err.stdout : typeof err.result === "string" ? err.result : typeof err.output === "string" ? err.output : "",
28
+ stderr: typeof err.stderr === "string" ? err.stderr : typeof err.message === "string" ? err.message : "",
29
+ exitCode: err.exitCode
30
+ };
31
+ return {
32
+ stdout: "",
33
+ stderr: error instanceof Error ? error.message : String(error),
34
+ exitCode: 124
35
+ };
36
+ }
37
+ function bufferToString(value) {
38
+ if (Buffer.isBuffer(value)) return value.toString("utf8");
39
+ if (value instanceof ArrayBuffer) return new TextDecoder().decode(new Uint8Array(value));
40
+ if (value instanceof Uint8Array) return new TextDecoder().decode(value);
41
+ return value.toString("utf8");
42
+ }
43
+ function toClientConfig(apiKey, apiUrl, target) {
44
+ const config = {};
45
+ if (apiKey !== void 0) config.apiKey = apiKey;
46
+ if (apiUrl !== void 0) config.apiUrl = apiUrl;
47
+ if (target !== void 0) config.target = target;
48
+ return Object.keys(config).length > 0 ? config : void 0;
49
+ }
50
+ function takeString(value) {
51
+ return typeof value === "string" && value.length > 0 ? value : void 0;
52
+ }
53
+ function resolveDaytonaCreateParams(sandboxConfig, options, envVars) {
54
+ const reserved = new Set([
55
+ "provider",
56
+ "apiKey",
57
+ "apiUrl",
58
+ "target",
59
+ "sandboxId"
60
+ ]);
61
+ const params = {};
62
+ for (const [key, value] of Object.entries(sandboxConfig)) if (!reserved.has(key) && value !== void 0) params[key] = value;
63
+ const language = takeString(sandboxConfig.language) ?? options.language;
64
+ const snapshot = takeString(sandboxConfig.snapshot) ?? options.snapshot;
65
+ const image = sandboxConfig.image ?? options.image;
66
+ const resources = sandboxConfig.resources ?? options.resources;
67
+ const configEnvVars = sandboxConfig.envVars;
68
+ const mergedEnvVars = resolveDaytonaEnv(envVars, configEnvVars);
69
+ if (language !== void 0) params.language = language;
70
+ if (snapshot !== void 0) params.snapshot = snapshot;
71
+ if (image !== void 0) params.image = image;
72
+ if (resources !== void 0) params.resources = resources;
73
+ if (mergedEnvVars !== void 0) params.envVars = mergedEnvVars;
74
+ return Object.keys(params).length > 0 ? params : void 0;
75
+ }
76
+ async function waitForDaytonaReady(sandbox, logger, opts) {
77
+ if (opts.timeoutSeconds <= 0) return;
78
+ const now = opts.now ?? Date.now;
79
+ const sleep = opts.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
80
+ const start = now();
81
+ const deadline = start + opts.timeoutSeconds * 1e3;
82
+ logger.info("waiting for Daytona sandbox to initialize", { sandboxId: sandbox.id });
83
+ while (true) try {
84
+ await sandbox.process.executeCommand("true", void 0, void 0, READINESS_PROBE_TIMEOUT_SECONDS);
85
+ logger.info("Daytona sandbox ready", {
86
+ sandboxId: sandbox.id,
87
+ elapsedMs: now() - start
88
+ });
89
+ return;
90
+ } catch {
91
+ if (now() >= deadline) {
92
+ await opts.cleanupOnTimeout?.().catch(() => {});
93
+ throw new Error(`Daytona sandbox ${sandbox.id} did not become ready within ${opts.timeoutSeconds}s`);
94
+ }
95
+ await sleep(READINESS_BACKOFF_MS);
96
+ }
97
+ }
98
+ async function runDaytonaPregame(sandbox, logger, opts) {
99
+ const path = `/tmp/${opts.name}`;
100
+ logger.info("running Daytona pregame script", {
101
+ sandboxId: sandbox.id,
102
+ path
103
+ });
104
+ await sandbox.fs.uploadFile(Buffer.from(opts.content), path);
105
+ const quoted = JSON.stringify(path);
106
+ let result;
107
+ try {
108
+ result = normalizeDaytonaExecResult(await sandbox.process.executeCommand(`chmod +x ${quoted} && ${quoted}`, opts.cwd, opts.envVars, PREGAME_TIMEOUT_SECONDS));
109
+ } catch (err) {
110
+ result = normalizeDaytonaExecError(err);
111
+ }
112
+ if (result.exitCode !== 0) {
113
+ logger.error("Daytona pregame script failed", {
114
+ sandboxId: sandbox.id,
115
+ exitCode: result.exitCode,
116
+ stdout: result.stdout,
117
+ stderr: result.stderr
118
+ });
119
+ throw new Error(`Daytona pregame script ${opts.name} failed with exit code ${result.exitCode}`);
120
+ }
121
+ logger.info("Daytona pregame ready", {
122
+ sandboxId: sandbox.id,
123
+ stdout: result.stdout,
124
+ stderr: result.stderr
125
+ });
126
+ }
127
+ function createDaytonaProvider(options = {}) {
128
+ const live = /* @__PURE__ */ new Map();
129
+ const logger = options.logger ?? createLogger(consoleSink());
130
+ const readinessTimeoutSeconds = options.readinessTimeoutSeconds ?? 60;
131
+ async function loadSdk() {
132
+ try {
133
+ return (await import("@daytona/sdk")).Daytona;
134
+ } catch {
135
+ throw new Error("@daytona/sdk is required for the Daytona sandbox provider. Install it with: bun add @daytona/sdk");
136
+ }
137
+ }
138
+ function get(sandboxId) {
139
+ const entry = live.get(sandboxId);
140
+ if (!entry) throw new Error(`Daytona sandbox ${sandboxId} is not tracked by this provider`);
141
+ return entry;
142
+ }
143
+ async function deleteOwnedSandbox(sandbox) {
144
+ try {
145
+ await sandbox.delete();
146
+ } catch {}
147
+ }
148
+ async function stopOwnedSandbox(sandbox) {
149
+ if (!sandbox.stop) {
150
+ logger.error("cannot stop Daytona sandbox: this @daytona/sdk install exposes no stop() method; leaving it running", { sandboxId: sandbox.id });
151
+ return;
152
+ }
153
+ try {
154
+ await sandbox.stop();
155
+ logger.info("stopped Daytona sandbox; reconnect later via the sandboxId option (CLI: --sandbox)", { sandboxId: sandbox.id });
156
+ } catch (err) {
157
+ logger.error("failed to stop Daytona sandbox; it will run until Daytona lifecycle policy stops it", {
158
+ sandboxId: sandbox.id,
159
+ error: err instanceof Error ? err.message : String(err)
160
+ });
161
+ }
162
+ }
163
+ async function archiveOwnedSandbox(sandbox) {
164
+ if (!sandbox.stop || !sandbox.archive) {
165
+ logger.error("cannot archive Daytona sandbox: this @daytona/sdk install exposes no stop() and archive() pair; leaving it running", { sandboxId: sandbox.id });
166
+ return;
167
+ }
168
+ try {
169
+ await sandbox.stop();
170
+ await sandbox.archive();
171
+ logger.info("archived Daytona sandbox; reconnect later via the sandboxId option (CLI: --sandbox)", { sandboxId: sandbox.id });
172
+ } catch (err) {
173
+ logger.error("failed to archive Daytona sandbox; it will run until Daytona lifecycle policy stops it", {
174
+ sandboxId: sandbox.id,
175
+ error: err instanceof Error ? err.message : String(err)
176
+ });
177
+ }
178
+ }
179
+ async function startAttachedSandboxIfNeeded(sandbox) {
180
+ if (sandbox.state !== "stopped" && sandbox.state !== "archived") return;
181
+ if (!sandbox.start) {
182
+ logger.error("cannot start Daytona sandbox before attach readiness probe: this @daytona/sdk install exposes no start() method", {
183
+ sandboxId: sandbox.id,
184
+ state: sandbox.state
185
+ });
186
+ return;
187
+ }
188
+ logger.info("starting Daytona sandbox before attach readiness probe", {
189
+ sandboxId: sandbox.id,
190
+ state: sandbox.state
191
+ });
192
+ await sandbox.start(readinessTimeoutSeconds > 0 ? readinessTimeoutSeconds : void 0);
193
+ }
194
+ return {
195
+ name: "daytona",
196
+ async spawn(config = {}) {
197
+ const Daytona = await loadSdk();
198
+ const sb = config.sandbox ?? {};
199
+ const apiKey = takeString(sb.apiKey) ?? options.apiKey;
200
+ const apiUrl = takeString(sb.apiUrl) ?? options.apiUrl;
201
+ const target = takeString(sb.target) ?? options.target;
202
+ const connectId = takeString(sb.sandboxId) ?? options.sandboxId;
203
+ const envVars = resolveDaytonaEnv(options.env, config.env);
204
+ const daytona = new Daytona(toClientConfig(apiKey, apiUrl, target));
205
+ const owned = connectId === void 0;
206
+ const sandbox = connectId !== void 0 ? await daytona.get(connectId) : await daytona.create(resolveDaytonaCreateParams(sb, options, envVars));
207
+ if (!owned) await startAttachedSandboxIfNeeded(sandbox);
208
+ live.set(sandbox.id, {
209
+ sandbox,
210
+ env: envVars,
211
+ owned
212
+ });
213
+ try {
214
+ await waitForDaytonaReady(sandbox, logger, {
215
+ timeoutSeconds: readinessTimeoutSeconds,
216
+ ...owned ? { cleanupOnTimeout: () => deleteOwnedSandbox(sandbox) } : {}
217
+ });
218
+ } catch (err) {
219
+ live.delete(sandbox.id);
220
+ throw err;
221
+ }
222
+ const requestedCwd = config.cwd ?? options.cwd;
223
+ let cwd;
224
+ if (requestedCwd) {
225
+ cwd = requestedCwd;
226
+ await sandbox.process.executeCommand(`mkdir -p ${JSON.stringify(cwd)}`).catch(() => {});
227
+ } else if (sandbox.getWorkDir) {
228
+ cwd = await sandbox.getWorkDir().catch(() => "");
229
+ if (!cwd) cwd = await sandbox.process.executeCommand("pwd").then((r) => normalizeDaytonaExecResult(r).stdout.trim()).catch(() => "") || "/home/daytona";
230
+ } else cwd = await sandbox.process.executeCommand("pwd").then((r) => normalizeDaytonaExecResult(r).stdout.trim()).catch(() => "") || "/home/daytona";
231
+ if (options.pregame) try {
232
+ await runDaytonaPregame(sandbox, logger, {
233
+ name: options.pregame.name,
234
+ content: options.pregame.content,
235
+ cwd,
236
+ envVars
237
+ });
238
+ } catch (err) {
239
+ if (owned) await deleteOwnedSandbox(sandbox);
240
+ live.delete(sandbox.id);
241
+ throw err;
242
+ }
243
+ return {
244
+ id: sandbox.id,
245
+ cwd
246
+ };
247
+ },
248
+ async exec(sandboxId, command, opts) {
249
+ const { sandbox, env } = get(sandboxId);
250
+ const timeoutSeconds = opts?.timeout ?? 30;
251
+ try {
252
+ return normalizeDaytonaExecResult(await sandbox.process.executeCommand(command, opts?.cwd, resolveDaytonaEnv(env, opts?.env), timeoutSeconds > 0 ? timeoutSeconds : void 0));
253
+ } catch (err) {
254
+ return normalizeDaytonaExecError(err);
255
+ }
256
+ },
257
+ async readFile(sandboxId, path) {
258
+ return bufferToString(await get(sandboxId).sandbox.fs.downloadFile(path));
259
+ },
260
+ async writeFile(sandboxId, path, content) {
261
+ await get(sandboxId).sandbox.fs.uploadFile(Buffer.from(content), path);
262
+ },
263
+ async listFiles(sandboxId, path) {
264
+ return (await get(sandboxId).sandbox.fs.listFiles(path)).map((e) => e.name);
265
+ },
266
+ async destroy(sandboxId) {
267
+ const entry = live.get(sandboxId);
268
+ if (!entry) return;
269
+ if (entry.owned) {
270
+ const action = options.onDestroy ?? "delete";
271
+ if (action === "stop" || action === "pause") await stopOwnedSandbox(entry.sandbox);
272
+ else if (action === "archive") await archiveOwnedSandbox(entry.sandbox);
273
+ else if (action === "delete" || action === "kill") await deleteOwnedSandbox(entry.sandbox);
274
+ }
275
+ live.delete(sandboxId);
276
+ }
277
+ };
278
+ }
279
+ //#endregion
280
+ export { createDaytonaProvider, normalizeDaytonaExecResult, resolveDaytonaCreateParams, resolveDaytonaEnv, runDaytonaPregame, waitForDaytonaReady };
281
+
282
+ //# sourceMappingURL=daytona.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daytona.js","names":[],"sources":["../../src/contexts/daytona.ts"],"sourcesContent":["/**\n * Daytona sandbox provider.\n *\n * Implements {@link SandboxProvider} on top of Daytona sandboxes. Pair it with\n * {@link createSandboxContext} to run an agent's shell + filesystem tools\n * inside a Daytona sandbox:\n *\n * ```ts\n * import { createSandboxContext } from 'zidane/contexts'\n * import { createDaytonaProvider } from 'zidane/contexts/daytona'\n *\n * const execution = createSandboxContext(createDaytonaProvider())\n * ```\n *\n * Requires `@daytona/sdk` as an optional peer dependency:\n * `bun add @daytona/sdk`.\n */\n\nimport type { Logger } from '../logger'\nimport type { SandboxProvider } from './sandbox'\nimport type { ExecResult, SpawnConfig } from './types'\nimport { Buffer } from 'node:buffer'\nimport { consoleSink, createLogger } from '../logger'\n\n// ---------------------------------------------------------------------------\n// Minimal structural views of the `@daytona/sdk` surface we touch. Declared\n// locally so zidane typechecks without the optional peer dependency installed.\n// ---------------------------------------------------------------------------\n\ninterface DaytonaExecuteResponse {\n exitCode?: number | null\n result?: string | null\n output?: string | null\n stdout?: string | null\n stderr?: string | null\n artifacts?: { stdout?: string | null }\n}\n\ninterface DaytonaFileEntry {\n name: string\n}\n\ninterface DaytonaSandbox {\n id: string\n state?: string\n process: {\n executeCommand: (command: string, cwd?: string, env?: Record<string, string>, timeout?: number) => Promise<DaytonaExecuteResponse>\n }\n fs: {\n downloadFile: (path: string) => Promise<Uint8Array | ArrayBuffer | { toString: (encoding?: BufferEncoding) => string }>\n uploadFile: (content: Uint8Array | Buffer, path: string) => Promise<unknown>\n listFiles: (path: string) => Promise<DaytonaFileEntry[]>\n }\n getWorkDir?: () => Promise<string>\n start?: (timeout?: number) => Promise<unknown>\n delete: (timeout?: number) => Promise<unknown>\n stop?: (timeout?: number) => Promise<unknown>\n archive?: () => Promise<unknown>\n}\n\ninterface DaytonaClientConfig {\n apiKey?: string\n apiUrl?: string\n target?: string\n}\n\ninterface DaytonaResources {\n cpu?: number\n memory?: number\n disk?: number\n gpu?: number\n [key: string]: unknown\n}\n\ninterface DaytonaCreateParams {\n language?: string\n snapshot?: string\n image?: unknown\n resources?: DaytonaResources\n envVars?: Record<string, string>\n [key: string]: unknown\n}\n\ninterface DaytonaClient {\n create: (params?: DaytonaCreateParams) => Promise<DaytonaSandbox>\n get: (sandboxIdOrName: string) => Promise<DaytonaSandbox>\n}\n\ntype DaytonaConstructor = new (config?: DaytonaClientConfig) => DaytonaClient\n\n// ---------------------------------------------------------------------------\n// Provider options\n// ---------------------------------------------------------------------------\n\nexport type DaytonaOnDestroy = 'delete' | 'kill' | 'stop' | 'pause' | 'archive' | 'leave'\n\nexport interface DaytonaProviderOptions {\n /** Daytona API key. Falls back to the `DAYTONA_API_KEY` env var when omitted. */\n apiKey?: string\n /** Daytona API URL. Falls back to `DAYTONA_API_URL`, then Daytona's hosted default. */\n apiUrl?: string\n /** Daytona target / region. Falls back to `DAYTONA_TARGET`, then the org default. */\n target?: string\n /**\n * Attach to a pre-existing sandbox by id or name instead of creating a fresh\n * one. The provider treats attached sandboxes as externally owned and leaves\n * them running on destroy/failure.\n */\n sandboxId?: string\n /** Daytona snapshot used when creating a fresh sandbox. */\n snapshot?: string\n /** Runtime used for Daytona's code tooling. Shell execution works either way. */\n language?: string\n /** Daytona image/declarative builder input used when creating a fresh sandbox. */\n image?: unknown\n /** Daytona sandbox resources. */\n resources?: DaytonaResources\n /** Default working directory, applied when a spawn doesn't set `SpawnConfig.cwd`. */\n cwd?: string\n /** Environment variables baked into the sandbox and re-sent on every command. */\n env?: Record<string, string>\n /** Logger for provider-level lifecycle lines. */\n logger?: Logger\n /** Total deadline, in seconds, for the post-create readiness probe. Defaults to `60`. */\n readinessTimeoutSeconds?: number\n /** Setup script to upload and run once the sandbox is ready. */\n pregame?: { name: string, content: string }\n /**\n * What to do with an owned sandbox on destroy:\n *\n * - `'delete'` / `'kill'` (default) — call `sandbox.delete()`.\n * - `'stop'` / `'pause'` — call `sandbox.stop()` so Daytona preserves state\n * according to the runner's stop semantics.\n * - `'archive'` — stop, then archive for longer-term persistence.\n * - `'leave'` — make no API call.\n */\n onDestroy?: DaytonaOnDestroy\n}\n\n/** Per-probe timeout for the readiness `true` command. */\nconst READINESS_PROBE_TIMEOUT_SECONDS = 5\n/** Pause between readiness probes while the sandbox is still warming up. */\nconst READINESS_BACKOFF_MS = 250\n/** Setup scripts commonly install dependencies, so give them a generous cap. */\nconst PREGAME_TIMEOUT_SECONDS = 30 * 60\n\nexport interface DaytonaReadinessOptions {\n /** Total deadline in seconds. `<= 0` disables the probe entirely. */\n timeoutSeconds: number\n /** Optional cleanup for owned sandboxes that never become ready. */\n cleanupOnTimeout?: () => Promise<void>\n /** Clock source — injectable for deterministic tests. */\n now?: () => number\n /** Sleep between probes — injectable for deterministic tests. */\n sleep?: (ms: number) => Promise<void>\n}\n\nexport function resolveDaytonaEnv(\n optionEnv: Record<string, string> | undefined,\n perSpawnEnv: Record<string, string> | undefined,\n): Record<string, string> | undefined {\n const merged = { ...optionEnv, ...perSpawnEnv }\n return Object.keys(merged).length > 0 ? merged : undefined\n}\n\nexport function normalizeDaytonaExecResult(response: DaytonaExecuteResponse): ExecResult {\n return {\n stdout: response.stdout ?? response.artifacts?.stdout ?? response.result ?? response.output ?? '',\n stderr: response.stderr ?? '',\n exitCode: typeof response.exitCode === 'number' ? response.exitCode : 0,\n }\n}\n\nfunction normalizeDaytonaExecError(error: unknown): ExecResult {\n const err = error as { exitCode?: unknown, stdout?: unknown, stderr?: unknown, result?: unknown, output?: unknown, message?: unknown }\n if (typeof err.exitCode === 'number') {\n return {\n stdout: typeof err.stdout === 'string'\n ? err.stdout\n : typeof err.result === 'string'\n ? err.result\n : typeof err.output === 'string'\n ? err.output\n : '',\n stderr: typeof err.stderr === 'string' ? err.stderr : typeof err.message === 'string' ? err.message : '',\n exitCode: err.exitCode,\n }\n }\n return { stdout: '', stderr: error instanceof Error ? error.message : String(error), exitCode: 124 }\n}\n\nfunction bufferToString(value: Uint8Array | ArrayBuffer | { toString: (encoding?: BufferEncoding) => string }): string {\n if (Buffer.isBuffer(value))\n return value.toString('utf8')\n if (value instanceof ArrayBuffer)\n return new TextDecoder().decode(new Uint8Array(value))\n if (value instanceof Uint8Array)\n return new TextDecoder().decode(value)\n return value.toString('utf8')\n}\n\nfunction toClientConfig(apiKey?: string, apiUrl?: string, target?: string): DaytonaClientConfig | undefined {\n const config: DaytonaClientConfig = {}\n if (apiKey !== undefined)\n config.apiKey = apiKey\n if (apiUrl !== undefined)\n config.apiUrl = apiUrl\n if (target !== undefined)\n config.target = target\n return Object.keys(config).length > 0 ? config : undefined\n}\n\nfunction takeString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nexport function resolveDaytonaCreateParams(\n sandboxConfig: Record<string, unknown>,\n options: DaytonaProviderOptions,\n envVars: Record<string, string> | undefined,\n): DaytonaCreateParams | undefined {\n const reserved = new Set(['provider', 'apiKey', 'apiUrl', 'target', 'sandboxId'])\n const params: DaytonaCreateParams = {}\n\n for (const [key, value] of Object.entries(sandboxConfig)) {\n if (!reserved.has(key) && value !== undefined)\n params[key] = value\n }\n\n const language = takeString(sandboxConfig.language) ?? options.language\n const snapshot = takeString(sandboxConfig.snapshot) ?? options.snapshot\n const image = sandboxConfig.image ?? options.image\n const resources = (sandboxConfig.resources as DaytonaResources | undefined) ?? options.resources\n const configEnvVars = sandboxConfig.envVars as Record<string, string> | undefined\n const mergedEnvVars = resolveDaytonaEnv(envVars, configEnvVars)\n\n if (language !== undefined)\n params.language = language\n if (snapshot !== undefined)\n params.snapshot = snapshot\n if (image !== undefined)\n params.image = image\n if (resources !== undefined)\n params.resources = resources\n if (mergedEnvVars !== undefined)\n params.envVars = mergedEnvVars\n\n return Object.keys(params).length > 0 ? params : undefined\n}\n\nexport async function waitForDaytonaReady(\n sandbox: DaytonaSandbox,\n logger: Logger,\n opts: DaytonaReadinessOptions,\n): Promise<void> {\n if (opts.timeoutSeconds <= 0)\n return\n\n const now = opts.now ?? Date.now\n const sleep = opts.sleep ?? (ms => new Promise<void>(resolve => setTimeout(resolve, ms)))\n const start = now()\n const deadline = start + opts.timeoutSeconds * 1000\n\n logger.info('waiting for Daytona sandbox to initialize', { sandboxId: sandbox.id })\n\n while (true) {\n try {\n await sandbox.process.executeCommand('true', undefined, undefined, READINESS_PROBE_TIMEOUT_SECONDS)\n logger.info('Daytona sandbox ready', { sandboxId: sandbox.id, elapsedMs: now() - start })\n return\n }\n catch {\n if (now() >= deadline) {\n await opts.cleanupOnTimeout?.().catch(() => {})\n throw new Error(`Daytona sandbox ${sandbox.id} did not become ready within ${opts.timeoutSeconds}s`)\n }\n await sleep(READINESS_BACKOFF_MS)\n }\n }\n}\n\nexport async function runDaytonaPregame(\n sandbox: DaytonaSandbox,\n logger: Logger,\n opts: { name: string, content: string, cwd?: string, envVars?: Record<string, string> },\n): Promise<void> {\n const path = `/tmp/${opts.name}`\n logger.info('running Daytona pregame script', { sandboxId: sandbox.id, path })\n await sandbox.fs.uploadFile(Buffer.from(opts.content), path)\n\n const quoted = JSON.stringify(path)\n let result: ExecResult\n try {\n result = normalizeDaytonaExecResult(\n await sandbox.process.executeCommand(`chmod +x ${quoted} && ${quoted}`, opts.cwd, opts.envVars, PREGAME_TIMEOUT_SECONDS),\n )\n }\n catch (err) {\n result = normalizeDaytonaExecError(err)\n }\n\n if (result.exitCode !== 0) {\n logger.error('Daytona pregame script failed', { sandboxId: sandbox.id, exitCode: result.exitCode, stdout: result.stdout, stderr: result.stderr })\n throw new Error(`Daytona pregame script ${opts.name} failed with exit code ${result.exitCode}`)\n }\n\n logger.info('Daytona pregame ready', { sandboxId: sandbox.id, stdout: result.stdout, stderr: result.stderr })\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport function createDaytonaProvider(options: DaytonaProviderOptions = {}): SandboxProvider {\n const live = new Map<string, { sandbox: DaytonaSandbox, env?: Record<string, string>, owned: boolean }>()\n const logger = options.logger ?? createLogger(consoleSink())\n const readinessTimeoutSeconds = options.readinessTimeoutSeconds ?? 60\n\n async function loadSdk(): Promise<DaytonaConstructor> {\n try {\n const mod = await import('@daytona/sdk') as { Daytona: DaytonaConstructor }\n return mod.Daytona\n }\n catch {\n throw new Error('@daytona/sdk is required for the Daytona sandbox provider. Install it with: bun add @daytona/sdk')\n }\n }\n\n function get(sandboxId: string): { sandbox: DaytonaSandbox, env?: Record<string, string>, owned: boolean } {\n const entry = live.get(sandboxId)\n if (!entry)\n throw new Error(`Daytona sandbox ${sandboxId} is not tracked by this provider`)\n return entry\n }\n\n async function deleteOwnedSandbox(sandbox: DaytonaSandbox): Promise<void> {\n try {\n await sandbox.delete()\n }\n catch {\n // Already gone — nothing to clean up.\n }\n }\n\n async function stopOwnedSandbox(sandbox: DaytonaSandbox): Promise<void> {\n if (!sandbox.stop) {\n logger.error('cannot stop Daytona sandbox: this @daytona/sdk install exposes no stop() method; leaving it running', { sandboxId: sandbox.id })\n return\n }\n try {\n await sandbox.stop()\n logger.info('stopped Daytona sandbox; reconnect later via the sandboxId option (CLI: --sandbox)', { sandboxId: sandbox.id })\n }\n catch (err) {\n logger.error('failed to stop Daytona sandbox; it will run until Daytona lifecycle policy stops it', { sandboxId: sandbox.id, error: err instanceof Error ? err.message : String(err) })\n }\n }\n\n async function archiveOwnedSandbox(sandbox: DaytonaSandbox): Promise<void> {\n if (!sandbox.stop || !sandbox.archive) {\n logger.error('cannot archive Daytona sandbox: this @daytona/sdk install exposes no stop() and archive() pair; leaving it running', { sandboxId: sandbox.id })\n return\n }\n try {\n await sandbox.stop()\n await sandbox.archive()\n logger.info('archived Daytona sandbox; reconnect later via the sandboxId option (CLI: --sandbox)', { sandboxId: sandbox.id })\n }\n catch (err) {\n logger.error('failed to archive Daytona sandbox; it will run until Daytona lifecycle policy stops it', { sandboxId: sandbox.id, error: err instanceof Error ? err.message : String(err) })\n }\n }\n\n async function startAttachedSandboxIfNeeded(sandbox: DaytonaSandbox): Promise<void> {\n if (sandbox.state !== 'stopped' && sandbox.state !== 'archived')\n return\n if (!sandbox.start) {\n logger.error('cannot start Daytona sandbox before attach readiness probe: this @daytona/sdk install exposes no start() method', { sandboxId: sandbox.id, state: sandbox.state })\n return\n }\n logger.info('starting Daytona sandbox before attach readiness probe', { sandboxId: sandbox.id, state: sandbox.state })\n await sandbox.start(readinessTimeoutSeconds > 0 ? readinessTimeoutSeconds : undefined)\n }\n\n return {\n name: 'daytona',\n\n async spawn(config: SpawnConfig = {}): Promise<{ id: string, cwd: string }> {\n const Daytona = await loadSdk()\n const sb: Record<string, unknown> = config.sandbox ?? {}\n\n const apiKey = takeString(sb.apiKey) ?? options.apiKey\n const apiUrl = takeString(sb.apiUrl) ?? options.apiUrl\n const target = takeString(sb.target) ?? options.target\n const connectId = takeString(sb.sandboxId) ?? options.sandboxId\n const envVars = resolveDaytonaEnv(options.env, config.env)\n\n const daytona = new Daytona(toClientConfig(apiKey, apiUrl, target))\n const owned = connectId === undefined\n const sandbox = connectId !== undefined\n ? await daytona.get(connectId)\n : await daytona.create(resolveDaytonaCreateParams(sb, options, envVars))\n\n if (!owned)\n await startAttachedSandboxIfNeeded(sandbox)\n\n live.set(sandbox.id, { sandbox, env: envVars, owned })\n\n try {\n await waitForDaytonaReady(sandbox, logger, {\n timeoutSeconds: readinessTimeoutSeconds,\n ...(owned ? { cleanupOnTimeout: () => deleteOwnedSandbox(sandbox) } : {}),\n })\n }\n catch (err) {\n live.delete(sandbox.id)\n throw err\n }\n\n const requestedCwd = config.cwd ?? options.cwd\n let cwd: string\n if (requestedCwd) {\n cwd = requestedCwd\n await sandbox.process.executeCommand(`mkdir -p ${JSON.stringify(cwd)}`).catch(() => {})\n }\n else if (sandbox.getWorkDir) {\n cwd = await sandbox.getWorkDir().catch(() => '')\n if (!cwd)\n cwd = await sandbox.process.executeCommand('pwd').then(r => normalizeDaytonaExecResult(r).stdout.trim()).catch(() => '') || '/home/daytona'\n }\n else {\n cwd = await sandbox.process.executeCommand('pwd').then(r => normalizeDaytonaExecResult(r).stdout.trim()).catch(() => '') || '/home/daytona'\n }\n\n if (options.pregame) {\n try {\n await runDaytonaPregame(sandbox, logger, { name: options.pregame.name, content: options.pregame.content, cwd, envVars })\n }\n catch (err) {\n if (owned)\n await deleteOwnedSandbox(sandbox)\n live.delete(sandbox.id)\n throw err\n }\n }\n\n return { id: sandbox.id, cwd }\n },\n\n async exec(sandboxId, command, opts): Promise<ExecResult> {\n const { sandbox, env } = get(sandboxId)\n const timeoutSeconds = opts?.timeout ?? 30\n try {\n return normalizeDaytonaExecResult(\n await sandbox.process.executeCommand(\n command,\n opts?.cwd,\n resolveDaytonaEnv(env, opts?.env),\n timeoutSeconds > 0 ? timeoutSeconds : undefined,\n ),\n )\n }\n catch (err) {\n return normalizeDaytonaExecError(err)\n }\n },\n\n async readFile(sandboxId, path): Promise<string> {\n return bufferToString(await get(sandboxId).sandbox.fs.downloadFile(path))\n },\n\n async writeFile(sandboxId, path, content): Promise<void> {\n await get(sandboxId).sandbox.fs.uploadFile(Buffer.from(content), path)\n },\n\n async listFiles(sandboxId, path): Promise<string[]> {\n const entries = await get(sandboxId).sandbox.fs.listFiles(path)\n return entries.map(e => e.name)\n },\n\n async destroy(sandboxId): Promise<void> {\n const entry = live.get(sandboxId)\n if (!entry)\n return\n if (entry.owned) {\n const action = options.onDestroy ?? 'delete'\n if (action === 'stop' || action === 'pause')\n await stopOwnedSandbox(entry.sandbox)\n else if (action === 'archive')\n await archiveOwnedSandbox(entry.sandbox)\n else if (action === 'delete' || action === 'kill')\n await deleteOwnedSandbox(entry.sandbox)\n }\n live.delete(sandboxId)\n },\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { t as SandboxProvider } from "../index-CrMb8jCE.js";
2
- import { a as Logger } from "../logger-DZcTJ3YX.js";
2
+ import { a as Logger } from "../logger-Dcrj48qY.js";
3
3
 
4
4
  //#region src/contexts/e2b.d.ts
5
5
  interface E2BCommandResult {
@@ -1,9 +1,27 @@
1
1
  import { dirname, isAbsolute, relative, resolve } from "node:path";
2
2
  import { createWriteStream } from "node:fs";
3
- import { mkdir, readFile, readdir, realpath, writeFile } from "node:fs/promises";
4
- import { spawn } from "node:child_process";
3
+ import { mkdir, readFile, readdir, realpath, stat, writeFile } from "node:fs/promises";
5
4
  //#region src/contexts/process.ts
6
5
  /**
6
+ * Lazily load `node:child_process`'s `spawn` (memoized after first use).
7
+ *
8
+ * Deliberately NOT a static top-level import. `createAgent` pulls this module
9
+ * into the graph as the default execution context, so a static
10
+ * `import … from 'node:child_process'` would make merely importing zidane
11
+ * depend on subprocess support. Runtimes that gate that builtin at import time
12
+ * — Supabase Edge Functions, Cloudflare `nodejs_compat`, other shell-less V8
13
+ * isolates — would then fail to load the package at all. Deferring the import
14
+ * to the first `exec` keeps `import 'zidane'` + the provider loop runnable
15
+ * there; only actually invoking a shell command touches subprocess, which is
16
+ * exactly where an unsupported host should fail (the agent loop turns that
17
+ * throw into a clean tool-result error).
18
+ */
19
+ let spawnChildPromise;
20
+ async function loadSpawn() {
21
+ spawnChildPromise ??= import("node:child_process").then((m) => m.spawn);
22
+ return spawnChildPromise;
23
+ }
24
+ /**
7
25
  * Whether the host supports POSIX process groups (the `detached: true` +
8
26
  * `process.kill(-pid)` combination). Windows doesn't — its job-object
9
27
  * model is shaped differently — so on win32 we fall back to killing the
@@ -193,7 +211,13 @@ function createProcessContext(config) {
193
211
  async spawn(overrides) {
194
212
  const id = `process-${++counter}`;
195
213
  const cwd = overrides?.cwd ?? defaultCwd;
196
- await mkdir(cwd, { recursive: true });
214
+ let needsCreate = false;
215
+ try {
216
+ await stat(cwd);
217
+ } catch (err) {
218
+ needsCreate = err?.code === "ENOENT";
219
+ }
220
+ if (needsCreate) await mkdir(cwd, { recursive: true });
197
221
  const handle = {
198
222
  id,
199
223
  type: "process",
@@ -211,8 +235,9 @@ function createProcessContext(config) {
211
235
  };
212
236
  const timeoutMs = (options?.timeout ?? config?.limits?.timeout ?? 30) * 1e3;
213
237
  const maxBuffer = DEFAULT_MAX_BUFFER;
238
+ const spawnChild = await loadSpawn();
214
239
  return new Promise((resolveP) => {
215
- const child = spawn("/bin/sh", ["-c", command], {
240
+ const child = spawnChild("/bin/sh", ["-c", command], {
216
241
  cwd,
217
242
  env: {
218
243
  ...baseEnv,
@@ -339,6 +364,7 @@ function createProcessContext(config) {
339
364
  },
340
365
  async execBackground(handle, command, options) {
341
366
  const cwd = options.cwd ? resolve(handle.cwd, options.cwd) : handle.cwd;
367
+ const spawnChild = await loadSpawn();
342
368
  await mkdir(options.outputDir, { recursive: true });
343
369
  const taskId = `bash_${++taskCounter}`;
344
370
  assertSafeTaskId(taskId);
@@ -351,7 +377,7 @@ function createProcessContext(config) {
351
377
  outputStream.on("error", (err) => {
352
378
  if (process.env.ZIDANE_DEBUG) process.stderr.write(`[zidane/contexts] task ${taskId} log stream error: ${err.message}\n`);
353
379
  });
354
- const child = spawn("/bin/sh", ["-c", command], {
380
+ const child = spawnChild("/bin/sh", ["-c", command], {
355
381
  cwd,
356
382
  env: {
357
383
  ...baseEnv,
@@ -693,4 +719,4 @@ function resolveDetachedTasksCapability(context) {
693
719
  //#endregion
694
720
  export { createSandboxContext as n, createProcessContext as r, resolveDetachedTasksCapability as t };
695
721
 
696
- //# sourceMappingURL=contexts-DglWSzmR.js.map
722
+ //# sourceMappingURL=contexts-VhV4Af8x.js.map