@bastani/atomic 0.9.4-alpha.8 → 0.9.4

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 (166) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/builtin/cursor/CHANGELOG.md +6 -0
  3. package/dist/builtin/cursor/package.json +2 -2
  4. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  5. package/dist/builtin/intercom/package.json +1 -1
  6. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  7. package/dist/builtin/mcp/package.json +1 -1
  8. package/dist/builtin/subagents/CHANGELOG.md +34 -0
  9. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  10. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  11. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  12. package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
  13. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  14. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  15. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  16. package/dist/builtin/subagents/agents/debugger.md +1 -1
  17. package/dist/builtin/subagents/agents/worker.md +2 -2
  18. package/dist/builtin/subagents/package.json +1 -1
  19. package/dist/builtin/subagents/src/slash/slash-commands.ts +2 -2
  20. package/dist/builtin/subagents/src/tui/render-result-compact.ts +3 -2
  21. package/dist/builtin/subagents/src/tui/render-result.ts +3 -3
  22. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +4 -3
  23. package/dist/builtin/subagents/src/tui/render-widget.ts +10 -4
  24. package/dist/builtin/web-access/CHANGELOG.md +6 -0
  25. package/dist/builtin/web-access/package.json +1 -1
  26. package/dist/builtin/workflows/CHANGELOG.md +30 -0
  27. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +24 -29
  28. package/dist/builtin/workflows/builtin/goal-runner.ts +13 -37
  29. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +6 -9
  30. package/dist/builtin/workflows/builtin/ralph-models.ts +58 -115
  31. package/dist/builtin/workflows/package.json +1 -1
  32. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +4 -0
  33. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +4 -0
  34. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +12 -1
  35. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +2 -0
  36. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +6 -0
  37. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +4 -0
  38. package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +4 -0
  39. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +8 -9
  40. package/dist/bun/cli.d.ts.map +1 -1
  41. package/dist/bun/cli.js +3 -2
  42. package/dist/bun/cli.js.map +1 -1
  43. package/dist/cli.d.ts.map +1 -1
  44. package/dist/cli.js +15 -5
  45. package/dist/cli.js.map +1 -1
  46. package/dist/config.d.ts +10 -3
  47. package/dist/config.d.ts.map +1 -1
  48. package/dist/config.js +18 -1
  49. package/dist/config.js.map +1 -1
  50. package/dist/core/agent-session-events.d.ts.map +1 -1
  51. package/dist/core/agent-session-events.js +16 -8
  52. package/dist/core/agent-session-events.js.map +1 -1
  53. package/dist/core/agent-session-export.d.ts.map +1 -1
  54. package/dist/core/agent-session-export.js +4 -2
  55. package/dist/core/agent-session-export.js.map +1 -1
  56. package/dist/core/agent-session-extension-bindings.d.ts +3 -1
  57. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  58. package/dist/core/agent-session-extension-bindings.js +7 -4
  59. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  60. package/dist/core/agent-session-methods.d.ts +8 -2
  61. package/dist/core/agent-session-methods.d.ts.map +1 -1
  62. package/dist/core/agent-session-methods.js.map +1 -1
  63. package/dist/core/agent-session-retry.d.ts +2 -0
  64. package/dist/core/agent-session-retry.d.ts.map +1 -1
  65. package/dist/core/agent-session-retry.js +66 -7
  66. package/dist/core/agent-session-retry.js.map +1 -1
  67. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  68. package/dist/core/agent-session-tool-registry.js +4 -0
  69. package/dist/core/agent-session-tool-registry.js.map +1 -1
  70. package/dist/core/agent-session.d.ts +4 -1
  71. package/dist/core/agent-session.d.ts.map +1 -1
  72. package/dist/core/agent-session.js +4 -0
  73. package/dist/core/agent-session.js.map +1 -1
  74. package/dist/core/async/format.d.ts +3 -0
  75. package/dist/core/async/format.d.ts.map +1 -0
  76. package/dist/core/async/format.js +50 -0
  77. package/dist/core/async/format.js.map +1 -0
  78. package/dist/core/async/job-manager.d.ts +39 -0
  79. package/dist/core/async/job-manager.d.ts.map +1 -0
  80. package/dist/core/async/job-manager.js +254 -0
  81. package/dist/core/async/job-manager.js.map +1 -0
  82. package/dist/core/async/session-manager.d.ts +18 -0
  83. package/dist/core/async/session-manager.d.ts.map +1 -0
  84. package/dist/core/async/session-manager.js +61 -0
  85. package/dist/core/async/session-manager.js.map +1 -0
  86. package/dist/core/async/types.d.ts +23 -0
  87. package/dist/core/async/types.d.ts.map +1 -0
  88. package/dist/core/async/types.js +2 -0
  89. package/dist/core/async/types.js.map +1 -0
  90. package/dist/core/copilot-model-static-fallbacks.d.ts +43 -0
  91. package/dist/core/copilot-model-static-fallbacks.d.ts.map +1 -0
  92. package/dist/core/copilot-model-static-fallbacks.js +50 -0
  93. package/dist/core/copilot-model-static-fallbacks.js.map +1 -0
  94. package/dist/core/extensions/loader-virtual-modules.d.ts +11 -0
  95. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  96. package/dist/core/extensions/loader-virtual-modules.js +79 -11
  97. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  98. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  99. package/dist/core/model-registry-builtins.js +9 -1
  100. package/dist/core/model-registry-builtins.js.map +1 -1
  101. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  102. package/dist/core/resource-loader-reload.js +4 -2
  103. package/dist/core/resource-loader-reload.js.map +1 -1
  104. package/dist/core/resource-loader-types.d.ts +6 -0
  105. package/dist/core/resource-loader-types.d.ts.map +1 -1
  106. package/dist/core/resource-loader-types.js.map +1 -1
  107. package/dist/core/tools/bash-async-execution.d.ts +25 -0
  108. package/dist/core/tools/bash-async-execution.d.ts.map +1 -0
  109. package/dist/core/tools/bash-async-execution.js +71 -0
  110. package/dist/core/tools/bash-async-execution.js.map +1 -0
  111. package/dist/core/tools/bash-async-jobs.d.ts +10 -0
  112. package/dist/core/tools/bash-async-jobs.d.ts.map +1 -1
  113. package/dist/core/tools/bash-async-jobs.js +18 -2
  114. package/dist/core/tools/bash-async-jobs.js.map +1 -1
  115. package/dist/core/tools/bash-async-output.d.ts +3 -1
  116. package/dist/core/tools/bash-async-output.d.ts.map +1 -1
  117. package/dist/core/tools/bash-async-output.js +4 -1
  118. package/dist/core/tools/bash-async-output.js.map +1 -1
  119. package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
  120. package/dist/core/tools/bash-pty-native.js +2 -2
  121. package/dist/core/tools/bash-pty-native.js.map +1 -1
  122. package/dist/core/tools/bash.d.ts +10 -4
  123. package/dist/core/tools/bash.d.ts.map +1 -1
  124. package/dist/core/tools/bash.js +20 -38
  125. package/dist/core/tools/bash.js.map +1 -1
  126. package/dist/core/tools/search-native.d.ts.map +1 -1
  127. package/dist/core/tools/search-native.js +2 -2
  128. package/dist/core/tools/search-native.js.map +1 -1
  129. package/dist/main.d.ts.map +1 -1
  130. package/dist/main.js +56 -32
  131. package/dist/main.js.map +1 -1
  132. package/dist/modes/interactive/interactive-deferred-startup.d.ts +2 -0
  133. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -0
  134. package/dist/modes/interactive/interactive-deferred-startup.js +59 -0
  135. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -0
  136. package/dist/modes/interactive/interactive-mode-base.d.ts +2 -0
  137. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  138. package/dist/modes/interactive/interactive-mode-base.js +4 -0
  139. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  140. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  141. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  142. package/dist/modes/interactive/interactive-mode-deps.js +1 -1
  143. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  144. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -0
  145. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  146. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  147. package/dist/modes/interactive/interactive-mode-types.d.ts +2 -0
  148. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  149. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  150. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  151. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  152. package/dist/modes/interactive/interactive-mode.js +1 -0
  153. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  154. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
  155. package/dist/modes/interactive/interactive-session-runtime.js +4 -2
  156. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  157. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  158. package/dist/modes/interactive/interactive-startup.js +11 -1
  159. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  160. package/dist/utils/module-require.d.ts +11 -0
  161. package/dist/utils/module-require.d.ts.map +1 -0
  162. package/dist/utils/module-require.js +16 -0
  163. package/dist/utils/module-require.js.map +1 -0
  164. package/docs/tools.md +4 -2
  165. package/npm-shrinkwrap.json +23 -23
  166. package/package.json +5 -3
@@ -1 +1 @@
1
- {"version":3,"file":"resource-loader-reload.js","sourceRoot":"","sources":["../../src/core/resource-loader-reload.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isLocalPath } from \"../utils/paths.ts\";\nimport { clearExtensionCache, loadExtensionsCached } from \"./extensions/loader.ts\";\nimport type { LoadExtensionsResult } from \"./extensions/types.ts\";\nimport type { PathMetadata, ResolvedPaths } from \"./package-manager.ts\";\nimport { resetTimings, startTimingSpan, endTimingSpan } from \"./timings.ts\";\nimport { loadProjectContextFiles, resolvePromptInput } from \"./resource-loader-context-files.ts\";\nimport { discoverAppendSystemPromptFile, discoverSystemPromptFile } from \"./resource-loader-discovery.ts\";\nimport { loadExtensionFactories, loadFinalExtensionSet } from \"./resource-loader-extensions.ts\";\nimport { resourceInternals } from \"./resource-loader-internals.ts\";\nimport type { DefaultResourceLoader } from \"./resource-loader-core.ts\";\nimport {\n\tcollectWorkflowResources,\n\tcreateInheritanceSnapshotProvider,\n\tcreateWorkflowResourceProvider,\n\tresolvePackageResourcePaths,\n\tresolveTrustedBorrowedProjectLocalSources,\n} from \"./resource-loader-package-resources.ts\";\nimport { applyExtensionSourceInfo } from \"./resource-loader-source-info.ts\";\nimport { updatePromptsFromPaths, updateSkillsFromPaths, updateThemesFromPaths } from \"./resource-loader-assets.ts\";\nimport { mergeResourcePaths, resolveResourcePath } from \"./resource-loader-paths.ts\";\nimport type { ResourceLoaderReloadOptions } from \"./resource-loader-types.ts\";\n\nfunction getEnabledResources(\n\tresources: Array<{ path: string; enabled: boolean; metadata: PathMetadata }>,\n\tmetadataByPath: Map<string, PathMetadata>,\n): Array<{ path: string; enabled: boolean; metadata: PathMetadata }> {\n\tfor (const r of resources) {\n\t\tif (!metadataByPath.has(r.path)) {\n\t\t\tmetadataByPath.set(r.path, r.metadata);\n\t\t}\n\t}\n\treturn resources.filter((r) => r.enabled);\n}\n\nfunction getEnabledPaths(\n\tresources: Array<{ path: string; enabled: boolean; metadata: PathMetadata }>,\n\tmetadataByPath: Map<string, PathMetadata>,\n): string[] {\n\treturn getEnabledResources(resources, metadataByPath).map((r) => r.path);\n}\n\nfunction mapSkillPath(\n\tresource: { path: string; metadata: PathMetadata },\n\tmetadataByPath: Map<string, PathMetadata>,\n): string {\n\tif (resource.metadata.source !== \"auto\" && resource.metadata.origin !== \"package\") {\n\t\treturn resource.path;\n\t}\n\ttry {\n\t\tconst stats = statSync(resource.path);\n\t\tif (!stats.isDirectory()) {\n\t\t\treturn resource.path;\n\t\t}\n\t} catch {\n\t\treturn resource.path;\n\t}\n\tconst skillFile = join(resource.path, \"SKILL.md\");\n\tif (existsSync(skillFile)) {\n\t\tif (!metadataByPath.has(skillFile)) {\n\t\t\tmetadataByPath.set(skillFile, resource.metadata);\n\t\t}\n\t\treturn skillFile;\n\t}\n\treturn resource.path;\n}\n\nfunction addCliMetadata(cliExtensionPaths: ResolvedPaths, metadataByPath: Map<string, PathMetadata>): void {\n\tfor (const r of cliExtensionPaths.extensions) {\n\t\tif (!metadataByPath.has(r.path)) {\n\t\t\tmetadataByPath.set(r.path, r.metadata);\n\t\t}\n\t}\n\tfor (const r of cliExtensionPaths.skills) {\n\t\tif (!metadataByPath.has(r.path)) {\n\t\t\tmetadataByPath.set(r.path, r.metadata);\n\t\t}\n\t}\n}\n\nexport async function loadProjectTrustExtensions(loader: DefaultResourceLoader): Promise<LoadExtensionsResult> {\n\tconst state = resourceInternals(loader);\n\tstate.settingsManager.setProjectTrusted(false);\n\tawait state.settingsManager.reload();\n\tconst { resolvedPaths, cliExtensionPaths, builtinPackagePaths } = await resolvePackageResourcePaths(loader, {\n\t\tincludeCliProjectLocalResources: false,\n\t});\n\tconst metadataByPath = new Map<string, PathMetadata>();\n\tconst cliEnabledExtensions = getEnabledPaths(cliExtensionPaths.extensions, metadataByPath);\n\tconst enabledExtensions = getEnabledPaths(resolvedPaths.extensions, metadataByPath);\n\tconst builtinEnabledExtensions = state.noExtensions\n\t\t? []\n\t\t: getEnabledPaths(builtinPackagePaths.extensions, metadataByPath);\n\tconst workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);\n\tstate.workflowResources = workflowResources;\n\tconst workflowResourceProvider = createWorkflowResourceProvider(loader);\n\tconst inheritanceSnapshotProvider = createInheritanceSnapshotProvider(loader);\n\tconst extensionPaths = state.noExtensions\n\t\t? cliEnabledExtensions\n\t\t: mergeResourcePaths(state.cwd, cliEnabledExtensions, [...enabledExtensions, ...builtinEnabledExtensions]);\n\tconst extensionsResult = await loadExtensionsCached(\n\t\textensionPaths,\n\t\tstate.cwd,\n\t\tstate.eventBus,\n\t\tworkflowResourceProvider,\n\t\tundefined,\n\t\tinheritanceSnapshotProvider,\n\t);\n\tconst inlineExtensions = await loadExtensionFactories(\n\t\tloader,\n\t\textensionsResult.runtime,\n\t\tworkflowResourceProvider,\n\t\tinheritanceSnapshotProvider,\n\t);\n\textensionsResult.extensions.push(...inlineExtensions.extensions);\n\textensionsResult.errors.push(...inlineExtensions.errors);\n\tapplyExtensionSourceInfo(loader, extensionsResult.extensions, metadataByPath);\n\treturn extensionsResult;\n}\n\nexport async function reloadDefaultResourceLoader(\n\tloader: DefaultResourceLoader,\n\toptions?: ResourceLoaderReloadOptions,\n): Promise<void> {\n\tconst state = resourceInternals(loader);\n\tresetTimings(\"extensions\");\n\tif (state.loaded) {\n\t\tclearExtensionCache();\n\t}\n\tlet preTrustExtensions: LoadExtensionsResult | undefined;\n\tconst initialProjectTrusted = state.settingsManager.isProjectTrusted();\n\tif (options?.resolveProjectTrust || options?.resolveBorrowedProjectTrust) {\n\t\tpreTrustExtensions = await loadProjectTrustExtensions(loader);\n\t}\n\tif (options?.resolveProjectTrust && preTrustExtensions) {\n\t\tconst projectTrusted = await options.resolveProjectTrust({ extensionsResult: preTrustExtensions });\n\t\tstate.settingsManager.setProjectTrusted(projectTrusted);\n\t} else if (preTrustExtensions) {\n\t\tstate.settingsManager.setProjectTrusted(initialProjectTrusted);\n\t}\n\tif (options?.resolveBorrowedProjectTrust) {\n\t\tstate.trustedBorrowedProjectLocalSources = await resolveTrustedBorrowedProjectLocalSources(\n\t\t\tloader,\n\t\t\toptions.resolveBorrowedProjectTrust,\n\t\t\tpreTrustExtensions,\n\t\t);\n\t}\n\tconst resolveSpan = startTimingSpan(\"DefaultResourceLoader.reload.resolvePackageResourcePaths\");\n\tconst { resolvedPaths, cliExtensionPaths, builtinPackagePaths } = await resolvePackageResourcePaths(loader, {\n\t\ttrustedBorrowedProjectLocalSources: state.trustedBorrowedProjectLocalSources,\n\t});\n\tendTimingSpan(resolveSpan);\n\tconst metadataByPath = new Map<string, PathMetadata>();\n\n\tstate.extensionSkillSourceInfos = new Map();\n\tstate.extensionPromptSourceInfos = new Map();\n\tstate.extensionThemeSourceInfos = new Map();\n\n\tconst enabledExtensions = getEnabledPaths(resolvedPaths.extensions, metadataByPath);\n\tconst enabledSkillResources = getEnabledResources(resolvedPaths.skills, metadataByPath);\n\tconst enabledPrompts = getEnabledPaths(resolvedPaths.prompts, metadataByPath);\n\tconst enabledThemes = getEnabledPaths(resolvedPaths.themes, metadataByPath);\n\n\tconst builtinEnabledExtensions = state.noExtensions\n\t\t? []\n\t\t: getEnabledPaths(builtinPackagePaths.extensions, metadataByPath);\n\tconst builtinEnabledSkillResources = state.noSkills\n\t\t? []\n\t\t: getEnabledResources(builtinPackagePaths.skills, metadataByPath);\n\tconst builtinEnabledPrompts = state.noPromptTemplates\n\t\t? []\n\t\t: getEnabledPaths(builtinPackagePaths.prompts, metadataByPath);\n\tconst builtinEnabledThemes = state.noThemes\n\t\t? []\n\t\t: getEnabledPaths(builtinPackagePaths.themes, metadataByPath);\n\n\tconst enabledSkills = enabledSkillResources.map((resource) => mapSkillPath(resource, metadataByPath));\n\tconst builtinEnabledSkills = builtinEnabledSkillResources.map((resource) => mapSkillPath(resource, metadataByPath));\n\n\taddCliMetadata(cliExtensionPaths, metadataByPath);\n\n\tconst cliEnabledExtensions = getEnabledPaths(cliExtensionPaths.extensions, metadataByPath);\n\tconst cliEnabledSkills = getEnabledPaths(cliExtensionPaths.skills, metadataByPath);\n\tconst cliEnabledPrompts = getEnabledPaths(cliExtensionPaths.prompts, metadataByPath);\n\tconst cliEnabledThemes = getEnabledPaths(cliExtensionPaths.themes, metadataByPath);\n\tconst workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);\n\tstate.workflowResources = workflowResources;\n\tconst workflowResourceProvider = createWorkflowResourceProvider(loader);\n\n\tconst extensionPaths = state.noExtensions\n\t\t? cliEnabledExtensions\n\t\t: mergeResourcePaths(state.cwd, cliEnabledExtensions, [...enabledExtensions, ...builtinEnabledExtensions]);\n\n\tconst inheritanceSnapshotProvider = createInheritanceSnapshotProvider(loader);\n\tconst extensionsResult = await loadFinalExtensionSet(\n\t\tloader,\n\t\textensionPaths,\n\t\tpreTrustExtensions,\n\t\tworkflowResourceProvider,\n\t\tinheritanceSnapshotProvider,\n\t);\n\n\tfor (const p of state.additionalExtensionPaths) {\n\t\tif (isLocalPath(p)) {\n\t\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\t\tif (!existsSync(resolved)) {\n\t\t\t\textensionsResult.errors.push({ path: resolved, error: `Extension path does not exist: ${resolved}` });\n\t\t\t}\n\t\t}\n\t}\n\tstate.extensionsResult = state.extensionsOverride ? state.extensionsOverride(extensionsResult) : extensionsResult;\n\tapplyExtensionSourceInfo(loader, state.extensionsResult.extensions, metadataByPath);\n\n\tconst skillPaths = state.noSkills\n\t\t? mergeResourcePaths(state.cwd, cliEnabledSkills, state.additionalSkillPaths)\n\t\t: mergeResourcePaths(state.cwd, [...cliEnabledSkills, ...enabledSkills, ...builtinEnabledSkills], state.additionalSkillPaths);\n\n\tstate.lastSkillPaths = skillPaths;\n\tconst skillsSpan = startTimingSpan(\"DefaultResourceLoader.reload.updateSkillsFromPaths\");\n\tupdateSkillsFromPaths(loader, skillPaths, metadataByPath);\n\tendTimingSpan(skillsSpan);\n\tfor (const p of state.additionalSkillPaths) {\n\t\tif (isLocalPath(p)) {\n\t\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\t\tif (!existsSync(resolved) && !state.skillDiagnostics.some((d) => d.path === resolved)) {\n\t\t\t\tstate.skillDiagnostics.push({ type: \"error\", message: \"Skill path does not exist\", path: resolved });\n\t\t\t}\n\t\t}\n\t}\n\n\tconst promptPaths = state.noPromptTemplates\n\t\t? mergeResourcePaths(state.cwd, cliEnabledPrompts, state.additionalPromptTemplatePaths)\n\t\t: mergeResourcePaths(state.cwd, [...cliEnabledPrompts, ...enabledPrompts, ...builtinEnabledPrompts], state.additionalPromptTemplatePaths);\n\n\tstate.lastPromptPaths = promptPaths;\n\tconst promptsSpan = startTimingSpan(\"DefaultResourceLoader.reload.updatePromptsFromPaths\");\n\tupdatePromptsFromPaths(loader, promptPaths, metadataByPath);\n\tendTimingSpan(promptsSpan);\n\tfor (const p of state.additionalPromptTemplatePaths) {\n\t\tif (isLocalPath(p)) {\n\t\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\t\tif (!existsSync(resolved) && !state.promptDiagnostics.some((d) => d.path === resolved)) {\n\t\t\t\tstate.promptDiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: \"Prompt template path does not exist\",\n\t\t\t\t\tpath: resolved,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst themePaths = state.noThemes\n\t\t? mergeResourcePaths(state.cwd, cliEnabledThemes, state.additionalThemePaths)\n\t\t: mergeResourcePaths(state.cwd, [...cliEnabledThemes, ...enabledThemes, ...builtinEnabledThemes], state.additionalThemePaths);\n\n\tstate.lastThemePaths = themePaths;\n\tconst themesSpan = startTimingSpan(\"DefaultResourceLoader.reload.updateThemesFromPaths\");\n\tupdateThemesFromPaths(loader, themePaths, metadataByPath);\n\tendTimingSpan(themesSpan);\n\tfor (const p of state.additionalThemePaths) {\n\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\tif (!existsSync(resolved) && !state.themeDiagnostics.some((d) => d.path === resolved)) {\n\t\t\tstate.themeDiagnostics.push({ type: \"error\", message: \"Theme path does not exist\", path: resolved });\n\t\t}\n\t}\n\n\tconst contextFilesSpan = startTimingSpan(\"DefaultResourceLoader.reload.loadProjectContextFiles\");\n\tconst agentsFiles = {\n\t\tagentsFiles: state.noContextFiles\n\t\t\t? []\n\t\t\t: loadProjectContextFiles({\n\t\t\t\t\tcwd: state.cwd,\n\t\t\t\t\tagentDir: state.agentDir,\n\t\t\t\t\tprojectTrusted: state.settingsManager.isProjectTrusted(),\n\t\t\t\t}),\n\t};\n\tendTimingSpan(contextFilesSpan);\n\tconst resolvedAgentsFiles = state.agentsFilesOverride ? state.agentsFilesOverride(agentsFiles) : agentsFiles;\n\tstate.agentsFiles = resolvedAgentsFiles.agentsFiles;\n\n\tconst promptFilesSpan = startTimingSpan(\"DefaultResourceLoader.reload.resolvePromptFiles\");\n\tconst baseSystemPrompt = resolvePromptInput(\n\t\tstate.systemPromptSource ?? discoverSystemPromptFile(loader),\n\t\t\"system prompt\",\n\t);\n\tstate.systemPrompt = state.systemPromptOverride ? state.systemPromptOverride(baseSystemPrompt) : baseSystemPrompt;\n\n\tconst discoveredAppend = discoverAppendSystemPromptFile(loader);\n\tconst appendSources = state.appendSystemPromptSource ?? (discoveredAppend ? [discoveredAppend] : []);\n\tconst baseAppend = appendSources\n\t\t.map((s) => resolvePromptInput(s, \"append system prompt\"))\n\t\t.filter((s): s is string => s !== undefined);\n\tstate.appendSystemPrompt = state.appendSystemPromptOverride\n\t\t? state.appendSystemPromptOverride(baseAppend)\n\t\t: baseAppend;\n\tstate.loaded = true;\n\tendTimingSpan(promptFilesSpan);\n}\n"]}
1
+ {"version":3,"file":"resource-loader-reload.js","sourceRoot":"","sources":["../../src/core/resource-loader-reload.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isLocalPath } from \"../utils/paths.ts\";\nimport { clearExtensionCache, createExtensionRuntime, loadExtensionsCached } from \"./extensions/loader.ts\";\nimport type { LoadExtensionsResult } from \"./extensions/types.ts\";\nimport type { PathMetadata, ResolvedPaths } from \"./package-manager.ts\";\nimport { resetTimings, startTimingSpan, endTimingSpan } from \"./timings.ts\";\nimport { loadProjectContextFiles, resolvePromptInput } from \"./resource-loader-context-files.ts\";\nimport { discoverAppendSystemPromptFile, discoverSystemPromptFile } from \"./resource-loader-discovery.ts\";\nimport { loadExtensionFactories, loadFinalExtensionSet } from \"./resource-loader-extensions.ts\";\nimport { resourceInternals } from \"./resource-loader-internals.ts\";\nimport type { DefaultResourceLoader } from \"./resource-loader-core.ts\";\nimport {\n\tcollectWorkflowResources,\n\tcreateInheritanceSnapshotProvider,\n\tcreateWorkflowResourceProvider,\n\tresolvePackageResourcePaths,\n\tresolveTrustedBorrowedProjectLocalSources,\n} from \"./resource-loader-package-resources.ts\";\nimport { applyExtensionSourceInfo } from \"./resource-loader-source-info.ts\";\nimport { updatePromptsFromPaths, updateSkillsFromPaths, updateThemesFromPaths } from \"./resource-loader-assets.ts\";\nimport { mergeResourcePaths, resolveResourcePath } from \"./resource-loader-paths.ts\";\nimport type { ResourceLoaderReloadOptions } from \"./resource-loader-types.ts\";\n\nfunction getEnabledResources(\n\tresources: Array<{ path: string; enabled: boolean; metadata: PathMetadata }>,\n\tmetadataByPath: Map<string, PathMetadata>,\n): Array<{ path: string; enabled: boolean; metadata: PathMetadata }> {\n\tfor (const r of resources) {\n\t\tif (!metadataByPath.has(r.path)) {\n\t\t\tmetadataByPath.set(r.path, r.metadata);\n\t\t}\n\t}\n\treturn resources.filter((r) => r.enabled);\n}\n\nfunction getEnabledPaths(\n\tresources: Array<{ path: string; enabled: boolean; metadata: PathMetadata }>,\n\tmetadataByPath: Map<string, PathMetadata>,\n): string[] {\n\treturn getEnabledResources(resources, metadataByPath).map((r) => r.path);\n}\n\nfunction mapSkillPath(\n\tresource: { path: string; metadata: PathMetadata },\n\tmetadataByPath: Map<string, PathMetadata>,\n): string {\n\tif (resource.metadata.source !== \"auto\" && resource.metadata.origin !== \"package\") {\n\t\treturn resource.path;\n\t}\n\ttry {\n\t\tconst stats = statSync(resource.path);\n\t\tif (!stats.isDirectory()) {\n\t\t\treturn resource.path;\n\t\t}\n\t} catch {\n\t\treturn resource.path;\n\t}\n\tconst skillFile = join(resource.path, \"SKILL.md\");\n\tif (existsSync(skillFile)) {\n\t\tif (!metadataByPath.has(skillFile)) {\n\t\t\tmetadataByPath.set(skillFile, resource.metadata);\n\t\t}\n\t\treturn skillFile;\n\t}\n\treturn resource.path;\n}\n\nfunction addCliMetadata(cliExtensionPaths: ResolvedPaths, metadataByPath: Map<string, PathMetadata>): void {\n\tfor (const r of cliExtensionPaths.extensions) {\n\t\tif (!metadataByPath.has(r.path)) {\n\t\t\tmetadataByPath.set(r.path, r.metadata);\n\t\t}\n\t}\n\tfor (const r of cliExtensionPaths.skills) {\n\t\tif (!metadataByPath.has(r.path)) {\n\t\t\tmetadataByPath.set(r.path, r.metadata);\n\t\t}\n\t}\n}\n\nexport async function loadProjectTrustExtensions(loader: DefaultResourceLoader): Promise<LoadExtensionsResult> {\n\tconst state = resourceInternals(loader);\n\tstate.settingsManager.setProjectTrusted(false);\n\tawait state.settingsManager.reload();\n\tconst { resolvedPaths, cliExtensionPaths, builtinPackagePaths } = await resolvePackageResourcePaths(loader, {\n\t\tincludeCliProjectLocalResources: false,\n\t});\n\tconst metadataByPath = new Map<string, PathMetadata>();\n\tconst cliEnabledExtensions = getEnabledPaths(cliExtensionPaths.extensions, metadataByPath);\n\tconst enabledExtensions = getEnabledPaths(resolvedPaths.extensions, metadataByPath);\n\tconst builtinEnabledExtensions = state.noExtensions\n\t\t? []\n\t\t: getEnabledPaths(builtinPackagePaths.extensions, metadataByPath);\n\tconst workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);\n\tstate.workflowResources = workflowResources;\n\tconst workflowResourceProvider = createWorkflowResourceProvider(loader);\n\tconst inheritanceSnapshotProvider = createInheritanceSnapshotProvider(loader);\n\tconst extensionPaths = state.noExtensions\n\t\t? cliEnabledExtensions\n\t\t: mergeResourcePaths(state.cwd, cliEnabledExtensions, [...enabledExtensions, ...builtinEnabledExtensions]);\n\tconst extensionsResult = await loadExtensionsCached(\n\t\textensionPaths,\n\t\tstate.cwd,\n\t\tstate.eventBus,\n\t\tworkflowResourceProvider,\n\t\tundefined,\n\t\tinheritanceSnapshotProvider,\n\t);\n\tconst inlineExtensions = await loadExtensionFactories(\n\t\tloader,\n\t\textensionsResult.runtime,\n\t\tworkflowResourceProvider,\n\t\tinheritanceSnapshotProvider,\n\t);\n\textensionsResult.extensions.push(...inlineExtensions.extensions);\n\textensionsResult.errors.push(...inlineExtensions.errors);\n\tapplyExtensionSourceInfo(loader, extensionsResult.extensions, metadataByPath);\n\treturn extensionsResult;\n}\n\nexport async function reloadDefaultResourceLoader(\n\tloader: DefaultResourceLoader,\n\toptions?: ResourceLoaderReloadOptions,\n): Promise<void> {\n\tconst state = resourceInternals(loader);\n\tresetTimings(\"extensions\");\n\tif (state.loaded) {\n\t\tclearExtensionCache();\n\t}\n\tlet preTrustExtensions: LoadExtensionsResult | undefined;\n\tconst initialProjectTrusted = state.settingsManager.isProjectTrusted();\n\tif (options?.resolveProjectTrust || options?.resolveBorrowedProjectTrust) {\n\t\tpreTrustExtensions = await loadProjectTrustExtensions(loader);\n\t}\n\tif (options?.resolveProjectTrust && preTrustExtensions) {\n\t\tconst projectTrusted = await options.resolveProjectTrust({ extensionsResult: preTrustExtensions });\n\t\tstate.settingsManager.setProjectTrusted(projectTrusted);\n\t} else if (preTrustExtensions) {\n\t\tstate.settingsManager.setProjectTrusted(initialProjectTrusted);\n\t}\n\tif (options?.resolveBorrowedProjectTrust) {\n\t\tstate.trustedBorrowedProjectLocalSources = await resolveTrustedBorrowedProjectLocalSources(\n\t\t\tloader,\n\t\t\toptions.resolveBorrowedProjectTrust,\n\t\t\tpreTrustExtensions,\n\t\t);\n\t}\n\tconst resolveSpan = startTimingSpan(\"DefaultResourceLoader.reload.resolvePackageResourcePaths\");\n\tconst { resolvedPaths, cliExtensionPaths, builtinPackagePaths } = await resolvePackageResourcePaths(loader, {\n\t\ttrustedBorrowedProjectLocalSources: state.trustedBorrowedProjectLocalSources,\n\t});\n\tendTimingSpan(resolveSpan);\n\tconst metadataByPath = new Map<string, PathMetadata>();\n\n\tstate.extensionSkillSourceInfos = new Map();\n\tstate.extensionPromptSourceInfos = new Map();\n\tstate.extensionThemeSourceInfos = new Map();\n\n\tconst enabledExtensions = getEnabledPaths(resolvedPaths.extensions, metadataByPath);\n\tconst enabledSkillResources = getEnabledResources(resolvedPaths.skills, metadataByPath);\n\tconst enabledPrompts = getEnabledPaths(resolvedPaths.prompts, metadataByPath);\n\tconst enabledThemes = getEnabledPaths(resolvedPaths.themes, metadataByPath);\n\n\tconst builtinEnabledExtensions = state.noExtensions\n\t\t? []\n\t\t: getEnabledPaths(builtinPackagePaths.extensions, metadataByPath);\n\tconst builtinEnabledSkillResources = state.noSkills\n\t\t? []\n\t\t: getEnabledResources(builtinPackagePaths.skills, metadataByPath);\n\tconst builtinEnabledPrompts = state.noPromptTemplates\n\t\t? []\n\t\t: getEnabledPaths(builtinPackagePaths.prompts, metadataByPath);\n\tconst builtinEnabledThemes = state.noThemes\n\t\t? []\n\t\t: getEnabledPaths(builtinPackagePaths.themes, metadataByPath);\n\n\tconst enabledSkills = enabledSkillResources.map((resource) => mapSkillPath(resource, metadataByPath));\n\tconst builtinEnabledSkills = builtinEnabledSkillResources.map((resource) => mapSkillPath(resource, metadataByPath));\n\n\taddCliMetadata(cliExtensionPaths, metadataByPath);\n\n\tconst cliEnabledExtensions = getEnabledPaths(cliExtensionPaths.extensions, metadataByPath);\n\tconst cliEnabledSkills = getEnabledPaths(cliExtensionPaths.skills, metadataByPath);\n\tconst cliEnabledPrompts = getEnabledPaths(cliExtensionPaths.prompts, metadataByPath);\n\tconst cliEnabledThemes = getEnabledPaths(cliExtensionPaths.themes, metadataByPath);\n\tconst workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);\n\tstate.workflowResources = workflowResources;\n\tconst workflowResourceProvider = createWorkflowResourceProvider(loader);\n\n\tconst extensionPaths = state.noExtensions\n\t\t? cliEnabledExtensions\n\t\t: mergeResourcePaths(state.cwd, cliEnabledExtensions, [...enabledExtensions, ...builtinEnabledExtensions]);\n\n\tconst inheritanceSnapshotProvider = createInheritanceSnapshotProvider(loader);\n\tconst extensionsResult: LoadExtensionsResult = options?.deferExtensions\n\t\t? { extensions: [], errors: [], runtime: createExtensionRuntime() }\n\t\t: await loadFinalExtensionSet(\n\t\t\t\tloader,\n\t\t\t\textensionPaths,\n\t\t\t\tpreTrustExtensions,\n\t\t\t\tworkflowResourceProvider,\n\t\t\t\tinheritanceSnapshotProvider,\n\t\t\t);\n\n\tfor (const p of state.additionalExtensionPaths) {\n\t\tif (isLocalPath(p)) {\n\t\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\t\tif (!existsSync(resolved)) {\n\t\t\t\textensionsResult.errors.push({ path: resolved, error: `Extension path does not exist: ${resolved}` });\n\t\t\t}\n\t\t}\n\t}\n\tstate.extensionsResult = state.extensionsOverride ? state.extensionsOverride(extensionsResult) : extensionsResult;\n\tapplyExtensionSourceInfo(loader, state.extensionsResult.extensions, metadataByPath);\n\n\tconst skillPaths = state.noSkills\n\t\t? mergeResourcePaths(state.cwd, cliEnabledSkills, state.additionalSkillPaths)\n\t\t: mergeResourcePaths(state.cwd, [...cliEnabledSkills, ...enabledSkills, ...builtinEnabledSkills], state.additionalSkillPaths);\n\n\tstate.lastSkillPaths = skillPaths;\n\tconst skillsSpan = startTimingSpan(\"DefaultResourceLoader.reload.updateSkillsFromPaths\");\n\tupdateSkillsFromPaths(loader, skillPaths, metadataByPath);\n\tendTimingSpan(skillsSpan);\n\tfor (const p of state.additionalSkillPaths) {\n\t\tif (isLocalPath(p)) {\n\t\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\t\tif (!existsSync(resolved) && !state.skillDiagnostics.some((d) => d.path === resolved)) {\n\t\t\t\tstate.skillDiagnostics.push({ type: \"error\", message: \"Skill path does not exist\", path: resolved });\n\t\t\t}\n\t\t}\n\t}\n\n\tconst promptPaths = state.noPromptTemplates\n\t\t? mergeResourcePaths(state.cwd, cliEnabledPrompts, state.additionalPromptTemplatePaths)\n\t\t: mergeResourcePaths(state.cwd, [...cliEnabledPrompts, ...enabledPrompts, ...builtinEnabledPrompts], state.additionalPromptTemplatePaths);\n\n\tstate.lastPromptPaths = promptPaths;\n\tconst promptsSpan = startTimingSpan(\"DefaultResourceLoader.reload.updatePromptsFromPaths\");\n\tupdatePromptsFromPaths(loader, promptPaths, metadataByPath);\n\tendTimingSpan(promptsSpan);\n\tfor (const p of state.additionalPromptTemplatePaths) {\n\t\tif (isLocalPath(p)) {\n\t\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\t\tif (!existsSync(resolved) && !state.promptDiagnostics.some((d) => d.path === resolved)) {\n\t\t\t\tstate.promptDiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: \"Prompt template path does not exist\",\n\t\t\t\t\tpath: resolved,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst themePaths = state.noThemes\n\t\t? mergeResourcePaths(state.cwd, cliEnabledThemes, state.additionalThemePaths)\n\t\t: mergeResourcePaths(state.cwd, [...cliEnabledThemes, ...enabledThemes, ...builtinEnabledThemes], state.additionalThemePaths);\n\n\tstate.lastThemePaths = themePaths;\n\tconst themesSpan = startTimingSpan(\"DefaultResourceLoader.reload.updateThemesFromPaths\");\n\tupdateThemesFromPaths(loader, themePaths, metadataByPath);\n\tendTimingSpan(themesSpan);\n\tfor (const p of state.additionalThemePaths) {\n\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\tif (!existsSync(resolved) && !state.themeDiagnostics.some((d) => d.path === resolved)) {\n\t\t\tstate.themeDiagnostics.push({ type: \"error\", message: \"Theme path does not exist\", path: resolved });\n\t\t}\n\t}\n\n\tconst contextFilesSpan = startTimingSpan(\"DefaultResourceLoader.reload.loadProjectContextFiles\");\n\tconst agentsFiles = {\n\t\tagentsFiles: state.noContextFiles\n\t\t\t? []\n\t\t\t: loadProjectContextFiles({\n\t\t\t\t\tcwd: state.cwd,\n\t\t\t\t\tagentDir: state.agentDir,\n\t\t\t\t\tprojectTrusted: state.settingsManager.isProjectTrusted(),\n\t\t\t\t}),\n\t};\n\tendTimingSpan(contextFilesSpan);\n\tconst resolvedAgentsFiles = state.agentsFilesOverride ? state.agentsFilesOverride(agentsFiles) : agentsFiles;\n\tstate.agentsFiles = resolvedAgentsFiles.agentsFiles;\n\n\tconst promptFilesSpan = startTimingSpan(\"DefaultResourceLoader.reload.resolvePromptFiles\");\n\tconst baseSystemPrompt = resolvePromptInput(\n\t\tstate.systemPromptSource ?? discoverSystemPromptFile(loader),\n\t\t\"system prompt\",\n\t);\n\tstate.systemPrompt = state.systemPromptOverride ? state.systemPromptOverride(baseSystemPrompt) : baseSystemPrompt;\n\n\tconst discoveredAppend = discoverAppendSystemPromptFile(loader);\n\tconst appendSources = state.appendSystemPromptSource ?? (discoveredAppend ? [discoveredAppend] : []);\n\tconst baseAppend = appendSources\n\t\t.map((s) => resolvePromptInput(s, \"append system prompt\"))\n\t\t.filter((s): s is string => s !== undefined);\n\tstate.appendSystemPrompt = state.appendSystemPromptOverride\n\t\t? state.appendSystemPromptOverride(baseAppend)\n\t\t: baseAppend;\n\tstate.loaded = true;\n\tendTimingSpan(promptFilesSpan);\n}\n"]}
@@ -21,6 +21,12 @@ export interface ResourceExtensionPaths {
21
21
  }>;
22
22
  }
23
23
  export interface ResourceLoaderReloadOptions {
24
+ /**
25
+ * Skip loading extension code during this reload, leaving the loader with an
26
+ * empty extension set. Skills, prompts, themes, context files, and prompt
27
+ * files still load. A later full reload() picks up extensions.
28
+ */
29
+ deferExtensions?: boolean;
24
30
  resolveProjectTrust?: (options: {
25
31
  extensionsResult: LoadExtensionsResult;
26
32
  }) => boolean | Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"resource-loader-types.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader-types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EventBus } from \"./event-bus.ts\";\nimport type { ExtensionFactory, LoadExtensionsResult } from \"./extensions/types.ts\";\nimport type { PathMetadata, ResolvedResource } from \"./package-manager.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport type { SettingsManager, PackageSource } from \"./settings-manager.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport type { Theme } from \"../modes/interactive/theme/theme.ts\";\n\nexport interface ResourceExtensionPaths {\n\tskillPaths?: Array<{ path: string; metadata: PathMetadata }>;\n\tpromptPaths?: Array<{ path: string; metadata: PathMetadata }>;\n\tthemePaths?: Array<{ path: string; metadata: PathMetadata }>;\n}\n\nexport interface ResourceLoaderReloadOptions {\n\tresolveProjectTrust?: (options: { extensionsResult: LoadExtensionsResult }) => boolean | Promise<boolean>;\n\tresolveBorrowedProjectTrust?: (options: {\n\t\tsource: string;\n\t\tresources: ResolvedResource[];\n\t\textensionsResult: LoadExtensionsResult;\n\t}) => boolean | Promise<boolean>;\n}\n\nexport interface ResourceLoader {\n\tgetExtensions(): LoadExtensionsResult;\n\tgetSkills(): { skills: Skill[]; diagnostics: ResourceDiagnostic[] };\n\tgetPrompts(): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] };\n\tgetThemes(): { themes: Theme[]; diagnostics: ResourceDiagnostic[] };\n\tgetAgentsFiles(): { agentsFiles: Array<{ path: string; content: string }> };\n\tgetSystemPrompt(): string | undefined;\n\tgetAppendSystemPrompt(): string[];\n\textendResources(paths: ResourceExtensionPaths): void;\n\treload(options?: ResourceLoaderReloadOptions): Promise<void>;\n}\n\nexport interface DefaultResourceLoaderInheritanceSnapshot {\n\treadonly projectTrusted?: boolean;\n\treadonly additionalExtensionPaths?: readonly string[];\n\treadonly additionalSkillPaths?: readonly string[];\n\treadonly additionalPromptTemplatePaths?: readonly string[];\n\treadonly additionalThemePaths?: readonly string[];\n\treadonly builtinPackagePaths?: readonly PackageSource[];\n\treadonly extensionFactories?: readonly ExtensionFactory[];\n\treadonly noExtensions?: boolean;\n\treadonly noSkills?: boolean;\n\treadonly noPromptTemplates?: boolean;\n\treadonly noThemes?: boolean;\n\treadonly noContextFiles?: boolean;\n\treadonly systemPrompt?: string;\n\treadonly appendSystemPrompt?: readonly string[];\n\treadonly trustedBorrowedProjectLocalSources?: readonly string[];\n}\n\nexport interface DefaultResourceLoaderOptions {\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager?: SettingsManager;\n\teventBus?: EventBus;\n\tresourceLoaderInheritanceSnapshot?: DefaultResourceLoaderInheritanceSnapshot;\n\tadditionalExtensionPaths?: string[];\n\tadditionalSkillPaths?: string[];\n\tadditionalPromptTemplatePaths?: string[];\n\tadditionalThemePaths?: string[];\n\tbuiltinPackagePaths?: PackageSource[];\n\textensionFactories?: ExtensionFactory[];\n\tnoExtensions?: boolean;\n\tnoSkills?: boolean;\n\tnoPromptTemplates?: boolean;\n\tnoThemes?: boolean;\n\tnoContextFiles?: boolean;\n\tsystemPrompt?: string;\n\tappendSystemPrompt?: string[];\n\textensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult;\n\tskillsOverride?: (base: { skills: Skill[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tskills: Skill[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tpromptsOverride?: (base: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tprompts: PromptTemplate[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tthemesOverride?: (base: { themes: Theme[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tthemes: Theme[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tagentsFilesOverride?: (base: { agentsFiles: Array<{ path: string; content: string }> }) => {\n\t\tagentsFiles: Array<{ path: string; content: string }>;\n\t};\n\tsystemPromptOverride?: (base: string | undefined) => string | undefined;\n\tappendSystemPromptOverride?: (base: string[]) => string[];\n}\n"]}
1
+ {"version":3,"file":"resource-loader-types.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader-types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EventBus } from \"./event-bus.ts\";\nimport type { ExtensionFactory, LoadExtensionsResult } from \"./extensions/types.ts\";\nimport type { PathMetadata, ResolvedResource } from \"./package-manager.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport type { SettingsManager, PackageSource } from \"./settings-manager.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport type { Theme } from \"../modes/interactive/theme/theme.ts\";\n\nexport interface ResourceExtensionPaths {\n\tskillPaths?: Array<{ path: string; metadata: PathMetadata }>;\n\tpromptPaths?: Array<{ path: string; metadata: PathMetadata }>;\n\tthemePaths?: Array<{ path: string; metadata: PathMetadata }>;\n}\n\nexport interface ResourceLoaderReloadOptions {\n\t/**\n\t * Skip loading extension code during this reload, leaving the loader with an\n\t * empty extension set. Skills, prompts, themes, context files, and prompt\n\t * files still load. A later full reload() picks up extensions.\n\t */\n\tdeferExtensions?: boolean;\n\tresolveProjectTrust?: (options: { extensionsResult: LoadExtensionsResult }) => boolean | Promise<boolean>;\n\tresolveBorrowedProjectTrust?: (options: {\n\t\tsource: string;\n\t\tresources: ResolvedResource[];\n\t\textensionsResult: LoadExtensionsResult;\n\t}) => boolean | Promise<boolean>;\n}\n\nexport interface ResourceLoader {\n\tgetExtensions(): LoadExtensionsResult;\n\tgetSkills(): { skills: Skill[]; diagnostics: ResourceDiagnostic[] };\n\tgetPrompts(): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] };\n\tgetThemes(): { themes: Theme[]; diagnostics: ResourceDiagnostic[] };\n\tgetAgentsFiles(): { agentsFiles: Array<{ path: string; content: string }> };\n\tgetSystemPrompt(): string | undefined;\n\tgetAppendSystemPrompt(): string[];\n\textendResources(paths: ResourceExtensionPaths): void;\n\treload(options?: ResourceLoaderReloadOptions): Promise<void>;\n}\n\nexport interface DefaultResourceLoaderInheritanceSnapshot {\n\treadonly projectTrusted?: boolean;\n\treadonly additionalExtensionPaths?: readonly string[];\n\treadonly additionalSkillPaths?: readonly string[];\n\treadonly additionalPromptTemplatePaths?: readonly string[];\n\treadonly additionalThemePaths?: readonly string[];\n\treadonly builtinPackagePaths?: readonly PackageSource[];\n\treadonly extensionFactories?: readonly ExtensionFactory[];\n\treadonly noExtensions?: boolean;\n\treadonly noSkills?: boolean;\n\treadonly noPromptTemplates?: boolean;\n\treadonly noThemes?: boolean;\n\treadonly noContextFiles?: boolean;\n\treadonly systemPrompt?: string;\n\treadonly appendSystemPrompt?: readonly string[];\n\treadonly trustedBorrowedProjectLocalSources?: readonly string[];\n}\n\nexport interface DefaultResourceLoaderOptions {\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager?: SettingsManager;\n\teventBus?: EventBus;\n\tresourceLoaderInheritanceSnapshot?: DefaultResourceLoaderInheritanceSnapshot;\n\tadditionalExtensionPaths?: string[];\n\tadditionalSkillPaths?: string[];\n\tadditionalPromptTemplatePaths?: string[];\n\tadditionalThemePaths?: string[];\n\tbuiltinPackagePaths?: PackageSource[];\n\textensionFactories?: ExtensionFactory[];\n\tnoExtensions?: boolean;\n\tnoSkills?: boolean;\n\tnoPromptTemplates?: boolean;\n\tnoThemes?: boolean;\n\tnoContextFiles?: boolean;\n\tsystemPrompt?: string;\n\tappendSystemPrompt?: string[];\n\textensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult;\n\tskillsOverride?: (base: { skills: Skill[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tskills: Skill[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tpromptsOverride?: (base: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tprompts: PromptTemplate[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tthemesOverride?: (base: { themes: Theme[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tthemes: Theme[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tagentsFilesOverride?: (base: { agentsFiles: Array<{ path: string; content: string }> }) => {\n\t\tagentsFiles: Array<{ path: string; content: string }>;\n\t};\n\tsystemPromptOverride?: (base: string | undefined) => string | undefined;\n\tappendSystemPromptOverride?: (base: string[]) => string[];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"resource-loader-types.js","sourceRoot":"","sources":["../../src/core/resource-loader-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { EventBus } from \"./event-bus.ts\";\nimport type { ExtensionFactory, LoadExtensionsResult } from \"./extensions/types.ts\";\nimport type { PathMetadata, ResolvedResource } from \"./package-manager.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport type { SettingsManager, PackageSource } from \"./settings-manager.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport type { Theme } from \"../modes/interactive/theme/theme.ts\";\n\nexport interface ResourceExtensionPaths {\n\tskillPaths?: Array<{ path: string; metadata: PathMetadata }>;\n\tpromptPaths?: Array<{ path: string; metadata: PathMetadata }>;\n\tthemePaths?: Array<{ path: string; metadata: PathMetadata }>;\n}\n\nexport interface ResourceLoaderReloadOptions {\n\tresolveProjectTrust?: (options: { extensionsResult: LoadExtensionsResult }) => boolean | Promise<boolean>;\n\tresolveBorrowedProjectTrust?: (options: {\n\t\tsource: string;\n\t\tresources: ResolvedResource[];\n\t\textensionsResult: LoadExtensionsResult;\n\t}) => boolean | Promise<boolean>;\n}\n\nexport interface ResourceLoader {\n\tgetExtensions(): LoadExtensionsResult;\n\tgetSkills(): { skills: Skill[]; diagnostics: ResourceDiagnostic[] };\n\tgetPrompts(): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] };\n\tgetThemes(): { themes: Theme[]; diagnostics: ResourceDiagnostic[] };\n\tgetAgentsFiles(): { agentsFiles: Array<{ path: string; content: string }> };\n\tgetSystemPrompt(): string | undefined;\n\tgetAppendSystemPrompt(): string[];\n\textendResources(paths: ResourceExtensionPaths): void;\n\treload(options?: ResourceLoaderReloadOptions): Promise<void>;\n}\n\nexport interface DefaultResourceLoaderInheritanceSnapshot {\n\treadonly projectTrusted?: boolean;\n\treadonly additionalExtensionPaths?: readonly string[];\n\treadonly additionalSkillPaths?: readonly string[];\n\treadonly additionalPromptTemplatePaths?: readonly string[];\n\treadonly additionalThemePaths?: readonly string[];\n\treadonly builtinPackagePaths?: readonly PackageSource[];\n\treadonly extensionFactories?: readonly ExtensionFactory[];\n\treadonly noExtensions?: boolean;\n\treadonly noSkills?: boolean;\n\treadonly noPromptTemplates?: boolean;\n\treadonly noThemes?: boolean;\n\treadonly noContextFiles?: boolean;\n\treadonly systemPrompt?: string;\n\treadonly appendSystemPrompt?: readonly string[];\n\treadonly trustedBorrowedProjectLocalSources?: readonly string[];\n}\n\nexport interface DefaultResourceLoaderOptions {\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager?: SettingsManager;\n\teventBus?: EventBus;\n\tresourceLoaderInheritanceSnapshot?: DefaultResourceLoaderInheritanceSnapshot;\n\tadditionalExtensionPaths?: string[];\n\tadditionalSkillPaths?: string[];\n\tadditionalPromptTemplatePaths?: string[];\n\tadditionalThemePaths?: string[];\n\tbuiltinPackagePaths?: PackageSource[];\n\textensionFactories?: ExtensionFactory[];\n\tnoExtensions?: boolean;\n\tnoSkills?: boolean;\n\tnoPromptTemplates?: boolean;\n\tnoThemes?: boolean;\n\tnoContextFiles?: boolean;\n\tsystemPrompt?: string;\n\tappendSystemPrompt?: string[];\n\textensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult;\n\tskillsOverride?: (base: { skills: Skill[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tskills: Skill[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tpromptsOverride?: (base: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tprompts: PromptTemplate[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tthemesOverride?: (base: { themes: Theme[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tthemes: Theme[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tagentsFilesOverride?: (base: { agentsFiles: Array<{ path: string; content: string }> }) => {\n\t\tagentsFiles: Array<{ path: string; content: string }>;\n\t};\n\tsystemPromptOverride?: (base: string | undefined) => string | undefined;\n\tappendSystemPromptOverride?: (base: string[]) => string[];\n}\n"]}
1
+ {"version":3,"file":"resource-loader-types.js","sourceRoot":"","sources":["../../src/core/resource-loader-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { EventBus } from \"./event-bus.ts\";\nimport type { ExtensionFactory, LoadExtensionsResult } from \"./extensions/types.ts\";\nimport type { PathMetadata, ResolvedResource } from \"./package-manager.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport type { SettingsManager, PackageSource } from \"./settings-manager.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport type { Theme } from \"../modes/interactive/theme/theme.ts\";\n\nexport interface ResourceExtensionPaths {\n\tskillPaths?: Array<{ path: string; metadata: PathMetadata }>;\n\tpromptPaths?: Array<{ path: string; metadata: PathMetadata }>;\n\tthemePaths?: Array<{ path: string; metadata: PathMetadata }>;\n}\n\nexport interface ResourceLoaderReloadOptions {\n\t/**\n\t * Skip loading extension code during this reload, leaving the loader with an\n\t * empty extension set. Skills, prompts, themes, context files, and prompt\n\t * files still load. A later full reload() picks up extensions.\n\t */\n\tdeferExtensions?: boolean;\n\tresolveProjectTrust?: (options: { extensionsResult: LoadExtensionsResult }) => boolean | Promise<boolean>;\n\tresolveBorrowedProjectTrust?: (options: {\n\t\tsource: string;\n\t\tresources: ResolvedResource[];\n\t\textensionsResult: LoadExtensionsResult;\n\t}) => boolean | Promise<boolean>;\n}\n\nexport interface ResourceLoader {\n\tgetExtensions(): LoadExtensionsResult;\n\tgetSkills(): { skills: Skill[]; diagnostics: ResourceDiagnostic[] };\n\tgetPrompts(): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] };\n\tgetThemes(): { themes: Theme[]; diagnostics: ResourceDiagnostic[] };\n\tgetAgentsFiles(): { agentsFiles: Array<{ path: string; content: string }> };\n\tgetSystemPrompt(): string | undefined;\n\tgetAppendSystemPrompt(): string[];\n\textendResources(paths: ResourceExtensionPaths): void;\n\treload(options?: ResourceLoaderReloadOptions): Promise<void>;\n}\n\nexport interface DefaultResourceLoaderInheritanceSnapshot {\n\treadonly projectTrusted?: boolean;\n\treadonly additionalExtensionPaths?: readonly string[];\n\treadonly additionalSkillPaths?: readonly string[];\n\treadonly additionalPromptTemplatePaths?: readonly string[];\n\treadonly additionalThemePaths?: readonly string[];\n\treadonly builtinPackagePaths?: readonly PackageSource[];\n\treadonly extensionFactories?: readonly ExtensionFactory[];\n\treadonly noExtensions?: boolean;\n\treadonly noSkills?: boolean;\n\treadonly noPromptTemplates?: boolean;\n\treadonly noThemes?: boolean;\n\treadonly noContextFiles?: boolean;\n\treadonly systemPrompt?: string;\n\treadonly appendSystemPrompt?: readonly string[];\n\treadonly trustedBorrowedProjectLocalSources?: readonly string[];\n}\n\nexport interface DefaultResourceLoaderOptions {\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager?: SettingsManager;\n\teventBus?: EventBus;\n\tresourceLoaderInheritanceSnapshot?: DefaultResourceLoaderInheritanceSnapshot;\n\tadditionalExtensionPaths?: string[];\n\tadditionalSkillPaths?: string[];\n\tadditionalPromptTemplatePaths?: string[];\n\tadditionalThemePaths?: string[];\n\tbuiltinPackagePaths?: PackageSource[];\n\textensionFactories?: ExtensionFactory[];\n\tnoExtensions?: boolean;\n\tnoSkills?: boolean;\n\tnoPromptTemplates?: boolean;\n\tnoThemes?: boolean;\n\tnoContextFiles?: boolean;\n\tsystemPrompt?: string;\n\tappendSystemPrompt?: string[];\n\textensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult;\n\tskillsOverride?: (base: { skills: Skill[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tskills: Skill[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tpromptsOverride?: (base: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tprompts: PromptTemplate[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tthemesOverride?: (base: { themes: Theme[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tthemes: Theme[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tagentsFilesOverride?: (base: { agentsFiles: Array<{ path: string; content: string }> }) => {\n\t\tagentsFiles: Array<{ path: string; content: string }>;\n\t};\n\tsystemPromptOverride?: (base: string | undefined) => string | undefined;\n\tappendSystemPromptOverride?: (base: string[]) => string[];\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import type { AsyncJobManager } from "../async/job-manager.js";
2
+ import type { AsyncJobDeliveryHandler } from "../async/types.js";
3
+ import type { BashOperations, BashToolDetails } from "./bash.js";
4
+ interface StartAsyncBashCommandOptions {
5
+ command: string;
6
+ cwd: string;
7
+ env: NodeJS.ProcessEnv;
8
+ pty?: boolean;
9
+ timeoutSeconds: number;
10
+ requestedTimeoutSeconds?: number;
11
+ signal?: AbortSignal;
12
+ operations: BashOperations;
13
+ manager?: AsyncJobManager;
14
+ deliveryHandler?: AsyncJobDeliveryHandler;
15
+ sessionId?: symbol;
16
+ }
17
+ export declare function startAsyncBashCommand(options: StartAsyncBashCommandOptions): Promise<{
18
+ content: Array<{
19
+ type: "text";
20
+ text: string;
21
+ }>;
22
+ details: BashToolDetails;
23
+ }>;
24
+ export {};
25
+ //# sourceMappingURL=bash-async-execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-async-execution.d.ts","sourceRoot":"","sources":["../../../src/core/tools/bash-async-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAIjE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjE,UAAU,4BAA4B;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC;IAC3F,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,eAAe,CAAC;CACzB,CAAC,CA2DD","sourcesContent":["import type { AsyncJobManager } from \"../async/job-manager.js\";\nimport type { AsyncJobDeliveryHandler } from \"../async/types.js\";\nimport { invalidateNativeSearchCache } from \"./search-native.js\";\nimport { createAsyncOutputAppender } from \"./bash-async-output.js\";\nimport { createManagedBashJob, discardManagedBashJob, formatAsyncJobError } from \"./bash-async-jobs.js\";\nimport type { BashOperations, BashToolDetails } from \"./bash.js\";\n\ninterface StartAsyncBashCommandOptions {\n\tcommand: string;\n\tcwd: string;\n\tenv: NodeJS.ProcessEnv;\n\tpty?: boolean;\n\ttimeoutSeconds: number;\n\trequestedTimeoutSeconds?: number;\n\tsignal?: AbortSignal;\n\toperations: BashOperations;\n\tmanager?: AsyncJobManager;\n\tdeliveryHandler?: AsyncJobDeliveryHandler;\n\tsessionId?: symbol;\n}\n\nexport async function startAsyncBashCommand(options: StartAsyncBashCommandOptions): Promise<{\n\tcontent: Array<{ type: \"text\"; text: string }>;\n\tdetails: BashToolDetails;\n}> {\n\tif (options.manager?.atCapacity) throw new Error(\"Background job limit reached. Wait for running jobs to finish or cancel one.\");\n\tconst job = createManagedBashJob(options.command, options.cwd, options.timeoutSeconds, options.requestedTimeoutSeconds);\n\ttry {\n\t\toptions.manager?.registerBashJob(job, options.deliveryHandler, options.sessionId);\n\t} catch (registerError) {\n\t\t// The job was inserted into the managed map but never started; drop it so\n\t\t// it cannot linger as a permanently-\"running\" zombie entry (see\n\t\t// discardManagedBashJob). Registration failures (disposed manager/session,\n\t\t// capacity race) still surface to the caller as tool errors.\n\t\tdiscardManagedBashJob(job.jobId);\n\t\tthrow registerError;\n\t}\n\tconst appendAsyncOutput = createAsyncOutputAppender(job, { persistAfterBytes: 12_000 });\n\tconst onParentAbort = () => {\n\t\toptions.manager?.acknowledgeDeliveries([job.jobId]);\n\t\tjob.abortController?.abort();\n\t};\n\tif (options.signal?.aborted) onParentAbort();\n\telse options.signal?.addEventListener(\"abort\", onParentAbort, { once: true });\n\tvoid (async () => {\n\t\tlet error: Error | string | undefined;\n\t\tlet exitCode: number | null | undefined;\n\t\ttry {\n\t\t\texitCode = (await options.operations.exec(options.command, options.cwd, {\n\t\t\t\tonData: appendAsyncOutput.append,\n\t\t\t\ttimeout: options.timeoutSeconds,\n\t\t\t\tenv: options.env,\n\t\t\t\tpty: options.pty,\n\t\t\t\tsignal: job.abortController?.signal,\n\t\t\t})).exitCode;\n\t\t} catch (execError) {\n\t\t\terror = execError instanceof Error ? execError : String(execError);\n\t\t}\n\t\ttry {\n\t\t\tawait appendAsyncOutput.close();\n\t\t} catch (closeError) {\n\t\t\terror ??= closeError instanceof Error ? closeError : String(closeError);\n\t\t}\n\t\tif (error !== undefined) {\n\t\t\tjob.status = \"failed\";\n\t\t\tjob.error = job.abortController?.signal.aborted ? \"aborted\" : formatAsyncJobError(error);\n\t\t} else {\n\t\t\tjob.exitCode = exitCode;\n\t\t\tjob.status = exitCode && exitCode !== 0 ? \"failed\" : \"completed\";\n\t\t}\n\t\tjob.endedAt = Date.now();\n\t\tinvalidateNativeSearchCache();\n\t\toptions.manager?.completeBashJob(job);\n\t\toptions.signal?.removeEventListener(\"abort\", onParentAbort);\n\t})();\n\treturn {\n\t\tcontent: [{ type: \"text\", text: `Started async bash command ${job.jobId}: ${options.command}\\nPoll with bash({ command: \"__atomic_bash_job ${job.jobId}\" }); cancel with bash({ command: \"__atomic_bash_job_cancel ${job.jobId}\" })` }],\n\t\tdetails: {\n\t\t\tasync: { jobId: job.jobId, type: \"bash\", state: \"running\", command: options.command, status: \"running\" },\n\t\t\ttimeoutSeconds: options.timeoutSeconds,\n\t\t\t...(options.requestedTimeoutSeconds !== undefined ? { requestedTimeoutSeconds: options.requestedTimeoutSeconds } : {}),\n\t\t},\n\t};\n}\n"]}
@@ -0,0 +1,71 @@
1
+ import { invalidateNativeSearchCache } from "./search-native.js";
2
+ import { createAsyncOutputAppender } from "./bash-async-output.js";
3
+ import { createManagedBashJob, discardManagedBashJob, formatAsyncJobError } from "./bash-async-jobs.js";
4
+ export async function startAsyncBashCommand(options) {
5
+ if (options.manager?.atCapacity)
6
+ throw new Error("Background job limit reached. Wait for running jobs to finish or cancel one.");
7
+ const job = createManagedBashJob(options.command, options.cwd, options.timeoutSeconds, options.requestedTimeoutSeconds);
8
+ try {
9
+ options.manager?.registerBashJob(job, options.deliveryHandler, options.sessionId);
10
+ }
11
+ catch (registerError) {
12
+ // The job was inserted into the managed map but never started; drop it so
13
+ // it cannot linger as a permanently-"running" zombie entry (see
14
+ // discardManagedBashJob). Registration failures (disposed manager/session,
15
+ // capacity race) still surface to the caller as tool errors.
16
+ discardManagedBashJob(job.jobId);
17
+ throw registerError;
18
+ }
19
+ const appendAsyncOutput = createAsyncOutputAppender(job, { persistAfterBytes: 12_000 });
20
+ const onParentAbort = () => {
21
+ options.manager?.acknowledgeDeliveries([job.jobId]);
22
+ job.abortController?.abort();
23
+ };
24
+ if (options.signal?.aborted)
25
+ onParentAbort();
26
+ else
27
+ options.signal?.addEventListener("abort", onParentAbort, { once: true });
28
+ void (async () => {
29
+ let error;
30
+ let exitCode;
31
+ try {
32
+ exitCode = (await options.operations.exec(options.command, options.cwd, {
33
+ onData: appendAsyncOutput.append,
34
+ timeout: options.timeoutSeconds,
35
+ env: options.env,
36
+ pty: options.pty,
37
+ signal: job.abortController?.signal,
38
+ })).exitCode;
39
+ }
40
+ catch (execError) {
41
+ error = execError instanceof Error ? execError : String(execError);
42
+ }
43
+ try {
44
+ await appendAsyncOutput.close();
45
+ }
46
+ catch (closeError) {
47
+ error ??= closeError instanceof Error ? closeError : String(closeError);
48
+ }
49
+ if (error !== undefined) {
50
+ job.status = "failed";
51
+ job.error = job.abortController?.signal.aborted ? "aborted" : formatAsyncJobError(error);
52
+ }
53
+ else {
54
+ job.exitCode = exitCode;
55
+ job.status = exitCode && exitCode !== 0 ? "failed" : "completed";
56
+ }
57
+ job.endedAt = Date.now();
58
+ invalidateNativeSearchCache();
59
+ options.manager?.completeBashJob(job);
60
+ options.signal?.removeEventListener("abort", onParentAbort);
61
+ })();
62
+ return {
63
+ content: [{ type: "text", text: `Started async bash command ${job.jobId}: ${options.command}\nPoll with bash({ command: "__atomic_bash_job ${job.jobId}" }); cancel with bash({ command: "__atomic_bash_job_cancel ${job.jobId}" })` }],
64
+ details: {
65
+ async: { jobId: job.jobId, type: "bash", state: "running", command: options.command, status: "running" },
66
+ timeoutSeconds: options.timeoutSeconds,
67
+ ...(options.requestedTimeoutSeconds !== undefined ? { requestedTimeoutSeconds: options.requestedTimeoutSeconds } : {}),
68
+ },
69
+ };
70
+ }
71
+ //# sourceMappingURL=bash-async-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-async-execution.js","sourceRoot":"","sources":["../../../src/core/tools/bash-async-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AsyncJobManager } from \"../async/job-manager.js\";\nimport type { AsyncJobDeliveryHandler } from \"../async/types.js\";\nimport { invalidateNativeSearchCache } from \"./search-native.js\";\nimport { createAsyncOutputAppender } from \"./bash-async-output.js\";\nimport { createManagedBashJob, discardManagedBashJob, formatAsyncJobError } from \"./bash-async-jobs.js\";\nimport type { BashOperations, BashToolDetails } from \"./bash.js\";\n\ninterface StartAsyncBashCommandOptions {\n\tcommand: string;\n\tcwd: string;\n\tenv: NodeJS.ProcessEnv;\n\tpty?: boolean;\n\ttimeoutSeconds: number;\n\trequestedTimeoutSeconds?: number;\n\tsignal?: AbortSignal;\n\toperations: BashOperations;\n\tmanager?: AsyncJobManager;\n\tdeliveryHandler?: AsyncJobDeliveryHandler;\n\tsessionId?: symbol;\n}\n\nexport async function startAsyncBashCommand(options: StartAsyncBashCommandOptions): Promise<{\n\tcontent: Array<{ type: \"text\"; text: string }>;\n\tdetails: BashToolDetails;\n}> {\n\tif (options.manager?.atCapacity) throw new Error(\"Background job limit reached. Wait for running jobs to finish or cancel one.\");\n\tconst job = createManagedBashJob(options.command, options.cwd, options.timeoutSeconds, options.requestedTimeoutSeconds);\n\ttry {\n\t\toptions.manager?.registerBashJob(job, options.deliveryHandler, options.sessionId);\n\t} catch (registerError) {\n\t\t// The job was inserted into the managed map but never started; drop it so\n\t\t// it cannot linger as a permanently-\"running\" zombie entry (see\n\t\t// discardManagedBashJob). Registration failures (disposed manager/session,\n\t\t// capacity race) still surface to the caller as tool errors.\n\t\tdiscardManagedBashJob(job.jobId);\n\t\tthrow registerError;\n\t}\n\tconst appendAsyncOutput = createAsyncOutputAppender(job, { persistAfterBytes: 12_000 });\n\tconst onParentAbort = () => {\n\t\toptions.manager?.acknowledgeDeliveries([job.jobId]);\n\t\tjob.abortController?.abort();\n\t};\n\tif (options.signal?.aborted) onParentAbort();\n\telse options.signal?.addEventListener(\"abort\", onParentAbort, { once: true });\n\tvoid (async () => {\n\t\tlet error: Error | string | undefined;\n\t\tlet exitCode: number | null | undefined;\n\t\ttry {\n\t\t\texitCode = (await options.operations.exec(options.command, options.cwd, {\n\t\t\t\tonData: appendAsyncOutput.append,\n\t\t\t\ttimeout: options.timeoutSeconds,\n\t\t\t\tenv: options.env,\n\t\t\t\tpty: options.pty,\n\t\t\t\tsignal: job.abortController?.signal,\n\t\t\t})).exitCode;\n\t\t} catch (execError) {\n\t\t\terror = execError instanceof Error ? execError : String(execError);\n\t\t}\n\t\ttry {\n\t\t\tawait appendAsyncOutput.close();\n\t\t} catch (closeError) {\n\t\t\terror ??= closeError instanceof Error ? closeError : String(closeError);\n\t\t}\n\t\tif (error !== undefined) {\n\t\t\tjob.status = \"failed\";\n\t\t\tjob.error = job.abortController?.signal.aborted ? \"aborted\" : formatAsyncJobError(error);\n\t\t} else {\n\t\t\tjob.exitCode = exitCode;\n\t\t\tjob.status = exitCode && exitCode !== 0 ? \"failed\" : \"completed\";\n\t\t}\n\t\tjob.endedAt = Date.now();\n\t\tinvalidateNativeSearchCache();\n\t\toptions.manager?.completeBashJob(job);\n\t\toptions.signal?.removeEventListener(\"abort\", onParentAbort);\n\t})();\n\treturn {\n\t\tcontent: [{ type: \"text\", text: `Started async bash command ${job.jobId}: ${options.command}\\nPoll with bash({ command: \"__atomic_bash_job ${job.jobId}\" }); cancel with bash({ command: \"__atomic_bash_job_cancel ${job.jobId}\" })` }],\n\t\tdetails: {\n\t\t\tasync: { jobId: job.jobId, type: \"bash\", state: \"running\", command: options.command, status: \"running\" },\n\t\t\ttimeoutSeconds: options.timeoutSeconds,\n\t\t\t...(options.requestedTimeoutSeconds !== undefined ? { requestedTimeoutSeconds: options.requestedTimeoutSeconds } : {}),\n\t\t},\n\t};\n}\n"]}
@@ -13,8 +13,18 @@ export interface ManagedBashJob {
13
13
  requestedTimeoutSeconds?: number;
14
14
  abortController?: AbortController;
15
15
  }
16
+ export declare const MAX_MANAGED_BASH_JOBS = 100;
17
+ export declare const COMPLETED_JOB_TTL_MS: number;
16
18
  export declare function formatAsyncJobError(error: unknown): string;
17
19
  export declare function createManagedBashJob(command: string, cwd: string, timeoutSeconds?: number, requestedTimeoutSeconds?: number): ManagedBashJob;
20
+ /**
21
+ * Remove a managed job that never actually started executing (for example when
22
+ * async-manager registration fails after the map insert). Without this, the
23
+ * entry would stay "running" forever: TTL cleanup only evicts settled jobs, so
24
+ * the zombie would linger until the max-jobs overflow forcibly removed it.
25
+ */
26
+ export declare function discardManagedBashJob(jobId: string): void;
27
+ export declare function listManagedBashJobIds(): string[];
18
28
  export declare function getManagedBashJob(jobId: string): ManagedBashJob | undefined;
19
29
  export declare function abortManagedBashJob(jobId: string): ManagedBashJob | undefined;
20
30
  //# sourceMappingURL=bash-async-jobs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bash-async-jobs.d.ts","sourceRoot":"","sources":["../../../src/core/tools/bash-async-jobs.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,eAAe,CAAC;CAClC;AAKD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI1D;AAgBD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,uBAAuB,CAAC,EAAE,MAAM,GAAG,cAAc,CAO5I;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAM3E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAK7E","sourcesContent":["import { rmSync } from \"node:fs\";\n\nexport interface ManagedBashJob {\n\tjobId: string;\n\tcommand: string;\n\tcwd: string;\n\tstatus: \"running\" | \"completed\" | \"failed\";\n\toutput: string;\n\tfullOutputPath?: string;\n\texitCode?: number | null;\n\terror?: string;\n\tstartedAt: number;\n\tendedAt?: number;\n\ttimeoutSeconds?: number;\n\trequestedTimeoutSeconds?: number;\n\tabortController?: AbortController;\n}\n\nconst MAX_MANAGED_BASH_JOBS = 100;\nconst COMPLETED_JOB_TTL_MS = 30 * 60 * 1000;\nconst managedBashJobs = new Map<string, ManagedBashJob>();\nexport function formatAsyncJobError(error: unknown): string {\n\tconst message = error instanceof Error ? error.message : String(error);\n\tif (message.startsWith(\"timeout:\")) return `Command timed out after ${message.slice(\"timeout:\".length)} seconds`;\n\treturn message;\n}\nfunction deleteJobOutput(job: ManagedBashJob): void {\n\tif (!job.fullOutputPath) return;\n\ttry { rmSync(job.fullOutputPath, { force: true }); } catch { /* best-effort temp cleanup */ }\n}\n\nfunction cleanupManagedBashJobs(now = Date.now()): void {\n\tfor (const [jobId, job] of managedBashJobs) if (job.status !== \"running\" && job.endedAt !== undefined && now - job.endedAt > COMPLETED_JOB_TTL_MS) { deleteJobOutput(job); managedBashJobs.delete(jobId); }\n\twhile (managedBashJobs.size > MAX_MANAGED_BASH_JOBS) {\n\t\tconst oldest = [...managedBashJobs.values()].sort((a, b) => (a.endedAt ?? a.startedAt) - (b.endedAt ?? b.startedAt))[0];\n\t\tif (!oldest) break;\n\t\tif (oldest.status === \"running\") oldest.abortController?.abort(); else deleteJobOutput(oldest);\n\t\tmanagedBashJobs.delete(oldest.jobId);\n\t}\n}\n\nexport function createManagedBashJob(command: string, cwd: string, timeoutSeconds?: number, requestedTimeoutSeconds?: number): ManagedBashJob {\n\tcleanupManagedBashJobs();\n\tconst jobId = `bash-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n\tconst job: ManagedBashJob = { jobId, command, cwd, status: \"running\", output: \"\", startedAt: Date.now(), timeoutSeconds, requestedTimeoutSeconds, abortController: new AbortController() };\n\tmanagedBashJobs.set(jobId, job);\n\tcleanupManagedBashJobs();\n\treturn job;\n}\n\nexport function getManagedBashJob(jobId: string): ManagedBashJob | undefined {\n\tcleanupManagedBashJobs();\n\tconst job = managedBashJobs.get(jobId);\n\tif (!job) return undefined;\n\tconst { abortController: _abortController, ...snapshot } = job;\n\treturn { ...snapshot };\n}\n\nexport function abortManagedBashJob(jobId: string): ManagedBashJob | undefined {\n\tconst job = managedBashJobs.get(jobId);\n\tif (!job) return undefined;\n\tjob.abortController?.abort();\n\treturn job;\n}\n"]}
1
+ {"version":3,"file":"bash-async-jobs.d.ts","sourceRoot":"","sources":["../../../src/core/tools/bash-async-jobs.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,eAAe,CAAC;CAClC;AAED,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,oBAAoB,QAAiB,CAAC;AAEnD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI1D;AAgBD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,uBAAuB,CAAC,EAAE,MAAM,GAAG,cAAc,CAO5I;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAKzD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAM3E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAK7E","sourcesContent":["import { rmSync } from \"node:fs\";\n\nexport interface ManagedBashJob {\n\tjobId: string;\n\tcommand: string;\n\tcwd: string;\n\tstatus: \"running\" | \"completed\" | \"failed\";\n\toutput: string;\n\tfullOutputPath?: string;\n\texitCode?: number | null;\n\terror?: string;\n\tstartedAt: number;\n\tendedAt?: number;\n\ttimeoutSeconds?: number;\n\trequestedTimeoutSeconds?: number;\n\tabortController?: AbortController;\n}\n\nexport const MAX_MANAGED_BASH_JOBS = 100;\nexport const COMPLETED_JOB_TTL_MS = 30 * 60 * 1000;\nconst managedBashJobs = new Map<string, ManagedBashJob>();\nexport function formatAsyncJobError(error: unknown): string {\n\tconst message = error instanceof Error ? error.message : String(error);\n\tif (message.startsWith(\"timeout:\")) return `Command timed out after ${message.slice(\"timeout:\".length)} seconds`;\n\treturn message;\n}\nfunction deleteJobOutput(job: ManagedBashJob): void {\n\tif (!job.fullOutputPath) return;\n\ttry { rmSync(job.fullOutputPath, { force: true }); } catch { /* best-effort temp cleanup */ }\n}\n\nfunction cleanupManagedBashJobs(now = Date.now()): void {\n\tfor (const [jobId, job] of managedBashJobs) if (job.status !== \"running\" && job.endedAt !== undefined && now - job.endedAt > COMPLETED_JOB_TTL_MS) { deleteJobOutput(job); managedBashJobs.delete(jobId); }\n\twhile (managedBashJobs.size > MAX_MANAGED_BASH_JOBS) {\n\t\tconst oldest = [...managedBashJobs.values()].sort((a, b) => (a.endedAt ?? a.startedAt) - (b.endedAt ?? b.startedAt))[0];\n\t\tif (!oldest) break;\n\t\tif (oldest.status === \"running\") oldest.abortController?.abort(); else deleteJobOutput(oldest);\n\t\tmanagedBashJobs.delete(oldest.jobId);\n\t}\n}\n\nexport function createManagedBashJob(command: string, cwd: string, timeoutSeconds?: number, requestedTimeoutSeconds?: number): ManagedBashJob {\n\tcleanupManagedBashJobs();\n\tconst jobId = `bash-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n\tconst job: ManagedBashJob = { jobId, command, cwd, status: \"running\", output: \"\", startedAt: Date.now(), timeoutSeconds, requestedTimeoutSeconds, abortController: new AbortController() };\n\tmanagedBashJobs.set(jobId, job);\n\tcleanupManagedBashJobs();\n\treturn job;\n}\n\n/**\n * Remove a managed job that never actually started executing (for example when\n * async-manager registration fails after the map insert). Without this, the\n * entry would stay \"running\" forever: TTL cleanup only evicts settled jobs, so\n * the zombie would linger until the max-jobs overflow forcibly removed it.\n */\nexport function discardManagedBashJob(jobId: string): void {\n\tconst job = managedBashJobs.get(jobId);\n\tif (!job) return;\n\tdeleteJobOutput(job);\n\tmanagedBashJobs.delete(jobId);\n}\n\nexport function listManagedBashJobIds(): string[] {\n\treturn [...managedBashJobs.keys()];\n}\n\nexport function getManagedBashJob(jobId: string): ManagedBashJob | undefined {\n\tcleanupManagedBashJobs();\n\tconst job = managedBashJobs.get(jobId);\n\tif (!job) return undefined;\n\tconst { abortController: _abortController, ...snapshot } = job;\n\treturn { ...snapshot };\n}\n\nexport function abortManagedBashJob(jobId: string): ManagedBashJob | undefined {\n\tconst job = managedBashJobs.get(jobId);\n\tif (!job) return undefined;\n\tjob.abortController?.abort();\n\treturn job;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { rmSync } from "node:fs";
2
- const MAX_MANAGED_BASH_JOBS = 100;
3
- const COMPLETED_JOB_TTL_MS = 30 * 60 * 1000;
2
+ export const MAX_MANAGED_BASH_JOBS = 100;
3
+ export const COMPLETED_JOB_TTL_MS = 30 * 60 * 1000;
4
4
  const managedBashJobs = new Map();
5
5
  export function formatAsyncJobError(error) {
6
6
  const message = error instanceof Error ? error.message : String(error);
@@ -41,6 +41,22 @@ export function createManagedBashJob(command, cwd, timeoutSeconds, requestedTime
41
41
  cleanupManagedBashJobs();
42
42
  return job;
43
43
  }
44
+ /**
45
+ * Remove a managed job that never actually started executing (for example when
46
+ * async-manager registration fails after the map insert). Without this, the
47
+ * entry would stay "running" forever: TTL cleanup only evicts settled jobs, so
48
+ * the zombie would linger until the max-jobs overflow forcibly removed it.
49
+ */
50
+ export function discardManagedBashJob(jobId) {
51
+ const job = managedBashJobs.get(jobId);
52
+ if (!job)
53
+ return;
54
+ deleteJobOutput(job);
55
+ managedBashJobs.delete(jobId);
56
+ }
57
+ export function listManagedBashJobIds() {
58
+ return [...managedBashJobs.keys()];
59
+ }
44
60
  export function getManagedBashJob(jobId) {
45
61
  cleanupManagedBashJobs();
46
62
  const job = managedBashJobs.get(jobId);
@@ -1 +1 @@
1
- {"version":3,"file":"bash-async-jobs.js","sourceRoot":"","sources":["../../../src/core/tools/bash-async-jobs.ts"],"names":[],"mappings":"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","sourcesContent":["import { rmSync } from \"node:fs\";\n\nexport interface ManagedBashJob {\n\tjobId: string;\n\tcommand: string;\n\tcwd: string;\n\tstatus: \"running\" | \"completed\" | \"failed\";\n\toutput: string;\n\tfullOutputPath?: string;\n\texitCode?: number | null;\n\terror?: string;\n\tstartedAt: number;\n\tendedAt?: number;\n\ttimeoutSeconds?: number;\n\trequestedTimeoutSeconds?: number;\n\tabortController?: AbortController;\n}\n\nconst MAX_MANAGED_BASH_JOBS = 100;\nconst COMPLETED_JOB_TTL_MS = 30 * 60 * 1000;\nconst managedBashJobs = new Map<string, ManagedBashJob>();\nexport function formatAsyncJobError(error: unknown): string {\n\tconst message = error instanceof Error ? error.message : String(error);\n\tif (message.startsWith(\"timeout:\")) return `Command timed out after ${message.slice(\"timeout:\".length)} seconds`;\n\treturn message;\n}\nfunction deleteJobOutput(job: ManagedBashJob): void {\n\tif (!job.fullOutputPath) return;\n\ttry { rmSync(job.fullOutputPath, { force: true }); } catch { /* best-effort temp cleanup */ }\n}\n\nfunction cleanupManagedBashJobs(now = Date.now()): void {\n\tfor (const [jobId, job] of managedBashJobs) if (job.status !== \"running\" && job.endedAt !== undefined && now - job.endedAt > COMPLETED_JOB_TTL_MS) { deleteJobOutput(job); managedBashJobs.delete(jobId); }\n\twhile (managedBashJobs.size > MAX_MANAGED_BASH_JOBS) {\n\t\tconst oldest = [...managedBashJobs.values()].sort((a, b) => (a.endedAt ?? a.startedAt) - (b.endedAt ?? b.startedAt))[0];\n\t\tif (!oldest) break;\n\t\tif (oldest.status === \"running\") oldest.abortController?.abort(); else deleteJobOutput(oldest);\n\t\tmanagedBashJobs.delete(oldest.jobId);\n\t}\n}\n\nexport function createManagedBashJob(command: string, cwd: string, timeoutSeconds?: number, requestedTimeoutSeconds?: number): ManagedBashJob {\n\tcleanupManagedBashJobs();\n\tconst jobId = `bash-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n\tconst job: ManagedBashJob = { jobId, command, cwd, status: \"running\", output: \"\", startedAt: Date.now(), timeoutSeconds, requestedTimeoutSeconds, abortController: new AbortController() };\n\tmanagedBashJobs.set(jobId, job);\n\tcleanupManagedBashJobs();\n\treturn job;\n}\n\nexport function getManagedBashJob(jobId: string): ManagedBashJob | undefined {\n\tcleanupManagedBashJobs();\n\tconst job = managedBashJobs.get(jobId);\n\tif (!job) return undefined;\n\tconst { abortController: _abortController, ...snapshot } = job;\n\treturn { ...snapshot };\n}\n\nexport function abortManagedBashJob(jobId: string): ManagedBashJob | undefined {\n\tconst job = managedBashJobs.get(jobId);\n\tif (!job) return undefined;\n\tjob.abortController?.abort();\n\treturn job;\n}\n"]}
1
+ {"version":3,"file":"bash-async-jobs.js","sourceRoot":"","sources":["../../../src/core/tools/bash-async-jobs.ts"],"names":[],"mappings":"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","sourcesContent":["import { rmSync } from \"node:fs\";\n\nexport interface ManagedBashJob {\n\tjobId: string;\n\tcommand: string;\n\tcwd: string;\n\tstatus: \"running\" | \"completed\" | \"failed\";\n\toutput: string;\n\tfullOutputPath?: string;\n\texitCode?: number | null;\n\terror?: string;\n\tstartedAt: number;\n\tendedAt?: number;\n\ttimeoutSeconds?: number;\n\trequestedTimeoutSeconds?: number;\n\tabortController?: AbortController;\n}\n\nexport const MAX_MANAGED_BASH_JOBS = 100;\nexport const COMPLETED_JOB_TTL_MS = 30 * 60 * 1000;\nconst managedBashJobs = new Map<string, ManagedBashJob>();\nexport function formatAsyncJobError(error: unknown): string {\n\tconst message = error instanceof Error ? error.message : String(error);\n\tif (message.startsWith(\"timeout:\")) return `Command timed out after ${message.slice(\"timeout:\".length)} seconds`;\n\treturn message;\n}\nfunction deleteJobOutput(job: ManagedBashJob): void {\n\tif (!job.fullOutputPath) return;\n\ttry { rmSync(job.fullOutputPath, { force: true }); } catch { /* best-effort temp cleanup */ }\n}\n\nfunction cleanupManagedBashJobs(now = Date.now()): void {\n\tfor (const [jobId, job] of managedBashJobs) if (job.status !== \"running\" && job.endedAt !== undefined && now - job.endedAt > COMPLETED_JOB_TTL_MS) { deleteJobOutput(job); managedBashJobs.delete(jobId); }\n\twhile (managedBashJobs.size > MAX_MANAGED_BASH_JOBS) {\n\t\tconst oldest = [...managedBashJobs.values()].sort((a, b) => (a.endedAt ?? a.startedAt) - (b.endedAt ?? b.startedAt))[0];\n\t\tif (!oldest) break;\n\t\tif (oldest.status === \"running\") oldest.abortController?.abort(); else deleteJobOutput(oldest);\n\t\tmanagedBashJobs.delete(oldest.jobId);\n\t}\n}\n\nexport function createManagedBashJob(command: string, cwd: string, timeoutSeconds?: number, requestedTimeoutSeconds?: number): ManagedBashJob {\n\tcleanupManagedBashJobs();\n\tconst jobId = `bash-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n\tconst job: ManagedBashJob = { jobId, command, cwd, status: \"running\", output: \"\", startedAt: Date.now(), timeoutSeconds, requestedTimeoutSeconds, abortController: new AbortController() };\n\tmanagedBashJobs.set(jobId, job);\n\tcleanupManagedBashJobs();\n\treturn job;\n}\n\n/**\n * Remove a managed job that never actually started executing (for example when\n * async-manager registration fails after the map insert). Without this, the\n * entry would stay \"running\" forever: TTL cleanup only evicts settled jobs, so\n * the zombie would linger until the max-jobs overflow forcibly removed it.\n */\nexport function discardManagedBashJob(jobId: string): void {\n\tconst job = managedBashJobs.get(jobId);\n\tif (!job) return;\n\tdeleteJobOutput(job);\n\tmanagedBashJobs.delete(jobId);\n}\n\nexport function listManagedBashJobIds(): string[] {\n\treturn [...managedBashJobs.keys()];\n}\n\nexport function getManagedBashJob(jobId: string): ManagedBashJob | undefined {\n\tcleanupManagedBashJobs();\n\tconst job = managedBashJobs.get(jobId);\n\tif (!job) return undefined;\n\tconst { abortController: _abortController, ...snapshot } = job;\n\treturn { ...snapshot };\n}\n\nexport function abortManagedBashJob(jobId: string): ManagedBashJob | undefined {\n\tconst job = managedBashJobs.get(jobId);\n\tif (!job) return undefined;\n\tjob.abortController?.abort();\n\treturn job;\n}\n"]}
@@ -6,5 +6,7 @@ export interface BashAsyncOutputAppender {
6
6
  append(chunk: Buffer): void;
7
7
  close(): Promise<void>;
8
8
  }
9
- export declare function createAsyncOutputAppender(job: BashAsyncOutputTarget): BashAsyncOutputAppender;
9
+ export declare function createAsyncOutputAppender(job: BashAsyncOutputTarget, options?: {
10
+ persistAfterBytes?: number;
11
+ }): BashAsyncOutputAppender;
10
12
  //# sourceMappingURL=bash-async-output.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bash-async-output.d.ts","sourceRoot":"","sources":["../../../src/core/tools/bash-async-output.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACvC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAeD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,qBAAqB,GAAG,uBAAuB,CAmD7F","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { createWriteStream, type WriteStream } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { APP_NAME } from \"../../config.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize } from \"./truncate.ts\";\n\nexport interface BashAsyncOutputTarget {\n\toutput: string;\n\tfullOutputPath?: string;\n}\n\nexport interface BashAsyncOutputAppender {\n\tappend(chunk: Buffer): void;\n\tclose(): Promise<void>;\n}\n\nfunction outputPath(): string {\n\treturn join(tmpdir(), `${APP_NAME}-bash-async-${randomBytes(8).toString(\"hex\")}.log`);\n}\n\nfunction byteLength(text: string): number { return Buffer.byteLength(text, \"utf8\"); }\nfunction sanitizeDecodedOutput(text: string): string { return sanitizeBinaryOutput(stripAnsi(text)).replace(/\\r/g, \"\"); }\nfunction utf8Prefix(text: string, maxBytes: number): string {\n\tif (byteLength(text) <= maxBytes) return text;\n\tlet end = text.length;\n\twhile (end > 0 && byteLength(text.slice(0, end)) > maxBytes) end--;\n\treturn text.slice(0, end);\n}\n\nexport function createAsyncOutputAppender(job: BashAsyncOutputTarget): BashAsyncOutputAppender {\n\tlet outputBytes = 0;\n\tlet truncated = false;\n\tlet fullOutputStream: WriteStream | undefined;\n\tlet bufferedChunks: Buffer[] = [];\n\tconst decoder = new TextDecoder();\n\n\tconst ensureFullOutputStream = (): WriteStream => {\n\t\tif (fullOutputStream) return fullOutputStream;\n\t\tjob.fullOutputPath = outputPath();\n\t\tfullOutputStream = createWriteStream(job.fullOutputPath);\n\t\tfor (const chunk of bufferedChunks) fullOutputStream.write(chunk);\n\t\tbufferedChunks = [];\n\t\treturn fullOutputStream;\n\t};\n\tconst appendDecodedText = (decoded: string): void => {\n\t\tif (truncated || decoded.length === 0) return;\n\t\tconst text = sanitizeDecodedOutput(decoded);\n\t\tif (text.length === 0) return;\n\t\tconst bytes = byteLength(text);\n\t\tif (outputBytes + bytes > DEFAULT_MAX_BYTES) {\n\t\t\tensureFullOutputStream();\n\t\t\tconst remaining = Math.max(0, DEFAULT_MAX_BYTES - outputBytes);\n\t\t\tif (remaining > 0) job.output += utf8Prefix(text, remaining);\n\t\t\tjob.output += `\\n[Output truncated at ${formatSize(DEFAULT_MAX_BYTES)} for async job polling. Full output: ${job.fullOutputPath}]`;\n\t\t\toutputBytes += bytes;\n\t\t\ttruncated = true;\n\t\t\treturn;\n\t\t}\n\t\toutputBytes += bytes;\n\t\tjob.output += text;\n\t};\n\n\treturn {\n\t\tappend(chunk) {\n\t\t\tif (fullOutputStream) fullOutputStream.write(chunk);\n\t\t\telse bufferedChunks.push(chunk);\n\t\t\tappendDecodedText(decoder.decode(chunk, { stream: true }));\n\t\t},\n\t\tasync close() {\n\t\t\tappendDecodedText(decoder.decode());\n\t\t\tif (!fullOutputStream) return;\n\t\t\tconst stream = fullOutputStream;\n\t\t\tfullOutputStream = undefined;\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tstream.once(\"error\", reject);\n\t\t\t\tstream.once(\"finish\", resolve);\n\t\t\t\tstream.end();\n\t\t\t});\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"bash-async-output.d.ts","sourceRoot":"","sources":["../../../src/core/tools/bash-async-output.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACvC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAeD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,uBAAuB,CAqDvI","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { createWriteStream, type WriteStream } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { APP_NAME } from \"../../config.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize } from \"./truncate.ts\";\n\nexport interface BashAsyncOutputTarget {\n\toutput: string;\n\tfullOutputPath?: string;\n}\n\nexport interface BashAsyncOutputAppender {\n\tappend(chunk: Buffer): void;\n\tclose(): Promise<void>;\n}\n\nfunction outputPath(): string {\n\treturn join(tmpdir(), `${APP_NAME}-bash-async-${randomBytes(8).toString(\"hex\")}.log`);\n}\n\nfunction byteLength(text: string): number { return Buffer.byteLength(text, \"utf8\"); }\nfunction sanitizeDecodedOutput(text: string): string { return sanitizeBinaryOutput(stripAnsi(text)).replace(/\\r/g, \"\"); }\nfunction utf8Prefix(text: string, maxBytes: number): string {\n\tif (byteLength(text) <= maxBytes) return text;\n\tlet end = text.length;\n\twhile (end > 0 && byteLength(text.slice(0, end)) > maxBytes) end--;\n\treturn text.slice(0, end);\n}\n\nexport function createAsyncOutputAppender(job: BashAsyncOutputTarget, options?: { persistAfterBytes?: number }): BashAsyncOutputAppender {\n\tconst persistAfterBytes = options?.persistAfterBytes ?? DEFAULT_MAX_BYTES;\n\tlet outputBytes = 0;\n\tlet truncated = false;\n\tlet fullOutputStream: WriteStream | undefined;\n\tlet bufferedChunks: Buffer[] = [];\n\tconst decoder = new TextDecoder();\n\n\tconst ensureFullOutputStream = (): WriteStream => {\n\t\tif (fullOutputStream) return fullOutputStream;\n\t\tjob.fullOutputPath = outputPath();\n\t\tfullOutputStream = createWriteStream(job.fullOutputPath);\n\t\tfor (const chunk of bufferedChunks) fullOutputStream.write(chunk);\n\t\tbufferedChunks = [];\n\t\treturn fullOutputStream;\n\t};\n\tconst appendDecodedText = (decoded: string): void => {\n\t\tif (truncated || decoded.length === 0) return;\n\t\tconst text = sanitizeDecodedOutput(decoded);\n\t\tif (text.length === 0) return;\n\t\tconst bytes = byteLength(text);\n\t\tif (outputBytes + bytes > persistAfterBytes) ensureFullOutputStream();\n\t\tif (outputBytes + bytes > DEFAULT_MAX_BYTES) {\n\t\t\tensureFullOutputStream();\n\t\t\tconst remaining = Math.max(0, DEFAULT_MAX_BYTES - outputBytes);\n\t\t\tif (remaining > 0) job.output += utf8Prefix(text, remaining);\n\t\t\tjob.output += `\\n[Output truncated at ${formatSize(DEFAULT_MAX_BYTES)} for async job polling. Full output: ${job.fullOutputPath}]`;\n\t\t\toutputBytes += bytes;\n\t\t\ttruncated = true;\n\t\t\treturn;\n\t\t}\n\t\toutputBytes += bytes;\n\t\tjob.output += text;\n\t};\n\n\treturn {\n\t\tappend(chunk) {\n\t\t\tif (fullOutputStream) fullOutputStream.write(chunk);\n\t\t\telse bufferedChunks.push(chunk);\n\t\t\tappendDecodedText(decoder.decode(chunk, { stream: true }));\n\t\t},\n\t\tasync close() {\n\t\t\tappendDecodedText(decoder.decode());\n\t\t\tif (!fullOutputStream) return;\n\t\t\tconst stream = fullOutputStream;\n\t\t\tfullOutputStream = undefined;\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tstream.once(\"error\", reject);\n\t\t\t\tstream.once(\"finish\", resolve);\n\t\t\t\tstream.end();\n\t\t\t});\n\t\t},\n\t};\n}\n"]}
@@ -19,7 +19,8 @@ function utf8Prefix(text, maxBytes) {
19
19
  end--;
20
20
  return text.slice(0, end);
21
21
  }
22
- export function createAsyncOutputAppender(job) {
22
+ export function createAsyncOutputAppender(job, options) {
23
+ const persistAfterBytes = options?.persistAfterBytes ?? DEFAULT_MAX_BYTES;
23
24
  let outputBytes = 0;
24
25
  let truncated = false;
25
26
  let fullOutputStream;
@@ -42,6 +43,8 @@ export function createAsyncOutputAppender(job) {
42
43
  if (text.length === 0)
43
44
  return;
44
45
  const bytes = byteLength(text);
46
+ if (outputBytes + bytes > persistAfterBytes)
47
+ ensureFullOutputStream();
45
48
  if (outputBytes + bytes > DEFAULT_MAX_BYTES) {
46
49
  ensureFullOutputStream();
47
50
  const remaining = Math.max(0, DEFAULT_MAX_BYTES - outputBytes);
@@ -1 +1 @@
1
- {"version":3,"file":"bash-async-output.js","sourceRoot":"","sources":["../../../src/core/tools/bash-async-output.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { createWriteStream, type WriteStream } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { APP_NAME } from \"../../config.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize } from \"./truncate.ts\";\n\nexport interface BashAsyncOutputTarget {\n\toutput: string;\n\tfullOutputPath?: string;\n}\n\nexport interface BashAsyncOutputAppender {\n\tappend(chunk: Buffer): void;\n\tclose(): Promise<void>;\n}\n\nfunction outputPath(): string {\n\treturn join(tmpdir(), `${APP_NAME}-bash-async-${randomBytes(8).toString(\"hex\")}.log`);\n}\n\nfunction byteLength(text: string): number { return Buffer.byteLength(text, \"utf8\"); }\nfunction sanitizeDecodedOutput(text: string): string { return sanitizeBinaryOutput(stripAnsi(text)).replace(/\\r/g, \"\"); }\nfunction utf8Prefix(text: string, maxBytes: number): string {\n\tif (byteLength(text) <= maxBytes) return text;\n\tlet end = text.length;\n\twhile (end > 0 && byteLength(text.slice(0, end)) > maxBytes) end--;\n\treturn text.slice(0, end);\n}\n\nexport function createAsyncOutputAppender(job: BashAsyncOutputTarget): BashAsyncOutputAppender {\n\tlet outputBytes = 0;\n\tlet truncated = false;\n\tlet fullOutputStream: WriteStream | undefined;\n\tlet bufferedChunks: Buffer[] = [];\n\tconst decoder = new TextDecoder();\n\n\tconst ensureFullOutputStream = (): WriteStream => {\n\t\tif (fullOutputStream) return fullOutputStream;\n\t\tjob.fullOutputPath = outputPath();\n\t\tfullOutputStream = createWriteStream(job.fullOutputPath);\n\t\tfor (const chunk of bufferedChunks) fullOutputStream.write(chunk);\n\t\tbufferedChunks = [];\n\t\treturn fullOutputStream;\n\t};\n\tconst appendDecodedText = (decoded: string): void => {\n\t\tif (truncated || decoded.length === 0) return;\n\t\tconst text = sanitizeDecodedOutput(decoded);\n\t\tif (text.length === 0) return;\n\t\tconst bytes = byteLength(text);\n\t\tif (outputBytes + bytes > DEFAULT_MAX_BYTES) {\n\t\t\tensureFullOutputStream();\n\t\t\tconst remaining = Math.max(0, DEFAULT_MAX_BYTES - outputBytes);\n\t\t\tif (remaining > 0) job.output += utf8Prefix(text, remaining);\n\t\t\tjob.output += `\\n[Output truncated at ${formatSize(DEFAULT_MAX_BYTES)} for async job polling. Full output: ${job.fullOutputPath}]`;\n\t\t\toutputBytes += bytes;\n\t\t\ttruncated = true;\n\t\t\treturn;\n\t\t}\n\t\toutputBytes += bytes;\n\t\tjob.output += text;\n\t};\n\n\treturn {\n\t\tappend(chunk) {\n\t\t\tif (fullOutputStream) fullOutputStream.write(chunk);\n\t\t\telse bufferedChunks.push(chunk);\n\t\t\tappendDecodedText(decoder.decode(chunk, { stream: true }));\n\t\t},\n\t\tasync close() {\n\t\t\tappendDecodedText(decoder.decode());\n\t\t\tif (!fullOutputStream) return;\n\t\t\tconst stream = fullOutputStream;\n\t\t\tfullOutputStream = undefined;\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tstream.once(\"error\", reject);\n\t\t\t\tstream.once(\"finish\", resolve);\n\t\t\t\tstream.end();\n\t\t\t});\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"bash-async-output.js","sourceRoot":"","sources":["../../../src/core/tools/bash-async-output.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { createWriteStream, type WriteStream } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { APP_NAME } from \"../../config.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize } from \"./truncate.ts\";\n\nexport interface BashAsyncOutputTarget {\n\toutput: string;\n\tfullOutputPath?: string;\n}\n\nexport interface BashAsyncOutputAppender {\n\tappend(chunk: Buffer): void;\n\tclose(): Promise<void>;\n}\n\nfunction outputPath(): string {\n\treturn join(tmpdir(), `${APP_NAME}-bash-async-${randomBytes(8).toString(\"hex\")}.log`);\n}\n\nfunction byteLength(text: string): number { return Buffer.byteLength(text, \"utf8\"); }\nfunction sanitizeDecodedOutput(text: string): string { return sanitizeBinaryOutput(stripAnsi(text)).replace(/\\r/g, \"\"); }\nfunction utf8Prefix(text: string, maxBytes: number): string {\n\tif (byteLength(text) <= maxBytes) return text;\n\tlet end = text.length;\n\twhile (end > 0 && byteLength(text.slice(0, end)) > maxBytes) end--;\n\treturn text.slice(0, end);\n}\n\nexport function createAsyncOutputAppender(job: BashAsyncOutputTarget, options?: { persistAfterBytes?: number }): BashAsyncOutputAppender {\n\tconst persistAfterBytes = options?.persistAfterBytes ?? DEFAULT_MAX_BYTES;\n\tlet outputBytes = 0;\n\tlet truncated = false;\n\tlet fullOutputStream: WriteStream | undefined;\n\tlet bufferedChunks: Buffer[] = [];\n\tconst decoder = new TextDecoder();\n\n\tconst ensureFullOutputStream = (): WriteStream => {\n\t\tif (fullOutputStream) return fullOutputStream;\n\t\tjob.fullOutputPath = outputPath();\n\t\tfullOutputStream = createWriteStream(job.fullOutputPath);\n\t\tfor (const chunk of bufferedChunks) fullOutputStream.write(chunk);\n\t\tbufferedChunks = [];\n\t\treturn fullOutputStream;\n\t};\n\tconst appendDecodedText = (decoded: string): void => {\n\t\tif (truncated || decoded.length === 0) return;\n\t\tconst text = sanitizeDecodedOutput(decoded);\n\t\tif (text.length === 0) return;\n\t\tconst bytes = byteLength(text);\n\t\tif (outputBytes + bytes > persistAfterBytes) ensureFullOutputStream();\n\t\tif (outputBytes + bytes > DEFAULT_MAX_BYTES) {\n\t\t\tensureFullOutputStream();\n\t\t\tconst remaining = Math.max(0, DEFAULT_MAX_BYTES - outputBytes);\n\t\t\tif (remaining > 0) job.output += utf8Prefix(text, remaining);\n\t\t\tjob.output += `\\n[Output truncated at ${formatSize(DEFAULT_MAX_BYTES)} for async job polling. Full output: ${job.fullOutputPath}]`;\n\t\t\toutputBytes += bytes;\n\t\t\ttruncated = true;\n\t\t\treturn;\n\t\t}\n\t\toutputBytes += bytes;\n\t\tjob.output += text;\n\t};\n\n\treturn {\n\t\tappend(chunk) {\n\t\t\tif (fullOutputStream) fullOutputStream.write(chunk);\n\t\t\telse bufferedChunks.push(chunk);\n\t\t\tappendDecodedText(decoder.decode(chunk, { stream: true }));\n\t\t},\n\t\tasync close() {\n\t\t\tappendDecodedText(decoder.decode());\n\t\t\tif (!fullOutputStream) return;\n\t\t\tconst stream = fullOutputStream;\n\t\t\tfullOutputStream = undefined;\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tstream.once(\"error\", reject);\n\t\t\t\tstream.once(\"finish\", resolve);\n\t\t\t\tstream.end();\n\t\t\t});\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"bash-pty-native.d.ts","sourceRoot":"","sources":["../../../src/core/tools/bash-pty-native.ts"],"names":[],"mappings":"AA4CA,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAqBD,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA+BxI","sourcesContent":["import { createRequire } from \"node:module\";\nimport { getShellConfig, getShellEnv } from \"../../utils/shell.ts\";\n\nconst NATIVE_PACKAGE = \"@bastani/atomic-natives\";\n\ninterface NativePtyRunResult {\n\texitCode?: number;\n\texit_code?: number;\n\tcancelled?: boolean;\n\ttimedOut?: boolean;\n\ttimed_out?: boolean;\n}\n\ninterface NativePtySession {\n\tstart(\n\t\toptions: {\n\t\t\tcommand: string;\n\t\t\tcwd?: string;\n\t\t\tenv?: Record<string, string>;\n\t\t\ttimeoutMs?: number;\n\t\t\tcols?: number;\n\t\t\trows?: number;\n\t\t\tshell?: string;\n\t\t\tshellArgs?: string[];\n\t\t\tcommandTransport?: \"argv\" | \"stdin\";\n\t\t\tcloseStdinAfterCommand?: boolean;\n\t\t},\n\t\tonChunk?: (error: Error | null, chunk: string) => void,\n\t): Promise<NativePtyRunResult>;\n\twrite(data: string): void;\n\tresize(cols: number, rows: number): void;\n\tkill(): void;\n}\n\ninterface NativePtyBinding {\n\tPtySession: new () => NativePtySession;\n}\n\ntype NativeLoadResult =\n\t| { ok: true; binding: NativePtyBinding }\n\t| { ok: false; error: Error };\n\nlet cachedLoadResult: NativeLoadResult | undefined;\n\nexport function resetNativePtyBindingCache(): void {\n\tcachedLoadResult = undefined;\n}\n\nfunction loadNativePtyBinding(): NativeLoadResult {\n\tif (cachedLoadResult) return cachedLoadResult;\n\ttry {\n\t\tconst loaded = createRequire(import.meta.url)(NATIVE_PACKAGE) as Partial<NativePtyBinding>;\n\t\tif (typeof loaded.PtySession !== \"function\") {\n\t\t\tcachedLoadResult = { ok: false, error: new Error(`Native package ${NATIVE_PACKAGE} is missing PtySession.`) };\n\t\t\treturn cachedLoadResult;\n\t\t}\n\t\tcachedLoadResult = { ok: true, binding: loaded as NativePtyBinding };\n\t\treturn cachedLoadResult;\n\t} catch (error) {\n\t\tcachedLoadResult = {\n\t\t\tok: false,\n\t\t\terror: new Error(`Native PTY package ${NATIVE_PACKAGE} is unavailable for ${process.platform}-${process.arch}: ${error instanceof Error ? error.message : String(error)}`),\n\t\t};\n\t\treturn cachedLoadResult;\n\t}\n}\n\nexport interface NativePtyExecOptions {\n\tonData: (data: Buffer) => void;\n\tsignal?: AbortSignal;\n\ttimeout?: number;\n\tenv?: NodeJS.ProcessEnv;\n\tshellPath?: string;\n\tcols?: number;\n\trows?: number;\n}\n\nexport async function executeNativePty(command: string, cwd: string, options: NativePtyExecOptions): Promise<{ exitCode: number | null }> {\n\tconst loaded = loadNativePtyBinding();\n\tif (!loaded.ok) throw loaded.error;\n\tif (options.signal?.aborted) throw new Error(\"aborted\");\n\tconst shellConfig = getShellConfig(options.shellPath);\n\tconst session = new loaded.binding.PtySession();\n\tconst onAbort = () => {\n\t\ttry { session.kill(); } catch {}\n\t};\n\tif (options.signal) options.signal.addEventListener(\"abort\", onAbort, { once: true });\n\ttry {\n\t\tconst result = await session.start({\n\t\t\tcommand,\n\t\t\tcwd,\n\t\t\tenv: { ...getShellEnv(), ...(options.env ?? {}), TERM: \"xterm-256color\" },\n\t\t\ttimeoutMs: options.timeout !== undefined ? Math.max(1, Math.floor(options.timeout * 1000)) : undefined,\n\t\t\tcols: options.cols ?? 120,\n\t\t\trows: options.rows ?? 40,\n\t\t\tshell: shellConfig.shell,\n\t\t\tshellArgs: shellConfig.args,\n\t\t\tcommandTransport: shellConfig.commandTransport,\n\t\t\tcloseStdinAfterCommand: shellConfig.commandTransport === \"stdin\",\n\t\t}, (_error, chunk) => {\n\t\t\tif (chunk) options.onData(Buffer.from(chunk));\n\t\t});\n\t\tif (options.signal?.aborted || result.cancelled) throw new Error(\"aborted\");\n\t\tif (result.timedOut ?? result.timed_out) throw new Error(`timeout:${options.timeout}`);\n\t\treturn { exitCode: result.exitCode ?? result.exit_code ?? null };\n\t} finally {\n\t\tif (options.signal) options.signal.removeEventListener(\"abort\", onAbort);\n\t}\n}\n"]}
1
+ {"version":3,"file":"bash-pty-native.d.ts","sourceRoot":"","sources":["../../../src/core/tools/bash-pty-native.ts"],"names":[],"mappings":"AA4CA,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAqBD,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA+BxI","sourcesContent":["import { createModuleRequire } from \"../../utils/module-require.ts\";\nimport { getShellConfig, getShellEnv } from \"../../utils/shell.ts\";\n\nconst NATIVE_PACKAGE = \"@bastani/atomic-natives\";\n\ninterface NativePtyRunResult {\n\texitCode?: number;\n\texit_code?: number;\n\tcancelled?: boolean;\n\ttimedOut?: boolean;\n\ttimed_out?: boolean;\n}\n\ninterface NativePtySession {\n\tstart(\n\t\toptions: {\n\t\t\tcommand: string;\n\t\t\tcwd?: string;\n\t\t\tenv?: Record<string, string>;\n\t\t\ttimeoutMs?: number;\n\t\t\tcols?: number;\n\t\t\trows?: number;\n\t\t\tshell?: string;\n\t\t\tshellArgs?: string[];\n\t\t\tcommandTransport?: \"argv\" | \"stdin\";\n\t\t\tcloseStdinAfterCommand?: boolean;\n\t\t},\n\t\tonChunk?: (error: Error | null, chunk: string) => void,\n\t): Promise<NativePtyRunResult>;\n\twrite(data: string): void;\n\tresize(cols: number, rows: number): void;\n\tkill(): void;\n}\n\ninterface NativePtyBinding {\n\tPtySession: new () => NativePtySession;\n}\n\ntype NativeLoadResult =\n\t| { ok: true; binding: NativePtyBinding }\n\t| { ok: false; error: Error };\n\nlet cachedLoadResult: NativeLoadResult | undefined;\n\nexport function resetNativePtyBindingCache(): void {\n\tcachedLoadResult = undefined;\n}\n\nfunction loadNativePtyBinding(): NativeLoadResult {\n\tif (cachedLoadResult) return cachedLoadResult;\n\ttry {\n\t\tconst loaded = createModuleRequire(import.meta.url)(NATIVE_PACKAGE) as Partial<NativePtyBinding>;\n\t\tif (typeof loaded.PtySession !== \"function\") {\n\t\t\tcachedLoadResult = { ok: false, error: new Error(`Native package ${NATIVE_PACKAGE} is missing PtySession.`) };\n\t\t\treturn cachedLoadResult;\n\t\t}\n\t\tcachedLoadResult = { ok: true, binding: loaded as NativePtyBinding };\n\t\treturn cachedLoadResult;\n\t} catch (error) {\n\t\tcachedLoadResult = {\n\t\t\tok: false,\n\t\t\terror: new Error(`Native PTY package ${NATIVE_PACKAGE} is unavailable for ${process.platform}-${process.arch}: ${error instanceof Error ? error.message : String(error)}`),\n\t\t};\n\t\treturn cachedLoadResult;\n\t}\n}\n\nexport interface NativePtyExecOptions {\n\tonData: (data: Buffer) => void;\n\tsignal?: AbortSignal;\n\ttimeout?: number;\n\tenv?: NodeJS.ProcessEnv;\n\tshellPath?: string;\n\tcols?: number;\n\trows?: number;\n}\n\nexport async function executeNativePty(command: string, cwd: string, options: NativePtyExecOptions): Promise<{ exitCode: number | null }> {\n\tconst loaded = loadNativePtyBinding();\n\tif (!loaded.ok) throw loaded.error;\n\tif (options.signal?.aborted) throw new Error(\"aborted\");\n\tconst shellConfig = getShellConfig(options.shellPath);\n\tconst session = new loaded.binding.PtySession();\n\tconst onAbort = () => {\n\t\ttry { session.kill(); } catch {}\n\t};\n\tif (options.signal) options.signal.addEventListener(\"abort\", onAbort, { once: true });\n\ttry {\n\t\tconst result = await session.start({\n\t\t\tcommand,\n\t\t\tcwd,\n\t\t\tenv: { ...getShellEnv(), ...(options.env ?? {}), TERM: \"xterm-256color\" },\n\t\t\ttimeoutMs: options.timeout !== undefined ? Math.max(1, Math.floor(options.timeout * 1000)) : undefined,\n\t\t\tcols: options.cols ?? 120,\n\t\t\trows: options.rows ?? 40,\n\t\t\tshell: shellConfig.shell,\n\t\t\tshellArgs: shellConfig.args,\n\t\t\tcommandTransport: shellConfig.commandTransport,\n\t\t\tcloseStdinAfterCommand: shellConfig.commandTransport === \"stdin\",\n\t\t}, (_error, chunk) => {\n\t\t\tif (chunk) options.onData(Buffer.from(chunk));\n\t\t});\n\t\tif (options.signal?.aborted || result.cancelled) throw new Error(\"aborted\");\n\t\tif (result.timedOut ?? result.timed_out) throw new Error(`timeout:${options.timeout}`);\n\t\treturn { exitCode: result.exitCode ?? result.exit_code ?? null };\n\t} finally {\n\t\tif (options.signal) options.signal.removeEventListener(\"abort\", onAbort);\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { createRequire } from "node:module";
1
+ import { createModuleRequire } from "../../utils/module-require.js";
2
2
  import { getShellConfig, getShellEnv } from "../../utils/shell.js";
3
3
  const NATIVE_PACKAGE = "@bastani/atomic-natives";
4
4
  let cachedLoadResult;
@@ -9,7 +9,7 @@ function loadNativePtyBinding() {
9
9
  if (cachedLoadResult)
10
10
  return cachedLoadResult;
11
11
  try {
12
- const loaded = createRequire(import.meta.url)(NATIVE_PACKAGE);
12
+ const loaded = createModuleRequire(import.meta.url)(NATIVE_PACKAGE);
13
13
  if (typeof loaded.PtySession !== "function") {
14
14
  cachedLoadResult = { ok: false, error: new Error(`Native package ${NATIVE_PACKAGE} is missing PtySession.`) };
15
15
  return cachedLoadResult;
@@ -1 +1 @@
1
- {"version":3,"file":"bash-pty-native.js","sourceRoot":"","sources":["../../../src/core/tools/bash-pty-native.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from \"node:module\";\nimport { getShellConfig, getShellEnv } from \"../../utils/shell.ts\";\n\nconst NATIVE_PACKAGE = \"@bastani/atomic-natives\";\n\ninterface NativePtyRunResult {\n\texitCode?: number;\n\texit_code?: number;\n\tcancelled?: boolean;\n\ttimedOut?: boolean;\n\ttimed_out?: boolean;\n}\n\ninterface NativePtySession {\n\tstart(\n\t\toptions: {\n\t\t\tcommand: string;\n\t\t\tcwd?: string;\n\t\t\tenv?: Record<string, string>;\n\t\t\ttimeoutMs?: number;\n\t\t\tcols?: number;\n\t\t\trows?: number;\n\t\t\tshell?: string;\n\t\t\tshellArgs?: string[];\n\t\t\tcommandTransport?: \"argv\" | \"stdin\";\n\t\t\tcloseStdinAfterCommand?: boolean;\n\t\t},\n\t\tonChunk?: (error: Error | null, chunk: string) => void,\n\t): Promise<NativePtyRunResult>;\n\twrite(data: string): void;\n\tresize(cols: number, rows: number): void;\n\tkill(): void;\n}\n\ninterface NativePtyBinding {\n\tPtySession: new () => NativePtySession;\n}\n\ntype NativeLoadResult =\n\t| { ok: true; binding: NativePtyBinding }\n\t| { ok: false; error: Error };\n\nlet cachedLoadResult: NativeLoadResult | undefined;\n\nexport function resetNativePtyBindingCache(): void {\n\tcachedLoadResult = undefined;\n}\n\nfunction loadNativePtyBinding(): NativeLoadResult {\n\tif (cachedLoadResult) return cachedLoadResult;\n\ttry {\n\t\tconst loaded = createRequire(import.meta.url)(NATIVE_PACKAGE) as Partial<NativePtyBinding>;\n\t\tif (typeof loaded.PtySession !== \"function\") {\n\t\t\tcachedLoadResult = { ok: false, error: new Error(`Native package ${NATIVE_PACKAGE} is missing PtySession.`) };\n\t\t\treturn cachedLoadResult;\n\t\t}\n\t\tcachedLoadResult = { ok: true, binding: loaded as NativePtyBinding };\n\t\treturn cachedLoadResult;\n\t} catch (error) {\n\t\tcachedLoadResult = {\n\t\t\tok: false,\n\t\t\terror: new Error(`Native PTY package ${NATIVE_PACKAGE} is unavailable for ${process.platform}-${process.arch}: ${error instanceof Error ? error.message : String(error)}`),\n\t\t};\n\t\treturn cachedLoadResult;\n\t}\n}\n\nexport interface NativePtyExecOptions {\n\tonData: (data: Buffer) => void;\n\tsignal?: AbortSignal;\n\ttimeout?: number;\n\tenv?: NodeJS.ProcessEnv;\n\tshellPath?: string;\n\tcols?: number;\n\trows?: number;\n}\n\nexport async function executeNativePty(command: string, cwd: string, options: NativePtyExecOptions): Promise<{ exitCode: number | null }> {\n\tconst loaded = loadNativePtyBinding();\n\tif (!loaded.ok) throw loaded.error;\n\tif (options.signal?.aborted) throw new Error(\"aborted\");\n\tconst shellConfig = getShellConfig(options.shellPath);\n\tconst session = new loaded.binding.PtySession();\n\tconst onAbort = () => {\n\t\ttry { session.kill(); } catch {}\n\t};\n\tif (options.signal) options.signal.addEventListener(\"abort\", onAbort, { once: true });\n\ttry {\n\t\tconst result = await session.start({\n\t\t\tcommand,\n\t\t\tcwd,\n\t\t\tenv: { ...getShellEnv(), ...(options.env ?? {}), TERM: \"xterm-256color\" },\n\t\t\ttimeoutMs: options.timeout !== undefined ? Math.max(1, Math.floor(options.timeout * 1000)) : undefined,\n\t\t\tcols: options.cols ?? 120,\n\t\t\trows: options.rows ?? 40,\n\t\t\tshell: shellConfig.shell,\n\t\t\tshellArgs: shellConfig.args,\n\t\t\tcommandTransport: shellConfig.commandTransport,\n\t\t\tcloseStdinAfterCommand: shellConfig.commandTransport === \"stdin\",\n\t\t}, (_error, chunk) => {\n\t\t\tif (chunk) options.onData(Buffer.from(chunk));\n\t\t});\n\t\tif (options.signal?.aborted || result.cancelled) throw new Error(\"aborted\");\n\t\tif (result.timedOut ?? result.timed_out) throw new Error(`timeout:${options.timeout}`);\n\t\treturn { exitCode: result.exitCode ?? result.exit_code ?? null };\n\t} finally {\n\t\tif (options.signal) options.signal.removeEventListener(\"abort\", onAbort);\n\t}\n}\n"]}
1
+ {"version":3,"file":"bash-pty-native.js","sourceRoot":"","sources":["../../../src/core/tools/bash-pty-native.ts"],"names":[],"mappings":"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","sourcesContent":["import { createModuleRequire } from \"../../utils/module-require.ts\";\nimport { getShellConfig, getShellEnv } from \"../../utils/shell.ts\";\n\nconst NATIVE_PACKAGE = \"@bastani/atomic-natives\";\n\ninterface NativePtyRunResult {\n\texitCode?: number;\n\texit_code?: number;\n\tcancelled?: boolean;\n\ttimedOut?: boolean;\n\ttimed_out?: boolean;\n}\n\ninterface NativePtySession {\n\tstart(\n\t\toptions: {\n\t\t\tcommand: string;\n\t\t\tcwd?: string;\n\t\t\tenv?: Record<string, string>;\n\t\t\ttimeoutMs?: number;\n\t\t\tcols?: number;\n\t\t\trows?: number;\n\t\t\tshell?: string;\n\t\t\tshellArgs?: string[];\n\t\t\tcommandTransport?: \"argv\" | \"stdin\";\n\t\t\tcloseStdinAfterCommand?: boolean;\n\t\t},\n\t\tonChunk?: (error: Error | null, chunk: string) => void,\n\t): Promise<NativePtyRunResult>;\n\twrite(data: string): void;\n\tresize(cols: number, rows: number): void;\n\tkill(): void;\n}\n\ninterface NativePtyBinding {\n\tPtySession: new () => NativePtySession;\n}\n\ntype NativeLoadResult =\n\t| { ok: true; binding: NativePtyBinding }\n\t| { ok: false; error: Error };\n\nlet cachedLoadResult: NativeLoadResult | undefined;\n\nexport function resetNativePtyBindingCache(): void {\n\tcachedLoadResult = undefined;\n}\n\nfunction loadNativePtyBinding(): NativeLoadResult {\n\tif (cachedLoadResult) return cachedLoadResult;\n\ttry {\n\t\tconst loaded = createModuleRequire(import.meta.url)(NATIVE_PACKAGE) as Partial<NativePtyBinding>;\n\t\tif (typeof loaded.PtySession !== \"function\") {\n\t\t\tcachedLoadResult = { ok: false, error: new Error(`Native package ${NATIVE_PACKAGE} is missing PtySession.`) };\n\t\t\treturn cachedLoadResult;\n\t\t}\n\t\tcachedLoadResult = { ok: true, binding: loaded as NativePtyBinding };\n\t\treturn cachedLoadResult;\n\t} catch (error) {\n\t\tcachedLoadResult = {\n\t\t\tok: false,\n\t\t\terror: new Error(`Native PTY package ${NATIVE_PACKAGE} is unavailable for ${process.platform}-${process.arch}: ${error instanceof Error ? error.message : String(error)}`),\n\t\t};\n\t\treturn cachedLoadResult;\n\t}\n}\n\nexport interface NativePtyExecOptions {\n\tonData: (data: Buffer) => void;\n\tsignal?: AbortSignal;\n\ttimeout?: number;\n\tenv?: NodeJS.ProcessEnv;\n\tshellPath?: string;\n\tcols?: number;\n\trows?: number;\n}\n\nexport async function executeNativePty(command: string, cwd: string, options: NativePtyExecOptions): Promise<{ exitCode: number | null }> {\n\tconst loaded = loadNativePtyBinding();\n\tif (!loaded.ok) throw loaded.error;\n\tif (options.signal?.aborted) throw new Error(\"aborted\");\n\tconst shellConfig = getShellConfig(options.shellPath);\n\tconst session = new loaded.binding.PtySession();\n\tconst onAbort = () => {\n\t\ttry { session.kill(); } catch {}\n\t};\n\tif (options.signal) options.signal.addEventListener(\"abort\", onAbort, { once: true });\n\ttry {\n\t\tconst result = await session.start({\n\t\t\tcommand,\n\t\t\tcwd,\n\t\t\tenv: { ...getShellEnv(), ...(options.env ?? {}), TERM: \"xterm-256color\" },\n\t\t\ttimeoutMs: options.timeout !== undefined ? Math.max(1, Math.floor(options.timeout * 1000)) : undefined,\n\t\t\tcols: options.cols ?? 120,\n\t\t\trows: options.rows ?? 40,\n\t\t\tshell: shellConfig.shell,\n\t\t\tshellArgs: shellConfig.args,\n\t\t\tcommandTransport: shellConfig.commandTransport,\n\t\t\tcloseStdinAfterCommand: shellConfig.commandTransport === \"stdin\",\n\t\t}, (_error, chunk) => {\n\t\t\tif (chunk) options.onData(Buffer.from(chunk));\n\t\t});\n\t\tif (options.signal?.aborted || result.cancelled) throw new Error(\"aborted\");\n\t\tif (result.timedOut ?? result.timed_out) throw new Error(`timeout:${options.timeout}`);\n\t\treturn { exitCode: result.exitCode ?? result.exit_code ?? null };\n\t} finally {\n\t\tif (options.signal) options.signal.removeEventListener(\"abort\", onAbort);\n\t}\n}\n"]}