@marifold/core 0.60.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 (310) hide show
  1. package/LICENSE +674 -0
  2. package/dist/agent/AgentEvents.d.ts +106 -0
  3. package/dist/agent/AgentEvents.d.ts.map +1 -0
  4. package/dist/agent/AgentEvents.js +3 -0
  5. package/dist/agent/AgentEvents.js.map +1 -0
  6. package/dist/agent/AgentHistory.d.ts +27 -0
  7. package/dist/agent/AgentHistory.d.ts.map +1 -0
  8. package/dist/agent/AgentHistory.js +42 -0
  9. package/dist/agent/AgentHistory.js.map +1 -0
  10. package/dist/agent/AgentRunner.d.ts +149 -0
  11. package/dist/agent/AgentRunner.d.ts.map +1 -0
  12. package/dist/agent/AgentRunner.js +727 -0
  13. package/dist/agent/AgentRunner.js.map +1 -0
  14. package/dist/agent/ApprovalPolicy.d.ts +71 -0
  15. package/dist/agent/ApprovalPolicy.d.ts.map +1 -0
  16. package/dist/agent/ApprovalPolicy.js +29 -0
  17. package/dist/agent/ApprovalPolicy.js.map +1 -0
  18. package/dist/agent/ControlBlockTools.d.ts +9 -0
  19. package/dist/agent/ControlBlockTools.d.ts.map +1 -0
  20. package/dist/agent/ControlBlockTools.js +49 -0
  21. package/dist/agent/ControlBlockTools.js.map +1 -0
  22. package/dist/agent/RunWorkspace.d.ts +92 -0
  23. package/dist/agent/RunWorkspace.d.ts.map +1 -0
  24. package/dist/agent/RunWorkspace.js +328 -0
  25. package/dist/agent/RunWorkspace.js.map +1 -0
  26. package/dist/agent/ScopedProcess.d.ts +35 -0
  27. package/dist/agent/ScopedProcess.d.ts.map +1 -0
  28. package/dist/agent/ScopedProcess.js +280 -0
  29. package/dist/agent/ScopedProcess.js.map +1 -0
  30. package/dist/agent/ToolRegistry.d.ts +80 -0
  31. package/dist/agent/ToolRegistry.d.ts.map +1 -0
  32. package/dist/agent/ToolRegistry.js +45 -0
  33. package/dist/agent/ToolRegistry.js.map +1 -0
  34. package/dist/agent/UserInput.d.ts +59 -0
  35. package/dist/agent/UserInput.d.ts.map +1 -0
  36. package/dist/agent/UserInput.js +203 -0
  37. package/dist/agent/UserInput.js.map +1 -0
  38. package/dist/agent/tools/AskUserTool.d.ts +71 -0
  39. package/dist/agent/tools/AskUserTool.d.ts.map +1 -0
  40. package/dist/agent/tools/AskUserTool.js +70 -0
  41. package/dist/agent/tools/AskUserTool.js.map +1 -0
  42. package/dist/agent/tools/DelegateTool.d.ts +49 -0
  43. package/dist/agent/tools/DelegateTool.d.ts.map +1 -0
  44. package/dist/agent/tools/DelegateTool.js +62 -0
  45. package/dist/agent/tools/DelegateTool.js.map +1 -0
  46. package/dist/agent/tools/InspectAttachmentTool.d.ts +25 -0
  47. package/dist/agent/tools/InspectAttachmentTool.d.ts.map +1 -0
  48. package/dist/agent/tools/InspectAttachmentTool.js +129 -0
  49. package/dist/agent/tools/InspectAttachmentTool.js.map +1 -0
  50. package/dist/agent/tools/PythonPackageTool.d.ts +26 -0
  51. package/dist/agent/tools/PythonPackageTool.d.ts.map +1 -0
  52. package/dist/agent/tools/PythonPackageTool.js +105 -0
  53. package/dist/agent/tools/PythonPackageTool.js.map +1 -0
  54. package/dist/agent/tools/ReadFileTool.d.ts +24 -0
  55. package/dist/agent/tools/ReadFileTool.d.ts.map +1 -0
  56. package/dist/agent/tools/ReadFileTool.js +112 -0
  57. package/dist/agent/tools/ReadFileTool.js.map +1 -0
  58. package/dist/agent/tools/ShellExecTool.d.ts +23 -0
  59. package/dist/agent/tools/ShellExecTool.d.ts.map +1 -0
  60. package/dist/agent/tools/ShellExecTool.js +75 -0
  61. package/dist/agent/tools/ShellExecTool.js.map +1 -0
  62. package/dist/agent/tools/WebSearchTool.d.ts +26 -0
  63. package/dist/agent/tools/WebSearchTool.d.ts.map +1 -0
  64. package/dist/agent/tools/WebSearchTool.js +52 -0
  65. package/dist/agent/tools/WebSearchTool.js.map +1 -0
  66. package/dist/agent/tools/WriteFileTool.d.ts +30 -0
  67. package/dist/agent/tools/WriteFileTool.d.ts.map +1 -0
  68. package/dist/agent/tools/WriteFileTool.js +155 -0
  69. package/dist/agent/tools/WriteFileTool.js.map +1 -0
  70. package/dist/app/AppActionResolver.d.ts +15 -0
  71. package/dist/app/AppActionResolver.d.ts.map +1 -0
  72. package/dist/app/AppActionResolver.js +98 -0
  73. package/dist/app/AppActionResolver.js.map +1 -0
  74. package/dist/app/AppSchema.d.ts +83 -0
  75. package/dist/app/AppSchema.d.ts.map +1 -0
  76. package/dist/app/AppSchema.js +17 -0
  77. package/dist/app/AppSchema.js.map +1 -0
  78. package/dist/app/AppStore.d.ts +14 -0
  79. package/dist/app/AppStore.d.ts.map +1 -0
  80. package/dist/app/AppStore.js +146 -0
  81. package/dist/app/AppStore.js.map +1 -0
  82. package/dist/app/AppValidator.d.ts +10 -0
  83. package/dist/app/AppValidator.d.ts.map +1 -0
  84. package/dist/app/AppValidator.js +503 -0
  85. package/dist/app/AppValidator.js.map +1 -0
  86. package/dist/app/SkillAppCompiler.d.ts +5 -0
  87. package/dist/app/SkillAppCompiler.d.ts.map +1 -0
  88. package/dist/app/SkillAppCompiler.js +632 -0
  89. package/dist/app/SkillAppCompiler.js.map +1 -0
  90. package/dist/app/SkillAppDsl.d.ts +93 -0
  91. package/dist/app/SkillAppDsl.d.ts.map +1 -0
  92. package/dist/app/SkillAppDsl.js +72 -0
  93. package/dist/app/SkillAppDsl.js.map +1 -0
  94. package/dist/app/SkillAppInstanceRegistry.d.ts +25 -0
  95. package/dist/app/SkillAppInstanceRegistry.d.ts.map +1 -0
  96. package/dist/app/SkillAppInstanceRegistry.js +218 -0
  97. package/dist/app/SkillAppInstanceRegistry.js.map +1 -0
  98. package/dist/app/SkillAppResolver.d.ts +12 -0
  99. package/dist/app/SkillAppResolver.d.ts.map +1 -0
  100. package/dist/app/SkillAppResolver.js +89 -0
  101. package/dist/app/SkillAppResolver.js.map +1 -0
  102. package/dist/app/SkillAppSchema.d.ts +116 -0
  103. package/dist/app/SkillAppSchema.d.ts.map +1 -0
  104. package/dist/app/SkillAppSchema.js +5 -0
  105. package/dist/app/SkillAppSchema.js.map +1 -0
  106. package/dist/channels/TelegramBridge.d.ts +103 -0
  107. package/dist/channels/TelegramBridge.d.ts.map +1 -0
  108. package/dist/channels/TelegramBridge.js +565 -0
  109. package/dist/channels/TelegramBridge.js.map +1 -0
  110. package/dist/channels/respond.d.ts +46 -0
  111. package/dist/channels/respond.d.ts.map +1 -0
  112. package/dist/channels/respond.js +41 -0
  113. package/dist/channels/respond.js.map +1 -0
  114. package/dist/config/ChatGptTokenRefresh.d.ts +18 -0
  115. package/dist/config/ChatGptTokenRefresh.d.ts.map +1 -0
  116. package/dist/config/ChatGptTokenRefresh.js +63 -0
  117. package/dist/config/ChatGptTokenRefresh.js.map +1 -0
  118. package/dist/config/ConfigBackup.d.ts +20 -0
  119. package/dist/config/ConfigBackup.d.ts.map +1 -0
  120. package/dist/config/ConfigBackup.js +197 -0
  121. package/dist/config/ConfigBackup.js.map +1 -0
  122. package/dist/config/ConfigLoader.d.ts +28 -0
  123. package/dist/config/ConfigLoader.d.ts.map +1 -0
  124. package/dist/config/ConfigLoader.js +335 -0
  125. package/dist/config/ConfigLoader.js.map +1 -0
  126. package/dist/config/ConfigManager.d.ts +55 -0
  127. package/dist/config/ConfigManager.d.ts.map +1 -0
  128. package/dist/config/ConfigManager.js +707 -0
  129. package/dist/config/ConfigManager.js.map +1 -0
  130. package/dist/config/ConfigSchema.d.ts +231 -0
  131. package/dist/config/ConfigSchema.d.ts.map +1 -0
  132. package/dist/config/ConfigSchema.js +15 -0
  133. package/dist/config/ConfigSchema.js.map +1 -0
  134. package/dist/config/GitHubCopilotAuth.d.ts +7 -0
  135. package/dist/config/GitHubCopilotAuth.d.ts.map +1 -0
  136. package/dist/config/GitHubCopilotAuth.js +40 -0
  137. package/dist/config/GitHubCopilotAuth.js.map +1 -0
  138. package/dist/config/MarifoldOpenAICompatProvider.d.ts +39 -0
  139. package/dist/config/MarifoldOpenAICompatProvider.d.ts.map +1 -0
  140. package/dist/config/MarifoldOpenAICompatProvider.js +158 -0
  141. package/dist/config/MarifoldOpenAICompatProvider.js.map +1 -0
  142. package/dist/config/OpenAICompatUrls.d.ts +7 -0
  143. package/dist/config/OpenAICompatUrls.d.ts.map +1 -0
  144. package/dist/config/OpenAICompatUrls.js +47 -0
  145. package/dist/config/OpenAICompatUrls.js.map +1 -0
  146. package/dist/config/ProviderFactory.d.ts +12 -0
  147. package/dist/config/ProviderFactory.d.ts.map +1 -0
  148. package/dist/config/ProviderFactory.js +61 -0
  149. package/dist/config/ProviderFactory.js.map +1 -0
  150. package/dist/config/ProviderInspector.d.ts +46 -0
  151. package/dist/config/ProviderInspector.d.ts.map +1 -0
  152. package/dist/config/ProviderInspector.js +356 -0
  153. package/dist/config/ProviderInspector.js.map +1 -0
  154. package/dist/config/ProviderRegistry.d.ts +19 -0
  155. package/dist/config/ProviderRegistry.d.ts.map +1 -0
  156. package/dist/config/ProviderRegistry.js +301 -0
  157. package/dist/config/ProviderRegistry.js.map +1 -0
  158. package/dist/config/XaiTokenRefresh.d.ts +15 -0
  159. package/dist/config/XaiTokenRefresh.d.ts.map +1 -0
  160. package/dist/config/XaiTokenRefresh.js +73 -0
  161. package/dist/config/XaiTokenRefresh.js.map +1 -0
  162. package/dist/errors/MarifoldError.d.ts +34 -0
  163. package/dist/errors/MarifoldError.d.ts.map +1 -0
  164. package/dist/errors/MarifoldError.js +100 -0
  165. package/dist/errors/MarifoldError.js.map +1 -0
  166. package/dist/images/ImageOptimizer.d.ts +34 -0
  167. package/dist/images/ImageOptimizer.d.ts.map +1 -0
  168. package/dist/images/ImageOptimizer.js +225 -0
  169. package/dist/images/ImageOptimizer.js.map +1 -0
  170. package/dist/index.d.ts +96 -0
  171. package/dist/index.d.ts.map +1 -0
  172. package/dist/index.js +193 -0
  173. package/dist/index.js.map +1 -0
  174. package/dist/memory/MemoryControls.d.ts +26 -0
  175. package/dist/memory/MemoryControls.d.ts.map +1 -0
  176. package/dist/memory/MemoryControls.js +388 -0
  177. package/dist/memory/MemoryControls.js.map +1 -0
  178. package/dist/memory/MemoryStore.d.ts +122 -0
  179. package/dist/memory/MemoryStore.d.ts.map +1 -0
  180. package/dist/memory/MemoryStore.js +1096 -0
  181. package/dist/memory/MemoryStore.js.map +1 -0
  182. package/dist/profiles/ProfileManager.d.ts +139 -0
  183. package/dist/profiles/ProfileManager.d.ts.map +1 -0
  184. package/dist/profiles/ProfileManager.js +475 -0
  185. package/dist/profiles/ProfileManager.js.map +1 -0
  186. package/dist/profiles/ProfileResolver.d.ts +18 -0
  187. package/dist/profiles/ProfileResolver.d.ts.map +1 -0
  188. package/dist/profiles/ProfileResolver.js +280 -0
  189. package/dist/profiles/ProfileResolver.js.map +1 -0
  190. package/dist/runs/RunRegistry.d.ts +140 -0
  191. package/dist/runs/RunRegistry.d.ts.map +1 -0
  192. package/dist/runs/RunRegistry.js +432 -0
  193. package/dist/runs/RunRegistry.js.map +1 -0
  194. package/dist/runtime/MarifoldRuntime.d.ts +244 -0
  195. package/dist/runtime/MarifoldRuntime.d.ts.map +1 -0
  196. package/dist/runtime/MarifoldRuntime.js +1099 -0
  197. package/dist/runtime/MarifoldRuntime.js.map +1 -0
  198. package/dist/runtime/MarifoldTypes.d.ts +70 -0
  199. package/dist/runtime/MarifoldTypes.d.ts.map +1 -0
  200. package/dist/runtime/MarifoldTypes.js +3 -0
  201. package/dist/runtime/MarifoldTypes.js.map +1 -0
  202. package/dist/schedule/ScheduleStore.d.ts +60 -0
  203. package/dist/schedule/ScheduleStore.d.ts.map +1 -0
  204. package/dist/schedule/ScheduleStore.js +212 -0
  205. package/dist/schedule/ScheduleStore.js.map +1 -0
  206. package/dist/schedule/Scheduler.d.ts +28 -0
  207. package/dist/schedule/Scheduler.d.ts.map +1 -0
  208. package/dist/schedule/Scheduler.js +65 -0
  209. package/dist/schedule/Scheduler.js.map +1 -0
  210. package/dist/search/DuckDuckGoBackend.d.ts +18 -0
  211. package/dist/search/DuckDuckGoBackend.d.ts.map +1 -0
  212. package/dist/search/DuckDuckGoBackend.js +37 -0
  213. package/dist/search/DuckDuckGoBackend.js.map +1 -0
  214. package/dist/search/FirecrawlBackend.d.ts +28 -0
  215. package/dist/search/FirecrawlBackend.d.ts.map +1 -0
  216. package/dist/search/FirecrawlBackend.js +76 -0
  217. package/dist/search/FirecrawlBackend.js.map +1 -0
  218. package/dist/search/SearchBackend.d.ts +18 -0
  219. package/dist/search/SearchBackend.d.ts.map +1 -0
  220. package/dist/search/SearchBackend.js +24 -0
  221. package/dist/search/SearchBackend.js.map +1 -0
  222. package/dist/search/createSearchBackend.d.ts +16 -0
  223. package/dist/search/createSearchBackend.d.ts.map +1 -0
  224. package/dist/search/createSearchBackend.js +30 -0
  225. package/dist/search/createSearchBackend.js.map +1 -0
  226. package/dist/sessions/ResponseMetrics.d.ts +17 -0
  227. package/dist/sessions/ResponseMetrics.d.ts.map +1 -0
  228. package/dist/sessions/ResponseMetrics.js +3 -0
  229. package/dist/sessions/ResponseMetrics.js.map +1 -0
  230. package/dist/sessions/SessionResolver.d.ts +135 -0
  231. package/dist/sessions/SessionResolver.d.ts.map +1 -0
  232. package/dist/sessions/SessionResolver.js +1173 -0
  233. package/dist/sessions/SessionResolver.js.map +1 -0
  234. package/dist/skill/BuiltInSkillManager.d.ts +11 -0
  235. package/dist/skill/BuiltInSkillManager.d.ts.map +1 -0
  236. package/dist/skill/BuiltInSkillManager.js +98 -0
  237. package/dist/skill/BuiltInSkillManager.js.map +1 -0
  238. package/dist/skill/SkillInvocation.d.ts +30 -0
  239. package/dist/skill/SkillInvocation.d.ts.map +1 -0
  240. package/dist/skill/SkillInvocation.js +135 -0
  241. package/dist/skill/SkillInvocation.js.map +1 -0
  242. package/dist/skill/SkillSchema.d.ts +37 -0
  243. package/dist/skill/SkillSchema.d.ts.map +1 -0
  244. package/dist/skill/SkillSchema.js +26 -0
  245. package/dist/skill/SkillSchema.js.map +1 -0
  246. package/dist/skill/SkillStore.d.ts +41 -0
  247. package/dist/skill/SkillStore.d.ts.map +1 -0
  248. package/dist/skill/SkillStore.js +184 -0
  249. package/dist/skill/SkillStore.js.map +1 -0
  250. package/dist/skill/SkillTemplater.d.ts +19 -0
  251. package/dist/skill/SkillTemplater.d.ts.map +1 -0
  252. package/dist/skill/SkillTemplater.js +36 -0
  253. package/dist/skill/SkillTemplater.js.map +1 -0
  254. package/dist/skill/SkillValidator.d.ts +10 -0
  255. package/dist/skill/SkillValidator.d.ts.map +1 -0
  256. package/dist/skill/SkillValidator.js +131 -0
  257. package/dist/skill/SkillValidator.js.map +1 -0
  258. package/dist/skill/SkillVars.d.ts +10 -0
  259. package/dist/skill/SkillVars.d.ts.map +1 -0
  260. package/dist/skill/SkillVars.js +65 -0
  261. package/dist/skill/SkillVars.js.map +1 -0
  262. package/dist/skill/index.d.ts +10 -0
  263. package/dist/skill/index.d.ts.map +1 -0
  264. package/dist/skill/index.js +22 -0
  265. package/dist/skill/index.js.map +1 -0
  266. package/dist/skillapp/SkillAppActionResolver.d.ts +13 -0
  267. package/dist/skillapp/SkillAppActionResolver.d.ts.map +1 -0
  268. package/dist/skillapp/SkillAppActionResolver.js +95 -0
  269. package/dist/skillapp/SkillAppActionResolver.js.map +1 -0
  270. package/dist/skillapp/SkillAppSchema.d.ts +79 -0
  271. package/dist/skillapp/SkillAppSchema.d.ts.map +1 -0
  272. package/dist/skillapp/SkillAppSchema.js +20 -0
  273. package/dist/skillapp/SkillAppSchema.js.map +1 -0
  274. package/dist/skillapp/SkillAppStore.d.ts +11 -0
  275. package/dist/skillapp/SkillAppStore.d.ts.map +1 -0
  276. package/dist/skillapp/SkillAppStore.js +98 -0
  277. package/dist/skillapp/SkillAppStore.js.map +1 -0
  278. package/dist/skillapp/SkillAppValidator.d.ts +10 -0
  279. package/dist/skillapp/SkillAppValidator.d.ts.map +1 -0
  280. package/dist/skillapp/SkillAppValidator.js +522 -0
  281. package/dist/skillapp/SkillAppValidator.js.map +1 -0
  282. package/dist/tasks/TaskStore.d.ts +110 -0
  283. package/dist/tasks/TaskStore.d.ts.map +1 -0
  284. package/dist/tasks/TaskStore.js +371 -0
  285. package/dist/tasks/TaskStore.js.map +1 -0
  286. package/dist/util/fetchRetry.d.ts +11 -0
  287. package/dist/util/fetchRetry.d.ts.map +1 -0
  288. package/dist/util/fetchRetry.js +48 -0
  289. package/dist/util/fetchRetry.js.map +1 -0
  290. package/dist/util/idToken.d.ts +12 -0
  291. package/dist/util/idToken.d.ts.map +1 -0
  292. package/dist/util/idToken.js +32 -0
  293. package/dist/util/idToken.js.map +1 -0
  294. package/dist/util/proxy.d.ts +18 -0
  295. package/dist/util/proxy.d.ts.map +1 -0
  296. package/dist/util/proxy.js +28 -0
  297. package/dist/util/proxy.js.map +1 -0
  298. package/dist/workspace/Workspace.d.ts +9 -0
  299. package/dist/workspace/Workspace.d.ts.map +1 -0
  300. package/dist/workspace/Workspace.js +55 -0
  301. package/dist/workspace/Workspace.js.map +1 -0
  302. package/dist/workspace/WorkspaceInitializer.d.ts +40 -0
  303. package/dist/workspace/WorkspaceInitializer.d.ts.map +1 -0
  304. package/dist/workspace/WorkspaceInitializer.js +212 -0
  305. package/dist/workspace/WorkspaceInitializer.js.map +1 -0
  306. package/dist/workspace/WorkspacePaths.d.ts +11 -0
  307. package/dist/workspace/WorkspacePaths.d.ts.map +1 -0
  308. package/dist/workspace/WorkspacePaths.js +82 -0
  309. package/dist/workspace/WorkspacePaths.js.map +1 -0
  310. package/package.json +36 -0
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RUN_WORKSPACE_RETENTION_MS = exports.MAX_RUN_INSPECTION_TEXT_BYTES = exports.MAX_RUN_INPUT_BYTES = void 0;
37
+ exports.createRunWorkspace = createRunWorkspace;
38
+ exports.stageRunFiles = stageRunFiles;
39
+ exports.stageRunImages = stageRunImages;
40
+ exports.resolveToolPath = resolveToolPath;
41
+ exports.isInsideAnyRoot = isInsideAnyRoot;
42
+ exports.isOutsideUserHome = isOutsideUserHome;
43
+ exports.isSensitiveHostPath = isSensitiveHostPath;
44
+ exports.isProtectedSystemWrite = isProtectedSystemWrite;
45
+ exports.isInside = isInside;
46
+ const fs = __importStar(require("fs"));
47
+ const os = __importStar(require("os"));
48
+ const path = __importStar(require("path"));
49
+ const MarifoldError_1 = require("../errors/MarifoldError");
50
+ const WorkspacePaths_1 = require("../workspace/WorkspacePaths");
51
+ exports.MAX_RUN_INPUT_BYTES = 16 * 1024 * 1024;
52
+ exports.MAX_RUN_INSPECTION_TEXT_BYTES = 256 * 1024;
53
+ exports.RUN_WORKSPACE_RETENTION_MS = 24 * 60 * 60 * 1000;
54
+ function createRunWorkspace(options) {
55
+ const id = safeRunId(options.id);
56
+ const runsDir = options.runsDir ?? path.join((0, WorkspacePaths_1.marifoldHome)(), 'runs');
57
+ fs.mkdirSync(runsDir, { recursive: true, mode: 0o700 });
58
+ pruneRunWorkspaces(runsDir);
59
+ const rootDir = path.join(runsDir, id);
60
+ const homeDir = path.join(rootDir, 'home');
61
+ const workDir = path.join(rootDir, 'work');
62
+ const inputDir = path.join(rootDir, 'input');
63
+ const outputDir = path.join(rootDir, 'output');
64
+ const tempDir = path.join(rootDir, 'tmp');
65
+ const cacheDir = path.join(rootDir, 'cache');
66
+ const venvDir = path.join(workDir, '.venv');
67
+ for (const dir of [rootDir, homeDir, workDir, inputDir, outputDir, tempDir, cacheDir]) {
68
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
69
+ }
70
+ const userHome = canonicalExistingPath(options.userHome ?? os.homedir());
71
+ const requestedCwd = canonicalExistingPath(options.cwd ?? process.cwd());
72
+ // Never turn a broad/sensitive root into an implicit read-write capability.
73
+ // A service launched from $HOME should work in the run scratch directory,
74
+ // not silently grant the model the whole account.
75
+ const appHome = options.runsDir ? path.dirname(canonicalExistingPath(options.runsDir)) : canonicalExistingPath((0, WorkspacePaths_1.marifoldHome)());
76
+ const cwd = isUnsafeBroadRoot(requestedCwd, userHome, appHome)
77
+ ? canonicalExistingPath(workDir)
78
+ : requestedCwd;
79
+ const trusted = uniqueExistingDirectories(options.trustedFolders ?? [])
80
+ .filter(folder => !isUnsafeBroadRoot(folder, userHome, appHome));
81
+ const readOnlyRoots = uniqueExistingDirectories(options.readOnlyFolders ?? [])
82
+ .filter(folder => isInside(folder, userHome))
83
+ .filter(folder => !isUnsafeBroadReadRoot(folder, userHome, appHome));
84
+ const runWriteRoots = [homeDir, workDir, outputDir, tempDir, cacheDir].map(canonicalExistingPath);
85
+ const writeRoots = uniquePaths([cwd, ...trusted, ...runWriteRoots]);
86
+ const readRoots = uniquePaths([...writeRoots, canonicalExistingPath(inputDir), ...readOnlyRoots]);
87
+ const externalRoots = writeRoots.filter(root => !isInside(root, userHome));
88
+ const workspace = {
89
+ id,
90
+ rootDir: canonicalExistingPath(rootDir),
91
+ homeDir: canonicalExistingPath(homeDir),
92
+ workDir: canonicalExistingPath(workDir),
93
+ inputDir: canonicalExistingPath(inputDir),
94
+ outputDir: canonicalExistingPath(outputDir),
95
+ tempDir: canonicalExistingPath(tempDir),
96
+ cacheDir: canonicalExistingPath(cacheDir),
97
+ venvDir: path.join(canonicalExistingPath(workDir), '.venv'),
98
+ cwd,
99
+ userHome,
100
+ readOnlyRoots,
101
+ readRoots,
102
+ writeRoots,
103
+ externalRoots,
104
+ files: [],
105
+ attachments: [],
106
+ };
107
+ workspace.files = stageRunFiles(workspace, options.files ?? []);
108
+ workspace.attachments.push(...workspace.files);
109
+ stageRunImages(workspace, options.images ?? []);
110
+ return workspace;
111
+ }
112
+ function stageRunFiles(workspace, files) {
113
+ let total = workspace.attachments.reduce((sum, attachment) => sum + attachment.size, 0);
114
+ const used = new Set(workspace.attachments.map(attachment => attachment.name.toLowerCase()));
115
+ return files.map((file, index) => {
116
+ const bytes = decodeBase64(file.data, `files[${index}].data`);
117
+ total += bytes.length;
118
+ if (total > exports.MAX_RUN_INPUT_BYTES) {
119
+ throw MarifoldError_1.MarifoldError.agentRunInvalid(`Run attachments exceed ${exports.MAX_RUN_INPUT_BYTES / (1024 * 1024)} MiB.`);
120
+ }
121
+ if (file.inspectionText && Buffer.byteLength(file.inspectionText, 'utf8') > exports.MAX_RUN_INSPECTION_TEXT_BYTES) {
122
+ throw MarifoldError_1.MarifoldError.agentRunInvalid(`files[${index}].inspectionText exceeds ${exports.MAX_RUN_INSPECTION_TEXT_BYTES / 1024} KiB.`);
123
+ }
124
+ const name = uniqueFileName(safeFileName(file.name, index), used);
125
+ const target = path.join(workspace.inputDir, name);
126
+ fs.writeFileSync(target, bytes, { mode: 0o400 });
127
+ return {
128
+ id: `attachment-${workspace.attachments.length + index + 1}`,
129
+ name,
130
+ mediaType: file.mediaType || 'application/octet-stream',
131
+ path: target,
132
+ size: bytes.length,
133
+ ...(file.inspectionText ? { inspectionText: file.inspectionText } : {}),
134
+ };
135
+ });
136
+ }
137
+ /** Stage local/embedded images into the same read-only attachment area used by
138
+ * files. This lets an agent inspect an image only when needed instead of
139
+ * sending it on every stateless model iteration. */
140
+ function stageRunImages(workspace, images) {
141
+ const used = new Set(workspace.attachments.map(attachment => attachment.name.toLowerCase()));
142
+ let total = workspace.attachments.reduce((sum, attachment) => sum + attachment.size, 0);
143
+ const staged = images.map((image, index) => {
144
+ const id = `attachment-${workspace.attachments.length + index + 1}`;
145
+ const mediaType = image.mediaType || 'image/jpeg';
146
+ const extension = imageExtension(mediaType);
147
+ const name = uniqueFileName(`image-${index + 1}.${extension}`, used);
148
+ if (image.url) {
149
+ return { id, name, mediaType, size: 0, image: { url: image.url, mediaType } };
150
+ }
151
+ let bytes;
152
+ try {
153
+ bytes = image.path ? fs.readFileSync(image.path) : decodeBase64(image.data ?? '', `images[${index}].data`);
154
+ }
155
+ catch (error) {
156
+ if (error instanceof MarifoldError_1.MarifoldError)
157
+ throw error;
158
+ throw MarifoldError_1.MarifoldError.agentRunInvalid(`Could not stage image #${index + 1}: ${error instanceof Error ? error.message : String(error)}`);
159
+ }
160
+ total += bytes.length;
161
+ if (total > exports.MAX_RUN_INPUT_BYTES) {
162
+ throw MarifoldError_1.MarifoldError.agentRunInvalid(`Run attachments exceed ${exports.MAX_RUN_INPUT_BYTES / (1024 * 1024)} MiB.`);
163
+ }
164
+ const target = path.join(workspace.inputDir, name);
165
+ fs.writeFileSync(target, bytes, { mode: 0o400 });
166
+ return {
167
+ id,
168
+ name,
169
+ mediaType,
170
+ path: target,
171
+ size: bytes.length,
172
+ image: { path: target, mediaType },
173
+ };
174
+ });
175
+ workspace.attachments.push(...staged);
176
+ return staged;
177
+ }
178
+ function resolveToolPath(input, workspace, cwd) {
179
+ if (input === '~' && workspace)
180
+ return workspace.userHome;
181
+ if (input.startsWith('~/') && workspace)
182
+ return path.join(workspace.userHome, input.slice(2));
183
+ if (input === '~')
184
+ return os.homedir();
185
+ if (input.startsWith('~/'))
186
+ return path.join(os.homedir(), input.slice(2));
187
+ return path.resolve(cwd, input);
188
+ }
189
+ function isInsideAnyRoot(target, roots) {
190
+ const resolved = canonicalPath(target);
191
+ return roots.some(root => isInside(resolved, root));
192
+ }
193
+ function isOutsideUserHome(target, workspace) {
194
+ return !isInside(canonicalPath(target), workspace.userHome);
195
+ }
196
+ function isSensitiveHostPath(target, workspace) {
197
+ const resolved = canonicalPath(target);
198
+ if (isInside(resolved, workspace.rootDir))
199
+ return false;
200
+ const sensitive = [
201
+ path.join(workspace.userHome, '.ssh'),
202
+ path.join(workspace.userHome, '.gnupg'),
203
+ path.join(workspace.userHome, '.marifold'),
204
+ path.join(workspace.userHome, 'Library', 'Keychains'),
205
+ ];
206
+ return sensitive.some(root => isInside(resolved, root));
207
+ }
208
+ function isProtectedSystemWrite(target, workspace) {
209
+ const resolved = canonicalPath(target);
210
+ if (isInsideAnyRoot(resolved, workspace.writeRoots))
211
+ return false;
212
+ const roots = process.platform === 'win32'
213
+ ? [process.env.SystemRoot, process.env.ProgramFiles, process.env['ProgramFiles(x86)']].filter((value) => Boolean(value))
214
+ : ['/System', '/usr', '/bin', '/sbin', '/Library', '/Applications', '/opt', '/private/etc', '/private/var/db'];
215
+ return roots.some(root => isInside(resolved, canonicalPath(root)));
216
+ }
217
+ function isInside(target, root) {
218
+ const relative = path.relative(canonicalPath(root), canonicalPath(target));
219
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
220
+ }
221
+ function canonicalExistingPath(value) {
222
+ const resolved = path.resolve(value);
223
+ try {
224
+ return fs.realpathSync(resolved);
225
+ }
226
+ catch {
227
+ return resolved;
228
+ }
229
+ }
230
+ function canonicalPath(value) {
231
+ const resolved = path.resolve(value);
232
+ const suffix = [];
233
+ let cursor = resolved;
234
+ while (!fs.existsSync(cursor)) {
235
+ const parent = path.dirname(cursor);
236
+ if (parent === cursor)
237
+ return resolved;
238
+ suffix.unshift(path.basename(cursor));
239
+ cursor = parent;
240
+ }
241
+ return path.join(fs.realpathSync(cursor), ...suffix);
242
+ }
243
+ function uniqueExistingDirectories(values) {
244
+ return uniquePaths(values.flatMap(value => {
245
+ const resolved = canonicalExistingPath(value);
246
+ try {
247
+ return fs.statSync(resolved).isDirectory() ? [resolved] : [];
248
+ }
249
+ catch {
250
+ return [];
251
+ }
252
+ }));
253
+ }
254
+ function uniquePaths(values) {
255
+ return [...new Set(values.map(canonicalExistingPath))];
256
+ }
257
+ function isUnsafeBroadRoot(target, userHome, appHome) {
258
+ const resolved = canonicalExistingPath(target);
259
+ return resolved === path.parse(resolved).root
260
+ || resolved === userHome
261
+ || resolved === appHome
262
+ || isInside(appHome, resolved)
263
+ || isInside(resolved, appHome);
264
+ }
265
+ function isUnsafeBroadReadRoot(target, userHome, appHome) {
266
+ const resolved = canonicalExistingPath(target);
267
+ return resolved === path.parse(resolved).root
268
+ || resolved === userHome
269
+ || resolved === appHome
270
+ || isInside(appHome, resolved);
271
+ }
272
+ function safeRunId(value) {
273
+ if (!/^[A-Za-z0-9_-]+$/.test(value)) {
274
+ throw MarifoldError_1.MarifoldError.agentRunInvalid(`Invalid execution id '${value}'.`);
275
+ }
276
+ return value;
277
+ }
278
+ function safeFileName(value, index) {
279
+ const base = path.basename(value).replace(/[\u0000-\u001f\u007f]/g, '').trim();
280
+ return base && base !== '.' && base !== '..' ? base : `attachment-${index + 1}`;
281
+ }
282
+ function uniqueFileName(value, used) {
283
+ let candidate = value;
284
+ const ext = path.extname(value);
285
+ const stem = value.slice(0, value.length - ext.length);
286
+ let number = 2;
287
+ while (used.has(candidate.toLowerCase())) {
288
+ candidate = `${stem}-${number}${ext}`;
289
+ number += 1;
290
+ }
291
+ used.add(candidate.toLowerCase());
292
+ return candidate;
293
+ }
294
+ function imageExtension(mediaType) {
295
+ if (mediaType === 'image/png')
296
+ return 'png';
297
+ if (mediaType === 'image/webp')
298
+ return 'webp';
299
+ if (mediaType === 'image/gif')
300
+ return 'gif';
301
+ return 'jpg';
302
+ }
303
+ function decodeBase64(value, label) {
304
+ if (!value || !/^[A-Za-z0-9+/]*={0,2}$/.test(value) || value.length % 4 === 1) {
305
+ throw MarifoldError_1.MarifoldError.agentRunInvalid(`${label} must be non-empty base64.`);
306
+ }
307
+ const bytes = Buffer.from(value, 'base64');
308
+ if (bytes.length === 0)
309
+ throw MarifoldError_1.MarifoldError.agentRunInvalid(`${label} must be non-empty base64.`);
310
+ return bytes;
311
+ }
312
+ function pruneRunWorkspaces(runsDir) {
313
+ const cutoff = Date.now() - exports.RUN_WORKSPACE_RETENTION_MS;
314
+ for (const entry of fs.readdirSync(runsDir, { withFileTypes: true })) {
315
+ if (!entry.isDirectory() || !/^(run|task|tool)_[A-Za-z0-9_-]+$/.test(entry.name))
316
+ continue;
317
+ const target = path.join(runsDir, entry.name);
318
+ try {
319
+ if (fs.statSync(target).mtimeMs < cutoff)
320
+ fs.rmSync(target, { recursive: true, force: true });
321
+ }
322
+ catch {
323
+ // Cleanup is best-effort; inability to prune an old run must not block a
324
+ // new one.
325
+ }
326
+ }
327
+ }
328
+ //# sourceMappingURL=RunWorkspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunWorkspace.js","sourceRoot":"","sources":["../../src/agent/RunWorkspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { ToolExecutionResult } from './ToolRegistry';
2
+ import { RunWorkspace } from './RunWorkspace';
3
+ export interface ScopedProcessOptions {
4
+ executable: string;
5
+ args: string[];
6
+ workspace: RunWorkspace;
7
+ cwd?: string;
8
+ readRoots?: string[];
9
+ writeRoots?: string[];
10
+ network?: boolean;
11
+ timeoutMs?: number;
12
+ outputLimit: number;
13
+ signal?: AbortSignal;
14
+ successSummary: string;
15
+ failureSummary: string;
16
+ }
17
+ /**
18
+ * Run a process inside the platform isolation backend. There is deliberately
19
+ * no unrestricted fallback: a missing backend fails closed rather than
20
+ * turning an "always allow" shell grant into host access.
21
+ */
22
+ export declare function runScopedProcess(options: ScopedProcessOptions): Promise<ToolExecutionResult>;
23
+ export declare function findExecutable(name: string): string | undefined;
24
+ export declare function ensurePythonEnvironment(workspace: RunWorkspace, outputLimit: number, signal?: AbortSignal): Promise<ToolExecutionResult | undefined>;
25
+ export declare function pythonInVenv(workspace: RunWorkspace): string;
26
+ /**
27
+ * Seatbelt profile: leave the platform runtime readable, but hide user data
28
+ * roots and make the whole host read-only except the explicit run capabilities.
29
+ * Specific root allows override the broader home/Volumes denies.
30
+ */
31
+ export declare function macSandboxProfile(workspace: RunWorkspace, executable: string, network: boolean, capabilities?: {
32
+ readRoots?: string[];
33
+ writeRoots?: string[];
34
+ }): string;
35
+ //# sourceMappingURL=ScopedProcess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScopedProcess.d.ts","sourceRoot":"","sources":["../../src/agent/ScopedProcess.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAY,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKxD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,YAAY,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA4ClG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAa/D;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,YAAY,EACvB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAwB1C;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,YAAY,GAAG,MAAM,CAI5D;AAoBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,YAAY,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,YAAY,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GACjE,MAAM,CA4CR"}
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runScopedProcess = runScopedProcess;
37
+ exports.findExecutable = findExecutable;
38
+ exports.ensurePythonEnvironment = ensurePythonEnvironment;
39
+ exports.pythonInVenv = pythonInVenv;
40
+ exports.macSandboxProfile = macSandboxProfile;
41
+ const child_process_1 = require("child_process");
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const ToolRegistry_1 = require("./ToolRegistry");
45
+ const RunWorkspace_1 = require("./RunWorkspace");
46
+ const DEFAULT_TIMEOUT_MS = 60_000;
47
+ const MAX_BUFFER_BYTES = 10 * 1024 * 1024;
48
+ /**
49
+ * Run a process inside the platform isolation backend. There is deliberately
50
+ * no unrestricted fallback: a missing backend fails closed rather than
51
+ * turning an "always allow" shell grant into host access.
52
+ */
53
+ async function runScopedProcess(options) {
54
+ const invocation = sandboxInvocation(options);
55
+ if (!invocation) {
56
+ return {
57
+ content: [
58
+ `No supported process sandbox is available on ${process.platform}.`,
59
+ 'Marifold did not run the command on the unrestricted host.',
60
+ 'macOS requires /usr/bin/sandbox-exec; other platforms currently require a future sandbox adapter.',
61
+ ].join(' '),
62
+ summary: options.failureSummary,
63
+ isError: true,
64
+ };
65
+ }
66
+ const env = scopedEnvironment(options.workspace);
67
+ return new Promise(resolve => {
68
+ const child = (0, child_process_1.execFile)(invocation.executable, invocation.args, {
69
+ cwd: options.cwd ?? options.workspace.cwd,
70
+ env,
71
+ timeout: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,
72
+ maxBuffer: MAX_BUFFER_BYTES,
73
+ }, (error, stdout, stderr) => {
74
+ const parts = [];
75
+ if (stdout)
76
+ parts.push(stdout);
77
+ if (stderr)
78
+ parts.push(`[stderr]\n${stderr}`);
79
+ if (error) {
80
+ const reason = error.killed
81
+ ? `Command timed out after ${(options.timeoutMs ?? DEFAULT_TIMEOUT_MS) / 1000}s.`
82
+ : `Command exited with ${error.code ?? 'an error'}.`;
83
+ parts.push(reason);
84
+ resolve({
85
+ content: (0, ToolRegistry_1.capToolOutput)(parts.join('\n'), options.outputLimit),
86
+ summary: options.failureSummary,
87
+ isError: true,
88
+ });
89
+ return;
90
+ }
91
+ resolve({
92
+ content: (0, ToolRegistry_1.capToolOutput)(parts.join('\n') || '(no output)', options.outputLimit),
93
+ summary: options.successSummary,
94
+ });
95
+ });
96
+ options.signal?.addEventListener('abort', () => child.kill(), { once: true });
97
+ });
98
+ }
99
+ function findExecutable(name) {
100
+ const pathValue = process.env.PATH ?? '';
101
+ for (const directory of pathValue.split(path.delimiter)) {
102
+ if (!directory)
103
+ continue;
104
+ const candidate = path.join(directory, name);
105
+ try {
106
+ fs.accessSync(candidate, fs.constants.X_OK);
107
+ return fs.realpathSync(candidate);
108
+ }
109
+ catch {
110
+ // Keep searching.
111
+ }
112
+ }
113
+ return undefined;
114
+ }
115
+ async function ensurePythonEnvironment(workspace, outputLimit, signal) {
116
+ const python = pythonInVenv(workspace);
117
+ if (fs.existsSync(python))
118
+ return undefined;
119
+ const uv = findExecutable(process.platform === 'win32' ? 'uv.exe' : 'uv');
120
+ if (!uv) {
121
+ return {
122
+ content: 'uv is required to create Marifold’s isolated Python environment, but it was not found on PATH.',
123
+ summary: 'could not create isolated Python environment',
124
+ isError: true,
125
+ };
126
+ }
127
+ const result = await runScopedProcess({
128
+ executable: uv,
129
+ args: ['venv', workspace.venvDir],
130
+ workspace,
131
+ cwd: workspace.workDir,
132
+ network: false,
133
+ timeoutMs: 120_000,
134
+ outputLimit,
135
+ signal,
136
+ successSummary: 'created isolated Python environment',
137
+ failureSummary: 'could not create isolated Python environment',
138
+ });
139
+ return result.isError ? result : undefined;
140
+ }
141
+ function pythonInVenv(workspace) {
142
+ return process.platform === 'win32'
143
+ ? path.join(workspace.venvDir, 'Scripts', 'python.exe')
144
+ : path.join(workspace.venvDir, 'bin', 'python');
145
+ }
146
+ function sandboxInvocation(options) {
147
+ if (process.platform === 'darwin' && fs.existsSync('/usr/bin/sandbox-exec')) {
148
+ return {
149
+ executable: '/usr/bin/sandbox-exec',
150
+ args: [
151
+ '-p',
152
+ macSandboxProfile(options.workspace, options.executable, options.network === true, {
153
+ readRoots: options.readRoots,
154
+ writeRoots: options.writeRoots,
155
+ }),
156
+ options.executable,
157
+ ...options.args,
158
+ ],
159
+ };
160
+ }
161
+ return undefined;
162
+ }
163
+ /**
164
+ * Seatbelt profile: leave the platform runtime readable, but hide user data
165
+ * roots and make the whole host read-only except the explicit run capabilities.
166
+ * Specific root allows override the broader home/Volumes denies.
167
+ */
168
+ function macSandboxProfile(workspace, executable, network, capabilities = {}) {
169
+ const executablePath = canonicalExisting(executable);
170
+ const readRoots = uniqueCanonical([
171
+ ...(capabilities.readRoots ?? workspace.readRoots),
172
+ ...pathDirectories(workspace, capabilities.readRoots === undefined),
173
+ ]);
174
+ const writeRoots = uniqueCanonical(capabilities.writeRoots ?? workspace.writeRoots);
175
+ const ancestorAllows = readRoots.map(root => `(allow file-read-metadata (path-ancestors ${schemeString(root)}))`);
176
+ const readAllows = readRoots.map(root => `(allow file-read* (subpath ${schemeString(root)}))`);
177
+ const writeAllows = writeRoots.map(root => `(allow file-write* (subpath ${schemeString(root)}))`);
178
+ return [
179
+ '(version 1)',
180
+ '(allow default)',
181
+ ...(network ? [] : ['(deny network*)']),
182
+ // Keep subprocesses functional, but do not let an approved shell control
183
+ // unrelated host processes or automate desktop applications.
184
+ '(deny signal)',
185
+ '(allow signal (target self))',
186
+ '(allow signal (target same-sandbox))',
187
+ '(deny appleevent-send)',
188
+ '(deny mach-lookup'
189
+ + ' (global-name "com.apple.coreservices.appleevents")'
190
+ + ' (global-name "com.apple.LaunchServices")'
191
+ + ' (global-name "com.apple.lsd.modifydb")'
192
+ + ' (global-name "com.apple.pasteboard")'
193
+ + ' (global-name "com.apple.pasteboard.1")'
194
+ + ' (global-name "com.apple.SecurityServer")'
195
+ + ' (global-name "com.apple.securityd.xpc")'
196
+ + ' (global-name "com.apple.securityd.general")'
197
+ + ' (global-name "com.apple.securityd.systemkeychain"))',
198
+ '(deny file-write*)',
199
+ `(allow file-write* (literal ${schemeString('/dev/null')}))`,
200
+ ...writeAllows,
201
+ // The real account and external volumes are private unless a selected
202
+ // workspace/trusted root below explicitly re-opens a subtree.
203
+ `(deny file-read* (subpath ${schemeString(workspace.userHome)}))`,
204
+ `(deny file-read* (subpath ${schemeString('/Users')}))`,
205
+ `(deny file-read* (subpath ${schemeString('/Volumes')}))`,
206
+ `(allow file-read* (literal ${schemeString(executablePath)}))`,
207
+ ...ancestorAllows,
208
+ ...readAllows,
209
+ ].join('');
210
+ }
211
+ function scopedEnvironment(workspace) {
212
+ const venvBin = process.platform === 'win32'
213
+ ? path.join(workspace.venvDir, 'Scripts')
214
+ : path.join(workspace.venvDir, 'bin');
215
+ return {
216
+ // Preserve normal shell path semantics without exposing the account:
217
+ // Seatbelt still denies the broad home and re-opens only explicit roots.
218
+ HOME: workspace.userHome,
219
+ USERPROFILE: workspace.userHome,
220
+ TMPDIR: workspace.tempDir,
221
+ TMP: workspace.tempDir,
222
+ TEMP: workspace.tempDir,
223
+ XDG_CACHE_HOME: workspace.cacheDir,
224
+ XDG_CONFIG_HOME: path.join(workspace.homeDir, '.config'),
225
+ UV_CACHE_DIR: path.join(workspace.cacheDir, 'uv'),
226
+ UV_NO_CONFIG: '1',
227
+ VIRTUAL_ENV: workspace.venvDir,
228
+ PATH: [venvBin, process.env.PATH ?? ''].filter(Boolean).join(path.delimiter),
229
+ LANG: process.env.LANG ?? 'en_US.UTF-8',
230
+ LC_ALL: process.env.LC_ALL ?? '',
231
+ TERM: process.env.TERM ?? 'dumb',
232
+ MARIFOLD_RUN_DIR: workspace.rootDir,
233
+ MARIFOLD_RUN_HOME: workspace.homeDir,
234
+ MARIFOLD_INPUT_DIR: workspace.inputDir,
235
+ MARIFOLD_OUTPUT_DIR: workspace.outputDir,
236
+ MARIFOLD_WORK_DIR: workspace.workDir,
237
+ MARIFOLD_WORKSPACE: workspace.cwd,
238
+ };
239
+ }
240
+ function pathDirectories(workspace, includeUserDirectories) {
241
+ return (process.env.PATH ?? '')
242
+ .split(path.delimiter)
243
+ .filter(Boolean)
244
+ .map(canonicalExisting)
245
+ .filter(directory => {
246
+ try {
247
+ if (!fs.statSync(directory).isDirectory())
248
+ return false;
249
+ if (!includeUserDirectories && (0, RunWorkspace_1.isInside)(directory, workspace.userHome))
250
+ return false;
251
+ // A malformed PATH must not accidentally reopen the entire account or
252
+ // Marifold state after the broad home deny.
253
+ if (directory === workspace.userHome || (0, RunWorkspace_1.isInside)(workspace.userHome, directory))
254
+ return false;
255
+ const appHome = path.join(workspace.userHome, '.marifold');
256
+ if (directory === appHome || (0, RunWorkspace_1.isInside)(appHome, directory)) {
257
+ return (0, RunWorkspace_1.isInside)(directory, workspace.rootDir);
258
+ }
259
+ return true;
260
+ }
261
+ catch {
262
+ return false;
263
+ }
264
+ });
265
+ }
266
+ function uniqueCanonical(values) {
267
+ return [...new Set(values.map(canonicalExisting))];
268
+ }
269
+ function canonicalExisting(value) {
270
+ try {
271
+ return fs.realpathSync(path.resolve(value));
272
+ }
273
+ catch {
274
+ return path.resolve(value);
275
+ }
276
+ }
277
+ function schemeString(value) {
278
+ return JSON.stringify(value);
279
+ }
280
+ //# sourceMappingURL=ScopedProcess.js.map