@asm-agent/coding-agent 0.8.8 → 0.9.1

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 (182) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +2 -7
  3. package/dist/asm-agent-runtime/src/__pycache__/asm_cm_driver.cpython-313.pyc +0 -0
  4. package/dist/asm-agent-runtime/src/__pycache__/phase76_address_head.cpython-313.pyc +0 -0
  5. package/dist/asm-agent-runtime/src/rlm/__init__.py +1 -1
  6. package/dist/asm-agent-runtime/src/rlm/__pycache__/__init__.cpython-312.pyc +0 -0
  7. package/dist/asm-agent-runtime/src/rlm/__pycache__/__init__.cpython-313.pyc +0 -0
  8. package/dist/asm-agent-runtime/src/rlm/__pycache__/bash.cpython-312.pyc +0 -0
  9. package/dist/asm-agent-runtime/src/rlm/__pycache__/bash.cpython-313.pyc +0 -0
  10. package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp.cpython-312.pyc +0 -0
  11. package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp_base.cpython-312.pyc +0 -0
  12. package/dist/asm-agent-runtime/src/rlm/__pycache__/repl.cpython-312.pyc +0 -0
  13. package/dist/asm-agent-runtime/src/rlm/__pycache__/repl.cpython-313.pyc +0 -0
  14. package/dist/asm-agent-runtime/src/rlm/__pycache__/skill.cpython-313.pyc +0 -0
  15. package/dist/asm-agent-runtime/src/rlm/bash.py +94 -31
  16. package/dist/asm-agent-runtime/src/rlm/repl.md +3 -3
  17. package/dist/asm-agent-runtime/src/rlm/repl.py +46 -45
  18. package/dist/asm-agent-runtime/test/__pycache__/test_bash.cpython-313.pyc +0 -0
  19. package/dist/asm-agent-runtime/test/__pycache__/test_repl.cpython-313.pyc +0 -0
  20. package/dist/asm-agent-runtime/test/test_bash.py +74 -19
  21. package/dist/asm-agent-runtime/test/test_repl.py +67 -3
  22. package/dist/asm-agent-runtime/uv.lock +446 -155
  23. package/dist/bundle/{anthropic-OFECORE7.js → anthropic-2VRH36LG.js} +2 -2
  24. package/dist/bundle/{azure-openai-responses-AOVTLR6N.js → azure-openai-responses-COYWHJPT.js} +2 -2
  25. package/dist/bundle/{bundled-modules-JQCJDEIY.js → bundled-modules-YKMFOFDW.js} +3 -3
  26. package/dist/bundle/{chunk-JC2TT4MZ.js → chunk-JBR32RCG.js} +4943 -1917
  27. package/dist/bundle/{chunk-M67RGWDQ.js → chunk-US4QGESM.js} +43 -44
  28. package/dist/bundle/{chunk-A65OM3TZ.js → chunk-V3BASDCN.js} +1 -1
  29. package/dist/bundle/{chunk-7TB7CGPV.js → chunk-YL37EJB6.js} +978 -1821
  30. package/dist/bundle/{cli-main-FNHDQGQD.js → cli-main-D7CFAHKG.js} +3 -3
  31. package/dist/bundle/cli.js +1 -1
  32. package/dist/bundle/{google-RVJL6RIQ.js → google-CSTXROSV.js} +1 -1
  33. package/dist/bundle/{google-vertex-EZTRRRH6.js → google-vertex-MEAR43KB.js} +1 -1
  34. package/dist/bundle/{main-IYXIIAJN.js → main-NKNJEUDP.js} +3 -3
  35. package/dist/bundle/{mistral-FSGKSMA7.js → mistral-VAF7JADB.js} +1 -1
  36. package/dist/bundle/{openai-codex-responses-VM5Y564D.js → openai-codex-responses-RWZ6P4I3.js} +2 -2
  37. package/dist/bundle/{openai-completions-X46FOQDN.js → openai-completions-CFB3BOTU.js} +3 -3
  38. package/dist/bundle/{openai-responses-SOQNEPBE.js → openai-responses-4OPGGCBI.js} +2 -2
  39. package/dist/config.d.ts +0 -1
  40. package/dist/config.d.ts.map +1 -1
  41. package/dist/config.js +0 -3
  42. package/dist/config.js.map +1 -1
  43. package/dist/core/agent-session-config.d.ts +1 -2
  44. package/dist/core/agent-session-config.d.ts.map +1 -1
  45. package/dist/core/agent-session-config.js +0 -3
  46. package/dist/core/agent-session-config.js.map +1 -1
  47. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  48. package/dist/core/agent-session-runtime.js +0 -8
  49. package/dist/core/agent-session-runtime.js.map +1 -1
  50. package/dist/core/agent-session-services.d.ts +0 -2
  51. package/dist/core/agent-session-services.d.ts.map +1 -1
  52. package/dist/core/agent-session-services.js +0 -22
  53. package/dist/core/agent-session-services.js.map +1 -1
  54. package/dist/core/agent-session.d.ts +8 -1
  55. package/dist/core/agent-session.d.ts.map +1 -1
  56. package/dist/core/agent-session.js +100 -22
  57. package/dist/core/agent-session.js.map +1 -1
  58. package/dist/core/kernel/bootstrap.d.ts.map +1 -1
  59. package/dist/core/kernel/bootstrap.js +1 -1
  60. package/dist/core/kernel/bootstrap.js.map +1 -1
  61. package/dist/core/kernel/repl-manager.d.ts +32 -8
  62. package/dist/core/kernel/repl-manager.d.ts.map +1 -1
  63. package/dist/core/kernel/repl-manager.js +401 -102
  64. package/dist/core/kernel/repl-manager.js.map +1 -1
  65. package/dist/core/kernel/shared.d.ts +11 -7
  66. package/dist/core/kernel/shared.d.ts.map +1 -1
  67. package/dist/core/kernel/shared.js +2 -5
  68. package/dist/core/kernel/shared.js.map +1 -1
  69. package/dist/core/mcp/mcp-manager.d.ts +4 -2
  70. package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
  71. package/dist/core/mcp/mcp-manager.js +9 -7
  72. package/dist/core/mcp/mcp-manager.js.map +1 -1
  73. package/dist/core/model-registry.d.ts.map +1 -1
  74. package/dist/core/model-registry.js +1 -1
  75. package/dist/core/model-registry.js.map +1 -1
  76. package/dist/core/prime-inference-auth.d.ts +0 -9
  77. package/dist/core/prime-inference-auth.d.ts.map +1 -1
  78. package/dist/core/prime-inference-auth.js +0 -50
  79. package/dist/core/prime-inference-auth.js.map +1 -1
  80. package/dist/core/provider-display-names.d.ts.map +1 -1
  81. package/dist/core/provider-display-names.js +0 -1
  82. package/dist/core/provider-display-names.js.map +1 -1
  83. package/dist/core/session-manager.d.ts +0 -4
  84. package/dist/core/session-manager.d.ts.map +1 -1
  85. package/dist/core/session-manager.js +0 -22
  86. package/dist/core/session-manager.js.map +1 -1
  87. package/dist/core/settings-manager.d.ts +4 -16
  88. package/dist/core/settings-manager.d.ts.map +1 -1
  89. package/dist/core/settings-manager.js +13 -43
  90. package/dist/core/settings-manager.js.map +1 -1
  91. package/dist/core/slash-commands.d.ts.map +1 -1
  92. package/dist/core/slash-commands.js +0 -5
  93. package/dist/core/slash-commands.js.map +1 -1
  94. package/dist/core/tools/acp-mcp.d.ts +6 -0
  95. package/dist/core/tools/acp-mcp.d.ts.map +1 -0
  96. package/dist/core/tools/acp-mcp.js +86 -0
  97. package/dist/core/tools/acp-mcp.js.map +1 -0
  98. package/dist/core/tools/index.d.ts +1 -0
  99. package/dist/core/tools/index.d.ts.map +1 -1
  100. package/dist/core/tools/index.js +1 -0
  101. package/dist/core/tools/index.js.map +1 -1
  102. package/dist/core/tools/ipython.d.ts.map +1 -1
  103. package/dist/core/tools/ipython.js +9 -4
  104. package/dist/core/tools/ipython.js.map +1 -1
  105. package/dist/main.d.ts.map +1 -1
  106. package/dist/main.js +2 -11
  107. package/dist/main.js.map +1 -1
  108. package/dist/modes/acp/acp-mode.d.ts.map +1 -1
  109. package/dist/modes/acp/acp-mode.js +1 -1
  110. package/dist/modes/acp/acp-mode.js.map +1 -1
  111. package/dist/modes/agent-connection/daemon-agent-connection.d.ts +0 -2
  112. package/dist/modes/agent-connection/daemon-agent-connection.d.ts.map +1 -1
  113. package/dist/modes/agent-connection/daemon-agent-connection.js +0 -2
  114. package/dist/modes/agent-connection/daemon-agent-connection.js.map +1 -1
  115. package/dist/modes/agents-view/agents-view-mode.d.ts.map +1 -1
  116. package/dist/modes/agents-view/agents-view-mode.js +0 -19
  117. package/dist/modes/agents-view/agents-view-mode.js.map +1 -1
  118. package/dist/modes/daemon/daemon-mode.d.ts +1 -10
  119. package/dist/modes/daemon/daemon-mode.d.ts.map +1 -1
  120. package/dist/modes/daemon/daemon-mode.js +134 -274
  121. package/dist/modes/daemon/daemon-mode.js.map +1 -1
  122. package/dist/modes/daemon/daemon-protocol.d.ts +11 -5
  123. package/dist/modes/daemon/daemon-protocol.d.ts.map +1 -1
  124. package/dist/modes/daemon/daemon-protocol.js +6 -8
  125. package/dist/modes/daemon/daemon-protocol.js.map +1 -1
  126. package/dist/modes/daemon/daemon-supervisor.d.ts +0 -3
  127. package/dist/modes/daemon/daemon-supervisor.d.ts.map +1 -1
  128. package/dist/modes/daemon/daemon-supervisor.js +18 -52
  129. package/dist/modes/daemon/daemon-supervisor.js.map +1 -1
  130. package/dist/modes/daemon/daemon-worker-protocol.d.ts +1 -6
  131. package/dist/modes/daemon/daemon-worker-protocol.d.ts.map +1 -1
  132. package/dist/modes/daemon/daemon-worker-protocol.js +0 -2
  133. package/dist/modes/daemon/daemon-worker-protocol.js.map +1 -1
  134. package/dist/modes/interactive/auth-flows.d.ts +0 -2
  135. package/dist/modes/interactive/auth-flows.d.ts.map +1 -1
  136. package/dist/modes/interactive/auth-flows.js +1 -101
  137. package/dist/modes/interactive/auth-flows.js.map +1 -1
  138. package/dist/modes/interactive/components/assistant-message.d.ts +6 -1
  139. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  140. package/dist/modes/interactive/components/assistant-message.js +13 -3
  141. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  142. package/dist/modes/interactive/components/footer.d.ts +1 -1
  143. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  144. package/dist/modes/interactive/components/footer.js +2 -2
  145. package/dist/modes/interactive/components/footer.js.map +1 -1
  146. package/dist/modes/interactive/components/mermaid.d.ts +12 -0
  147. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  148. package/dist/modes/interactive/components/mermaid.js +63 -0
  149. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  150. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  151. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  152. package/dist/modes/interactive/components/settings-selector.js +10 -0
  153. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  154. package/dist/modes/interactive/feature-hints.d.ts.map +1 -1
  155. package/dist/modes/interactive/feature-hints.js +0 -4
  156. package/dist/modes/interactive/feature-hints.js.map +1 -1
  157. package/dist/modes/interactive/interactive-mode.d.ts +1 -7
  158. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  159. package/dist/modes/interactive/interactive-mode.js +23 -279
  160. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  161. package/dist/utils/version-check.d.ts.map +1 -1
  162. package/dist/utils/version-check.js +1 -1
  163. package/dist/utils/version-check.js.map +1 -1
  164. package/docs/settings.md +1 -31
  165. package/docs/usage.md +1 -4
  166. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  167. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  168. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  169. package/examples/extensions/sandbox/package-lock.json +2 -2
  170. package/examples/extensions/sandbox/package.json +1 -1
  171. package/examples/extensions/with-deps/package-lock.json +2 -2
  172. package/examples/extensions/with-deps/package.json +1 -1
  173. package/examples/gpt-6-astra.models.json +24 -0
  174. package/package.json +6 -5
  175. package/dist/core/agent-traces.d.ts +0 -130
  176. package/dist/core/agent-traces.d.ts.map +0 -1
  177. package/dist/core/agent-traces.js +0 -746
  178. package/dist/core/agent-traces.js.map +0 -1
  179. package/dist/core/telemetry.d.ts +0 -92
  180. package/dist/core/telemetry.d.ts.map +0 -1
  181. package/dist/core/telemetry.js +0 -633
  182. package/dist/core/telemetry.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/core/kernel/bootstrap.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAsB3D,eAAO,MAAM,yBAAyB,UAAqD,CAAC;AAC5F,eAAO,MAAM,8BAA8B,UAA0D,CAAC;AACtG,eAAO,MAAM,+BAA+B,UAA2D,CAAC;AAyBxG,MAAM,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AACvD,MAAM,MAAM,8BAA8B,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAEvE,MAAM,WAAW,yBAAyB;IACzC,YAAY,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC5C,UAAU,CAAC,EAAE,8BAA8B,CAAC;CAC5C;AA8QD,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAgVD,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAI9D;AAiOD,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,MAAM,CAAC,CAU3F","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { constants, existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { access, mkdir, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { stderr, stdin } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { getPackageDir } from \"../../config.js\";\nimport type { PythonSkillRuntimeInfo } from \"../skills.js\";\n\nconst BOOTSTRAP_SCHEMA = 9;\nconst PYTHON_VERSION = \"3.12\";\nconst RUNTIME_REQUIREMENT = \"asm-agent-runtime\";\n// Serializes the kernel's user namespace so it can be revived across session\n// resume. Internal-only; intentionally not surfaced to the model as an import.\nconst STATE_SNAPSHOT_REQUIREMENT = \"dill\";\nconst DEFAULT_RLM_EXTRA_PACKAGES = [\n\t{ uvArg: \"requests\", importName: \"requests\", promptLabel: \"requests\" },\n\t{ uvArg: \"httpx\", importName: \"httpx\", promptLabel: \"httpx\" },\n\t{ uvArg: \"pyyaml\", importName: \"yaml\", promptLabel: \"yaml (PyYAML)\" },\n\t{ uvArg: \"tomli\", importName: \"tomli\", promptLabel: \"tomli\" },\n\t{ uvArg: \"python-dotenv\", importName: \"dotenv\", promptLabel: \"dotenv (python-dotenv)\" },\n\t{ uvArg: \"pandas\", importName: \"pandas\", promptLabel: \"pandas\" },\n\t{ uvArg: \"numpy\", importName: \"numpy\", promptLabel: \"numpy\" },\n\t{ uvArg: \"scipy\", importName: \"scipy\", promptLabel: \"scipy\" },\n\t{ uvArg: \"beautifulsoup4\", importName: \"bs4\", promptLabel: \"bs4 (Beautiful Soup)\" },\n\t{ uvArg: \"lxml\", importName: \"lxml\", promptLabel: \"lxml\" },\n\t{ uvArg: \"pydantic\", importName: \"pydantic\", promptLabel: \"pydantic\" },\n\t{ uvArg: \"tyro\", importName: \"tyro\", promptLabel: \"tyro\" },\n];\nexport const DEFAULT_RLM_EXTRA_UV_ARGS = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.uvArg);\nexport const DEFAULT_RLM_EXTRA_IMPORT_NAMES = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.importName);\nexport const DEFAULT_RLM_EXTRA_IMPORT_LABELS = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.promptLabel);\nconst UV_INSTALL_COMMAND = \"curl -LsSf https://astral.sh/uv/install.sh | sh\";\nconst REQUIRED_HARNESS_METHODS = [\n\t\"create_memory\",\n\t\"update_memory\",\n\t\"delete_memory\",\n\t\"create_skill\",\n\t\"update_skill\",\n\t\"delete_skill\",\n\t\"create_subagent\",\n\t\"update_subagent\",\n\t\"delete_subagent\",\n\t\"create_prompt_note\",\n\t\"update_prompt_note\",\n\t\"delete_prompt_note\",\n\t\"record_refinement\",\n];\nconst RUNTIME_READY_CHECK = `import inspect; import rlm; from rlm import McpIntegration; import rlm.mcp as mcp; from rlm.harness import HarnessEntry; _harness_methods = ${JSON.stringify(REQUIRED_HARNESS_METHODS)}; assert callable(mcp.list_tools); assert callable(mcp.call_tool); assert hasattr(rlm, 'run'); assert callable(rlm); assert hasattr(rlm, 'rlm'); assert callable(rlm.rlm); assert callable(rlm.host_request); assert callable(rlm.find_models); assert callable(rlm.rlm.find_models); assert hasattr(rlm, 'harness'); assert hasattr(rlm, 'get_harness_state'); assert hasattr(rlm.rlm, 'harness'); assert hasattr(rlm.rlm, 'get_harness_state'); assert all(callable(getattr(_harness, _method, None)) for _harness in (rlm.harness, rlm.rlm.harness) for _method in _harness_methods); assert 'reference' in HarnessEntry.__dataclass_fields__; assert 'scope' in HarnessEntry.__dataclass_fields__; assert 'reference' in inspect.signature(rlm.harness.create_skill).parameters; assert 'reference' in inspect.signature(rlm.harness.update_skill).parameters; assert 'global_' in inspect.signature(rlm.harness.create_memory).parameters; assert 'global_' in inspect.signature(rlm.get_harness_state).parameters; assert not hasattr(rlm, 'background'); assert not hasattr(rlm.rlm, 'background'); from rlm.bash import BashHandle, BashResult; assert callable(rlm.bash); assert all(callable(getattr(BashHandle, _m, None)) for _m in ('tail', 'output', 'poll', 'kill')); assert {'exit_code', 'output', 'duration'} <= set(BashResult.__dataclass_fields__); import rlm.repl as _repl; assert callable(_repl.main); assert callable(_repl.emit); assert callable(_repl.host_request); assert callable(_repl.is_active); assert _repl.PROTOCOL_VERSION == 2; assert callable(rlm.emit); assert not hasattr(rlm, 'HOST_COMM_TARGET'); assert not hasattr(mcp, 'install_shutdown_hook')`;\nconst BOOTSTRAP_VERSION_FILE = \".bootstrap-version\";\nconst BOOTSTRAP_LOCK_NAME = \".bootstrap.lock\";\nconst BOOTSTRAP_LOCK_RETRY_MS = 100;\nconst BOOTSTRAP_LOCK_STALE_WITHOUT_PID_MS = 30_000;\n\nlet inFlightEnsureKernelPython: { key: string; promise: Promise<string> } | null = null;\n\nexport type KernelPythonSkill = PythonSkillRuntimeInfo;\nexport type KernelBootstrapProgressHandler = (message: string) => void;\n\nexport interface EnsureKernelPythonOptions {\n\tpythonSkills?: readonly KernelPythonSkill[];\n\tonProgress?: KernelBootstrapProgressHandler;\n}\n\ninterface BootstrapPythonSkill {\n\timportName: string;\n\tpackagePath: string;\n\tpyprojectPath: string;\n\tpyprojectHash: string;\n}\n\ninterface BootstrapVersion {\n\tschema: number;\n\truntime?: string;\n\tsnapshot?: string;\n\textraUvArgs?: string[];\n\tpythonSkills?: BootstrapPythonSkill[];\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n\treturn error instanceof Error && \"code\" in error && error.code === code;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n\ttry {\n\t\tawait access(filePath);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function isExecutable(filePath: string): Promise<boolean> {\n\ttry {\n\t\tawait access(filePath, constants.X_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction expandHome(filePath: string): string {\n\tif (filePath === \"~\") return os.homedir();\n\tif (filePath.startsWith(\"~/\")) return path.join(os.homedir(), filePath.slice(2));\n\treturn filePath;\n}\n\nfunction fileContentHash(filePath: string): string {\n\ttry {\n\t\treturn `sha256:${createHash(\"sha256\").update(readFileSync(filePath)).digest(\"hex\")}`;\n\t} catch {\n\t\treturn \"unreadable\";\n\t}\n}\n\nfunction normalizePythonSkills(pythonSkills: readonly KernelPythonSkill[] | undefined): BootstrapPythonSkill[] {\n\tconst byKey = new Map<string, BootstrapPythonSkill>();\n\tconst addSkill = (skill: Pick<KernelPythonSkill, \"importName\" | \"packagePath\" | \"pyprojectPath\">): void => {\n\t\tconst packagePath = path.resolve(skill.packagePath);\n\t\tconst pyprojectPath = path.resolve(skill.pyprojectPath);\n\t\tconst key = `${skill.importName}\\0${packagePath}`;\n\t\tif (byKey.has(key)) {\n\t\t\treturn;\n\t\t}\n\t\tconst bootstrapSkill: BootstrapPythonSkill = {\n\t\t\timportName: skill.importName,\n\t\t\tpackagePath,\n\t\t\tpyprojectPath,\n\t\t\tpyprojectHash: fileContentHash(pyprojectPath),\n\t\t};\n\t\tbyKey.set(key, bootstrapSkill);\n\t\tfor (const dependencyName of readPythonSkillDependencyNames(bootstrapSkill)) {\n\t\t\tconst siblingDependency = resolveSiblingPythonSkillDependency(bootstrapSkill, dependencyName);\n\t\t\tif (siblingDependency) {\n\t\t\t\taddSkill(siblingDependency);\n\t\t\t}\n\t\t}\n\t};\n\tfor (const skill of pythonSkills ?? []) {\n\t\taddSkill(skill);\n\t}\n\treturn [...byKey.values()].sort((a, b) => {\n\t\tconst packageCompare = a.packagePath.localeCompare(b.packagePath);\n\t\tif (packageCompare !== 0) return packageCompare;\n\t\treturn a.importName.localeCompare(b.importName);\n\t});\n}\n\nfunction readTomlProjectSection(pyprojectPath: string): string | undefined {\n\ttry {\n\t\tconst text = readFileSync(pyprojectPath, \"utf-8\");\n\t\tconst match = text.match(/^\\s*\\[project\\]\\s*$/m);\n\t\tif (!match || match.index === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst sectionStart = match.index + match[0].length;\n\t\tconst rest = text.slice(sectionStart);\n\t\tconst nextSection = rest.search(/^\\s*\\[/m);\n\t\treturn nextSection >= 0 ? rest.slice(0, nextSection) : rest;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction readPythonSkillProjectName(skill: BootstrapPythonSkill): string {\n\tconst projectSection = readTomlProjectSection(skill.pyprojectPath);\n\tconst name = projectSection?.match(/^\\s*name\\s*=\\s*[\"']([^\"']+)[\"']/m)?.[1];\n\treturn name?.trim() || skill.importName.replaceAll(\"_\", \"-\");\n}\n\nfunction parseDependencyPackageName(dependency: string): string | undefined {\n\tconst withoutMarker = dependency.split(\";\")[0]?.trim() ?? \"\";\n\tif (!withoutMarker) {\n\t\treturn undefined;\n\t}\n\tconst match = withoutMarker.match(/^([A-Za-z0-9_.-]+)/);\n\treturn match?.[1]?.replaceAll(\"_\", \"-\").toLowerCase();\n}\n\nfunction findTomlArrayEnd(text: string, startIndex: number): number {\n\tlet inQuote: '\"' | \"'\" | undefined;\n\tlet escaped = false;\n\tfor (let index = startIndex; index < text.length; index++) {\n\t\tconst char = text[index];\n\t\tif (inQuote) {\n\t\t\tif (escaped) {\n\t\t\t\tescaped = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === \"\\\\\") {\n\t\t\t\tescaped = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === inQuote) {\n\t\t\t\tinQuote = undefined;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' || char === \"'\") {\n\t\t\tinQuote = char;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"]\") {\n\t\t\treturn index;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction readPythonSkillDependencyNames(skill: BootstrapPythonSkill): Set<string> {\n\tconst projectSection = readTomlProjectSection(skill.pyprojectPath);\n\tif (!projectSection) {\n\t\treturn new Set();\n\t}\n\tconst dependenciesStart = projectSection.search(/^\\s*dependencies\\s*=\\s*\\[/m);\n\tif (dependenciesStart < 0) {\n\t\treturn new Set();\n\t}\n\tconst arrayStart = projectSection.indexOf(\"[\", dependenciesStart);\n\tif (arrayStart < 0) {\n\t\treturn new Set();\n\t}\n\tconst arrayEnd = findTomlArrayEnd(projectSection, arrayStart + 1);\n\tif (arrayEnd < 0) {\n\t\treturn new Set();\n\t}\n\tconst dependenciesArray = projectSection.slice(arrayStart, arrayEnd + 1);\n\tconst dependencies = new Set<string>();\n\tconst dependencyPattern = /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'/g;\n\tfor (const match of dependenciesArray.matchAll(dependencyPattern)) {\n\t\tconst dependency = (match[1] ?? match[2] ?? \"\").replaceAll('\\\\\"', '\"').replaceAll(\"\\\\'\", \"'\");\n\t\tconst name = parseDependencyPackageName(dependency);\n\t\tif (name) {\n\t\t\tdependencies.add(name);\n\t\t}\n\t}\n\treturn dependencies;\n}\n\nfunction resolveSiblingPythonSkillDependency(\n\tskill: BootstrapPythonSkill,\n\tdependencyName: string,\n): BootstrapPythonSkill | undefined {\n\tconst siblingsDir = path.dirname(skill.packagePath);\n\tfor (const entry of readdirSync(siblingsDir, { withFileTypes: true })) {\n\t\tif (!entry.isDirectory()) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst packagePath = path.join(siblingsDir, entry.name);\n\t\tconst pyprojectPath = path.join(packagePath, \"pyproject.toml\");\n\t\tif (!existsSync(pyprojectPath)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst dependency: BootstrapPythonSkill = {\n\t\t\timportName: entry.name.replaceAll(\"-\", \"_\"),\n\t\t\tpackagePath,\n\t\t\tpyprojectPath,\n\t\t\tpyprojectHash: fileContentHash(pyprojectPath),\n\t\t};\n\t\tif (readPythonSkillProjectName(dependency).replaceAll(\"_\", \"-\").toLowerCase() === dependencyName) {\n\t\t\treturn dependency;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction sortPythonSkillsForInstall(pythonSkills: readonly BootstrapPythonSkill[]): BootstrapPythonSkill[] {\n\tconst byProjectName = new Map<string, BootstrapPythonSkill>();\n\tconst originalIndex = new Map<BootstrapPythonSkill, number>();\n\tfor (const [index, skill] of pythonSkills.entries()) {\n\t\toriginalIndex.set(skill, index);\n\t\tbyProjectName.set(readPythonSkillProjectName(skill).replaceAll(\"_\", \"-\").toLowerCase(), skill);\n\t}\n\n\tconst dependenciesBySkill = new Map<BootstrapPythonSkill, BootstrapPythonSkill[]>();\n\tfor (const skill of pythonSkills) {\n\t\tdependenciesBySkill.set(\n\t\t\tskill,\n\t\t\t[...readPythonSkillDependencyNames(skill)]\n\t\t\t\t.map(\n\t\t\t\t\t(dependencyName) =>\n\t\t\t\t\t\tbyProjectName.get(dependencyName) ?? resolveSiblingPythonSkillDependency(skill, dependencyName),\n\t\t\t\t)\n\t\t\t\t.filter((dependency): dependency is BootstrapPythonSkill => Boolean(dependency)),\n\t\t);\n\t}\n\n\tconst pending = new Set(pythonSkills);\n\tconst sorted: BootstrapPythonSkill[] = [];\n\twhile (pending.size > 0) {\n\t\tlet progressed = false;\n\t\tfor (const skill of [...pending].sort((a, b) => (originalIndex.get(a) ?? 0) - (originalIndex.get(b) ?? 0))) {\n\t\t\tconst dependencies = dependenciesBySkill.get(skill) ?? [];\n\t\t\tif (dependencies.some((dependency) => pending.has(dependency))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsorted.push(skill);\n\t\t\tpending.delete(skill);\n\t\t\tprogressed = true;\n\t\t}\n\t\tif (!progressed) {\n\t\t\t// Cyclic local skill dependencies cannot be topologically ordered; keep a\n\t\t\t// deterministic order and let uv surface the packaging error if needed.\n\t\t\tsorted.push(...[...pending].sort((a, b) => a.packagePath.localeCompare(b.packagePath)));\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn sorted;\n}\n\nfunction formatPythonSkillInstallArgs(skill: BootstrapPythonSkill): string[] {\n\treturn [\"--editable\", skill.packagePath];\n}\n\nfunction ensureKernelPythonKey(pythonSkills: readonly BootstrapPythonSkill[]): string {\n\treturn [\n\t\tprocess.env.ASM_AGENT_KERNEL_PYTHON ?? \"\",\n\t\tprocess.env.ASM_AGENT_KERNEL_VENV ?? \"\",\n\t\tprocess.env.HOME ?? \"\",\n\t\tprocess.env.XDG_DATA_HOME ?? \"\",\n\t\tJSON.stringify(pythonSkills),\n\t].join(\"\\0\");\n}\n\nexport function getKernelVenvDir(): string {\n\tconst override = process.env.ASM_AGENT_KERNEL_VENV;\n\tif (override) return path.resolve(expandHome(override));\n\treturn path.join(os.homedir(), \".asm-agent\", \"kernel-venv\");\n}\n\nfunction getXdgKernelVenvDir(): string {\n\tconst dataHome = process.env.XDG_DATA_HOME\n\t\t? path.resolve(expandHome(process.env.XDG_DATA_HOME))\n\t\t: path.join(os.homedir(), \".local\", \"share\");\n\treturn path.join(dataHome, \"asm-agent\", \"kernel-venv\");\n}\n\nasync function resolveWritableKernelVenvDir(): Promise<string> {\n\tconst primary = getKernelVenvDir();\n\ttry {\n\t\tawait mkdir(path.dirname(primary), { recursive: true });\n\t\treturn primary;\n\t} catch (primaryError) {\n\t\tif (process.env.ASM_AGENT_KERNEL_VENV) {\n\t\t\tthrow new Error(`couldn't create kernel venv parent directory for ${primary}: ${errorMessage(primaryError)}`);\n\t\t}\n\n\t\tconst fallback = getXdgKernelVenvDir();\n\t\ttry {\n\t\t\tawait mkdir(path.dirname(fallback), { recursive: true });\n\t\t\treturn fallback;\n\t\t} catch (fallbackError) {\n\t\t\tthrow new Error(\n\t\t\t\t`couldn't create kernel venv directory at ${primary} or ${fallback}; set ASM_AGENT_KERNEL_PYTHON to a python with a current asm-agent-runtime installed. ${errorMessage(fallbackError)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction run(command: string, args: string[], options: { stdio?: \"ignore\" | \"inherit\" } = {}): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tenv: process.env,\n\t\t\tstdio: options.stdio ?? \"ignore\",\n\t\t});\n\t\tchild.on(\"error\", reject);\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst reason = signal ? `signal ${signal}` : `exit code ${code}`;\n\t\t\treject(new Error(`${command} ${args.join(\" \")} failed with ${reason}`));\n\t\t});\n\t});\n}\n\nasync function pythonImports(python: string, moduleName: string): Promise<boolean> {\n\ttry {\n\t\tawait run(python, [\"-c\", `import ${moduleName}`], { stdio: \"ignore\" });\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function hasAsmAgentRuntime(python: string): Promise<boolean> {\n\ttry {\n\t\tawait run(python, [\"-c\", RUNTIME_READY_CHECK], { stdio: \"ignore\" });\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function missingRlmExtraImportLabels(python: string): Promise<string[]> {\n\tconst missing: string[] = [];\n\tfor (const pkg of DEFAULT_RLM_EXTRA_PACKAGES) {\n\t\tif (!(await pythonImports(python, pkg.importName))) {\n\t\t\tmissing.push(pkg.promptLabel);\n\t\t}\n\t}\n\treturn missing;\n}\n\nasync function missingPythonSkillImportLabels(\n\tpython: string,\n\tpythonSkills: readonly KernelPythonSkill[],\n): Promise<string[]> {\n\tconst missing: string[] = [];\n\tfor (const skill of pythonSkills) {\n\t\tif (!(await pythonImports(python, skill.importName))) {\n\t\t\tmissing.push(`${skill.name} (${skill.importName})`);\n\t\t}\n\t}\n\treturn missing;\n}\n\nfunction reportProgress(options: EnsureKernelPythonOptions, message: string): void {\n\tif (options.onProgress) {\n\t\toptions.onProgress(message);\n\t\treturn;\n\t}\n\tprocess.stderr.write(`${message}\\n`);\n}\n\nfunction bootstrapLockDir(venv: string): string {\n\treturn path.join(path.dirname(venv), `${path.basename(venv)}${BOOTSTRAP_LOCK_NAME}`);\n}\n\nfunction processIsRunning(pid: number): boolean {\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn isNodeError(error, \"EPERM\");\n\t}\n}\n\nasync function readLockPid(lockDir: string): Promise<number | null> {\n\ttry {\n\t\tconst raw = await readFile(path.join(lockDir, \"pid\"), \"utf8\");\n\t\tconst pid = Number.parseInt(raw.trim(), 10);\n\t\treturn Number.isInteger(pid) && pid > 0 ? pid : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function lockMissingPidIsStale(lockDir: string): Promise<boolean> {\n\ttry {\n\t\tconst lockStat = await stat(lockDir);\n\t\treturn Date.now() - lockStat.mtimeMs > BOOTSTRAP_LOCK_STALE_WITHOUT_PID_MS;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function acquireBootstrapLock(venv: string): Promise<() => Promise<void>> {\n\tconst lockDir = bootstrapLockDir(venv);\n\tawait mkdir(path.dirname(lockDir), { recursive: true });\n\n\tfor (;;) {\n\t\ttry {\n\t\t\tawait mkdir(lockDir);\n\t\t\tawait writeFile(path.join(lockDir, \"pid\"), `${process.pid}\\n`, \"utf8\");\n\t\t\treturn () => rm(lockDir, { recursive: true, force: true });\n\t\t} catch (error) {\n\t\t\tif (!isNodeError(error, \"EEXIST\")) throw error;\n\n\t\t\tconst pid = await readLockPid(lockDir);\n\t\t\tif (pid === null ? await lockMissingPidIsStale(lockDir) : !processIsRunning(pid)) {\n\t\t\t\tawait rm(lockDir, { recursive: true, force: true });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tawait sleep(BOOTSTRAP_LOCK_RETRY_MS);\n\t\t}\n\t}\n}\n\nasync function findExecutable(name: string): Promise<string | null> {\n\tconst pathValue = process.env.PATH;\n\tif (!pathValue) return null;\n\tconst candidates = process.platform === \"win32\" ? [name, `${name}.exe`] : [name];\n\tfor (const dir of pathValue.split(path.delimiter)) {\n\t\tif (!dir) continue;\n\t\tfor (const candidate of candidates) {\n\t\t\tconst fullPath = path.join(dir, candidate);\n\t\t\tif (await isExecutable(fullPath)) return fullPath;\n\t\t}\n\t}\n\treturn null;\n}\n\nasync function ensureUv(options: EnsureKernelPythonOptions): Promise<string> {\n\tconst fromPath = await findExecutable(\"uv\");\n\tif (fromPath) return fromPath;\n\n\tconst localUv = path.join(os.homedir(), \".local\", \"bin\", process.platform === \"win32\" ? \"uv.exe\" : \"uv\");\n\tif (await isExecutable(localUv)) return localUv;\n\n\tconst shouldInstallUv =\n\t\tprocess.env.ASM_AGENT_INSTALL_UV === \"1\" || (!options.onProgress && (await confirmUvInstall()));\n\tif (!shouldInstallUv) {\n\t\tthrow new Error(\n\t\t\t`uv is required to set up the Python kernel. Install uv yourself: ${UV_INSTALL_COMMAND}, ` +\n\t\t\t\t\"or set ASM_AGENT_INSTALL_UV=1 to let asm-agent run that installer.\",\n\t\t);\n\t}\n\n\treportProgress(options, \"› installing uv (one-time)…\");\n\ttry {\n\t\tawait run(\"sh\", [\"-c\", UV_INSTALL_COMMAND], { stdio: options.onProgress ? \"ignore\" : \"inherit\" });\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`couldn't install uv from astral.sh; install it yourself: ${UV_INSTALL_COMMAND}, then re-run asm-agent. ${errorMessage(error)}`,\n\t\t);\n\t}\n\n\tif (await isExecutable(localUv)) return localUv;\n\tconst installedFromPath = await findExecutable(\"uv\");\n\tif (installedFromPath) return installedFromPath;\n\tthrow new Error(\"uv install completed but binary not found at ~/.local/bin/uv\");\n}\n\nasync function confirmUvInstall(): Promise<boolean> {\n\tif (process.env.ASM_AGENT_INSTALL_UV === \"0\") return false;\n\tif (!stdin.isTTY || !stderr.isTTY) return false;\n\n\tconst rl = createInterface({ input: stdin, output: stderr });\n\ttry {\n\t\tconst answer = (await rl.question(\"ASM Agent needs uv to set up Python. Install uv from astral.sh now? [Y/n] \"))\n\t\t\t.trim()\n\t\t\t.toLowerCase();\n\t\treturn answer !== \"n\" && answer !== \"no\";\n\t} finally {\n\t\trl.close();\n\t}\n}\n\nasync function readBootstrapVersion(venv: string): Promise<BootstrapVersion | null> {\n\ttry {\n\t\tconst raw = await readFile(path.join(venv, BOOTSTRAP_VERSION_FILE), \"utf8\");\n\t\tconst parsed: unknown = JSON.parse(raw);\n\t\tif (!isRecord(parsed) || typeof parsed.schema !== \"number\") return null;\n\t\tconst extraUvArgs =\n\t\t\tArray.isArray(parsed.extraUvArgs) &&\n\t\t\tparsed.extraUvArgs.every((v: unknown): v is string => typeof v === \"string\")\n\t\t\t\t? (parsed.extraUvArgs as string[])\n\t\t\t\t: undefined;\n\t\tlet pythonSkills: BootstrapPythonSkill[] | undefined;\n\t\tif (Array.isArray(parsed.pythonSkills)) {\n\t\t\tif (\n\t\t\t\t!parsed.pythonSkills.every((v: unknown): v is BootstrapPythonSkill => {\n\t\t\t\t\tif (!isRecord(v)) return false;\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof v.importName === \"string\" &&\n\t\t\t\t\t\ttypeof v.packagePath === \"string\" &&\n\t\t\t\t\t\ttypeof v.pyprojectPath === \"string\" &&\n\t\t\t\t\t\ttypeof v.pyprojectHash === \"string\"\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tpythonSkills = parsed.pythonSkills as BootstrapPythonSkill[];\n\t\t}\n\t\treturn {\n\t\t\tschema: parsed.schema,\n\t\t\truntime: typeof parsed.runtime === \"string\" ? parsed.runtime : undefined,\n\t\t\tsnapshot: typeof parsed.snapshot === \"string\" ? parsed.snapshot : undefined,\n\t\t\textraUvArgs,\n\t\t\tpythonSkills,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction extraUvArgsMatch(a: string[] | undefined, b: string[] | undefined): boolean {\n\tif (a === b) return true;\n\tif (!a || !b) return false;\n\tif (a.length !== b.length) return false;\n\treturn a.every((v, i) => v === b[i]);\n}\n\nfunction pythonSkillsMatch(a: BootstrapPythonSkill[] | undefined, b: readonly BootstrapPythonSkill[]): boolean {\n\tconst left = a ?? [];\n\tif (left.length !== b.length) return false;\n\treturn left.every((skill, index) => {\n\t\tconst expected = b[index];\n\t\treturn (\n\t\t\tskill.importName === expected.importName &&\n\t\t\tskill.packagePath === expected.packagePath &&\n\t\t\tskill.pyprojectPath === expected.pyprojectPath &&\n\t\t\tskill.pyprojectHash === expected.pyprojectHash\n\t\t);\n\t});\n}\n\nfunction bootstrapVersionCurrent(\n\tversion: BootstrapVersion | null,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): boolean {\n\treturn (\n\t\tversion !== null &&\n\t\tbootstrapBaseVersionCurrent(version, runtimeIdentity) &&\n\t\tpythonSkillsMatch(version.pythonSkills, pythonSkills)\n\t);\n}\n\nfunction bootstrapBaseVersionCurrent(version: BootstrapVersion | null, runtimeIdentity: string): boolean {\n\treturn (\n\t\tversion?.schema === BOOTSTRAP_SCHEMA &&\n\t\tversion.runtime === runtimeIdentity &&\n\t\tversion.snapshot === STATE_SNAPSHOT_REQUIREMENT &&\n\t\textraUvArgsMatch(version.extraUvArgs, DEFAULT_RLM_EXTRA_UV_ARGS)\n\t);\n}\n\nasync function writeBootstrapVersion(\n\tvenv: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<void> {\n\tconst version: BootstrapVersion = {\n\t\tschema: BOOTSTRAP_SCHEMA,\n\t\truntime: runtimeIdentity,\n\t\tsnapshot: STATE_SNAPSHOT_REQUIREMENT,\n\t\textraUvArgs: DEFAULT_RLM_EXTRA_UV_ARGS,\n\t\tpythonSkills: [...pythonSkills],\n\t};\n\tawait writeFile(path.join(venv, BOOTSTRAP_VERSION_FILE), `${JSON.stringify(version)}\\n`, \"utf8\");\n}\n\nfunction runtimeCandidateDirs(): string[] {\n\tconst moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\t// dist/asm-agent-runtime is listed first deliberately: it is the only path stable\n\t// across every shipped layout (dist/, dist/bundle/, bun), where import.meta.url-relative\n\t// resolution breaks. `npm run build` rebuilds it from live source (copy-assets does\n\t// rm -rf + cp), so the staleness hash still refreshes on every build. The relative\n\t// paths below cover running from source (tsx) where dist/ hasn't been built.\n\treturn [\n\t\tpath.join(getPackageDir(), \"dist\", \"asm-agent-runtime\"),\n\t\tpath.resolve(moduleDir, \"..\", \"..\", \"asm-agent-runtime\"),\n\t\tpath.resolve(moduleDir, \"..\", \"..\", \"..\", \"..\", \"..\", \"asm-agent-runtime\"),\n\t];\n}\n\nasync function resolveRuntimeSourceDir(): Promise<string | null> {\n\tfor (const candidate of runtimeCandidateDirs()) {\n\t\tif (await exists(path.join(candidate, \"pyproject.toml\"))) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\treturn null;\n}\n\n// Identity of the runtime to be installed. For a local source checkout this is a\n// content hash of every rlm/*.py file plus pyproject.toml, so any runtime code or\n// dependency change invalidates an existing venv automatically. Falls back to the\n// bare package name when the runtime resolves to a registry install (no local source).\nexport async function resolveRuntimeIdentity(): Promise<string> {\n\tconst sourceDir = await resolveRuntimeSourceDir();\n\tif (!sourceDir) return RUNTIME_REQUIREMENT;\n\treturn hashRuntimeSource(sourceDir);\n}\n\n// Throws if the local source can't be read. A failure here must surface rather than\n// fall back to RUNTIME_REQUIREMENT: that constant is the registry-install identity, and\n// recording it for a local checkout would permanently mask later source changes.\nasync function hashRuntimeSource(sourceDir: string): Promise<string> {\n\tconst rlmDir = path.join(sourceDir, \"src\", \"rlm\");\n\tconst files: string[] = [path.join(sourceDir, \"pyproject.toml\")];\n\tasync function collect(dir: string): Promise<void> {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tconst full = path.join(dir, entry.name);\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tawait collect(full);\n\t\t\t} else if (entry.isFile() && entry.name.endsWith(\".py\")) {\n\t\t\t\tfiles.push(full);\n\t\t\t}\n\t\t}\n\t}\n\tawait collect(rlmDir);\n\tfiles.sort();\n\tconst hash = createHash(\"sha256\");\n\tfor (const file of files) {\n\t\thash.update(path.relative(sourceDir, file));\n\t\thash.update(\"\\0\");\n\t\thash.update(await readFile(file));\n\t\thash.update(\"\\0\");\n\t}\n\treturn `sha256:${hash.digest(\"hex\")}`;\n}\n\nasync function bootstrapVenv(\n\tvenv: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n\toptions: EnsureKernelPythonOptions,\n): Promise<void> {\n\tawait mkdir(path.dirname(venv), { recursive: true });\n\tconst uv = await ensureUv(options);\n\tconst python = path.join(venv, \"bin\", \"python\");\n\tconst sourceDir = await resolveRuntimeSourceDir();\n\tconst runtimeRequirement = sourceDir ?? RUNTIME_REQUIREMENT;\n\tconst runtimeIdentity = await resolveRuntimeIdentity();\n\n\tawait run(uv, [\"python\", \"install\", PYTHON_VERSION]);\n\tawait run(uv, [\"venv\", venv, \"--python\", PYTHON_VERSION, \"--seed\"]);\n\tawait run(uv, [\n\t\t\"pip\",\n\t\t\"install\",\n\t\t\"--python\",\n\t\tpython,\n\t\truntimeRequirement,\n\t\tSTATE_SNAPSHOT_REQUIREMENT,\n\t\t...DEFAULT_RLM_EXTRA_UV_ARGS,\n\t]);\n\tawait syncPythonSkills(uv, venv, python, runtimeIdentity, pythonSkills, options);\n}\n\nasync function syncPythonSkills(\n\tuv: string,\n\tvenv: string,\n\tpython: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n\toptions: EnsureKernelPythonOptions,\n): Promise<void> {\n\tconst version = await readBootstrapVersion(venv);\n\tconst installedPythonSkills: BootstrapPythonSkill[] = [];\n\tconst currentPythonSkills = new Map(\n\t\t(version?.pythonSkills ?? []).map((skill) => [`${skill.importName}\\0${skill.packagePath}`, skill]),\n\t);\n\tconst pythonSkillsByProjectName = new Map(\n\t\tpythonSkills.map((skill) => [readPythonSkillProjectName(skill).replaceAll(\"_\", \"-\").toLowerCase(), skill]),\n\t);\n\tconst dependenciesBySkill = new Map(\n\t\tpythonSkills.map((skill) => [\n\t\t\tskill,\n\t\t\t[...readPythonSkillDependencyNames(skill)]\n\t\t\t\t.map(\n\t\t\t\t\t(dependencyName) =>\n\t\t\t\t\t\tpythonSkillsByProjectName.get(dependencyName) ??\n\t\t\t\t\t\tresolveSiblingPythonSkillDependency(skill, dependencyName),\n\t\t\t\t)\n\t\t\t\t.filter((dependency): dependency is BootstrapPythonSkill => Boolean(dependency)),\n\t\t]),\n\t);\n\n\tfor (const skill of sortPythonSkillsForInstall(pythonSkills)) {\n\t\tconst existingSkill = currentPythonSkills.get(`${skill.importName}\\0${skill.packagePath}`);\n\t\tif (existingSkill?.pyprojectPath === skill.pyprojectPath && existingSkill.pyprojectHash === skill.pyprojectHash) {\n\t\t\tinstalledPythonSkills.push(skill);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst localDependencies = dependenciesBySkill.get(skill) ?? [];\n\t\tconst localDependencyArgs = localDependencies\n\t\t\t.filter((dependency) => {\n\t\t\t\tconst installedDependency = currentPythonSkills.get(`${dependency.importName}\\0${dependency.packagePath}`);\n\t\t\t\tconst installedThisSync = installedPythonSkills.some(\n\t\t\t\t\t(installed) =>\n\t\t\t\t\t\tinstalled.importName === dependency.importName &&\n\t\t\t\t\t\tinstalled.packagePath === dependency.packagePath &&\n\t\t\t\t\t\tinstalled.pyprojectPath === dependency.pyprojectPath &&\n\t\t\t\t\t\tinstalled.pyprojectHash === dependency.pyprojectHash,\n\t\t\t\t);\n\t\t\t\treturn !(\n\t\t\t\t\tinstalledThisSync ||\n\t\t\t\t\t(installedDependency?.pyprojectPath === dependency.pyprojectPath &&\n\t\t\t\t\t\tinstalledDependency.pyprojectHash === dependency.pyprojectHash)\n\t\t\t\t);\n\t\t\t})\n\t\t\t.flatMap(formatPythonSkillInstallArgs);\n\n\t\ttry {\n\t\t\tawait run(uv, [\n\t\t\t\t\"pip\",\n\t\t\t\t\"install\",\n\t\t\t\t\"--python\",\n\t\t\t\tpython,\n\t\t\t\t...formatPythonSkillInstallArgs(skill),\n\t\t\t\t...localDependencyArgs,\n\t\t\t]);\n\t\t\tinstalledPythonSkills.push(\n\t\t\t\tskill,\n\t\t\t\t...localDependencies.filter((dependency) => !installedPythonSkills.includes(dependency)),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treportProgress(\n\t\t\t\toptions,\n\t\t\t\t`Warning: Python skill ${skill.importName} failed to install and will be unavailable: ${errorMessage(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\tawait writeBootstrapVersion(venv, runtimeIdentity, installedPythonSkills);\n}\n\nasync function kernelBaseReady(python: string, venv: string, runtimeIdentity: string): Promise<boolean> {\n\treturn (\n\t\t(await hasAsmAgentRuntime(python)) &&\n\t\tbootstrapBaseVersionCurrent(await readBootstrapVersion(venv), runtimeIdentity)\n\t);\n}\n\nasync function kernelReady(\n\tpython: string,\n\tvenv: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<boolean> {\n\treturn (\n\t\t(await hasAsmAgentRuntime(python)) &&\n\t\tbootstrapVersionCurrent(await readBootstrapVersion(venv), runtimeIdentity, pythonSkills)\n\t);\n}\n\nfunction formatBootstrapFailure(error: unknown): Error {\n\treturn new Error(\n\t\t`Failed to set up the Python kernel runtime. ${errorMessage(error)}\\n` +\n\t\t\t\"First-time setup needs internet to install uv, Python, asm-agent-runtime, and default Python packages; once set up, asm-agent runs offline. \" +\n\t\t\t\"Set ASM_AGENT_KERNEL_PYTHON to a Python with a current asm-agent-runtime and default Python packages installed to skip auto-bootstrap.\",\n\t);\n}\n\nasync function ensureKernelPythonUncached(\n\toptions: EnsureKernelPythonOptions,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<string> {\n\tconst override = process.env.ASM_AGENT_KERNEL_PYTHON;\n\tif (override) {\n\t\tconst python = path.resolve(expandHome(override));\n\t\tconst missing: string[] = [];\n\t\tif (!(await hasAsmAgentRuntime(python))) {\n\t\t\tmissing.push(\n\t\t\t\t\"a current asm-agent-runtime with callable rlm.run, rlm.host_request, and explicit harness CRUD methods\",\n\t\t\t);\n\t\t}\n\t\tif (missing.length === 0) {\n\t\t\tconst missingExtraImports = await missingRlmExtraImportLabels(python);\n\t\t\tif (missingExtraImports.length > 0) {\n\t\t\t\tmissing.push(`default Python packages (${missingExtraImports.join(\", \")})`);\n\t\t\t}\n\t\t}\n\t\tif (missing.length === 0 && pythonSkills.length > 0) {\n\t\t\tconst missingPythonSkills = await missingPythonSkillImportLabels(python, options.pythonSkills ?? []);\n\t\t\tif (missingPythonSkills.length > 0) {\n\t\t\t\treportProgress(\n\t\t\t\t\toptions,\n\t\t\t\t\t`Warning: Python skills unavailable in ASM_AGENT_KERNEL_PYTHON and will be disabled: ${missingPythonSkills.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (missing.length === 0) return python;\n\t\tthrow new Error(`ASM_AGENT_KERNEL_PYTHON points to a Python missing ${missing.join(\" and \")}: ${python}`);\n\t}\n\n\tconst venv = await resolveWritableKernelVenvDir();\n\tconst python = path.join(venv, \"bin\", \"python\");\n\tconst runtimeIdentity = await resolveRuntimeIdentity();\n\tif (await kernelReady(python, venv, runtimeIdentity, pythonSkills)) return python;\n\n\tconst releaseLock = await acquireBootstrapLock(venv);\n\ttry {\n\t\tif (await kernelReady(python, venv, runtimeIdentity, pythonSkills)) return python;\n\t\tif (await kernelBaseReady(python, venv, runtimeIdentity)) {\n\t\t\tawait syncPythonSkills(await ensureUv(options), venv, python, runtimeIdentity, pythonSkills, options);\n\t\t\treturn python;\n\t\t}\n\n\t\tconst hadVenv = existsSync(venv);\n\t\treportProgress(options, \"› setting up python kernel (one-time, ~30s)…\");\n\t\tif (hadVenv) {\n\t\t\treportProgress(options, \"rebuilding kernel venv\");\n\t\t\tawait rm(venv, { recursive: true, force: true });\n\t\t}\n\n\t\tawait bootstrapVenv(venv, pythonSkills, options);\n\t} catch (error) {\n\t\tthrow formatBootstrapFailure(error);\n\t} finally {\n\t\tawait releaseLock().catch(() => undefined);\n\t}\n\n\treportProgress(options, \"✓ ready\");\n\treturn python;\n}\n\nexport function ensureKernelPython(options: EnsureKernelPythonOptions = {}): Promise<string> {\n\tconst pythonSkills = normalizePythonSkills(options.pythonSkills);\n\tconst key = ensureKernelPythonKey(pythonSkills);\n\tif (inFlightEnsureKernelPython?.key === key) return inFlightEnsureKernelPython.promise;\n\n\tconst promise = ensureKernelPythonUncached(options, pythonSkills).finally(() => {\n\t\tif (inFlightEnsureKernelPython?.promise === promise) inFlightEnsureKernelPython = null;\n\t});\n\tinFlightEnsureKernelPython = { key, promise };\n\treturn promise;\n}\n"]}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/core/kernel/bootstrap.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAsB3D,eAAO,MAAM,yBAAyB,UAAqD,CAAC;AAC5F,eAAO,MAAM,8BAA8B,UAA0D,CAAC;AACtG,eAAO,MAAM,+BAA+B,UAA2D,CAAC;AAyBxG,MAAM,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AACvD,MAAM,MAAM,8BAA8B,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAEvE,MAAM,WAAW,yBAAyB;IACzC,YAAY,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC5C,UAAU,CAAC,EAAE,8BAA8B,CAAC;CAC5C;AA8QD,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAgVD,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAI9D;AAiOD,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,MAAM,CAAC,CAU3F","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { constants, existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { access, mkdir, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { stderr, stdin } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { getPackageDir } from \"../../config.js\";\nimport type { PythonSkillRuntimeInfo } from \"../skills.js\";\n\nconst BOOTSTRAP_SCHEMA = 9;\nconst PYTHON_VERSION = \"3.12\";\nconst RUNTIME_REQUIREMENT = \"asm-agent-runtime\";\n// Serializes the kernel's user namespace so it can be revived across session\n// resume. Internal-only; intentionally not surfaced to the model as an import.\nconst STATE_SNAPSHOT_REQUIREMENT = \"dill\";\nconst DEFAULT_RLM_EXTRA_PACKAGES = [\n\t{ uvArg: \"requests\", importName: \"requests\", promptLabel: \"requests\" },\n\t{ uvArg: \"httpx\", importName: \"httpx\", promptLabel: \"httpx\" },\n\t{ uvArg: \"pyyaml\", importName: \"yaml\", promptLabel: \"yaml (PyYAML)\" },\n\t{ uvArg: \"tomli\", importName: \"tomli\", promptLabel: \"tomli\" },\n\t{ uvArg: \"python-dotenv\", importName: \"dotenv\", promptLabel: \"dotenv (python-dotenv)\" },\n\t{ uvArg: \"pandas\", importName: \"pandas\", promptLabel: \"pandas\" },\n\t{ uvArg: \"numpy\", importName: \"numpy\", promptLabel: \"numpy\" },\n\t{ uvArg: \"scipy\", importName: \"scipy\", promptLabel: \"scipy\" },\n\t{ uvArg: \"beautifulsoup4\", importName: \"bs4\", promptLabel: \"bs4 (Beautiful Soup)\" },\n\t{ uvArg: \"lxml\", importName: \"lxml\", promptLabel: \"lxml\" },\n\t{ uvArg: \"pydantic\", importName: \"pydantic\", promptLabel: \"pydantic\" },\n\t{ uvArg: \"tyro\", importName: \"tyro\", promptLabel: \"tyro\" },\n];\nexport const DEFAULT_RLM_EXTRA_UV_ARGS = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.uvArg);\nexport const DEFAULT_RLM_EXTRA_IMPORT_NAMES = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.importName);\nexport const DEFAULT_RLM_EXTRA_IMPORT_LABELS = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.promptLabel);\nconst UV_INSTALL_COMMAND = \"curl -LsSf https://astral.sh/uv/install.sh | sh\";\nconst REQUIRED_HARNESS_METHODS = [\n\t\"create_memory\",\n\t\"update_memory\",\n\t\"delete_memory\",\n\t\"create_skill\",\n\t\"update_skill\",\n\t\"delete_skill\",\n\t\"create_subagent\",\n\t\"update_subagent\",\n\t\"delete_subagent\",\n\t\"create_prompt_note\",\n\t\"update_prompt_note\",\n\t\"delete_prompt_note\",\n\t\"record_refinement\",\n];\nconst RUNTIME_READY_CHECK = `import inspect; import rlm; from rlm import McpIntegration; import rlm.mcp as mcp; from rlm.harness import HarnessEntry; _harness_methods = ${JSON.stringify(REQUIRED_HARNESS_METHODS)}; assert callable(mcp.list_tools); assert callable(mcp.call_tool); assert hasattr(rlm, 'run'); assert callable(rlm); assert hasattr(rlm, 'rlm'); assert callable(rlm.rlm); assert callable(rlm.host_request); assert callable(rlm.find_models); assert callable(rlm.rlm.find_models); assert hasattr(rlm, 'harness'); assert hasattr(rlm, 'get_harness_state'); assert hasattr(rlm.rlm, 'harness'); assert hasattr(rlm.rlm, 'get_harness_state'); assert all(callable(getattr(_harness, _method, None)) for _harness in (rlm.harness, rlm.rlm.harness) for _method in _harness_methods); assert 'reference' in HarnessEntry.__dataclass_fields__; assert 'scope' in HarnessEntry.__dataclass_fields__; assert 'reference' in inspect.signature(rlm.harness.create_skill).parameters; assert 'reference' in inspect.signature(rlm.harness.update_skill).parameters; assert 'global_' in inspect.signature(rlm.harness.create_memory).parameters; assert 'global_' in inspect.signature(rlm.get_harness_state).parameters; assert not hasattr(rlm, 'background'); assert not hasattr(rlm.rlm, 'background'); from rlm.bash import BashHandle, BashResult; assert callable(rlm.bash); assert all(callable(getattr(BashHandle, _m, None)) for _m in ('tail', 'output', 'poll', 'kill')); assert {'exit_code', 'output', 'duration'} <= set(BashResult.__dataclass_fields__); import rlm.repl as _repl; assert callable(_repl.main); assert callable(_repl.emit); assert callable(_repl.host_request); assert callable(_repl.is_active); assert _repl.PROTOCOL_VERSION == 3; assert callable(rlm.emit); assert not hasattr(rlm, 'HOST_COMM_TARGET'); assert not hasattr(mcp, 'install_shutdown_hook')`;\nconst BOOTSTRAP_VERSION_FILE = \".bootstrap-version\";\nconst BOOTSTRAP_LOCK_NAME = \".bootstrap.lock\";\nconst BOOTSTRAP_LOCK_RETRY_MS = 100;\nconst BOOTSTRAP_LOCK_STALE_WITHOUT_PID_MS = 30_000;\n\nlet inFlightEnsureKernelPython: { key: string; promise: Promise<string> } | null = null;\n\nexport type KernelPythonSkill = PythonSkillRuntimeInfo;\nexport type KernelBootstrapProgressHandler = (message: string) => void;\n\nexport interface EnsureKernelPythonOptions {\n\tpythonSkills?: readonly KernelPythonSkill[];\n\tonProgress?: KernelBootstrapProgressHandler;\n}\n\ninterface BootstrapPythonSkill {\n\timportName: string;\n\tpackagePath: string;\n\tpyprojectPath: string;\n\tpyprojectHash: string;\n}\n\ninterface BootstrapVersion {\n\tschema: number;\n\truntime?: string;\n\tsnapshot?: string;\n\textraUvArgs?: string[];\n\tpythonSkills?: BootstrapPythonSkill[];\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n\treturn error instanceof Error && \"code\" in error && error.code === code;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n\ttry {\n\t\tawait access(filePath);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function isExecutable(filePath: string): Promise<boolean> {\n\ttry {\n\t\tawait access(filePath, constants.X_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction expandHome(filePath: string): string {\n\tif (filePath === \"~\") return os.homedir();\n\tif (filePath.startsWith(\"~/\")) return path.join(os.homedir(), filePath.slice(2));\n\treturn filePath;\n}\n\nfunction fileContentHash(filePath: string): string {\n\ttry {\n\t\treturn `sha256:${createHash(\"sha256\").update(readFileSync(filePath)).digest(\"hex\")}`;\n\t} catch {\n\t\treturn \"unreadable\";\n\t}\n}\n\nfunction normalizePythonSkills(pythonSkills: readonly KernelPythonSkill[] | undefined): BootstrapPythonSkill[] {\n\tconst byKey = new Map<string, BootstrapPythonSkill>();\n\tconst addSkill = (skill: Pick<KernelPythonSkill, \"importName\" | \"packagePath\" | \"pyprojectPath\">): void => {\n\t\tconst packagePath = path.resolve(skill.packagePath);\n\t\tconst pyprojectPath = path.resolve(skill.pyprojectPath);\n\t\tconst key = `${skill.importName}\\0${packagePath}`;\n\t\tif (byKey.has(key)) {\n\t\t\treturn;\n\t\t}\n\t\tconst bootstrapSkill: BootstrapPythonSkill = {\n\t\t\timportName: skill.importName,\n\t\t\tpackagePath,\n\t\t\tpyprojectPath,\n\t\t\tpyprojectHash: fileContentHash(pyprojectPath),\n\t\t};\n\t\tbyKey.set(key, bootstrapSkill);\n\t\tfor (const dependencyName of readPythonSkillDependencyNames(bootstrapSkill)) {\n\t\t\tconst siblingDependency = resolveSiblingPythonSkillDependency(bootstrapSkill, dependencyName);\n\t\t\tif (siblingDependency) {\n\t\t\t\taddSkill(siblingDependency);\n\t\t\t}\n\t\t}\n\t};\n\tfor (const skill of pythonSkills ?? []) {\n\t\taddSkill(skill);\n\t}\n\treturn [...byKey.values()].sort((a, b) => {\n\t\tconst packageCompare = a.packagePath.localeCompare(b.packagePath);\n\t\tif (packageCompare !== 0) return packageCompare;\n\t\treturn a.importName.localeCompare(b.importName);\n\t});\n}\n\nfunction readTomlProjectSection(pyprojectPath: string): string | undefined {\n\ttry {\n\t\tconst text = readFileSync(pyprojectPath, \"utf-8\");\n\t\tconst match = text.match(/^\\s*\\[project\\]\\s*$/m);\n\t\tif (!match || match.index === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst sectionStart = match.index + match[0].length;\n\t\tconst rest = text.slice(sectionStart);\n\t\tconst nextSection = rest.search(/^\\s*\\[/m);\n\t\treturn nextSection >= 0 ? rest.slice(0, nextSection) : rest;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction readPythonSkillProjectName(skill: BootstrapPythonSkill): string {\n\tconst projectSection = readTomlProjectSection(skill.pyprojectPath);\n\tconst name = projectSection?.match(/^\\s*name\\s*=\\s*[\"']([^\"']+)[\"']/m)?.[1];\n\treturn name?.trim() || skill.importName.replaceAll(\"_\", \"-\");\n}\n\nfunction parseDependencyPackageName(dependency: string): string | undefined {\n\tconst withoutMarker = dependency.split(\";\")[0]?.trim() ?? \"\";\n\tif (!withoutMarker) {\n\t\treturn undefined;\n\t}\n\tconst match = withoutMarker.match(/^([A-Za-z0-9_.-]+)/);\n\treturn match?.[1]?.replaceAll(\"_\", \"-\").toLowerCase();\n}\n\nfunction findTomlArrayEnd(text: string, startIndex: number): number {\n\tlet inQuote: '\"' | \"'\" | undefined;\n\tlet escaped = false;\n\tfor (let index = startIndex; index < text.length; index++) {\n\t\tconst char = text[index];\n\t\tif (inQuote) {\n\t\t\tif (escaped) {\n\t\t\t\tescaped = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === \"\\\\\") {\n\t\t\t\tescaped = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === inQuote) {\n\t\t\t\tinQuote = undefined;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' || char === \"'\") {\n\t\t\tinQuote = char;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"]\") {\n\t\t\treturn index;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction readPythonSkillDependencyNames(skill: BootstrapPythonSkill): Set<string> {\n\tconst projectSection = readTomlProjectSection(skill.pyprojectPath);\n\tif (!projectSection) {\n\t\treturn new Set();\n\t}\n\tconst dependenciesStart = projectSection.search(/^\\s*dependencies\\s*=\\s*\\[/m);\n\tif (dependenciesStart < 0) {\n\t\treturn new Set();\n\t}\n\tconst arrayStart = projectSection.indexOf(\"[\", dependenciesStart);\n\tif (arrayStart < 0) {\n\t\treturn new Set();\n\t}\n\tconst arrayEnd = findTomlArrayEnd(projectSection, arrayStart + 1);\n\tif (arrayEnd < 0) {\n\t\treturn new Set();\n\t}\n\tconst dependenciesArray = projectSection.slice(arrayStart, arrayEnd + 1);\n\tconst dependencies = new Set<string>();\n\tconst dependencyPattern = /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'/g;\n\tfor (const match of dependenciesArray.matchAll(dependencyPattern)) {\n\t\tconst dependency = (match[1] ?? match[2] ?? \"\").replaceAll('\\\\\"', '\"').replaceAll(\"\\\\'\", \"'\");\n\t\tconst name = parseDependencyPackageName(dependency);\n\t\tif (name) {\n\t\t\tdependencies.add(name);\n\t\t}\n\t}\n\treturn dependencies;\n}\n\nfunction resolveSiblingPythonSkillDependency(\n\tskill: BootstrapPythonSkill,\n\tdependencyName: string,\n): BootstrapPythonSkill | undefined {\n\tconst siblingsDir = path.dirname(skill.packagePath);\n\tfor (const entry of readdirSync(siblingsDir, { withFileTypes: true })) {\n\t\tif (!entry.isDirectory()) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst packagePath = path.join(siblingsDir, entry.name);\n\t\tconst pyprojectPath = path.join(packagePath, \"pyproject.toml\");\n\t\tif (!existsSync(pyprojectPath)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst dependency: BootstrapPythonSkill = {\n\t\t\timportName: entry.name.replaceAll(\"-\", \"_\"),\n\t\t\tpackagePath,\n\t\t\tpyprojectPath,\n\t\t\tpyprojectHash: fileContentHash(pyprojectPath),\n\t\t};\n\t\tif (readPythonSkillProjectName(dependency).replaceAll(\"_\", \"-\").toLowerCase() === dependencyName) {\n\t\t\treturn dependency;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction sortPythonSkillsForInstall(pythonSkills: readonly BootstrapPythonSkill[]): BootstrapPythonSkill[] {\n\tconst byProjectName = new Map<string, BootstrapPythonSkill>();\n\tconst originalIndex = new Map<BootstrapPythonSkill, number>();\n\tfor (const [index, skill] of pythonSkills.entries()) {\n\t\toriginalIndex.set(skill, index);\n\t\tbyProjectName.set(readPythonSkillProjectName(skill).replaceAll(\"_\", \"-\").toLowerCase(), skill);\n\t}\n\n\tconst dependenciesBySkill = new Map<BootstrapPythonSkill, BootstrapPythonSkill[]>();\n\tfor (const skill of pythonSkills) {\n\t\tdependenciesBySkill.set(\n\t\t\tskill,\n\t\t\t[...readPythonSkillDependencyNames(skill)]\n\t\t\t\t.map(\n\t\t\t\t\t(dependencyName) =>\n\t\t\t\t\t\tbyProjectName.get(dependencyName) ?? resolveSiblingPythonSkillDependency(skill, dependencyName),\n\t\t\t\t)\n\t\t\t\t.filter((dependency): dependency is BootstrapPythonSkill => Boolean(dependency)),\n\t\t);\n\t}\n\n\tconst pending = new Set(pythonSkills);\n\tconst sorted: BootstrapPythonSkill[] = [];\n\twhile (pending.size > 0) {\n\t\tlet progressed = false;\n\t\tfor (const skill of [...pending].sort((a, b) => (originalIndex.get(a) ?? 0) - (originalIndex.get(b) ?? 0))) {\n\t\t\tconst dependencies = dependenciesBySkill.get(skill) ?? [];\n\t\t\tif (dependencies.some((dependency) => pending.has(dependency))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsorted.push(skill);\n\t\t\tpending.delete(skill);\n\t\t\tprogressed = true;\n\t\t}\n\t\tif (!progressed) {\n\t\t\t// Cyclic local skill dependencies cannot be topologically ordered; keep a\n\t\t\t// deterministic order and let uv surface the packaging error if needed.\n\t\t\tsorted.push(...[...pending].sort((a, b) => a.packagePath.localeCompare(b.packagePath)));\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn sorted;\n}\n\nfunction formatPythonSkillInstallArgs(skill: BootstrapPythonSkill): string[] {\n\treturn [\"--editable\", skill.packagePath];\n}\n\nfunction ensureKernelPythonKey(pythonSkills: readonly BootstrapPythonSkill[]): string {\n\treturn [\n\t\tprocess.env.ASM_AGENT_KERNEL_PYTHON ?? \"\",\n\t\tprocess.env.ASM_AGENT_KERNEL_VENV ?? \"\",\n\t\tprocess.env.HOME ?? \"\",\n\t\tprocess.env.XDG_DATA_HOME ?? \"\",\n\t\tJSON.stringify(pythonSkills),\n\t].join(\"\\0\");\n}\n\nexport function getKernelVenvDir(): string {\n\tconst override = process.env.ASM_AGENT_KERNEL_VENV;\n\tif (override) return path.resolve(expandHome(override));\n\treturn path.join(os.homedir(), \".asm-agent\", \"kernel-venv\");\n}\n\nfunction getXdgKernelVenvDir(): string {\n\tconst dataHome = process.env.XDG_DATA_HOME\n\t\t? path.resolve(expandHome(process.env.XDG_DATA_HOME))\n\t\t: path.join(os.homedir(), \".local\", \"share\");\n\treturn path.join(dataHome, \"asm-agent\", \"kernel-venv\");\n}\n\nasync function resolveWritableKernelVenvDir(): Promise<string> {\n\tconst primary = getKernelVenvDir();\n\ttry {\n\t\tawait mkdir(path.dirname(primary), { recursive: true });\n\t\treturn primary;\n\t} catch (primaryError) {\n\t\tif (process.env.ASM_AGENT_KERNEL_VENV) {\n\t\t\tthrow new Error(`couldn't create kernel venv parent directory for ${primary}: ${errorMessage(primaryError)}`);\n\t\t}\n\n\t\tconst fallback = getXdgKernelVenvDir();\n\t\ttry {\n\t\t\tawait mkdir(path.dirname(fallback), { recursive: true });\n\t\t\treturn fallback;\n\t\t} catch (fallbackError) {\n\t\t\tthrow new Error(\n\t\t\t\t`couldn't create kernel venv directory at ${primary} or ${fallback}; set ASM_AGENT_KERNEL_PYTHON to a python with a current asm-agent-runtime installed. ${errorMessage(fallbackError)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction run(command: string, args: string[], options: { stdio?: \"ignore\" | \"inherit\" } = {}): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tenv: process.env,\n\t\t\tstdio: options.stdio ?? \"ignore\",\n\t\t});\n\t\tchild.on(\"error\", reject);\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst reason = signal ? `signal ${signal}` : `exit code ${code}`;\n\t\t\treject(new Error(`${command} ${args.join(\" \")} failed with ${reason}`));\n\t\t});\n\t});\n}\n\nasync function pythonImports(python: string, moduleName: string): Promise<boolean> {\n\ttry {\n\t\tawait run(python, [\"-c\", `import ${moduleName}`], { stdio: \"ignore\" });\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function hasAsmAgentRuntime(python: string): Promise<boolean> {\n\ttry {\n\t\tawait run(python, [\"-c\", RUNTIME_READY_CHECK], { stdio: \"ignore\" });\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function missingRlmExtraImportLabels(python: string): Promise<string[]> {\n\tconst missing: string[] = [];\n\tfor (const pkg of DEFAULT_RLM_EXTRA_PACKAGES) {\n\t\tif (!(await pythonImports(python, pkg.importName))) {\n\t\t\tmissing.push(pkg.promptLabel);\n\t\t}\n\t}\n\treturn missing;\n}\n\nasync function missingPythonSkillImportLabels(\n\tpython: string,\n\tpythonSkills: readonly KernelPythonSkill[],\n): Promise<string[]> {\n\tconst missing: string[] = [];\n\tfor (const skill of pythonSkills) {\n\t\tif (!(await pythonImports(python, skill.importName))) {\n\t\t\tmissing.push(`${skill.name} (${skill.importName})`);\n\t\t}\n\t}\n\treturn missing;\n}\n\nfunction reportProgress(options: EnsureKernelPythonOptions, message: string): void {\n\tif (options.onProgress) {\n\t\toptions.onProgress(message);\n\t\treturn;\n\t}\n\tprocess.stderr.write(`${message}\\n`);\n}\n\nfunction bootstrapLockDir(venv: string): string {\n\treturn path.join(path.dirname(venv), `${path.basename(venv)}${BOOTSTRAP_LOCK_NAME}`);\n}\n\nfunction processIsRunning(pid: number): boolean {\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn isNodeError(error, \"EPERM\");\n\t}\n}\n\nasync function readLockPid(lockDir: string): Promise<number | null> {\n\ttry {\n\t\tconst raw = await readFile(path.join(lockDir, \"pid\"), \"utf8\");\n\t\tconst pid = Number.parseInt(raw.trim(), 10);\n\t\treturn Number.isInteger(pid) && pid > 0 ? pid : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function lockMissingPidIsStale(lockDir: string): Promise<boolean> {\n\ttry {\n\t\tconst lockStat = await stat(lockDir);\n\t\treturn Date.now() - lockStat.mtimeMs > BOOTSTRAP_LOCK_STALE_WITHOUT_PID_MS;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function acquireBootstrapLock(venv: string): Promise<() => Promise<void>> {\n\tconst lockDir = bootstrapLockDir(venv);\n\tawait mkdir(path.dirname(lockDir), { recursive: true });\n\n\tfor (;;) {\n\t\ttry {\n\t\t\tawait mkdir(lockDir);\n\t\t\tawait writeFile(path.join(lockDir, \"pid\"), `${process.pid}\\n`, \"utf8\");\n\t\t\treturn () => rm(lockDir, { recursive: true, force: true });\n\t\t} catch (error) {\n\t\t\tif (!isNodeError(error, \"EEXIST\")) throw error;\n\n\t\t\tconst pid = await readLockPid(lockDir);\n\t\t\tif (pid === null ? await lockMissingPidIsStale(lockDir) : !processIsRunning(pid)) {\n\t\t\t\tawait rm(lockDir, { recursive: true, force: true });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tawait sleep(BOOTSTRAP_LOCK_RETRY_MS);\n\t\t}\n\t}\n}\n\nasync function findExecutable(name: string): Promise<string | null> {\n\tconst pathValue = process.env.PATH;\n\tif (!pathValue) return null;\n\tconst candidates = process.platform === \"win32\" ? [name, `${name}.exe`] : [name];\n\tfor (const dir of pathValue.split(path.delimiter)) {\n\t\tif (!dir) continue;\n\t\tfor (const candidate of candidates) {\n\t\t\tconst fullPath = path.join(dir, candidate);\n\t\t\tif (await isExecutable(fullPath)) return fullPath;\n\t\t}\n\t}\n\treturn null;\n}\n\nasync function ensureUv(options: EnsureKernelPythonOptions): Promise<string> {\n\tconst fromPath = await findExecutable(\"uv\");\n\tif (fromPath) return fromPath;\n\n\tconst localUv = path.join(os.homedir(), \".local\", \"bin\", process.platform === \"win32\" ? \"uv.exe\" : \"uv\");\n\tif (await isExecutable(localUv)) return localUv;\n\n\tconst shouldInstallUv =\n\t\tprocess.env.ASM_AGENT_INSTALL_UV === \"1\" || (!options.onProgress && (await confirmUvInstall()));\n\tif (!shouldInstallUv) {\n\t\tthrow new Error(\n\t\t\t`uv is required to set up the Python kernel. Install uv yourself: ${UV_INSTALL_COMMAND}, ` +\n\t\t\t\t\"or set ASM_AGENT_INSTALL_UV=1 to let asm-agent run that installer.\",\n\t\t);\n\t}\n\n\treportProgress(options, \"› installing uv (one-time)…\");\n\ttry {\n\t\tawait run(\"sh\", [\"-c\", UV_INSTALL_COMMAND], { stdio: options.onProgress ? \"ignore\" : \"inherit\" });\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`couldn't install uv from astral.sh; install it yourself: ${UV_INSTALL_COMMAND}, then re-run asm-agent. ${errorMessage(error)}`,\n\t\t);\n\t}\n\n\tif (await isExecutable(localUv)) return localUv;\n\tconst installedFromPath = await findExecutable(\"uv\");\n\tif (installedFromPath) return installedFromPath;\n\tthrow new Error(\"uv install completed but binary not found at ~/.local/bin/uv\");\n}\n\nasync function confirmUvInstall(): Promise<boolean> {\n\tif (process.env.ASM_AGENT_INSTALL_UV === \"0\") return false;\n\tif (!stdin.isTTY || !stderr.isTTY) return false;\n\n\tconst rl = createInterface({ input: stdin, output: stderr });\n\ttry {\n\t\tconst answer = (await rl.question(\"ASM Agent needs uv to set up Python. Install uv from astral.sh now? [Y/n] \"))\n\t\t\t.trim()\n\t\t\t.toLowerCase();\n\t\treturn answer !== \"n\" && answer !== \"no\";\n\t} finally {\n\t\trl.close();\n\t}\n}\n\nasync function readBootstrapVersion(venv: string): Promise<BootstrapVersion | null> {\n\ttry {\n\t\tconst raw = await readFile(path.join(venv, BOOTSTRAP_VERSION_FILE), \"utf8\");\n\t\tconst parsed: unknown = JSON.parse(raw);\n\t\tif (!isRecord(parsed) || typeof parsed.schema !== \"number\") return null;\n\t\tconst extraUvArgs =\n\t\t\tArray.isArray(parsed.extraUvArgs) &&\n\t\t\tparsed.extraUvArgs.every((v: unknown): v is string => typeof v === \"string\")\n\t\t\t\t? (parsed.extraUvArgs as string[])\n\t\t\t\t: undefined;\n\t\tlet pythonSkills: BootstrapPythonSkill[] | undefined;\n\t\tif (Array.isArray(parsed.pythonSkills)) {\n\t\t\tif (\n\t\t\t\t!parsed.pythonSkills.every((v: unknown): v is BootstrapPythonSkill => {\n\t\t\t\t\tif (!isRecord(v)) return false;\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof v.importName === \"string\" &&\n\t\t\t\t\t\ttypeof v.packagePath === \"string\" &&\n\t\t\t\t\t\ttypeof v.pyprojectPath === \"string\" &&\n\t\t\t\t\t\ttypeof v.pyprojectHash === \"string\"\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tpythonSkills = parsed.pythonSkills as BootstrapPythonSkill[];\n\t\t}\n\t\treturn {\n\t\t\tschema: parsed.schema,\n\t\t\truntime: typeof parsed.runtime === \"string\" ? parsed.runtime : undefined,\n\t\t\tsnapshot: typeof parsed.snapshot === \"string\" ? parsed.snapshot : undefined,\n\t\t\textraUvArgs,\n\t\t\tpythonSkills,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction extraUvArgsMatch(a: string[] | undefined, b: string[] | undefined): boolean {\n\tif (a === b) return true;\n\tif (!a || !b) return false;\n\tif (a.length !== b.length) return false;\n\treturn a.every((v, i) => v === b[i]);\n}\n\nfunction pythonSkillsMatch(a: BootstrapPythonSkill[] | undefined, b: readonly BootstrapPythonSkill[]): boolean {\n\tconst left = a ?? [];\n\tif (left.length !== b.length) return false;\n\treturn left.every((skill, index) => {\n\t\tconst expected = b[index];\n\t\treturn (\n\t\t\tskill.importName === expected.importName &&\n\t\t\tskill.packagePath === expected.packagePath &&\n\t\t\tskill.pyprojectPath === expected.pyprojectPath &&\n\t\t\tskill.pyprojectHash === expected.pyprojectHash\n\t\t);\n\t});\n}\n\nfunction bootstrapVersionCurrent(\n\tversion: BootstrapVersion | null,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): boolean {\n\treturn (\n\t\tversion !== null &&\n\t\tbootstrapBaseVersionCurrent(version, runtimeIdentity) &&\n\t\tpythonSkillsMatch(version.pythonSkills, pythonSkills)\n\t);\n}\n\nfunction bootstrapBaseVersionCurrent(version: BootstrapVersion | null, runtimeIdentity: string): boolean {\n\treturn (\n\t\tversion?.schema === BOOTSTRAP_SCHEMA &&\n\t\tversion.runtime === runtimeIdentity &&\n\t\tversion.snapshot === STATE_SNAPSHOT_REQUIREMENT &&\n\t\textraUvArgsMatch(version.extraUvArgs, DEFAULT_RLM_EXTRA_UV_ARGS)\n\t);\n}\n\nasync function writeBootstrapVersion(\n\tvenv: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<void> {\n\tconst version: BootstrapVersion = {\n\t\tschema: BOOTSTRAP_SCHEMA,\n\t\truntime: runtimeIdentity,\n\t\tsnapshot: STATE_SNAPSHOT_REQUIREMENT,\n\t\textraUvArgs: DEFAULT_RLM_EXTRA_UV_ARGS,\n\t\tpythonSkills: [...pythonSkills],\n\t};\n\tawait writeFile(path.join(venv, BOOTSTRAP_VERSION_FILE), `${JSON.stringify(version)}\\n`, \"utf8\");\n}\n\nfunction runtimeCandidateDirs(): string[] {\n\tconst moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\t// dist/asm-agent-runtime is listed first deliberately: it is the only path stable\n\t// across every shipped layout (dist/, dist/bundle/, bun), where import.meta.url-relative\n\t// resolution breaks. `npm run build` rebuilds it from live source (copy-assets does\n\t// rm -rf + cp), so the staleness hash still refreshes on every build. The relative\n\t// paths below cover running from source (tsx) where dist/ hasn't been built.\n\treturn [\n\t\tpath.join(getPackageDir(), \"dist\", \"asm-agent-runtime\"),\n\t\tpath.resolve(moduleDir, \"..\", \"..\", \"asm-agent-runtime\"),\n\t\tpath.resolve(moduleDir, \"..\", \"..\", \"..\", \"..\", \"..\", \"asm-agent-runtime\"),\n\t];\n}\n\nasync function resolveRuntimeSourceDir(): Promise<string | null> {\n\tfor (const candidate of runtimeCandidateDirs()) {\n\t\tif (await exists(path.join(candidate, \"pyproject.toml\"))) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\treturn null;\n}\n\n// Identity of the runtime to be installed. For a local source checkout this is a\n// content hash of every rlm/*.py file plus pyproject.toml, so any runtime code or\n// dependency change invalidates an existing venv automatically. Falls back to the\n// bare package name when the runtime resolves to a registry install (no local source).\nexport async function resolveRuntimeIdentity(): Promise<string> {\n\tconst sourceDir = await resolveRuntimeSourceDir();\n\tif (!sourceDir) return RUNTIME_REQUIREMENT;\n\treturn hashRuntimeSource(sourceDir);\n}\n\n// Throws if the local source can't be read. A failure here must surface rather than\n// fall back to RUNTIME_REQUIREMENT: that constant is the registry-install identity, and\n// recording it for a local checkout would permanently mask later source changes.\nasync function hashRuntimeSource(sourceDir: string): Promise<string> {\n\tconst rlmDir = path.join(sourceDir, \"src\", \"rlm\");\n\tconst files: string[] = [path.join(sourceDir, \"pyproject.toml\")];\n\tasync function collect(dir: string): Promise<void> {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tconst full = path.join(dir, entry.name);\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tawait collect(full);\n\t\t\t} else if (entry.isFile() && entry.name.endsWith(\".py\")) {\n\t\t\t\tfiles.push(full);\n\t\t\t}\n\t\t}\n\t}\n\tawait collect(rlmDir);\n\tfiles.sort();\n\tconst hash = createHash(\"sha256\");\n\tfor (const file of files) {\n\t\thash.update(path.relative(sourceDir, file));\n\t\thash.update(\"\\0\");\n\t\thash.update(await readFile(file));\n\t\thash.update(\"\\0\");\n\t}\n\treturn `sha256:${hash.digest(\"hex\")}`;\n}\n\nasync function bootstrapVenv(\n\tvenv: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n\toptions: EnsureKernelPythonOptions,\n): Promise<void> {\n\tawait mkdir(path.dirname(venv), { recursive: true });\n\tconst uv = await ensureUv(options);\n\tconst python = path.join(venv, \"bin\", \"python\");\n\tconst sourceDir = await resolveRuntimeSourceDir();\n\tconst runtimeRequirement = sourceDir ?? RUNTIME_REQUIREMENT;\n\tconst runtimeIdentity = await resolveRuntimeIdentity();\n\n\tawait run(uv, [\"python\", \"install\", PYTHON_VERSION]);\n\tawait run(uv, [\"venv\", venv, \"--python\", PYTHON_VERSION, \"--seed\"]);\n\tawait run(uv, [\n\t\t\"pip\",\n\t\t\"install\",\n\t\t\"--python\",\n\t\tpython,\n\t\truntimeRequirement,\n\t\tSTATE_SNAPSHOT_REQUIREMENT,\n\t\t...DEFAULT_RLM_EXTRA_UV_ARGS,\n\t]);\n\tawait syncPythonSkills(uv, venv, python, runtimeIdentity, pythonSkills, options);\n}\n\nasync function syncPythonSkills(\n\tuv: string,\n\tvenv: string,\n\tpython: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n\toptions: EnsureKernelPythonOptions,\n): Promise<void> {\n\tconst version = await readBootstrapVersion(venv);\n\tconst installedPythonSkills: BootstrapPythonSkill[] = [];\n\tconst currentPythonSkills = new Map(\n\t\t(version?.pythonSkills ?? []).map((skill) => [`${skill.importName}\\0${skill.packagePath}`, skill]),\n\t);\n\tconst pythonSkillsByProjectName = new Map(\n\t\tpythonSkills.map((skill) => [readPythonSkillProjectName(skill).replaceAll(\"_\", \"-\").toLowerCase(), skill]),\n\t);\n\tconst dependenciesBySkill = new Map(\n\t\tpythonSkills.map((skill) => [\n\t\t\tskill,\n\t\t\t[...readPythonSkillDependencyNames(skill)]\n\t\t\t\t.map(\n\t\t\t\t\t(dependencyName) =>\n\t\t\t\t\t\tpythonSkillsByProjectName.get(dependencyName) ??\n\t\t\t\t\t\tresolveSiblingPythonSkillDependency(skill, dependencyName),\n\t\t\t\t)\n\t\t\t\t.filter((dependency): dependency is BootstrapPythonSkill => Boolean(dependency)),\n\t\t]),\n\t);\n\n\tfor (const skill of sortPythonSkillsForInstall(pythonSkills)) {\n\t\tconst existingSkill = currentPythonSkills.get(`${skill.importName}\\0${skill.packagePath}`);\n\t\tif (existingSkill?.pyprojectPath === skill.pyprojectPath && existingSkill.pyprojectHash === skill.pyprojectHash) {\n\t\t\tinstalledPythonSkills.push(skill);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst localDependencies = dependenciesBySkill.get(skill) ?? [];\n\t\tconst localDependencyArgs = localDependencies\n\t\t\t.filter((dependency) => {\n\t\t\t\tconst installedDependency = currentPythonSkills.get(`${dependency.importName}\\0${dependency.packagePath}`);\n\t\t\t\tconst installedThisSync = installedPythonSkills.some(\n\t\t\t\t\t(installed) =>\n\t\t\t\t\t\tinstalled.importName === dependency.importName &&\n\t\t\t\t\t\tinstalled.packagePath === dependency.packagePath &&\n\t\t\t\t\t\tinstalled.pyprojectPath === dependency.pyprojectPath &&\n\t\t\t\t\t\tinstalled.pyprojectHash === dependency.pyprojectHash,\n\t\t\t\t);\n\t\t\t\treturn !(\n\t\t\t\t\tinstalledThisSync ||\n\t\t\t\t\t(installedDependency?.pyprojectPath === dependency.pyprojectPath &&\n\t\t\t\t\t\tinstalledDependency.pyprojectHash === dependency.pyprojectHash)\n\t\t\t\t);\n\t\t\t})\n\t\t\t.flatMap(formatPythonSkillInstallArgs);\n\n\t\ttry {\n\t\t\tawait run(uv, [\n\t\t\t\t\"pip\",\n\t\t\t\t\"install\",\n\t\t\t\t\"--python\",\n\t\t\t\tpython,\n\t\t\t\t...formatPythonSkillInstallArgs(skill),\n\t\t\t\t...localDependencyArgs,\n\t\t\t]);\n\t\t\tinstalledPythonSkills.push(\n\t\t\t\tskill,\n\t\t\t\t...localDependencies.filter((dependency) => !installedPythonSkills.includes(dependency)),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treportProgress(\n\t\t\t\toptions,\n\t\t\t\t`Warning: Python skill ${skill.importName} failed to install and will be unavailable: ${errorMessage(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\tawait writeBootstrapVersion(venv, runtimeIdentity, installedPythonSkills);\n}\n\nasync function kernelBaseReady(python: string, venv: string, runtimeIdentity: string): Promise<boolean> {\n\treturn (\n\t\t(await hasAsmAgentRuntime(python)) &&\n\t\tbootstrapBaseVersionCurrent(await readBootstrapVersion(venv), runtimeIdentity)\n\t);\n}\n\nasync function kernelReady(\n\tpython: string,\n\tvenv: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<boolean> {\n\treturn (\n\t\t(await hasAsmAgentRuntime(python)) &&\n\t\tbootstrapVersionCurrent(await readBootstrapVersion(venv), runtimeIdentity, pythonSkills)\n\t);\n}\n\nfunction formatBootstrapFailure(error: unknown): Error {\n\treturn new Error(\n\t\t`Failed to set up the Python kernel runtime. ${errorMessage(error)}\\n` +\n\t\t\t\"First-time setup needs internet to install uv, Python, asm-agent-runtime, and default Python packages; once set up, asm-agent runs offline. \" +\n\t\t\t\"Set ASM_AGENT_KERNEL_PYTHON to a Python with a current asm-agent-runtime and default Python packages installed to skip auto-bootstrap.\",\n\t);\n}\n\nasync function ensureKernelPythonUncached(\n\toptions: EnsureKernelPythonOptions,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<string> {\n\tconst override = process.env.ASM_AGENT_KERNEL_PYTHON;\n\tif (override) {\n\t\tconst python = path.resolve(expandHome(override));\n\t\tconst missing: string[] = [];\n\t\tif (!(await hasAsmAgentRuntime(python))) {\n\t\t\tmissing.push(\n\t\t\t\t\"a current asm-agent-runtime with callable rlm.run, rlm.host_request, and explicit harness CRUD methods\",\n\t\t\t);\n\t\t}\n\t\tif (missing.length === 0) {\n\t\t\tconst missingExtraImports = await missingRlmExtraImportLabels(python);\n\t\t\tif (missingExtraImports.length > 0) {\n\t\t\t\tmissing.push(`default Python packages (${missingExtraImports.join(\", \")})`);\n\t\t\t}\n\t\t}\n\t\tif (missing.length === 0 && pythonSkills.length > 0) {\n\t\t\tconst missingPythonSkills = await missingPythonSkillImportLabels(python, options.pythonSkills ?? []);\n\t\t\tif (missingPythonSkills.length > 0) {\n\t\t\t\treportProgress(\n\t\t\t\t\toptions,\n\t\t\t\t\t`Warning: Python skills unavailable in ASM_AGENT_KERNEL_PYTHON and will be disabled: ${missingPythonSkills.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (missing.length === 0) return python;\n\t\tthrow new Error(`ASM_AGENT_KERNEL_PYTHON points to a Python missing ${missing.join(\" and \")}: ${python}`);\n\t}\n\n\tconst venv = await resolveWritableKernelVenvDir();\n\tconst python = path.join(venv, \"bin\", \"python\");\n\tconst runtimeIdentity = await resolveRuntimeIdentity();\n\tif (await kernelReady(python, venv, runtimeIdentity, pythonSkills)) return python;\n\n\tconst releaseLock = await acquireBootstrapLock(venv);\n\ttry {\n\t\tif (await kernelReady(python, venv, runtimeIdentity, pythonSkills)) return python;\n\t\tif (await kernelBaseReady(python, venv, runtimeIdentity)) {\n\t\t\tawait syncPythonSkills(await ensureUv(options), venv, python, runtimeIdentity, pythonSkills, options);\n\t\t\treturn python;\n\t\t}\n\n\t\tconst hadVenv = existsSync(venv);\n\t\treportProgress(options, \"› setting up python kernel (one-time, ~30s)…\");\n\t\tif (hadVenv) {\n\t\t\treportProgress(options, \"rebuilding kernel venv\");\n\t\t\tawait rm(venv, { recursive: true, force: true });\n\t\t}\n\n\t\tawait bootstrapVenv(venv, pythonSkills, options);\n\t} catch (error) {\n\t\tthrow formatBootstrapFailure(error);\n\t} finally {\n\t\tawait releaseLock().catch(() => undefined);\n\t}\n\n\treportProgress(options, \"✓ ready\");\n\treturn python;\n}\n\nexport function ensureKernelPython(options: EnsureKernelPythonOptions = {}): Promise<string> {\n\tconst pythonSkills = normalizePythonSkills(options.pythonSkills);\n\tconst key = ensureKernelPythonKey(pythonSkills);\n\tif (inFlightEnsureKernelPython?.key === key) return inFlightEnsureKernelPython.promise;\n\n\tconst promise = ensureKernelPythonUncached(options, pythonSkills).finally(() => {\n\t\tif (inFlightEnsureKernelPython?.promise === promise) inFlightEnsureKernelPython = null;\n\t});\n\tinFlightEnsureKernelPython = { key, promise };\n\treturn promise;\n}\n"]}
@@ -48,7 +48,7 @@ const REQUIRED_HARNESS_METHODS = [
48
48
  "delete_prompt_note",
49
49
  "record_refinement",
50
50
  ];
51
- const RUNTIME_READY_CHECK = `import inspect; import rlm; from rlm import McpIntegration; import rlm.mcp as mcp; from rlm.harness import HarnessEntry; _harness_methods = ${JSON.stringify(REQUIRED_HARNESS_METHODS)}; assert callable(mcp.list_tools); assert callable(mcp.call_tool); assert hasattr(rlm, 'run'); assert callable(rlm); assert hasattr(rlm, 'rlm'); assert callable(rlm.rlm); assert callable(rlm.host_request); assert callable(rlm.find_models); assert callable(rlm.rlm.find_models); assert hasattr(rlm, 'harness'); assert hasattr(rlm, 'get_harness_state'); assert hasattr(rlm.rlm, 'harness'); assert hasattr(rlm.rlm, 'get_harness_state'); assert all(callable(getattr(_harness, _method, None)) for _harness in (rlm.harness, rlm.rlm.harness) for _method in _harness_methods); assert 'reference' in HarnessEntry.__dataclass_fields__; assert 'scope' in HarnessEntry.__dataclass_fields__; assert 'reference' in inspect.signature(rlm.harness.create_skill).parameters; assert 'reference' in inspect.signature(rlm.harness.update_skill).parameters; assert 'global_' in inspect.signature(rlm.harness.create_memory).parameters; assert 'global_' in inspect.signature(rlm.get_harness_state).parameters; assert not hasattr(rlm, 'background'); assert not hasattr(rlm.rlm, 'background'); from rlm.bash import BashHandle, BashResult; assert callable(rlm.bash); assert all(callable(getattr(BashHandle, _m, None)) for _m in ('tail', 'output', 'poll', 'kill')); assert {'exit_code', 'output', 'duration'} <= set(BashResult.__dataclass_fields__); import rlm.repl as _repl; assert callable(_repl.main); assert callable(_repl.emit); assert callable(_repl.host_request); assert callable(_repl.is_active); assert _repl.PROTOCOL_VERSION == 2; assert callable(rlm.emit); assert not hasattr(rlm, 'HOST_COMM_TARGET'); assert not hasattr(mcp, 'install_shutdown_hook')`;
51
+ const RUNTIME_READY_CHECK = `import inspect; import rlm; from rlm import McpIntegration; import rlm.mcp as mcp; from rlm.harness import HarnessEntry; _harness_methods = ${JSON.stringify(REQUIRED_HARNESS_METHODS)}; assert callable(mcp.list_tools); assert callable(mcp.call_tool); assert hasattr(rlm, 'run'); assert callable(rlm); assert hasattr(rlm, 'rlm'); assert callable(rlm.rlm); assert callable(rlm.host_request); assert callable(rlm.find_models); assert callable(rlm.rlm.find_models); assert hasattr(rlm, 'harness'); assert hasattr(rlm, 'get_harness_state'); assert hasattr(rlm.rlm, 'harness'); assert hasattr(rlm.rlm, 'get_harness_state'); assert all(callable(getattr(_harness, _method, None)) for _harness in (rlm.harness, rlm.rlm.harness) for _method in _harness_methods); assert 'reference' in HarnessEntry.__dataclass_fields__; assert 'scope' in HarnessEntry.__dataclass_fields__; assert 'reference' in inspect.signature(rlm.harness.create_skill).parameters; assert 'reference' in inspect.signature(rlm.harness.update_skill).parameters; assert 'global_' in inspect.signature(rlm.harness.create_memory).parameters; assert 'global_' in inspect.signature(rlm.get_harness_state).parameters; assert not hasattr(rlm, 'background'); assert not hasattr(rlm.rlm, 'background'); from rlm.bash import BashHandle, BashResult; assert callable(rlm.bash); assert all(callable(getattr(BashHandle, _m, None)) for _m in ('tail', 'output', 'poll', 'kill')); assert {'exit_code', 'output', 'duration'} <= set(BashResult.__dataclass_fields__); import rlm.repl as _repl; assert callable(_repl.main); assert callable(_repl.emit); assert callable(_repl.host_request); assert callable(_repl.is_active); assert _repl.PROTOCOL_VERSION == 3; assert callable(rlm.emit); assert not hasattr(rlm, 'HOST_COMM_TARGET'); assert not hasattr(mcp, 'install_shutdown_hook')`;
52
52
  const BOOTSTRAP_VERSION_FILE = ".bootstrap-version";
53
53
  const BOOTSTRAP_LOCK_NAME = ".bootstrap.lock";
54
54
  const BOOTSTRAP_LOCK_RETRY_MS = 100;
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/core/kernel/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { constants, existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { access, mkdir, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { stderr, stdin } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { getPackageDir } from \"../../config.js\";\nimport type { PythonSkillRuntimeInfo } from \"../skills.js\";\n\nconst BOOTSTRAP_SCHEMA = 9;\nconst PYTHON_VERSION = \"3.12\";\nconst RUNTIME_REQUIREMENT = \"asm-agent-runtime\";\n// Serializes the kernel's user namespace so it can be revived across session\n// resume. Internal-only; intentionally not surfaced to the model as an import.\nconst STATE_SNAPSHOT_REQUIREMENT = \"dill\";\nconst DEFAULT_RLM_EXTRA_PACKAGES = [\n\t{ uvArg: \"requests\", importName: \"requests\", promptLabel: \"requests\" },\n\t{ uvArg: \"httpx\", importName: \"httpx\", promptLabel: \"httpx\" },\n\t{ uvArg: \"pyyaml\", importName: \"yaml\", promptLabel: \"yaml (PyYAML)\" },\n\t{ uvArg: \"tomli\", importName: \"tomli\", promptLabel: \"tomli\" },\n\t{ uvArg: \"python-dotenv\", importName: \"dotenv\", promptLabel: \"dotenv (python-dotenv)\" },\n\t{ uvArg: \"pandas\", importName: \"pandas\", promptLabel: \"pandas\" },\n\t{ uvArg: \"numpy\", importName: \"numpy\", promptLabel: \"numpy\" },\n\t{ uvArg: \"scipy\", importName: \"scipy\", promptLabel: \"scipy\" },\n\t{ uvArg: \"beautifulsoup4\", importName: \"bs4\", promptLabel: \"bs4 (Beautiful Soup)\" },\n\t{ uvArg: \"lxml\", importName: \"lxml\", promptLabel: \"lxml\" },\n\t{ uvArg: \"pydantic\", importName: \"pydantic\", promptLabel: \"pydantic\" },\n\t{ uvArg: \"tyro\", importName: \"tyro\", promptLabel: \"tyro\" },\n];\nexport const DEFAULT_RLM_EXTRA_UV_ARGS = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.uvArg);\nexport const DEFAULT_RLM_EXTRA_IMPORT_NAMES = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.importName);\nexport const DEFAULT_RLM_EXTRA_IMPORT_LABELS = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.promptLabel);\nconst UV_INSTALL_COMMAND = \"curl -LsSf https://astral.sh/uv/install.sh | sh\";\nconst REQUIRED_HARNESS_METHODS = [\n\t\"create_memory\",\n\t\"update_memory\",\n\t\"delete_memory\",\n\t\"create_skill\",\n\t\"update_skill\",\n\t\"delete_skill\",\n\t\"create_subagent\",\n\t\"update_subagent\",\n\t\"delete_subagent\",\n\t\"create_prompt_note\",\n\t\"update_prompt_note\",\n\t\"delete_prompt_note\",\n\t\"record_refinement\",\n];\nconst RUNTIME_READY_CHECK = `import inspect; import rlm; from rlm import McpIntegration; import rlm.mcp as mcp; from rlm.harness import HarnessEntry; _harness_methods = ${JSON.stringify(REQUIRED_HARNESS_METHODS)}; assert callable(mcp.list_tools); assert callable(mcp.call_tool); assert hasattr(rlm, 'run'); assert callable(rlm); assert hasattr(rlm, 'rlm'); assert callable(rlm.rlm); assert callable(rlm.host_request); assert callable(rlm.find_models); assert callable(rlm.rlm.find_models); assert hasattr(rlm, 'harness'); assert hasattr(rlm, 'get_harness_state'); assert hasattr(rlm.rlm, 'harness'); assert hasattr(rlm.rlm, 'get_harness_state'); assert all(callable(getattr(_harness, _method, None)) for _harness in (rlm.harness, rlm.rlm.harness) for _method in _harness_methods); assert 'reference' in HarnessEntry.__dataclass_fields__; assert 'scope' in HarnessEntry.__dataclass_fields__; assert 'reference' in inspect.signature(rlm.harness.create_skill).parameters; assert 'reference' in inspect.signature(rlm.harness.update_skill).parameters; assert 'global_' in inspect.signature(rlm.harness.create_memory).parameters; assert 'global_' in inspect.signature(rlm.get_harness_state).parameters; assert not hasattr(rlm, 'background'); assert not hasattr(rlm.rlm, 'background'); from rlm.bash import BashHandle, BashResult; assert callable(rlm.bash); assert all(callable(getattr(BashHandle, _m, None)) for _m in ('tail', 'output', 'poll', 'kill')); assert {'exit_code', 'output', 'duration'} <= set(BashResult.__dataclass_fields__); import rlm.repl as _repl; assert callable(_repl.main); assert callable(_repl.emit); assert callable(_repl.host_request); assert callable(_repl.is_active); assert _repl.PROTOCOL_VERSION == 2; assert callable(rlm.emit); assert not hasattr(rlm, 'HOST_COMM_TARGET'); assert not hasattr(mcp, 'install_shutdown_hook')`;\nconst BOOTSTRAP_VERSION_FILE = \".bootstrap-version\";\nconst BOOTSTRAP_LOCK_NAME = \".bootstrap.lock\";\nconst BOOTSTRAP_LOCK_RETRY_MS = 100;\nconst BOOTSTRAP_LOCK_STALE_WITHOUT_PID_MS = 30_000;\n\nlet inFlightEnsureKernelPython: { key: string; promise: Promise<string> } | null = null;\n\nexport type KernelPythonSkill = PythonSkillRuntimeInfo;\nexport type KernelBootstrapProgressHandler = (message: string) => void;\n\nexport interface EnsureKernelPythonOptions {\n\tpythonSkills?: readonly KernelPythonSkill[];\n\tonProgress?: KernelBootstrapProgressHandler;\n}\n\ninterface BootstrapPythonSkill {\n\timportName: string;\n\tpackagePath: string;\n\tpyprojectPath: string;\n\tpyprojectHash: string;\n}\n\ninterface BootstrapVersion {\n\tschema: number;\n\truntime?: string;\n\tsnapshot?: string;\n\textraUvArgs?: string[];\n\tpythonSkills?: BootstrapPythonSkill[];\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n\treturn error instanceof Error && \"code\" in error && error.code === code;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n\ttry {\n\t\tawait access(filePath);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function isExecutable(filePath: string): Promise<boolean> {\n\ttry {\n\t\tawait access(filePath, constants.X_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction expandHome(filePath: string): string {\n\tif (filePath === \"~\") return os.homedir();\n\tif (filePath.startsWith(\"~/\")) return path.join(os.homedir(), filePath.slice(2));\n\treturn filePath;\n}\n\nfunction fileContentHash(filePath: string): string {\n\ttry {\n\t\treturn `sha256:${createHash(\"sha256\").update(readFileSync(filePath)).digest(\"hex\")}`;\n\t} catch {\n\t\treturn \"unreadable\";\n\t}\n}\n\nfunction normalizePythonSkills(pythonSkills: readonly KernelPythonSkill[] | undefined): BootstrapPythonSkill[] {\n\tconst byKey = new Map<string, BootstrapPythonSkill>();\n\tconst addSkill = (skill: Pick<KernelPythonSkill, \"importName\" | \"packagePath\" | \"pyprojectPath\">): void => {\n\t\tconst packagePath = path.resolve(skill.packagePath);\n\t\tconst pyprojectPath = path.resolve(skill.pyprojectPath);\n\t\tconst key = `${skill.importName}\\0${packagePath}`;\n\t\tif (byKey.has(key)) {\n\t\t\treturn;\n\t\t}\n\t\tconst bootstrapSkill: BootstrapPythonSkill = {\n\t\t\timportName: skill.importName,\n\t\t\tpackagePath,\n\t\t\tpyprojectPath,\n\t\t\tpyprojectHash: fileContentHash(pyprojectPath),\n\t\t};\n\t\tbyKey.set(key, bootstrapSkill);\n\t\tfor (const dependencyName of readPythonSkillDependencyNames(bootstrapSkill)) {\n\t\t\tconst siblingDependency = resolveSiblingPythonSkillDependency(bootstrapSkill, dependencyName);\n\t\t\tif (siblingDependency) {\n\t\t\t\taddSkill(siblingDependency);\n\t\t\t}\n\t\t}\n\t};\n\tfor (const skill of pythonSkills ?? []) {\n\t\taddSkill(skill);\n\t}\n\treturn [...byKey.values()].sort((a, b) => {\n\t\tconst packageCompare = a.packagePath.localeCompare(b.packagePath);\n\t\tif (packageCompare !== 0) return packageCompare;\n\t\treturn a.importName.localeCompare(b.importName);\n\t});\n}\n\nfunction readTomlProjectSection(pyprojectPath: string): string | undefined {\n\ttry {\n\t\tconst text = readFileSync(pyprojectPath, \"utf-8\");\n\t\tconst match = text.match(/^\\s*\\[project\\]\\s*$/m);\n\t\tif (!match || match.index === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst sectionStart = match.index + match[0].length;\n\t\tconst rest = text.slice(sectionStart);\n\t\tconst nextSection = rest.search(/^\\s*\\[/m);\n\t\treturn nextSection >= 0 ? rest.slice(0, nextSection) : rest;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction readPythonSkillProjectName(skill: BootstrapPythonSkill): string {\n\tconst projectSection = readTomlProjectSection(skill.pyprojectPath);\n\tconst name = projectSection?.match(/^\\s*name\\s*=\\s*[\"']([^\"']+)[\"']/m)?.[1];\n\treturn name?.trim() || skill.importName.replaceAll(\"_\", \"-\");\n}\n\nfunction parseDependencyPackageName(dependency: string): string | undefined {\n\tconst withoutMarker = dependency.split(\";\")[0]?.trim() ?? \"\";\n\tif (!withoutMarker) {\n\t\treturn undefined;\n\t}\n\tconst match = withoutMarker.match(/^([A-Za-z0-9_.-]+)/);\n\treturn match?.[1]?.replaceAll(\"_\", \"-\").toLowerCase();\n}\n\nfunction findTomlArrayEnd(text: string, startIndex: number): number {\n\tlet inQuote: '\"' | \"'\" | undefined;\n\tlet escaped = false;\n\tfor (let index = startIndex; index < text.length; index++) {\n\t\tconst char = text[index];\n\t\tif (inQuote) {\n\t\t\tif (escaped) {\n\t\t\t\tescaped = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === \"\\\\\") {\n\t\t\t\tescaped = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === inQuote) {\n\t\t\t\tinQuote = undefined;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' || char === \"'\") {\n\t\t\tinQuote = char;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"]\") {\n\t\t\treturn index;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction readPythonSkillDependencyNames(skill: BootstrapPythonSkill): Set<string> {\n\tconst projectSection = readTomlProjectSection(skill.pyprojectPath);\n\tif (!projectSection) {\n\t\treturn new Set();\n\t}\n\tconst dependenciesStart = projectSection.search(/^\\s*dependencies\\s*=\\s*\\[/m);\n\tif (dependenciesStart < 0) {\n\t\treturn new Set();\n\t}\n\tconst arrayStart = projectSection.indexOf(\"[\", dependenciesStart);\n\tif (arrayStart < 0) {\n\t\treturn new Set();\n\t}\n\tconst arrayEnd = findTomlArrayEnd(projectSection, arrayStart + 1);\n\tif (arrayEnd < 0) {\n\t\treturn new Set();\n\t}\n\tconst dependenciesArray = projectSection.slice(arrayStart, arrayEnd + 1);\n\tconst dependencies = new Set<string>();\n\tconst dependencyPattern = /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'/g;\n\tfor (const match of dependenciesArray.matchAll(dependencyPattern)) {\n\t\tconst dependency = (match[1] ?? match[2] ?? \"\").replaceAll('\\\\\"', '\"').replaceAll(\"\\\\'\", \"'\");\n\t\tconst name = parseDependencyPackageName(dependency);\n\t\tif (name) {\n\t\t\tdependencies.add(name);\n\t\t}\n\t}\n\treturn dependencies;\n}\n\nfunction resolveSiblingPythonSkillDependency(\n\tskill: BootstrapPythonSkill,\n\tdependencyName: string,\n): BootstrapPythonSkill | undefined {\n\tconst siblingsDir = path.dirname(skill.packagePath);\n\tfor (const entry of readdirSync(siblingsDir, { withFileTypes: true })) {\n\t\tif (!entry.isDirectory()) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst packagePath = path.join(siblingsDir, entry.name);\n\t\tconst pyprojectPath = path.join(packagePath, \"pyproject.toml\");\n\t\tif (!existsSync(pyprojectPath)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst dependency: BootstrapPythonSkill = {\n\t\t\timportName: entry.name.replaceAll(\"-\", \"_\"),\n\t\t\tpackagePath,\n\t\t\tpyprojectPath,\n\t\t\tpyprojectHash: fileContentHash(pyprojectPath),\n\t\t};\n\t\tif (readPythonSkillProjectName(dependency).replaceAll(\"_\", \"-\").toLowerCase() === dependencyName) {\n\t\t\treturn dependency;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction sortPythonSkillsForInstall(pythonSkills: readonly BootstrapPythonSkill[]): BootstrapPythonSkill[] {\n\tconst byProjectName = new Map<string, BootstrapPythonSkill>();\n\tconst originalIndex = new Map<BootstrapPythonSkill, number>();\n\tfor (const [index, skill] of pythonSkills.entries()) {\n\t\toriginalIndex.set(skill, index);\n\t\tbyProjectName.set(readPythonSkillProjectName(skill).replaceAll(\"_\", \"-\").toLowerCase(), skill);\n\t}\n\n\tconst dependenciesBySkill = new Map<BootstrapPythonSkill, BootstrapPythonSkill[]>();\n\tfor (const skill of pythonSkills) {\n\t\tdependenciesBySkill.set(\n\t\t\tskill,\n\t\t\t[...readPythonSkillDependencyNames(skill)]\n\t\t\t\t.map(\n\t\t\t\t\t(dependencyName) =>\n\t\t\t\t\t\tbyProjectName.get(dependencyName) ?? resolveSiblingPythonSkillDependency(skill, dependencyName),\n\t\t\t\t)\n\t\t\t\t.filter((dependency): dependency is BootstrapPythonSkill => Boolean(dependency)),\n\t\t);\n\t}\n\n\tconst pending = new Set(pythonSkills);\n\tconst sorted: BootstrapPythonSkill[] = [];\n\twhile (pending.size > 0) {\n\t\tlet progressed = false;\n\t\tfor (const skill of [...pending].sort((a, b) => (originalIndex.get(a) ?? 0) - (originalIndex.get(b) ?? 0))) {\n\t\t\tconst dependencies = dependenciesBySkill.get(skill) ?? [];\n\t\t\tif (dependencies.some((dependency) => pending.has(dependency))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsorted.push(skill);\n\t\t\tpending.delete(skill);\n\t\t\tprogressed = true;\n\t\t}\n\t\tif (!progressed) {\n\t\t\t// Cyclic local skill dependencies cannot be topologically ordered; keep a\n\t\t\t// deterministic order and let uv surface the packaging error if needed.\n\t\t\tsorted.push(...[...pending].sort((a, b) => a.packagePath.localeCompare(b.packagePath)));\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn sorted;\n}\n\nfunction formatPythonSkillInstallArgs(skill: BootstrapPythonSkill): string[] {\n\treturn [\"--editable\", skill.packagePath];\n}\n\nfunction ensureKernelPythonKey(pythonSkills: readonly BootstrapPythonSkill[]): string {\n\treturn [\n\t\tprocess.env.ASM_AGENT_KERNEL_PYTHON ?? \"\",\n\t\tprocess.env.ASM_AGENT_KERNEL_VENV ?? \"\",\n\t\tprocess.env.HOME ?? \"\",\n\t\tprocess.env.XDG_DATA_HOME ?? \"\",\n\t\tJSON.stringify(pythonSkills),\n\t].join(\"\\0\");\n}\n\nexport function getKernelVenvDir(): string {\n\tconst override = process.env.ASM_AGENT_KERNEL_VENV;\n\tif (override) return path.resolve(expandHome(override));\n\treturn path.join(os.homedir(), \".asm-agent\", \"kernel-venv\");\n}\n\nfunction getXdgKernelVenvDir(): string {\n\tconst dataHome = process.env.XDG_DATA_HOME\n\t\t? path.resolve(expandHome(process.env.XDG_DATA_HOME))\n\t\t: path.join(os.homedir(), \".local\", \"share\");\n\treturn path.join(dataHome, \"asm-agent\", \"kernel-venv\");\n}\n\nasync function resolveWritableKernelVenvDir(): Promise<string> {\n\tconst primary = getKernelVenvDir();\n\ttry {\n\t\tawait mkdir(path.dirname(primary), { recursive: true });\n\t\treturn primary;\n\t} catch (primaryError) {\n\t\tif (process.env.ASM_AGENT_KERNEL_VENV) {\n\t\t\tthrow new Error(`couldn't create kernel venv parent directory for ${primary}: ${errorMessage(primaryError)}`);\n\t\t}\n\n\t\tconst fallback = getXdgKernelVenvDir();\n\t\ttry {\n\t\t\tawait mkdir(path.dirname(fallback), { recursive: true });\n\t\t\treturn fallback;\n\t\t} catch (fallbackError) {\n\t\t\tthrow new Error(\n\t\t\t\t`couldn't create kernel venv directory at ${primary} or ${fallback}; set ASM_AGENT_KERNEL_PYTHON to a python with a current asm-agent-runtime installed. ${errorMessage(fallbackError)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction run(command: string, args: string[], options: { stdio?: \"ignore\" | \"inherit\" } = {}): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tenv: process.env,\n\t\t\tstdio: options.stdio ?? \"ignore\",\n\t\t});\n\t\tchild.on(\"error\", reject);\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst reason = signal ? `signal ${signal}` : `exit code ${code}`;\n\t\t\treject(new Error(`${command} ${args.join(\" \")} failed with ${reason}`));\n\t\t});\n\t});\n}\n\nasync function pythonImports(python: string, moduleName: string): Promise<boolean> {\n\ttry {\n\t\tawait run(python, [\"-c\", `import ${moduleName}`], { stdio: \"ignore\" });\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function hasAsmAgentRuntime(python: string): Promise<boolean> {\n\ttry {\n\t\tawait run(python, [\"-c\", RUNTIME_READY_CHECK], { stdio: \"ignore\" });\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function missingRlmExtraImportLabels(python: string): Promise<string[]> {\n\tconst missing: string[] = [];\n\tfor (const pkg of DEFAULT_RLM_EXTRA_PACKAGES) {\n\t\tif (!(await pythonImports(python, pkg.importName))) {\n\t\t\tmissing.push(pkg.promptLabel);\n\t\t}\n\t}\n\treturn missing;\n}\n\nasync function missingPythonSkillImportLabels(\n\tpython: string,\n\tpythonSkills: readonly KernelPythonSkill[],\n): Promise<string[]> {\n\tconst missing: string[] = [];\n\tfor (const skill of pythonSkills) {\n\t\tif (!(await pythonImports(python, skill.importName))) {\n\t\t\tmissing.push(`${skill.name} (${skill.importName})`);\n\t\t}\n\t}\n\treturn missing;\n}\n\nfunction reportProgress(options: EnsureKernelPythonOptions, message: string): void {\n\tif (options.onProgress) {\n\t\toptions.onProgress(message);\n\t\treturn;\n\t}\n\tprocess.stderr.write(`${message}\\n`);\n}\n\nfunction bootstrapLockDir(venv: string): string {\n\treturn path.join(path.dirname(venv), `${path.basename(venv)}${BOOTSTRAP_LOCK_NAME}`);\n}\n\nfunction processIsRunning(pid: number): boolean {\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn isNodeError(error, \"EPERM\");\n\t}\n}\n\nasync function readLockPid(lockDir: string): Promise<number | null> {\n\ttry {\n\t\tconst raw = await readFile(path.join(lockDir, \"pid\"), \"utf8\");\n\t\tconst pid = Number.parseInt(raw.trim(), 10);\n\t\treturn Number.isInteger(pid) && pid > 0 ? pid : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function lockMissingPidIsStale(lockDir: string): Promise<boolean> {\n\ttry {\n\t\tconst lockStat = await stat(lockDir);\n\t\treturn Date.now() - lockStat.mtimeMs > BOOTSTRAP_LOCK_STALE_WITHOUT_PID_MS;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function acquireBootstrapLock(venv: string): Promise<() => Promise<void>> {\n\tconst lockDir = bootstrapLockDir(venv);\n\tawait mkdir(path.dirname(lockDir), { recursive: true });\n\n\tfor (;;) {\n\t\ttry {\n\t\t\tawait mkdir(lockDir);\n\t\t\tawait writeFile(path.join(lockDir, \"pid\"), `${process.pid}\\n`, \"utf8\");\n\t\t\treturn () => rm(lockDir, { recursive: true, force: true });\n\t\t} catch (error) {\n\t\t\tif (!isNodeError(error, \"EEXIST\")) throw error;\n\n\t\t\tconst pid = await readLockPid(lockDir);\n\t\t\tif (pid === null ? await lockMissingPidIsStale(lockDir) : !processIsRunning(pid)) {\n\t\t\t\tawait rm(lockDir, { recursive: true, force: true });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tawait sleep(BOOTSTRAP_LOCK_RETRY_MS);\n\t\t}\n\t}\n}\n\nasync function findExecutable(name: string): Promise<string | null> {\n\tconst pathValue = process.env.PATH;\n\tif (!pathValue) return null;\n\tconst candidates = process.platform === \"win32\" ? [name, `${name}.exe`] : [name];\n\tfor (const dir of pathValue.split(path.delimiter)) {\n\t\tif (!dir) continue;\n\t\tfor (const candidate of candidates) {\n\t\t\tconst fullPath = path.join(dir, candidate);\n\t\t\tif (await isExecutable(fullPath)) return fullPath;\n\t\t}\n\t}\n\treturn null;\n}\n\nasync function ensureUv(options: EnsureKernelPythonOptions): Promise<string> {\n\tconst fromPath = await findExecutable(\"uv\");\n\tif (fromPath) return fromPath;\n\n\tconst localUv = path.join(os.homedir(), \".local\", \"bin\", process.platform === \"win32\" ? \"uv.exe\" : \"uv\");\n\tif (await isExecutable(localUv)) return localUv;\n\n\tconst shouldInstallUv =\n\t\tprocess.env.ASM_AGENT_INSTALL_UV === \"1\" || (!options.onProgress && (await confirmUvInstall()));\n\tif (!shouldInstallUv) {\n\t\tthrow new Error(\n\t\t\t`uv is required to set up the Python kernel. Install uv yourself: ${UV_INSTALL_COMMAND}, ` +\n\t\t\t\t\"or set ASM_AGENT_INSTALL_UV=1 to let asm-agent run that installer.\",\n\t\t);\n\t}\n\n\treportProgress(options, \"› installing uv (one-time)…\");\n\ttry {\n\t\tawait run(\"sh\", [\"-c\", UV_INSTALL_COMMAND], { stdio: options.onProgress ? \"ignore\" : \"inherit\" });\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`couldn't install uv from astral.sh; install it yourself: ${UV_INSTALL_COMMAND}, then re-run asm-agent. ${errorMessage(error)}`,\n\t\t);\n\t}\n\n\tif (await isExecutable(localUv)) return localUv;\n\tconst installedFromPath = await findExecutable(\"uv\");\n\tif (installedFromPath) return installedFromPath;\n\tthrow new Error(\"uv install completed but binary not found at ~/.local/bin/uv\");\n}\n\nasync function confirmUvInstall(): Promise<boolean> {\n\tif (process.env.ASM_AGENT_INSTALL_UV === \"0\") return false;\n\tif (!stdin.isTTY || !stderr.isTTY) return false;\n\n\tconst rl = createInterface({ input: stdin, output: stderr });\n\ttry {\n\t\tconst answer = (await rl.question(\"ASM Agent needs uv to set up Python. Install uv from astral.sh now? [Y/n] \"))\n\t\t\t.trim()\n\t\t\t.toLowerCase();\n\t\treturn answer !== \"n\" && answer !== \"no\";\n\t} finally {\n\t\trl.close();\n\t}\n}\n\nasync function readBootstrapVersion(venv: string): Promise<BootstrapVersion | null> {\n\ttry {\n\t\tconst raw = await readFile(path.join(venv, BOOTSTRAP_VERSION_FILE), \"utf8\");\n\t\tconst parsed: unknown = JSON.parse(raw);\n\t\tif (!isRecord(parsed) || typeof parsed.schema !== \"number\") return null;\n\t\tconst extraUvArgs =\n\t\t\tArray.isArray(parsed.extraUvArgs) &&\n\t\t\tparsed.extraUvArgs.every((v: unknown): v is string => typeof v === \"string\")\n\t\t\t\t? (parsed.extraUvArgs as string[])\n\t\t\t\t: undefined;\n\t\tlet pythonSkills: BootstrapPythonSkill[] | undefined;\n\t\tif (Array.isArray(parsed.pythonSkills)) {\n\t\t\tif (\n\t\t\t\t!parsed.pythonSkills.every((v: unknown): v is BootstrapPythonSkill => {\n\t\t\t\t\tif (!isRecord(v)) return false;\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof v.importName === \"string\" &&\n\t\t\t\t\t\ttypeof v.packagePath === \"string\" &&\n\t\t\t\t\t\ttypeof v.pyprojectPath === \"string\" &&\n\t\t\t\t\t\ttypeof v.pyprojectHash === \"string\"\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tpythonSkills = parsed.pythonSkills as BootstrapPythonSkill[];\n\t\t}\n\t\treturn {\n\t\t\tschema: parsed.schema,\n\t\t\truntime: typeof parsed.runtime === \"string\" ? parsed.runtime : undefined,\n\t\t\tsnapshot: typeof parsed.snapshot === \"string\" ? parsed.snapshot : undefined,\n\t\t\textraUvArgs,\n\t\t\tpythonSkills,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction extraUvArgsMatch(a: string[] | undefined, b: string[] | undefined): boolean {\n\tif (a === b) return true;\n\tif (!a || !b) return false;\n\tif (a.length !== b.length) return false;\n\treturn a.every((v, i) => v === b[i]);\n}\n\nfunction pythonSkillsMatch(a: BootstrapPythonSkill[] | undefined, b: readonly BootstrapPythonSkill[]): boolean {\n\tconst left = a ?? [];\n\tif (left.length !== b.length) return false;\n\treturn left.every((skill, index) => {\n\t\tconst expected = b[index];\n\t\treturn (\n\t\t\tskill.importName === expected.importName &&\n\t\t\tskill.packagePath === expected.packagePath &&\n\t\t\tskill.pyprojectPath === expected.pyprojectPath &&\n\t\t\tskill.pyprojectHash === expected.pyprojectHash\n\t\t);\n\t});\n}\n\nfunction bootstrapVersionCurrent(\n\tversion: BootstrapVersion | null,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): boolean {\n\treturn (\n\t\tversion !== null &&\n\t\tbootstrapBaseVersionCurrent(version, runtimeIdentity) &&\n\t\tpythonSkillsMatch(version.pythonSkills, pythonSkills)\n\t);\n}\n\nfunction bootstrapBaseVersionCurrent(version: BootstrapVersion | null, runtimeIdentity: string): boolean {\n\treturn (\n\t\tversion?.schema === BOOTSTRAP_SCHEMA &&\n\t\tversion.runtime === runtimeIdentity &&\n\t\tversion.snapshot === STATE_SNAPSHOT_REQUIREMENT &&\n\t\textraUvArgsMatch(version.extraUvArgs, DEFAULT_RLM_EXTRA_UV_ARGS)\n\t);\n}\n\nasync function writeBootstrapVersion(\n\tvenv: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<void> {\n\tconst version: BootstrapVersion = {\n\t\tschema: BOOTSTRAP_SCHEMA,\n\t\truntime: runtimeIdentity,\n\t\tsnapshot: STATE_SNAPSHOT_REQUIREMENT,\n\t\textraUvArgs: DEFAULT_RLM_EXTRA_UV_ARGS,\n\t\tpythonSkills: [...pythonSkills],\n\t};\n\tawait writeFile(path.join(venv, BOOTSTRAP_VERSION_FILE), `${JSON.stringify(version)}\\n`, \"utf8\");\n}\n\nfunction runtimeCandidateDirs(): string[] {\n\tconst moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\t// dist/asm-agent-runtime is listed first deliberately: it is the only path stable\n\t// across every shipped layout (dist/, dist/bundle/, bun), where import.meta.url-relative\n\t// resolution breaks. `npm run build` rebuilds it from live source (copy-assets does\n\t// rm -rf + cp), so the staleness hash still refreshes on every build. The relative\n\t// paths below cover running from source (tsx) where dist/ hasn't been built.\n\treturn [\n\t\tpath.join(getPackageDir(), \"dist\", \"asm-agent-runtime\"),\n\t\tpath.resolve(moduleDir, \"..\", \"..\", \"asm-agent-runtime\"),\n\t\tpath.resolve(moduleDir, \"..\", \"..\", \"..\", \"..\", \"..\", \"asm-agent-runtime\"),\n\t];\n}\n\nasync function resolveRuntimeSourceDir(): Promise<string | null> {\n\tfor (const candidate of runtimeCandidateDirs()) {\n\t\tif (await exists(path.join(candidate, \"pyproject.toml\"))) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\treturn null;\n}\n\n// Identity of the runtime to be installed. For a local source checkout this is a\n// content hash of every rlm/*.py file plus pyproject.toml, so any runtime code or\n// dependency change invalidates an existing venv automatically. Falls back to the\n// bare package name when the runtime resolves to a registry install (no local source).\nexport async function resolveRuntimeIdentity(): Promise<string> {\n\tconst sourceDir = await resolveRuntimeSourceDir();\n\tif (!sourceDir) return RUNTIME_REQUIREMENT;\n\treturn hashRuntimeSource(sourceDir);\n}\n\n// Throws if the local source can't be read. A failure here must surface rather than\n// fall back to RUNTIME_REQUIREMENT: that constant is the registry-install identity, and\n// recording it for a local checkout would permanently mask later source changes.\nasync function hashRuntimeSource(sourceDir: string): Promise<string> {\n\tconst rlmDir = path.join(sourceDir, \"src\", \"rlm\");\n\tconst files: string[] = [path.join(sourceDir, \"pyproject.toml\")];\n\tasync function collect(dir: string): Promise<void> {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tconst full = path.join(dir, entry.name);\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tawait collect(full);\n\t\t\t} else if (entry.isFile() && entry.name.endsWith(\".py\")) {\n\t\t\t\tfiles.push(full);\n\t\t\t}\n\t\t}\n\t}\n\tawait collect(rlmDir);\n\tfiles.sort();\n\tconst hash = createHash(\"sha256\");\n\tfor (const file of files) {\n\t\thash.update(path.relative(sourceDir, file));\n\t\thash.update(\"\\0\");\n\t\thash.update(await readFile(file));\n\t\thash.update(\"\\0\");\n\t}\n\treturn `sha256:${hash.digest(\"hex\")}`;\n}\n\nasync function bootstrapVenv(\n\tvenv: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n\toptions: EnsureKernelPythonOptions,\n): Promise<void> {\n\tawait mkdir(path.dirname(venv), { recursive: true });\n\tconst uv = await ensureUv(options);\n\tconst python = path.join(venv, \"bin\", \"python\");\n\tconst sourceDir = await resolveRuntimeSourceDir();\n\tconst runtimeRequirement = sourceDir ?? RUNTIME_REQUIREMENT;\n\tconst runtimeIdentity = await resolveRuntimeIdentity();\n\n\tawait run(uv, [\"python\", \"install\", PYTHON_VERSION]);\n\tawait run(uv, [\"venv\", venv, \"--python\", PYTHON_VERSION, \"--seed\"]);\n\tawait run(uv, [\n\t\t\"pip\",\n\t\t\"install\",\n\t\t\"--python\",\n\t\tpython,\n\t\truntimeRequirement,\n\t\tSTATE_SNAPSHOT_REQUIREMENT,\n\t\t...DEFAULT_RLM_EXTRA_UV_ARGS,\n\t]);\n\tawait syncPythonSkills(uv, venv, python, runtimeIdentity, pythonSkills, options);\n}\n\nasync function syncPythonSkills(\n\tuv: string,\n\tvenv: string,\n\tpython: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n\toptions: EnsureKernelPythonOptions,\n): Promise<void> {\n\tconst version = await readBootstrapVersion(venv);\n\tconst installedPythonSkills: BootstrapPythonSkill[] = [];\n\tconst currentPythonSkills = new Map(\n\t\t(version?.pythonSkills ?? []).map((skill) => [`${skill.importName}\\0${skill.packagePath}`, skill]),\n\t);\n\tconst pythonSkillsByProjectName = new Map(\n\t\tpythonSkills.map((skill) => [readPythonSkillProjectName(skill).replaceAll(\"_\", \"-\").toLowerCase(), skill]),\n\t);\n\tconst dependenciesBySkill = new Map(\n\t\tpythonSkills.map((skill) => [\n\t\t\tskill,\n\t\t\t[...readPythonSkillDependencyNames(skill)]\n\t\t\t\t.map(\n\t\t\t\t\t(dependencyName) =>\n\t\t\t\t\t\tpythonSkillsByProjectName.get(dependencyName) ??\n\t\t\t\t\t\tresolveSiblingPythonSkillDependency(skill, dependencyName),\n\t\t\t\t)\n\t\t\t\t.filter((dependency): dependency is BootstrapPythonSkill => Boolean(dependency)),\n\t\t]),\n\t);\n\n\tfor (const skill of sortPythonSkillsForInstall(pythonSkills)) {\n\t\tconst existingSkill = currentPythonSkills.get(`${skill.importName}\\0${skill.packagePath}`);\n\t\tif (existingSkill?.pyprojectPath === skill.pyprojectPath && existingSkill.pyprojectHash === skill.pyprojectHash) {\n\t\t\tinstalledPythonSkills.push(skill);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst localDependencies = dependenciesBySkill.get(skill) ?? [];\n\t\tconst localDependencyArgs = localDependencies\n\t\t\t.filter((dependency) => {\n\t\t\t\tconst installedDependency = currentPythonSkills.get(`${dependency.importName}\\0${dependency.packagePath}`);\n\t\t\t\tconst installedThisSync = installedPythonSkills.some(\n\t\t\t\t\t(installed) =>\n\t\t\t\t\t\tinstalled.importName === dependency.importName &&\n\t\t\t\t\t\tinstalled.packagePath === dependency.packagePath &&\n\t\t\t\t\t\tinstalled.pyprojectPath === dependency.pyprojectPath &&\n\t\t\t\t\t\tinstalled.pyprojectHash === dependency.pyprojectHash,\n\t\t\t\t);\n\t\t\t\treturn !(\n\t\t\t\t\tinstalledThisSync ||\n\t\t\t\t\t(installedDependency?.pyprojectPath === dependency.pyprojectPath &&\n\t\t\t\t\t\tinstalledDependency.pyprojectHash === dependency.pyprojectHash)\n\t\t\t\t);\n\t\t\t})\n\t\t\t.flatMap(formatPythonSkillInstallArgs);\n\n\t\ttry {\n\t\t\tawait run(uv, [\n\t\t\t\t\"pip\",\n\t\t\t\t\"install\",\n\t\t\t\t\"--python\",\n\t\t\t\tpython,\n\t\t\t\t...formatPythonSkillInstallArgs(skill),\n\t\t\t\t...localDependencyArgs,\n\t\t\t]);\n\t\t\tinstalledPythonSkills.push(\n\t\t\t\tskill,\n\t\t\t\t...localDependencies.filter((dependency) => !installedPythonSkills.includes(dependency)),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treportProgress(\n\t\t\t\toptions,\n\t\t\t\t`Warning: Python skill ${skill.importName} failed to install and will be unavailable: ${errorMessage(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\tawait writeBootstrapVersion(venv, runtimeIdentity, installedPythonSkills);\n}\n\nasync function kernelBaseReady(python: string, venv: string, runtimeIdentity: string): Promise<boolean> {\n\treturn (\n\t\t(await hasAsmAgentRuntime(python)) &&\n\t\tbootstrapBaseVersionCurrent(await readBootstrapVersion(venv), runtimeIdentity)\n\t);\n}\n\nasync function kernelReady(\n\tpython: string,\n\tvenv: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<boolean> {\n\treturn (\n\t\t(await hasAsmAgentRuntime(python)) &&\n\t\tbootstrapVersionCurrent(await readBootstrapVersion(venv), runtimeIdentity, pythonSkills)\n\t);\n}\n\nfunction formatBootstrapFailure(error: unknown): Error {\n\treturn new Error(\n\t\t`Failed to set up the Python kernel runtime. ${errorMessage(error)}\\n` +\n\t\t\t\"First-time setup needs internet to install uv, Python, asm-agent-runtime, and default Python packages; once set up, asm-agent runs offline. \" +\n\t\t\t\"Set ASM_AGENT_KERNEL_PYTHON to a Python with a current asm-agent-runtime and default Python packages installed to skip auto-bootstrap.\",\n\t);\n}\n\nasync function ensureKernelPythonUncached(\n\toptions: EnsureKernelPythonOptions,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<string> {\n\tconst override = process.env.ASM_AGENT_KERNEL_PYTHON;\n\tif (override) {\n\t\tconst python = path.resolve(expandHome(override));\n\t\tconst missing: string[] = [];\n\t\tif (!(await hasAsmAgentRuntime(python))) {\n\t\t\tmissing.push(\n\t\t\t\t\"a current asm-agent-runtime with callable rlm.run, rlm.host_request, and explicit harness CRUD methods\",\n\t\t\t);\n\t\t}\n\t\tif (missing.length === 0) {\n\t\t\tconst missingExtraImports = await missingRlmExtraImportLabels(python);\n\t\t\tif (missingExtraImports.length > 0) {\n\t\t\t\tmissing.push(`default Python packages (${missingExtraImports.join(\", \")})`);\n\t\t\t}\n\t\t}\n\t\tif (missing.length === 0 && pythonSkills.length > 0) {\n\t\t\tconst missingPythonSkills = await missingPythonSkillImportLabels(python, options.pythonSkills ?? []);\n\t\t\tif (missingPythonSkills.length > 0) {\n\t\t\t\treportProgress(\n\t\t\t\t\toptions,\n\t\t\t\t\t`Warning: Python skills unavailable in ASM_AGENT_KERNEL_PYTHON and will be disabled: ${missingPythonSkills.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (missing.length === 0) return python;\n\t\tthrow new Error(`ASM_AGENT_KERNEL_PYTHON points to a Python missing ${missing.join(\" and \")}: ${python}`);\n\t}\n\n\tconst venv = await resolveWritableKernelVenvDir();\n\tconst python = path.join(venv, \"bin\", \"python\");\n\tconst runtimeIdentity = await resolveRuntimeIdentity();\n\tif (await kernelReady(python, venv, runtimeIdentity, pythonSkills)) return python;\n\n\tconst releaseLock = await acquireBootstrapLock(venv);\n\ttry {\n\t\tif (await kernelReady(python, venv, runtimeIdentity, pythonSkills)) return python;\n\t\tif (await kernelBaseReady(python, venv, runtimeIdentity)) {\n\t\t\tawait syncPythonSkills(await ensureUv(options), venv, python, runtimeIdentity, pythonSkills, options);\n\t\t\treturn python;\n\t\t}\n\n\t\tconst hadVenv = existsSync(venv);\n\t\treportProgress(options, \"› setting up python kernel (one-time, ~30s)…\");\n\t\tif (hadVenv) {\n\t\t\treportProgress(options, \"rebuilding kernel venv\");\n\t\t\tawait rm(venv, { recursive: true, force: true });\n\t\t}\n\n\t\tawait bootstrapVenv(venv, pythonSkills, options);\n\t} catch (error) {\n\t\tthrow formatBootstrapFailure(error);\n\t} finally {\n\t\tawait releaseLock().catch(() => undefined);\n\t}\n\n\treportProgress(options, \"✓ ready\");\n\treturn python;\n}\n\nexport function ensureKernelPython(options: EnsureKernelPythonOptions = {}): Promise<string> {\n\tconst pythonSkills = normalizePythonSkills(options.pythonSkills);\n\tconst key = ensureKernelPythonKey(pythonSkills);\n\tif (inFlightEnsureKernelPython?.key === key) return inFlightEnsureKernelPython.promise;\n\n\tconst promise = ensureKernelPythonUncached(options, pythonSkills).finally(() => {\n\t\tif (inFlightEnsureKernelPython?.promise === promise) inFlightEnsureKernelPython = null;\n\t});\n\tinFlightEnsureKernelPython = { key, promise };\n\treturn promise;\n}\n"]}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/core/kernel/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { constants, existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { access, mkdir, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { stderr, stdin } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { getPackageDir } from \"../../config.js\";\nimport type { PythonSkillRuntimeInfo } from \"../skills.js\";\n\nconst BOOTSTRAP_SCHEMA = 9;\nconst PYTHON_VERSION = \"3.12\";\nconst RUNTIME_REQUIREMENT = \"asm-agent-runtime\";\n// Serializes the kernel's user namespace so it can be revived across session\n// resume. Internal-only; intentionally not surfaced to the model as an import.\nconst STATE_SNAPSHOT_REQUIREMENT = \"dill\";\nconst DEFAULT_RLM_EXTRA_PACKAGES = [\n\t{ uvArg: \"requests\", importName: \"requests\", promptLabel: \"requests\" },\n\t{ uvArg: \"httpx\", importName: \"httpx\", promptLabel: \"httpx\" },\n\t{ uvArg: \"pyyaml\", importName: \"yaml\", promptLabel: \"yaml (PyYAML)\" },\n\t{ uvArg: \"tomli\", importName: \"tomli\", promptLabel: \"tomli\" },\n\t{ uvArg: \"python-dotenv\", importName: \"dotenv\", promptLabel: \"dotenv (python-dotenv)\" },\n\t{ uvArg: \"pandas\", importName: \"pandas\", promptLabel: \"pandas\" },\n\t{ uvArg: \"numpy\", importName: \"numpy\", promptLabel: \"numpy\" },\n\t{ uvArg: \"scipy\", importName: \"scipy\", promptLabel: \"scipy\" },\n\t{ uvArg: \"beautifulsoup4\", importName: \"bs4\", promptLabel: \"bs4 (Beautiful Soup)\" },\n\t{ uvArg: \"lxml\", importName: \"lxml\", promptLabel: \"lxml\" },\n\t{ uvArg: \"pydantic\", importName: \"pydantic\", promptLabel: \"pydantic\" },\n\t{ uvArg: \"tyro\", importName: \"tyro\", promptLabel: \"tyro\" },\n];\nexport const DEFAULT_RLM_EXTRA_UV_ARGS = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.uvArg);\nexport const DEFAULT_RLM_EXTRA_IMPORT_NAMES = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.importName);\nexport const DEFAULT_RLM_EXTRA_IMPORT_LABELS = DEFAULT_RLM_EXTRA_PACKAGES.map((pkg) => pkg.promptLabel);\nconst UV_INSTALL_COMMAND = \"curl -LsSf https://astral.sh/uv/install.sh | sh\";\nconst REQUIRED_HARNESS_METHODS = [\n\t\"create_memory\",\n\t\"update_memory\",\n\t\"delete_memory\",\n\t\"create_skill\",\n\t\"update_skill\",\n\t\"delete_skill\",\n\t\"create_subagent\",\n\t\"update_subagent\",\n\t\"delete_subagent\",\n\t\"create_prompt_note\",\n\t\"update_prompt_note\",\n\t\"delete_prompt_note\",\n\t\"record_refinement\",\n];\nconst RUNTIME_READY_CHECK = `import inspect; import rlm; from rlm import McpIntegration; import rlm.mcp as mcp; from rlm.harness import HarnessEntry; _harness_methods = ${JSON.stringify(REQUIRED_HARNESS_METHODS)}; assert callable(mcp.list_tools); assert callable(mcp.call_tool); assert hasattr(rlm, 'run'); assert callable(rlm); assert hasattr(rlm, 'rlm'); assert callable(rlm.rlm); assert callable(rlm.host_request); assert callable(rlm.find_models); assert callable(rlm.rlm.find_models); assert hasattr(rlm, 'harness'); assert hasattr(rlm, 'get_harness_state'); assert hasattr(rlm.rlm, 'harness'); assert hasattr(rlm.rlm, 'get_harness_state'); assert all(callable(getattr(_harness, _method, None)) for _harness in (rlm.harness, rlm.rlm.harness) for _method in _harness_methods); assert 'reference' in HarnessEntry.__dataclass_fields__; assert 'scope' in HarnessEntry.__dataclass_fields__; assert 'reference' in inspect.signature(rlm.harness.create_skill).parameters; assert 'reference' in inspect.signature(rlm.harness.update_skill).parameters; assert 'global_' in inspect.signature(rlm.harness.create_memory).parameters; assert 'global_' in inspect.signature(rlm.get_harness_state).parameters; assert not hasattr(rlm, 'background'); assert not hasattr(rlm.rlm, 'background'); from rlm.bash import BashHandle, BashResult; assert callable(rlm.bash); assert all(callable(getattr(BashHandle, _m, None)) for _m in ('tail', 'output', 'poll', 'kill')); assert {'exit_code', 'output', 'duration'} <= set(BashResult.__dataclass_fields__); import rlm.repl as _repl; assert callable(_repl.main); assert callable(_repl.emit); assert callable(_repl.host_request); assert callable(_repl.is_active); assert _repl.PROTOCOL_VERSION == 3; assert callable(rlm.emit); assert not hasattr(rlm, 'HOST_COMM_TARGET'); assert not hasattr(mcp, 'install_shutdown_hook')`;\nconst BOOTSTRAP_VERSION_FILE = \".bootstrap-version\";\nconst BOOTSTRAP_LOCK_NAME = \".bootstrap.lock\";\nconst BOOTSTRAP_LOCK_RETRY_MS = 100;\nconst BOOTSTRAP_LOCK_STALE_WITHOUT_PID_MS = 30_000;\n\nlet inFlightEnsureKernelPython: { key: string; promise: Promise<string> } | null = null;\n\nexport type KernelPythonSkill = PythonSkillRuntimeInfo;\nexport type KernelBootstrapProgressHandler = (message: string) => void;\n\nexport interface EnsureKernelPythonOptions {\n\tpythonSkills?: readonly KernelPythonSkill[];\n\tonProgress?: KernelBootstrapProgressHandler;\n}\n\ninterface BootstrapPythonSkill {\n\timportName: string;\n\tpackagePath: string;\n\tpyprojectPath: string;\n\tpyprojectHash: string;\n}\n\ninterface BootstrapVersion {\n\tschema: number;\n\truntime?: string;\n\tsnapshot?: string;\n\textraUvArgs?: string[];\n\tpythonSkills?: BootstrapPythonSkill[];\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n\treturn error instanceof Error && \"code\" in error && error.code === code;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n\ttry {\n\t\tawait access(filePath);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function isExecutable(filePath: string): Promise<boolean> {\n\ttry {\n\t\tawait access(filePath, constants.X_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction expandHome(filePath: string): string {\n\tif (filePath === \"~\") return os.homedir();\n\tif (filePath.startsWith(\"~/\")) return path.join(os.homedir(), filePath.slice(2));\n\treturn filePath;\n}\n\nfunction fileContentHash(filePath: string): string {\n\ttry {\n\t\treturn `sha256:${createHash(\"sha256\").update(readFileSync(filePath)).digest(\"hex\")}`;\n\t} catch {\n\t\treturn \"unreadable\";\n\t}\n}\n\nfunction normalizePythonSkills(pythonSkills: readonly KernelPythonSkill[] | undefined): BootstrapPythonSkill[] {\n\tconst byKey = new Map<string, BootstrapPythonSkill>();\n\tconst addSkill = (skill: Pick<KernelPythonSkill, \"importName\" | \"packagePath\" | \"pyprojectPath\">): void => {\n\t\tconst packagePath = path.resolve(skill.packagePath);\n\t\tconst pyprojectPath = path.resolve(skill.pyprojectPath);\n\t\tconst key = `${skill.importName}\\0${packagePath}`;\n\t\tif (byKey.has(key)) {\n\t\t\treturn;\n\t\t}\n\t\tconst bootstrapSkill: BootstrapPythonSkill = {\n\t\t\timportName: skill.importName,\n\t\t\tpackagePath,\n\t\t\tpyprojectPath,\n\t\t\tpyprojectHash: fileContentHash(pyprojectPath),\n\t\t};\n\t\tbyKey.set(key, bootstrapSkill);\n\t\tfor (const dependencyName of readPythonSkillDependencyNames(bootstrapSkill)) {\n\t\t\tconst siblingDependency = resolveSiblingPythonSkillDependency(bootstrapSkill, dependencyName);\n\t\t\tif (siblingDependency) {\n\t\t\t\taddSkill(siblingDependency);\n\t\t\t}\n\t\t}\n\t};\n\tfor (const skill of pythonSkills ?? []) {\n\t\taddSkill(skill);\n\t}\n\treturn [...byKey.values()].sort((a, b) => {\n\t\tconst packageCompare = a.packagePath.localeCompare(b.packagePath);\n\t\tif (packageCompare !== 0) return packageCompare;\n\t\treturn a.importName.localeCompare(b.importName);\n\t});\n}\n\nfunction readTomlProjectSection(pyprojectPath: string): string | undefined {\n\ttry {\n\t\tconst text = readFileSync(pyprojectPath, \"utf-8\");\n\t\tconst match = text.match(/^\\s*\\[project\\]\\s*$/m);\n\t\tif (!match || match.index === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst sectionStart = match.index + match[0].length;\n\t\tconst rest = text.slice(sectionStart);\n\t\tconst nextSection = rest.search(/^\\s*\\[/m);\n\t\treturn nextSection >= 0 ? rest.slice(0, nextSection) : rest;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction readPythonSkillProjectName(skill: BootstrapPythonSkill): string {\n\tconst projectSection = readTomlProjectSection(skill.pyprojectPath);\n\tconst name = projectSection?.match(/^\\s*name\\s*=\\s*[\"']([^\"']+)[\"']/m)?.[1];\n\treturn name?.trim() || skill.importName.replaceAll(\"_\", \"-\");\n}\n\nfunction parseDependencyPackageName(dependency: string): string | undefined {\n\tconst withoutMarker = dependency.split(\";\")[0]?.trim() ?? \"\";\n\tif (!withoutMarker) {\n\t\treturn undefined;\n\t}\n\tconst match = withoutMarker.match(/^([A-Za-z0-9_.-]+)/);\n\treturn match?.[1]?.replaceAll(\"_\", \"-\").toLowerCase();\n}\n\nfunction findTomlArrayEnd(text: string, startIndex: number): number {\n\tlet inQuote: '\"' | \"'\" | undefined;\n\tlet escaped = false;\n\tfor (let index = startIndex; index < text.length; index++) {\n\t\tconst char = text[index];\n\t\tif (inQuote) {\n\t\t\tif (escaped) {\n\t\t\t\tescaped = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === \"\\\\\") {\n\t\t\t\tescaped = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === inQuote) {\n\t\t\t\tinQuote = undefined;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' || char === \"'\") {\n\t\t\tinQuote = char;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"]\") {\n\t\t\treturn index;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction readPythonSkillDependencyNames(skill: BootstrapPythonSkill): Set<string> {\n\tconst projectSection = readTomlProjectSection(skill.pyprojectPath);\n\tif (!projectSection) {\n\t\treturn new Set();\n\t}\n\tconst dependenciesStart = projectSection.search(/^\\s*dependencies\\s*=\\s*\\[/m);\n\tif (dependenciesStart < 0) {\n\t\treturn new Set();\n\t}\n\tconst arrayStart = projectSection.indexOf(\"[\", dependenciesStart);\n\tif (arrayStart < 0) {\n\t\treturn new Set();\n\t}\n\tconst arrayEnd = findTomlArrayEnd(projectSection, arrayStart + 1);\n\tif (arrayEnd < 0) {\n\t\treturn new Set();\n\t}\n\tconst dependenciesArray = projectSection.slice(arrayStart, arrayEnd + 1);\n\tconst dependencies = new Set<string>();\n\tconst dependencyPattern = /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'/g;\n\tfor (const match of dependenciesArray.matchAll(dependencyPattern)) {\n\t\tconst dependency = (match[1] ?? match[2] ?? \"\").replaceAll('\\\\\"', '\"').replaceAll(\"\\\\'\", \"'\");\n\t\tconst name = parseDependencyPackageName(dependency);\n\t\tif (name) {\n\t\t\tdependencies.add(name);\n\t\t}\n\t}\n\treturn dependencies;\n}\n\nfunction resolveSiblingPythonSkillDependency(\n\tskill: BootstrapPythonSkill,\n\tdependencyName: string,\n): BootstrapPythonSkill | undefined {\n\tconst siblingsDir = path.dirname(skill.packagePath);\n\tfor (const entry of readdirSync(siblingsDir, { withFileTypes: true })) {\n\t\tif (!entry.isDirectory()) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst packagePath = path.join(siblingsDir, entry.name);\n\t\tconst pyprojectPath = path.join(packagePath, \"pyproject.toml\");\n\t\tif (!existsSync(pyprojectPath)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst dependency: BootstrapPythonSkill = {\n\t\t\timportName: entry.name.replaceAll(\"-\", \"_\"),\n\t\t\tpackagePath,\n\t\t\tpyprojectPath,\n\t\t\tpyprojectHash: fileContentHash(pyprojectPath),\n\t\t};\n\t\tif (readPythonSkillProjectName(dependency).replaceAll(\"_\", \"-\").toLowerCase() === dependencyName) {\n\t\t\treturn dependency;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction sortPythonSkillsForInstall(pythonSkills: readonly BootstrapPythonSkill[]): BootstrapPythonSkill[] {\n\tconst byProjectName = new Map<string, BootstrapPythonSkill>();\n\tconst originalIndex = new Map<BootstrapPythonSkill, number>();\n\tfor (const [index, skill] of pythonSkills.entries()) {\n\t\toriginalIndex.set(skill, index);\n\t\tbyProjectName.set(readPythonSkillProjectName(skill).replaceAll(\"_\", \"-\").toLowerCase(), skill);\n\t}\n\n\tconst dependenciesBySkill = new Map<BootstrapPythonSkill, BootstrapPythonSkill[]>();\n\tfor (const skill of pythonSkills) {\n\t\tdependenciesBySkill.set(\n\t\t\tskill,\n\t\t\t[...readPythonSkillDependencyNames(skill)]\n\t\t\t\t.map(\n\t\t\t\t\t(dependencyName) =>\n\t\t\t\t\t\tbyProjectName.get(dependencyName) ?? resolveSiblingPythonSkillDependency(skill, dependencyName),\n\t\t\t\t)\n\t\t\t\t.filter((dependency): dependency is BootstrapPythonSkill => Boolean(dependency)),\n\t\t);\n\t}\n\n\tconst pending = new Set(pythonSkills);\n\tconst sorted: BootstrapPythonSkill[] = [];\n\twhile (pending.size > 0) {\n\t\tlet progressed = false;\n\t\tfor (const skill of [...pending].sort((a, b) => (originalIndex.get(a) ?? 0) - (originalIndex.get(b) ?? 0))) {\n\t\t\tconst dependencies = dependenciesBySkill.get(skill) ?? [];\n\t\t\tif (dependencies.some((dependency) => pending.has(dependency))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsorted.push(skill);\n\t\t\tpending.delete(skill);\n\t\t\tprogressed = true;\n\t\t}\n\t\tif (!progressed) {\n\t\t\t// Cyclic local skill dependencies cannot be topologically ordered; keep a\n\t\t\t// deterministic order and let uv surface the packaging error if needed.\n\t\t\tsorted.push(...[...pending].sort((a, b) => a.packagePath.localeCompare(b.packagePath)));\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn sorted;\n}\n\nfunction formatPythonSkillInstallArgs(skill: BootstrapPythonSkill): string[] {\n\treturn [\"--editable\", skill.packagePath];\n}\n\nfunction ensureKernelPythonKey(pythonSkills: readonly BootstrapPythonSkill[]): string {\n\treturn [\n\t\tprocess.env.ASM_AGENT_KERNEL_PYTHON ?? \"\",\n\t\tprocess.env.ASM_AGENT_KERNEL_VENV ?? \"\",\n\t\tprocess.env.HOME ?? \"\",\n\t\tprocess.env.XDG_DATA_HOME ?? \"\",\n\t\tJSON.stringify(pythonSkills),\n\t].join(\"\\0\");\n}\n\nexport function getKernelVenvDir(): string {\n\tconst override = process.env.ASM_AGENT_KERNEL_VENV;\n\tif (override) return path.resolve(expandHome(override));\n\treturn path.join(os.homedir(), \".asm-agent\", \"kernel-venv\");\n}\n\nfunction getXdgKernelVenvDir(): string {\n\tconst dataHome = process.env.XDG_DATA_HOME\n\t\t? path.resolve(expandHome(process.env.XDG_DATA_HOME))\n\t\t: path.join(os.homedir(), \".local\", \"share\");\n\treturn path.join(dataHome, \"asm-agent\", \"kernel-venv\");\n}\n\nasync function resolveWritableKernelVenvDir(): Promise<string> {\n\tconst primary = getKernelVenvDir();\n\ttry {\n\t\tawait mkdir(path.dirname(primary), { recursive: true });\n\t\treturn primary;\n\t} catch (primaryError) {\n\t\tif (process.env.ASM_AGENT_KERNEL_VENV) {\n\t\t\tthrow new Error(`couldn't create kernel venv parent directory for ${primary}: ${errorMessage(primaryError)}`);\n\t\t}\n\n\t\tconst fallback = getXdgKernelVenvDir();\n\t\ttry {\n\t\t\tawait mkdir(path.dirname(fallback), { recursive: true });\n\t\t\treturn fallback;\n\t\t} catch (fallbackError) {\n\t\t\tthrow new Error(\n\t\t\t\t`couldn't create kernel venv directory at ${primary} or ${fallback}; set ASM_AGENT_KERNEL_PYTHON to a python with a current asm-agent-runtime installed. ${errorMessage(fallbackError)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction run(command: string, args: string[], options: { stdio?: \"ignore\" | \"inherit\" } = {}): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tenv: process.env,\n\t\t\tstdio: options.stdio ?? \"ignore\",\n\t\t});\n\t\tchild.on(\"error\", reject);\n\t\tchild.on(\"exit\", (code, signal) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst reason = signal ? `signal ${signal}` : `exit code ${code}`;\n\t\t\treject(new Error(`${command} ${args.join(\" \")} failed with ${reason}`));\n\t\t});\n\t});\n}\n\nasync function pythonImports(python: string, moduleName: string): Promise<boolean> {\n\ttry {\n\t\tawait run(python, [\"-c\", `import ${moduleName}`], { stdio: \"ignore\" });\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function hasAsmAgentRuntime(python: string): Promise<boolean> {\n\ttry {\n\t\tawait run(python, [\"-c\", RUNTIME_READY_CHECK], { stdio: \"ignore\" });\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function missingRlmExtraImportLabels(python: string): Promise<string[]> {\n\tconst missing: string[] = [];\n\tfor (const pkg of DEFAULT_RLM_EXTRA_PACKAGES) {\n\t\tif (!(await pythonImports(python, pkg.importName))) {\n\t\t\tmissing.push(pkg.promptLabel);\n\t\t}\n\t}\n\treturn missing;\n}\n\nasync function missingPythonSkillImportLabels(\n\tpython: string,\n\tpythonSkills: readonly KernelPythonSkill[],\n): Promise<string[]> {\n\tconst missing: string[] = [];\n\tfor (const skill of pythonSkills) {\n\t\tif (!(await pythonImports(python, skill.importName))) {\n\t\t\tmissing.push(`${skill.name} (${skill.importName})`);\n\t\t}\n\t}\n\treturn missing;\n}\n\nfunction reportProgress(options: EnsureKernelPythonOptions, message: string): void {\n\tif (options.onProgress) {\n\t\toptions.onProgress(message);\n\t\treturn;\n\t}\n\tprocess.stderr.write(`${message}\\n`);\n}\n\nfunction bootstrapLockDir(venv: string): string {\n\treturn path.join(path.dirname(venv), `${path.basename(venv)}${BOOTSTRAP_LOCK_NAME}`);\n}\n\nfunction processIsRunning(pid: number): boolean {\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn isNodeError(error, \"EPERM\");\n\t}\n}\n\nasync function readLockPid(lockDir: string): Promise<number | null> {\n\ttry {\n\t\tconst raw = await readFile(path.join(lockDir, \"pid\"), \"utf8\");\n\t\tconst pid = Number.parseInt(raw.trim(), 10);\n\t\treturn Number.isInteger(pid) && pid > 0 ? pid : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function lockMissingPidIsStale(lockDir: string): Promise<boolean> {\n\ttry {\n\t\tconst lockStat = await stat(lockDir);\n\t\treturn Date.now() - lockStat.mtimeMs > BOOTSTRAP_LOCK_STALE_WITHOUT_PID_MS;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function acquireBootstrapLock(venv: string): Promise<() => Promise<void>> {\n\tconst lockDir = bootstrapLockDir(venv);\n\tawait mkdir(path.dirname(lockDir), { recursive: true });\n\n\tfor (;;) {\n\t\ttry {\n\t\t\tawait mkdir(lockDir);\n\t\t\tawait writeFile(path.join(lockDir, \"pid\"), `${process.pid}\\n`, \"utf8\");\n\t\t\treturn () => rm(lockDir, { recursive: true, force: true });\n\t\t} catch (error) {\n\t\t\tif (!isNodeError(error, \"EEXIST\")) throw error;\n\n\t\t\tconst pid = await readLockPid(lockDir);\n\t\t\tif (pid === null ? await lockMissingPidIsStale(lockDir) : !processIsRunning(pid)) {\n\t\t\t\tawait rm(lockDir, { recursive: true, force: true });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tawait sleep(BOOTSTRAP_LOCK_RETRY_MS);\n\t\t}\n\t}\n}\n\nasync function findExecutable(name: string): Promise<string | null> {\n\tconst pathValue = process.env.PATH;\n\tif (!pathValue) return null;\n\tconst candidates = process.platform === \"win32\" ? [name, `${name}.exe`] : [name];\n\tfor (const dir of pathValue.split(path.delimiter)) {\n\t\tif (!dir) continue;\n\t\tfor (const candidate of candidates) {\n\t\t\tconst fullPath = path.join(dir, candidate);\n\t\t\tif (await isExecutable(fullPath)) return fullPath;\n\t\t}\n\t}\n\treturn null;\n}\n\nasync function ensureUv(options: EnsureKernelPythonOptions): Promise<string> {\n\tconst fromPath = await findExecutable(\"uv\");\n\tif (fromPath) return fromPath;\n\n\tconst localUv = path.join(os.homedir(), \".local\", \"bin\", process.platform === \"win32\" ? \"uv.exe\" : \"uv\");\n\tif (await isExecutable(localUv)) return localUv;\n\n\tconst shouldInstallUv =\n\t\tprocess.env.ASM_AGENT_INSTALL_UV === \"1\" || (!options.onProgress && (await confirmUvInstall()));\n\tif (!shouldInstallUv) {\n\t\tthrow new Error(\n\t\t\t`uv is required to set up the Python kernel. Install uv yourself: ${UV_INSTALL_COMMAND}, ` +\n\t\t\t\t\"or set ASM_AGENT_INSTALL_UV=1 to let asm-agent run that installer.\",\n\t\t);\n\t}\n\n\treportProgress(options, \"› installing uv (one-time)…\");\n\ttry {\n\t\tawait run(\"sh\", [\"-c\", UV_INSTALL_COMMAND], { stdio: options.onProgress ? \"ignore\" : \"inherit\" });\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`couldn't install uv from astral.sh; install it yourself: ${UV_INSTALL_COMMAND}, then re-run asm-agent. ${errorMessage(error)}`,\n\t\t);\n\t}\n\n\tif (await isExecutable(localUv)) return localUv;\n\tconst installedFromPath = await findExecutable(\"uv\");\n\tif (installedFromPath) return installedFromPath;\n\tthrow new Error(\"uv install completed but binary not found at ~/.local/bin/uv\");\n}\n\nasync function confirmUvInstall(): Promise<boolean> {\n\tif (process.env.ASM_AGENT_INSTALL_UV === \"0\") return false;\n\tif (!stdin.isTTY || !stderr.isTTY) return false;\n\n\tconst rl = createInterface({ input: stdin, output: stderr });\n\ttry {\n\t\tconst answer = (await rl.question(\"ASM Agent needs uv to set up Python. Install uv from astral.sh now? [Y/n] \"))\n\t\t\t.trim()\n\t\t\t.toLowerCase();\n\t\treturn answer !== \"n\" && answer !== \"no\";\n\t} finally {\n\t\trl.close();\n\t}\n}\n\nasync function readBootstrapVersion(venv: string): Promise<BootstrapVersion | null> {\n\ttry {\n\t\tconst raw = await readFile(path.join(venv, BOOTSTRAP_VERSION_FILE), \"utf8\");\n\t\tconst parsed: unknown = JSON.parse(raw);\n\t\tif (!isRecord(parsed) || typeof parsed.schema !== \"number\") return null;\n\t\tconst extraUvArgs =\n\t\t\tArray.isArray(parsed.extraUvArgs) &&\n\t\t\tparsed.extraUvArgs.every((v: unknown): v is string => typeof v === \"string\")\n\t\t\t\t? (parsed.extraUvArgs as string[])\n\t\t\t\t: undefined;\n\t\tlet pythonSkills: BootstrapPythonSkill[] | undefined;\n\t\tif (Array.isArray(parsed.pythonSkills)) {\n\t\t\tif (\n\t\t\t\t!parsed.pythonSkills.every((v: unknown): v is BootstrapPythonSkill => {\n\t\t\t\t\tif (!isRecord(v)) return false;\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof v.importName === \"string\" &&\n\t\t\t\t\t\ttypeof v.packagePath === \"string\" &&\n\t\t\t\t\t\ttypeof v.pyprojectPath === \"string\" &&\n\t\t\t\t\t\ttypeof v.pyprojectHash === \"string\"\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tpythonSkills = parsed.pythonSkills as BootstrapPythonSkill[];\n\t\t}\n\t\treturn {\n\t\t\tschema: parsed.schema,\n\t\t\truntime: typeof parsed.runtime === \"string\" ? parsed.runtime : undefined,\n\t\t\tsnapshot: typeof parsed.snapshot === \"string\" ? parsed.snapshot : undefined,\n\t\t\textraUvArgs,\n\t\t\tpythonSkills,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction extraUvArgsMatch(a: string[] | undefined, b: string[] | undefined): boolean {\n\tif (a === b) return true;\n\tif (!a || !b) return false;\n\tif (a.length !== b.length) return false;\n\treturn a.every((v, i) => v === b[i]);\n}\n\nfunction pythonSkillsMatch(a: BootstrapPythonSkill[] | undefined, b: readonly BootstrapPythonSkill[]): boolean {\n\tconst left = a ?? [];\n\tif (left.length !== b.length) return false;\n\treturn left.every((skill, index) => {\n\t\tconst expected = b[index];\n\t\treturn (\n\t\t\tskill.importName === expected.importName &&\n\t\t\tskill.packagePath === expected.packagePath &&\n\t\t\tskill.pyprojectPath === expected.pyprojectPath &&\n\t\t\tskill.pyprojectHash === expected.pyprojectHash\n\t\t);\n\t});\n}\n\nfunction bootstrapVersionCurrent(\n\tversion: BootstrapVersion | null,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): boolean {\n\treturn (\n\t\tversion !== null &&\n\t\tbootstrapBaseVersionCurrent(version, runtimeIdentity) &&\n\t\tpythonSkillsMatch(version.pythonSkills, pythonSkills)\n\t);\n}\n\nfunction bootstrapBaseVersionCurrent(version: BootstrapVersion | null, runtimeIdentity: string): boolean {\n\treturn (\n\t\tversion?.schema === BOOTSTRAP_SCHEMA &&\n\t\tversion.runtime === runtimeIdentity &&\n\t\tversion.snapshot === STATE_SNAPSHOT_REQUIREMENT &&\n\t\textraUvArgsMatch(version.extraUvArgs, DEFAULT_RLM_EXTRA_UV_ARGS)\n\t);\n}\n\nasync function writeBootstrapVersion(\n\tvenv: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<void> {\n\tconst version: BootstrapVersion = {\n\t\tschema: BOOTSTRAP_SCHEMA,\n\t\truntime: runtimeIdentity,\n\t\tsnapshot: STATE_SNAPSHOT_REQUIREMENT,\n\t\textraUvArgs: DEFAULT_RLM_EXTRA_UV_ARGS,\n\t\tpythonSkills: [...pythonSkills],\n\t};\n\tawait writeFile(path.join(venv, BOOTSTRAP_VERSION_FILE), `${JSON.stringify(version)}\\n`, \"utf8\");\n}\n\nfunction runtimeCandidateDirs(): string[] {\n\tconst moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\t// dist/asm-agent-runtime is listed first deliberately: it is the only path stable\n\t// across every shipped layout (dist/, dist/bundle/, bun), where import.meta.url-relative\n\t// resolution breaks. `npm run build` rebuilds it from live source (copy-assets does\n\t// rm -rf + cp), so the staleness hash still refreshes on every build. The relative\n\t// paths below cover running from source (tsx) where dist/ hasn't been built.\n\treturn [\n\t\tpath.join(getPackageDir(), \"dist\", \"asm-agent-runtime\"),\n\t\tpath.resolve(moduleDir, \"..\", \"..\", \"asm-agent-runtime\"),\n\t\tpath.resolve(moduleDir, \"..\", \"..\", \"..\", \"..\", \"..\", \"asm-agent-runtime\"),\n\t];\n}\n\nasync function resolveRuntimeSourceDir(): Promise<string | null> {\n\tfor (const candidate of runtimeCandidateDirs()) {\n\t\tif (await exists(path.join(candidate, \"pyproject.toml\"))) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\treturn null;\n}\n\n// Identity of the runtime to be installed. For a local source checkout this is a\n// content hash of every rlm/*.py file plus pyproject.toml, so any runtime code or\n// dependency change invalidates an existing venv automatically. Falls back to the\n// bare package name when the runtime resolves to a registry install (no local source).\nexport async function resolveRuntimeIdentity(): Promise<string> {\n\tconst sourceDir = await resolveRuntimeSourceDir();\n\tif (!sourceDir) return RUNTIME_REQUIREMENT;\n\treturn hashRuntimeSource(sourceDir);\n}\n\n// Throws if the local source can't be read. A failure here must surface rather than\n// fall back to RUNTIME_REQUIREMENT: that constant is the registry-install identity, and\n// recording it for a local checkout would permanently mask later source changes.\nasync function hashRuntimeSource(sourceDir: string): Promise<string> {\n\tconst rlmDir = path.join(sourceDir, \"src\", \"rlm\");\n\tconst files: string[] = [path.join(sourceDir, \"pyproject.toml\")];\n\tasync function collect(dir: string): Promise<void> {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tconst full = path.join(dir, entry.name);\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tawait collect(full);\n\t\t\t} else if (entry.isFile() && entry.name.endsWith(\".py\")) {\n\t\t\t\tfiles.push(full);\n\t\t\t}\n\t\t}\n\t}\n\tawait collect(rlmDir);\n\tfiles.sort();\n\tconst hash = createHash(\"sha256\");\n\tfor (const file of files) {\n\t\thash.update(path.relative(sourceDir, file));\n\t\thash.update(\"\\0\");\n\t\thash.update(await readFile(file));\n\t\thash.update(\"\\0\");\n\t}\n\treturn `sha256:${hash.digest(\"hex\")}`;\n}\n\nasync function bootstrapVenv(\n\tvenv: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n\toptions: EnsureKernelPythonOptions,\n): Promise<void> {\n\tawait mkdir(path.dirname(venv), { recursive: true });\n\tconst uv = await ensureUv(options);\n\tconst python = path.join(venv, \"bin\", \"python\");\n\tconst sourceDir = await resolveRuntimeSourceDir();\n\tconst runtimeRequirement = sourceDir ?? RUNTIME_REQUIREMENT;\n\tconst runtimeIdentity = await resolveRuntimeIdentity();\n\n\tawait run(uv, [\"python\", \"install\", PYTHON_VERSION]);\n\tawait run(uv, [\"venv\", venv, \"--python\", PYTHON_VERSION, \"--seed\"]);\n\tawait run(uv, [\n\t\t\"pip\",\n\t\t\"install\",\n\t\t\"--python\",\n\t\tpython,\n\t\truntimeRequirement,\n\t\tSTATE_SNAPSHOT_REQUIREMENT,\n\t\t...DEFAULT_RLM_EXTRA_UV_ARGS,\n\t]);\n\tawait syncPythonSkills(uv, venv, python, runtimeIdentity, pythonSkills, options);\n}\n\nasync function syncPythonSkills(\n\tuv: string,\n\tvenv: string,\n\tpython: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n\toptions: EnsureKernelPythonOptions,\n): Promise<void> {\n\tconst version = await readBootstrapVersion(venv);\n\tconst installedPythonSkills: BootstrapPythonSkill[] = [];\n\tconst currentPythonSkills = new Map(\n\t\t(version?.pythonSkills ?? []).map((skill) => [`${skill.importName}\\0${skill.packagePath}`, skill]),\n\t);\n\tconst pythonSkillsByProjectName = new Map(\n\t\tpythonSkills.map((skill) => [readPythonSkillProjectName(skill).replaceAll(\"_\", \"-\").toLowerCase(), skill]),\n\t);\n\tconst dependenciesBySkill = new Map(\n\t\tpythonSkills.map((skill) => [\n\t\t\tskill,\n\t\t\t[...readPythonSkillDependencyNames(skill)]\n\t\t\t\t.map(\n\t\t\t\t\t(dependencyName) =>\n\t\t\t\t\t\tpythonSkillsByProjectName.get(dependencyName) ??\n\t\t\t\t\t\tresolveSiblingPythonSkillDependency(skill, dependencyName),\n\t\t\t\t)\n\t\t\t\t.filter((dependency): dependency is BootstrapPythonSkill => Boolean(dependency)),\n\t\t]),\n\t);\n\n\tfor (const skill of sortPythonSkillsForInstall(pythonSkills)) {\n\t\tconst existingSkill = currentPythonSkills.get(`${skill.importName}\\0${skill.packagePath}`);\n\t\tif (existingSkill?.pyprojectPath === skill.pyprojectPath && existingSkill.pyprojectHash === skill.pyprojectHash) {\n\t\t\tinstalledPythonSkills.push(skill);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst localDependencies = dependenciesBySkill.get(skill) ?? [];\n\t\tconst localDependencyArgs = localDependencies\n\t\t\t.filter((dependency) => {\n\t\t\t\tconst installedDependency = currentPythonSkills.get(`${dependency.importName}\\0${dependency.packagePath}`);\n\t\t\t\tconst installedThisSync = installedPythonSkills.some(\n\t\t\t\t\t(installed) =>\n\t\t\t\t\t\tinstalled.importName === dependency.importName &&\n\t\t\t\t\t\tinstalled.packagePath === dependency.packagePath &&\n\t\t\t\t\t\tinstalled.pyprojectPath === dependency.pyprojectPath &&\n\t\t\t\t\t\tinstalled.pyprojectHash === dependency.pyprojectHash,\n\t\t\t\t);\n\t\t\t\treturn !(\n\t\t\t\t\tinstalledThisSync ||\n\t\t\t\t\t(installedDependency?.pyprojectPath === dependency.pyprojectPath &&\n\t\t\t\t\t\tinstalledDependency.pyprojectHash === dependency.pyprojectHash)\n\t\t\t\t);\n\t\t\t})\n\t\t\t.flatMap(formatPythonSkillInstallArgs);\n\n\t\ttry {\n\t\t\tawait run(uv, [\n\t\t\t\t\"pip\",\n\t\t\t\t\"install\",\n\t\t\t\t\"--python\",\n\t\t\t\tpython,\n\t\t\t\t...formatPythonSkillInstallArgs(skill),\n\t\t\t\t...localDependencyArgs,\n\t\t\t]);\n\t\t\tinstalledPythonSkills.push(\n\t\t\t\tskill,\n\t\t\t\t...localDependencies.filter((dependency) => !installedPythonSkills.includes(dependency)),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treportProgress(\n\t\t\t\toptions,\n\t\t\t\t`Warning: Python skill ${skill.importName} failed to install and will be unavailable: ${errorMessage(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\tawait writeBootstrapVersion(venv, runtimeIdentity, installedPythonSkills);\n}\n\nasync function kernelBaseReady(python: string, venv: string, runtimeIdentity: string): Promise<boolean> {\n\treturn (\n\t\t(await hasAsmAgentRuntime(python)) &&\n\t\tbootstrapBaseVersionCurrent(await readBootstrapVersion(venv), runtimeIdentity)\n\t);\n}\n\nasync function kernelReady(\n\tpython: string,\n\tvenv: string,\n\truntimeIdentity: string,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<boolean> {\n\treturn (\n\t\t(await hasAsmAgentRuntime(python)) &&\n\t\tbootstrapVersionCurrent(await readBootstrapVersion(venv), runtimeIdentity, pythonSkills)\n\t);\n}\n\nfunction formatBootstrapFailure(error: unknown): Error {\n\treturn new Error(\n\t\t`Failed to set up the Python kernel runtime. ${errorMessage(error)}\\n` +\n\t\t\t\"First-time setup needs internet to install uv, Python, asm-agent-runtime, and default Python packages; once set up, asm-agent runs offline. \" +\n\t\t\t\"Set ASM_AGENT_KERNEL_PYTHON to a Python with a current asm-agent-runtime and default Python packages installed to skip auto-bootstrap.\",\n\t);\n}\n\nasync function ensureKernelPythonUncached(\n\toptions: EnsureKernelPythonOptions,\n\tpythonSkills: readonly BootstrapPythonSkill[],\n): Promise<string> {\n\tconst override = process.env.ASM_AGENT_KERNEL_PYTHON;\n\tif (override) {\n\t\tconst python = path.resolve(expandHome(override));\n\t\tconst missing: string[] = [];\n\t\tif (!(await hasAsmAgentRuntime(python))) {\n\t\t\tmissing.push(\n\t\t\t\t\"a current asm-agent-runtime with callable rlm.run, rlm.host_request, and explicit harness CRUD methods\",\n\t\t\t);\n\t\t}\n\t\tif (missing.length === 0) {\n\t\t\tconst missingExtraImports = await missingRlmExtraImportLabels(python);\n\t\t\tif (missingExtraImports.length > 0) {\n\t\t\t\tmissing.push(`default Python packages (${missingExtraImports.join(\", \")})`);\n\t\t\t}\n\t\t}\n\t\tif (missing.length === 0 && pythonSkills.length > 0) {\n\t\t\tconst missingPythonSkills = await missingPythonSkillImportLabels(python, options.pythonSkills ?? []);\n\t\t\tif (missingPythonSkills.length > 0) {\n\t\t\t\treportProgress(\n\t\t\t\t\toptions,\n\t\t\t\t\t`Warning: Python skills unavailable in ASM_AGENT_KERNEL_PYTHON and will be disabled: ${missingPythonSkills.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (missing.length === 0) return python;\n\t\tthrow new Error(`ASM_AGENT_KERNEL_PYTHON points to a Python missing ${missing.join(\" and \")}: ${python}`);\n\t}\n\n\tconst venv = await resolveWritableKernelVenvDir();\n\tconst python = path.join(venv, \"bin\", \"python\");\n\tconst runtimeIdentity = await resolveRuntimeIdentity();\n\tif (await kernelReady(python, venv, runtimeIdentity, pythonSkills)) return python;\n\n\tconst releaseLock = await acquireBootstrapLock(venv);\n\ttry {\n\t\tif (await kernelReady(python, venv, runtimeIdentity, pythonSkills)) return python;\n\t\tif (await kernelBaseReady(python, venv, runtimeIdentity)) {\n\t\t\tawait syncPythonSkills(await ensureUv(options), venv, python, runtimeIdentity, pythonSkills, options);\n\t\t\treturn python;\n\t\t}\n\n\t\tconst hadVenv = existsSync(venv);\n\t\treportProgress(options, \"› setting up python kernel (one-time, ~30s)…\");\n\t\tif (hadVenv) {\n\t\t\treportProgress(options, \"rebuilding kernel venv\");\n\t\t\tawait rm(venv, { recursive: true, force: true });\n\t\t}\n\n\t\tawait bootstrapVenv(venv, pythonSkills, options);\n\t} catch (error) {\n\t\tthrow formatBootstrapFailure(error);\n\t} finally {\n\t\tawait releaseLock().catch(() => undefined);\n\t}\n\n\treportProgress(options, \"✓ ready\");\n\treturn python;\n}\n\nexport function ensureKernelPython(options: EnsureKernelPythonOptions = {}): Promise<string> {\n\tconst pythonSkills = normalizePythonSkills(options.pythonSkills);\n\tconst key = ensureKernelPythonKey(pythonSkills);\n\tif (inFlightEnsureKernelPython?.key === key) return inFlightEnsureKernelPython.promise;\n\n\tconst promise = ensureKernelPythonUncached(options, pythonSkills).finally(() => {\n\t\tif (inFlightEnsureKernelPython?.promise === promise) inFlightEnsureKernelPython = null;\n\t});\n\tinFlightEnsureKernelPython = { key, promise };\n\treturn promise;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { type ExecuteOptions, type ExecuteResult, type KernelManagerOptions, type KernelStartOptions } from "./shared.js";
1
+ import { type ExecuteOptions, type ExecuteResult, type KernelManagerOptions, type KernelShutdownOptions, type KernelStartOptions } from "./shared.js";
2
2
  import { type RestoreResult, type SnapshotResult } from "./state-snapshot.js";
3
3
  export declare class ReplKernelManager {
4
4
  private readonly options;
@@ -23,10 +23,26 @@ export declare class ReplKernelManager {
23
23
  private startGeneration;
24
24
  /** Generation whose graceful shutdown() owns the teardown, so the exit handler must not run it. */
25
25
  private gracefulShutdownGeneration?;
26
+ private gracefulShutdownPromise?;
26
27
  /** Memoized so concurrent callers all await the same in-flight startup. */
27
28
  private startPromise?;
28
29
  /** Pending debounced auto-snapshot, if one has been scheduled. */
29
30
  private snapshotTimer?;
31
+ /** While the final dispose snapshot is flushing, new external executions are rejected. */
32
+ private flushingSnapshotForDispose;
33
+ /** In-flight final snapshot flush; concurrent teardowns join it instead of re-flushing. */
34
+ private snapshotFlushForDispose?;
35
+ /** Repairs a child whose dedicated protocol stream emitted an invalid frame. */
36
+ private protocolRepairPromise?;
37
+ private protocolRepairOwner?;
38
+ /** Corruption seen while still "starting" (e.g. ready and garbage in one chunk) fails that start. */
39
+ private startupProtocolError?;
40
+ /** A repair discarded its kernel: the next fresh start must re-run the runtime bootstrap. */
41
+ private pendingRebootstrap;
42
+ /** Restore the saved namespace on that fresh start too (false when the snapshot itself is the declared culprit). */
43
+ private pendingRestore;
44
+ private rebootstrapPromise?;
45
+ private teardownInFlight;
30
46
  constructor(options: KernelManagerOptions);
31
47
  get ownerSessionId(): string | undefined;
32
48
  private appendKernelDiagnostic;
@@ -35,6 +51,16 @@ export declare class ReplKernelManager {
35
51
  /** True when a teardown (or newer start) superseded the start that captured `generation`. */
36
52
  private startStale;
37
53
  private wireChild;
54
+ private failProtocolFrame;
55
+ private repairProtocolChild;
56
+ private bootstrapRepairedKernel;
57
+ private ensureKernelRebootstrapped;
58
+ private reprovisionFreshKernel;
59
+ /** Kill the current child and settle at clean idle, so the next start spawns fresh. */
60
+ private killChildToIdle;
61
+ private finishFailedProtocolRepair;
62
+ private supersedeProtocolRepair;
63
+ private waitForProtocolRepair;
38
64
  private waitForReady;
39
65
  /** Write one JSON-lines request frame; resolves when the OS accepted the bytes. */
40
66
  private writeLine;
@@ -58,10 +84,9 @@ export declare class ReplKernelManager {
58
84
  private cleanupResources;
59
85
  private waitForKernelExit;
60
86
  private waitForHostRequestsToSettle;
61
- /** Resolves true when this call performed the cleanup (false: a concurrent teardown won). */
62
- shutdown(opts?: {
63
- snapshot?: boolean;
64
- }): Promise<boolean>;
87
+ /** Resolves true when this call performed the cleanup (false: a concurrent teardown won; a joiner's options are ignored - the first caller's policy wins). */
88
+ shutdown(opts?: KernelShutdownOptions): Promise<boolean>;
89
+ private performShutdown;
65
90
  restart(): Promise<void>;
66
91
  kill(): Promise<void>;
67
92
  /**
@@ -78,14 +103,13 @@ export declare class ReplKernelManager {
78
103
  * (rlm, skills) over anything restored. Never throws.
79
104
  */
80
105
  restoreState(): Promise<RestoreResult | null>;
106
+ private performRestore;
81
107
  /** Live user-defined top-level names, or null if the kernel isn't running. Never throws. */
82
108
  listNamespaceNames(signal?: AbortSignal): Promise<string[] | null>;
83
109
  private scheduleSnapshot;
84
110
  private clearSnapshotTimer;
85
111
  private flushSnapshotForDispose;
86
- /** Graceful cleanup. Waits briefly for in-flight host request handlers before killing the child. */
87
- dispose(): Promise<void>;
88
- private requestProtocolShutdown;
112
+ private runSnapshotFlushForDispose;
89
113
  /** Synchronous best-effort cleanup. Safe to call from `process.on('exit')`. */
90
114
  disposeSync(): void;
91
115
  get isRunning(): boolean;