@intutic/cli 2.5.0 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +27 -16
  2. package/dist/cli.js +24 -11
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/attenuate.d.ts +9 -8
  5. package/dist/commands/attenuate.d.ts.map +1 -1
  6. package/dist/commands/attenuate.js +18 -11
  7. package/dist/commands/attenuate.js.map +1 -1
  8. package/dist/commands/budget.d.ts.map +1 -1
  9. package/dist/commands/budget.js +3 -6
  10. package/dist/commands/budget.js.map +1 -1
  11. package/dist/commands/chaos.js +3 -2
  12. package/dist/commands/chaos.js.map +1 -1
  13. package/dist/commands/connect.d.ts +7 -0
  14. package/dist/commands/connect.d.ts.map +1 -1
  15. package/dist/commands/connect.js +79 -31
  16. package/dist/commands/connect.js.map +1 -1
  17. package/dist/commands/disconnect.d.ts +11 -1
  18. package/dist/commands/disconnect.d.ts.map +1 -1
  19. package/dist/commands/disconnect.js +18 -3
  20. package/dist/commands/disconnect.js.map +1 -1
  21. package/dist/commands/doctor.d.ts +7 -0
  22. package/dist/commands/doctor.d.ts.map +1 -1
  23. package/dist/commands/doctor.js +21 -17
  24. package/dist/commands/doctor.js.map +1 -1
  25. package/dist/commands/enforce.d.ts +14 -1
  26. package/dist/commands/enforce.d.ts.map +1 -1
  27. package/dist/commands/enforce.js +21 -3
  28. package/dist/commands/enforce.js.map +1 -1
  29. package/dist/commands/gateway.d.ts.map +1 -1
  30. package/dist/commands/gateway.js +3 -3
  31. package/dist/commands/gateway.js.map +1 -1
  32. package/dist/commands/guardrails.d.ts.map +1 -1
  33. package/dist/commands/guardrails.js +10 -8
  34. package/dist/commands/guardrails.js.map +1 -1
  35. package/dist/commands/integrity.d.ts.map +1 -1
  36. package/dist/commands/integrity.js +4 -1
  37. package/dist/commands/integrity.js.map +1 -1
  38. package/dist/commands/judge.d.ts.map +1 -1
  39. package/dist/commands/judge.js +6 -9
  40. package/dist/commands/judge.js.map +1 -1
  41. package/dist/commands/login.js +4 -4
  42. package/dist/commands/login.js.map +1 -1
  43. package/dist/commands/policy.d.ts +16 -0
  44. package/dist/commands/policy.d.ts.map +1 -1
  45. package/dist/commands/policy.js +86 -7
  46. package/dist/commands/policy.js.map +1 -1
  47. package/dist/commands/siem.d.ts.map +1 -1
  48. package/dist/commands/siem.js.map +1 -1
  49. package/dist/commands/skill.d.ts +52 -1
  50. package/dist/commands/skill.d.ts.map +1 -1
  51. package/dist/commands/skill.js +147 -40
  52. package/dist/commands/skill.js.map +1 -1
  53. package/dist/commands/sops.d.ts +61 -50
  54. package/dist/commands/sops.d.ts.map +1 -1
  55. package/dist/commands/sops.js +425 -166
  56. package/dist/commands/sops.js.map +1 -1
  57. package/dist/commands/start.d.ts.map +1 -1
  58. package/dist/commands/start.js +2 -1
  59. package/dist/commands/start.js.map +1 -1
  60. package/dist/commands/status.d.ts.map +1 -1
  61. package/dist/commands/status.js +2 -1
  62. package/dist/commands/status.js.map +1 -1
  63. package/dist/commands/traces.d.ts.map +1 -1
  64. package/dist/commands/traces.js +4 -3
  65. package/dist/commands/traces.js.map +1 -1
  66. package/dist/config/paths.d.ts +15 -9
  67. package/dist/config/paths.d.ts.map +1 -1
  68. package/dist/config/paths.js +24 -10
  69. package/dist/config/paths.js.map +1 -1
  70. package/dist/harness/ag2.d.ts +4 -2
  71. package/dist/harness/ag2.d.ts.map +1 -1
  72. package/dist/harness/ag2.js +4 -2
  73. package/dist/harness/ag2.js.map +1 -1
  74. package/dist/harness/autogen.d.ts +10 -11
  75. package/dist/harness/autogen.d.ts.map +1 -1
  76. package/dist/harness/autogen.js +14 -15
  77. package/dist/harness/autogen.js.map +1 -1
  78. package/dist/harness/detector.d.ts.map +1 -1
  79. package/dist/harness/detector.js +5 -2
  80. package/dist/harness/detector.js.map +1 -1
  81. package/dist/harness/windsurf.d.ts.map +1 -1
  82. package/dist/harness/windsurf.js +4 -2
  83. package/dist/harness/windsurf.js.map +1 -1
  84. package/dist/lib/api.d.ts +7 -3
  85. package/dist/lib/api.d.ts.map +1 -1
  86. package/dist/lib/caTrust.d.ts +43 -1
  87. package/dist/lib/caTrust.d.ts.map +1 -1
  88. package/dist/lib/caTrust.js +109 -9
  89. package/dist/lib/caTrust.js.map +1 -1
  90. package/dist/lib/ciscoScanner.d.ts +9 -4
  91. package/dist/lib/ciscoScanner.d.ts.map +1 -1
  92. package/dist/lib/ciscoScanner.js +42 -8
  93. package/dist/lib/ciscoScanner.js.map +1 -1
  94. package/dist/lib/decisionsLogRefresh.d.ts.map +1 -1
  95. package/dist/lib/decisionsLogRefresh.js +6 -2
  96. package/dist/lib/decisionsLogRefresh.js.map +1 -1
  97. package/dist/lib/enforcementState.d.ts +7 -0
  98. package/dist/lib/enforcementState.d.ts.map +1 -1
  99. package/dist/lib/enforcementState.js +9 -0
  100. package/dist/lib/enforcementState.js.map +1 -1
  101. package/dist/lib/mdmManifest.d.ts.map +1 -1
  102. package/dist/lib/mdmManifest.js +33 -3
  103. package/dist/lib/mdmManifest.js.map +1 -1
  104. package/dist/lib/proxyBinary.d.ts +11 -0
  105. package/dist/lib/proxyBinary.d.ts.map +1 -1
  106. package/dist/lib/proxyBinary.js +16 -0
  107. package/dist/lib/proxyBinary.js.map +1 -1
  108. package/dist/lib/sopFrontMatter.d.ts +35 -0
  109. package/dist/lib/sopFrontMatter.d.ts.map +1 -1
  110. package/dist/lib/sopFrontMatter.js +60 -0
  111. package/dist/lib/sopFrontMatter.js.map +1 -1
  112. package/package.json +5 -5
  113. package/resources/sandbox/firecracker-launch.sh +8 -7
@@ -18,6 +18,7 @@
18
18
  * @module
19
19
  */
20
20
  import { randomUUID } from 'node:crypto';
21
+ import * as path from 'node:path';
21
22
  import { buildHooksConfig, systemHooksDirFor } from '@intutic/sync-daemon/harness/cursorHooks';
22
23
  import { ANTIGRAVITY_HOOK_NAME, buildAntigravityHookEntry, buildGeminiBeforeToolEntry } from '@intutic/sync-daemon';
23
24
  function escapeXml(value) {
@@ -102,7 +103,8 @@ ${derBase64}
102
103
  function resolveTargetPath(params) {
103
104
  if (params.targetPath)
104
105
  return params.targetPath;
105
- return `${systemHooksDirFor(params.platform ?? process.platform)}/hooks.json`;
106
+ const platform = params.platform ?? process.platform;
107
+ return (platform === 'win32' ? path.win32 : path.posix).join(systemHooksDirFor(platform), 'hooks.json');
106
108
  }
107
109
  /**
108
110
  * Jamf-flavored deployment manifest wrapping the real `buildHooksConfig()`
@@ -180,6 +182,33 @@ export function generateAntigravityManifest(flavor, params) {
180
182
  },
181
183
  }, null, 2) + '\n';
182
184
  }
185
+ /** Single-quote a value for POSIX sh. */
186
+ function shQuote(value) {
187
+ return `'${value.split("'").join(`'\\''`)}'`;
188
+ }
189
+ /**
190
+ * The managed script. An MDM agent runs it as root with no `SUDO_UID`, so
191
+ * `enforce apply`'s default uid would be root's and the signed-in user's
192
+ * proxy would be denied egress. It passes the console user's uid instead:
193
+ * `stat -f %u /dev/console` on macOS (the console device belongs to the
194
+ * signed-in GUI user, or to root at the login window), and the user of
195
+ * seat0's active session via `loginctl` on Linux.
196
+ */
197
+ function firewallScript(cliBinaryPath) {
198
+ return [
199
+ '#!/bin/sh',
200
+ 'if [ "$(uname -s)" = Darwin ]; then',
201
+ ' uid=$(stat -f %u /dev/console)',
202
+ 'else',
203
+ ' uid=$(loginctl show-session "$(loginctl show-seat seat0 -p ActiveSession --value 2>/dev/null)" -p User --value 2>/dev/null)',
204
+ 'fi',
205
+ 'case "$uid" in',
206
+ ` ''|0|*[!0-9]*) exec ${shQuote(cliBinaryPath)} enforce apply ;;`,
207
+ ` *) exec ${shQuote(cliBinaryPath)} enforce apply --uid "$uid" ;;`,
208
+ 'esac',
209
+ '',
210
+ ].join('\n');
211
+ }
183
212
  /**
184
213
  * Shared body for the two firewall-deployment manifests below — same
185
214
  * `content`/`schedule`/`prerequisites`/`honesty` fields, only the
@@ -189,10 +218,11 @@ function buildFirewallManifestBody(params) {
189
218
  const suffix = params.workspaceName ? ` (${params.workspaceName})` : '';
190
219
  return {
191
220
  suffix,
192
- content: `${params.cliBinaryPath} enforce apply`,
221
+ content: firewallScript(params.cliBinaryPath),
193
222
  prerequisites: [
194
223
  `intutic CLI installed at ${params.cliBinaryPath} on the target machine`,
195
224
  'MDM agent executes the script with root (macOS/Linux) or administrator (Windows) privilege — `enforce apply` needs that to write firewall rules',
225
+ "The proxy runs as the user signed in at the console (`intutic start`, or the daemon `intutic daemon install --proxy` sets up). The script exempts that user's uid from the deny: the owner of /dev/console on macOS, the active seat0 session's user on Linux. With nobody signed in it exempts only root, and the next check-in after sign-in exempts the user.",
196
226
  ],
197
227
  honesty: 'This re-asserts the firewall on the configured cadence; a user with root/administrator access can still run `intutic enforce remove` and stay unenforced until the next check-in. It is not tamper-proof, it is tamper-resistant on a schedule.',
198
228
  };
@@ -230,7 +260,7 @@ export function generateIntuneFirewallManifest(params) {
230
260
  schedule: 'Daily platform script schedule, or trigger-on-checkin if the Intune script policy configuration supports it. Daily is the practical floor for a scripted policy run; tighten it if the Intune tenant supports more frequent check-ins.',
231
261
  prerequisites: body.prerequisites,
232
262
  deployment: {
233
- intune: "Deploy via a macOS Shell script (Devices > Scripts) with 'Run script using signed-in credentials' as needed for root context, and a policy schedule; on Windows this would need an equivalent scheduled task — note this manifest's shell command is macOS/Linux-oriented since `enforce apply` is a Rust CLI subcommand available cross-platform but the recurring-execution mechanism differs by OS, and Windows Task Scheduler wiring is left to the operator.",
263
+ intune: "Deploy via a macOS Shell script (Devices > Scripts) with 'Run script as signed-in user' set to No, so it runs as root, and a policy schedule; on Windows this would need an equivalent scheduled task — note this manifest's shell command is macOS/Linux-oriented since `enforce apply` is a Rust CLI subcommand available cross-platform but the recurring-execution mechanism differs by OS, and Windows Task Scheduler wiring is left to the operator.",
234
264
  },
235
265
  honesty: body.honesty,
236
266
  }, null, 2) + '\n';
@@ -1 +1 @@
1
- {"version":3,"file":"mdmManifest.js","sourceRoot":"","sources":["../../src/lib/mdmManifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mdmManifest.js","sourceRoot":"","sources":["../../src/lib/mdmManifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AAC9F,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AAEnH,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,GAAG;SACP,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC;SACR,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACxB,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,UAAU,GAAG,EAAE;IAC9C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA0B;IAC7D,MAAM,aAAa,GAAG,UAAU,EAAE,CAAC,WAAW,EAAE,CAAA;IAChD,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC,WAAW,EAAE,CAAA;IAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;IAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAElF,OAAO;;;;kBAIS,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;;;;;;;;;2CAWC,MAAM;;;;;;gBAMjC,aAAa;;;EAG3B,SAAS;;;;;qDAK0C,MAAM;;;;;;;;YAQ/C,YAAY;;;CAGvB,CAAA;AACD,CAAC;AAWD,SAAS,iBAAiB,CAAC,MAA2B;IACpD,IAAI,MAAM,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC,UAAU,CAAA;IAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAA;IACpD,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAA;AACzG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA2B;IAC9D,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,QAAQ,EAAE,yEAAyE;QACnF,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC;QACtC,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,cAAc,CAAC;QAChD,UAAU,EAAE;YACV,IAAI,EAAE,yGAAyG;SAChH;KACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAA;AACV,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CAAC,MAA2B;IAChE,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,QAAQ,EAAE,2EAA2E;QACrF,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC;QACtC,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,cAAc,CAAC;QAChD,UAAU,EAAE;YACV,MAAM,EAAE,2HAA2H;SACpI;KACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAA;AACV,CAAC;AAID,MAAM,UAAU,GAA8B;IAC5C,IAAI,EAAE,sEAAsE;IAC5E,MAAM,EAAE,wFAAwF;CACjG,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAyB;IACnE,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,sDAAsD,CAAA;IACxF,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,4CAA4C,CAAA;IAC7E,OAAO,+BAA+B,CAAA;AACxC,CAAC;AASD;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAA4B;IACpF,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,QAAQ,EAAE,4DAA4D,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,aAAa;QACxH,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,WAAW,EAAE,2BAA2B,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;QAC7E,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE;QACvF,UAAU,EAAE;YACV,CAAC,MAAM,CAAC,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,6JAA6J;SAC7L;KACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAA;AACV,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAAiB,EAAE,MAAiC;IAC9F,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,QAAQ,EAAE,qDAAqD,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,aAAa;QACjH,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,EAAE,yBAAyB,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;QACtF,UAAU,EAAE;YACV,CAAC,MAAM,CAAC,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,+CAA+C,qBAAqB,4IAA4I;SAChP;KACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAA;AACV,CAAC;AASD,yCAAyC;AACzC,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;AAC9C,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,cAAc,CAAC,aAAqB;IAC3C,OAAO;QACL,WAAW;QACX,qCAAqC;QACrC,kCAAkC;QAClC,MAAM;QACN,+HAA+H;QAC/H,IAAI;QACJ,gBAAgB;QAChB,yBAAyB,OAAO,CAAC,aAAa,CAAC,mBAAmB;QAClE,aAAa,OAAO,CAAC,aAAa,CAAC,gCAAgC;QACnE,MAAM;QACN,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,yBAAyB,CAAC,MAAgC;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IACvE,OAAO;QACL,MAAM;QACN,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC;QAC7C,aAAa,EAAE;YACb,4BAA4B,MAAM,CAAC,aAAa,wBAAwB;YACxE,iJAAiJ;YACjJ,kWAAkW;SACnW;QACD,OAAO,EACL,iPAAiP;KACpP,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAgC;IAC3E,MAAM,IAAI,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAC9C,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,QAAQ,EAAE,wEAAwE,IAAI,CAAC,MAAM,EAAE;QAC/F,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EACN,mPAAmP;QACrP,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,UAAU,EAAE;YACV,IAAI,EAAE,6NAA6N;SACpO;QACD,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAA;AACV,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,8BAA8B,CAAC,MAAgC;IAC7E,MAAM,IAAI,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAC9C,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,QAAQ,EAAE,0EAA0E,IAAI,CAAC,MAAM,EAAE;QACjG,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EACN,wOAAwO;QAC1O,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,UAAU,EAAE;YACV,MAAM,EACJ,4bAA4b;SAC/b;QACD,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAA;AACV,CAAC"}
@@ -8,6 +8,7 @@
8
8
  *
9
9
  * @module
10
10
  */
11
+ import * as node_os from 'node:os';
11
12
  /**
12
13
  * The version-pinned binary if present, else null. Version-specific on purpose:
13
14
  * a stale unversioned binary from an older CLI simply is not found, so the
@@ -16,4 +17,14 @@
16
17
  export declare function localProxyBinary(): string | null;
17
18
  /** The binary to spawn: the pinned one, or the PATH shim as a fallback. */
18
19
  export declare function resolveProxyBinary(): string;
20
+ /**
21
+ * What to add to a spawned proxy's environment so an `intutic exec --sandbox`
22
+ * container can reach it. The proxy listens on loopback unless
23
+ * `INTUTIC_PROXY_BIND` says otherwise. A container reaches it as
24
+ * `host.docker.internal`: Docker Desktop delivers that from the host's
25
+ * loopback, but Docker on Linux delivers it on the `docker0` bridge. So on
26
+ * Linux this adds the bridge's address, which this host's containers reach and
27
+ * the network does not. An `INTUTIC_PROXY_BIND` already set is left alone.
28
+ */
29
+ export declare function sandboxBindEnv(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, interfaces?: NodeJS.Dict<node_os.NetworkInterfaceInfo[]>): Record<string, string>;
19
30
  //# sourceMappingURL=proxyBinary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxyBinary.d.ts","sourceRoot":"","sources":["../../src/lib/proxyBinary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAIhD;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
1
+ {"version":3,"file":"proxyBinary.d.ts","sourceRoot":"","sources":["../../src/lib/proxyBinary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAMlC;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAIhD;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,UAAU,GAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAA+B,GACpF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxB"}
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import * as node_path from 'node:path';
12
12
  import * as node_fs from 'node:fs';
13
+ import * as node_os from 'node:os';
13
14
  import { createRequire } from 'node:module';
14
15
  import { getIntuticDir } from '../config/paths.js';
15
16
  const { version } = createRequire(import.meta.url)('../../package.json');
@@ -27,4 +28,19 @@ export function localProxyBinary() {
27
28
  export function resolveProxyBinary() {
28
29
  return localProxyBinary() ?? 'intutic-proxy';
29
30
  }
31
+ /**
32
+ * What to add to a spawned proxy's environment so an `intutic exec --sandbox`
33
+ * container can reach it. The proxy listens on loopback unless
34
+ * `INTUTIC_PROXY_BIND` says otherwise. A container reaches it as
35
+ * `host.docker.internal`: Docker Desktop delivers that from the host's
36
+ * loopback, but Docker on Linux delivers it on the `docker0` bridge. So on
37
+ * Linux this adds the bridge's address, which this host's containers reach and
38
+ * the network does not. An `INTUTIC_PROXY_BIND` already set is left alone.
39
+ */
40
+ export function sandboxBindEnv(env = process.env, platform = process.platform, interfaces = node_os.networkInterfaces()) {
41
+ if (env.INTUTIC_PROXY_BIND?.trim() || platform !== 'linux')
42
+ return {};
43
+ const bridge = interfaces.docker0?.find((a) => a.family === 'IPv4' && !a.internal);
44
+ return bridge ? { INTUTIC_PROXY_BIND: `127.0.0.1,${bridge.address}` } : {};
45
+ }
30
46
  //# sourceMappingURL=proxyBinary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxyBinary.js","sourceRoot":"","sources":["../../src/lib/proxyBinary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AACtC,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAwB,CAAA;AAE/F;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IACtD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,iBAAiB,OAAO,GAAG,GAAG,EAAE,CAAC,CAAA;IAC1F,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;AACzD,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,EAAE,IAAI,eAAe,CAAA;AAC9C,CAAC"}
1
+ {"version":3,"file":"proxyBinary.js","sourceRoot":"","sources":["../../src/lib/proxyBinary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AACtC,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAwB,CAAA;AAE/F;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IACtD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,iBAAiB,OAAO,GAAG,GAAG,EAAE,CAAC,CAAA;IAC1F,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;AACzD,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,EAAE,IAAI,eAAe,CAAA;AAC9C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAyB,OAAO,CAAC,GAAG,EACpC,WAA4B,OAAO,CAAC,QAAQ,EAC5C,aAA0D,OAAO,CAAC,iBAAiB,EAAE;IAErF,IAAI,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,CAAA;IACrE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IAClF,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,aAAa,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AAC5E,CAAC"}
@@ -12,10 +12,44 @@ export interface ParsedSopFile {
12
12
  * for a file `pull` never wrote (hand-authored, or pushed but not pulled).
13
13
  */
14
14
  contentHash: string | null;
15
+ /**
16
+ * From an `intutic_id:` key: the control-plane SOP this file was last
17
+ * pulled from or pushed to. `null` for a file never synced, which `sops
18
+ * push` creates as a new SOP.
19
+ */
20
+ intuticId: string | null;
21
+ /**
22
+ * From an `intutic_revision:` key: the SOP's `version_counter` when this
23
+ * file was last synced — the precondition `sops push` sends, so an edit
24
+ * made on the server since is refused rather than overwritten. Not the
25
+ * `version:` semver.
26
+ */
27
+ revision: number | null;
15
28
  /** Everything after the front-matter fence, or the whole trimmed input when there is none. */
16
29
  body: string;
17
30
  }
18
31
  export declare function parseSopFile(raw: string): ParsedSopFile;
32
+ /** The sync record `sops pull`/`push` keep in a file's front matter. */
33
+ export interface SopSyncRecord {
34
+ intuticId: string;
35
+ revision: number;
36
+ }
37
+ /**
38
+ * Set `key: value` lines inside a file's front-matter fence, replacing a line
39
+ * that already sets the key and keeping every other line — the enforcing keys
40
+ * the proxy reads (`deny_tools:`, `requires_before:`, …) included. The text
41
+ * after the fence is kept verbatim unless `body` is given. A file with no
42
+ * fence gets one holding only these keys. Unknown keys are inert to the
43
+ * proxy's parser, so the sync record never changes what a SOP enforces.
44
+ */
45
+ export declare function setFrontMatter(raw: string, fields: Record<string, string>, body?: string): string;
46
+ /**
47
+ * Record the SOP a file is synced with — `intutic_id:`, `intutic_revision:`
48
+ * and `content_hash:` (so `sops pull` treats the file as unedited) — keeping
49
+ * everything else in the file. Optional `extra` keys (a `version:` the server
50
+ * assigned) are set alongside.
51
+ */
52
+ export declare function withSyncRecord(raw: string, record: SopSyncRecord, extra?: Record<string, string>): string;
19
53
  /**
20
54
  * Render a pulled SOP back into a front-matter-carrying file, with
21
55
  * `content_hash:` recording `sha256(body)` at write time — the marker
@@ -28,6 +62,7 @@ export declare function renderSopFile(sop: {
28
62
  riskTier: string;
29
63
  version: string;
30
64
  body: string;
65
+ record?: SopSyncRecord;
31
66
  }): string;
32
67
  /** `Deploy Checklist` / `deploy checklist!!` → `deploy-checklist`. */
33
68
  export declare function slugifyTitle(title: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"sopFrontMatter.d.ts","sourceRoot":"","sources":["../../src/lib/sopFrontMatter.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;AAIhE,MAAM,WAAW,aAAa;IAC5B,kIAAkI;IAClI,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,uGAAuG;IACvG,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAA;IAC5B,iDAAiD;IACjD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB;;;;OAIG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,8FAA8F;IAC9F,IAAI,EAAE,MAAM,CAAA;CACb;AAaD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAkCvD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb,GAAG,MAAM,CAaT;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED,+FAA+F;AAC/F,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAcnD"}
1
+ {"version":3,"file":"sopFrontMatter.d.ts","sourceRoot":"","sources":["../../src/lib/sopFrontMatter.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;AAIhE,MAAM,WAAW,aAAa;IAC5B,kIAAkI;IAClI,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,uGAAuG;IACvG,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAA;IAC5B,iDAAiD;IACjD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB;;;;OAIG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,8FAA8F;IAC9F,IAAI,EAAE,MAAM,CAAA;CACb;AAaD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAoCvD;AAOD,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CA0BjG;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,MAAM,CAQ7G;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB,GAAG,MAAM,CAcT;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED,+FAA+F;AAC/F,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAcnD"}
@@ -56,9 +56,68 @@ export function parseSopFile(raw) {
56
56
  riskTier,
57
57
  version: scalar(front, 'version:'),
58
58
  contentHash: scalar(front, 'content_hash:'),
59
+ intuticId: scalar(front, 'intutic_id:'),
60
+ revision: parseRevision(scalar(front, 'intutic_revision:')),
59
61
  body,
60
62
  };
61
63
  }
64
+ function parseRevision(raw) {
65
+ if (raw === null || !/^\d+$/.test(raw))
66
+ return null;
67
+ return Number(raw);
68
+ }
69
+ /**
70
+ * Set `key: value` lines inside a file's front-matter fence, replacing a line
71
+ * that already sets the key and keeping every other line — the enforcing keys
72
+ * the proxy reads (`deny_tools:`, `requires_before:`, …) included. The text
73
+ * after the fence is kept verbatim unless `body` is given. A file with no
74
+ * fence gets one holding only these keys. Unknown keys are inert to the
75
+ * proxy's parser, so the sync record never changes what a SOP enforces.
76
+ */
77
+ export function setFrontMatter(raw, fields, body) {
78
+ const trimmed = raw.trimStart();
79
+ const set = (frontLines) => {
80
+ const out = [...frontLines];
81
+ for (const [key, value] of Object.entries(fields)) {
82
+ const line = `${key}: ${value}`;
83
+ const at = out.findIndex((l) => l.trim().startsWith(`${key}:`));
84
+ if (at === -1)
85
+ out.push(line);
86
+ else
87
+ out[at] = line;
88
+ }
89
+ return out;
90
+ };
91
+ if (trimmed.startsWith('---')) {
92
+ const rest = trimmed.slice(3);
93
+ const end = rest.indexOf('\n---');
94
+ if (end !== -1) {
95
+ // rest.slice(0, end) starts with the newline after the opening fence.
96
+ const frontLines = rest.slice(0, end).split('\n').slice(1);
97
+ const closing = rest.slice(end + 1);
98
+ const afterFence = closing.slice(3);
99
+ const tail = body === undefined ? afterFence : `\n\n${body}\n`;
100
+ return ['---', ...set(frontLines), '---'].join('\n') + tail;
101
+ }
102
+ }
103
+ const text = body ?? parseSopFile(raw).body;
104
+ return ['---', ...set([]), '---', '', text, ''].join('\n');
105
+ }
106
+ /**
107
+ * Record the SOP a file is synced with — `intutic_id:`, `intutic_revision:`
108
+ * and `content_hash:` (so `sops pull` treats the file as unedited) — keeping
109
+ * everything else in the file. Optional `extra` keys (a `version:` the server
110
+ * assigned) are set alongside.
111
+ */
112
+ export function withSyncRecord(raw, record, extra = {}) {
113
+ const hash = createHash('sha256').update(parseSopFile(raw).body, 'utf8').digest('hex');
114
+ return setFrontMatter(raw, {
115
+ ...extra,
116
+ content_hash: hash,
117
+ intutic_id: record.intuticId,
118
+ intutic_revision: String(record.revision),
119
+ });
120
+ }
62
121
  /**
63
122
  * Render a pulled SOP back into a front-matter-carrying file, with
64
123
  * `content_hash:` recording `sha256(body)` at write time — the marker
@@ -74,6 +133,7 @@ export function renderSopFile(sop) {
74
133
  `risk_tier: ${sop.riskTier}`,
75
134
  `version: ${sop.version}`,
76
135
  `content_hash: ${hash}`,
136
+ ...(sop.record ? [`intutic_id: ${sop.record.intuticId}`, `intutic_revision: ${sop.record.revision}`] : []),
77
137
  '---',
78
138
  '',
79
139
  sop.body,
@@ -1 +1 @@
1
- {"version":3,"file":"sopFrontMatter.js","sourceRoot":"","sources":["../../src/lib/sopFrontMatter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sopFrontMatter.js","sourceRoot":"","sources":["../../src/lib/sopFrontMatter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intutic/cli",
3
- "version": "2.5.0",
3
+ "version": "2.5.1",
4
4
  "description": "Intutic CLI — sync daemon, harness detection, and workspace management",
5
5
  "type": "module",
6
6
  "bin": {
@@ -40,10 +40,10 @@
40
40
  "ioredis": "^5.11.1",
41
41
  "picocolors": "^1",
42
42
  "yaml": "^2.9.0",
43
- "@intutic/shared-types": "2.5.0",
44
- "@intutic/id": "2.5.0",
45
- "@intutic/sync-daemon": "2.5.0",
46
- "@intutic/logger": "2.5.0"
43
+ "@intutic/shared-types": "2.5.1",
44
+ "@intutic/id": "2.5.1",
45
+ "@intutic/sync-daemon": "2.5.1",
46
+ "@intutic/logger": "2.5.1"
47
47
  },
48
48
  "devDependencies": {
49
49
  "typescript": "^5.5",
@@ -45,6 +45,13 @@ while [ "$#" -gt 0 ]; do
45
45
  esac
46
46
  done
47
47
  [ -n "$KERNEL" ] && [ -n "$ROOTFS" ] || { echo "firecracker-launch: --kernel and --rootfs are required" >&2; exit 2; }
48
+ # The agent runs in the guest over ssh, so without the guest key nothing would
49
+ # run. Refuse before touching the host, rather than boot the VM and exit 0.
50
+ if [ -z "$GUEST_KEY" ]; then
51
+ echo "firecracker-launch: INTUTIC_FC_GUEST_KEY is not set. It must be the path to the private ssh key the rootfs's sshd accepts for root; the agent runs in the guest over ssh." >&2
52
+ exit 2
53
+ fi
54
+ [ -r "$GUEST_KEY" ] || { echo "firecracker-launch: INTUTIC_FC_GUEST_KEY ($GUEST_KEY) is not a readable file" >&2; exit 2; }
48
55
 
49
56
  NFT="$(command -v nft || echo /usr/sbin/nft)"
50
57
  SOCK="$(mktemp -u /tmp/intutic-fc-XXXX.sock)"
@@ -104,13 +111,7 @@ api "machine-config" "{\"vcpu_count\":${VCPUS},\"mem_size_mib\":${MEM}}"
104
111
  api "actions" '{"action_type":"InstanceStart"}'
105
112
 
106
113
  # Wait for the guest to reach sshd, then run the agent command inside it. This
107
- # requires an sshd-enabled rootfs and INTUTIC_FC_GUEST_KEY (the guest ssh key).
108
- if [ -z "$GUEST_KEY" ]; then
109
- echo "firecracker-launch: microVM booted. Set INTUTIC_FC_GUEST_KEY to run the agent in-guest over ssh." >&2
110
- echo " guest console: $CONSOLE" >&2
111
- sleep 3
112
- exit 0
113
- fi
114
+ # requires an sshd-enabled rootfs and INTUTIC_FC_GUEST_KEY (checked above).
114
115
  SSH="ssh -i ${GUEST_KEY} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=8"
115
116
  for _ in $(seq 1 20); do
116
117
  if $SSH "root@${GUEST_IP}" true 2>/dev/null; then break; fi