@intutic/cli 1.10.0 → 2.0.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 (357) hide show
  1. package/README.md +1 -0
  2. package/dist/cli.js +868 -30
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/attenuate.d.ts +39 -0
  5. package/dist/commands/attenuate.d.ts.map +1 -0
  6. package/dist/commands/attenuate.js +98 -0
  7. package/dist/commands/attenuate.js.map +1 -0
  8. package/dist/commands/budget.d.ts +80 -0
  9. package/dist/commands/budget.d.ts.map +1 -1
  10. package/dist/commands/budget.js +119 -3
  11. package/dist/commands/budget.js.map +1 -1
  12. package/dist/commands/connect.d.ts +10 -0
  13. package/dist/commands/connect.d.ts.map +1 -1
  14. package/dist/commands/connect.js +358 -48
  15. package/dist/commands/connect.js.map +1 -1
  16. package/dist/commands/credentials.d.ts +31 -0
  17. package/dist/commands/credentials.d.ts.map +1 -0
  18. package/dist/commands/credentials.js +134 -0
  19. package/dist/commands/credentials.js.map +1 -0
  20. package/dist/commands/decision.d.ts +37 -0
  21. package/dist/commands/decision.d.ts.map +1 -0
  22. package/dist/commands/decision.js +56 -0
  23. package/dist/commands/decision.js.map +1 -0
  24. package/dist/commands/doctor.d.ts +38 -1
  25. package/dist/commands/doctor.d.ts.map +1 -1
  26. package/dist/commands/doctor.js +228 -18
  27. package/dist/commands/doctor.js.map +1 -1
  28. package/dist/commands/enforce.d.ts +33 -0
  29. package/dist/commands/enforce.d.ts.map +1 -0
  30. package/dist/commands/enforce.js +150 -0
  31. package/dist/commands/enforce.js.map +1 -0
  32. package/dist/commands/enterprise.d.ts +29 -0
  33. package/dist/commands/enterprise.d.ts.map +1 -0
  34. package/dist/commands/enterprise.js +141 -0
  35. package/dist/commands/enterprise.js.map +1 -0
  36. package/dist/commands/env.d.ts +7 -0
  37. package/dist/commands/env.d.ts.map +1 -0
  38. package/dist/commands/env.js +55 -0
  39. package/dist/commands/env.js.map +1 -0
  40. package/dist/commands/exec.d.ts +38 -2
  41. package/dist/commands/exec.d.ts.map +1 -1
  42. package/dist/commands/exec.js +247 -10
  43. package/dist/commands/exec.js.map +1 -1
  44. package/dist/commands/findings.d.ts +84 -0
  45. package/dist/commands/findings.d.ts.map +1 -0
  46. package/dist/commands/findings.js +329 -0
  47. package/dist/commands/findings.js.map +1 -0
  48. package/dist/commands/gateway.d.ts +62 -0
  49. package/dist/commands/gateway.d.ts.map +1 -0
  50. package/dist/commands/gateway.js +298 -0
  51. package/dist/commands/gateway.js.map +1 -0
  52. package/dist/commands/guardrails.d.ts +81 -0
  53. package/dist/commands/guardrails.d.ts.map +1 -0
  54. package/dist/commands/guardrails.js +735 -0
  55. package/dist/commands/guardrails.js.map +1 -0
  56. package/dist/commands/init.d.ts +8 -0
  57. package/dist/commands/init.d.ts.map +1 -1
  58. package/dist/commands/init.js +14 -2
  59. package/dist/commands/init.js.map +1 -1
  60. package/dist/commands/install-daemon.d.ts +70 -3
  61. package/dist/commands/install-daemon.d.ts.map +1 -1
  62. package/dist/commands/install-daemon.js +482 -47
  63. package/dist/commands/install-daemon.js.map +1 -1
  64. package/dist/commands/integrity.d.ts +205 -0
  65. package/dist/commands/integrity.d.ts.map +1 -0
  66. package/dist/commands/integrity.js +620 -0
  67. package/dist/commands/integrity.js.map +1 -0
  68. package/dist/commands/judge.d.ts +31 -0
  69. package/dist/commands/judge.d.ts.map +1 -0
  70. package/dist/commands/judge.js +118 -0
  71. package/dist/commands/judge.js.map +1 -0
  72. package/dist/commands/org.d.ts +31 -0
  73. package/dist/commands/org.d.ts.map +1 -0
  74. package/dist/commands/org.js +159 -0
  75. package/dist/commands/org.js.map +1 -0
  76. package/dist/commands/policy.d.ts +138 -4
  77. package/dist/commands/policy.d.ts.map +1 -1
  78. package/dist/commands/policy.js +538 -97
  79. package/dist/commands/policy.js.map +1 -1
  80. package/dist/commands/predict-cost.d.ts +45 -0
  81. package/dist/commands/predict-cost.d.ts.map +1 -0
  82. package/dist/commands/predict-cost.js +123 -0
  83. package/dist/commands/predict-cost.js.map +1 -0
  84. package/dist/commands/rollback.d.ts +5 -0
  85. package/dist/commands/rollback.d.ts.map +1 -0
  86. package/dist/commands/rollback.js +142 -0
  87. package/dist/commands/rollback.js.map +1 -0
  88. package/dist/commands/routing.d.ts +62 -0
  89. package/dist/commands/routing.d.ts.map +1 -0
  90. package/dist/commands/routing.js +121 -0
  91. package/dist/commands/routing.js.map +1 -0
  92. package/dist/commands/setup.d.ts +62 -0
  93. package/dist/commands/setup.d.ts.map +1 -0
  94. package/dist/commands/setup.js +238 -0
  95. package/dist/commands/setup.js.map +1 -0
  96. package/dist/commands/skill.d.ts +268 -1
  97. package/dist/commands/skill.d.ts.map +1 -1
  98. package/dist/commands/skill.js +744 -39
  99. package/dist/commands/skill.js.map +1 -1
  100. package/dist/commands/sops.d.ts +95 -0
  101. package/dist/commands/sops.d.ts.map +1 -1
  102. package/dist/commands/sops.js +334 -34
  103. package/dist/commands/sops.js.map +1 -1
  104. package/dist/commands/start.d.ts.map +1 -1
  105. package/dist/commands/start.js +1 -18
  106. package/dist/commands/start.js.map +1 -1
  107. package/dist/commands/status.d.ts.map +1 -1
  108. package/dist/commands/status.js +44 -1
  109. package/dist/commands/status.js.map +1 -1
  110. package/dist/commands/team.d.ts +38 -0
  111. package/dist/commands/team.d.ts.map +1 -0
  112. package/dist/commands/team.js +140 -0
  113. package/dist/commands/team.js.map +1 -0
  114. package/dist/commands/traces.d.ts +8 -1
  115. package/dist/commands/traces.d.ts.map +1 -1
  116. package/dist/commands/traces.js +114 -15
  117. package/dist/commands/traces.js.map +1 -1
  118. package/dist/commands/whoami.d.ts.map +1 -1
  119. package/dist/commands/whoami.js +2 -1
  120. package/dist/commands/whoami.js.map +1 -1
  121. package/dist/config/keychain.d.ts +10 -2
  122. package/dist/config/keychain.d.ts.map +1 -1
  123. package/dist/config/keychain.js +83 -14
  124. package/dist/config/keychain.js.map +1 -1
  125. package/dist/config/paths.d.ts +27 -0
  126. package/dist/config/paths.d.ts.map +1 -1
  127. package/dist/config/paths.js +37 -6
  128. package/dist/config/paths.js.map +1 -1
  129. package/dist/config/store.d.ts.map +1 -1
  130. package/dist/config/store.js +19 -3
  131. package/dist/config/store.js.map +1 -1
  132. package/dist/harness/ag2.d.ts +22 -0
  133. package/dist/harness/ag2.d.ts.map +1 -0
  134. package/dist/harness/ag2.js +34 -0
  135. package/dist/harness/ag2.js.map +1 -0
  136. package/dist/harness/agentcore.d.ts +55 -0
  137. package/dist/harness/agentcore.d.ts.map +1 -0
  138. package/dist/harness/agentcore.js +119 -0
  139. package/dist/harness/agentcore.js.map +1 -0
  140. package/dist/harness/agenticOrchestrator.d.ts +52 -0
  141. package/dist/harness/agenticOrchestrator.d.ts.map +1 -0
  142. package/dist/harness/agenticOrchestrator.js +115 -0
  143. package/dist/harness/agenticOrchestrator.js.map +1 -0
  144. package/dist/harness/aiSdkHarness.d.ts +30 -0
  145. package/dist/harness/aiSdkHarness.d.ts.map +1 -0
  146. package/dist/harness/aiSdkHarness.js +51 -0
  147. package/dist/harness/aiSdkHarness.js.map +1 -0
  148. package/dist/harness/aiSdkWorkflow.d.ts +26 -0
  149. package/dist/harness/aiSdkWorkflow.d.ts.map +1 -0
  150. package/dist/harness/aiSdkWorkflow.js +39 -0
  151. package/dist/harness/aiSdkWorkflow.js.map +1 -0
  152. package/dist/harness/autogen.d.ts +24 -0
  153. package/dist/harness/autogen.d.ts.map +1 -0
  154. package/dist/harness/autogen.js +36 -0
  155. package/dist/harness/autogen.js.map +1 -0
  156. package/dist/harness/base.js.map +1 -1
  157. package/dist/harness/continue.d.ts.map +1 -1
  158. package/dist/harness/continue.js +2 -1
  159. package/dist/harness/continue.js.map +1 -1
  160. package/dist/harness/crewai.d.ts +15 -0
  161. package/dist/harness/crewai.d.ts.map +1 -0
  162. package/dist/harness/crewai.js +26 -0
  163. package/dist/harness/crewai.js.map +1 -0
  164. package/dist/harness/detector.d.ts +1 -1
  165. package/dist/harness/detector.d.ts.map +1 -1
  166. package/dist/harness/detector.js +47 -1
  167. package/dist/harness/detector.js.map +1 -1
  168. package/dist/harness/dsh.d.ts +19 -0
  169. package/dist/harness/dsh.d.ts.map +1 -0
  170. package/dist/harness/dsh.js +93 -0
  171. package/dist/harness/dsh.js.map +1 -0
  172. package/dist/harness/eve.d.ts +40 -0
  173. package/dist/harness/eve.d.ts.map +1 -0
  174. package/dist/harness/eve.js +67 -0
  175. package/dist/harness/eve.js.map +1 -0
  176. package/dist/harness/googleAdk.d.ts +18 -0
  177. package/dist/harness/googleAdk.d.ts.map +1 -0
  178. package/dist/harness/googleAdk.js +29 -0
  179. package/dist/harness/googleAdk.js.map +1 -0
  180. package/dist/harness/goose.d.ts.map +1 -1
  181. package/dist/harness/goose.js +5 -1
  182. package/dist/harness/goose.js.map +1 -1
  183. package/dist/harness/grok.d.ts +16 -0
  184. package/dist/harness/grok.d.ts.map +1 -0
  185. package/dist/harness/grok.js +78 -0
  186. package/dist/harness/grok.js.map +1 -0
  187. package/dist/harness/jsSdkGatedAdapter.d.ts +102 -0
  188. package/dist/harness/jsSdkGatedAdapter.d.ts.map +1 -0
  189. package/dist/harness/jsSdkGatedAdapter.js +139 -0
  190. package/dist/harness/jsSdkGatedAdapter.js.map +1 -0
  191. package/dist/harness/langchain.d.ts +22 -0
  192. package/dist/harness/langchain.d.ts.map +1 -0
  193. package/dist/harness/langchain.js +33 -0
  194. package/dist/harness/langchain.js.map +1 -0
  195. package/dist/harness/langgraph.d.ts +22 -0
  196. package/dist/harness/langgraph.d.ts.map +1 -0
  197. package/dist/harness/langgraph.js +80 -0
  198. package/dist/harness/langgraph.js.map +1 -0
  199. package/dist/harness/mastra.d.ts +21 -0
  200. package/dist/harness/mastra.d.ts.map +1 -0
  201. package/dist/harness/mastra.js +33 -0
  202. package/dist/harness/mastra.js.map +1 -0
  203. package/dist/harness/muse.d.ts +22 -0
  204. package/dist/harness/muse.d.ts.map +1 -0
  205. package/dist/harness/muse.js +92 -0
  206. package/dist/harness/muse.js.map +1 -0
  207. package/dist/harness/n8n.d.ts.map +1 -1
  208. package/dist/harness/n8n.js +36 -11
  209. package/dist/harness/n8n.js.map +1 -1
  210. package/dist/harness/openaiAgents.d.ts +40 -0
  211. package/dist/harness/openaiAgents.d.ts.map +1 -0
  212. package/dist/harness/openaiAgents.js +107 -0
  213. package/dist/harness/openaiAgents.js.map +1 -0
  214. package/dist/harness/opencode.d.ts +24 -0
  215. package/dist/harness/opencode.d.ts.map +1 -0
  216. package/dist/harness/opencode.js +97 -0
  217. package/dist/harness/opencode.js.map +1 -0
  218. package/dist/harness/pydanticAi.d.ts +19 -0
  219. package/dist/harness/pydanticAi.d.ts.map +1 -0
  220. package/dist/harness/pydanticAi.js +30 -0
  221. package/dist/harness/pydanticAi.js.map +1 -0
  222. package/dist/harness/sdkGatedAdapter.d.ts +55 -0
  223. package/dist/harness/sdkGatedAdapter.d.ts.map +1 -0
  224. package/dist/harness/sdkGatedAdapter.js +85 -0
  225. package/dist/harness/sdkGatedAdapter.js.map +1 -0
  226. package/dist/harness/smolagents.d.ts +22 -0
  227. package/dist/harness/smolagents.d.ts.map +1 -0
  228. package/dist/harness/smolagents.js +33 -0
  229. package/dist/harness/smolagents.js.map +1 -0
  230. package/dist/harness/strands.d.ts +22 -0
  231. package/dist/harness/strands.d.ts.map +1 -0
  232. package/dist/harness/strands.js +35 -0
  233. package/dist/harness/strands.js.map +1 -0
  234. package/dist/harness/trueforge.d.ts +25 -0
  235. package/dist/harness/trueforge.d.ts.map +1 -0
  236. package/dist/harness/trueforge.js +40 -0
  237. package/dist/harness/trueforge.js.map +1 -0
  238. package/dist/harness/types.d.ts.map +1 -1
  239. package/dist/harness/types.js +70 -0
  240. package/dist/harness/types.js.map +1 -1
  241. package/dist/harness/vercelAiSdk.d.ts +31 -0
  242. package/dist/harness/vercelAiSdk.d.ts.map +1 -0
  243. package/dist/harness/vercelAiSdk.js +44 -0
  244. package/dist/harness/vercelAiSdk.js.map +1 -0
  245. package/dist/harness/xirp.d.ts +43 -0
  246. package/dist/harness/xirp.d.ts.map +1 -0
  247. package/dist/harness/xirp.js +95 -0
  248. package/dist/harness/xirp.js.map +1 -0
  249. package/dist/lib/api.d.ts +68 -0
  250. package/dist/lib/api.d.ts.map +1 -1
  251. package/dist/lib/api.js +108 -67
  252. package/dist/lib/api.js.map +1 -1
  253. package/dist/lib/authMessages.d.ts +19 -0
  254. package/dist/lib/authMessages.d.ts.map +1 -0
  255. package/dist/lib/authMessages.js +20 -0
  256. package/dist/lib/authMessages.js.map +1 -0
  257. package/dist/lib/binaryChecksum.d.ts +12 -0
  258. package/dist/lib/binaryChecksum.d.ts.map +1 -0
  259. package/dist/lib/binaryChecksum.js +45 -0
  260. package/dist/lib/binaryChecksum.js.map +1 -0
  261. package/dist/lib/binaryOnPath.d.ts +24 -0
  262. package/dist/lib/binaryOnPath.d.ts.map +1 -0
  263. package/dist/lib/binaryOnPath.js +31 -0
  264. package/dist/lib/binaryOnPath.js.map +1 -0
  265. package/dist/lib/caTrust.d.ts +69 -0
  266. package/dist/lib/caTrust.d.ts.map +1 -0
  267. package/dist/lib/caTrust.js +169 -0
  268. package/dist/lib/caTrust.js.map +1 -0
  269. package/dist/lib/ciscoScanner.d.ts +178 -0
  270. package/dist/lib/ciscoScanner.d.ts.map +1 -0
  271. package/dist/lib/ciscoScanner.js +292 -0
  272. package/dist/lib/ciscoScanner.js.map +1 -0
  273. package/dist/lib/decisionsLogRefresh.d.ts +28 -0
  274. package/dist/lib/decisionsLogRefresh.d.ts.map +1 -0
  275. package/dist/lib/decisionsLogRefresh.js +54 -0
  276. package/dist/lib/decisionsLogRefresh.js.map +1 -0
  277. package/dist/lib/deviceReport.d.ts +26 -0
  278. package/dist/lib/deviceReport.d.ts.map +1 -0
  279. package/dist/lib/deviceReport.js +55 -0
  280. package/dist/lib/deviceReport.js.map +1 -0
  281. package/dist/lib/elevation.d.ts +58 -0
  282. package/dist/lib/elevation.d.ts.map +1 -0
  283. package/dist/lib/elevation.js +83 -0
  284. package/dist/lib/elevation.js.map +1 -0
  285. package/dist/lib/enforcementState.d.ts +69 -0
  286. package/dist/lib/enforcementState.d.ts.map +1 -0
  287. package/dist/lib/enforcementState.js +113 -0
  288. package/dist/lib/enforcementState.js.map +1 -0
  289. package/dist/lib/ensureValkey.d.ts.map +1 -1
  290. package/dist/lib/ensureValkey.js +2 -2
  291. package/dist/lib/ensureValkey.js.map +1 -1
  292. package/dist/lib/envInjector.d.ts.map +1 -1
  293. package/dist/lib/envInjector.js +22 -4
  294. package/dist/lib/envInjector.js.map +1 -1
  295. package/dist/lib/gitHooks.d.ts +7 -2
  296. package/dist/lib/gitHooks.d.ts.map +1 -1
  297. package/dist/lib/gitHooks.js +180 -13
  298. package/dist/lib/gitHooks.js.map +1 -1
  299. package/dist/lib/gracefulShutdown.d.ts +37 -0
  300. package/dist/lib/gracefulShutdown.d.ts.map +1 -0
  301. package/dist/lib/gracefulShutdown.js +57 -0
  302. package/dist/lib/gracefulShutdown.js.map +1 -0
  303. package/dist/lib/graphIdentity.d.ts +80 -0
  304. package/dist/lib/graphIdentity.d.ts.map +1 -0
  305. package/dist/lib/graphIdentity.js +120 -0
  306. package/dist/lib/graphIdentity.js.map +1 -0
  307. package/dist/lib/localTraces.d.ts +61 -0
  308. package/dist/lib/localTraces.d.ts.map +1 -0
  309. package/dist/lib/localTraces.js +173 -0
  310. package/dist/lib/localTraces.js.map +1 -0
  311. package/dist/lib/mdmManifest.d.ts +73 -0
  312. package/dist/lib/mdmManifest.d.ts.map +1 -0
  313. package/dist/lib/mdmManifest.js +190 -0
  314. package/dist/lib/mdmManifest.js.map +1 -0
  315. package/dist/lib/onboarding.d.ts.map +1 -1
  316. package/dist/lib/onboarding.js +60 -1
  317. package/dist/lib/onboarding.js.map +1 -1
  318. package/dist/lib/otelPropagation.d.ts +26 -0
  319. package/dist/lib/otelPropagation.d.ts.map +1 -0
  320. package/dist/lib/otelPropagation.js +40 -0
  321. package/dist/lib/otelPropagation.js.map +1 -0
  322. package/dist/lib/policySnapshot.d.ts +92 -0
  323. package/dist/lib/policySnapshot.d.ts.map +1 -0
  324. package/dist/lib/policySnapshot.js +173 -0
  325. package/dist/lib/policySnapshot.js.map +1 -0
  326. package/dist/lib/process.d.ts.map +1 -1
  327. package/dist/lib/process.js +60 -0
  328. package/dist/lib/process.js.map +1 -1
  329. package/dist/lib/providerProbe.d.ts +28 -0
  330. package/dist/lib/providerProbe.d.ts.map +1 -0
  331. package/dist/lib/providerProbe.js +57 -0
  332. package/dist/lib/providerProbe.js.map +1 -0
  333. package/dist/lib/proxyBinary.d.ts +19 -0
  334. package/dist/lib/proxyBinary.d.ts.map +1 -0
  335. package/dist/lib/proxyBinary.js +30 -0
  336. package/dist/lib/proxyBinary.js.map +1 -0
  337. package/dist/lib/sandbox/firecracker.d.ts +89 -0
  338. package/dist/lib/sandbox/firecracker.d.ts.map +1 -0
  339. package/dist/lib/sandbox/firecracker.js +135 -0
  340. package/dist/lib/sandbox/firecracker.js.map +1 -0
  341. package/dist/lib/sandbox/index.d.ts +34 -0
  342. package/dist/lib/sandbox/index.d.ts.map +1 -0
  343. package/dist/lib/sandbox/index.js +54 -0
  344. package/dist/lib/sandbox/index.js.map +1 -0
  345. package/dist/lib/sandbox/oci.d.ts +38 -0
  346. package/dist/lib/sandbox/oci.d.ts.map +1 -0
  347. package/dist/lib/sandbox/oci.js +108 -0
  348. package/dist/lib/sandbox/oci.js.map +1 -0
  349. package/dist/lib/sandbox/types.d.ts +48 -0
  350. package/dist/lib/sandbox/types.d.ts.map +1 -0
  351. package/dist/lib/sandbox/types.js +12 -0
  352. package/dist/lib/sandbox/types.js.map +1 -0
  353. package/dist/lib/sopFrontMatter.d.ts +50 -0
  354. package/dist/lib/sopFrontMatter.d.ts.map +1 -0
  355. package/dist/lib/sopFrontMatter.js +129 -0
  356. package/dist/lib/sopFrontMatter.js.map +1 -0
  357. package/package.json +11 -6
@@ -0,0 +1,141 @@
1
+ /**
2
+ * `intutic enterprise install` — CA-trust rollout, Cursor system-level
3
+ * hooks, and Jamf/Intune MDM manifest generation for a managed fleet.
4
+ *
5
+ * Replaces the deleted `enterprise-install.ts` (commit `8481b5d9`). Named
6
+ * `enterprise install`, deliberately not the old hyphenated
7
+ * `enterprise-install` — `tools/scripts/intutic-enterprise-install.sh`
8
+ * already exists as an unrelated air-gapped docker-compose installer.
9
+ *
10
+ * The host firewall is intentionally NOT part of this command — that's
11
+ * `intutic enforce apply`/`generate` (TD-332's real, tested implementation).
12
+ * Rebuilding a `pf.conf`/`iptables.rules` template generator here, as the
13
+ * deleted code did, would just be a second, unmaintained copy of it. This
14
+ * command prints a pointer to it instead.
15
+ *
16
+ * @module
17
+ */
18
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
19
+ import { join, resolve } from 'node:path';
20
+ import { createRequire } from 'node:module';
21
+ import { writeCursorHooks } from '@intutic/sync-daemon/harness/cursorHooks';
22
+ import { log } from '../lib/logger.js';
23
+ import { loadConfig, loadCredentials } from '../config/store.js';
24
+ import { getIntuticDir } from '../config/paths.js';
25
+ import { isElevatedAsync } from '../lib/elevation.js';
26
+ import { installCaTrust } from '../lib/caTrust.js';
27
+ import { generateMobileconfig, generateJamfManifest, generateIntuneManifest, generateJamfFirewallManifest, generateIntuneFirewallManifest, } from '../lib/mdmManifest.js';
28
+ import { writeEnforcementState } from '../lib/enforcementState.js';
29
+ import { reportDeviceState } from '../lib/deviceReport.js';
30
+ const { version: cliVersion } = createRequire(import.meta.url)('../../package.json');
31
+ function resolveProxyUrl(opts) {
32
+ const raw = opts.proxyUrl ?? process.env.INTUTIC_PROXY_URL ?? 'http://localhost:4000';
33
+ return raw.replace(/\/+$/, '');
34
+ }
35
+ // Unlike `hookScriptPath` below (resolved from THIS process's own
36
+ // workspaceRoot, which is meaningful because `enterprise install` runs on
37
+ // the machine it configures), the intutic CLI binary path is inherently a
38
+ // TARGET-machine fact this admin machine cannot observe — `process.execPath`
39
+ // here would just be node's own path on the admin's box, not intutic's path
40
+ // on the fleet. `/usr/local/bin/intutic` is the common global-install
41
+ // location (Homebrew, npm -g with a standard prefix); operators whose fleet
42
+ // installs elsewhere MUST override with --cli-binary-path.
43
+ const DEFAULT_CLI_BINARY_PATH = '/usr/local/bin/intutic';
44
+ function resolveCliBinaryPath(opts) {
45
+ return opts.cliBinaryPath ?? DEFAULT_CLI_BINARY_PATH;
46
+ }
47
+ export async function runEnterpriseInstall(opts) {
48
+ const proxyUrl = resolveProxyUrl(opts);
49
+ const outputDir = resolve(opts.mdmOutputDir ?? './intutic-mdm');
50
+ const config = loadConfig();
51
+ const creds = await loadCredentials();
52
+ const workspaceRoot = config?.workspaceRoot ?? process.cwd();
53
+ const workspaceId = creds?.workspaceId ?? '';
54
+ log.header('Intutic — Enterprise Install');
55
+ const caCertPath = join(getIntuticDir(), 'ca.crt');
56
+ let caCertPem;
57
+ try {
58
+ caCertPem = await readFile(caCertPath, 'utf-8');
59
+ }
60
+ catch {
61
+ log.error(`CA certificate not found at ${caCertPath}.`);
62
+ log.info('Run `intutic connect` (or `intutic start`) at least once first — it generates the CA on first run.');
63
+ process.exit(1);
64
+ }
65
+ // 1. Manifests — no privilege needed, always generated first.
66
+ await mkdir(outputDir, { recursive: true });
67
+ const hookScriptPath = join(workspaceRoot, '.intutic', 'hooks', 'cursor-check.js');
68
+ const cliBinaryPath = resolveCliBinaryPath(opts);
69
+ await writeFile(join(outputDir, 'intutic-governance.mobileconfig'), generateMobileconfig({ caCertPem }), 'utf-8');
70
+ await writeFile(join(outputDir, 'cursor-hooks-jamf.json'), generateJamfManifest({ hookScriptPath }), 'utf-8');
71
+ await writeFile(join(outputDir, 'cursor-hooks-intune.json'), generateIntuneManifest({ hookScriptPath }), 'utf-8');
72
+ await writeFile(join(outputDir, 'jamf-firewall-manifest.json'), generateJamfFirewallManifest({ cliBinaryPath }), 'utf-8');
73
+ await writeFile(join(outputDir, 'intune-firewall-manifest.json'), generateIntuneFirewallManifest({ cliBinaryPath }), 'utf-8');
74
+ log.success(`MDM manifests written to ${outputDir}/`);
75
+ log.field('CA trust profile', 'intutic-governance.mobileconfig');
76
+ log.field('Cursor hooks (Jamf)', 'cursor-hooks-jamf.json');
77
+ log.field('Cursor hooks (Intune)', 'cursor-hooks-intune.json');
78
+ log.field('Firewall re-assertion (Jamf)', 'jamf-firewall-manifest.json');
79
+ log.field('Firewall re-assertion (Intune)', 'intune-firewall-manifest.json');
80
+ if (!opts.cliBinaryPath) {
81
+ log.dim(` (firewall manifests assume the intutic CLI is at ${DEFAULT_CLI_BINARY_PATH} on target machines — override with --cli-binary-path if your fleet installs elsewhere)`);
82
+ }
83
+ if (opts.generateMdmOnly) {
84
+ return;
85
+ }
86
+ // 2. Elevation check — warn but still attempt, matching `enforce.ts`'s
87
+ // "warn but still attempt" discipline (a container or root shell has
88
+ // nothing to escalate from, so pre-blocking would be wrong there).
89
+ const elevation = await isElevatedAsync();
90
+ if (elevation === 'unelevated') {
91
+ log.warn('System-wide CA trust and system-level Cursor hooks need admin/root privilege.');
92
+ log.info('Re-run with sudo (macOS/Linux) or from an elevated shell (Windows) to apply them now.');
93
+ }
94
+ // 3. System-level Cursor hooks — reuses the SAME writer `intutic connect`
95
+ // already uses for project/user level, this time with writeSystemLevel and
96
+ // a real workspaceId embedded in the hook script's event payloads.
97
+ if (!opts.skipHooks) {
98
+ try {
99
+ await writeCursorHooks(workspaceRoot, proxyUrl, workspaceId, true);
100
+ log.success('Cursor hooks written (project, user, and system level).');
101
+ await writeEnforcementState({ systemHooks: { installed: true, path: hookScriptPath, reportedAt: new Date().toISOString() } }, cliVersion);
102
+ }
103
+ catch (err) {
104
+ log.error(`Failed to write Cursor hooks: ${err instanceof Error ? err.message : String(err)}`);
105
+ await writeEnforcementState({ systemHooks: { installed: false, reportedAt: new Date().toISOString() } }, cliVersion);
106
+ }
107
+ }
108
+ // 4. System-wide CA trust.
109
+ if (!opts.skipCa) {
110
+ const result = await installCaTrust(caCertPath, 'system');
111
+ if (result.installed) {
112
+ log.success(`CA cert trusted system-wide via ${result.mechanism}.`);
113
+ }
114
+ else {
115
+ log.error(`Could not install system CA trust: ${result.detail}`);
116
+ }
117
+ await writeEnforcementState({ caTrust: { installed: result.installed, scope: 'system', mechanism: result.mechanism, reportedAt: new Date().toISOString() } }, cliVersion);
118
+ }
119
+ // Best-effort phone-home for whatever legs this run actually touched —
120
+ // never fails the command; the CA-trust/hooks steps above already
121
+ // succeeded or failed on their own merits.
122
+ const report = await reportDeviceState({ dev: opts.dev });
123
+ if (!report.reported) {
124
+ log.dim(` (device report not sent: ${report.reason})`);
125
+ }
126
+ // 5. Firewall — deliberately not duplicated here. Point at the real thing.
127
+ const defaultPort = (() => {
128
+ try {
129
+ return new URL(proxyUrl).port || '4000';
130
+ }
131
+ catch {
132
+ return '4000';
133
+ }
134
+ })();
135
+ console.log('');
136
+ log.header('Next: mandatory egress firewall');
137
+ log.dim(' This command does not touch the host firewall. To make the proxy the only path out:');
138
+ log.dim(` sudo intutic enforce apply --port ${defaultPort}`);
139
+ log.dim(' See what it would do first with: intutic enforce generate');
140
+ }
141
+ //# sourceMappingURL=enterprise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enterprise.js","sourceRoot":"","sources":["../../src/commands/enterprise.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Persist ANTHROPIC_BASE_URL / OPENAI_BASE_URL so they survive a restart. */
2
+ export declare function runEnvPersist(opts: {
3
+ proxyUrl?: string;
4
+ }): Promise<void>;
5
+ /** Remove whatever `intutic env persist` wrote. */
6
+ export declare function runEnvClear(): Promise<void>;
7
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAwBA,8EAA8E;AAC9E,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B9E;AAED,mDAAmD;AACnD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAIjD"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * env.ts — Persist or clear the proxy base-URL environment variables.
3
+ *
4
+ * `lib/envInjector.ts` implements system-level injection for macOS
5
+ * (`launchctl setenv`), Linux (`~/.bashrc`) and Windows (`setx`). It shipped
6
+ * under a ✅ RESOLVED marker with a full test file and **no caller anywhere** —
7
+ * so the capability the entry described could not be invoked. This is the
8
+ * route it never had (TD-041).
9
+ *
10
+ * Deliberately opt-in rather than a side effect of `intutic start` or
11
+ * `intutic connect`: on macOS `launchctl setenv` reaches every GUI application
12
+ * the user launches afterwards, and on Linux it appends to a shell profile.
13
+ * Neither belongs in a command the user ran for another reason.
14
+ *
15
+ * @module
16
+ */
17
+ import { log } from '../lib/logger.js';
18
+ import { injectBaseUrlEnvVars, removeBaseUrlEnvVars, PlatformNotSupportedError, ElevationRequiredError, } from '../lib/envInjector.js';
19
+ /** Persist ANTHROPIC_BASE_URL / OPENAI_BASE_URL so they survive a restart. */
20
+ export async function runEnvPersist(opts) {
21
+ const proxyUrl = opts.proxyUrl ?? 'http://localhost:4000';
22
+ try {
23
+ const result = await injectBaseUrlEnvVars(proxyUrl);
24
+ log.success(`Persisted ${result.vars.join(', ')} → ${proxyUrl}`);
25
+ log.field('Platform', result.platform);
26
+ log.field('Scope', result.scope);
27
+ log.field('Method', result.method);
28
+ log.info('');
29
+ log.info('Already-open terminals keep their old environment — restart them,');
30
+ log.info('or re-source your shell profile, before the change is visible.');
31
+ log.info('');
32
+ log.info('Undo with: intutic env clear');
33
+ }
34
+ catch (err) {
35
+ if (err instanceof PlatformNotSupportedError) {
36
+ log.error(`${err.message}`);
37
+ log.info('Set ANTHROPIC_BASE_URL and OPENAI_BASE_URL by hand, or use `intutic exec`,');
38
+ log.info('which sets them for one child process without touching your system.');
39
+ process.exit(1);
40
+ }
41
+ if (err instanceof ElevationRequiredError) {
42
+ log.error(`${err.message}`);
43
+ log.info('Re-run with the privileges that path needs, or use `intutic exec` instead.');
44
+ process.exit(1);
45
+ }
46
+ throw err;
47
+ }
48
+ }
49
+ /** Remove whatever `intutic env persist` wrote. */
50
+ export async function runEnvClear() {
51
+ await removeBaseUrlEnvVars();
52
+ log.success('Cleared the persisted base-URL environment variables.');
53
+ log.info('Already-open terminals keep the old values until they are restarted.');
54
+ }
55
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,uBAAuB,CAAA;AAE9B,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAA2B;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,uBAAuB,CAAA;IAEzD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAA;QACnD,GAAG,CAAC,OAAO,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAA;QAChE,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QACtC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAChC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAClC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACZ,GAAG,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAA;QAC7E,GAAG,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;QAC1E,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACZ,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,yBAAyB,EAAE,CAAC;YAC7C,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;YAC3B,GAAG,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAA;YACtF,GAAG,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAA;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;YAC1C,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;YAC3B,GAAG,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAA;YACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,oBAAoB,EAAE,CAAA;IAC5B,GAAG,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAA;IACpE,GAAG,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAA;AAClF,CAAC"}
@@ -17,6 +17,36 @@
17
17
  * LLD #8 — Sync Daemon / CLI
18
18
  * @module
19
19
  */
20
+ import type { IntuticCredentials } from '@intutic/shared-types';
21
+ import { type GraphIdentity } from '../lib/graphIdentity.js';
22
+ import { type SandboxKind } from '../lib/sandbox/index.js';
23
+ /** Workspace requirement for whether agents must run sandboxed (LLD #63 §6). */
24
+ export type SandboxRequirement = 'off' | 'warn' | 'require';
25
+ /**
26
+ * Resolve this workspace's sandbox requirement, resiliently. A best-effort
27
+ * control-plane fetch (short timeout) refreshes a local cache; if the control
28
+ * plane is unreachable we fall back to the cache, and if there is none we
29
+ * default to `off`. This keeps an offline developer working and keeps open core
30
+ * — which has no control plane to read this from — entirely unaffected.
31
+ *
32
+ * This is a client-side, advisory layer (a determined user can bypass by not
33
+ * using `intutic exec` at all); server-side attestation is the stronger
34
+ * follow-on. So failing open toward `off` on an unreachable, never-cached
35
+ * control plane is the honest behaviour for what this layer is.
36
+ */
37
+ export declare function resolveSandboxRequirement(creds: IntuticCredentials): Promise<SandboxRequirement>;
38
+ /** Options for a sandboxed `intutic exec`. */
39
+ export interface SandboxExecOptions {
40
+ kind: SandboxKind;
41
+ image: string;
42
+ memory: string;
43
+ cpus: string;
44
+ pidsLimit: number;
45
+ /** Extra destination CIDRs the sandbox may reach beyond the proxy + DNS. */
46
+ allow: string[];
47
+ }
48
+ /** The proxy port the host listens on, from INTUTIC_PROXY_URL (default 4000). */
49
+ export declare function proxyPortFromEnv(): string;
20
50
  /**
21
51
  * Build the proxy environment variables for a child process.
22
52
  *
@@ -24,11 +54,17 @@
24
54
  * @param devMode - retained for call-site compatibility; the proxy is always local
25
55
  * @returns Record of env vars to inject
26
56
  */
27
- export declare function buildProxyEnv(apiKey: string, devMode: boolean): Record<string, string>;
57
+ export declare function buildProxyEnv(apiKey: string, devMode: boolean, identity?: GraphIdentity, proxyUrlOverride?: string): Record<string, string>;
28
58
  /**
29
59
  * Execute a command with Intutic proxy environment variables injected.
30
60
  *
31
61
  * @param commandAndArgs - Array of command + arguments (e.g. ['claude'] or ['python', 'main.py'])
62
+ * @param sandbox - when set, run the command inside an isolated runtime whose
63
+ * only egress is the proxy (LLD #63 §6) instead of directly on the host.
32
64
  */
33
- export declare function runExec(commandAndArgs: string[]): Promise<void>;
65
+ export declare function runExec(commandAndArgs: string[], sandbox?: SandboxExecOptions): Promise<void>;
66
+ /** Opens a SANDBOX-mode session for telemetry. Returns null on any failure. */
67
+ export declare function openSandboxSession(creds: IntuticCredentials, identity: GraphIdentity, backendName: string): Promise<string | null>;
68
+ /** Ends a session opened by openSandboxSession. Best-effort. */
69
+ export declare function closeSandboxSession(creds: IntuticCredentials, sessionId: string): Promise<void>;
34
70
  //# sourceMappingURL=exec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BtF;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDrE"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE/D,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAiB,KAAK,WAAW,EAAoB,MAAM,yBAAyB,CAAA;AAG3F,gFAAgF;AAChF,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAA;AAE3D;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAkC7B;AAKD,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,WAAW,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,IAAI,MAAM,CAOzC;AAgBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,aAAa,EACxB,gBAAgB,CAAC,EAAE,MAAM,GACxB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyDxB;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,cAAc,EAAE,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAiFf;AA6FD,+EAA+E;AAC/E,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,aAAa,EACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB;AAED,gEAAgE;AAChE,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAarG"}
@@ -18,9 +18,88 @@
18
18
  * @module
19
19
  */
20
20
  import { spawn } from 'node:child_process';
21
+ import * as fs from 'node:fs/promises';
22
+ import * as path from 'node:path';
21
23
  import { loadCredentials, loadConfig } from '../config/store.js';
24
+ import { getIntuticDir } from '../config/paths.js';
25
+ import { deriveIdentity, identityEnv, identityHeaders, identityPathPrefix, } from '../lib/graphIdentity.js';
22
26
  import { log } from '../lib/logger.js';
27
+ import { NOT_AUTHENTICATED } from '../lib/authMessages.js';
28
+ import { selectBackend } from '../lib/sandbox/index.js';
23
29
  import pc from 'picocolors';
30
+ /**
31
+ * Resolve this workspace's sandbox requirement, resiliently. A best-effort
32
+ * control-plane fetch (short timeout) refreshes a local cache; if the control
33
+ * plane is unreachable we fall back to the cache, and if there is none we
34
+ * default to `off`. This keeps an offline developer working and keeps open core
35
+ * — which has no control plane to read this from — entirely unaffected.
36
+ *
37
+ * This is a client-side, advisory layer (a determined user can bypass by not
38
+ * using `intutic exec` at all); server-side attestation is the stronger
39
+ * follow-on. So failing open toward `off` on an unreachable, never-cached
40
+ * control plane is the honest behaviour for what this layer is.
41
+ */
42
+ export async function resolveSandboxRequirement(creds) {
43
+ const cachePath = path.join(getIntuticDir(), 'exec-policy.json');
44
+ const coerce = (v) => v === 'warn' || v === 'require' ? v : 'off';
45
+ const base = trimTrailingSlashes(creds.controlPlaneUrl ?? 'https://api.intutic.ai');
46
+ try {
47
+ const res = await fetch(`${base}/api/v1/workspace/settings`, {
48
+ headers: {
49
+ Authorization: `Bearer ${creds.apiKey}`,
50
+ 'x-workspace-id': creds.workspaceId ?? '',
51
+ },
52
+ signal: AbortSignal.timeout(2500),
53
+ });
54
+ if (res.ok) {
55
+ const body = (await res.json());
56
+ const val = coerce(body?.settings?.sandboxRequirement);
57
+ try {
58
+ await fs.writeFile(cachePath, JSON.stringify({ sandboxRequirement: val, cachedAt: new Date().toISOString() }));
59
+ }
60
+ catch {
61
+ /* cache write is best-effort */
62
+ }
63
+ return val;
64
+ }
65
+ }
66
+ catch {
67
+ /* fall through to the cache */
68
+ }
69
+ try {
70
+ const cached = JSON.parse(await fs.readFile(cachePath, 'utf-8'));
71
+ return coerce(cached?.sandboxRequirement);
72
+ }
73
+ catch {
74
+ return 'off';
75
+ }
76
+ }
77
+ /** The hostname a container reaches the host (and so the proxy) at. */
78
+ const PROXY_HOST_ALIAS = 'host.docker.internal';
79
+ /** The proxy port the host listens on, from INTUTIC_PROXY_URL (default 4000). */
80
+ export function proxyPortFromEnv() {
81
+ const raw = process.env.INTUTIC_PROXY_URL ?? 'http://localhost:4000';
82
+ try {
83
+ return new URL(raw).port || '4000';
84
+ }
85
+ catch {
86
+ return '4000';
87
+ }
88
+ }
89
+ /**
90
+ * Trims trailing `/` characters without a regex.
91
+ *
92
+ * `INTUTIC_PROXY_URL` is a local environment variable, not remotely
93
+ * attacker-controlled — but CodeQL's static analysis flags `/\/+$/` as a
94
+ * polynomial-time pattern on external input regardless, and a loop is O(n)
95
+ * and cannot be mis-classified as a ReDoS shape by any static analyzer.
96
+ */
97
+ function trimTrailingSlashes(s) {
98
+ let end = s.length;
99
+ while (end > 0 && s.charCodeAt(end - 1) === 47 /* '/' */)
100
+ end--;
101
+ return s.slice(0, end);
102
+ }
24
103
  /**
25
104
  * Build the proxy environment variables for a child process.
26
105
  *
@@ -28,18 +107,25 @@ import pc from 'picocolors';
28
107
  * @param devMode - retained for call-site compatibility; the proxy is always local
29
108
  * @returns Record of env vars to inject
30
109
  */
31
- export function buildProxyEnv(apiKey, devMode) {
110
+ export function buildProxyEnv(apiKey, devMode, identity, proxyUrlOverride) {
32
111
  // The local proxy is the default, and for open core it is the only proxy
33
112
  // there is. This used to point at a remote host unless --dev was passed, so
34
113
  // `intutic exec` sent both the agent's traffic and OPENAI_API_KEY off the
35
114
  // machine -- to a host that does not resolve, so the command could not work
36
115
  // either. `intutic start` binds :4000; that is what these should reach.
37
116
  //
38
- // Set INTUTIC_PROXY_URL to point at a proxy you run somewhere else.
39
- const proxyHost = (process.env.INTUTIC_PROXY_URL ?? 'http://localhost:4000').replace(/\/+$/, '');
40
- const proxyUrl = `${proxyHost}/v1`;
117
+ // Set INTUTIC_PROXY_URL to point at a proxy you run somewhere else. A sandbox
118
+ // launch overrides it with the host-gateway alias, because inside the sandbox
119
+ // `localhost` is the sandbox, not the host the proxy runs on.
120
+ const rawHost = trimTrailingSlashes(proxyUrlOverride ?? process.env.INTUTIC_PROXY_URL ?? 'http://localhost:4000');
41
121
  void devMode;
42
- return {
122
+ // Graph identity rides in the base URL. Harnesses append their own path to
123
+ // whatever host they are given, so a prefix here reaches the proxy from every
124
+ // one of them — including the many that offer no way to set a header. The
125
+ // proxy strips it before routing, so upstream sees the path the harness meant.
126
+ const proxyHost = identity ? `${rawHost}${identityPathPrefix(identity)}` : rawHost;
127
+ const proxyUrl = `${proxyHost}/v1`;
128
+ const env = {
43
129
  // OpenAI-compatible (covers LiteLLM, LangChain, CrewAI, ADK, Aider)
44
130
  OPENAI_API_BASE: proxyUrl,
45
131
  // OpenAI SDK v1+ (covers Python SDK, Pydantic-AI, Agent SDK)
@@ -56,38 +142,74 @@ export function buildProxyEnv(apiKey, devMode) {
56
142
  // Intutic-native
57
143
  INTUTIC_API_KEY: apiKey,
58
144
  };
145
+ if (identity) {
146
+ // Passed down so a nested `intutic exec` — an agent spawning an agent —
147
+ // derives itself as this node's child without anything tracking the graph
148
+ // centrally.
149
+ Object.assign(env, identityEnv(identity));
150
+ // Claude Code is the one harness that can send arbitrary headers, and the
151
+ // proxy prefers headers over the path. Anything already configured is kept:
152
+ // clobbering a user's own headers to add telemetry would be a poor trade.
153
+ const existing = process.env.ANTHROPIC_CUSTOM_HEADERS;
154
+ const ours = Object.entries(identityHeaders(identity))
155
+ .map(([k, v]) => `${k}: ${v}`)
156
+ .join('\n');
157
+ env.ANTHROPIC_CUSTOM_HEADERS = existing ? `${existing}\n${ours}` : ours;
158
+ }
159
+ return env;
59
160
  }
60
161
  /**
61
162
  * Execute a command with Intutic proxy environment variables injected.
62
163
  *
63
164
  * @param commandAndArgs - Array of command + arguments (e.g. ['claude'] or ['python', 'main.py'])
165
+ * @param sandbox - when set, run the command inside an isolated runtime whose
166
+ * only egress is the proxy (LLD #63 §6) instead of directly on the host.
64
167
  */
65
- export async function runExec(commandAndArgs) {
168
+ export async function runExec(commandAndArgs, sandbox) {
66
169
  if (commandAndArgs.length === 0) {
67
170
  log.error('No command specified.');
68
171
  log.dim('Usage: intutic exec -- <command> [args...]');
69
172
  log.dim('Example: intutic exec -- claude');
70
173
  log.dim('Example: intutic exec -- aider --model openai/gpt-4o');
71
- log.dim('Example: intutic exec -- python my_agent.py');
174
+ log.dim('Example: intutic exec --sandbox -- python my_agent.py');
72
175
  process.exit(1);
73
176
  }
74
177
  // Load credentials
75
178
  const creds = await loadCredentials();
76
179
  if (!creds) {
77
- log.error('Not authenticated. This command needs an Intutic control plane, which open core does not include. To run the proxy without one: `intutic start`.');
180
+ log.error(NOT_AUTHENTICATED);
78
181
  process.exit(1);
79
182
  }
80
183
  // Load config for dev mode
81
184
  const config = loadConfig();
82
185
  const devMode = config?.devMode ?? process.env.INTUTIC_DEV === '1';
83
- // Build env
84
- const proxyEnv = buildProxyEnv(creds.apiKey, devMode);
186
+ // Build env. A nested `intutic exec` inherits identity from its parent and
187
+ // becomes a child node; a top-level one starts a new graph.
188
+ const identity = deriveIdentity();
189
+ if (sandbox) {
190
+ await runSandboxed(commandAndArgs, creds, devMode, identity, sandbox);
191
+ return;
192
+ }
193
+ // Not sandboxed — honour the workspace's sandbox requirement (LLD #63 §6).
194
+ const requirement = await resolveSandboxRequirement(creds);
195
+ if (requirement === 'require') {
196
+ log.error('This workspace requires agents to run inside a sandbox.');
197
+ log.dim(`Re-run with the sandbox: intutic exec --sandbox -- ${commandAndArgs.join(' ')}`);
198
+ process.exit(1);
199
+ }
200
+ if (requirement === 'warn') {
201
+ log.warn('This workspace recommends running agents in a sandbox — add --sandbox.');
202
+ }
203
+ const proxyEnv = buildProxyEnv(creds.apiKey, devMode, identity);
85
204
  const childEnv = { ...process.env, ...proxyEnv };
86
205
  const [exe, ...args] = commandAndArgs;
87
206
  // Print info
88
207
  log.info(`Launching: ${pc.bold(exe)} ${args.join(' ')}`);
89
208
  log.dim(`Proxy: ${proxyEnv.OPENAI_API_BASE}`);
90
209
  log.dim(`API Key: ${creds.apiKey.slice(0, 8)}...${creds.apiKey.slice(-4)}`);
210
+ log.dim(identity.depth === 0
211
+ ? `Graph: ${identity.graphId} (root)`
212
+ : `Graph: ${identity.graphId} · node ${identity.nodeId} · depth ${identity.depth}`);
91
213
  console.log('');
92
214
  // Spawn the child process with inherited stdio (full interactivity)
93
215
  const child = spawn(exe, args, {
@@ -114,4 +236,119 @@ export async function runExec(commandAndArgs) {
114
236
  }
115
237
  });
116
238
  }
239
+ /**
240
+ * Run the agent inside an isolated sandbox whose only egress is the proxy.
241
+ *
242
+ * Inside the sandbox `localhost` is the sandbox, not the host — so the proxy
243
+ * env is rebuilt against the host-gateway alias, and the sandbox's egress
244
+ * firewall is opened to exactly that address plus DNS (and any `--sandbox-allow`
245
+ * CIDRs). Secrets are passed by env-var *name*, so they never appear in the
246
+ * container runtime's argv.
247
+ */
248
+ async function runSandboxed(commandAndArgs, creds, devMode, identity, opts) {
249
+ const port = proxyPortFromEnv();
250
+ const proxyUrlOverride = `http://${PROXY_HOST_ALIAS}:${port}`;
251
+ const proxyEnv = buildProxyEnv(creds.apiKey, devMode, identity, proxyUrlOverride);
252
+ // The values the runtime will read for the `--env NAME` references.
253
+ //
254
+ // INTUTIC_SANDBOX_PROXY_PORT is separate from ANTHROPIC_BASE_URL/etc on
255
+ // purpose: those carry an identity path prefix (buildProxyEnv, when
256
+ // `identity` is set) that the proxy's /intutic/* routes don't expect —
257
+ // building the attest URL from host+port directly, not by trimming a path
258
+ // off an identity-bearing URL in shell, keeps entrypoint.sh simple and
259
+ // correct regardless of whether identity is present.
260
+ const env = {
261
+ ...proxyEnv,
262
+ INTUTIC_SANDBOX_PROXY_HOST: PROXY_HOST_ALIAS,
263
+ INTUTIC_SANDBOX_PROXY_PORT: port,
264
+ ...(opts.allow.length ? { INTUTIC_SANDBOX_ALLOW: opts.allow.join(',') } : {}),
265
+ };
266
+ let backend;
267
+ try {
268
+ backend = selectBackend(opts.kind, env);
269
+ }
270
+ catch (err) {
271
+ log.error(`Sandbox unavailable: ${err instanceof Error ? err.message : String(err)}`);
272
+ process.exit(1);
273
+ }
274
+ const health = await backend.health();
275
+ if (!health.available) {
276
+ // Honesty rule (LLD #63 §6): never silently fall back to running the agent
277
+ // ungoverned on the host — say what is unavailable and stop.
278
+ log.error(`Sandbox backend '${backend.name}' is not available: ${health.detail}`);
279
+ log.dim('Start Docker (or Podman), or drop --sandbox to run on the host.');
280
+ process.exit(1);
281
+ }
282
+ log.info(`Sandbox: ${backend.name} · image ${opts.image} · egress locked to the proxy`);
283
+ log.dim(`Proxy (from sandbox): ${proxyUrlOverride}`);
284
+ const [exe, ...rest] = commandAndArgs;
285
+ log.info(`Launching in sandbox: ${pc.bold(exe)} ${rest.join(' ')}`);
286
+ console.log('');
287
+ // Best-effort telemetry: a SANDBOX-mode session makes "how many runs were
288
+ // sandboxed" answerable (agent_sessions.executionMode already exists as a
289
+ // column with no other writer for this case — reusing it needs no schema
290
+ // change). Never blocks or fails the run: an unreachable control plane costs
291
+ // a debug log line, not a broken `intutic exec --sandbox`.
292
+ //
293
+ // Opened before `spec` so the session id can ride into the container as
294
+ // INTUTIC_SESSION_ID — the entrypoint uses it to attest itself server-side
295
+ // (LLD #63 §6, TD-333) once its own firewall + capability drop are in
296
+ // effect, closing the gap where this executionMode:'SANDBOX' record was
297
+ // the entire, self-reported, host-side claim.
298
+ const sessionId = await openSandboxSession(creds, identity, backend.name);
299
+ if (sessionId)
300
+ env.INTUTIC_SESSION_ID = sessionId;
301
+ const spec = {
302
+ command: commandAndArgs,
303
+ workdir: process.cwd(),
304
+ image: opts.image,
305
+ envKeys: Object.keys(env),
306
+ proxyHostAlias: PROXY_HOST_ALIAS,
307
+ allowCidrs: opts.allow,
308
+ memory: opts.memory,
309
+ cpus: opts.cpus,
310
+ pidsLimit: opts.pidsLimit,
311
+ tty: Boolean(process.stdout.isTTY),
312
+ };
313
+ const code = await backend.run(spec);
314
+ if (sessionId)
315
+ await closeSandboxSession(creds, sessionId);
316
+ process.exit(code);
317
+ }
318
+ /** Opens a SANDBOX-mode session for telemetry. Returns null on any failure. */
319
+ export async function openSandboxSession(creds, identity, backendName) {
320
+ try {
321
+ const res = await fetch(`${trimTrailingSlashes(creds.controlPlaneUrl)}/api/v1/sessions`, {
322
+ method: 'POST',
323
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${creds.apiKey}` },
324
+ body: JSON.stringify({
325
+ workspaceId: creds.workspaceId,
326
+ harnessType: 'sandbox',
327
+ executionMode: 'SANDBOX',
328
+ envTaskContext: `sandbox-backend:${backendName};graph:${identity.graphId}`,
329
+ }),
330
+ signal: AbortSignal.timeout(5_000),
331
+ });
332
+ if (!res.ok)
333
+ return null;
334
+ const body = (await res.json());
335
+ return body.sessionId ?? null;
336
+ }
337
+ catch {
338
+ return null;
339
+ }
340
+ }
341
+ /** Ends a session opened by openSandboxSession. Best-effort. */
342
+ export async function closeSandboxSession(creds, sessionId) {
343
+ try {
344
+ await fetch(`${trimTrailingSlashes(creds.controlPlaneUrl)}/api/v1/sessions/${sessionId}/end`, {
345
+ method: 'PATCH',
346
+ headers: { Authorization: `Bearer ${creds.apiKey}` },
347
+ signal: AbortSignal.timeout(5_000),
348
+ });
349
+ }
350
+ catch {
351
+ /* best-effort */
352
+ }
353
+ }
117
354
  //# sourceMappingURL=exec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"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"}