chainlesschain 0.166.76 → 0.166.78

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 (230) hide show
  1. package/README.md +19 -8
  2. package/completions/_cc +1 -1
  3. package/completions/cc.bash +1 -1
  4. package/completions/cc.fish +1 -1
  5. package/completions/cc.ps1 +1 -1
  6. package/package.json +1 -1
  7. package/src/assets/linux-subreaper/linux-arm64/manifest.json +10 -0
  8. package/src/assets/linux-subreaper/linux-arm64/supervisor +0 -0
  9. package/src/assets/linux-subreaper/linux-x64/manifest.json +10 -0
  10. package/src/assets/linux-subreaper/linux-x64/supervisor +0 -0
  11. package/src/assets/web-panel/assets/{AIOps-CNaejClV.js → AIOps-DSyZEY2G.js} +1 -1
  12. package/src/assets/web-panel/assets/{ActionButton-CF_CVKT_.js → ActionButton-DhNyZ577.js} +1 -1
  13. package/src/assets/web-panel/assets/{Analytics-a3Z6J7gv.js → Analytics-HMMpxmyi.js} +3 -3
  14. package/src/assets/web-panel/assets/{AppLayout-BFtWEnct.js → AppLayout-CwKMM5Ie.js} +5 -5
  15. package/src/assets/web-panel/assets/{Artifacts-BQ8oeMvX.js → Artifacts-CNzDmph7.js} +1 -1
  16. package/src/assets/web-panel/assets/{Audit-NOo9bmgk.js → Audit-DxWpUW3V.js} +1 -1
  17. package/src/assets/web-panel/assets/{BackgroundAgents-QRc7F3Tp.js → BackgroundAgents-C1R2ST-P.js} +1 -1
  18. package/src/assets/web-panel/assets/{Backup-UlVgLn2P.js → Backup-B6biTaEV.js} +1 -1
  19. package/src/assets/web-panel/assets/{BaseInput-BER9LJAr.js → BaseInput-CVnkD2Z5.js} +1 -1
  20. package/src/assets/web-panel/assets/{Chat-Z8z2Fdfz.js → Chat-Dbewl4Je.js} +6 -6
  21. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DdmuBrdQ.js → ChatBubbleRenderer-DVZ6SwC5.js} +1 -1
  22. package/src/assets/web-panel/assets/{Checkbox-CXPgyB8L.js → Checkbox-BqqiF1JE.js} +1 -1
  23. package/src/assets/web-panel/assets/{Codegen-D1vOsLJ7.js → Codegen-BVMkGumc.js} +1 -1
  24. package/src/assets/web-panel/assets/{Col-ucLnUJC7.js → Col-DmiRHy96.js} +1 -1
  25. package/src/assets/web-panel/assets/{Community-COsV9n9t.js → Community-BDlpygqA.js} +1 -1
  26. package/src/assets/web-panel/assets/{Compact-D0EkBEYh.js → Compact-B2NME_m-.js} +1 -1
  27. package/src/assets/web-panel/assets/{Compliance-C8w9SUjt.js → Compliance-BlzDLE-R.js} +1 -1
  28. package/src/assets/web-panel/assets/{Cowork-CmVaKEJS.js → Cowork-C8raPybB.js} +3 -3
  29. package/src/assets/web-panel/assets/{Cron-B_FiMMV2.js → Cron-DA8Py0zP.js} +2 -2
  30. package/src/assets/web-panel/assets/{Crosschain-ByO3YL8N.js → Crosschain-DU2XyHqB.js} +1 -1
  31. package/src/assets/web-panel/assets/{DID-DwpsLM9r.js → DID-Df098fT_.js} +2 -2
  32. package/src/assets/web-panel/assets/{Dashboard-B_8IUvM_.js → Dashboard-D1rT702x.js} +2 -2
  33. package/src/assets/web-panel/assets/{Dropdown-Bo6WQkuX.js → Dropdown-BweXGo1O.js} +1 -1
  34. package/src/assets/web-panel/assets/{EmailListRenderer-C9LiQesx.js → EmailListRenderer-B9ShbgJH.js} +1 -1
  35. package/src/assets/web-panel/assets/EvolutionSettings-D75_iBoc.js +1 -0
  36. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dst6VUnO.js → FamilyGuardDashboard-DrznZFVs.js} +1 -1
  37. package/src/assets/web-panel/assets/{Federation-Ci7CoLkJ.js → Federation-DQZ2adIA.js} +1 -1
  38. package/src/assets/web-panel/assets/{FormItemContext-bdDyUhUM.js → FormItemContext-DN30Dowh.js} +1 -1
  39. package/src/assets/web-panel/assets/{GenericCardRenderer-CrRwOUVi.js → GenericCardRenderer-DRdt0j1e.js} +1 -1
  40. package/src/assets/web-panel/assets/{Git-Dis8h-Z-.js → Git-wwRgStzk.js} +2 -2
  41. package/src/assets/web-panel/assets/{Governance-DX7OH5w2.js → Governance-CI4Uw0Nh.js} +1 -1
  42. package/src/assets/web-panel/assets/{Inference-Cavv_Q_Z.js → Inference-5TuE2AJI.js} +1 -1
  43. package/src/assets/web-panel/assets/{KnowledgeGraph-Cck8tnZn.js → KnowledgeGraph-oXyvmFSR.js} +1 -1
  44. package/src/assets/web-panel/assets/{Logs-BQt3aGMu.js → Logs-ewudSWuv.js} +2 -2
  45. package/src/assets/web-panel/assets/MarkdownRenderer-Cz5nyufm.js +1 -0
  46. package/src/assets/web-panel/assets/{Marketplace-CdmAKNSN.js → Marketplace-DcZeWFrs.js} +1 -1
  47. package/src/assets/web-panel/assets/{McpTools-BUlJdyPY.js → McpTools-BcV9p1RS.js} +3 -3
  48. package/src/assets/web-panel/assets/{Memory-DQRTQDr-.js → Memory-CMhYvugt.js} +2 -2
  49. package/src/assets/web-panel/assets/{MobileBridge-C0dnxgsl.js → MobileBridge-5RP2uwvT.js} +1 -1
  50. package/src/assets/web-panel/assets/{MobileProjects-DQ5Gy7fa.js → MobileProjects-BIuM9Ze4.js} +1 -1
  51. package/src/assets/web-panel/assets/{Mtc-Xl7u2isS.js → Mtc-DmBszTDe.js} +5 -5
  52. package/src/assets/web-panel/assets/{MtcAudit-C3KX0574.js → MtcAudit-Czdp5ZGt.js} +2 -2
  53. package/src/assets/web-panel/assets/{Multisig-CHEhfkn8.js → Multisig-DRWUuNr-.js} +3 -3
  54. package/src/assets/web-panel/assets/{NLProgramming-Ce38mH-8.js → NLProgramming-IRQQN0-c.js} +1 -1
  55. package/src/assets/web-panel/assets/{Notes-C7nuTd7c.js → Notes-CGhD1lW9.js} +4 -4
  56. package/src/assets/web-panel/assets/{NotificationSettings-BcoEcyq8.js → NotificationSettings-BtyPgQAh.js} +1 -1
  57. package/src/assets/web-panel/assets/{OrderTableRenderer-D-t5hKkx.js → OrderTableRenderer-yUaqwCty.js} +1 -1
  58. package/src/assets/web-panel/assets/{Organization-C_BGi4xi.js → Organization-C3kTVn5i.js} +4 -4
  59. package/src/assets/web-panel/assets/{Overflow-BodhraDq.js → Overflow-C2-0iZhq.js} +1 -1
  60. package/src/assets/web-panel/assets/{P2P-BTa3sAIy.js → P2P-CISoEUxA.js} +2 -2
  61. package/src/assets/web-panel/assets/{PdhVaultBrowser-BjZslP9T.js → PdhVaultBrowser-NfTVtvKQ.js} +5 -5
  62. package/src/assets/web-panel/assets/{Permissions-u3UDzGef.js → Permissions-CfK0jJhm.js} +3 -3
  63. package/src/assets/web-panel/assets/{PersonalDataHub-Cb7ybv65.js → PersonalDataHub-OsVxxh_j.js} +4 -4
  64. package/src/assets/web-panel/assets/{Pipeline-CS24k-P7.js → Pipeline-DEmK_Ch2.js} +1 -1
  65. package/src/assets/web-panel/assets/{Privacy-Ddj6Kqs7.js → Privacy-D61s73b0.js} +1 -1
  66. package/src/assets/web-panel/assets/{ProjectInit-Bg5uQIgg.js → ProjectInit-DkLF5gHb.js} +2 -2
  67. package/src/assets/web-panel/assets/{ProjectSettings-AmPR8T12.js → ProjectSettings-BA7odTrI.js} +2 -2
  68. package/src/assets/web-panel/assets/{Projects-DGSbAyTK.js → Projects-CdI1GcAG.js} +1 -1
  69. package/src/assets/web-panel/assets/{Providers-Dc1C3lbB.js → Providers-D9BYyP1r.js} +1 -1
  70. package/src/assets/web-panel/assets/{QrScannerModal-Cv3HXpce.js → QrScannerModal-CXMItUDD.js} +1 -1
  71. package/src/assets/web-panel/assets/{QuickAsk-3dpbXARb.js → QuickAsk-8-tF9ffZ.js} +1 -1
  72. package/src/assets/web-panel/assets/{Recommend-5aGRVnJK.js → Recommend-C2QGWOSi.js} +1 -1
  73. package/src/assets/web-panel/assets/{RemoteSession-CTS2jx0p.js → RemoteSession-B1M_v1lx.js} +2 -2
  74. package/src/assets/web-panel/assets/{Reputation-BxaKI0hY.js → Reputation-D0WZHgv1.js} +1 -1
  75. package/src/assets/web-panel/assets/{Row-C23uQdwd.js → Row-D6nf9-c-.js} +1 -1
  76. package/src/assets/web-panel/assets/{RssFeed-ssX9YOhm.js → RssFeed-ClZ6M-mN.js} +3 -3
  77. package/src/assets/web-panel/assets/{Search-C24GogII.js → Search-ZWkt8vuO.js} +1 -1
  78. package/src/assets/web-panel/assets/{Security-DdAcGKkk.js → Security-BUlQut2m.js} +3 -3
  79. package/src/assets/web-panel/assets/{Services-D0dCiEuq.js → Services-Cd_3xJOc.js} +2 -2
  80. package/src/assets/web-panel/assets/{Skeleton-DEY44o0v.js → Skeleton-C8e2-cHW.js} +1 -1
  81. package/src/assets/web-panel/assets/Skills-DucVRJp1.js +1 -0
  82. package/src/assets/web-panel/assets/{Sla-B_bbo2vB.js → Sla-Csr5pUwI.js} +1 -1
  83. package/src/assets/web-panel/assets/SpeechSettings-CXvyaRAT.js +1 -0
  84. package/src/assets/web-panel/assets/{SyncSettings-CpIXql0Z.js → SyncSettings-KdsIcV5h.js} +2 -2
  85. package/src/assets/web-panel/assets/Tasks-B-eHmJm9.js +1 -0
  86. package/src/assets/web-panel/assets/{Templates-C_44nVPq.js → Templates-BglVeaLK.js} +1 -1
  87. package/src/assets/web-panel/assets/{Tenant-CyZ2ey2P.js → Tenant-BBbQ8qan.js} +1 -1
  88. package/src/assets/web-panel/assets/{Terminal-DwGNHWnp.js → Terminal-Ca_pCVBi.js} +2 -2
  89. package/src/assets/web-panel/assets/{TimelineRenderer-BTAHNkqU.js → TimelineRenderer-YD6XG_vZ.js} +1 -1
  90. package/src/assets/web-panel/assets/{Tokens-DCJWkUwc.js → Tokens-2lRoeVli.js} +1 -1
  91. package/src/assets/web-panel/assets/{Trigger-BCjDO9-E.js → Trigger-C-3XNAU9.js} +1 -1
  92. package/src/assets/web-panel/assets/{Trust-_YS8WbRb.js → Trust-k-1PxdLG.js} +1 -1
  93. package/src/assets/web-panel/assets/{UkeySign-m6R8xGq7.js → UkeySign-FG-qW646.js} +1 -1
  94. package/src/assets/web-panel/assets/{VideoEditing-xOfk29c4.js → VideoEditing-BNOe1cmd.js} +1 -1
  95. package/src/assets/web-panel/assets/{Wallet-B1Gw0awc.js → Wallet-D5C3i2Kw.js} +4 -4
  96. package/src/assets/web-panel/assets/{WebAuthn-CHK5ft18.js → WebAuthn-BOpztqd3.js} +4 -4
  97. package/src/assets/web-panel/assets/{WorkflowEditor-DEp1ukQQ.js → WorkflowEditor-BpVrpUEv.js} +1 -1
  98. package/src/assets/web-panel/assets/{chat-B2sFizun.js → chat-DIuMHb38.js} +1 -1
  99. package/src/assets/web-panel/assets/{colors-DJ17YV1E.js → colors-CTFJPyzQ.js} +1 -1
  100. package/src/assets/web-panel/assets/{compact-item-CBhJJgEC.js → compact-item-CONfmJcW.js} +1 -1
  101. package/src/assets/web-panel/assets/{createContext-BZkpvNJy.js → createContext-RkW5CRrz.js} +1 -1
  102. package/src/assets/web-panel/assets/devWarning-DaEBln_q.js +1 -0
  103. package/src/assets/web-panel/assets/{hasIn-C0ZKo6Ei.js → hasIn-CW4XOjDC.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-Bc3vVG2X.js → index-7wMSBCU7.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-vFMwiAN4.js → index-Akmg1WdH.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DOBXNMdh.js → index-B54qoVff.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DLo8Ls9u.js → index-B8r2t0Ch.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C7gv9dvb.js → index-B9XoBoty.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DHtpMr1G.js → index-B9aS2VLu.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Dxe0YlZe.js → index-BFs1Tznc.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DumLgj1t.js → index-BKgaRT0b.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BNp6HKFh.js → index-BM7bOUvu.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DM0rWF6z.js → index-BMg2JFmW.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-4oULtRqE.js → index-BRZsPxNn.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-LPPe0val.js → index-Bf19fKef.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Ctguam0K.js → index-BkAbfBF-.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DrU5xVpF.js → index-CBjb2A5R.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CCOr6Q27.js → index-CEZWQthY.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-C9gYiACH.js → index-CFGLf88d.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CZW84cEf.js → index-CLUa68JH.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-BoDUYyuo.js → index-CM2X25Er.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DyiCbHeL.js → index-CX4T2uKN.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CW5o1Gar.js → index-CixqfdRk.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-5K2z_tgO.js → index-CkRojEip.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BOfPp5OV.js → index-Cvmc3f25.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CdxJm-HB.js → index-D-lpTPS8.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-8ueG48gl.js → index-D59GbWCN.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BMxOoITz.js → index-DAESljiJ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DLMr5KMd.js → index-DDHUx4Yz.js} +1 -1
  130. package/src/assets/web-panel/assets/index-DG1mcYTa.js +1 -0
  131. package/src/assets/web-panel/assets/{index-BGIvhCPl.js → index-DP5pPedy.js} +1 -1
  132. package/src/assets/web-panel/assets/index-DRs5Pe8u.js +1 -0
  133. package/src/assets/web-panel/assets/{index-DjdSFO0d.js → index-DSlXL6Ju.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Cn5UzvgR.js → index-DWCJnn2O.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-Chct9tL8.js → index-DWY7YwDu.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-BEnd5fiz.js → index-DZTwP364.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-KzNhWykP.js → index-DidrMvOx.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-BpyrhOeh.js → index-Dj3K5kHs.js} +1 -1
  139. package/src/assets/web-panel/assets/{index-CZlkPrxb.js → index-YaeGscSw.js} +1 -1
  140. package/src/assets/web-panel/assets/{index-Dfgxe-fw.js → index-YlMnFNOi.js} +1 -1
  141. package/src/assets/web-panel/assets/{index-IHgzfc1u.js → index-asWsB34i.js} +1 -1
  142. package/src/assets/web-panel/assets/{index-DJkoJzTU.js → index-gkjiFjQd.js} +1 -1
  143. package/src/assets/web-panel/assets/{initDefaultProps-Cqfoq0TJ.js → initDefaultProps-BOr4igh3.js} +1 -1
  144. package/src/assets/web-panel/assets/{motion-CIiVJHNu.js → motion-CK469n2j.js} +1 -1
  145. package/src/assets/web-panel/assets/{move-CFl1o_A8.js → move-DzjudlYQ.js} +1 -1
  146. package/src/assets/web-panel/assets/{mtc-parser-DYoCxcZ1.js → mtc-parser-BQaKUxC6.js} +1 -1
  147. package/src/assets/web-panel/assets/{omit-C1P2q5TY.js → omit-MciovCFD.js} +1 -1
  148. package/src/assets/web-panel/assets/{pickAttrs-BtTRpJtC.js → pickAttrs-DDPJ4zAz.js} +1 -1
  149. package/src/assets/web-panel/assets/{placementArrow-Cst2PcNM.js → placementArrow-Cznyb-jI.js} +1 -1
  150. package/src/assets/web-panel/assets/{responsiveObserve-CF5kalV2.js → responsiveObserve-AJK3SLzJ.js} +1 -1
  151. package/src/assets/web-panel/assets/{slide-CtHGqpXN.js → slide-CPQ28wu7.js} +1 -1
  152. package/src/assets/web-panel/assets/{statusUtils-N__biHXf.js → statusUtils-CFjzvqf_.js} +1 -1
  153. package/src/assets/web-panel/assets/{styleChecker-DR8V_H-i.js → styleChecker-BPyFfTuR.js} +1 -1
  154. package/src/assets/web-panel/assets/{useFlexGapSupport-D274dqun.js → useFlexGapSupport-Dq7N6R05.js} +1 -1
  155. package/src/assets/web-panel/assets/{useFs-BwHLYU5b.js → useFs-C3GS0uTc.js} +1 -1
  156. package/src/assets/web-panel/assets/{usePersonalDataHub-BiA-hVqt.js → usePersonalDataHub-BhgIVzP_.js} +1 -1
  157. package/src/assets/web-panel/assets/{vnode-Bugl94dy.js → vnode-4ZD9-MDr.js} +1 -1
  158. package/src/assets/web-panel/assets/{zoom-DEFl8GCu.js → zoom-Bx4MRVNW.js} +1 -1
  159. package/src/assets/web-panel/index.html +1 -1
  160. package/src/command-help-index.json +1 -1
  161. package/src/command-manifest.json +1 -1
  162. package/src/commands/checkpoint.js +42 -7
  163. package/src/commands/orchestrate.js +85 -25
  164. package/src/commands/session-location.js +5 -0
  165. package/src/commands/session-show.js +109 -1
  166. package/src/commands/session.js +26 -2
  167. package/src/commands/tokens.js +9 -4
  168. package/src/data/changelog.json +26 -0
  169. package/src/generated/cc-agent-protocol.schema.json +71 -0
  170. package/src/harness/jsonl-session-store.js +357 -114
  171. package/src/harness/mcp-client.js +44 -1
  172. package/src/lib/agent-router.js +35 -7
  173. package/src/lib/app-server/server.js +14 -0
  174. package/src/lib/background-agent-supervisor.js +14 -4
  175. package/src/lib/causal-observability.js +64 -1
  176. package/src/lib/checkpoint-summary-projection.js +98 -0
  177. package/src/lib/checkpoint-timeline-authority.js +15 -51
  178. package/src/lib/claude-code-bridge.js +302 -60
  179. package/src/lib/codex-app-server-adapter.js +161 -35
  180. package/src/lib/cost-budget.js +4 -0
  181. package/src/lib/decision-layer/providers.js +84 -9
  182. package/src/lib/decision-layer/runtime.js +86 -49
  183. package/src/lib/direct-model-usage.js +14 -3
  184. package/src/lib/doctor-checkup.js +31 -2
  185. package/src/lib/durable-security-store.js +6 -1
  186. package/src/lib/evolution/evolution-artifact-identity.js +21 -0
  187. package/src/lib/evolution/evolution-artifact-ports.js +5 -11
  188. package/src/lib/evolution/evolution-eval-cohort-receipt-reconciliation.js +389 -0
  189. package/src/lib/execution-location-failure-site.js +63 -0
  190. package/src/lib/execution-location-target.js +102 -8
  191. package/src/lib/external-agent-adapters.js +2 -0
  192. package/src/lib/image-file-boundary.js +154 -0
  193. package/src/lib/image-input.js +16 -3
  194. package/src/lib/llm-pricing.js +114 -8
  195. package/src/lib/mcp-call-ledger-store.js +7 -2
  196. package/src/lib/model-capabilities.js +21 -10
  197. package/src/lib/model-context-catalog.js +60 -1
  198. package/src/lib/openai-responses.js +7 -1
  199. package/src/lib/orchestrator.js +8 -2
  200. package/src/lib/process-execution-broker/index.js +93 -1
  201. package/src/lib/process-execution-broker/linux-subreaper-artifact.js +120 -0
  202. package/src/lib/process-execution-broker/linux-subreaper-helper.js +344 -0
  203. package/src/lib/process-execution-broker/linux-subreaper-process.js +326 -0
  204. package/src/lib/process-execution-broker/linux-subreaper-supervisor.c +360 -0
  205. package/src/lib/process-execution-broker/owned-posix-process-group-worker.mjs +131 -0
  206. package/src/lib/process-execution-broker/owned-posix-process-group.js +267 -0
  207. package/src/lib/process-execution-broker/process-ownership-journal.js +297 -0
  208. package/src/lib/process-execution-broker/process-ownership-quarantine.js +91 -0
  209. package/src/lib/runtime-usage-ledger.js +3 -0
  210. package/src/lib/secure-fs.js +158 -42
  211. package/src/lib/session-branch-history.js +240 -0
  212. package/src/lib/session-history-origins.js +285 -0
  213. package/src/lib/session-input-receipt.js +110 -0
  214. package/src/lib/session-resource-budget.js +8 -8
  215. package/src/lib/session-transcript-history.js +456 -0
  216. package/src/lib/session-transcript-page.js +164 -0
  217. package/src/lib/session-transcript-reference.js +38 -0
  218. package/src/lib/session-usage.js +8 -0
  219. package/src/lib/token-tracker.js +32 -54
  220. package/src/lib/usage-pricing-context.js +93 -0
  221. package/src/runtime/headless-runner.js +8 -0
  222. package/src/runtime/headless-stream.js +202 -4
  223. package/src/assets/web-panel/assets/EvolutionSettings-Pc1IpRfk.js +0 -1
  224. package/src/assets/web-panel/assets/MarkdownRenderer-BIUeeiVA.js +0 -1
  225. package/src/assets/web-panel/assets/Skills-CYt0Mu2W.js +0 -1
  226. package/src/assets/web-panel/assets/SpeechSettings-a2BBjtTL.js +0 -1
  227. package/src/assets/web-panel/assets/Tasks-BYQKU-GL.js +0 -1
  228. package/src/assets/web-panel/assets/devWarning-DZhu13vj.js +0 -1
  229. package/src/assets/web-panel/assets/index-C6iFyQYz.js +0 -1
  230. package/src/assets/web-panel/assets/index-CztThH9f.js +0 -1
@@ -0,0 +1,360 @@
1
+ #define _GNU_SOURCE
2
+ /*
3
+ * Linux lifecycle owner for one pre-admitted Broker plan. This is not a
4
+ * sandbox: it does not constrain filesystem/network access or prevent an
5
+ * executable from attacking its supervisor. Only an intact, zero-child
6
+ * receipt plus the supervisor's successful close proves cleanup.
7
+ *
8
+ * fd 3: private Unix socket. Request: CCSUBR01, then BE32 frame length,
9
+ * argc, envc, grace-ms; then length-prefixed cwd, argv (including executable),
10
+ * and KEY=VALUE environment strings. Subsequent bytes T/K request TERM/KILL.
11
+ * Replies are bounded JSONL, never target stdout/stderr.
12
+ */
13
+ #include <ctype.h>
14
+ #include <dirent.h>
15
+ #include <errno.h>
16
+ #include <fcntl.h>
17
+ #include <limits.h>
18
+ #include <poll.h>
19
+ #include <signal.h>
20
+ #include <stdint.h>
21
+ #include <stdio.h>
22
+ #include <stdlib.h>
23
+ #include <string.h>
24
+ #include <sys/prctl.h>
25
+ #include <sys/socket.h>
26
+ #include <sys/stat.h>
27
+ #include <sys/types.h>
28
+ #include <sys/wait.h>
29
+ #include <time.h>
30
+ #include <unistd.h>
31
+
32
+ #define CONTROL_FD 3
33
+ #define MAX_FRAME (1024U * 1024U)
34
+ #define MAX_CHILDREN 65536U
35
+ #define HEADER_SIZE 24U
36
+
37
+ static volatile sig_atomic_t stop_level;
38
+ static int protocol_ok = 1;
39
+ static int control_closed;
40
+ static pid_t soft_pids[MAX_CHILDREN];
41
+ static size_t soft_count;
42
+
43
+ static void on_stop(int signal_number) {
44
+ (void)signal_number;
45
+ if (stop_level < 1) stop_level = 1;
46
+ }
47
+
48
+ static int64_t monotonic_ms(void) {
49
+ struct timespec value;
50
+ if (clock_gettime(CLOCK_MONOTONIC, &value) != 0) _exit(70);
51
+ return (int64_t)value.tv_sec * 1000 + value.tv_nsec / 1000000;
52
+ }
53
+
54
+ static uint32_t be32(const unsigned char *bytes) {
55
+ return ((uint32_t)bytes[0] << 24) | ((uint32_t)bytes[1] << 16) |
56
+ ((uint32_t)bytes[2] << 8) | (uint32_t)bytes[3];
57
+ }
58
+
59
+ static void reply(const char *message) {
60
+ size_t length = strlen(message);
61
+ ssize_t count;
62
+ do {
63
+ count = send(CONTROL_FD, message, length, MSG_DONTWAIT | MSG_NOSIGNAL);
64
+ } while (count < 0 && errno == EINTR);
65
+ if (count != (ssize_t)length) protocol_ok = 0;
66
+ }
67
+
68
+ static int read_exact(unsigned char *bytes, size_t length, int64_t deadline) {
69
+ size_t offset = 0;
70
+ while (offset < length && !stop_level) {
71
+ int64_t remaining = deadline - monotonic_ms();
72
+ if (remaining <= 0) return -1;
73
+ struct pollfd item = {CONTROL_FD, POLLIN, 0};
74
+ int result = poll(&item, 1, remaining > 100 ? 100 : (int)remaining);
75
+ if (result < 0 && errno == EINTR) continue;
76
+ if (result < 0) return -1;
77
+ if (result == 0) continue;
78
+ ssize_t count = read(CONTROL_FD, bytes + offset, length - offset);
79
+ if (count < 0 && (errno == EINTR || errno == EAGAIN)) continue;
80
+ if (count <= 0) return -1;
81
+ offset += (size_t)count;
82
+ }
83
+ return offset == length ? 0 : -1;
84
+ }
85
+
86
+ static char *next_string(unsigned char *body, size_t length, size_t *offset) {
87
+ if (*offset > length || length - *offset < 4) return NULL;
88
+ uint32_t size = be32(body + *offset);
89
+ *offset += 4;
90
+ if (size > length - *offset || memchr(body + *offset, 0, size)) return NULL;
91
+ char *value = malloc((size_t)size + 1);
92
+ if (!value) return NULL;
93
+ memcpy(value, body + *offset, size);
94
+ value[size] = 0;
95
+ *offset += size;
96
+ return value;
97
+ }
98
+
99
+ /* No automatic shell fallback for an executable with an invalid format. */
100
+ static void execute_target(char **args, char **environment) {
101
+ if (strchr(args[0], '/')) {
102
+ execve(args[0], args, environment);
103
+ return;
104
+ }
105
+ const char *search = "/usr/bin:/bin";
106
+ for (size_t i = 0; environment[i]; i++) {
107
+ if (strncmp(environment[i], "PATH=", 5) == 0) search = environment[i] + 5;
108
+ }
109
+ int denied = 0;
110
+ for (;;) {
111
+ const char *end = strchr(search, ':');
112
+ size_t directory_length = end ? (size_t)(end - search) : strlen(search);
113
+ size_t command_length = strlen(args[0]);
114
+ char *candidate = malloc(directory_length + command_length + 2);
115
+ if (!candidate) { errno = ENOMEM; return; }
116
+ if (directory_length) {
117
+ memcpy(candidate, search, directory_length);
118
+ candidate[directory_length] = '/';
119
+ memcpy(candidate + directory_length + 1, args[0], command_length + 1);
120
+ } else {
121
+ memcpy(candidate, args[0], command_length + 1);
122
+ }
123
+ execve(candidate, args, environment);
124
+ int error = errno;
125
+ free(candidate);
126
+ if (error == EACCES) denied = 1;
127
+ else if (error != ENOENT && error != ENOTDIR) { errno = error; return; }
128
+ if (!end) break;
129
+ search = end + 1;
130
+ }
131
+ errno = denied ? EACCES : ENOENT;
132
+ }
133
+
134
+ static void remove_soft_pid(pid_t pid) {
135
+ for (size_t i = 0; i < soft_count; i++) {
136
+ if (soft_pids[i] == pid) { soft_pids[i] = soft_pids[--soft_count]; return; }
137
+ }
138
+ }
139
+
140
+ static int signal_owned_pid(pid_t pid, int signal_number) {
141
+ if (signal_number == SIGTERM) {
142
+ for (size_t i = 0; i < soft_count; i++) if (soft_pids[i] == pid) return 0;
143
+ }
144
+ if (kill(pid, signal_number) != 0 && errno != ESRCH) return -1;
145
+ if (signal_number == SIGTERM && soft_count < MAX_CHILDREN) soft_pids[soft_count++] = pid;
146
+ return 0;
147
+ }
148
+
149
+ /* WSL1 implements subreapers but not /proc/<pid>/task/<tid>/children. */
150
+ static int signal_children_from_proc(int signal_number) {
151
+ DIR *directory = opendir("/proc");
152
+ if (!directory) return -1;
153
+ int ok = 1;
154
+ struct dirent *entry;
155
+ while ((entry = readdir(directory)) != NULL) {
156
+ char *end;
157
+ errno = 0;
158
+ long pid = strtol(entry->d_name, &end, 10);
159
+ if (errno || *end || end == entry->d_name || pid <= 0 || pid > INT_MAX) continue;
160
+ char pathname[96], data[8192];
161
+ int size = snprintf(pathname, sizeof(pathname), "/proc/%ld/stat", pid);
162
+ if (size <= 0 || (size_t)size >= sizeof(pathname)) { ok = 0; continue; }
163
+ int descriptor = open(pathname, O_RDONLY | O_CLOEXEC);
164
+ if (descriptor < 0) {
165
+ if (errno != ENOENT && errno != ESRCH) ok = 0;
166
+ continue;
167
+ }
168
+ ssize_t length;
169
+ do { length = read(descriptor, data, sizeof(data) - 1); } while (length < 0 && errno == EINTR);
170
+ int read_error = errno;
171
+ close(descriptor);
172
+ if (length <= 0) {
173
+ if (length == 0 || (read_error != ENOENT && read_error != ESRCH)) ok = 0;
174
+ continue;
175
+ }
176
+ data[length] = 0;
177
+ char *tail = strrchr(data, ')');
178
+ char state;
179
+ long ppid;
180
+ if (!tail || sscanf(tail + 1, " %c %ld", &state, &ppid) != 2) { ok = 0; continue; }
181
+ if (ppid == (long)getpid() && signal_owned_pid((pid_t)pid, signal_number)) ok = 0;
182
+ }
183
+ closedir(directory);
184
+ return ok ? 0 : -1;
185
+ }
186
+
187
+ /*
188
+ * Only this single thread reaps children. Between the children snapshot and
189
+ * kill(), no wait is performed: a child PID stays reserved even if it exits.
190
+ * Adopted descendants are direct children too, including setsid/double-fork.
191
+ * No saved original-root PID or process-group ID authorizes a delayed kill.
192
+ */
193
+ static int signal_owned_children(int signal_number) {
194
+ char pathname[96];
195
+ int size = snprintf(pathname, sizeof(pathname), "/proc/self/task/%ld/children", (long)getpid());
196
+ if (size <= 0 || (size_t)size >= sizeof(pathname)) return -1;
197
+ int descriptor = open(pathname, O_RDONLY | O_CLOEXEC);
198
+ if (descriptor < 0) return signal_children_from_proc(signal_number);
199
+ char *data = malloc(MAX_FRAME + 1);
200
+ if (!data) { close(descriptor); return -1; }
201
+ size_t length = 0;
202
+ int ok = 1;
203
+ while (length < MAX_FRAME) {
204
+ ssize_t count = read(descriptor, data + length, MAX_FRAME - length);
205
+ if (count < 0 && errno == EINTR) continue;
206
+ if (count < 0) { ok = 0; break; }
207
+ if (count == 0) break;
208
+ length += (size_t)count;
209
+ }
210
+ close(descriptor);
211
+ if (length == MAX_FRAME) ok = 0;
212
+ data[length] = 0;
213
+ char *cursor = data;
214
+ while (ok && *cursor) {
215
+ while (isspace((unsigned char)*cursor)) cursor++;
216
+ if (!*cursor) break;
217
+ char *end;
218
+ errno = 0;
219
+ long number = strtol(cursor, &end, 10);
220
+ if (errno || end == cursor || number <= 0 || number > INT_MAX ||
221
+ (*end && !isspace((unsigned char)*end))) { ok = 0; break; }
222
+ cursor = end;
223
+ pid_t pid = (pid_t)number;
224
+ if (signal_owned_pid(pid, signal_number)) ok = 0;
225
+ }
226
+ free(data);
227
+ return ok ? 0 : -1;
228
+ }
229
+
230
+ static void read_control(void) {
231
+ unsigned char buffer[64];
232
+ ssize_t count = read(CONTROL_FD, buffer, sizeof(buffer));
233
+ if (count < 0 && (errno == EAGAIN || errno == EINTR)) return;
234
+ if (count <= 0) { protocol_ok = 0; control_closed = 1; if (!stop_level) stop_level = 1; return; }
235
+ for (ssize_t i = 0; i < count; i++) {
236
+ if (buffer[i] == 'K') stop_level = 2;
237
+ else if (buffer[i] == 'T') { if (!stop_level) stop_level = 1; }
238
+ else { protocol_ok = 0; stop_level = 2; }
239
+ }
240
+ }
241
+
242
+ int main(void) {
243
+ struct stat info;
244
+ if (fstat(CONTROL_FD, &info) || !S_ISSOCK(info.st_mode)) return 70;
245
+ if (fcntl(CONTROL_FD, F_SETFD, FD_CLOEXEC) ||
246
+ fcntl(CONTROL_FD, F_SETFL, O_NONBLOCK)) return 70;
247
+ struct sigaction action;
248
+ memset(&action, 0, sizeof(action));
249
+ sigemptyset(&action.sa_mask);
250
+ action.sa_handler = on_stop;
251
+ if (sigaction(SIGTERM, &action, NULL) || sigaction(SIGINT, &action, NULL)) return 70;
252
+ action.sa_handler = SIG_IGN;
253
+ if (sigaction(SIGPIPE, &action, NULL)) return 70;
254
+ action.sa_handler = SIG_DFL;
255
+ if (sigaction(SIGCHLD, &action, NULL)) return 70;
256
+ int enabled = 0;
257
+ if (prctl(PR_SET_CHILD_SUBREAPER, 1, 0, 0, 0) ||
258
+ prctl(PR_GET_CHILD_SUBREAPER, &enabled, 0, 0, 0) || enabled != 1 ||
259
+ prctl(PR_SET_DUMPABLE, 0, 0, 0, 0)) {
260
+ reply("{\"type\":\"error\",\"code\":\"subreaper-unavailable\"}\n");
261
+ return 70;
262
+ }
263
+ unsigned char header[HEADER_SIZE];
264
+ int64_t startup_deadline = monotonic_ms() + 10000;
265
+ if (read_exact(header, sizeof(header), startup_deadline)) return 70;
266
+ uint32_t length = be32(header + 8), argc = be32(header + 12);
267
+ uint32_t envc = be32(header + 16), grace_ms = be32(header + 20);
268
+ if (memcmp(header, "CCSUBR01", 8) || length < HEADER_SIZE || length > MAX_FRAME ||
269
+ argc < 1 || argc > 4096 || envc > 8192 || grace_ms > INT_MAX) return 70;
270
+ size_t body_length = length - HEADER_SIZE, offset = 0;
271
+ unsigned char *body = malloc(body_length ? body_length : 1);
272
+ char **args = calloc((size_t)argc + 1, sizeof(char *));
273
+ char **environment = calloc((size_t)envc + 1, sizeof(char *));
274
+ if (!body || !args || !environment || read_exact(body, body_length, startup_deadline)) return 70;
275
+ char *cwd = next_string(body, body_length, &offset);
276
+ if (!cwd || cwd[0] != '/') return 70;
277
+ for (uint32_t i = 0; i < argc; i++) if (!(args[i] = next_string(body, body_length, &offset))) return 70;
278
+ if (!args[0][0]) return 70;
279
+ for (uint32_t i = 0; i < envc; i++) {
280
+ environment[i] = next_string(body, body_length, &offset);
281
+ if (!environment[i] || !strchr(environment[i], '=') || environment[i][0] == '=') return 70;
282
+ }
283
+ if (offset != body_length) return 70;
284
+ free(body);
285
+ int error_pipe[2];
286
+ if (pipe2(error_pipe, O_CLOEXEC | O_NONBLOCK)) return 70;
287
+ pid_t supervisor_pid = getpid();
288
+ pid_t root_pid = fork();
289
+ if (root_pid < 0) return 70;
290
+ if (root_pid == 0) {
291
+ close(error_pipe[0]);
292
+ close(CONTROL_FD);
293
+ /* Optional pinned helper image; never pass installation handles to target. */
294
+ if (error_pipe[1] != 4) close(4);
295
+ /* Reset handlers inherited across fork, including SIGPIPE for the target. */
296
+ action.sa_handler = SIG_DFL;
297
+ if (sigaction(SIGTERM, &action, NULL) || sigaction(SIGINT, &action, NULL) ||
298
+ sigaction(SIGPIPE, &action, NULL) || prctl(PR_SET_PDEATHSIG, SIGKILL) ||
299
+ getppid() != supervisor_pid || chdir(cwd)) {
300
+ int error = errno ? errno : ECHILD;
301
+ if (write(error_pipe[1], &error, sizeof(error)) != sizeof(error)) _exit(126);
302
+ _exit(127);
303
+ }
304
+ execute_target(args, environment);
305
+ int error = errno;
306
+ if (write(error_pipe[1], &error, sizeof(error)) != sizeof(error)) _exit(126);
307
+ _exit(127);
308
+ }
309
+ close(error_pipe[1]);
310
+ for (uint32_t i = 0; i < argc; i++) free(args[i]);
311
+ for (uint32_t i = 0; i < envc; i++) free(environment[i]);
312
+ free(args); free(environment); free(cwd);
313
+ char message[256];
314
+ snprintf(message, sizeof(message), "{\"type\":\"started\",\"pid\":%ld}\n", (long)root_pid);
315
+ reply(message);
316
+ int root_reaped = 0, warned = 0;
317
+ unsigned long reaped = 0;
318
+ int64_t stop_started = 0;
319
+ for (;;) {
320
+ int status;
321
+ pid_t waited;
322
+ while ((waited = waitpid(-1, &status, WNOHANG)) > 0) {
323
+ reaped++;
324
+ remove_soft_pid(waited);
325
+ if (waited == root_pid && !root_reaped) {
326
+ root_reaped = 1;
327
+ int spawn_errno = 0;
328
+ ssize_t bytes = read(error_pipe[0], &spawn_errno, sizeof(spawn_errno));
329
+ if (bytes != 0 && bytes != sizeof(spawn_errno)) { protocol_ok = 0; spawn_errno = -1; }
330
+ close(error_pipe[0]);
331
+ snprintf(message, sizeof(message), "{\"type\":\"target-exit\",\"code\":%d,\"signal\":%d,\"spawnErrno\":%d}\n",
332
+ WIFEXITED(status) ? WEXITSTATUS(status) : -1,
333
+ WIFSIGNALED(status) ? WTERMSIG(status) : 0, spawn_errno);
334
+ reply(message);
335
+ if (!stop_level) stop_level = 1;
336
+ }
337
+ }
338
+ if (waited < 0 && errno == ECHILD && root_reaped) {
339
+ snprintf(message, sizeof(message), "{\"type\":\"cleanup\",\"confirmed\":%s,\"reaped\":%lu,\"rootReaped\":true}\n", protocol_ok ? "true" : "false", reaped);
340
+ reply(message);
341
+ return protocol_ok ? 0 : 70;
342
+ }
343
+ if (waited < 0 && errno != EINTR && errno != ECHILD) { protocol_ok = 0; stop_level = 2; }
344
+ if (stop_level) {
345
+ int64_t now = monotonic_ms();
346
+ if (!stop_started) stop_started = now;
347
+ int signal_number = stop_level == 2 || now - stop_started >= grace_ms ? SIGKILL : SIGTERM;
348
+ if (signal_owned_children(signal_number)) protocol_ok = 0;
349
+ if (!warned && now - stop_started > 10000) {
350
+ warned = 1;
351
+ reply("{\"type\":\"error\",\"code\":\"cleanup-unconfirmed\"}\n");
352
+ /* Retain ownership and keep reaping; never exit with live children. */
353
+ }
354
+ }
355
+ struct pollfd item = {control_closed ? -1 : CONTROL_FD, POLLIN, 0};
356
+ int observed = poll(&item, 1, stop_level ? 10 : 100);
357
+ if (observed > 0) read_control();
358
+ if (observed < 0 && errno != EINTR) { protocol_ok = 0; stop_level = 2; }
359
+ }
360
+ }
@@ -0,0 +1,131 @@
1
+ // Broker implementation detail. fd 3 is a private caller lifeline, never
2
+ // inherited by the target. stdout/stderr remain the target's raw byte streams.
3
+ import { spawn } from "node:child_process";
4
+ import { Socket } from "node:net";
5
+ import { StringDecoder } from "node:string_decoder";
6
+
7
+ const control = new Socket({ fd: 3, readable: true, writable: true });
8
+ const MAX_REQUEST_BYTES = 1024 * 1024;
9
+ let buffer = "";
10
+ const decoder = new StringDecoder("utf8");
11
+ let bytes = 0;
12
+ let target = null;
13
+ let launched = false;
14
+ let stopping = false;
15
+ let killing = false;
16
+ let graceMs = 250;
17
+ let killTimer;
18
+
19
+ function hardStop() {
20
+ if (killing) return;
21
+ killing = true;
22
+ clearTimeout(killTimer);
23
+ // We are still the live leader, so -process.pid cannot name a reused group.
24
+ const killGroup = () => {
25
+ try {
26
+ process.kill(-process.pid, "SIGKILL");
27
+ } catch {
28
+ process.exit(70);
29
+ }
30
+ };
31
+ if (!control.destroyed && control.writable) {
32
+ control.write('{"type":"terminating"}\n', killGroup);
33
+ setTimeout(killGroup, 100);
34
+ } else {
35
+ killGroup();
36
+ }
37
+ }
38
+
39
+ function stop(signal = "SIGTERM") {
40
+ if (signal === "SIGKILL") {
41
+ hardStop();
42
+ return;
43
+ }
44
+ if (stopping || killing) return;
45
+ stopping = true;
46
+ killTimer = setTimeout(hardStop, graceMs);
47
+ try {
48
+ process.kill(-process.pid, "SIGTERM");
49
+ } catch {
50
+ hardStop();
51
+ }
52
+ }
53
+
54
+ process.on("SIGTERM", () => stop());
55
+ process.on("SIGINT", () => stop());
56
+ control.on("end", () => stop());
57
+ control.on("error", () => stop());
58
+ control.on("close", () => stop());
59
+ // A caller that disappears or never sends a launch cannot leave a keeper.
60
+ const startupTimer = setTimeout(() => stop(), 10_000);
61
+
62
+ function sendTargetExit(code, signal, spawnError = null) {
63
+ if (!control.destroyed && control.writable) {
64
+ control.write(
65
+ JSON.stringify({ type: "target-exit", code, signal, spawnError }) + "\n",
66
+ );
67
+ }
68
+ stop();
69
+ }
70
+
71
+ function receive(message) {
72
+ if (
73
+ message.type === "stop" &&
74
+ ["SIGTERM", "SIGKILL"].includes(message.signal)
75
+ ) {
76
+ stop(message.signal);
77
+ return;
78
+ }
79
+ if (message.type !== "launch" || launched || stopping || killing)
80
+ throw new Error("invalid launch");
81
+ launched = true;
82
+ clearTimeout(startupTimer);
83
+ if (
84
+ !Number.isSafeInteger(message.graceMs) ||
85
+ message.graceMs < 1 ||
86
+ message.graceMs > 5000
87
+ )
88
+ throw new Error("invalid grace");
89
+ graceMs = message.graceMs;
90
+ // This is the exact, pre-admitted plan supplied by the Broker-side caller.
91
+ // No shell, inherited control fd, detached target, or env expansion.
92
+ target = spawn(message.command, message.args, {
93
+ cwd: message.cwd,
94
+ env: message.env,
95
+ shell: false,
96
+ detached: false,
97
+ stdio: [0, 1, 2],
98
+ });
99
+ target.once("spawn", () => {
100
+ control.write(JSON.stringify({ type: "started", pid: target.pid }) + "\n");
101
+ });
102
+ target.once("error", (error) =>
103
+ sendTargetExit(
104
+ null,
105
+ null,
106
+ /^[A-Z0-9_]{1,40}$/.test(error.code ?? "") ? error.code : "SPAWN_FAILED",
107
+ ),
108
+ );
109
+ // exit, not close: a descendant can retain inherited stdout after root exit.
110
+ target.once("exit", (code, signal) => sendTargetExit(code, signal));
111
+ }
112
+
113
+ control.on("data", (chunk) => {
114
+ bytes += chunk.length;
115
+ if (bytes > MAX_REQUEST_BYTES + 1024) {
116
+ stop();
117
+ return;
118
+ }
119
+ buffer += decoder.write(chunk);
120
+ let newline;
121
+ while ((newline = buffer.indexOf("\n")) >= 0) {
122
+ const line = buffer.slice(0, newline);
123
+ buffer = buffer.slice(newline + 1);
124
+ try {
125
+ receive(JSON.parse(line));
126
+ } catch {
127
+ stop();
128
+ return;
129
+ }
130
+ }
131
+ });