@nervekit/tools 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/dist/catalog/core/filesystem.tools.d.ts +140 -0
  4. package/dist/catalog/core/filesystem.tools.d.ts.map +1 -0
  5. package/dist/catalog/core/filesystem.tools.js +221 -0
  6. package/dist/catalog/core/filesystem.tools.js.map +1 -0
  7. package/dist/catalog/core/interaction.tools.d.ts +37 -0
  8. package/dist/catalog/core/interaction.tools.d.ts.map +1 -0
  9. package/dist/catalog/core/interaction.tools.js +55 -0
  10. package/dist/catalog/core/interaction.tools.js.map +1 -0
  11. package/dist/catalog/core/python.tools.d.ts +17 -0
  12. package/dist/catalog/core/python.tools.d.ts.map +1 -0
  13. package/dist/catalog/core/python.tools.js +32 -0
  14. package/dist/catalog/core/python.tools.js.map +1 -0
  15. package/dist/catalog/core/shell.tools.d.ts +14 -0
  16. package/dist/catalog/core/shell.tools.d.ts.map +1 -0
  17. package/dist/catalog/core/shell.tools.js +22 -0
  18. package/dist/catalog/core/shell.tools.js.map +1 -0
  19. package/dist/catalog/core/web.tools.d.ts +23 -0
  20. package/dist/catalog/core/web.tools.d.ts.map +1 -0
  21. package/dist/catalog/core/web.tools.js +34 -0
  22. package/dist/catalog/core/web.tools.js.map +1 -0
  23. package/dist/catalog/descriptors.d.ts +4 -0
  24. package/dist/catalog/descriptors.d.ts.map +1 -0
  25. package/dist/catalog/descriptors.js +17 -0
  26. package/dist/catalog/descriptors.js.map +1 -0
  27. package/dist/catalog/index.d.ts +18 -0
  28. package/dist/catalog/index.d.ts.map +1 -0
  29. package/dist/catalog/index.js +44 -0
  30. package/dist/catalog/index.js.map +1 -0
  31. package/dist/catalog/orchestration/explore.tools.d.ts +20 -0
  32. package/dist/catalog/orchestration/explore.tools.d.ts.map +1 -0
  33. package/dist/catalog/orchestration/explore.tools.js +42 -0
  34. package/dist/catalog/orchestration/explore.tools.js.map +1 -0
  35. package/dist/catalog/orchestration/plan-mode.tools.d.ts +32 -0
  36. package/dist/catalog/orchestration/plan-mode.tools.d.ts.map +1 -0
  37. package/dist/catalog/orchestration/plan-mode.tools.js +43 -0
  38. package/dist/catalog/orchestration/plan-mode.tools.js.map +1 -0
  39. package/dist/catalog/orchestration/process.tools.d.ts +68 -0
  40. package/dist/catalog/orchestration/process.tools.d.ts.map +1 -0
  41. package/dist/catalog/orchestration/process.tools.js +96 -0
  42. package/dist/catalog/orchestration/process.tools.js.map +1 -0
  43. package/dist/catalog/orchestration/subagent.tools.d.ts +16 -0
  44. package/dist/catalog/orchestration/subagent.tools.d.ts.map +1 -0
  45. package/dist/catalog/orchestration/subagent.tools.js +25 -0
  46. package/dist/catalog/orchestration/subagent.tools.js.map +1 -0
  47. package/dist/catalog/orchestration/task.tools.d.ts +107 -0
  48. package/dist/catalog/orchestration/task.tools.d.ts.map +1 -0
  49. package/dist/catalog/orchestration/task.tools.js +170 -0
  50. package/dist/catalog/orchestration/task.tools.js.map +1 -0
  51. package/dist/catalog/risk.d.ts +3 -0
  52. package/dist/catalog/risk.d.ts.map +1 -0
  53. package/dist/catalog/risk.js +29 -0
  54. package/dist/catalog/risk.js.map +1 -0
  55. package/dist/catalog/types.d.ts +14 -0
  56. package/dist/catalog/types.d.ts.map +1 -0
  57. package/dist/catalog/types.js +2 -0
  58. package/dist/catalog/types.js.map +1 -0
  59. package/dist/definitions.d.ts +2 -0
  60. package/dist/definitions.d.ts.map +1 -0
  61. package/dist/definitions.js +2 -0
  62. package/dist/definitions.js.map +1 -0
  63. package/dist/execution/atomic-write.d.ts +2 -0
  64. package/dist/execution/atomic-write.d.ts.map +1 -0
  65. package/dist/execution/atomic-write.js +7 -0
  66. package/dist/execution/atomic-write.js.map +1 -0
  67. package/dist/execution/bash.d.ts +3 -0
  68. package/dist/execution/bash.d.ts.map +1 -0
  69. package/dist/execution/bash.js +133 -0
  70. package/dist/execution/bash.js.map +1 -0
  71. package/dist/execution/common/args.d.ts +2 -0
  72. package/dist/execution/common/args.d.ts.map +1 -0
  73. package/dist/execution/common/args.js +6 -0
  74. package/dist/execution/common/args.js.map +1 -0
  75. package/dist/execution/common/output-budget.d.ts +61 -0
  76. package/dist/execution/common/output-budget.d.ts.map +1 -0
  77. package/dist/execution/common/output-budget.js +140 -0
  78. package/dist/execution/common/output-budget.js.map +1 -0
  79. package/dist/execution/common/process-result.d.ts +44 -0
  80. package/dist/execution/common/process-result.d.ts.map +1 -0
  81. package/dist/execution/common/process-result.js +322 -0
  82. package/dist/execution/common/process-result.js.map +1 -0
  83. package/dist/execution/common/search-utils.d.ts +8 -0
  84. package/dist/execution/common/search-utils.d.ts.map +1 -0
  85. package/dist/execution/common/search-utils.js +110 -0
  86. package/dist/execution/common/search-utils.js.map +1 -0
  87. package/dist/execution/common/tool-error.d.ts +8 -0
  88. package/dist/execution/common/tool-error.d.ts.map +1 -0
  89. package/dist/execution/common/tool-error.js +14 -0
  90. package/dist/execution/common/tool-error.js.map +1 -0
  91. package/dist/execution/common/truncate.d.ts +27 -0
  92. package/dist/execution/common/truncate.d.ts.map +1 -0
  93. package/dist/execution/common/truncate.js +108 -0
  94. package/dist/execution/common/truncate.js.map +1 -0
  95. package/dist/execution/common.d.ts +2 -0
  96. package/dist/execution/common.d.ts.map +1 -0
  97. package/dist/execution/common.js +6 -0
  98. package/dist/execution/common.js.map +1 -0
  99. package/dist/execution/core-dispatch.d.ts +4 -0
  100. package/dist/execution/core-dispatch.d.ts.map +1 -0
  101. package/dist/execution/core-dispatch.js +58 -0
  102. package/dist/execution/core-dispatch.js.map +1 -0
  103. package/dist/execution/dispatch.d.ts +4 -0
  104. package/dist/execution/dispatch.d.ts.map +1 -0
  105. package/dist/execution/dispatch.js +54 -0
  106. package/dist/execution/dispatch.js.map +1 -0
  107. package/dist/execution/edit.d.ts +9 -0
  108. package/dist/execution/edit.d.ts.map +1 -0
  109. package/dist/execution/edit.js +175 -0
  110. package/dist/execution/edit.js.map +1 -0
  111. package/dist/execution/file-mutation-queue.d.ts +2 -0
  112. package/dist/execution/file-mutation-queue.d.ts.map +1 -0
  113. package/dist/execution/file-mutation-queue.js +19 -0
  114. package/dist/execution/file-mutation-queue.js.map +1 -0
  115. package/dist/execution/filesystem/atomic-write.d.ts +2 -0
  116. package/dist/execution/filesystem/atomic-write.d.ts.map +1 -0
  117. package/dist/execution/filesystem/atomic-write.js +7 -0
  118. package/dist/execution/filesystem/atomic-write.js.map +1 -0
  119. package/dist/execution/filesystem/edit-args.d.ts +46 -0
  120. package/dist/execution/filesystem/edit-args.d.ts.map +1 -0
  121. package/dist/execution/filesystem/edit-args.js +212 -0
  122. package/dist/execution/filesystem/edit-args.js.map +1 -0
  123. package/dist/execution/filesystem/edit-errors.d.ts +4 -0
  124. package/dist/execution/filesystem/edit-errors.d.ts.map +1 -0
  125. package/dist/execution/filesystem/edit-errors.js +8 -0
  126. package/dist/execution/filesystem/edit-errors.js.map +1 -0
  127. package/dist/execution/filesystem/edit.d.ts +4 -0
  128. package/dist/execution/filesystem/edit.d.ts.map +1 -0
  129. package/dist/execution/filesystem/edit.js +330 -0
  130. package/dist/execution/filesystem/edit.js.map +1 -0
  131. package/dist/execution/filesystem/file-mutation-queue.d.ts +2 -0
  132. package/dist/execution/filesystem/file-mutation-queue.d.ts.map +1 -0
  133. package/dist/execution/filesystem/file-mutation-queue.js +19 -0
  134. package/dist/execution/filesystem/file-mutation-queue.js.map +1 -0
  135. package/dist/execution/filesystem/find.d.ts +3 -0
  136. package/dist/execution/filesystem/find.d.ts.map +1 -0
  137. package/dist/execution/filesystem/find.js +93 -0
  138. package/dist/execution/filesystem/find.js.map +1 -0
  139. package/dist/execution/filesystem/legacy-edit.d.ts +9 -0
  140. package/dist/execution/filesystem/legacy-edit.d.ts.map +1 -0
  141. package/dist/execution/filesystem/legacy-edit.js +122 -0
  142. package/dist/execution/filesystem/legacy-edit.js.map +1 -0
  143. package/dist/execution/filesystem/list.d.ts +3 -0
  144. package/dist/execution/filesystem/list.d.ts.map +1 -0
  145. package/dist/execution/filesystem/list.js +49 -0
  146. package/dist/execution/filesystem/list.js.map +1 -0
  147. package/dist/execution/filesystem/path.d.ts +7 -0
  148. package/dist/execution/filesystem/path.d.ts.map +1 -0
  149. package/dist/execution/filesystem/path.js +69 -0
  150. package/dist/execution/filesystem/path.js.map +1 -0
  151. package/dist/execution/filesystem/read.d.ts +3 -0
  152. package/dist/execution/filesystem/read.d.ts.map +1 -0
  153. package/dist/execution/filesystem/read.js +225 -0
  154. package/dist/execution/filesystem/read.js.map +1 -0
  155. package/dist/execution/filesystem/search.d.ts +3 -0
  156. package/dist/execution/filesystem/search.d.ts.map +1 -0
  157. package/dist/execution/filesystem/search.js +149 -0
  158. package/dist/execution/filesystem/search.js.map +1 -0
  159. package/dist/execution/filesystem/smart-match.d.ts +31 -0
  160. package/dist/execution/filesystem/smart-match.d.ts.map +1 -0
  161. package/dist/execution/filesystem/smart-match.js +309 -0
  162. package/dist/execution/filesystem/smart-match.js.map +1 -0
  163. package/dist/execution/filesystem/text-editing.d.ts +9 -0
  164. package/dist/execution/filesystem/text-editing.d.ts.map +1 -0
  165. package/dist/execution/filesystem/text-editing.js +43 -0
  166. package/dist/execution/filesystem/text-editing.js.map +1 -0
  167. package/dist/execution/filesystem/write.d.ts +3 -0
  168. package/dist/execution/filesystem/write.d.ts.map +1 -0
  169. package/dist/execution/filesystem/write.js +21 -0
  170. package/dist/execution/filesystem/write.js.map +1 -0
  171. package/dist/execution/find.d.ts +3 -0
  172. package/dist/execution/find.d.ts.map +1 -0
  173. package/dist/execution/find.js +90 -0
  174. package/dist/execution/find.js.map +1 -0
  175. package/dist/execution/index.d.ts +18 -0
  176. package/dist/execution/index.d.ts.map +1 -0
  177. package/dist/execution/index.js +17 -0
  178. package/dist/execution/index.js.map +1 -0
  179. package/dist/execution/list.d.ts +3 -0
  180. package/dist/execution/list.d.ts.map +1 -0
  181. package/dist/execution/list.js +46 -0
  182. package/dist/execution/list.js.map +1 -0
  183. package/dist/execution/path.d.ts +7 -0
  184. package/dist/execution/path.d.ts.map +1 -0
  185. package/dist/execution/path.js +69 -0
  186. package/dist/execution/path.js.map +1 -0
  187. package/dist/execution/python/python.d.ts +3 -0
  188. package/dist/execution/python/python.d.ts.map +1 -0
  189. package/dist/execution/python/python.js +566 -0
  190. package/dist/execution/python/python.js.map +1 -0
  191. package/dist/execution/python/runtime.d.ts +22 -0
  192. package/dist/execution/python/runtime.d.ts.map +1 -0
  193. package/dist/execution/python/runtime.js +178 -0
  194. package/dist/execution/python/runtime.js.map +1 -0
  195. package/dist/execution/read.d.ts +3 -0
  196. package/dist/execution/read.d.ts.map +1 -0
  197. package/dist/execution/read.js +97 -0
  198. package/dist/execution/read.js.map +1 -0
  199. package/dist/execution/search-utils.d.ts +8 -0
  200. package/dist/execution/search-utils.d.ts.map +1 -0
  201. package/dist/execution/search-utils.js +110 -0
  202. package/dist/execution/search-utils.js.map +1 -0
  203. package/dist/execution/search.d.ts +3 -0
  204. package/dist/execution/search.d.ts.map +1 -0
  205. package/dist/execution/search.js +131 -0
  206. package/dist/execution/search.js.map +1 -0
  207. package/dist/execution/shell/bash.d.ts +3 -0
  208. package/dist/execution/shell/bash.d.ts.map +1 -0
  209. package/dist/execution/shell/bash.js +134 -0
  210. package/dist/execution/shell/bash.js.map +1 -0
  211. package/dist/execution/truncate.d.ts +21 -0
  212. package/dist/execution/truncate.d.ts.map +1 -0
  213. package/dist/execution/truncate.js +94 -0
  214. package/dist/execution/truncate.js.map +1 -0
  215. package/dist/execution/web/web-fetch.d.ts +3 -0
  216. package/dist/execution/web/web-fetch.d.ts.map +1 -0
  217. package/dist/execution/web/web-fetch.js +132 -0
  218. package/dist/execution/web/web-fetch.js.map +1 -0
  219. package/dist/execution/web/web-search.d.ts +3 -0
  220. package/dist/execution/web/web-search.d.ts.map +1 -0
  221. package/dist/execution/web/web-search.js +59 -0
  222. package/dist/execution/web/web-search.js.map +1 -0
  223. package/dist/execution/web-fetch.d.ts +3 -0
  224. package/dist/execution/web-fetch.d.ts.map +1 -0
  225. package/dist/execution/web-fetch.js +132 -0
  226. package/dist/execution/web-fetch.js.map +1 -0
  227. package/dist/execution/web-search.d.ts +3 -0
  228. package/dist/execution/web-search.d.ts.map +1 -0
  229. package/dist/execution/web-search.js +59 -0
  230. package/dist/execution/web-search.js.map +1 -0
  231. package/dist/execution/write.d.ts +3 -0
  232. package/dist/execution/write.d.ts.map +1 -0
  233. package/dist/execution/write.js +21 -0
  234. package/dist/execution/write.js.map +1 -0
  235. package/dist/index.d.ts +9 -0
  236. package/dist/index.d.ts.map +1 -0
  237. package/dist/index.js +11 -0
  238. package/dist/index.js.map +1 -0
  239. package/dist/safety/command-policy-git.d.ts +2 -0
  240. package/dist/safety/command-policy-git.d.ts.map +1 -0
  241. package/dist/safety/command-policy-git.js +88 -0
  242. package/dist/safety/command-policy-git.js.map +1 -0
  243. package/dist/safety/command-policy-options.d.ts +6 -0
  244. package/dist/safety/command-policy-options.d.ts.map +1 -0
  245. package/dist/safety/command-policy-options.js +112 -0
  246. package/dist/safety/command-policy-options.js.map +1 -0
  247. package/dist/safety/command-policy-packages.d.ts +4 -0
  248. package/dist/safety/command-policy-packages.d.ts.map +1 -0
  249. package/dist/safety/command-policy-packages.js +161 -0
  250. package/dist/safety/command-policy-packages.js.map +1 -0
  251. package/dist/safety/command-policy-parser.d.ts +11 -0
  252. package/dist/safety/command-policy-parser.d.ts.map +1 -0
  253. package/dist/safety/command-policy-parser.js +121 -0
  254. package/dist/safety/command-policy-parser.js.map +1 -0
  255. package/dist/safety/command-policy-wrappers.d.ts +6 -0
  256. package/dist/safety/command-policy-wrappers.d.ts.map +1 -0
  257. package/dist/safety/command-policy-wrappers.js +95 -0
  258. package/dist/safety/command-policy-wrappers.js.map +1 -0
  259. package/dist/safety/command-policy.d.ts +6 -0
  260. package/dist/safety/command-policy.d.ts.map +1 -0
  261. package/dist/safety/command-policy.js +118 -0
  262. package/dist/safety/command-policy.js.map +1 -0
  263. package/dist/types.d.ts +78 -0
  264. package/dist/types.d.ts.map +1 -0
  265. package/dist/types.js +2 -0
  266. package/dist/types.js.map +1 -0
  267. package/package.json +48 -0
@@ -0,0 +1,566 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, mkdtemp, readdir, rm, stat, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { numberArg } from "../common/args.js";
6
+ import { boundLiveOutputChunk } from "../common/output-budget.js";
7
+ import { buildProcessResult } from "../common/process-result.js";
8
+ import { pathNotFoundMessage, resolveToolPath } from "../filesystem/path.js";
9
+ const DEFAULT_TIMEOUT_SECONDS = 60;
10
+ const MAX_TIMEOUT_SECONDS = 600;
11
+ const FORCE_KILL_AFTER_MS = 2000;
12
+ const MAX_ARTIFACTS = 100;
13
+ const SENSITIVE_ENV_KEY_PATTERN = /authorization|cookie|token|apikey|api_key|password|passwd|secret|credential|private.?key|nerve_daemon_token/i;
14
+ // Guardrails below block ordinary stdin/file-write/network APIs used by agent
15
+ // snippets. They are not a hard security sandbox against malicious Python code,
16
+ // native extensions, interpreter internals, or symlink tricks.
17
+ const RUNNER_SOURCE = `
18
+ import builtins
19
+ import io
20
+ import json
21
+ import os
22
+ import pathlib
23
+ import runpy
24
+ import shutil
25
+ import socket
26
+ import subprocess
27
+ import sys
28
+
29
+ user_path = sys.argv[1]
30
+ policy = json.loads(sys.argv[2])
31
+ allow_network = bool(policy.get("allowNetwork", True))
32
+ allow_filewrite = bool(policy.get("allowFileWrite", True))
33
+ artifact_dir_value = policy.get("artifactDir")
34
+ artifact_dir = os.path.abspath(artifact_dir_value) if isinstance(artifact_dir_value, str) and artifact_dir_value else None
35
+
36
+ STDIN_ERROR = "stdin is not available to the python tool."
37
+ FILEWRITE_ERROR = "file writes are disabled for the python tool in planning mode. Write generated artifacts under NERVE_PYTHON_ARTIFACT_DIR instead."
38
+ NETWORK_ERROR = "network access is disabled for the python tool."
39
+
40
+ class _NoStdin:
41
+ encoding = "utf-8"
42
+ errors = "strict"
43
+ closed = False
44
+
45
+ def read(self, *args, **kwargs):
46
+ raise RuntimeError(STDIN_ERROR)
47
+
48
+ def readline(self, *args, **kwargs):
49
+ raise RuntimeError(STDIN_ERROR)
50
+
51
+ def readlines(self, *args, **kwargs):
52
+ raise RuntimeError(STDIN_ERROR)
53
+
54
+ def __iter__(self):
55
+ raise RuntimeError(STDIN_ERROR)
56
+
57
+ def fileno(self):
58
+ raise RuntimeError(STDIN_ERROR)
59
+
60
+ def isatty(self):
61
+ return False
62
+
63
+ def readable(self):
64
+ return False
65
+
66
+ def writable(self):
67
+ return False
68
+
69
+ def seekable(self):
70
+ return False
71
+
72
+ builtins.input = lambda *args, **kwargs: (_ for _ in ()).throw(RuntimeError(STDIN_ERROR))
73
+ sys.stdin = _NoStdin()
74
+
75
+ _WRITE_MODE_CHARS = set("wax+")
76
+ _WRITE_FLAG_BITS = 0
77
+ for _name in ("O_WRONLY", "O_RDWR", "O_CREAT", "O_TRUNC", "O_APPEND"):
78
+ _WRITE_FLAG_BITS |= int(getattr(os, _name, 0) or 0)
79
+
80
+ def _mode_writes(mode):
81
+ if mode is None:
82
+ return False
83
+ return any(ch in str(mode) for ch in _WRITE_MODE_CHARS)
84
+
85
+ def _flags_write(flags):
86
+ try:
87
+ return (int(flags) & _WRITE_FLAG_BITS) != 0
88
+ except Exception:
89
+ return False
90
+
91
+ def _path_in_artifact(path):
92
+ if artifact_dir is None:
93
+ return False
94
+ try:
95
+ target = os.path.abspath(os.fspath(path))
96
+ except Exception:
97
+ return False
98
+ try:
99
+ return os.path.commonpath([artifact_dir, target]) == artifact_dir
100
+ except Exception:
101
+ return False
102
+
103
+ def _check_filewrite_target(path):
104
+ if allow_filewrite:
105
+ return
106
+ if _path_in_artifact(path):
107
+ return
108
+ raise PermissionError(FILEWRITE_ERROR)
109
+
110
+ def _deny_filewrite(*args, **kwargs):
111
+ raise PermissionError(FILEWRITE_ERROR)
112
+
113
+ def _guarded_open_factory(original):
114
+ def _guarded_open(file, mode="r", *args, **kwargs):
115
+ if not allow_filewrite and _mode_writes(mode):
116
+ _check_filewrite_target(file)
117
+ return original(file, mode, *args, **kwargs)
118
+ return _guarded_open
119
+
120
+ def _guarded_path_method(original):
121
+ def _guarded(self, *args, **kwargs):
122
+ _check_filewrite_target(self)
123
+ return original(self, *args, **kwargs)
124
+ return _guarded
125
+
126
+ def _guarded_path_move(original):
127
+ def _guarded(self, target, *args, **kwargs):
128
+ _check_filewrite_target(self)
129
+ _check_filewrite_target(target)
130
+ return original(self, target, *args, **kwargs)
131
+ return _guarded
132
+
133
+ def _guarded_os_one(original):
134
+ def _guarded(path, *args, **kwargs):
135
+ _check_filewrite_target(path)
136
+ return original(path, *args, **kwargs)
137
+ return _guarded
138
+
139
+ def _guarded_os_two(original):
140
+ def _guarded(src, dst, *args, **kwargs):
141
+ _check_filewrite_target(src)
142
+ _check_filewrite_target(dst)
143
+ return original(src, dst, *args, **kwargs)
144
+ return _guarded
145
+
146
+ def _guarded_shutil_copy(original):
147
+ def _guarded(src, dst, *args, **kwargs):
148
+ _check_filewrite_target(dst)
149
+ return original(src, dst, *args, **kwargs)
150
+ return _guarded
151
+
152
+ def _install_filewrite_guards():
153
+ if allow_filewrite:
154
+ return
155
+
156
+ builtins.open = _guarded_open_factory(builtins.open)
157
+ io.open = _guarded_open_factory(io.open)
158
+
159
+ _path_open = pathlib.Path.open
160
+ def _guarded_path_open(self, mode="r", *args, **kwargs):
161
+ if _mode_writes(mode):
162
+ _check_filewrite_target(self)
163
+ return _path_open(self, mode, *args, **kwargs)
164
+ pathlib.Path.open = _guarded_path_open
165
+
166
+ for name in ("write_text", "write_bytes", "mkdir", "unlink", "rmdir", "touch"):
167
+ if hasattr(pathlib.Path, name):
168
+ setattr(pathlib.Path, name, _guarded_path_method(getattr(pathlib.Path, name)))
169
+ for name in ("rename", "replace"):
170
+ if hasattr(pathlib.Path, name):
171
+ setattr(pathlib.Path, name, _guarded_path_move(getattr(pathlib.Path, name)))
172
+
173
+ for module, names in (
174
+ (os, ("remove", "unlink", "rmdir", "mkdir", "makedirs", "removedirs", "truncate")),
175
+ ):
176
+ for name in names:
177
+ if hasattr(module, name):
178
+ setattr(module, name, _guarded_os_one(getattr(module, name)))
179
+ for name in ("rename", "replace"):
180
+ if hasattr(os, name):
181
+ setattr(os, name, _guarded_os_two(getattr(os, name)))
182
+
183
+ for name in ("copy", "copy2", "copyfile", "copytree"):
184
+ if hasattr(shutil, name):
185
+ setattr(shutil, name, _guarded_shutil_copy(getattr(shutil, name)))
186
+ for name in ("move",):
187
+ if hasattr(shutil, name):
188
+ setattr(shutil, name, _guarded_os_two(getattr(shutil, name)))
189
+ for name in ("rmtree",):
190
+ if hasattr(shutil, name):
191
+ setattr(shutil, name, _guarded_os_one(getattr(shutil, name)))
192
+
193
+ def _blocked_popen(*args, **kwargs):
194
+ raise PermissionError(FILEWRITE_ERROR)
195
+ subprocess.Popen = _blocked_popen
196
+ subprocess.run = _blocked_popen
197
+ subprocess.call = _blocked_popen
198
+ subprocess.check_call = _blocked_popen
199
+ subprocess.check_output = _blocked_popen
200
+
201
+ def _install_network_guards():
202
+ if allow_network:
203
+ return
204
+
205
+ class _BlockedSocket(socket.socket):
206
+ def __init__(self, *args, **kwargs):
207
+ raise PermissionError(NETWORK_ERROR)
208
+
209
+ def _blocked_create_connection(*args, **kwargs):
210
+ raise PermissionError(NETWORK_ERROR)
211
+
212
+ socket.socket = _BlockedSocket
213
+ socket.create_connection = _blocked_create_connection
214
+
215
+ def _audit(event, args):
216
+ if not allow_filewrite:
217
+ if event == "open":
218
+ path = args[0] if len(args) > 0 else None
219
+ mode = args[1] if len(args) > 1 else None
220
+ flags = args[2] if len(args) > 2 else 0
221
+ if _mode_writes(mode) or _flags_write(flags):
222
+ _check_filewrite_target(path)
223
+ elif event in {
224
+ "os.remove",
225
+ "os.rmdir",
226
+ "os.mkdir",
227
+ "os.truncate",
228
+ "shutil.rmtree",
229
+ }:
230
+ path = args[0] if len(args) > 0 else None
231
+ _check_filewrite_target(path)
232
+ elif event in {"os.rename", "os.replace"}:
233
+ src = args[0] if len(args) > 0 else None
234
+ dst = args[1] if len(args) > 1 else None
235
+ _check_filewrite_target(src)
236
+ _check_filewrite_target(dst)
237
+ elif event == "subprocess.Popen":
238
+ raise PermissionError(FILEWRITE_ERROR)
239
+ if not allow_network and event.startswith("socket."):
240
+ raise PermissionError(NETWORK_ERROR)
241
+
242
+ try:
243
+ sys.addaudithook(_audit)
244
+ except Exception:
245
+ pass
246
+
247
+ _install_filewrite_guards()
248
+ _install_network_guards()
249
+ user_dir = os.path.dirname(os.path.abspath(user_path))
250
+ if user_dir:
251
+ sys.path.insert(0, user_dir)
252
+ runpy.run_path(user_path, run_name="__main__")
253
+ `;
254
+ export async function executePython(args, context) {
255
+ const source = await pythonSourceArg(args, context.cwd);
256
+ const runtime = context.pythonRuntime;
257
+ if (!runtime)
258
+ throw new Error("Python runtime is not available.");
259
+ const timeoutSeconds = clampTimeout(args.timeout);
260
+ const envOverrides = envOverridesArg(args.env);
261
+ const policy = context.pythonPolicy ?? {
262
+ allowNetwork: true,
263
+ allowFileWrite: true,
264
+ };
265
+ const tempDir = await mkdtemp(join(tmpdir(), "nerve-python-"));
266
+ const artifactDir = await createArtifactDir(context.dataDir);
267
+ let keepArtifactDir = false;
268
+ const runnerPath = join(tempDir, "runner.py");
269
+ const userPath = source.kind === "inline" ? join(tempDir, "user.py") : source.path;
270
+ if (source.kind === "inline") {
271
+ await Promise.all([
272
+ writeFile(runnerPath, RUNNER_SOURCE, "utf8"),
273
+ writeFile(userPath, source.code, "utf8"),
274
+ ]);
275
+ }
276
+ else {
277
+ await writeFile(runnerPath, RUNNER_SOURCE, "utf8");
278
+ }
279
+ try {
280
+ const result = await runPythonProcess({
281
+ runtime,
282
+ policy,
283
+ timeoutSeconds,
284
+ cwd: context.cwd,
285
+ runnerPath,
286
+ userPath,
287
+ artifactDir,
288
+ envOverrides,
289
+ inputMode: source.kind,
290
+ scriptPath: source.kind === "file" ? source.path : undefined,
291
+ dataDir: context.dataDir,
292
+ signal: context.signal,
293
+ onUpdate: context.onUpdate,
294
+ });
295
+ keepArtifactDir = artifactCount(result) > 0;
296
+ return result;
297
+ }
298
+ finally {
299
+ await rm(tempDir, { recursive: true, force: true }).catch(() => undefined);
300
+ if (!keepArtifactDir) {
301
+ await rm(artifactDir, { recursive: true, force: true }).catch(() => undefined);
302
+ }
303
+ }
304
+ }
305
+ async function runPythonProcess({ runtime, policy, timeoutSeconds, cwd, runnerPath, userPath, artifactDir, envOverrides, inputMode, scriptPath, dataDir, signal, onUpdate, }) {
306
+ const stdoutChunks = [];
307
+ const stderrChunks = [];
308
+ const combinedChunks = [];
309
+ const startedAt = performance.now();
310
+ return await new Promise((resolve, reject) => {
311
+ if (signal?.aborted) {
312
+ reject(new Error("Python execution aborted."));
313
+ return;
314
+ }
315
+ const runnerPolicy = {
316
+ ...policy,
317
+ artifactDir,
318
+ };
319
+ const child = spawn(runtime.command, [
320
+ ...runtime.args,
321
+ "-u",
322
+ "-B",
323
+ runnerPath,
324
+ userPath,
325
+ JSON.stringify(runnerPolicy),
326
+ ], {
327
+ cwd,
328
+ shell: false,
329
+ detached: process.platform !== "win32",
330
+ stdio: ["ignore", "pipe", "pipe"],
331
+ env: {
332
+ ...process.env,
333
+ ...envOverrides,
334
+ PYTHONIOENCODING: "utf-8",
335
+ PYTHONDONTWRITEBYTECODE: "1",
336
+ NERVE_PYTHON_ALLOW_NETWORK: policy.allowNetwork ? "1" : "0",
337
+ NERVE_PYTHON_ALLOW_FILEWRITE: policy.allowFileWrite ? "1" : "0",
338
+ NERVE_PYTHON_ARTIFACT_DIR: artifactDir,
339
+ },
340
+ });
341
+ let settled = false;
342
+ let timedOut = false;
343
+ let timeoutKilled = false;
344
+ let timeout;
345
+ let forceKillTimeout;
346
+ const cleanup = () => {
347
+ if (timeout)
348
+ clearTimeout(timeout);
349
+ if (forceKillTimeout)
350
+ clearTimeout(forceKillTimeout);
351
+ signal?.removeEventListener("abort", onAbort);
352
+ };
353
+ const kill = (killSignal = "SIGTERM") => {
354
+ try {
355
+ if (process.platform !== "win32" && child.pid) {
356
+ process.kill(-child.pid, killSignal);
357
+ }
358
+ else {
359
+ child.kill(killSignal);
360
+ }
361
+ }
362
+ catch {
363
+ child.kill(killSignal);
364
+ }
365
+ };
366
+ const onAbort = () => {
367
+ if (settled)
368
+ return;
369
+ kill();
370
+ settled = true;
371
+ cleanup();
372
+ reject(new Error("Python execution aborted."));
373
+ };
374
+ signal?.addEventListener("abort", onAbort, { once: true });
375
+ timeout = setTimeout(() => {
376
+ if (settled)
377
+ return;
378
+ timedOut = true;
379
+ timeoutKilled = true;
380
+ kill("SIGTERM");
381
+ forceKillTimeout = setTimeout(() => {
382
+ if (!settled)
383
+ kill("SIGKILL");
384
+ }, FORCE_KILL_AFTER_MS);
385
+ }, timeoutSeconds * 1000);
386
+ child.stdout?.on("data", (chunk) => {
387
+ stdoutChunks.push(chunk);
388
+ combinedChunks.push(chunk);
389
+ onUpdate?.({
390
+ kind: "output",
391
+ stream: "stdout",
392
+ chunk: boundLiveOutputChunk(chunk.toString("utf8")),
393
+ });
394
+ });
395
+ child.stderr?.on("data", (chunk) => {
396
+ stderrChunks.push(chunk);
397
+ combinedChunks.push(chunk);
398
+ onUpdate?.({
399
+ kind: "output",
400
+ stream: "stderr",
401
+ chunk: boundLiveOutputChunk(chunk.toString("utf8")),
402
+ });
403
+ });
404
+ child.on("error", (error) => {
405
+ if (settled)
406
+ return;
407
+ settled = true;
408
+ cleanup();
409
+ reject(error);
410
+ });
411
+ child.on("close", (code, closeSignal) => {
412
+ if (settled)
413
+ return;
414
+ settled = true;
415
+ cleanup();
416
+ const durationMs = Math.round(performance.now() - startedAt);
417
+ void listArtifacts(artifactDir)
418
+ .then((artifacts) => buildProcessResult({
419
+ stdoutChunks,
420
+ stderrChunks,
421
+ combinedChunks,
422
+ code,
423
+ signal: closeSignal,
424
+ outputFilePrefix: "nerve-python",
425
+ exitMessagePrefix: "Python",
426
+ dataDir,
427
+ durationMs,
428
+ timedOut,
429
+ timeoutKilled,
430
+ timeoutMessage: `Python timed out after ${timeoutSeconds}s and ${timeoutKilled ? "was killed" : "was not killed"}.`,
431
+ contentFooterLines: artifactFooterLines(artifacts),
432
+ details: {
433
+ executable: runtime.displayPath,
434
+ version: runtime.version,
435
+ timeoutSeconds,
436
+ allowNetwork: policy.allowNetwork,
437
+ allowFileWrite: policy.allowFileWrite,
438
+ envKeys: Object.keys(envOverrides).sort(),
439
+ inputMode,
440
+ scriptPath,
441
+ artifactDir: artifacts.length > 0 ? artifactDir : undefined,
442
+ artifacts,
443
+ },
444
+ }))
445
+ .then(resolve)
446
+ .catch(reject);
447
+ });
448
+ });
449
+ }
450
+ async function pythonSourceArg(args, cwd) {
451
+ const hasCode = args.code !== undefined;
452
+ const hasPath = args.path !== undefined;
453
+ if (hasCode && hasPath) {
454
+ throw new Error("Provide exactly one of tool arguments 'code' or 'path'.");
455
+ }
456
+ if (!hasCode && !hasPath) {
457
+ throw new Error("Provide exactly one of tool arguments 'code' or 'path'.");
458
+ }
459
+ if (hasCode) {
460
+ if (typeof args.code !== "string" || args.code.trim().length === 0) {
461
+ throw new Error("Tool argument 'code' must be a non-empty string.");
462
+ }
463
+ return { kind: "inline", code: args.code };
464
+ }
465
+ if (typeof args.path !== "string" || args.path.trim().length === 0) {
466
+ throw new Error("Tool argument 'path' must be a non-empty string.");
467
+ }
468
+ const path = resolveToolPath(cwd, args.path);
469
+ const info = await stat(path).catch((error) => {
470
+ throw new Error(pathNotFoundMessage("python", args.path, path), error instanceof Error ? { cause: error } : undefined);
471
+ });
472
+ if (!info.isFile()) {
473
+ throw new Error(`Tool argument 'path' must point to a Python script file: ${path}`);
474
+ }
475
+ return { kind: "file", path };
476
+ }
477
+ function clampTimeout(value) {
478
+ if (typeof value !== "number")
479
+ return DEFAULT_TIMEOUT_SECONDS;
480
+ const seconds = numberArg(value, DEFAULT_TIMEOUT_SECONDS);
481
+ if (seconds <= 0)
482
+ return DEFAULT_TIMEOUT_SECONDS;
483
+ return Math.min(seconds, MAX_TIMEOUT_SECONDS);
484
+ }
485
+ function envOverridesArg(value) {
486
+ if (value === undefined)
487
+ return {};
488
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
489
+ throw new Error("Tool argument 'env' must be an object of string values.");
490
+ }
491
+ const output = {};
492
+ for (const [key, raw] of Object.entries(value)) {
493
+ if (typeof raw !== "string") {
494
+ throw new Error("Tool argument 'env' must be an object of string values.");
495
+ }
496
+ if (raw.includes("\0")) {
497
+ throw new Error("Tool argument 'env' contains an invalid value.");
498
+ }
499
+ if (key.length === 0 || key.includes("=") || key.includes("\0")) {
500
+ throw new Error("Tool argument 'env' contains an invalid environment key.");
501
+ }
502
+ if (SENSITIVE_ENV_KEY_PATTERN.test(key)) {
503
+ throw new Error(`Tool argument 'env' contains sensitive-looking key '${key}'. The python tool only accepts non-secret env overrides.`);
504
+ }
505
+ output[key] = raw;
506
+ }
507
+ return output;
508
+ }
509
+ async function createArtifactDir(dataDir) {
510
+ const baseDir = dataDir
511
+ ? join(dataDir, "tmp", "python-artifacts")
512
+ : join(tmpdir(), "nerve-python-artifacts");
513
+ await mkdir(baseDir, { recursive: true, mode: 0o700 });
514
+ return await mkdtemp(join(baseDir, "run-"));
515
+ }
516
+ async function listArtifacts(root) {
517
+ const artifacts = [];
518
+ await visitArtifactDir(root, artifacts).catch(() => undefined);
519
+ return artifacts.sort((a, b) => a.path.localeCompare(b.path));
520
+ }
521
+ async function visitArtifactDir(dir, artifacts) {
522
+ if (artifacts.length >= MAX_ARTIFACTS)
523
+ return;
524
+ const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);
525
+ for (const entry of entries) {
526
+ if (artifacts.length >= MAX_ARTIFACTS)
527
+ return;
528
+ const path = join(dir, entry.name);
529
+ if (entry.isDirectory()) {
530
+ await visitArtifactDir(path, artifacts);
531
+ continue;
532
+ }
533
+ if (!entry.isFile())
534
+ continue;
535
+ const info = await stat(path).catch(() => undefined);
536
+ artifacts.push({ path, size: info?.size ?? 0 });
537
+ }
538
+ }
539
+ function artifactFooterLines(artifacts) {
540
+ if (artifacts.length === 0)
541
+ return [];
542
+ const lines = [
543
+ `Python artifacts (${artifacts.length}):`,
544
+ ...artifacts.map((artifact) => `- ${artifact.path} (${formatArtifactSize(artifact.size)})`),
545
+ ];
546
+ if (artifacts.length >= MAX_ARTIFACTS) {
547
+ lines.push(`- ... artifact list capped at ${MAX_ARTIFACTS} files`);
548
+ }
549
+ return lines;
550
+ }
551
+ function artifactCount(result) {
552
+ const details = result.details;
553
+ if (!details || typeof details !== "object")
554
+ return 0;
555
+ const artifacts = details.artifacts;
556
+ return Array.isArray(artifacts) ? artifacts.length : 0;
557
+ }
558
+ function formatArtifactSize(bytes) {
559
+ if (bytes < 1024)
560
+ return `${bytes} B`;
561
+ const kb = bytes / 1024;
562
+ if (kb < 1024)
563
+ return `${kb.toFixed(1)} KB`;
564
+ return `${(kb / 1024).toFixed(1)} MB`;
565
+ }
566
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/execution/python/python.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type PythonRuntimeSource = "manual" | "project_venv" | "path" | "windows_launcher" | "uv";
2
+ export type PythonRuntime = {
3
+ command: string;
4
+ args: string[];
5
+ displayPath: string;
6
+ version?: string;
7
+ source: PythonRuntimeSource;
8
+ };
9
+ export type PythonRuntimeStatus = (PythonRuntime & {
10
+ available: true;
11
+ }) | {
12
+ available: false;
13
+ source: "unavailable";
14
+ error: string;
15
+ };
16
+ export type ResolvePythonRuntimeOptions = {
17
+ cwd: string;
18
+ manualPath?: string;
19
+ timeoutMs?: number;
20
+ };
21
+ export declare function resolvePythonRuntime(options: ResolvePythonRuntimeOptions): Promise<PythonRuntimeStatus>;
22
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/execution/python/runtime.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,cAAc,GACd,MAAM,GACN,kBAAkB,GAClB,IAAI,CAAC;AAET,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B,CAAC,aAAa,GAAG;IAAE,SAAS,EAAE,IAAI,CAAA;CAAE,CAAC,GACrC;IACE,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,MAAM,MAAM,2BAA2B,GAAG;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAiBF,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,CAkC9B"}