@intutic/cli 1.9.0 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/cli.js +868 -30
- package/dist/cli.js.map +1 -1
- package/dist/commands/attenuate.d.ts +39 -0
- package/dist/commands/attenuate.d.ts.map +1 -0
- package/dist/commands/attenuate.js +98 -0
- package/dist/commands/attenuate.js.map +1 -0
- package/dist/commands/budget.d.ts +80 -0
- package/dist/commands/budget.d.ts.map +1 -1
- package/dist/commands/budget.js +119 -3
- package/dist/commands/budget.js.map +1 -1
- package/dist/commands/connect.d.ts +10 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +358 -48
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/credentials.d.ts +31 -0
- package/dist/commands/credentials.d.ts.map +1 -0
- package/dist/commands/credentials.js +134 -0
- package/dist/commands/credentials.js.map +1 -0
- package/dist/commands/decision.d.ts +37 -0
- package/dist/commands/decision.d.ts.map +1 -0
- package/dist/commands/decision.js +56 -0
- package/dist/commands/decision.js.map +1 -0
- package/dist/commands/doctor.d.ts +38 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +228 -18
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/enforce.d.ts +33 -0
- package/dist/commands/enforce.d.ts.map +1 -0
- package/dist/commands/enforce.js +150 -0
- package/dist/commands/enforce.js.map +1 -0
- package/dist/commands/enterprise.d.ts +29 -0
- package/dist/commands/enterprise.d.ts.map +1 -0
- package/dist/commands/enterprise.js +141 -0
- package/dist/commands/enterprise.js.map +1 -0
- package/dist/commands/env.d.ts +7 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +55 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/exec.d.ts +38 -2
- package/dist/commands/exec.d.ts.map +1 -1
- package/dist/commands/exec.js +247 -10
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/findings.d.ts +84 -0
- package/dist/commands/findings.d.ts.map +1 -0
- package/dist/commands/findings.js +329 -0
- package/dist/commands/findings.js.map +1 -0
- package/dist/commands/gateway.d.ts +62 -0
- package/dist/commands/gateway.d.ts.map +1 -0
- package/dist/commands/gateway.js +298 -0
- package/dist/commands/gateway.js.map +1 -0
- package/dist/commands/guardrails.d.ts +81 -0
- package/dist/commands/guardrails.d.ts.map +1 -0
- package/dist/commands/guardrails.js +735 -0
- package/dist/commands/guardrails.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +14 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install-daemon.d.ts +70 -3
- package/dist/commands/install-daemon.d.ts.map +1 -1
- package/dist/commands/install-daemon.js +482 -47
- package/dist/commands/install-daemon.js.map +1 -1
- package/dist/commands/integrity.d.ts +205 -0
- package/dist/commands/integrity.d.ts.map +1 -0
- package/dist/commands/integrity.js +620 -0
- package/dist/commands/integrity.js.map +1 -0
- package/dist/commands/judge.d.ts +31 -0
- package/dist/commands/judge.d.ts.map +1 -0
- package/dist/commands/judge.js +118 -0
- package/dist/commands/judge.js.map +1 -0
- package/dist/commands/org.d.ts +31 -0
- package/dist/commands/org.d.ts.map +1 -0
- package/dist/commands/org.js +159 -0
- package/dist/commands/org.js.map +1 -0
- package/dist/commands/policy.d.ts +138 -4
- package/dist/commands/policy.d.ts.map +1 -1
- package/dist/commands/policy.js +538 -97
- package/dist/commands/policy.js.map +1 -1
- package/dist/commands/predict-cost.d.ts +45 -0
- package/dist/commands/predict-cost.d.ts.map +1 -0
- package/dist/commands/predict-cost.js +123 -0
- package/dist/commands/predict-cost.js.map +1 -0
- package/dist/commands/rollback.d.ts +5 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +142 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/routing.d.ts +62 -0
- package/dist/commands/routing.d.ts.map +1 -0
- package/dist/commands/routing.js +121 -0
- package/dist/commands/routing.js.map +1 -0
- package/dist/commands/setup.d.ts +62 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +238 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/skill.d.ts +268 -1
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +744 -39
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/sops.d.ts +95 -0
- package/dist/commands/sops.d.ts.map +1 -1
- package/dist/commands/sops.js +334 -34
- package/dist/commands/sops.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +1 -18
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +44 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/team.d.ts +38 -0
- package/dist/commands/team.d.ts.map +1 -0
- package/dist/commands/team.js +140 -0
- package/dist/commands/team.js.map +1 -0
- package/dist/commands/traces.d.ts +8 -1
- package/dist/commands/traces.d.ts.map +1 -1
- package/dist/commands/traces.js +114 -15
- package/dist/commands/traces.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +2 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config/keychain.d.ts +10 -2
- package/dist/config/keychain.d.ts.map +1 -1
- package/dist/config/keychain.js +83 -14
- package/dist/config/keychain.js.map +1 -1
- package/dist/config/paths.d.ts +27 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +37 -6
- package/dist/config/paths.js.map +1 -1
- package/dist/config/store.d.ts.map +1 -1
- package/dist/config/store.js +19 -3
- package/dist/config/store.js.map +1 -1
- package/dist/harness/ag2.d.ts +22 -0
- package/dist/harness/ag2.d.ts.map +1 -0
- package/dist/harness/ag2.js +34 -0
- package/dist/harness/ag2.js.map +1 -0
- package/dist/harness/agentcore.d.ts +55 -0
- package/dist/harness/agentcore.d.ts.map +1 -0
- package/dist/harness/agentcore.js +119 -0
- package/dist/harness/agentcore.js.map +1 -0
- package/dist/harness/agenticOrchestrator.d.ts +52 -0
- package/dist/harness/agenticOrchestrator.d.ts.map +1 -0
- package/dist/harness/agenticOrchestrator.js +115 -0
- package/dist/harness/agenticOrchestrator.js.map +1 -0
- package/dist/harness/aiSdkHarness.d.ts +30 -0
- package/dist/harness/aiSdkHarness.d.ts.map +1 -0
- package/dist/harness/aiSdkHarness.js +51 -0
- package/dist/harness/aiSdkHarness.js.map +1 -0
- package/dist/harness/aiSdkWorkflow.d.ts +26 -0
- package/dist/harness/aiSdkWorkflow.d.ts.map +1 -0
- package/dist/harness/aiSdkWorkflow.js +39 -0
- package/dist/harness/aiSdkWorkflow.js.map +1 -0
- package/dist/harness/autogen.d.ts +24 -0
- package/dist/harness/autogen.d.ts.map +1 -0
- package/dist/harness/autogen.js +36 -0
- package/dist/harness/autogen.js.map +1 -0
- package/dist/harness/base.js.map +1 -1
- package/dist/harness/continue.d.ts.map +1 -1
- package/dist/harness/continue.js +2 -1
- package/dist/harness/continue.js.map +1 -1
- package/dist/harness/crewai.d.ts +15 -0
- package/dist/harness/crewai.d.ts.map +1 -0
- package/dist/harness/crewai.js +26 -0
- package/dist/harness/crewai.js.map +1 -0
- package/dist/harness/detector.d.ts +1 -1
- package/dist/harness/detector.d.ts.map +1 -1
- package/dist/harness/detector.js +47 -1
- package/dist/harness/detector.js.map +1 -1
- package/dist/harness/dsh.d.ts +19 -0
- package/dist/harness/dsh.d.ts.map +1 -0
- package/dist/harness/dsh.js +93 -0
- package/dist/harness/dsh.js.map +1 -0
- package/dist/harness/eve.d.ts +40 -0
- package/dist/harness/eve.d.ts.map +1 -0
- package/dist/harness/eve.js +67 -0
- package/dist/harness/eve.js.map +1 -0
- package/dist/harness/googleAdk.d.ts +18 -0
- package/dist/harness/googleAdk.d.ts.map +1 -0
- package/dist/harness/googleAdk.js +29 -0
- package/dist/harness/googleAdk.js.map +1 -0
- package/dist/harness/goose.d.ts.map +1 -1
- package/dist/harness/goose.js +5 -1
- package/dist/harness/goose.js.map +1 -1
- package/dist/harness/grok.d.ts +16 -0
- package/dist/harness/grok.d.ts.map +1 -0
- package/dist/harness/grok.js +78 -0
- package/dist/harness/grok.js.map +1 -0
- package/dist/harness/jsSdkGatedAdapter.d.ts +102 -0
- package/dist/harness/jsSdkGatedAdapter.d.ts.map +1 -0
- package/dist/harness/jsSdkGatedAdapter.js +139 -0
- package/dist/harness/jsSdkGatedAdapter.js.map +1 -0
- package/dist/harness/langchain.d.ts +22 -0
- package/dist/harness/langchain.d.ts.map +1 -0
- package/dist/harness/langchain.js +33 -0
- package/dist/harness/langchain.js.map +1 -0
- package/dist/harness/langgraph.d.ts +22 -0
- package/dist/harness/langgraph.d.ts.map +1 -0
- package/dist/harness/langgraph.js +80 -0
- package/dist/harness/langgraph.js.map +1 -0
- package/dist/harness/mastra.d.ts +21 -0
- package/dist/harness/mastra.d.ts.map +1 -0
- package/dist/harness/mastra.js +33 -0
- package/dist/harness/mastra.js.map +1 -0
- package/dist/harness/muse.d.ts +22 -0
- package/dist/harness/muse.d.ts.map +1 -0
- package/dist/harness/muse.js +92 -0
- package/dist/harness/muse.js.map +1 -0
- package/dist/harness/n8n.d.ts.map +1 -1
- package/dist/harness/n8n.js +36 -11
- package/dist/harness/n8n.js.map +1 -1
- package/dist/harness/openaiAgents.d.ts +40 -0
- package/dist/harness/openaiAgents.d.ts.map +1 -0
- package/dist/harness/openaiAgents.js +107 -0
- package/dist/harness/openaiAgents.js.map +1 -0
- package/dist/harness/opencode.d.ts +24 -0
- package/dist/harness/opencode.d.ts.map +1 -0
- package/dist/harness/opencode.js +97 -0
- package/dist/harness/opencode.js.map +1 -0
- package/dist/harness/pydanticAi.d.ts +19 -0
- package/dist/harness/pydanticAi.d.ts.map +1 -0
- package/dist/harness/pydanticAi.js +30 -0
- package/dist/harness/pydanticAi.js.map +1 -0
- package/dist/harness/sdkGatedAdapter.d.ts +55 -0
- package/dist/harness/sdkGatedAdapter.d.ts.map +1 -0
- package/dist/harness/sdkGatedAdapter.js +85 -0
- package/dist/harness/sdkGatedAdapter.js.map +1 -0
- package/dist/harness/smolagents.d.ts +22 -0
- package/dist/harness/smolagents.d.ts.map +1 -0
- package/dist/harness/smolagents.js +33 -0
- package/dist/harness/smolagents.js.map +1 -0
- package/dist/harness/strands.d.ts +22 -0
- package/dist/harness/strands.d.ts.map +1 -0
- package/dist/harness/strands.js +35 -0
- package/dist/harness/strands.js.map +1 -0
- package/dist/harness/trueforge.d.ts +25 -0
- package/dist/harness/trueforge.d.ts.map +1 -0
- package/dist/harness/trueforge.js +40 -0
- package/dist/harness/trueforge.js.map +1 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js +70 -0
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/vercelAiSdk.d.ts +31 -0
- package/dist/harness/vercelAiSdk.d.ts.map +1 -0
- package/dist/harness/vercelAiSdk.js +44 -0
- package/dist/harness/vercelAiSdk.js.map +1 -0
- package/dist/harness/xirp.d.ts +43 -0
- package/dist/harness/xirp.d.ts.map +1 -0
- package/dist/harness/xirp.js +95 -0
- package/dist/harness/xirp.js.map +1 -0
- package/dist/lib/api.d.ts +68 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +108 -67
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/authMessages.d.ts +19 -0
- package/dist/lib/authMessages.d.ts.map +1 -0
- package/dist/lib/authMessages.js +20 -0
- package/dist/lib/authMessages.js.map +1 -0
- package/dist/lib/binaryChecksum.d.ts +12 -0
- package/dist/lib/binaryChecksum.d.ts.map +1 -0
- package/dist/lib/binaryChecksum.js +45 -0
- package/dist/lib/binaryChecksum.js.map +1 -0
- package/dist/lib/binaryOnPath.d.ts +24 -0
- package/dist/lib/binaryOnPath.d.ts.map +1 -0
- package/dist/lib/binaryOnPath.js +31 -0
- package/dist/lib/binaryOnPath.js.map +1 -0
- package/dist/lib/caTrust.d.ts +69 -0
- package/dist/lib/caTrust.d.ts.map +1 -0
- package/dist/lib/caTrust.js +169 -0
- package/dist/lib/caTrust.js.map +1 -0
- package/dist/lib/ciscoScanner.d.ts +178 -0
- package/dist/lib/ciscoScanner.d.ts.map +1 -0
- package/dist/lib/ciscoScanner.js +292 -0
- package/dist/lib/ciscoScanner.js.map +1 -0
- package/dist/lib/decisionsLogRefresh.d.ts +28 -0
- package/dist/lib/decisionsLogRefresh.d.ts.map +1 -0
- package/dist/lib/decisionsLogRefresh.js +54 -0
- package/dist/lib/decisionsLogRefresh.js.map +1 -0
- package/dist/lib/deviceReport.d.ts +26 -0
- package/dist/lib/deviceReport.d.ts.map +1 -0
- package/dist/lib/deviceReport.js +55 -0
- package/dist/lib/deviceReport.js.map +1 -0
- package/dist/lib/elevation.d.ts +58 -0
- package/dist/lib/elevation.d.ts.map +1 -0
- package/dist/lib/elevation.js +83 -0
- package/dist/lib/elevation.js.map +1 -0
- package/dist/lib/enforcementState.d.ts +69 -0
- package/dist/lib/enforcementState.d.ts.map +1 -0
- package/dist/lib/enforcementState.js +113 -0
- package/dist/lib/enforcementState.js.map +1 -0
- package/dist/lib/ensureValkey.d.ts.map +1 -1
- package/dist/lib/ensureValkey.js +2 -2
- package/dist/lib/ensureValkey.js.map +1 -1
- package/dist/lib/envInjector.d.ts.map +1 -1
- package/dist/lib/envInjector.js +22 -4
- package/dist/lib/envInjector.js.map +1 -1
- package/dist/lib/gitHooks.d.ts +7 -2
- package/dist/lib/gitHooks.d.ts.map +1 -1
- package/dist/lib/gitHooks.js +180 -13
- package/dist/lib/gitHooks.js.map +1 -1
- package/dist/lib/gracefulShutdown.d.ts +37 -0
- package/dist/lib/gracefulShutdown.d.ts.map +1 -0
- package/dist/lib/gracefulShutdown.js +57 -0
- package/dist/lib/gracefulShutdown.js.map +1 -0
- package/dist/lib/graphIdentity.d.ts +80 -0
- package/dist/lib/graphIdentity.d.ts.map +1 -0
- package/dist/lib/graphIdentity.js +120 -0
- package/dist/lib/graphIdentity.js.map +1 -0
- package/dist/lib/localTraces.d.ts +61 -0
- package/dist/lib/localTraces.d.ts.map +1 -0
- package/dist/lib/localTraces.js +173 -0
- package/dist/lib/localTraces.js.map +1 -0
- package/dist/lib/mdmManifest.d.ts +73 -0
- package/dist/lib/mdmManifest.d.ts.map +1 -0
- package/dist/lib/mdmManifest.js +190 -0
- package/dist/lib/mdmManifest.js.map +1 -0
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +60 -1
- package/dist/lib/onboarding.js.map +1 -1
- package/dist/lib/otelPropagation.d.ts +26 -0
- package/dist/lib/otelPropagation.d.ts.map +1 -0
- package/dist/lib/otelPropagation.js +40 -0
- package/dist/lib/otelPropagation.js.map +1 -0
- package/dist/lib/policySnapshot.d.ts +92 -0
- package/dist/lib/policySnapshot.d.ts.map +1 -0
- package/dist/lib/policySnapshot.js +173 -0
- package/dist/lib/policySnapshot.js.map +1 -0
- package/dist/lib/process.d.ts.map +1 -1
- package/dist/lib/process.js +60 -0
- package/dist/lib/process.js.map +1 -1
- package/dist/lib/providerProbe.d.ts +28 -0
- package/dist/lib/providerProbe.d.ts.map +1 -0
- package/dist/lib/providerProbe.js +57 -0
- package/dist/lib/providerProbe.js.map +1 -0
- package/dist/lib/proxyBinary.d.ts +19 -0
- package/dist/lib/proxyBinary.d.ts.map +1 -0
- package/dist/lib/proxyBinary.js +30 -0
- package/dist/lib/proxyBinary.js.map +1 -0
- package/dist/lib/sandbox/firecracker.d.ts +89 -0
- package/dist/lib/sandbox/firecracker.d.ts.map +1 -0
- package/dist/lib/sandbox/firecracker.js +135 -0
- package/dist/lib/sandbox/firecracker.js.map +1 -0
- package/dist/lib/sandbox/index.d.ts +34 -0
- package/dist/lib/sandbox/index.d.ts.map +1 -0
- package/dist/lib/sandbox/index.js +54 -0
- package/dist/lib/sandbox/index.js.map +1 -0
- package/dist/lib/sandbox/oci.d.ts +38 -0
- package/dist/lib/sandbox/oci.d.ts.map +1 -0
- package/dist/lib/sandbox/oci.js +108 -0
- package/dist/lib/sandbox/oci.js.map +1 -0
- package/dist/lib/sandbox/types.d.ts +48 -0
- package/dist/lib/sandbox/types.d.ts.map +1 -0
- package/dist/lib/sandbox/types.js +12 -0
- package/dist/lib/sandbox/types.js.map +1 -0
- package/dist/lib/sopFrontMatter.d.ts +50 -0
- package/dist/lib/sopFrontMatter.d.ts.map +1 -0
- package/dist/lib/sopFrontMatter.js +129 -0
- package/dist/lib/sopFrontMatter.js.map +1 -0
- 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"}
|
package/dist/commands/exec.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/commands/exec.js
CHANGED
|
@@ -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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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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"}
|