@b00dea/cockpit 0.0.0-stage → 0.1.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 (426) hide show
  1. package/CHANGELOG.md +474 -0
  2. package/LICENSE +21 -0
  3. package/README.md +25 -2
  4. package/bin/cockpit.mjs +33 -0
  5. package/cockpit.schema.json +2644 -0
  6. package/dist/autonomy.d.ts +45 -0
  7. package/dist/autonomy.js +173 -0
  8. package/dist/bounded-read.d.ts +14 -0
  9. package/dist/bounded-read.js +42 -0
  10. package/dist/browser/commands.d.ts +117 -0
  11. package/dist/browser/commands.js +453 -0
  12. package/dist/browser/package-paths.d.ts +1 -0
  13. package/dist/browser/package-paths.js +6 -0
  14. package/dist/browser/proxy.d.ts +22 -0
  15. package/dist/browser/proxy.js +37 -0
  16. package/dist/browser/runtime.d.ts +118 -0
  17. package/dist/browser/runtime.js +186 -0
  18. package/dist/browser/surfaces.d.ts +141 -0
  19. package/dist/browser/surfaces.js +561 -0
  20. package/dist/browser/ui-gate.d.ts +15 -0
  21. package/dist/browser/ui-gate.js +18 -0
  22. package/dist/canonical-json.d.ts +2 -0
  23. package/dist/canonical-json.js +5 -0
  24. package/dist/cli-guard.d.ts +5 -0
  25. package/dist/cli-guard.js +71 -0
  26. package/dist/cli-main.d.ts +176 -0
  27. package/dist/cli-main.js +1584 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.js +16 -0
  30. package/dist/command-table.d.ts +121 -0
  31. package/dist/command-table.js +664 -0
  32. package/dist/config/load.d.ts +183 -0
  33. package/dist/config/load.js +367 -0
  34. package/dist/config/sibling-toml.d.ts +48 -0
  35. package/dist/config/sibling-toml.js +160 -0
  36. package/dist/config/surface-tools-toml.d.ts +9 -0
  37. package/dist/config/surface-tools-toml.js +37 -0
  38. package/dist/config/unconfirmed-toml.d.ts +9 -0
  39. package/dist/config/unconfirmed-toml.js +29 -0
  40. package/dist/config/verified-write.d.ts +43 -0
  41. package/dist/config/verified-write.js +89 -0
  42. package/dist/diagnostics.d.ts +26 -0
  43. package/dist/diagnostics.js +344 -0
  44. package/dist/docs/check.d.ts +16 -0
  45. package/dist/docs/check.js +197 -0
  46. package/dist/docs/decision-record.d.ts +34 -0
  47. package/dist/docs/decision-record.js +135 -0
  48. package/dist/docs/decisions.d.ts +16 -0
  49. package/dist/docs/decisions.js +103 -0
  50. package/dist/docs/markdown.d.ts +36 -0
  51. package/dist/docs/markdown.js +88 -0
  52. package/dist/docs/references.d.ts +32 -0
  53. package/dist/docs/references.js +148 -0
  54. package/dist/emit.d.ts +22 -0
  55. package/dist/emit.js +43 -0
  56. package/dist/entrypoint-kinds.d.ts +3 -0
  57. package/dist/entrypoint-kinds.js +11 -0
  58. package/dist/environment/application/confirm.d.ts +35 -0
  59. package/dist/environment/application/confirm.js +122 -0
  60. package/dist/environment/application/destructive.d.ts +6 -0
  61. package/dist/environment/application/destructive.js +429 -0
  62. package/dist/environment/application/doctor.d.ts +94 -0
  63. package/dist/environment/application/doctor.js +247 -0
  64. package/dist/environment/application/guard.d.ts +49 -0
  65. package/dist/environment/application/guard.js +677 -0
  66. package/dist/environment/application/health.d.ts +143 -0
  67. package/dist/environment/application/health.js +385 -0
  68. package/dist/environment/application/lifecycle-context.d.ts +235 -0
  69. package/dist/environment/application/lifecycle-context.js +154 -0
  70. package/dist/environment/application/lifecycle-state.d.ts +25 -0
  71. package/dist/environment/application/lifecycle-state.js +202 -0
  72. package/dist/environment/application/lifecycle.d.ts +18 -0
  73. package/dist/environment/application/lifecycle.js +737 -0
  74. package/dist/environment/application/logs.d.ts +45 -0
  75. package/dist/environment/application/logs.js +127 -0
  76. package/dist/environment/application/services.d.ts +60 -0
  77. package/dist/environment/application/services.js +89 -0
  78. package/dist/environment/application/setup.d.ts +129 -0
  79. package/dist/environment/application/setup.js +741 -0
  80. package/dist/environment/application/shared.d.ts +11 -0
  81. package/dist/environment/application/shared.js +61 -0
  82. package/dist/environment/application/siblings.d.ts +43 -0
  83. package/dist/environment/application/siblings.js +269 -0
  84. package/dist/environment/claims.d.ts +389 -0
  85. package/dist/environment/claims.js +1701 -0
  86. package/dist/environment/codex-hook-trust.d.ts +11 -0
  87. package/dist/environment/codex-hook-trust.js +185 -0
  88. package/dist/environment/compose-environment.d.ts +1 -0
  89. package/dist/environment/compose-environment.js +6 -0
  90. package/dist/environment/compose-ownership.d.ts +21 -0
  91. package/dist/environment/compose-ownership.js +117 -0
  92. package/dist/environment/compose-topology.d.ts +125 -0
  93. package/dist/environment/compose-topology.js +490 -0
  94. package/dist/environment/contract.d.ts +522 -0
  95. package/dist/environment/contract.js +794 -0
  96. package/dist/environment/declaration.d.ts +14 -0
  97. package/dist/environment/declaration.js +39 -0
  98. package/dist/environment/destructive-composition.d.ts +29 -0
  99. package/dist/environment/destructive-composition.js +333 -0
  100. package/dist/environment/docker-daemon.d.ts +30 -0
  101. package/dist/environment/docker-daemon.js +78 -0
  102. package/dist/environment/docker-endpoint.d.ts +10 -0
  103. package/dist/environment/docker-endpoint.js +19 -0
  104. package/dist/environment/env-schema-observation.d.ts +46 -0
  105. package/dist/environment/env-schema-observation.js +241 -0
  106. package/dist/environment/evidence.d.ts +136 -0
  107. package/dist/environment/evidence.js +437 -0
  108. package/dist/environment/executable.d.ts +38 -0
  109. package/dist/environment/executable.js +190 -0
  110. package/dist/environment/generated-application/authorities.d.ts +5 -0
  111. package/dist/environment/generated-application/authorities.js +61 -0
  112. package/dist/environment/generated-application/bootstrap-skill.d.ts +16 -0
  113. package/dist/environment/generated-application/bootstrap-skill.js +328 -0
  114. package/dist/environment/generated-application/check.d.ts +13 -0
  115. package/dist/environment/generated-application/check.js +191 -0
  116. package/dist/environment/generated-application/custom-surface.d.ts +26 -0
  117. package/dist/environment/generated-application/custom-surface.js +289 -0
  118. package/dist/environment/generated-application/prepare.d.ts +29 -0
  119. package/dist/environment/generated-application/prepare.js +278 -0
  120. package/dist/environment/generated-application/publication.d.ts +33 -0
  121. package/dist/environment/generated-application/publication.js +547 -0
  122. package/dist/environment/generated-application/shared.d.ts +492 -0
  123. package/dist/environment/generated-application/shared.js +354 -0
  124. package/dist/environment/generated-application/surface-observation.d.ts +4 -0
  125. package/dist/environment/generated-application/surface-observation.js +69 -0
  126. package/dist/environment/generated-application/surface-outputs.d.ts +71 -0
  127. package/dist/environment/generated-application/surface-outputs.js +400 -0
  128. package/dist/environment/generated-application/surfaces.d.ts +3 -0
  129. package/dist/environment/generated-application/surfaces.js +704 -0
  130. package/dist/environment/generated-application/sync.d.ts +6 -0
  131. package/dist/environment/generated-application/sync.js +124 -0
  132. package/dist/environment/git-observation.d.ts +202 -0
  133. package/dist/environment/git-observation.js +553 -0
  134. package/dist/environment/health-composition.d.ts +12 -0
  135. package/dist/environment/health-composition.js +645 -0
  136. package/dist/environment/host-observation.d.ts +56 -0
  137. package/dist/environment/host-observation.js +52 -0
  138. package/dist/environment/identity.d.ts +48 -0
  139. package/dist/environment/identity.js +85 -0
  140. package/dist/environment/init-application.d.ts +333 -0
  141. package/dist/environment/init-application.js +726 -0
  142. package/dist/environment/install-policy-observation.d.ts +71 -0
  143. package/dist/environment/install-policy-observation.js +284 -0
  144. package/dist/environment/install-policy.d.ts +48 -0
  145. package/dist/environment/install-policy.js +96 -0
  146. package/dist/environment/instance.d.ts +33 -0
  147. package/dist/environment/instance.js +122 -0
  148. package/dist/environment/instruction-pointer.d.ts +19 -0
  149. package/dist/environment/instruction-pointer.js +144 -0
  150. package/dist/environment/lifecycle-composition.d.ts +31 -0
  151. package/dist/environment/lifecycle-composition.js +742 -0
  152. package/dist/environment/lifecycle-stage.d.ts +120 -0
  153. package/dist/environment/lifecycle-stage.js +408 -0
  154. package/dist/environment/lifecycle.d.ts +75 -0
  155. package/dist/environment/lifecycle.js +354 -0
  156. package/dist/environment/logs.d.ts +132 -0
  157. package/dist/environment/logs.js +519 -0
  158. package/dist/environment/map-limit.d.ts +2 -0
  159. package/dist/environment/map-limit.js +13 -0
  160. package/dist/environment/mcp-observation.d.ts +9 -0
  161. package/dist/environment/mcp-observation.js +46 -0
  162. package/dist/environment/observations.d.ts +46 -0
  163. package/dist/environment/observations.js +346 -0
  164. package/dist/environment/operator-application.d.ts +79 -0
  165. package/dist/environment/operator-application.js +197 -0
  166. package/dist/environment/ports.d.ts +182 -0
  167. package/dist/environment/ports.js +1205 -0
  168. package/dist/environment/posture-observation.d.ts +68 -0
  169. package/dist/environment/posture-observation.js +253 -0
  170. package/dist/environment/presence.d.ts +4 -0
  171. package/dist/environment/presence.js +26 -0
  172. package/dist/environment/read-composition.d.ts +32 -0
  173. package/dist/environment/read-composition.js +397 -0
  174. package/dist/environment/readiness-composition.d.ts +57 -0
  175. package/dist/environment/readiness-composition.js +151 -0
  176. package/dist/environment/reclaim.d.ts +370 -0
  177. package/dist/environment/reclaim.js +1940 -0
  178. package/dist/environment/repository-identity.d.ts +13 -0
  179. package/dist/environment/repository-identity.js +108 -0
  180. package/dist/environment/runtime-measurement-record.d.ts +38 -0
  181. package/dist/environment/runtime-measurement-record.js +111 -0
  182. package/dist/environment/runtime-measurement.d.ts +27 -0
  183. package/dist/environment/runtime-measurement.js +224 -0
  184. package/dist/environment/runtime-probe-residue.d.ts +43 -0
  185. package/dist/environment/runtime-probe-residue.js +148 -0
  186. package/dist/environment/runtime-probe.d.ts +72 -0
  187. package/dist/environment/runtime-probe.js +725 -0
  188. package/dist/environment/runtime.d.ts +551 -0
  189. package/dist/environment/runtime.js +2405 -0
  190. package/dist/environment/seed.d.ts +16 -0
  191. package/dist/environment/seed.js +43 -0
  192. package/dist/environment/selftest-application.d.ts +86 -0
  193. package/dist/environment/selftest-application.js +713 -0
  194. package/dist/environment/sensitive.d.ts +3 -0
  195. package/dist/environment/sensitive.js +48 -0
  196. package/dist/environment/served-checkout-grants.d.ts +53 -0
  197. package/dist/environment/served-checkout-grants.js +182 -0
  198. package/dist/environment/setup-observation.d.ts +62 -0
  199. package/dist/environment/setup-observation.js +1473 -0
  200. package/dist/environment/setup.d.ts +43 -0
  201. package/dist/environment/setup.js +176 -0
  202. package/dist/environment/sibling-checkouts.d.ts +119 -0
  203. package/dist/environment/sibling-checkouts.js +254 -0
  204. package/dist/environment/sibling-instructions.d.ts +33 -0
  205. package/dist/environment/sibling-instructions.js +224 -0
  206. package/dist/environment/sibling-observation.d.ts +27 -0
  207. package/dist/environment/sibling-observation.js +45 -0
  208. package/dist/environment/sibling-pull.d.ts +23 -0
  209. package/dist/environment/sibling-pull.js +95 -0
  210. package/dist/environment/sibling-registration.d.ts +45 -0
  211. package/dist/environment/sibling-registration.js +538 -0
  212. package/dist/environment/stack-inputs.d.ts +18 -0
  213. package/dist/environment/stack-inputs.js +210 -0
  214. package/dist/environment/stack-inventory-prune.d.ts +31 -0
  215. package/dist/environment/stack-inventory-prune.js +129 -0
  216. package/dist/environment/stack-inventory-report.d.ts +44 -0
  217. package/dist/environment/stack-inventory-report.js +78 -0
  218. package/dist/environment/stack-inventory.d.ts +94 -0
  219. package/dist/environment/stack-inventory.js +418 -0
  220. package/dist/environment/state.d.ts +410 -0
  221. package/dist/environment/state.js +2153 -0
  222. package/dist/environment/templates.d.ts +140 -0
  223. package/dist/environment/templates.js +685 -0
  224. package/dist/environment/tool-registration.d.ts +9 -0
  225. package/dist/environment/tool-registration.js +92 -0
  226. package/dist/environment/upgrade-application.d.ts +19 -0
  227. package/dist/environment/upgrade-application.js +175 -0
  228. package/dist/environment-exec/execute.d.ts +105 -0
  229. package/dist/environment-exec/execute.js +1179 -0
  230. package/dist/environment-exec/libexec-program.d.ts +6 -0
  231. package/dist/environment-exec/libexec-program.js +22 -0
  232. package/dist/environment-exec/verified-digest.d.ts +4 -0
  233. package/dist/environment-exec/verified-digest.js +16 -0
  234. package/dist/exact-keys.d.ts +7 -0
  235. package/dist/exact-keys.js +15 -0
  236. package/dist/fix-catalogue.d.ts +32 -0
  237. package/dist/fix-catalogue.js +60 -0
  238. package/dist/freshness.d.ts +29 -0
  239. package/dist/freshness.js +75 -0
  240. package/dist/generated-environment/adopt.d.ts +16 -0
  241. package/dist/generated-environment/adopt.js +271 -0
  242. package/dist/generated-environment/command.d.ts +47 -0
  243. package/dist/generated-environment/command.js +75 -0
  244. package/dist/generated-environment/transaction.d.ts +186 -0
  245. package/dist/generated-environment/transaction.js +1770 -0
  246. package/dist/grading/evaluate.d.ts +71 -0
  247. package/dist/grading/evaluate.js +403 -0
  248. package/dist/grading/grade.d.ts +33 -0
  249. package/dist/grading/grade.js +57 -0
  250. package/dist/guards/answer-confirmation.d.ts +41 -0
  251. package/dist/guards/answer-confirmation.js +109 -0
  252. package/dist/guards/evaluator.d.ts +130 -0
  253. package/dist/guards/evaluator.js +1258 -0
  254. package/dist/guards/harness-adapter.d.ts +17 -0
  255. package/dist/guards/harness-adapter.js +57 -0
  256. package/dist/guards/host.d.ts +8 -0
  257. package/dist/guards/host.js +10 -0
  258. package/dist/guards/invocation-parser.d.ts +66 -0
  259. package/dist/guards/invocation-parser.js +595 -0
  260. package/dist/guards/local-identity.d.ts +44 -0
  261. package/dist/guards/local-identity.js +129 -0
  262. package/dist/guards/policy-change.d.ts +43 -0
  263. package/dist/guards/policy-change.js +159 -0
  264. package/dist/guards/policy-pin.d.ts +13 -0
  265. package/dist/guards/policy-pin.js +177 -0
  266. package/dist/guards/protected-locations.d.ts +62 -0
  267. package/dist/guards/protected-locations.js +461 -0
  268. package/dist/guards/read-only.d.ts +37 -0
  269. package/dist/guards/read-only.js +315 -0
  270. package/dist/init/command.d.ts +41 -0
  271. package/dist/init/command.js +330 -0
  272. package/dist/init/derive.d.ts +53 -0
  273. package/dist/init/derive.js +819 -0
  274. package/dist/init/draft.d.ts +140 -0
  275. package/dist/init/draft.js +1228 -0
  276. package/dist/init/render.d.ts +47 -0
  277. package/dist/init/render.js +104 -0
  278. package/dist/init/scaffold.d.ts +53 -0
  279. package/dist/init/scaffold.js +121 -0
  280. package/dist/invocation.d.ts +13 -0
  281. package/dist/invocation.js +20 -0
  282. package/dist/package-metadata.d.ts +9 -0
  283. package/dist/package-metadata.js +19 -0
  284. package/dist/readiness.d.ts +53 -0
  285. package/dist/readiness.js +88 -0
  286. package/dist/references/named.d.ts +24 -0
  287. package/dist/references/named.js +27 -0
  288. package/dist/refusal.d.ts +15 -0
  289. package/dist/refusal.js +7 -0
  290. package/dist/registry-derivation.d.ts +31 -0
  291. package/dist/registry-derivation.js +32 -0
  292. package/dist/registry-resolve/command.d.ts +47 -0
  293. package/dist/registry-resolve/command.js +226 -0
  294. package/dist/registry-resolve/registry.d.ts +68 -0
  295. package/dist/registry-resolve/registry.js +292 -0
  296. package/dist/registry-resolve/render-shell.d.ts +18 -0
  297. package/dist/registry-resolve/render-shell.js +36 -0
  298. package/dist/repair.d.ts +29 -0
  299. package/dist/repair.js +8 -0
  300. package/dist/repository-path.d.ts +9 -0
  301. package/dist/repository-path.js +16 -0
  302. package/dist/schema-json.d.ts +1 -0
  303. package/dist/schema-json.js +177 -0
  304. package/dist/schema.d.ts +1289 -0
  305. package/dist/schema.js +985 -0
  306. package/dist/setup/command.d.ts +4 -0
  307. package/dist/setup/command.js +4 -0
  308. package/dist/sha256.d.ts +1 -0
  309. package/dist/sha256.js +4 -0
  310. package/dist/surfaces/adoption.d.ts +41 -0
  311. package/dist/surfaces/adoption.js +217 -0
  312. package/dist/surfaces/consumer-instructions.d.ts +20 -0
  313. package/dist/surfaces/consumer-instructions.js +43 -0
  314. package/dist/surfaces/contract.d.ts +42 -0
  315. package/dist/surfaces/contract.js +169 -0
  316. package/dist/surfaces/core-declarations.d.ts +24 -0
  317. package/dist/surfaces/core-declarations.js +79 -0
  318. package/dist/surfaces/development-markers.d.ts +1 -0
  319. package/dist/surfaces/development-markers.js +18 -0
  320. package/dist/surfaces/generator-adapter.d.ts +71 -0
  321. package/dist/surfaces/generator-adapter.js +809 -0
  322. package/dist/surfaces/harness-registry.d.ts +260 -0
  323. package/dist/surfaces/harness-registry.js +146 -0
  324. package/dist/surfaces/mcp.d.ts +145 -0
  325. package/dist/surfaces/mcp.js +349 -0
  326. package/dist/surfaces/merge.d.ts +30 -0
  327. package/dist/surfaces/merge.js +105 -0
  328. package/dist/surfaces/ownership.d.ts +190 -0
  329. package/dist/surfaces/ownership.js +795 -0
  330. package/dist/surfaces/projection.d.ts +136 -0
  331. package/dist/surfaces/projection.js +716 -0
  332. package/dist/surfaces/render.d.ts +79 -0
  333. package/dist/surfaces/render.js +636 -0
  334. package/dist/surfaces/restrictions.d.ts +130 -0
  335. package/dist/surfaces/restrictions.js +447 -0
  336. package/dist/surfaces/selftest.d.ts +162 -0
  337. package/dist/surfaces/selftest.js +393 -0
  338. package/dist/surfaces/skill-contract.d.ts +85 -0
  339. package/dist/surfaces/skill-contract.js +449 -0
  340. package/dist/surfaces/sync.d.ts +57 -0
  341. package/dist/surfaces/sync.js +164 -0
  342. package/dist/team-metadata.d.ts +41 -0
  343. package/dist/team-metadata.js +513 -0
  344. package/dist/testing/gates.d.ts +91 -0
  345. package/dist/testing/gates.js +182 -0
  346. package/dist/testing/hooks.d.ts +59 -0
  347. package/dist/testing/hooks.js +139 -0
  348. package/dist/testing/test-protection.d.ts +34 -0
  349. package/dist/testing/test-protection.js +137 -0
  350. package/dist/testing/verdict.d.ts +29 -0
  351. package/dist/testing/verdict.js +62 -0
  352. package/dist/testing/weakening.d.ts +15 -0
  353. package/dist/testing/weakening.js +30 -0
  354. package/dist/work-orders/application-closure.d.ts +7 -0
  355. package/dist/work-orders/application-closure.js +76 -0
  356. package/dist/work-orders/application-context.d.ts +162 -0
  357. package/dist/work-orders/application-context.js +137 -0
  358. package/dist/work-orders/application-decisions.d.ts +27 -0
  359. package/dist/work-orders/application-decisions.js +121 -0
  360. package/dist/work-orders/application-grading.d.ts +11 -0
  361. package/dist/work-orders/application-grading.js +212 -0
  362. package/dist/work-orders/application.d.ts +6 -0
  363. package/dist/work-orders/application.js +223 -0
  364. package/dist/work-orders/composition.d.ts +101 -0
  365. package/dist/work-orders/composition.js +1202 -0
  366. package/dist/work-orders/contract.d.ts +77 -0
  367. package/dist/work-orders/contract.js +140 -0
  368. package/dist/work-orders/decisions.d.ts +23 -0
  369. package/dist/work-orders/decisions.js +55 -0
  370. package/dist/work-orders/store.d.ts +207 -0
  371. package/dist/work-orders/store.js +291 -0
  372. package/docs/README.md +68 -0
  373. package/docs/architecture.md +136 -0
  374. package/docs/capability-matrix.md +58 -0
  375. package/docs/cli-reference.md +807 -0
  376. package/docs/command-list.md +62 -0
  377. package/docs/compose-patterns.md +99 -0
  378. package/docs/concepts.md +173 -0
  379. package/docs/configuration-essentials.md +177 -0
  380. package/docs/configuration-reference.md +636 -0
  381. package/docs/docs-check.md +76 -0
  382. package/docs/environment.md +948 -0
  383. package/docs/extending.md +43 -0
  384. package/docs/faq.md +113 -0
  385. package/docs/getting-started.md +692 -0
  386. package/docs/harness-surfaces.md +500 -0
  387. package/docs/joining-a-team.md +76 -0
  388. package/docs/release-policy.md +49 -0
  389. package/docs/safety-and-autonomy.md +463 -0
  390. package/docs/troubleshooting.md +382 -0
  391. package/docs/tutorial.md +171 -0
  392. package/docs/work-and-browser.md +420 -0
  393. package/libexec/browser-operation.cjs +270 -0
  394. package/libexec/fence-marker.cjs +101 -0
  395. package/libexec/fence-marker.d.cts +24 -0
  396. package/libexec/fenced-group-runner.cjs +77 -0
  397. package/libexec/fenced-supervisor.cjs +137 -0
  398. package/libexec/generated-filesystem.cjs +731 -0
  399. package/libexec/install-filesystem.cjs +225 -0
  400. package/libexec/rulesync-generator.NOTICE.md +1112 -0
  401. package/libexec/rulesync-generator.cjs +743 -0
  402. package/libexec/surface-generator-worker.cjs +266 -0
  403. package/libexec/surface-output-reader.cjs +99 -0
  404. package/libexec/surface-scratch-cleanup.cjs +14 -0
  405. package/libexec/validate-harness-evidence.d.mts +183 -0
  406. package/libexec/validate-harness-evidence.mjs +1312 -0
  407. package/package.json +74 -4
  408. package/surfaces/README.md +33 -0
  409. package/surfaces/agents/evaluator.agent.md +76 -0
  410. package/surfaces/guards/bash-guard.sh +48 -0
  411. package/surfaces/guards/claude.adapter.json +25 -0
  412. package/surfaces/guards/codex.adapter.json +24 -0
  413. package/surfaces/guards/opencode.adapter.json +25 -0
  414. package/surfaces/references/browser.md +63 -0
  415. package/surfaces/references/test-data-and-personas.md +84 -0
  416. package/surfaces/references/testing-tiers.md +11 -0
  417. package/surfaces/skills/cockpit-browser.skill.md +59 -0
  418. package/surfaces/skills/cockpit-explain.skill.md +32 -0
  419. package/surfaces/skills/cockpit-fix.skill.md +37 -0
  420. package/surfaces/skills/cockpit-setup.skill.md +39 -0
  421. package/surfaces/skills/cockpit-work.skill.md +34 -0
  422. package/surfaces/skills/collection.json +5 -0
  423. package/surfaces/skills/procedures/explain.md +66 -0
  424. package/surfaces/skills/procedures/fix.md +95 -0
  425. package/surfaces/skills/procedures/setup.md +452 -0
  426. package/surfaces/skills/procedures/work.md +134 -0
@@ -0,0 +1,400 @@
1
+ import { join } from 'node:path';
2
+ import { parse as parseToml, stringify as stringifyToml } from 'smol-toml';
3
+ import { parseDocument } from 'yaml';
4
+ import { SURFACE_TARGETS } from '../../surfaces/contract.js';
5
+ import { harnessFact, isGuardSurfaceTarget } from '../../surfaces/harness-registry.js';
6
+ import { RULESYNC_VERSION } from '../../surfaces/generator-adapter.js';
7
+ import { hasTargetMcpServers } from '../../surfaces/mcp.js';
8
+ import { codexWritableRoot, shippedInstructionCapabilities } from '../../surfaces/projection.js';
9
+ import { surfaceModelSha256 } from '../../surfaces/render.js';
10
+ import { GUARD_LOCAL_PATHS } from '../../guards/local-identity.js';
11
+ import { RefusalError, tryParseJson } from '../contract.js';
12
+ import { compareCodeUnits, ownRecord, sha256 } from './shared.js';
13
+ export function expectedSurfaceOutputs(tools, features, sources) {
14
+ const has = (feature) => features.includes(feature);
15
+ const hasFor = (target, feature) => has(feature)
16
+ && harnessFact(target).rulesyncFeatures.some(candidate => candidate === feature);
17
+ const names = (prefix, suffix) => sources.filter(source => source.path.startsWith(prefix))
18
+ .map(source => source.path.slice(prefix.length, suffix.length === 0 ? undefined : -suffix.length));
19
+ const skills = sources.filter(source => source.path.startsWith('skills/')).map(source => source.path.slice('skills/'.length));
20
+ const permissionRulesForTarget = (target) => {
21
+ const permissionSource = sources.find(source => source.path === 'permissions.jsonc');
22
+ if (!permissionSource)
23
+ return false;
24
+ const source = ownRecord(JSON.parse(permissionSource.bytes));
25
+ const sections = [ownRecord(source?.permission), ownRecord(ownRecord(source?.[target])?.permission)];
26
+ return sections.some(permission => permission !== undefined && Object.values(permission).some(value => {
27
+ const rules = ownRecord(value);
28
+ return rules !== undefined && Object.keys(rules).length > 0;
29
+ }));
30
+ };
31
+ const rows = Object.fromEntries(SURFACE_TARGETS.map(target => [target, []]));
32
+ if (has('rules'))
33
+ for (const target of SURFACE_TARGETS) {
34
+ if (!hasFor(target, 'rules'))
35
+ continue;
36
+ const root = harnessFact(target).outputs.instruction;
37
+ if (target === 'cursor')
38
+ rows[target].push(...names('rules/', '.md').map(name => `${root}/${name}.mdc`));
39
+ else
40
+ rows[target].push(root);
41
+ }
42
+ if (has('mcp'))
43
+ for (const target of SURFACE_TARGETS) {
44
+ if (hasFor(target, 'mcp') && hasTargetMcpServers(sources, target))
45
+ rows[target].push(harnessFact(target).outputs.mcp);
46
+ }
47
+ if (has('hooks'))
48
+ rows.claudecode.push('.claude/settings.json'), rows.codexcli.push('.codex/hooks.json'), rows.opencode.push('.opencode/plugins/rulesync-hooks.js');
49
+ if (has('hooks'))
50
+ rows.cursor.push('.cursor/hooks.json'), rows.grokcli.push('.grok/hooks/rulesync.json');
51
+ if (has('permissions'))
52
+ for (const target of SURFACE_TARGETS) {
53
+ if (!hasFor(target, 'permissions'))
54
+ continue;
55
+ if ((target !== 'codexcli' && target !== 'grokcli') || permissionRulesForTarget(target)) {
56
+ rows[target].push(...harnessFact(target).outputs.permissions);
57
+ }
58
+ }
59
+ if (has('subagents'))
60
+ for (const name of names('subagents/', '.md')) {
61
+ rows.claudecode.push(`.claude/agents/${name}.md`);
62
+ rows.codexcli.push(`.codex/agents/${name}.toml`);
63
+ rows.opencode.push(`.opencode/agents/${name}.md`);
64
+ rows.cursor.push(`.cursor/agents/${name}.md`);
65
+ rows.grokcli.push(`.grok/agents/${name}.md`);
66
+ }
67
+ if (has('skills'))
68
+ for (const path of skills) {
69
+ rows.claudecode.push(`.claude/skills/${path}`);
70
+ rows.codexcli.push(`.agents/skills/${path}`);
71
+ const source = sources.find(candidate => candidate.path === `skills/${path}`);
72
+ if (path.endsWith('/SKILL.md') && source && expectsCodexSkillSidecar(source.bytes)) {
73
+ rows.codexcli.push(`.agents/skills/${path.slice(0, -'SKILL.md'.length)}agents/openai.yaml`);
74
+ }
75
+ rows.opencode.push(`.opencode/skills/${path}`);
76
+ rows.cursor.push(`.cursor/skills/${path}`);
77
+ rows.grokcli.push(`.grok/skills/${path}`);
78
+ }
79
+ return Object.fromEntries(tools.map(target => [target, [...new Set(rows[target])].sort(compareCodeUnits)]));
80
+ }
81
+ export function expectedClaudePluginOutputs(features, sources) {
82
+ const rows = [];
83
+ if (features.includes('mcp'))
84
+ rows.push('.mcp.json');
85
+ if (features.includes('hooks'))
86
+ rows.push('hooks/hooks.json');
87
+ if (features.includes('subagents'))
88
+ for (const source of sources.filter(row => row.path.startsWith('subagents/'))) {
89
+ rows.push(`agents/${source.path.slice('subagents/'.length)}`);
90
+ }
91
+ if (features.includes('skills'))
92
+ for (const source of sources.filter(row => row.path.startsWith('skills/'))) {
93
+ rows.push(source.path);
94
+ }
95
+ return [...new Set(rows)].sort(compareCodeUnits);
96
+ }
97
+ export function claudePluginManifest() {
98
+ const bytes = `${JSON.stringify({
99
+ name: 'cockpit-surfaces',
100
+ description: 'Generated cockpit agent surfaces.',
101
+ }, null, 2)}\n`;
102
+ return { bytes, sha256: sha256(bytes) };
103
+ }
104
+ // A rules overlay is written into the instruction file every harness loads at start, so Rulesync
105
+ // must see it as a root rule. A rule that already says `root: false` (Rulesync's default spelling)
106
+ // is still always loaded; one that narrows itself with `globs` cannot be, so it is refused by name
107
+ // rather than published as a rule that silently applies everywhere.
108
+ export function alwaysLoadedRule(bytes) {
109
+ if (!bytes.startsWith('---\n'))
110
+ return { kind: 'complete', bytes: `---\nroot: true\ntargets: ["*"]\n---\n${bytes}` };
111
+ const end = bytes.indexOf('\n---\n', 4);
112
+ if (end < 0)
113
+ return { kind: 'refusal', reason: 'opens a frontmatter block that never closes with a `---` line' };
114
+ const document = parseDocument(bytes.slice(4, end + 1), { uniqueKeys: true });
115
+ const frontmatter = document.errors.length === 0 ? document.toJS({ maxAliasCount: 0 }) : undefined;
116
+ if (!frontmatter || typeof frontmatter !== 'object' || Array.isArray(frontmatter)) {
117
+ return { kind: 'refusal', reason: 'has frontmatter that is not a YAML mapping' };
118
+ }
119
+ const { globs } = frontmatter;
120
+ if (globs !== undefined && !(Array.isArray(globs) && globs.every(glob => glob === '**/*' || glob === '**'))) {
121
+ return { kind: 'refusal', reason: 'limits itself to files with `globs`, but cockpit writes rules overlays into the instruction file every harness loads for every file' };
122
+ }
123
+ document.set('root', true);
124
+ if (!document.has('targets'))
125
+ document.set('targets', ['*']);
126
+ return { kind: 'complete', bytes: `---\n${document.toString()}---\n${bytes.slice(end + 5)}` };
127
+ }
128
+ function expectsCodexSkillSidecar(bytes) {
129
+ if (!bytes.startsWith('---\n'))
130
+ return false;
131
+ const end = bytes.indexOf('\n---\n', 4);
132
+ if (end < 0)
133
+ return false;
134
+ let frontmatter;
135
+ try {
136
+ const document = parseDocument(bytes.slice(4, end), { uniqueKeys: true });
137
+ if (document.errors.length > 0)
138
+ return false;
139
+ frontmatter = document.toJS({ maxAliasCount: 0 });
140
+ }
141
+ catch { /* unparseable input is malformed; the caller refuses it. */
142
+ return false;
143
+ }
144
+ if (!frontmatter || typeof frontmatter !== 'object' || Array.isArray(frontmatter))
145
+ return false;
146
+ const codexcli = frontmatter.codexcli;
147
+ if (!codexcli || typeof codexcli !== 'object' || Array.isArray(codexcli))
148
+ return false;
149
+ const metadata = codexcli;
150
+ const sections = ['interface', 'policy', 'dependencies'].map(key => metadata[key]);
151
+ const records = sections.filter((section) => section !== null && typeof section === 'object' && !Array.isArray(section));
152
+ return records.some(section => Object.keys(section).length > 0)
153
+ || records.length > 0 && typeof metadata['short-description'] === 'string';
154
+ }
155
+ export function emptyGeneration() {
156
+ return {
157
+ kind: 'complete', status: 0, diagnostics: [],
158
+ mechanism: { package: 'rulesync', version: RULESYNC_VERSION, role: 'spelling' },
159
+ files: [],
160
+ };
161
+ }
162
+ /**
163
+ * Claude Code's native Read, Grep and Glob tools never reach the guard hook, so the read denial the
164
+ * hook applies to shell commands is restated as Claude `Read` deny rules for every declared
165
+ * instance, mounted or not: an instance is readable by the native tools whether or not a directory
166
+ * grant names its sibling, and an earlier rule set that followed grants left host-mounted and root
167
+ * instances readable. Siblings sit outside the project root, where neither `./`, `/..` nor `../`
168
+ * rules match and an absolute path would differ per clone, so each rule is anchored with `//**` on
169
+ * the sibling-relative suffix; an instance in the cockpit root itself is anchored at the project
170
+ * root with `/`. Measured on Claude Code 2.1.314, 2026-10-30, with an unruled control file beside
171
+ * them: `//**` rules refused Read and Grep of sibling instances and of nested `.secrets` files, and
172
+ * `/` rules refused root files, while the control stayed readable. Over-matching a deny is safe;
173
+ * glob metacharacters in a path become `?` so a literal bracket cannot narrow the rule.
174
+ *
175
+ * Every `.env` and `.env.*` file is denied too, as the guard denies it. Claude applies a deny before
176
+ * any allow, so these rules cannot carve out the documentation names the guard exempts: Claude's own
177
+ * tools refuse `.env.example` and declared templates as well, which a shell `cat` still reads.
178
+ */
179
+ function claudeReadDenials(siblings, instances) {
180
+ const literal = (path) => path.replace(/[*?[\]\\!#()]/g, '?');
181
+ const rules = ['//**/.secrets/**', '//**/.env', '//**/.env.*', ...instanceReadPaths(siblings, instances)
182
+ .map(row => row.inRoot ? `/${literal(row.path)}` : `//**/${literal(row.path)}`)];
183
+ return [...new Set(rules)].sort(compareCodeUnits);
184
+ }
185
+ /**
186
+ * Each declared instance by the path that is the same in every clone: relative to the cockpit root
187
+ * for an instance there, otherwise the sibling-relative suffix with `..` and `.` segments dropped.
188
+ */
189
+ function instanceReadPaths(siblings, instances) {
190
+ return instances.map(instance => {
191
+ const sibling = siblings.find(row => row.slug === instance.slug);
192
+ if (!sibling)
193
+ throw new RefusalError(`declared instance ${instance.path} names sibling ${instance.slug}, whose directory was not authenticated`);
194
+ if (sibling.path === '')
195
+ return { inRoot: true, path: instance.path };
196
+ const suffix = [...sibling.path.split('/'), ...instance.path.split('/')].filter(part => part !== '..' && part !== '.' && part !== '');
197
+ return { inRoot: false, path: suffix.join('/') };
198
+ });
199
+ }
200
+ const OPENCODE_CONFIG_SCHEMA = 'https://opencode.ai/config.json';
201
+ /**
202
+ * OpenCode's native read tool asks its `read` permission with the file path relative to the Git
203
+ * worktree, and its `*` matches across `/`, so each protected path is denied both as written and
204
+ * below any prefix: that covers a cockpit root nested in a larger repository and siblings reached
205
+ * through `../`. Only `*` and `?` are pattern characters there; either one in a path becomes `?`,
206
+ * which over-matches a deny and so stays safe. The plugin's guard routing refuses the same reads,
207
+ * case-folded; these rules still deny the declared spellings when the plugin cannot load.
208
+ */
209
+ export function openCodeReadDenials(siblings, instances) {
210
+ const literal = (path) => path.replace(/[*?]/g, '?');
211
+ const paths = ['.secrets/*', ...instanceReadPaths(siblings, instances).map(row => literal(row.path))];
212
+ return [...new Set(paths.flatMap(path => [path, `*/${path}`]))].sort(compareCodeUnits);
213
+ }
214
+ /** The machine-local file `sync` writes with a sibling's absolute directory, for OpenCode to read. */
215
+ export function openCodeGrantFile(slug) {
216
+ return `${GUARD_LOCAL_PATHS.directory}/opencode-grant-${slug}`;
217
+ }
218
+ // OpenCode matches `external_directory` patterns against absolute paths and has no token for the
219
+ // project root, so `../api/**` never matches (measured with OpenCode 1.19.4 on 2026-11-02). The
220
+ // committed pattern names a machine-local file instead; OpenCode substitutes `{file:...}` relative
221
+ // to the config file, and refuses to start, naming the file, while it is missing.
222
+ function openCodeExternalDirectories(grants) {
223
+ return Object.fromEntries([...new Set(grants.filter(grant => grant.target === 'opencode')
224
+ .map(grant => `{file:${openCodeGrantFile(grant.slug)}}/**`))].sort(compareCodeUnits).map(pattern => [pattern, 'allow']));
225
+ }
226
+ // The cockpit commands the shipped skills tell an agent to run and the guard admits without a
227
+ // prompt. Claude Code allows nothing in its default mode without a rule, so a headless session was
228
+ // denied even `test-run` from its own skill. A rule only lets Claude run the command without asking:
229
+ // the guard hook still runs first, and its ask or deny wins over the rule, so a command whose
230
+ // decider the [work.gates] or [autonomy] policy makes a person still asks. Commands that are always
231
+ // a person's (`init`, `sibling add`) are left out so they keep asking; `down` keeps the data volumes. Measured with Claude Code 2.1.316 on 2026-11-02 beside an unruled control: `Bash(<prefix> *)`
232
+ // ran a matching command headless, the control and a chain with an unmatched part were denied, a hook
233
+ // `ask` denied a matching command, and Claude ignores these rules until a person trusts the workspace.
234
+ const AGENT_COCKPIT_COMMANDS = [
235
+ 'check *', 'confirm *', 'doctor *', 'preflight *', 'logs *', 'ps *', 'restart *', 'rebuild *', 'exec *', 'sync *', 'reset * --apply', 'up *', 'sleep *', 'down *',
236
+ 'runtime measure *', 'test-run *',
237
+ 'work status *', 'work accept *', 'work check *', 'work note *', 'work decide *', 'work answer *', 'work acknowledge *', 'work grade *', 'work signoff *', 'work recover *',
238
+ 'work verify *', 'grade *', 'upgrade *', 'docs check *', 'use *', 'pull *', 'stacks *',
239
+ 'browser drive *', 'browser screenshot *',
240
+ ];
241
+ function claudeCommandAllowances() {
242
+ return Object.fromEntries(['npx --no cockpit', './node_modules/.bin/cockpit']
243
+ .flatMap(launcher => AGENT_COCKPIT_COMMANDS.map(command => [`${launcher} ${command}`, 'allow'])));
244
+ }
245
+ // What each harness loads at start, from the dated instruction-loading runs. Claude Code applies a
246
+ // scoped rule only to matching files, so a scoped source counts separately there.
247
+ export const GUIDE_LOAD_CHARACTERIZATIONS = Object.freeze(Object.fromEntries(shippedInstructionCapabilities()
248
+ .filter(fact => isGuardSurfaceTarget(fact.target))
249
+ .map(fact => [fact.target, {
250
+ measuredOn: fact.characterizedOn, metric: 'lines', scopeSemantics: fact.target === 'claudecode' ? 'conditional' : 'full',
251
+ provenance: fact.provenance,
252
+ }])));
253
+ export function nativeSources(mcp, grants, siblings, instances) {
254
+ const sources = [];
255
+ const transports = mcp.result.harnesses.flatMap(row => row.servers);
256
+ // A remote server no listed tool can carry is left out of the source entirely.
257
+ const written = mcp.result.servers.flatMap(model => transports.filter(server => server.name === model.name).slice(0, 1));
258
+ if (written.length > 0) {
259
+ const native = (server, helperKey) => 'url' in server
260
+ ? { type: 'http', url: server.url, ...(Object.keys(server.headers).length > 0 ? { headers: server.headers } : {}),
261
+ ...(server.headersHelper === null ? {} : { [helperKey]: server.headersHelper }), disabled: !server.enabled }
262
+ : { type: 'stdio', command: server.command, args: server.args, disabled: !server.enabled };
263
+ const servers = Object.fromEntries(written.map(server => [server.name, native(server, 'headersHelper')]));
264
+ const targets = Object.fromEntries(mcp.result.harnesses.flatMap(row => {
265
+ const removed = written.filter(server => !row.servers.some(transport => transport.name === server.name))
266
+ .map(server => [server.name, null]);
267
+ // Codex spells Claude Code's headersHelper http_headers_helper; Rulesync passes an unknown
268
+ // key through to config.toml unchanged.
269
+ const respelled = row.target === 'codexcli'
270
+ ? row.servers.filter(server => 'url' in server && server.headersHelper !== null).map(server => [server.name, native(server, 'http_headers_helper')])
271
+ : [];
272
+ return removed.length + respelled.length > 0 ? [[harnessFact(row.target).rulesyncTarget, {
273
+ mcpServers: Object.fromEntries([...removed, ...respelled]),
274
+ }]] : [];
275
+ }));
276
+ sources.push({ path: 'mcp.jsonc', bytes: `${JSON.stringify({ mcpServers: servers, ...targets }, null, 2)}\n` });
277
+ }
278
+ const paths = (target) => [...new Set(grants.filter(grant => grant.target === target).map(grant => grant.path))].sort(compareCodeUnits);
279
+ const claudeServers = mcp.result.harnesses.find(row => row.target === 'claudecode')?.servers ?? [];
280
+ const enabledMcpjsonServers = claudeServers.filter(server => server.enabled).map(server => server.name).sort();
281
+ // Claude Code ignores `disabled` in `.mcp.json` and offers an unlisted server for one-click
282
+ // approval; only this list keeps it off (measured with Claude Code 2.1.316 on 2026-11-02).
283
+ const disabledMcpjsonServers = claudeServers.filter(server => !server.enabled).map(server => server.name).sort();
284
+ sources.push({ path: 'permissions.jsonc', bytes: `${JSON.stringify({
285
+ permission: {},
286
+ claudecode: {
287
+ permission: {
288
+ read: Object.fromEntries(claudeReadDenials(siblings, instances).map(rule => [rule, 'deny'])),
289
+ bash: claudeCommandAllowances(),
290
+ },
291
+ permissions: { additionalDirectories: paths('claudecode') },
292
+ enabledMcpjsonServers,
293
+ ...(disabledMcpjsonServers.length > 0 ? { disabledMcpjsonServers } : {}),
294
+ },
295
+ opencode: {
296
+ permission: { external_directory: openCodeExternalDirectories(grants) },
297
+ },
298
+ cursor: {
299
+ permission: {
300
+ read: Object.fromEntries(paths('cursor').map(path => [`${path}/**`, 'allow'])),
301
+ write: Object.fromEntries(paths('cursor').map(path => [`${path}/**`, 'allow'])),
302
+ },
303
+ },
304
+ grokcli: {
305
+ permission: {
306
+ read: Object.fromEntries(paths('grokcli').map(path => [`${path}/**`, 'allow'])),
307
+ edit: Object.fromEntries(paths('grokcli').map(path => [`${path}/**`, 'allow'])),
308
+ },
309
+ },
310
+ }, null, 2)}\n` });
311
+ return sources;
312
+ }
313
+ export function nativeFragmentSet(generated, model, paths) {
314
+ const modelSha256 = surfaceModelSha256(model);
315
+ if (!modelSha256)
316
+ return undefined;
317
+ const fragments = Object.entries(paths).map(([target, path]) => {
318
+ const row = generated.files.find(candidate => candidate.target === target && candidate.path === path);
319
+ return row ? { target: target, path, baseSha256: row.sha256, bytes: row.bytes, sha256: row.sha256 } : undefined;
320
+ });
321
+ if (fragments.some(fragment => fragment === undefined))
322
+ return undefined;
323
+ return { modelSha256, fragments: fragments };
324
+ }
325
+ export function nativeGrantFragmentSet(generated, grants, paths, openCodeReads) {
326
+ const modelSha256 = surfaceModelSha256(grants);
327
+ if (!modelSha256)
328
+ return undefined;
329
+ const fragments = Object.entries(paths).map(([target, path]) => {
330
+ const row = generated.files.find(candidate => candidate.target === target && candidate.path === path);
331
+ if (target !== 'opencode' && target !== 'codexcli') {
332
+ return row ? { target: target, path, baseSha256: row.sha256, bytes: row.bytes, sha256: row.sha256 } : undefined;
333
+ }
334
+ if (target === 'codexcli') {
335
+ let base = {};
336
+ if (row) {
337
+ try {
338
+ const parsed = ownRecord(parseToml(row.bytes));
339
+ if (!parsed)
340
+ return undefined;
341
+ base = parsed;
342
+ }
343
+ catch { /* unparseable input is malformed; the caller refuses it. */
344
+ return undefined;
345
+ }
346
+ if (['sandbox_mode', 'sandbox_workspace_write', 'default_permissions', 'permissions']
347
+ .some(key => Object.hasOwn(base, key)))
348
+ return undefined;
349
+ }
350
+ // Codex permission profiles reject the `..` segment required by a portable sibling
351
+ // grant. Publish the core-owned workspace-write settings alone: mixing the legacy
352
+ // sandbox with a generated profile would make Codex ignore that profile.
353
+ // Codex resolves a relative writable root against the directory of the config file,
354
+ // `.codex/`, not the cockpit root (measured with Codex 0.166.0 on 2026-11-02).
355
+ const writableRoots = [...new Set(grants.filter(grant => grant.target === target)
356
+ .map(grant => codexWritableRoot(grant.path)))].sort(compareCodeUnits);
357
+ const bytes = stringifyToml({ ...base, sandbox_mode: 'workspace-write', sandbox_workspace_write: { writable_roots: writableRoots } });
358
+ return { target: target, path, baseSha256: row?.sha256 ?? sha256(''), bytes, sha256: sha256(bytes) };
359
+ }
360
+ let base = {};
361
+ if (row) {
362
+ const parsed = ownRecord(tryParseJson(row.bytes));
363
+ if (!parsed)
364
+ return undefined;
365
+ base = parsed;
366
+ if (Object.hasOwn(base, 'permission'))
367
+ return undefined;
368
+ }
369
+ const externalDirectory = openCodeExternalDirectories(grants);
370
+ const read = Object.fromEntries(openCodeReads.map(rule => [rule, 'deny']));
371
+ // OpenCode writes `$schema` into a project config that lacks it at every start, which put an
372
+ // unowned member before the owned region; supplying OpenCode's exact value leaves it untouched.
373
+ const bytes = `${JSON.stringify({ $schema: OPENCODE_CONFIG_SCHEMA, ...base, permission: { external_directory: externalDirectory, read } }, null, 2)}\n`;
374
+ return { target: target, path, baseSha256: row?.sha256 ?? sha256(''), bytes, sha256: sha256(bytes) };
375
+ });
376
+ if (fragments.some(fragment => fragment === undefined))
377
+ return undefined;
378
+ return { modelSha256, fragments: fragments };
379
+ }
380
+ export function bindNativeGrantsToMcp(mcp, grants) {
381
+ const replacements = new Map();
382
+ for (const base of mcp.fragments) {
383
+ const grant = grants.fragments.find(fragment => fragment.target === base.target && fragment.path === base.path);
384
+ if (!grant)
385
+ continue;
386
+ if (grant.baseSha256 !== base.sha256)
387
+ return undefined;
388
+ replacements.set(`${base.target}\0${base.path}`, grant);
389
+ }
390
+ return { ...mcp, fragments: mcp.fragments.map(fragment => {
391
+ const grant = replacements.get(`${fragment.target}\0${fragment.path}`);
392
+ return grant ? { ...fragment, bytes: grant.bytes, sha256: grant.sha256 } : fragment;
393
+ }) };
394
+ }
395
+ export function nativeMcpPaths(targets) {
396
+ return Object.fromEntries(targets.map(target => [target, harnessFact(target).outputs.mcp]));
397
+ }
398
+ export function nativeGrantPaths(targets) {
399
+ return Object.fromEntries(targets.map(target => [target, harnessFact(target).outputs.permissions[0]]));
400
+ }
@@ -0,0 +1,3 @@
1
+ import { type OwnershipManifest, type SurfacePriorOwnedEntry } from '../../surfaces/ownership.js';
2
+ import { type GeneratedEnvironmentCommandAdapters, type PreparedEnvironment, type RefusalOutcome } from './shared.js';
3
+ export declare function prepareSurfaces(prepared: PreparedEnvironment, priorOwned: readonly SurfacePriorOwnedEntry[], adapters: GeneratedEnvironmentCommandAdapters, manifest?: OwnershipManifest): Promise<PreparedEnvironment | RefusalOutcome>;