@b00dea/cockpit 0.0.0-stage → 0.1.0

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 (363) hide show
  1. package/CHANGELOG.md +375 -0
  2. package/LICENSE +21 -0
  3. package/README.md +22 -2
  4. package/bin/cockpit.mjs +33 -0
  5. package/cockpit.schema.json +2574 -0
  6. package/dist/autonomy.d.ts +44 -0
  7. package/dist/autonomy.js +156 -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 +62 -0
  11. package/dist/browser/commands.js +349 -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 +117 -0
  17. package/dist/browser/runtime.js +183 -0
  18. package/dist/browser/surfaces.d.ts +141 -0
  19. package/dist/browser/surfaces.js +556 -0
  20. package/dist/browser/ui-gate.d.ts +15 -0
  21. package/dist/browser/ui-gate.js +18 -0
  22. package/dist/cli-guard.d.ts +5 -0
  23. package/dist/cli-guard.js +71 -0
  24. package/dist/cli-main.d.ts +139 -0
  25. package/dist/cli-main.js +1405 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.js +16 -0
  28. package/dist/command-table.d.ts +113 -0
  29. package/dist/command-table.js +512 -0
  30. package/dist/config/load.d.ts +171 -0
  31. package/dist/config/load.js +345 -0
  32. package/dist/config/sibling-toml.d.ts +48 -0
  33. package/dist/config/sibling-toml.js +160 -0
  34. package/dist/config/surface-tools-toml.d.ts +9 -0
  35. package/dist/config/surface-tools-toml.js +37 -0
  36. package/dist/config/verified-write.d.ts +43 -0
  37. package/dist/config/verified-write.js +89 -0
  38. package/dist/diagnostics.d.ts +26 -0
  39. package/dist/diagnostics.js +335 -0
  40. package/dist/emit.d.ts +22 -0
  41. package/dist/emit.js +43 -0
  42. package/dist/entrypoint-kinds.d.ts +3 -0
  43. package/dist/entrypoint-kinds.js +11 -0
  44. package/dist/environment/application/destructive.d.ts +6 -0
  45. package/dist/environment/application/destructive.js +425 -0
  46. package/dist/environment/application/doctor.d.ts +89 -0
  47. package/dist/environment/application/doctor.js +235 -0
  48. package/dist/environment/application/guard.d.ts +43 -0
  49. package/dist/environment/application/guard.js +622 -0
  50. package/dist/environment/application/health.d.ts +134 -0
  51. package/dist/environment/application/health.js +379 -0
  52. package/dist/environment/application/lifecycle-context.d.ts +228 -0
  53. package/dist/environment/application/lifecycle-context.js +154 -0
  54. package/dist/environment/application/lifecycle-state.d.ts +25 -0
  55. package/dist/environment/application/lifecycle-state.js +201 -0
  56. package/dist/environment/application/lifecycle.d.ts +17 -0
  57. package/dist/environment/application/lifecycle.js +729 -0
  58. package/dist/environment/application/logs.d.ts +45 -0
  59. package/dist/environment/application/logs.js +127 -0
  60. package/dist/environment/application/setup.d.ts +129 -0
  61. package/dist/environment/application/setup.js +741 -0
  62. package/dist/environment/application/shared.d.ts +11 -0
  63. package/dist/environment/application/shared.js +61 -0
  64. package/dist/environment/claims.d.ts +389 -0
  65. package/dist/environment/claims.js +1709 -0
  66. package/dist/environment/codex-hook-trust.d.ts +11 -0
  67. package/dist/environment/codex-hook-trust.js +185 -0
  68. package/dist/environment/compose-environment.d.ts +1 -0
  69. package/dist/environment/compose-environment.js +6 -0
  70. package/dist/environment/compose-ownership.d.ts +21 -0
  71. package/dist/environment/compose-ownership.js +117 -0
  72. package/dist/environment/compose-topology.d.ts +117 -0
  73. package/dist/environment/compose-topology.js +413 -0
  74. package/dist/environment/contract.d.ts +489 -0
  75. package/dist/environment/contract.js +761 -0
  76. package/dist/environment/declaration.d.ts +14 -0
  77. package/dist/environment/declaration.js +39 -0
  78. package/dist/environment/destructive-composition.d.ts +29 -0
  79. package/dist/environment/destructive-composition.js +333 -0
  80. package/dist/environment/docker-daemon.d.ts +30 -0
  81. package/dist/environment/docker-daemon.js +78 -0
  82. package/dist/environment/docker-endpoint.d.ts +10 -0
  83. package/dist/environment/docker-endpoint.js +19 -0
  84. package/dist/environment/env-schema-observation.d.ts +46 -0
  85. package/dist/environment/env-schema-observation.js +241 -0
  86. package/dist/environment/evidence.d.ts +136 -0
  87. package/dist/environment/evidence.js +437 -0
  88. package/dist/environment/executable.d.ts +26 -0
  89. package/dist/environment/executable.js +167 -0
  90. package/dist/environment/generated-application/authorities.d.ts +5 -0
  91. package/dist/environment/generated-application/authorities.js +61 -0
  92. package/dist/environment/generated-application/bootstrap-skill.d.ts +16 -0
  93. package/dist/environment/generated-application/bootstrap-skill.js +328 -0
  94. package/dist/environment/generated-application/check.d.ts +13 -0
  95. package/dist/environment/generated-application/check.js +189 -0
  96. package/dist/environment/generated-application/custom-surface.d.ts +26 -0
  97. package/dist/environment/generated-application/custom-surface.js +289 -0
  98. package/dist/environment/generated-application/prepare.d.ts +29 -0
  99. package/dist/environment/generated-application/prepare.js +276 -0
  100. package/dist/environment/generated-application/publication.d.ts +33 -0
  101. package/dist/environment/generated-application/publication.js +547 -0
  102. package/dist/environment/generated-application/shared.d.ts +484 -0
  103. package/dist/environment/generated-application/shared.js +349 -0
  104. package/dist/environment/generated-application/surface-observation.d.ts +4 -0
  105. package/dist/environment/generated-application/surface-observation.js +69 -0
  106. package/dist/environment/generated-application/surface-outputs.d.ts +71 -0
  107. package/dist/environment/generated-application/surface-outputs.js +389 -0
  108. package/dist/environment/generated-application/surfaces.d.ts +3 -0
  109. package/dist/environment/generated-application/surfaces.js +699 -0
  110. package/dist/environment/generated-application/sync.d.ts +6 -0
  111. package/dist/environment/generated-application/sync.js +109 -0
  112. package/dist/environment/git-observation.d.ts +183 -0
  113. package/dist/environment/git-observation.js +544 -0
  114. package/dist/environment/health-composition.d.ts +11 -0
  115. package/dist/environment/health-composition.js +628 -0
  116. package/dist/environment/host-observation.d.ts +56 -0
  117. package/dist/environment/host-observation.js +52 -0
  118. package/dist/environment/identity.d.ts +48 -0
  119. package/dist/environment/identity.js +85 -0
  120. package/dist/environment/init-application.d.ts +308 -0
  121. package/dist/environment/init-application.js +697 -0
  122. package/dist/environment/install-policy-observation.d.ts +71 -0
  123. package/dist/environment/install-policy-observation.js +284 -0
  124. package/dist/environment/install-policy.d.ts +48 -0
  125. package/dist/environment/install-policy.js +96 -0
  126. package/dist/environment/instance.d.ts +33 -0
  127. package/dist/environment/instance.js +122 -0
  128. package/dist/environment/instruction-pointer.d.ts +19 -0
  129. package/dist/environment/instruction-pointer.js +144 -0
  130. package/dist/environment/lifecycle-composition.d.ts +29 -0
  131. package/dist/environment/lifecycle-composition.js +675 -0
  132. package/dist/environment/lifecycle-stage.d.ts +115 -0
  133. package/dist/environment/lifecycle-stage.js +398 -0
  134. package/dist/environment/lifecycle.d.ts +75 -0
  135. package/dist/environment/lifecycle.js +354 -0
  136. package/dist/environment/logs.d.ts +132 -0
  137. package/dist/environment/logs.js +519 -0
  138. package/dist/environment/observations.d.ts +46 -0
  139. package/dist/environment/observations.js +344 -0
  140. package/dist/environment/operator-application.d.ts +50 -0
  141. package/dist/environment/operator-application.js +155 -0
  142. package/dist/environment/ports.d.ts +182 -0
  143. package/dist/environment/ports.js +1205 -0
  144. package/dist/environment/posture-observation.d.ts +68 -0
  145. package/dist/environment/posture-observation.js +253 -0
  146. package/dist/environment/read-composition.d.ts +27 -0
  147. package/dist/environment/read-composition.js +352 -0
  148. package/dist/environment/readiness-composition.d.ts +38 -0
  149. package/dist/environment/readiness-composition.js +130 -0
  150. package/dist/environment/reclaim.d.ts +333 -0
  151. package/dist/environment/reclaim.js +1835 -0
  152. package/dist/environment/repository-identity.d.ts +13 -0
  153. package/dist/environment/repository-identity.js +108 -0
  154. package/dist/environment/runtime-measurement-record.d.ts +38 -0
  155. package/dist/environment/runtime-measurement-record.js +111 -0
  156. package/dist/environment/runtime-measurement.d.ts +27 -0
  157. package/dist/environment/runtime-measurement.js +224 -0
  158. package/dist/environment/runtime-probe-residue.d.ts +43 -0
  159. package/dist/environment/runtime-probe-residue.js +148 -0
  160. package/dist/environment/runtime-probe.d.ts +72 -0
  161. package/dist/environment/runtime-probe.js +725 -0
  162. package/dist/environment/runtime.d.ts +505 -0
  163. package/dist/environment/runtime.js +2335 -0
  164. package/dist/environment/seed.d.ts +16 -0
  165. package/dist/environment/seed.js +43 -0
  166. package/dist/environment/selftest-application.d.ts +86 -0
  167. package/dist/environment/selftest-application.js +713 -0
  168. package/dist/environment/sensitive.d.ts +3 -0
  169. package/dist/environment/sensitive.js +48 -0
  170. package/dist/environment/setup-observation.d.ts +62 -0
  171. package/dist/environment/setup-observation.js +1473 -0
  172. package/dist/environment/setup.d.ts +43 -0
  173. package/dist/environment/setup.js +176 -0
  174. package/dist/environment/sibling-instructions.d.ts +33 -0
  175. package/dist/environment/sibling-instructions.js +224 -0
  176. package/dist/environment/sibling-registration.d.ts +45 -0
  177. package/dist/environment/sibling-registration.js +538 -0
  178. package/dist/environment/state.d.ts +371 -0
  179. package/dist/environment/state.js +2013 -0
  180. package/dist/environment/templates.d.ts +140 -0
  181. package/dist/environment/templates.js +685 -0
  182. package/dist/environment/tool-registration.d.ts +9 -0
  183. package/dist/environment/tool-registration.js +96 -0
  184. package/dist/environment/upgrade-application.d.ts +19 -0
  185. package/dist/environment/upgrade-application.js +175 -0
  186. package/dist/environment-exec/execute.d.ts +102 -0
  187. package/dist/environment-exec/execute.js +1175 -0
  188. package/dist/environment-exec/libexec-program.d.ts +6 -0
  189. package/dist/environment-exec/libexec-program.js +22 -0
  190. package/dist/environment-exec/verified-digest.d.ts +4 -0
  191. package/dist/environment-exec/verified-digest.js +16 -0
  192. package/dist/exact-keys.d.ts +7 -0
  193. package/dist/exact-keys.js +15 -0
  194. package/dist/fix-catalogue.d.ts +32 -0
  195. package/dist/fix-catalogue.js +60 -0
  196. package/dist/freshness.d.ts +29 -0
  197. package/dist/freshness.js +75 -0
  198. package/dist/generated-environment/adopt.d.ts +16 -0
  199. package/dist/generated-environment/adopt.js +275 -0
  200. package/dist/generated-environment/command.d.ts +47 -0
  201. package/dist/generated-environment/command.js +75 -0
  202. package/dist/generated-environment/transaction.d.ts +186 -0
  203. package/dist/generated-environment/transaction.js +1770 -0
  204. package/dist/grading/evaluate.d.ts +71 -0
  205. package/dist/grading/evaluate.js +403 -0
  206. package/dist/grading/grade.d.ts +33 -0
  207. package/dist/grading/grade.js +57 -0
  208. package/dist/guards/evaluator.d.ts +113 -0
  209. package/dist/guards/evaluator.js +1226 -0
  210. package/dist/guards/harness-adapter.d.ts +17 -0
  211. package/dist/guards/harness-adapter.js +57 -0
  212. package/dist/guards/host.d.ts +8 -0
  213. package/dist/guards/host.js +10 -0
  214. package/dist/guards/invocation-parser.d.ts +66 -0
  215. package/dist/guards/invocation-parser.js +595 -0
  216. package/dist/guards/local-identity.d.ts +40 -0
  217. package/dist/guards/local-identity.js +123 -0
  218. package/dist/guards/policy-pin.d.ts +13 -0
  219. package/dist/guards/policy-pin.js +175 -0
  220. package/dist/guards/protected-locations.d.ts +62 -0
  221. package/dist/guards/protected-locations.js +461 -0
  222. package/dist/guards/read-only.d.ts +37 -0
  223. package/dist/guards/read-only.js +315 -0
  224. package/dist/init/command.d.ts +40 -0
  225. package/dist/init/command.js +310 -0
  226. package/dist/init/derive.d.ts +51 -0
  227. package/dist/init/derive.js +715 -0
  228. package/dist/init/draft.d.ts +138 -0
  229. package/dist/init/draft.js +1205 -0
  230. package/dist/init/render.d.ts +35 -0
  231. package/dist/init/render.js +82 -0
  232. package/dist/init/scaffold.d.ts +53 -0
  233. package/dist/init/scaffold.js +121 -0
  234. package/dist/invocation.d.ts +13 -0
  235. package/dist/invocation.js +20 -0
  236. package/dist/package-metadata.d.ts +9 -0
  237. package/dist/package-metadata.js +19 -0
  238. package/dist/readiness.d.ts +53 -0
  239. package/dist/readiness.js +88 -0
  240. package/dist/references/named.d.ts +24 -0
  241. package/dist/references/named.js +27 -0
  242. package/dist/refusal.d.ts +15 -0
  243. package/dist/refusal.js +7 -0
  244. package/dist/registry-derivation.d.ts +31 -0
  245. package/dist/registry-derivation.js +32 -0
  246. package/dist/registry-resolve/command.d.ts +47 -0
  247. package/dist/registry-resolve/command.js +226 -0
  248. package/dist/registry-resolve/registry.d.ts +68 -0
  249. package/dist/registry-resolve/registry.js +292 -0
  250. package/dist/registry-resolve/render-shell.d.ts +18 -0
  251. package/dist/registry-resolve/render-shell.js +36 -0
  252. package/dist/repair.d.ts +29 -0
  253. package/dist/repair.js +8 -0
  254. package/dist/schema-json.d.ts +1 -0
  255. package/dist/schema-json.js +177 -0
  256. package/dist/schema.d.ts +1322 -0
  257. package/dist/schema.js +934 -0
  258. package/dist/setup/command.d.ts +4 -0
  259. package/dist/setup/command.js +4 -0
  260. package/dist/sha256.d.ts +1 -0
  261. package/dist/sha256.js +4 -0
  262. package/dist/surfaces/adoption.d.ts +41 -0
  263. package/dist/surfaces/adoption.js +217 -0
  264. package/dist/surfaces/consumer-instructions.d.ts +20 -0
  265. package/dist/surfaces/consumer-instructions.js +43 -0
  266. package/dist/surfaces/contract.d.ts +42 -0
  267. package/dist/surfaces/contract.js +169 -0
  268. package/dist/surfaces/core-declarations.d.ts +24 -0
  269. package/dist/surfaces/core-declarations.js +79 -0
  270. package/dist/surfaces/development-markers.d.ts +1 -0
  271. package/dist/surfaces/development-markers.js +18 -0
  272. package/dist/surfaces/generator-adapter.d.ts +71 -0
  273. package/dist/surfaces/generator-adapter.js +809 -0
  274. package/dist/surfaces/harness-registry.d.ts +180 -0
  275. package/dist/surfaces/harness-registry.js +117 -0
  276. package/dist/surfaces/mcp.d.ts +95 -0
  277. package/dist/surfaces/mcp.js +186 -0
  278. package/dist/surfaces/merge.d.ts +30 -0
  279. package/dist/surfaces/merge.js +105 -0
  280. package/dist/surfaces/ownership.d.ts +190 -0
  281. package/dist/surfaces/ownership.js +795 -0
  282. package/dist/surfaces/projection.d.ts +136 -0
  283. package/dist/surfaces/projection.js +681 -0
  284. package/dist/surfaces/render.d.ts +118 -0
  285. package/dist/surfaces/render.js +633 -0
  286. package/dist/surfaces/restrictions.d.ts +130 -0
  287. package/dist/surfaces/restrictions.js +447 -0
  288. package/dist/surfaces/selftest.d.ts +162 -0
  289. package/dist/surfaces/selftest.js +393 -0
  290. package/dist/surfaces/skill-contract.d.ts +85 -0
  291. package/dist/surfaces/skill-contract.js +449 -0
  292. package/dist/surfaces/sync.d.ts +57 -0
  293. package/dist/surfaces/sync.js +164 -0
  294. package/dist/team-metadata.d.ts +41 -0
  295. package/dist/team-metadata.js +512 -0
  296. package/dist/testing/gates.d.ts +91 -0
  297. package/dist/testing/gates.js +182 -0
  298. package/dist/testing/hooks.d.ts +59 -0
  299. package/dist/testing/hooks.js +139 -0
  300. package/dist/testing/verdict.d.ts +29 -0
  301. package/dist/testing/verdict.js +62 -0
  302. package/dist/work-orders/application.d.ts +99 -0
  303. package/dist/work-orders/application.js +383 -0
  304. package/dist/work-orders/composition.d.ts +124 -0
  305. package/dist/work-orders/composition.js +1010 -0
  306. package/dist/work-orders/contract.d.ts +61 -0
  307. package/dist/work-orders/contract.js +122 -0
  308. package/dist/work-orders/store.d.ts +158 -0
  309. package/dist/work-orders/store.js +197 -0
  310. package/docs/README.md +65 -0
  311. package/docs/architecture.md +136 -0
  312. package/docs/capability-matrix.md +50 -0
  313. package/docs/cli-reference.md +599 -0
  314. package/docs/command-list.md +51 -0
  315. package/docs/compose-patterns.md +99 -0
  316. package/docs/concepts.md +171 -0
  317. package/docs/configuration-essentials.md +172 -0
  318. package/docs/configuration-reference.md +621 -0
  319. package/docs/environment.md +760 -0
  320. package/docs/extending.md +43 -0
  321. package/docs/faq.md +111 -0
  322. package/docs/getting-started.md +608 -0
  323. package/docs/harness-surfaces.md +433 -0
  324. package/docs/joining-a-team.md +76 -0
  325. package/docs/release-policy.md +49 -0
  326. package/docs/safety-and-autonomy.md +419 -0
  327. package/docs/troubleshooting.md +361 -0
  328. package/docs/tutorial.md +170 -0
  329. package/docs/work-and-browser.md +254 -0
  330. package/libexec/browser-operation.cjs +186 -0
  331. package/libexec/fence-marker.cjs +101 -0
  332. package/libexec/fence-marker.d.cts +24 -0
  333. package/libexec/fenced-group-runner.cjs +77 -0
  334. package/libexec/fenced-supervisor.cjs +137 -0
  335. package/libexec/generated-filesystem.cjs +731 -0
  336. package/libexec/install-filesystem.cjs +225 -0
  337. package/libexec/rulesync-generator.NOTICE.md +1112 -0
  338. package/libexec/rulesync-generator.cjs +743 -0
  339. package/libexec/surface-generator-worker.cjs +266 -0
  340. package/libexec/surface-output-reader.cjs +99 -0
  341. package/libexec/surface-scratch-cleanup.cjs +14 -0
  342. package/libexec/validate-harness-evidence.d.mts +183 -0
  343. package/libexec/validate-harness-evidence.mjs +1312 -0
  344. package/package.json +74 -4
  345. package/surfaces/README.md +33 -0
  346. package/surfaces/agents/evaluator.agent.md +76 -0
  347. package/surfaces/guards/bash-guard.sh +48 -0
  348. package/surfaces/guards/claude.adapter.json +25 -0
  349. package/surfaces/guards/codex.adapter.json +24 -0
  350. package/surfaces/guards/opencode.adapter.json +25 -0
  351. package/surfaces/references/browser.md +63 -0
  352. package/surfaces/references/test-data-and-personas.md +84 -0
  353. package/surfaces/references/testing-tiers.md +11 -0
  354. package/surfaces/skills/cockpit-browser.skill.md +54 -0
  355. package/surfaces/skills/cockpit-explain.skill.md +32 -0
  356. package/surfaces/skills/cockpit-fix.skill.md +37 -0
  357. package/surfaces/skills/cockpit-setup.skill.md +39 -0
  358. package/surfaces/skills/cockpit-work.skill.md +34 -0
  359. package/surfaces/skills/collection.json +5 -0
  360. package/surfaces/skills/procedures/explain.md +61 -0
  361. package/surfaces/skills/procedures/fix.md +81 -0
  362. package/surfaces/skills/procedures/setup.md +379 -0
  363. package/surfaces/skills/procedures/work.md +105 -0
@@ -0,0 +1,105 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { snapshotJson } from '../environment/contract.js';
3
+ import { SurfaceDeclaration, SurfaceOverlay } from '../schema.js';
4
+ function immutable(value) {
5
+ return snapshotJson(value);
6
+ }
7
+ function isObject(value) {
8
+ return value !== undefined && value !== null && typeof value === 'object' && !Array.isArray(value);
9
+ }
10
+ function refusal(code, message) {
11
+ return immutable({ kind: 'refusal', code, message });
12
+ }
13
+ function canonicalDeclaration(declaration) {
14
+ return {
15
+ name: declaration.name,
16
+ feature: declaration.feature,
17
+ sources: declaration.sources.map((source) => ({ path: source.path, bytes: source.bytes })),
18
+ source: declaration.source,
19
+ ...(declaration.replaces ? { replaces: declaration.replaces } : {}),
20
+ };
21
+ }
22
+ export function surfaceDeclarationSha256(declaration) {
23
+ return createHash('sha256').update(JSON.stringify(canonicalDeclaration(declaration))).digest('hex');
24
+ }
25
+ function duplicateName(declarations) {
26
+ const names = new Set();
27
+ for (const declaration of declarations) {
28
+ if (names.has(declaration.name))
29
+ return declaration.name;
30
+ names.add(declaration.name);
31
+ }
32
+ return undefined;
33
+ }
34
+ function compareName(left, right) {
35
+ return left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
36
+ }
37
+ export function mergeSurfaceDeclarations(coreInput, overlayInput) {
38
+ const captured = snapshotJson({ core: coreInput, overlays: overlayInput });
39
+ if (!isObject(captured)) {
40
+ return refusal('SURFACE_INPUT_INVALID', 'core and overlay declarations must be bounded immutable data');
41
+ }
42
+ const coreResult = SurfaceDeclaration.array().safeParse(captured.core);
43
+ const overlayResult = SurfaceOverlay.array().safeParse(captured.overlays);
44
+ if (!coreResult.success || !overlayResult.success) {
45
+ return refusal('SURFACE_INPUT_INVALID', 'core or overlay declarations are invalid');
46
+ }
47
+ const core = coreResult.data;
48
+ const overlays = overlayResult.data;
49
+ const repeated = duplicateName(core) ?? duplicateName(overlays);
50
+ if (repeated)
51
+ return refusal('SURFACE_NAME_DUPLICATE', `surface name "${repeated}" is declared more than once`);
52
+ if (core.some((declaration) => declaration.replaces)) {
53
+ return refusal('SURFACE_OVERRIDE_INVALID', 'core declarations cannot replace another surface');
54
+ }
55
+ const resolved = new Map(core.map((declaration) => [declaration.name, declaration]));
56
+ const overrides = [];
57
+ const findings = [];
58
+ for (const overlay of overlays) {
59
+ const original = resolved.get(overlay.name);
60
+ if (!original) {
61
+ if (overlay.replaces)
62
+ return refusal('SURFACE_OVERRIDE_INVALID', `override "${overlay.name}" has no core original`);
63
+ resolved.set(overlay.name, overlay);
64
+ continue;
65
+ }
66
+ if (original.feature !== overlay.feature) {
67
+ return refusal('SURFACE_KIND_AMBIGUOUS', `surface "${overlay.name}" changes feature from ${original.feature} to ${overlay.feature}`);
68
+ }
69
+ if (!overlay.replaces || overlay.replaces.name !== overlay.name) {
70
+ return refusal('SURFACE_OVERRIDE_INVALID', `surface "${overlay.name}" collides with core without an explicit replacement`);
71
+ }
72
+ const originalSha256 = surfaceDeclarationSha256(original);
73
+ overrides.push({
74
+ name: overlay.name,
75
+ feature: overlay.feature,
76
+ originalSha256,
77
+ recordedSha256: overlay.replaces.sha256,
78
+ overlaySource: overlay.source,
79
+ });
80
+ if (originalSha256 !== overlay.replaces.sha256) {
81
+ findings.push({
82
+ code: 'OVERRIDDEN_CORE_CHANGED',
83
+ name: overlay.name,
84
+ recordedSha256: overlay.replaces.sha256,
85
+ currentSha256: originalSha256,
86
+ overlaySource: overlay.source,
87
+ });
88
+ }
89
+ resolved.set(overlay.name, overlay);
90
+ }
91
+ const paths = new Map();
92
+ const surfaces = [...resolved.values()];
93
+ for (const declaration of surfaces) {
94
+ for (const source of declaration.sources) {
95
+ const owner = paths.get(source.path);
96
+ if (owner)
97
+ return refusal('SURFACE_PATH_CONFLICT', `surface path "${source.path}" is owned by both "${owner}" and "${declaration.name}"`);
98
+ paths.set(source.path, declaration.name);
99
+ }
100
+ }
101
+ surfaces.sort(compareName);
102
+ overrides.sort(compareName);
103
+ findings.sort(compareName);
104
+ return immutable({ kind: 'complete', surfaces, overrides, findings });
105
+ }
@@ -0,0 +1,190 @@
1
+ export type SurfaceOwnership = 'whole-file' | 'shared-region';
2
+ export type SurfaceScope = 'always' | 'scoped';
3
+ export type SurfaceCapability = 'enforced' | 'instructed';
4
+ interface SurfaceEntryBase {
5
+ readonly path: string;
6
+ readonly harnesses: readonly [string, ...string[]];
7
+ readonly scope: SurfaceScope;
8
+ readonly capability: SurfaceCapability;
9
+ readonly writer: 'cockpit';
10
+ readonly schemaVersion: 1;
11
+ }
12
+ export interface OpenCodeRootMember {
13
+ readonly key: string;
14
+ readonly valueBytes: string;
15
+ }
16
+ export type SurfaceDesiredEntry = Readonly<SurfaceEntryBase & {
17
+ kind: 'file';
18
+ ownership: 'whole-file';
19
+ bytes: string;
20
+ sha256: string;
21
+ }> | Readonly<SurfaceEntryBase & {
22
+ kind: 'shared-region';
23
+ ownership: 'shared-region';
24
+ regionId: string;
25
+ region: Readonly<{
26
+ format: 'markdown-delimited';
27
+ begin: string;
28
+ end: string;
29
+ bytes: string;
30
+ sha256: string;
31
+ } | {
32
+ format: 'opencode-json-root-properties';
33
+ members: readonly OpenCodeRootMember[];
34
+ sha256: string;
35
+ }>;
36
+ }>;
37
+ export type SurfacePriorOwnedEntry = Readonly<SurfaceEntryBase & {
38
+ kind: 'file';
39
+ ownership: 'whole-file';
40
+ sha256: string;
41
+ }> | Readonly<SurfaceEntryBase & {
42
+ kind: 'shared-region';
43
+ ownership: 'shared-region';
44
+ regionId: string;
45
+ region: Readonly<{
46
+ format: 'markdown-delimited';
47
+ begin: string;
48
+ end: string;
49
+ sha256: string;
50
+ } | {
51
+ format: 'opencode-json-root-properties';
52
+ keys: readonly string[];
53
+ sha256: string;
54
+ }>;
55
+ }>;
56
+ export interface SurfaceDiagnostic {
57
+ readonly code: 'SURFACE_INPUT_INVALID' | 'SURFACE_BOUNDS' | 'SURFACE_PATH_CONFLICT' | 'SURFACE_OWNERSHIP_INVALID' | 'SURFACE_STATE_CONFLICT';
58
+ readonly message: string;
59
+ readonly target?: string;
60
+ readonly fix?: string;
61
+ }
62
+ export declare const SURFACE_HAND_EDIT_FIX = "keep the edit by moving it into cockpit.toml or a surface overlay, then ask the person who owns the cockpit before you discard the hand edit (undo it or delete the file), and rerun npx --no cockpit sync --config <your cockpit.toml>";
63
+ export declare const SURFACE_UNRECORDED_FIX = "ask the person who owns the cockpit whether this file is theirs; move anything they want kept into cockpit.toml or a surface overlay, and only with their approval move the file away or delete it, then rerun npx --no cockpit sync --config <your cockpit.toml>";
64
+ export type SurfaceOwnershipResult = Readonly<{
65
+ kind: 'complete';
66
+ entries: readonly SurfaceDesiredEntry[];
67
+ }> | Readonly<{
68
+ kind: 'refusal';
69
+ diagnostic: SurfaceDiagnostic;
70
+ }>;
71
+ export interface SurfaceOwnershipInput {
72
+ readonly configuredHarnesses: readonly string[];
73
+ readonly entries: readonly SurfaceDesiredEntry[];
74
+ }
75
+ export declare function bindSurfaceOwnershipIdentity(entries: readonly SurfaceDesiredEntry[], cockpitId: string): SurfaceOwnershipResult;
76
+ export declare function classifySurfaceOwnership(input: unknown): SurfaceOwnershipResult;
77
+ export declare function captureOpenCodeRootMembers(bytes: string): readonly OpenCodeRootMember[] | undefined;
78
+ export type SharedPostimageResult = Readonly<{
79
+ kind: 'complete';
80
+ bytes: string;
81
+ }> | Extract<SurfaceOwnershipResult, {
82
+ kind: 'refusal';
83
+ }>;
84
+ export declare function renderSharedPostimage(existingBytes: string, entry: SurfaceDesiredEntry, priorOwned?: OwnershipEntry, manifest?: OwnershipManifest): SharedPostimageResult;
85
+ export declare function removeSharedOwnership(existingBytes: string, priorOwned: OwnershipEntry, manifest?: OwnershipManifest): SharedPostimageResult;
86
+ export type OwnershipEntry = Readonly<{
87
+ kind: 'file';
88
+ path: string;
89
+ ownership: 'whole-file';
90
+ sha256: string;
91
+ }> | SurfacePriorOwnedEntry;
92
+ export type EnvironmentOwnershipEntry = Readonly<{
93
+ kind: 'file';
94
+ path: string;
95
+ ownership: 'whole-file';
96
+ sha256: string;
97
+ }>;
98
+ export interface GeneratedProducer {
99
+ readonly package: string;
100
+ readonly version: string;
101
+ readonly sourceRevision: string;
102
+ }
103
+ export interface OwnershipManifestPayload {
104
+ readonly format: 'cockpit-generated-ownership/v3';
105
+ readonly producer: GeneratedProducer;
106
+ readonly cockpitId: string;
107
+ readonly generation: string;
108
+ readonly source: Readonly<{
109
+ path: string;
110
+ sha256: string;
111
+ }>;
112
+ readonly entries: readonly OwnershipEntry[];
113
+ }
114
+ export interface OwnershipManifest extends OwnershipManifestPayload {
115
+ readonly integrity: string;
116
+ }
117
+ export interface OwnershipAuthority {
118
+ readonly root: string;
119
+ readonly cockpitId: string;
120
+ readonly configPath: string;
121
+ }
122
+ export interface OwnershipManifestInput extends OwnershipAuthority {
123
+ readonly generation: string;
124
+ readonly sourceSha256: string;
125
+ readonly owned: readonly Readonly<{
126
+ path: string;
127
+ sha256: string;
128
+ }>[];
129
+ readonly surfaces: readonly SurfaceDesiredEntry[];
130
+ }
131
+ export type OwnershipManifestResult = Readonly<{
132
+ kind: "complete";
133
+ manifest: OwnershipManifest;
134
+ }> | Readonly<{
135
+ kind: "invalid";
136
+ }> | Readonly<{
137
+ kind: "unsupported";
138
+ format: string;
139
+ }>;
140
+ export declare function parseOwnershipManifest(bytes: string, authority: OwnershipAuthority): OwnershipManifestResult;
141
+ export declare function encodeOwnershipManifest(prepared: OwnershipManifestInput): Readonly<{
142
+ bytes: string;
143
+ manifest: OwnershipManifest;
144
+ }>;
145
+ export type GeneratedPathProducer = 'generated-environment' | 'environment-data-plane' | 'surface-render';
146
+ export type GeneratedPathApplicability = 'declared-before-sync' | 'sibling-unavailable' | 'required-after-sync';
147
+ export type GeneratedPathDeclaration = Readonly<{
148
+ producer: GeneratedPathProducer;
149
+ applicability: 'declared-before-sync' | 'required-after-sync';
150
+ entry: OwnershipEntry;
151
+ }> | Readonly<{
152
+ producer: GeneratedPathProducer;
153
+ applicability: 'sibling-unavailable';
154
+ path: string;
155
+ }>;
156
+ export interface GeneratedPathFact {
157
+ readonly path: string;
158
+ readonly authority: OwnershipAuthority & Readonly<{
159
+ generation: string;
160
+ source: OwnershipManifest['source'];
161
+ integrity: string;
162
+ }>;
163
+ readonly entry: OwnershipEntry;
164
+ readonly declaration: GeneratedPathDeclaration | null;
165
+ readonly allowsMissing: boolean;
166
+ readonly harnesses: readonly string[];
167
+ readonly scope: SurfaceScope;
168
+ readonly ownership: SurfaceOwnership;
169
+ }
170
+ export type GeneratedPathFactsResult = Readonly<{
171
+ kind: 'complete';
172
+ facts: readonly GeneratedPathFact[];
173
+ }> | Extract<SurfaceOwnershipResult, {
174
+ kind: 'refusal';
175
+ }>;
176
+ export declare function projectGeneratedPathFacts(manifest: OwnershipManifest, authority: OwnershipAuthority, declarations: unknown): GeneratedPathFactsResult;
177
+ export interface GeneratedPathClassification {
178
+ readonly fact: GeneratedPathFact;
179
+ readonly state: 'unchanged' | 'modified' | 'unknown' | 'missing';
180
+ readonly rawSha256?: string;
181
+ readonly diagnostics: readonly SurfaceDiagnostic[];
182
+ }
183
+ export type GeneratedPathClassificationResult = Readonly<{
184
+ kind: 'complete';
185
+ paths: readonly GeneratedPathClassification[];
186
+ }> | Extract<SurfaceOwnershipResult, {
187
+ kind: 'refusal';
188
+ }>;
189
+ export declare function classifyGeneratedPaths(facts: readonly GeneratedPathFact[], observations: unknown): GeneratedPathClassificationResult;
190
+ export {};