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.
- package/README.md +6 -0
- package/dist/{agent-DFxjgQx5.d.ts → agent-Db4ojCSV.d.ts} +358 -49
- package/dist/agent-Db4ojCSV.d.ts.map +1 -0
- package/dist/atomic-write-Bgtr5JPu.js +100 -0
- package/dist/atomic-write-Bgtr5JPu.js.map +1 -0
- package/dist/chat/pure.d.ts +3 -3
- package/dist/chat.d.ts +17 -117
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +3 -3
- package/dist/contexts/daytona.d.ts +123 -0
- package/dist/contexts/daytona.d.ts.map +1 -0
- package/dist/contexts/daytona.js +282 -0
- package/dist/contexts/daytona.js.map +1 -0
- package/dist/contexts/e2b.d.ts +1 -1
- package/dist/{contexts-DglWSzmR.js → contexts-VhV4Af8x.js} +32 -6
- package/dist/contexts-VhV4Af8x.js.map +1 -0
- package/dist/contexts.js +1 -1
- package/dist/eval.d.ts +1 -1
- package/dist/eval.js +4 -4
- package/dist/{headless-Cbknpgjo.js → headless-tVN-g6IR.js} +7 -7
- package/dist/headless-tVN-g6IR.js.map +1 -0
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +1 -1
- package/dist/{index-C3wPsOFw.d.ts → index-BEblm0Hu.d.ts} +2 -2
- package/dist/{index-C3wPsOFw.d.ts.map → index-BEblm0Hu.d.ts.map} +1 -1
- package/dist/{index-DoQ0MHlp.d.ts → index-CJ-2g7bY.d.ts} +86 -18
- package/dist/index-CJ-2g7bY.d.ts.map +1 -0
- package/dist/index-CrMb8jCE.d.ts.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.js +12 -12
- package/dist/{interpolate-Da6kPCXn.js → interpolate-ConAiXGy.js} +2 -2
- package/dist/{interpolate-Da6kPCXn.js.map → interpolate-ConAiXGy.js.map} +1 -1
- package/dist/{logger-DZcTJ3YX.d.ts → logger-Dcrj48qY.d.ts} +2 -2
- package/dist/{logger-DZcTJ3YX.d.ts.map → logger-Dcrj48qY.d.ts.map} +1 -1
- package/dist/login-D5rb4IG8.js +267 -0
- package/dist/login-D5rb4IG8.js.map +1 -0
- package/dist/{mcp-Bl0n3bNL.js → mcp-C_TIj91j.js} +2 -2
- package/dist/{mcp-Bl0n3bNL.js.map → mcp-C_TIj91j.js.map} +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.js +1 -1
- package/dist/{messages-CV_K9I6j.js → messages-CGazSyTL.js} +16 -13
- package/dist/messages-CGazSyTL.js.map +1 -0
- package/dist/output/stream-json.d.ts +2 -2
- package/dist/output/stream-json.js +1 -1
- package/dist/output/terminal.d.ts +2 -2
- package/dist/policy-DcGlpaNs.d.ts +129 -0
- package/dist/policy-DcGlpaNs.d.ts.map +1 -0
- package/dist/{presets-BsMR5nn6.js → presets-kPEMOCmE.js} +2 -2
- package/dist/{presets-BsMR5nn6.js.map → presets-kPEMOCmE.js.map} +1 -1
- package/dist/presets.d.ts +2 -2
- package/dist/presets.js +1 -1
- package/dist/{providers-C6rpOk0l.js → providers-Bo2biCyT.js} +47 -116
- package/dist/providers-Bo2biCyT.js.map +1 -0
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +2 -2
- package/dist/restate.d.ts +1 -1
- package/dist/restate.js +2 -1
- package/dist/restate.js.map +1 -1
- package/dist/session/sqlite.d.ts +1 -1
- package/dist/{session-nRmW_P8d.js → session-B69BQSn1.js} +2 -2
- package/dist/{session-nRmW_P8d.js.map → session-B69BQSn1.js.map} +1 -1
- package/dist/session.d.ts +1 -1
- package/dist/session.js +2 -2
- package/dist/skills.d.ts +2 -2
- package/dist/skills.js +1 -1
- package/dist/{tool-formatters-CCTIq3A-.d.ts → tool-formatters-CkqBgPH4.d.ts} +9 -31
- package/dist/tool-formatters-CkqBgPH4.d.ts.map +1 -0
- package/dist/tools/fetch-url.d.ts +1 -1
- package/dist/tools/web-search.d.ts +1 -1
- package/dist/{tools-fqToqHik.js → tools-5Bnlq68O.js} +2105 -1320
- package/dist/tools-5Bnlq68O.js.map +1 -0
- package/dist/tools.d.ts +2 -2
- package/dist/tools.js +1 -1
- package/dist/{transcript-anchors-DxAfqo4i.d.ts → transcript-anchors-BnLZmASt.d.ts} +17 -5
- package/dist/transcript-anchors-BnLZmASt.d.ts.map +1 -0
- package/dist/{transcript-anchors-Br_NijUC.js → transcript-anchors-D4PwUMyO.js} +1202 -103
- package/dist/transcript-anchors-D4PwUMyO.js.map +1 -0
- package/dist/tui.d.ts +3 -3
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +102 -148
- package/dist/tui.js.map +1 -1
- package/dist/{turn-operations-BTxf15kt.d.ts → turn-operations-B6FaQAZN.d.ts} +3 -3
- package/dist/{turn-operations-BTxf15kt.d.ts.map → turn-operations-B6FaQAZN.d.ts.map} +1 -1
- package/dist/types-DxHDaqN7.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/docs/ARCHITECTURE.md +6 -2
- package/docs/CHAT.md +29 -28
- package/docs/SKILL.md +1 -1
- package/docs/TUI.md +8 -8
- package/package.json +15 -5
- package/dist/agent-DFxjgQx5.d.ts.map +0 -1
- package/dist/contexts-DglWSzmR.js.map +0 -1
- package/dist/headless-Cbknpgjo.js.map +0 -1
- package/dist/index-DoQ0MHlp.d.ts.map +0 -1
- package/dist/login-uf01y_Yj.js +0 -1272
- package/dist/login-uf01y_Yj.js.map +0 -1
- package/dist/messages-CV_K9I6j.js.map +0 -1
- package/dist/providers-C6rpOk0l.js.map +0 -1
- package/dist/tool-formatters-CCTIq3A-.d.ts.map +0 -1
- package/dist/tools-fqToqHik.js.map +0 -1
- package/dist/transcript-anchors-Br_NijUC.js.map +0 -1
- 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
|
|
2
|
-
import {
|
|
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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"}
|
package/dist/contexts/e2b.d.ts
CHANGED
|
@@ -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
|
-
|
|
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 =
|
|
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 =
|
|
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-
|
|
722
|
+
//# sourceMappingURL=contexts-VhV4Af8x.js.map
|