chainlesschain 0.166.88 → 0.166.89

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 (167) hide show
  1. package/README.md +16 -13
  2. package/package.json +1 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-QzeGep9J.js → AIOps-C8AkN9R5.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-Dfc5bx7S.js → ActionButton-BrAzSQor.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-tn-_ZG2E.js → Analytics-Cu56X8Oh.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-Deg3WAK8.js → AppLayout-BP1Riofl.js} +4 -4
  9. package/src/assets/web-panel/assets/{Artifacts-KU05t0a6.js → Artifacts-CIW-nNAz.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-CkSZf54T.js → Audit-CJtDabk-.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-i7ivfXF0.js → BackgroundAgents-DYIHeQ_P.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-QcVUKtf0.js → Backup-B4CsFzj7.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-B3h5ZJ0g.js → BaseInput-3eoJ5kfb.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-D7AVz0xi.js → Chat-BBhX2L_E.js} +5 -5
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-RN8cbv7w.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-H0p0TMlD.js → Checkbox-5UvmwHVk.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-B6HOmAY3.js → Codegen-BFy8zsBN.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-n_64Fog2.js → Col-4M6bKRRO.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-CX0JGgj0.js → Community-D6LC0j7_.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-C4JWUZlx.js → Compact-Dd48xMcv.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-DKyTZakB.js → Compliance-Ba85ggmy.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-C0joBMci.js → Cowork-D1BXlkuK.js} +3 -3
  23. package/src/assets/web-panel/assets/{Cron-D6VkYpxK.js → Cron-Ca2Uy7Ia.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-7b6Uu8jc.js → Crosschain-C2bDRXZg.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-C8YPKqzY.js → DID-DySZKAJf.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-DJsOiEry.js → Dashboard-DDpYf-TT.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-CyStFY-4.js → Dropdown-DGjROfPv.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-COrIx2Rg.js → EmailListRenderer-DxX9QYiB.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-DpxORusH.js → EvolutionSettings-TBCZyrSJ.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-5BYZdMG0.js → FamilyGuardDashboard-BeqwTXBa.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-s1kS0ekU.js → Federation-CiCpKJQ1.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-CmgoH9HV.js → FormItemContext-CdTmbLkU.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DSRWrvcL.js → GenericCardRenderer-BwbkEY-5.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-Cz3EgnS1.js → Git-VnAga2vv.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-De4atTe7.js → Governance-i-4Ebs-H.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DoitBBxJ.js → Inference-CirjTgNw.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-CIdmJ1pH.js → KnowledgeGraph-CunS7vhA.js} +1 -1
  38. package/src/assets/web-panel/assets/Logs-DBuTF0c6.js +2 -0
  39. package/src/assets/web-panel/assets/MarkdownRenderer-B-iE-tt_.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-C6kbAQoM.js → Marketplace-BK6ZivTS.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-C2TZn8D-.js → McpTools-CUnCRnd3.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-DYdEKDuB.js → Memory-CBGGr8Gy.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-pKLeVviZ.js → MobileBridge-reB6iaWD.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-o1YdVB7i.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-IEoVRV29.js → Mtc-if5OE3GH.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-Cov-yYTY.js → MtcAudit-BTZWpq0j.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig--Jr7OCmp.js → Multisig-8cvMAYFL.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-D2gXnYAA.js → NLProgramming-BMvUXAWo.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-hk8pMyve.js → Notes-BWWjColh.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-D26Nc7MU.js → NotificationSettings-Ccr4lIhS.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-DmzHMEOa.js → OrderTableRenderer-DhksGy6D.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-Cn-o6mHT.js → Organization-DciXQfdY.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-DP6xpDak.js → Overflow-8DR7uMSx.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-C9WAjG-I.js → P2P-DE6euHYl.js} +2 -2
  55. package/src/assets/web-panel/assets/PdhVaultBrowser-ByuWoauq.js +7 -0
  56. package/src/assets/web-panel/assets/{Permissions-BFBN4-IL.js → Permissions-DkjM87ac.js} +3 -3
  57. package/src/assets/web-panel/assets/{PersonalDataHub-BEDvoAiz.js → PersonalDataHub-2DLp0KTL.js} +3 -3
  58. package/src/assets/web-panel/assets/{Pipeline-Co2Ze_rR.js → Pipeline-Ci2Qlkfr.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-BOTn1EId.js → Privacy-DlwDnDVA.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-CObyrZYm.js → ProjectInit-CmMifW39.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-DVTN31rd.js → ProjectSettings-DJVFIh-6.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-DQSEaVjE.js → Projects-P2nWBS70.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-BRIKWIdQ.js → Providers-B2cxaGCU.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-3nxaEXxN.js → QrScannerModal-CpO77kcE.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-iwZJEE9z.js → QuickAsk-BDQl1hb0.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-D2_EEbvc.js → Recommend-DTD2f3IN.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-S4w2mUfq.js → RemoteSession-DGZAnwvs.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-CstUvfTC.js → Reputation-B_R4vitb.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-DEGHFpxz.js → Row-4Jj6JyXN.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-DGdZtJQl.js → RssFeed-D1t1MCZ-.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-DhfXi99U.js → Search-CyOUlIn7.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-BbzISrgX.js → Security-BmknPT5Q.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-CFjP2sQ3.js → Services-DkEK8mpa.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-CFn5wbvm.js → Skeleton-Bvo5bpuk.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-fVbT8RcW.js → Skills-AMmG8fim.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-D6OtC0MT.js → Sla-Dl7-OKOV.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-D0kteBjU.js → SpeechSettings-DtiGKu0E.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-BGEWCtPh.js → SyncSettings-Ch7mp3ES.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-B1xZUG4D.js → Tasks-Ck-sEgj-.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-COlorjqb.js → Templates-BlV22Il8.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-yLkwfuo3.js → Tenant-CaaAu0mX.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-CAmkq1wf.js → Terminal-lA9g3FtJ.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-CcKYq1Ue.js → TimelineRenderer-CG26IFC3.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-9hIqn_LE.js → Tokens-iaJUBLBm.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-Dsdkb74C.js → Trigger-DWQJtLK3.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-DC4GuE3C.js → Trust-CTjmUwqp.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CSlh00wf.js → UkeySign-CMnxufgD.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-QEWLo3QY.js → VideoEditing-diCFSWJw.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-BkPNQgmg.js → Wallet-Ba1oND1K.js} +3 -3
  90. package/src/assets/web-panel/assets/{WebAuthn-7---jCBl.js → WebAuthn-DZDqPS-S.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-Dq6Yiu8E.js → WorkflowEditor-CfN8fPMe.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CTYIMpWD.js → chat-BiqMsO_i.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-C8JtYlDN.js → colors-By8LkjqH.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-spXpnsNC.js → compact-item-B0mxvRe3.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-D04ewPuL.js → createContext-Li2ub348.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-D90arbUg.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-DZblOKXx.js → hasIn-DYbHPkbl.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-KIoJ2eCK.js → index-1lVoRUrQ.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-Bm0z1M6s.js → index-B0D0HkkM.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Bw-3CtK2.js → index-BFhksbXp.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-B7RA974g.js → index-BRzewWeE.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DwIEfKo7.js → index-BSk0xuXP.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DcjouIsi.js → index-BZqTG7fP.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-COvZnoIg.js → index-Bc6bxU24.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-rVEqWa0_.js → index-BcOJEgBE.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-EM4_wLPi.js → index-Bd5znvCV.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BSO33_O2.js → index-Bm2P2Kgp.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DLUHbPl3.js → index-ByqFKMWL.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Dcd-qZ68.js → index-C-RE3mFh.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DSoyEHi2.js → index-C5Se6Lnv.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Cz0gkRz_.js → index-CA0AOURT.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Dssnz_1x.js → index-CEp_3fKJ.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-rU6_An6N.js → index-CGZzexNa.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CE3TYhl0.js → index-CHgiSV6R.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CLkua5sJ.js → index-CMh3VxgO.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DHOV24VR.js → index-CTVPeUh3.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-B-cKXztT.js → index-CVZNYRzM.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DtSzmzFF.js → index-CYv3JIzl.js} +1 -1
  119. package/src/assets/web-panel/assets/index-CeP1oROI.js +1 -0
  120. package/src/assets/web-panel/assets/{index-749P1pkM.js → index-CgyrklzQ.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BOuUUW2U.js → index-ClsJN8sW.js} +3 -3
  122. package/src/assets/web-panel/assets/{index-CHtwoTKX.js → index-Cpfn4YbT.js} +1 -1
  123. package/src/assets/web-panel/assets/index-Cu9gkyRc.js +1 -0
  124. package/src/assets/web-panel/assets/{index-BKfR2eSQ.js → index-Czt7WAtA.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-B57W1RB6.js → index-D6qL3QBU.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BLv-KSGc.js → index-DAOpBv3C.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-D_Md0Jhp.js → index-DB4DCzqU.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BjMY3Y_L.js → index-DIImi0cd.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Cgztj1JO.js → index-DPRgnazi.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Cfk4o9eI.js → index-DgMFnBOv.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-B_65aY6c.js → index-KWt8Owo8.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-IFEbaISP.js → index-KqfqSdAC.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DdC0OsNh.js → index-b4O_YBVR.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DruABY-g.js → index-beDji-cB.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CZmBlh5P.js → index-hw3sCYAz.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-Mxj-qi1G.js → index-zSzXsF9b.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-Dl0wiMxn.js → initDefaultProps-TgDL_7OY.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BFmZYrGO.js → motion-fHosyV5c.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-Cjs64yWq.js → move-C_QfW5qg.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-NeQsnBuP.js → mtc-parser-u7ywDVOg.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-4Rs-rfs9.js → omit-BEJdUgE9.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-CUhx2rDY.js → pickAttrs-DGkQFAJ5.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DbIM_OB2.js → placementArrow-DUyZXAjt.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-B_TGx9AN.js → responsiveObserve-B4xDxO7Q.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-C46cEP5t.js → slide-B8WuJtst.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-DqeksICX.js → statusUtils-DLUqy7JO.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-2rrypo5u.js → styleChecker-BYOJOyqL.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-RRe1Edsg.js → useFlexGapSupport-WChWQURv.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-CB0oxU1U.js → useFs-vLNpm3dv.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-B98WdlUE.js → usePersonalDataHub-DSZ8unoU.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-CY8AoD95.js → vnode-C4Xf7Kg1.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-BnT-0MbP.js → zoom-BulmeAGy.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/agent-controlled-host.js +220 -0
  156. package/src/commands/agent.js +3 -1
  157. package/src/data/changelog.json +13 -0
  158. package/src/lib/eval/verify01-execution.js +9 -0
  159. package/src/lib/eval/verify01-host-capture.js +430 -0
  160. package/src/assets/web-panel/assets/ChatBubbleRenderer-B0-euPW7.js +0 -1
  161. package/src/assets/web-panel/assets/Logs-Coa_qNhU.js +0 -2
  162. package/src/assets/web-panel/assets/MarkdownRenderer-CeT_RocE.js +0 -1
  163. package/src/assets/web-panel/assets/MobileProjects-D4bWcHA_.js +0 -1
  164. package/src/assets/web-panel/assets/PdhVaultBrowser-DxZb0Ux8.js +0 -7
  165. package/src/assets/web-panel/assets/devWarning-3-s4adfp.js +0 -1
  166. package/src/assets/web-panel/assets/index-ZMf_BGlO.js +0 -1
  167. package/src/assets/web-panel/assets/index-jvp8bJBF.js +0 -1
@@ -0,0 +1,220 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import {
5
+ normalizeAgentSandbox,
6
+ assertSandboxCapabilities,
7
+ assertSandboxAvailable,
8
+ } from "../lib/agent-sandbox.js";
9
+ import { isFormalQualityHermeticRuntime } from "../lib/formal-quality-eval-runtime.js";
10
+ import { resolveCredentialEnvironmentValue } from "../lib/process-execution-broker/credential-transport.js";
11
+
12
+ const MAX_JSON_BYTES = 1024 * 1024;
13
+
14
+ function invalid(message, code = "CC_CONTROLLED_HOST_INVALID") {
15
+ return Object.assign(new Error(message), { code });
16
+ }
17
+
18
+ /** Read one bounded regular file through its opened identity, never create it. */
19
+ function readJson(file) {
20
+ if (typeof file !== "string" || !path.isAbsolute(file))
21
+ throw invalid("Controlled-host JSON paths must be absolute");
22
+ const before = fs.lstatSync(file, { bigint: true });
23
+ if (!before.isFile() || before.isSymbolicLink())
24
+ throw invalid("Controlled-host JSON must be a regular non-symlink file");
25
+ const fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
26
+ try {
27
+ const opened = fs.fstatSync(fd, { bigint: true });
28
+ if (
29
+ !opened.isFile() ||
30
+ opened.dev !== before.dev ||
31
+ opened.ino !== before.ino ||
32
+ opened.size < 1n ||
33
+ opened.size > BigInt(MAX_JSON_BYTES)
34
+ )
35
+ throw invalid("Controlled-host JSON identity or size is invalid");
36
+ const bytes = Buffer.alloc(Number(opened.size) + 1);
37
+ let size = 0;
38
+ while (size < bytes.length) {
39
+ const read = fs.readSync(fd, bytes, size, bytes.length - size, null);
40
+ if (!read) break;
41
+ size += read;
42
+ }
43
+ const after = fs.fstatSync(fd, { bigint: true });
44
+ if (
45
+ BigInt(size) !== opened.size ||
46
+ after.size !== opened.size ||
47
+ after.mtimeNs !== opened.mtimeNs ||
48
+ after.ctimeNs !== opened.ctimeNs
49
+ )
50
+ throw invalid("Controlled-host JSON changed while reading");
51
+ const value = JSON.parse(
52
+ new TextDecoder("utf-8", { fatal: true }).decode(bytes.subarray(0, size)),
53
+ );
54
+ if (!value || typeof value !== "object" || Array.isArray(value))
55
+ throw invalid("Controlled-host JSON must contain an object");
56
+ return value;
57
+ } finally {
58
+ fs.closeSync(fd);
59
+ }
60
+ }
61
+
62
+ /** Explicit one-shot entry. Provisioning is deliberately not available here. */
63
+ export async function runControlledHost(options, dependencies = {}) {
64
+ const platform = dependencies.platform ?? process.platform;
65
+ if (platform !== "linux")
66
+ throw invalid(
67
+ "Controlled-host permission authority requires Linux",
68
+ "CC_SETTINGS_AUTHORITY_PLATFORM_UNSUPPORTED",
69
+ );
70
+ const env = dependencies.env ?? process.env;
71
+ if (isFormalQualityHermeticRuntime(env))
72
+ throw invalid(
73
+ "Controlled-host authority cannot run in a hermetic evaluator that suppresses permission providers",
74
+ );
75
+ if (!/^[a-zA-Z0-9._:-]{1,128}$/.test(options.context || ""))
76
+ throw invalid("An explicit controlled-host context is required");
77
+ if (
78
+ (options.check === true) ===
79
+ (typeof options.prompt === "string" && options.prompt.trim().length > 0)
80
+ )
81
+ throw invalid("Choose exactly one of --check or a non-empty --prompt");
82
+ if (
83
+ !options.check &&
84
+ ["provider", "model", "baseUrl"].some(
85
+ (key) => typeof options[key] !== "string" || !options[key].trim(),
86
+ )
87
+ )
88
+ throw invalid("A run requires explicit --provider, --model and --base-url");
89
+ const maxTurns =
90
+ options.maxTurns === undefined ? 10 : Number(options.maxTurns);
91
+ if (!Number.isSafeInteger(maxTurns) || maxTurns < 1 || maxTurns > 100)
92
+ throw invalid("--max-turns must be an integer from 1 to 100");
93
+ if (!["text", "json", "stream-json"].includes(options.outputFormat || "text"))
94
+ throw invalid("--output-format must be text, json or stream-json");
95
+ const cwd = dependencies.cwd ?? process.cwd();
96
+ const launch = readJson(options.launch);
97
+ const settings = readJson(options.sandboxSettings);
98
+ if (settings.engine !== "docker-egress" || settings.enabled === false)
99
+ throw invalid(
100
+ "Controlled-host entry requires enabled docker-egress sandbox settings",
101
+ );
102
+ const sandbox = normalizeAgentSandbox(true, { cwd, settings, network: true });
103
+ assertSandboxCapabilities(sandbox, {
104
+ host: { platform, arch: process.arch, release: os.release() },
105
+ });
106
+ const open =
107
+ dependencies.openHost ??
108
+ (await import("../runtime/permission-authority-host.js"))
109
+ .openPermissionAuthorityHost;
110
+ const host = open({ launch, contextId: options.context, env });
111
+ try {
112
+ // Reopening never provisions; runtimeOptions checks the actual invocation
113
+ // workspace and rejects writable roots overlapping the fixed authority.
114
+ host.runtimeOptions({ cwd, sandbox });
115
+ if (options.check) {
116
+ const capabilities = host.capabilities(sandbox);
117
+ const report = {
118
+ schema: "chainlesschain.controlled-host-check/v1",
119
+ authorityIdentityVerified: true,
120
+ backendExecutionVerified: false,
121
+ backendAvailabilityProbed: false,
122
+ capabilities,
123
+ };
124
+ (dependencies.writeOut ?? ((text) => process.stdout.write(text)))(
125
+ JSON.stringify(report) + "\n",
126
+ );
127
+ return { exitCode: 0, report };
128
+ }
129
+ // Availability is checked before resolving credentials or calling a model.
130
+ (dependencies.assertAvailable ?? assertSandboxAvailable)(sandbox);
131
+ let apiKey;
132
+ if (options.apiKeyEnv) {
133
+ apiKey = await resolveCredentialEnvironmentValue(options.apiKeyEnv, {
134
+ env,
135
+ });
136
+ if (!apiKey)
137
+ throw invalid("The selected API key environment source is unavailable");
138
+ }
139
+ return await host.runHeadless(
140
+ {
141
+ cwd,
142
+ sandbox,
143
+ prompt: options.prompt,
144
+ provider: options.provider,
145
+ model: options.model,
146
+ baseUrl: options.baseUrl,
147
+ apiKey,
148
+ maxTurns,
149
+ outputFormat: options.outputFormat || "text",
150
+ permissionMode: "dontAsk",
151
+ useRegisteredMcp: false,
152
+ strictMcpConfig: true,
153
+ ide: false,
154
+ pdh: false,
155
+ jetbrains: false,
156
+ slashMacros: false,
157
+ expandFileRefs: false,
158
+ },
159
+ dependencies.runtimeDependencies,
160
+ );
161
+ } finally {
162
+ host.close();
163
+ }
164
+ }
165
+
166
+ export function registerControlledHostCommand(agent, dependencies = {}) {
167
+ agent
168
+ .command("controlled-host")
169
+ .description(
170
+ "Run against a pre-provisioned Linux permission authority (one-shot, dontAsk)",
171
+ )
172
+ .requiredOption(
173
+ "--launch <file>",
174
+ "Absolute pre-provisioned launch descriptor JSON",
175
+ )
176
+ .requiredOption("--context <id>", "Exact provisioned workspace context ID")
177
+ .requiredOption(
178
+ "--sandbox-settings <file>",
179
+ "Absolute docker-egress sandbox settings JSON",
180
+ )
181
+ .option(
182
+ "--check",
183
+ "Verify configuration and authority identity only; no backend or model execution",
184
+ )
185
+ .option(
186
+ "--prompt <text>",
187
+ "Run one headless task in the bound current workspace",
188
+ )
189
+ .option("--provider <name>", "Explicit model provider")
190
+ .option("--model <name>", "Explicit model name")
191
+ .option("--base-url <url>", "Explicit provider endpoint")
192
+ .option(
193
+ "--api-key-env <name>",
194
+ "Credential environment variable or broker reference",
195
+ )
196
+ .option("--max-turns <n>", "Maximum task turns, 1-100", "10")
197
+ .option("--output-format <format>", "text | json | stream-json", "text")
198
+ .action(async (options, command) => {
199
+ try {
200
+ // Parent agent flags are a different launch contract. Never silently
201
+ // ignore a supplied --yolo, --bg, --settings or model override there.
202
+ if (
203
+ agent.options.some(
204
+ (option) =>
205
+ agent.getOptionValueSource(option.attributeName()) === "cli",
206
+ )
207
+ )
208
+ throw invalid(
209
+ "Place only controlled-host options after the subcommand; parent agent flags are unsupported",
210
+ );
211
+ const outcome = await runControlledHost(command.opts(), dependencies);
212
+ process.exitCode = outcome.exitCode;
213
+ } catch (error) {
214
+ process.stderr.write(
215
+ `${error.code || "CC_CONTROLLED_HOST_FAILED"}: ${error.message}\n`,
216
+ );
217
+ process.exitCode = 1;
218
+ }
219
+ });
220
+ }
@@ -46,6 +46,7 @@ import {
46
46
  isFormalQualityHermeticRuntime,
47
47
  } from "../lib/formal-quality-eval-runtime.js";
48
48
  import { withQuietStdout } from "../runtime/quiet-stdout.js";
49
+ import { registerControlledHostCommand } from "./agent-controlled-host.js";
49
50
  import { resolveCredentialEnvironmentValue } from "../lib/process-execution-broker/credential-transport.js";
50
51
  import {
51
52
  captureClaudeStorageLaunchEnvironment,
@@ -290,7 +291,7 @@ export function registerAgentCommand(program, dependencies = {}) {
290
291
  : captureSkillRetrievalRevocationReader(
291
292
  dependencies.skillRetrievalRevocationReader,
292
293
  );
293
- program
294
+ const agent = program
294
295
  .command("agent")
295
296
  .aliases(["a", "exec"])
296
297
  .description(
@@ -2259,6 +2260,7 @@ export function registerAgentCommand(program, dependencies = {}) {
2259
2260
  // Interactive session ended (REPL closed) — settle the worktree.
2260
2261
  await _finishWorktree();
2261
2262
  });
2263
+ registerControlledHostCommand(agent, dependencies.controlledHost);
2262
2264
  }
2263
2265
 
2264
2266
  export function registerSubAgentV2Command(program) {
@@ -1,6 +1,19 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.89",
7
+ "cliVersions": ["0.166.89"],
8
+ "date": null,
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Added - cc CLI 0.166.89: IDE capture journeys and controlled Linux entry",
13
+ "body": "- Prepare and finish frozen IDE tasks with byte-pinned baselines, complete diffs,\n a shared deadline and real protocol/UI evidence from both IDE hosts.\n- Add explicit `agent controlled-host` for pre-provisioned Linux permission domains;\n configuration checks do not claim backend execution or provision new authority.\n- Pair VS Code `0.37.134` and JetBrains `0.4.152` with CLI `0.166.89` for\n opt-in panel capture, deterministic initial/restart diagnostics and retained\n process-cleanup evidence. Add official MCP stdio interoperability checks."
14
+ }
15
+ ]
16
+ },
4
17
  {
5
18
  "productVersion": null,
6
19
  "cliVersion": "0.166.88",
@@ -19,6 +19,15 @@ export const VERIFY01_SUITES = [
19
19
  const MAX_SNAPSHOT_BYTES = 512 * 1024 * 1024;
20
20
  const MAX_DIFF_BYTES = 32 * 1024 * 1024;
21
21
 
22
+ // Host drivers use the same checkout, complete scan, dependency boundary and
23
+ // pinned evaluator processes as the CLI executor; no second diff contract.
24
+ export {
25
+ materializeCheckout as materializeVerify01Checkout,
26
+ snapshot as snapshotVerify01Workspace,
27
+ diff as diffVerify01Workspace,
28
+ reviewedProcess as runVerify01ReviewedProcess,
29
+ };
30
+
22
31
  function git(directory, args, options = {}) {
23
32
  return executionBroker.execFileSync("git", ["-C", directory, ...args], {
24
33
  encoding: "utf8",