@tiinex/core 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 (517) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +31 -0
  3. package/README.md +45 -0
  4. package/package.json +176 -0
  5. package/src/actions/record.actions.js +312 -0
  6. package/src/adapters/adapter.contracts.js +143 -0
  7. package/src/adapters/archive/archive.adapter.js +502 -0
  8. package/src/adapters/archive/archive.portableChangeset.js +141 -0
  9. package/src/adapters/archive/archive.transport.js +124 -0
  10. package/src/artifacts/artifact.localDraft.js +27 -0
  11. package/src/artifacts/artifact.normalize.js +28 -0
  12. package/src/artifacts/artifact.parse.js +207 -0
  13. package/src/artifacts/artifact.record.js +83 -0
  14. package/src/audit/audit.run.js +103 -0
  15. package/src/audit/audit.summary.js +7 -0
  16. package/src/diagnostics/sourceBoundary.report.js +112 -0
  17. package/src/export/package.apply.js +349 -0
  18. package/src/export/package.builder.js +366 -0
  19. package/src/export/package.bytes.js +164 -0
  20. package/src/export/package.controlIntegrity.js +42 -0
  21. package/src/export/package.controlTopology.js +97 -0
  22. package/src/export/package.fileMap.js +174 -0
  23. package/src/export/package.manifest.js +401 -0
  24. package/src/export/package.preflight.js +204 -0
  25. package/src/export/package.sourceReference.js +81 -0
  26. package/src/export/package.workspaceContext.js +144 -0
  27. package/src/export/package.zip.js +128 -0
  28. package/src/export/tree.bundle.js +278 -0
  29. package/src/governance/governance.boundary.js +196 -0
  30. package/src/integrity/integrity.c14nV2.js +190 -0
  31. package/src/integrity/integrity.methodReference.js +73 -0
  32. package/src/integrity/integrity.validate.js +56 -0
  33. package/src/lineage/lineage.candidateResolution.js +46 -0
  34. package/src/lineage/lineage.githubIssueComment.js +106 -0
  35. package/src/lineage/lineage.githubIssueLocal.js +196 -0
  36. package/src/lineage/lineage.githubIssueTarget.js +89 -0
  37. package/src/lineage/lineage.integrity.js +133 -0
  38. package/src/lineage/lineage.materialPreference.js +26 -0
  39. package/src/lineage/lineage.model.js +63 -0
  40. package/src/lineage/lineage.parentAuthority.js +5 -0
  41. package/src/lineage/lineage.parentBinding.js +104 -0
  42. package/src/lineage/lineage.pathBasis.js +47 -0
  43. package/src/lineage/lineage.resolve.js +388 -0
  44. package/src/lineage/lineage.sourceScope.js +74 -0
  45. package/src/lineage/lineage.targetKeys.js +80 -0
  46. package/src/lineage/lineage.traverse.js +132 -0
  47. package/src/public/applicationProjection.js +236 -0
  48. package/src/public/companionResources.js +246 -0
  49. package/src/public/index.js +16 -0
  50. package/src/public/node.js +2 -0
  51. package/src/public/schemaAncestry.js +26 -0
  52. package/src/publication/publication.contract.js +196 -0
  53. package/src/publication/publication.preflight.js +159 -0
  54. package/src/publication/publication.targetContract.js +241 -0
  55. package/src/reingest/reingest.plan.js +162 -0
  56. package/src/release/plan.mjs +28 -0
  57. package/src/release/policy.mjs +100 -0
  58. package/src/release/run.mjs +74 -0
  59. package/src/schemas/capability.registry.js +226 -0
  60. package/src/schemas/companion.js +245 -0
  61. package/src/schemas/contracts.js +6 -0
  62. package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.js +14 -0
  63. package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.json +23 -0
  64. package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.runtime.json +4283 -0
  65. package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.source.js +9 -0
  66. package/src/schemas/coordination/project/tiinex.project.v1.schema.js +26 -0
  67. package/src/schemas/coordination/project/tiinex.project.v1.schema.json +23 -0
  68. package/src/schemas/coordination/project/tiinex.project.v1.schema.runtime.json +1985 -0
  69. package/src/schemas/coordination/project/tiinex.project.v1.schema.source.js +9 -0
  70. package/src/schemas/core/decision/tiinex.decision.v1.schema.js +14 -0
  71. package/src/schemas/core/decision/tiinex.decision.v1.schema.json +24 -0
  72. package/src/schemas/core/decision/tiinex.decision.v1.schema.runtime.json +1700 -0
  73. package/src/schemas/core/decision/tiinex.decision.v1.schema.source.js +9 -0
  74. package/src/schemas/core/evidence/tiinex.evidence.v1.capabilities.js +14 -0
  75. package/src/schemas/core/evidence/tiinex.evidence.v1.en.i18n.json +6 -0
  76. package/src/schemas/core/evidence/tiinex.evidence.v1.findings.js +9 -0
  77. package/src/schemas/core/evidence/tiinex.evidence.v1.presenter.js +1 -0
  78. package/src/schemas/core/evidence/tiinex.evidence.v1.schema.js +32 -0
  79. package/src/schemas/core/evidence/tiinex.evidence.v1.schema.json +24 -0
  80. package/src/schemas/core/evidence/tiinex.evidence.v1.schema.runtime.json +2184 -0
  81. package/src/schemas/core/evidence/tiinex.evidence.v1.schema.source.js +9 -0
  82. package/src/schemas/core/evidence/tiinex.evidence.v1.sv.i18n.json +6 -0
  83. package/src/schemas/core/evidence/tiinex.evidence.v1.transitions.js +1 -0
  84. package/src/schemas/core/evidence/tiinex.evidence.v1.validate.js +10 -0
  85. package/src/schemas/core/feedback/tiinex.feedback.v1.schema.js +14 -0
  86. package/src/schemas/core/feedback/tiinex.feedback.v1.schema.json +23 -0
  87. package/src/schemas/core/feedback/tiinex.feedback.v1.schema.runtime.json +1773 -0
  88. package/src/schemas/core/feedback/tiinex.feedback.v1.schema.source.js +9 -0
  89. package/src/schemas/core/interpretation/tiinex.interpretation.v1.capabilities.js +11 -0
  90. package/src/schemas/core/interpretation/tiinex.interpretation.v1.contract.js +40 -0
  91. package/src/schemas/core/interpretation/tiinex.interpretation.v1.en.i18n.json +9 -0
  92. package/src/schemas/core/interpretation/tiinex.interpretation.v1.findings.js +12 -0
  93. package/src/schemas/core/interpretation/tiinex.interpretation.v1.localMaterialization.js +89 -0
  94. package/src/schemas/core/interpretation/tiinex.interpretation.v1.presenter.js +8 -0
  95. package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.js +34 -0
  96. package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.json +23 -0
  97. package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.runtime.json +2029 -0
  98. package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.source.js +9 -0
  99. package/src/schemas/core/interpretation/tiinex.interpretation.v1.sv.i18n.json +9 -0
  100. package/src/schemas/core/interpretation/tiinex.interpretation.v1.transitions.js +1 -0
  101. package/src/schemas/core/interpretation/tiinex.interpretation.v1.validate.js +25 -0
  102. package/src/schemas/core/preservation/tiinex.preservation.v1.capabilities.js +14 -0
  103. package/src/schemas/core/preservation/tiinex.preservation.v1.en.i18n.json +6 -0
  104. package/src/schemas/core/preservation/tiinex.preservation.v1.findings.js +9 -0
  105. package/src/schemas/core/preservation/tiinex.preservation.v1.presenter.js +1 -0
  106. package/src/schemas/core/preservation/tiinex.preservation.v1.schema.js +31 -0
  107. package/src/schemas/core/preservation/tiinex.preservation.v1.schema.json +23 -0
  108. package/src/schemas/core/preservation/tiinex.preservation.v1.schema.runtime.json +2033 -0
  109. package/src/schemas/core/preservation/tiinex.preservation.v1.schema.source.js +9 -0
  110. package/src/schemas/core/preservation/tiinex.preservation.v1.sv.i18n.json +6 -0
  111. package/src/schemas/core/preservation/tiinex.preservation.v1.transitions.js +1 -0
  112. package/src/schemas/core/preservation/tiinex.preservation.v1.validate.js +10 -0
  113. package/src/schemas/core/relation/tiinex.relation.v1.capabilities.js +7 -0
  114. package/src/schemas/core/relation/tiinex.relation.v1.contract.js +3 -0
  115. package/src/schemas/core/relation/tiinex.relation.v1.en.i18n.json +4 -0
  116. package/src/schemas/core/relation/tiinex.relation.v1.findings.js +9 -0
  117. package/src/schemas/core/relation/tiinex.relation.v1.localMaterialization.js +153 -0
  118. package/src/schemas/core/relation/tiinex.relation.v1.presenter.js +3 -0
  119. package/src/schemas/core/relation/tiinex.relation.v1.schema.js +20 -0
  120. package/src/schemas/core/relation/tiinex.relation.v1.schema.json +23 -0
  121. package/src/schemas/core/relation/tiinex.relation.v1.schema.runtime.json +1668 -0
  122. package/src/schemas/core/relation/tiinex.relation.v1.schema.source.js +9 -0
  123. package/src/schemas/core/relation/tiinex.relation.v1.sv.i18n.json +4 -0
  124. package/src/schemas/core/relation/tiinex.relation.v1.transitions.js +1 -0
  125. package/src/schemas/core/relation/tiinex.relation.v1.validate.js +36 -0
  126. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.capabilities.js +14 -0
  127. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.contract.js +57 -0
  128. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.en.i18n.json +4 -0
  129. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.findings.js +13 -0
  130. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.presenter.js +3 -0
  131. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.js +20 -0
  132. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.json +24 -0
  133. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.runtime.json +3315 -0
  134. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.source.js +9 -0
  135. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.sv.i18n.json +4 -0
  136. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.transitions.js +1 -0
  137. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.validate.js +78 -0
  138. package/src/schemas/core/signal/tiinex.signal.v1.schema.js +14 -0
  139. package/src/schemas/core/signal/tiinex.signal.v1.schema.json +23 -0
  140. package/src/schemas/core/signal/tiinex.signal.v1.schema.runtime.json +1733 -0
  141. package/src/schemas/core/signal/tiinex.signal.v1.schema.source.js +9 -0
  142. package/src/schemas/core/task/tiinex.task.v1.capabilities.js +11 -0
  143. package/src/schemas/core/task/tiinex.task.v1.contract.js +3 -0
  144. package/src/schemas/core/task/tiinex.task.v1.en.i18n.json +15 -0
  145. package/src/schemas/core/task/tiinex.task.v1.findings.js +18 -0
  146. package/src/schemas/core/task/tiinex.task.v1.localMaterialization.js +148 -0
  147. package/src/schemas/core/task/tiinex.task.v1.presenter.js +8 -0
  148. package/src/schemas/core/task/tiinex.task.v1.schema.js +35 -0
  149. package/src/schemas/core/task/tiinex.task.v1.schema.json +23 -0
  150. package/src/schemas/core/task/tiinex.task.v1.schema.runtime.json +1708 -0
  151. package/src/schemas/core/task/tiinex.task.v1.schema.source.js +9 -0
  152. package/src/schemas/core/task/tiinex.task.v1.sv.i18n.json +15 -0
  153. package/src/schemas/core/task/tiinex.task.v1.transitions.js +3 -0
  154. package/src/schemas/core/task/tiinex.task.v1.validate.js +41 -0
  155. package/src/schemas/core/topic/tiinex.topic.v1.capabilities.js +14 -0
  156. package/src/schemas/core/topic/tiinex.topic.v1.creation.js +46 -0
  157. package/src/schemas/core/topic/tiinex.topic.v1.en.i18n.json +8 -0
  158. package/src/schemas/core/topic/tiinex.topic.v1.findings.js +11 -0
  159. package/src/schemas/core/topic/tiinex.topic.v1.localMaterialization.js +135 -0
  160. package/src/schemas/core/topic/tiinex.topic.v1.presenter.js +1 -0
  161. package/src/schemas/core/topic/tiinex.topic.v1.schema.js +34 -0
  162. package/src/schemas/core/topic/tiinex.topic.v1.schema.json +23 -0
  163. package/src/schemas/core/topic/tiinex.topic.v1.schema.runtime.json +1699 -0
  164. package/src/schemas/core/topic/tiinex.topic.v1.schema.source.js +9 -0
  165. package/src/schemas/core/topic/tiinex.topic.v1.sv.i18n.json +8 -0
  166. package/src/schemas/core/topic/tiinex.topic.v1.transitions.js +31 -0
  167. package/src/schemas/core/topic/tiinex.topic.v1.validate.js +11 -0
  168. package/src/schemas/creation.capability.js +289 -0
  169. package/src/schemas/creation.contracts.js +334 -0
  170. package/src/schemas/creation.executionSnapshot.js +79 -0
  171. package/src/schemas/creation.factoryQualification.js +73 -0
  172. package/src/schemas/creation.renderer.js +244 -0
  173. package/src/schemas/creation.representation.js +279 -0
  174. package/src/schemas/creation.rootMetadata.js +6 -0
  175. package/src/schemas/creation.schemaReferences.js +65 -0
  176. package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.js +14 -0
  177. package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.json +23 -0
  178. package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.runtime.json +1873 -0
  179. package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.source.js +9 -0
  180. package/src/schemas/discovery/tiinex.discovery.v1.schema.js +14 -0
  181. package/src/schemas/discovery/tiinex.discovery.v1.schema.json +23 -0
  182. package/src/schemas/discovery/tiinex.discovery.v1.schema.runtime.json +1839 -0
  183. package/src/schemas/discovery/tiinex.discovery.v1.schema.source.js +9 -0
  184. package/src/schemas/generic.artifact.module.js +25 -0
  185. package/src/schemas/party/organization/tiinex.party.organization.v1.schema.js +26 -0
  186. package/src/schemas/party/organization/tiinex.party.organization.v1.schema.json +23 -0
  187. package/src/schemas/party/organization/tiinex.party.organization.v1.schema.runtime.json +2249 -0
  188. package/src/schemas/party/organization/tiinex.party.organization.v1.schema.source.js +9 -0
  189. package/src/schemas/party/role/tiinex.party.role.v1.schema.js +26 -0
  190. package/src/schemas/party/role/tiinex.party.role.v1.schema.json +24 -0
  191. package/src/schemas/party/role/tiinex.party.role.v1.schema.runtime.json +2091 -0
  192. package/src/schemas/party/role/tiinex.party.role.v1.schema.source.js +9 -0
  193. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.capabilities.js +14 -0
  194. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.en.i18n.json +4 -0
  195. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.findings.js +1 -0
  196. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.presenter.js +1 -0
  197. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.js +29 -0
  198. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.json +21 -0
  199. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.runtime.json +2180 -0
  200. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.source.js +9 -0
  201. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.sv.i18n.json +4 -0
  202. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.transitions.js +1 -0
  203. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.validate.js +1 -0
  204. package/src/schemas/reduction/tiinex.reduction.v1.schema.js +26 -0
  205. package/src/schemas/reduction/tiinex.reduction.v1.schema.json +23 -0
  206. package/src/schemas/reduction/tiinex.reduction.v1.schema.runtime.json +1733 -0
  207. package/src/schemas/reduction/tiinex.reduction.v1.schema.source.js +9 -0
  208. package/src/schemas/reference.shapes.js +33 -0
  209. package/src/schemas/registry.js +36 -0
  210. package/src/schemas/resolver.js +13 -0
  211. package/src/schemas/schema/module/tiinex.schema.module.v1.capabilities.js +14 -0
  212. package/src/schemas/schema/module/tiinex.schema.module.v1.en.i18n.json +4 -0
  213. package/src/schemas/schema/module/tiinex.schema.module.v1.findings.js +1 -0
  214. package/src/schemas/schema/module/tiinex.schema.module.v1.presenter.js +1 -0
  215. package/src/schemas/schema/module/tiinex.schema.module.v1.schema.js +29 -0
  216. package/src/schemas/schema/module/tiinex.schema.module.v1.schema.json +21 -0
  217. package/src/schemas/schema/module/tiinex.schema.module.v1.schema.runtime.json +2093 -0
  218. package/src/schemas/schema/module/tiinex.schema.module.v1.schema.source.js +9 -0
  219. package/src/schemas/schema/module/tiinex.schema.module.v1.sv.i18n.json +4 -0
  220. package/src/schemas/schema/module/tiinex.schema.module.v1.transitions.js +1 -0
  221. package/src/schemas/schema/module/tiinex.schema.module.v1.validate.js +1 -0
  222. package/src/schemas/schema.factory.descriptor.js +104 -0
  223. package/src/schemas/schema.githubSourceTarget.js +131 -0
  224. package/src/schemas/schema.identity.js +10 -0
  225. package/src/schemas/schema.reference.js +133 -0
  226. package/src/schemas/schema.source.js +239 -0
  227. package/src/schemas/tiinex.root.v1.capabilities.js +14 -0
  228. package/src/schemas/tiinex.root.v1.classify.js +55 -0
  229. package/src/schemas/tiinex.root.v1.en.i18n.json +24 -0
  230. package/src/schemas/tiinex.root.v1.fallback.js +84 -0
  231. package/src/schemas/tiinex.root.v1.findings.js +19 -0
  232. package/src/schemas/tiinex.root.v1.presenter.js +5 -0
  233. package/src/schemas/tiinex.root.v1.schema.js +29 -0
  234. package/src/schemas/tiinex.root.v1.schema.json +24 -0
  235. package/src/schemas/tiinex.root.v1.schema.runtime.json +1574 -0
  236. package/src/schemas/tiinex.root.v1.schema.source.js +9 -0
  237. package/src/schemas/tiinex.root.v1.sv.i18n.json +24 -0
  238. package/src/schemas/tiinex.root.v1.transitions.js +1 -0
  239. package/src/schemas/tiinex.root.v1.validate.js +36 -0
  240. package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.js +14 -0
  241. package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.json +23 -0
  242. package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.runtime.json +2027 -0
  243. package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.source.js +9 -0
  244. package/src/schemas/validation/method/tiinex.validation.method.v1.schema.js +14 -0
  245. package/src/schemas/validation/method/tiinex.validation.method.v1.schema.json +23 -0
  246. package/src/schemas/validation/method/tiinex.validation.method.v1.schema.runtime.json +1848 -0
  247. package/src/schemas/validation/method/tiinex.validation.method.v1.schema.source.js +9 -0
  248. package/src/schemas/validation/report/tiinex.validation.report.v1.schema.js +14 -0
  249. package/src/schemas/validation/report/tiinex.validation.report.v1.schema.json +23 -0
  250. package/src/schemas/validation/report/tiinex.validation.report.v1.schema.runtime.json +2015 -0
  251. package/src/schemas/validation/report/tiinex.validation.report.v1.schema.source.js +9 -0
  252. package/src/schemas/workspace/tiinex.workspace.v1.capabilities.js +12 -0
  253. package/src/schemas/workspace/tiinex.workspace.v1.en.i18n.json +7 -0
  254. package/src/schemas/workspace/tiinex.workspace.v1.findings.js +5 -0
  255. package/src/schemas/workspace/tiinex.workspace.v1.presenter.js +27 -0
  256. package/src/schemas/workspace/tiinex.workspace.v1.schema.js +30 -0
  257. package/src/schemas/workspace/tiinex.workspace.v1.schema.json +23 -0
  258. package/src/schemas/workspace/tiinex.workspace.v1.schema.runtime.json +1596 -0
  259. package/src/schemas/workspace/tiinex.workspace.v1.schema.source.js +9 -0
  260. package/src/schemas/workspace/tiinex.workspace.v1.sv.i18n.json +7 -0
  261. package/src/schemas/workspace/tiinex.workspace.v1.transitions.js +10 -0
  262. package/src/schemas/workspace/tiinex.workspace.v1.validate.js +10 -0
  263. package/src/sources/github/github.issueTarget.js +127 -0
  264. package/src/sources/origin.references.js +249 -0
  265. package/src/sources/source.explicitTargets.js +49 -0
  266. package/src/sources/transport.levels.js +107 -0
  267. package/src/tooling/portable/adapters/cli/cli.cold-start-input.js +34 -0
  268. package/src/tooling/portable/adapters/cli/cli.command-input.js +455 -0
  269. package/src/tooling/portable/adapters/cli/cli.common-author.js +249 -0
  270. package/src/tooling/portable/adapters/cli/cli.common-output.js +330 -0
  271. package/src/tooling/portable/adapters/cli/cli.editor-assistance.js +13 -0
  272. package/src/tooling/portable/adapters/cli/cli.ground-materialize.js +96 -0
  273. package/src/tooling/portable/adapters/cli/cli.ground-recovery.js +99 -0
  274. package/src/tooling/portable/adapters/cli/cli.handoff-manufacture.js +345 -0
  275. package/src/tooling/portable/adapters/cli/cli.handoff-sibling-allocation.js +31 -0
  276. package/src/tooling/portable/adapters/cli/cli.help.js +80 -0
  277. package/src/tooling/portable/adapters/cli/cli.land.js +13 -0
  278. package/src/tooling/portable/adapters/cli/cli.local-output.js +72 -0
  279. package/src/tooling/portable/adapters/cli/cli.material-policy.js +6 -0
  280. package/src/tooling/portable/adapters/cli/cli.operator-bridge.js +18 -0
  281. package/src/tooling/portable/adapters/cli/cli.reduction-input.js +14 -0
  282. package/src/tooling/portable/adapters/cli/cli.run.js +434 -0
  283. package/src/tooling/portable/adapters/llm/llm.entrypoint.js +34 -0
  284. package/src/tooling/portable/adapters/node/checkpoint.verify.js +267 -0
  285. package/src/tooling/portable/adapters/node/handoff.manufacture.bootstrap.js +109 -0
  286. package/src/tooling/portable/adapters/node/handoff.manufacture.enumeration.js +94 -0
  287. package/src/tooling/portable/adapters/node/handoff.manufacture.js +193 -0
  288. package/src/tooling/portable/adapters/node/handoff.manufacture.multiRoot.js +49 -0
  289. package/src/tooling/portable/adapters/node/handoff.manufacture.packageParent.js +130 -0
  290. package/src/tooling/portable/adapters/node/handoff.manufacture.requirements.js +353 -0
  291. package/src/tooling/portable/adapters/node/handoff.manufacture.scope.js +147 -0
  292. package/src/tooling/portable/adapters/node/workspaceCarrier.manufacture.js +62 -0
  293. package/src/tooling/portable/assets/asset.operations.js +170 -0
  294. package/src/tooling/portable/audit/audit.capability.js +119 -0
  295. package/src/tooling/portable/bootstrap/artifact.result.selfverify.mjs +109 -0
  296. package/src/tooling/portable/bootstrap/bootstrap.case.mjs +43 -0
  297. package/src/tooling/portable/bootstrap/tiinex.llm.bootstrap.md +814 -0
  298. package/src/tooling/portable/bootstrap/tiinex.llm.bootstrap.pointer.json +25 -0
  299. package/src/tooling/portable/checkpoint/portable.checkpoint.js +89 -0
  300. package/src/tooling/portable/conformance/checkpoint.qualification.js +271 -0
  301. package/src/tooling/portable/draft/draft.create.js +389 -0
  302. package/src/tooling/portable/draft/draft.crud.js +175 -0
  303. package/src/tooling/portable/draft/draft.exact.js +173 -0
  304. package/src/tooling/portable/draft/draft.operations.js +265 -0
  305. package/src/tooling/portable/draft/draft.qualification.js +45 -0
  306. package/src/tooling/portable/draft/draft.set.js +193 -0
  307. package/src/tooling/portable/draft/draft.validation-context.js +7 -0
  308. package/src/tooling/portable/editor/authoring.parent.js +37 -0
  309. package/src/tooling/portable/editor/editor.assistance.js +221 -0
  310. package/src/tooling/portable/editor/staged.validation.js +96 -0
  311. package/src/tooling/portable/engine.facade.js +468 -0
  312. package/src/tooling/portable/findings.js +92 -0
  313. package/src/tooling/portable/grounding/grounding.capsule.js +128 -0
  314. package/src/tooling/portable/grounding/grounding.continuity.js +283 -0
  315. package/src/tooling/portable/grounding/grounding.participantAuthority.js +20 -0
  316. package/src/tooling/portable/grounding/grounding.planningContext.js +34 -0
  317. package/src/tooling/portable/grounding/grounding.readiness.authority.js +17 -0
  318. package/src/tooling/portable/grounding/grounding.readiness.js +316 -0
  319. package/src/tooling/portable/grounding/grounding.readiness.support.js +245 -0
  320. package/src/tooling/portable/grounding/grounding.sourceEvidence.js +71 -0
  321. package/src/tooling/portable/grounding/grounding.workContext.js +72 -0
  322. package/src/tooling/portable/grounding/grounding.workProvenance.js +153 -0
  323. package/src/tooling/portable/handoff/carrierLineage.js +214 -0
  324. package/src/tooling/portable/handoff/carrierProfile.js +54 -0
  325. package/src/tooling/portable/handoff/carrierProjection.js +193 -0
  326. package/src/tooling/portable/handoff/carrierProjection.routeQualification.js +228 -0
  327. package/src/tooling/portable/handoff/carrierProjection.shared.js +7 -0
  328. package/src/tooling/portable/handoff/carrierProjection.workspaces.js +54 -0
  329. package/src/tooling/portable/handoff/coldConsumerEntrypoint.js +185 -0
  330. package/src/tooling/portable/handoff/coldStartQualification.contract.js +184 -0
  331. package/src/tooling/portable/handoff/coldStartQualification.grounding.js +392 -0
  332. package/src/tooling/portable/handoff/coldStartQualification.js +22 -0
  333. package/src/tooling/portable/handoff/coldStartQualification.materials.js +364 -0
  334. package/src/tooling/portable/handoff/coldStartQualification.observation.js +220 -0
  335. package/src/tooling/portable/handoff/coldStartQualification.run.js +81 -0
  336. package/src/tooling/portable/handoff/coldStartQualification.shared.js +57 -0
  337. package/src/tooling/portable/handoff/coldStartRolePointers.js +39 -0
  338. package/src/tooling/portable/handoff/contextAudit.js +247 -0
  339. package/src/tooling/portable/handoff/contracts/tiinex.handoff.package.v1.schema.md +409 -0
  340. package/src/tooling/portable/handoff/handoffAuthoringPlan.js +35 -0
  341. package/src/tooling/portable/handoff/handoffEndpointProjection.js +61 -0
  342. package/src/tooling/portable/handoff/handoffLeafProjection.js +91 -0
  343. package/src/tooling/portable/handoff/humanOutputPresentation.js +21 -0
  344. package/src/tooling/portable/handoff/manufacture.js +84 -0
  345. package/src/tooling/portable/handoff/materialClosure.archiveV2.binding.js +72 -0
  346. package/src/tooling/portable/handoff/materialClosure.archiveV2.direct.js +160 -0
  347. package/src/tooling/portable/handoff/materialClosure.archiveV2.indexes.js +36 -0
  348. package/src/tooling/portable/handoff/materialClosure.archiveV2.js +247 -0
  349. package/src/tooling/portable/handoff/materialClosure.archiveV2.projectionProvider.js +44 -0
  350. package/src/tooling/portable/handoff/materialClosure.archiveV2.workspace.js +226 -0
  351. package/src/tooling/portable/handoff/materialClosure.descriptor.js +169 -0
  352. package/src/tooling/portable/handoff/materialClosure.inputBinding.js +372 -0
  353. package/src/tooling/portable/handoff/materialClosure.inputBinding.support.js +62 -0
  354. package/src/tooling/portable/handoff/materialClosure.materialized.js +143 -0
  355. package/src/tooling/portable/handoff/materialClosure.materials.js +116 -0
  356. package/src/tooling/portable/handoff/materialClosure.package.js +181 -0
  357. package/src/tooling/portable/handoff/materialClosure.plan.js +204 -0
  358. package/src/tooling/portable/handoff/materialClosure.readiness.js +36 -0
  359. package/src/tooling/portable/handoff/materialClosure.requirements.js +137 -0
  360. package/src/tooling/portable/handoff/operatorContextProjection.js +105 -0
  361. package/src/tooling/portable/handoff/pointerEntrypoint.js +138 -0
  362. package/src/tooling/portable/handoff/qualifiedHandoffFixture.js +34 -0
  363. package/src/tooling/portable/handoff/recipientV2.artifactFirst.build.js +321 -0
  364. package/src/tooling/portable/handoff/recipientV2.artifactFirst.closure.js +126 -0
  365. package/src/tooling/portable/handoff/recipientV2.artifactFirst.inspect.js +194 -0
  366. package/src/tooling/portable/handoff/recipientV2.artifactFirst.materials.js +207 -0
  367. package/src/tooling/portable/handoff/recipientV2.artifactFirst.projection.js +69 -0
  368. package/src/tooling/portable/handoff/recipientV2.artifactFirst.roles.js +166 -0
  369. package/src/tooling/portable/handoff/recipientV2.artifactFirst.routes.js +113 -0
  370. package/src/tooling/portable/handoff/recipientV2.artifactFirst.shared.js +87 -0
  371. package/src/tooling/portable/handoff/recipientV2.artifactFirst.workspaces.js +160 -0
  372. package/src/tooling/portable/handoff/recipientV2.artifactFirstPhase1.js +44 -0
  373. package/src/tooling/portable/handoff/recipientV2.artifactInspection.js +55 -0
  374. package/src/tooling/portable/handoff/recipientV2.artifacts.js +174 -0
  375. package/src/tooling/portable/handoff/recipientV2.coldProjection.js +24 -0
  376. package/src/tooling/portable/handoff/recipientV2.delivery.js +48 -0
  377. package/src/tooling/portable/handoff/recipientV2.endpointRolePointers.js +179 -0
  378. package/src/tooling/portable/handoff/recipientV2.entryContract.js +28 -0
  379. package/src/tooling/portable/handoff/recipientV2.humanOutput.js +78 -0
  380. package/src/tooling/portable/handoff/recipientV2.inspect.helpers.js +218 -0
  381. package/src/tooling/portable/handoff/recipientV2.inspect.js +194 -0
  382. package/src/tooling/portable/handoff/recipientV2.inspect.pathToken.js +9 -0
  383. package/src/tooling/portable/handoff/recipientV2.inspect.projection.js +58 -0
  384. package/src/tooling/portable/handoff/recipientV2.inspect.workspaces.js +177 -0
  385. package/src/tooling/portable/handoff/recipientV2.lineage.js +142 -0
  386. package/src/tooling/portable/handoff/recipientV2.packageV1.build.js +147 -0
  387. package/src/tooling/portable/handoff/recipientV2.packageV1.constants.js +4 -0
  388. package/src/tooling/portable/handoff/recipientV2.packageV1.contract.js +101 -0
  389. package/src/tooling/portable/handoff/recipientV2.packageV1.inspect.helpers.js +126 -0
  390. package/src/tooling/portable/handoff/recipientV2.packageV1.inspect.js +185 -0
  391. package/src/tooling/portable/handoff/recipientV2.packageV1.js +12 -0
  392. package/src/tooling/portable/handoff/recipientV2.packageV1.shared.js +24 -0
  393. package/src/tooling/portable/handoff/recipientV2.packageV1.workspaceProjection.js +22 -0
  394. package/src/tooling/portable/handoff/recipientV2.pointer.js +40 -0
  395. package/src/tooling/portable/handoff/recipientV2.routeSelection.js +16 -0
  396. package/src/tooling/portable/handoff/recipientV2.topology.helpers.js +20 -0
  397. package/src/tooling/portable/handoff/recipientV2.topology.js +320 -0
  398. package/src/tooling/portable/handoff/recipientV2.topology.materials.js +70 -0
  399. package/src/tooling/portable/handoff/recipientV2.topology.workspaces.js +193 -0
  400. package/src/tooling/portable/handoff/recipientV2.transportManifest.js +123 -0
  401. package/src/tooling/portable/handoff/recipientV2.workspaceRepresentation.js +163 -0
  402. package/src/tooling/portable/handoff/routeArtifactConformance.js +130 -0
  403. package/src/tooling/portable/handoff/toolingBootstrap.js +67 -0
  404. package/src/tooling/portable/handoff/transportCompanion.js +175 -0
  405. package/src/tooling/portable/handoff/workspaceByteProvider.archive.js +95 -0
  406. package/src/tooling/portable/handoff/workspaceByteProvider.js +271 -0
  407. package/src/tooling/portable/handoff/workspaceCarrier.manufacture.js +93 -0
  408. package/src/tooling/portable/handoff/workspaceLandingPlan.js +142 -0
  409. package/src/tooling/portable/handoff/workspacePackageSources.js +105 -0
  410. package/src/tooling/portable/handoff/workspaceQualifiedReference.js +10 -0
  411. package/src/tooling/portable/handoff/workspaceSourceIdentity.js +52 -0
  412. package/src/tooling/portable/handoff/workspaceTargetConformance.js +134 -0
  413. package/src/tooling/portable/host/host.capabilities.js +181 -0
  414. package/src/tooling/portable/host/tool.bindings.js +357 -0
  415. package/src/tooling/portable/host/tool.receiptNormalization.js +141 -0
  416. package/src/tooling/portable/index.js +52 -0
  417. package/src/tooling/portable/input/node.input.js +184 -0
  418. package/src/tooling/portable/input/portable.input.js +249 -0
  419. package/src/tooling/portable/lifecycle/lifecycle.action.js +11 -0
  420. package/src/tooling/portable/lifecycle/lifecycle.material.js +173 -0
  421. package/src/tooling/portable/lifecycle/lifecycle.operations.js +34 -0
  422. package/src/tooling/portable/lifecycle/lifecycle.readiness.js +247 -0
  423. package/src/tooling/portable/lineage/lineage.integrity.apply.audit.js +22 -0
  424. package/src/tooling/portable/lineage/lineage.integrity.apply.evidence.js +36 -0
  425. package/src/tooling/portable/lineage/lineage.integrity.apply.js +306 -0
  426. package/src/tooling/portable/lineage/lineage.integrity.apply.structure.js +178 -0
  427. package/src/tooling/portable/lineage/lineage.integrity.plan.js +377 -0
  428. package/src/tooling/portable/lineage/lineage.integrity.projection.human.js +82 -0
  429. package/src/tooling/portable/lineage/lineage.integrity.projection.js +349 -0
  430. package/src/tooling/portable/lineage/lineage.operations.js +32 -0
  431. package/src/tooling/portable/lineage/lineage.print.js +398 -0
  432. package/src/tooling/portable/lineage/lineage.print.render.js +88 -0
  433. package/src/tooling/portable/lineage/lineage.print.utils.js +58 -0
  434. package/src/tooling/portable/lineage/lineage.publicationProviderReceipts.js +141 -0
  435. package/src/tooling/portable/lineage/lineage.publicationQualification.js +183 -0
  436. package/src/tooling/portable/lineage/lineage.search.js +301 -0
  437. package/src/tooling/portable/live/live.artifact.js +192 -0
  438. package/src/tooling/portable/live/live.export.js +107 -0
  439. package/src/tooling/portable/live/live.lineage.closure.js +71 -0
  440. package/src/tooling/portable/live/live.lineage.js +338 -0
  441. package/src/tooling/portable/live/live.protocol.js +181 -0
  442. package/src/tooling/portable/materialization/durable.materialize.js +162 -0
  443. package/src/tooling/portable/materialization/epistemic.plan.js +239 -0
  444. package/src/tooling/portable/materialization/loaded.parent.js +54 -0
  445. package/src/tooling/portable/materialization/materialization.facade.js +30 -0
  446. package/src/tooling/portable/operation.catalog.js +393 -0
  447. package/src/tooling/portable/operation.catalog.package.js +183 -0
  448. package/src/tooling/portable/operation.result.js +25 -0
  449. package/src/tooling/portable/orchestration/task.prepare.js +191 -0
  450. package/src/tooling/portable/output/artifact.result.package.js +308 -0
  451. package/src/tooling/portable/output/deterministic.zip.js +88 -0
  452. package/src/tooling/portable/output/node.artifact-set.js +223 -0
  453. package/src/tooling/portable/output/node.draft.js +41 -0
  454. package/src/tooling/portable/output/node.zip.js +39 -0
  455. package/src/tooling/portable/output/recipientV2.zip.js +59 -0
  456. package/src/tooling/portable/overview/blockingCue.js +16 -0
  457. package/src/tooling/portable/overview/operatingOverview.js +413 -0
  458. package/src/tooling/portable/package/generation.binding.js +314 -0
  459. package/src/tooling/portable/package/generation.binding.projection.js +128 -0
  460. package/src/tooling/portable/package/material.graph.js +236 -0
  461. package/src/tooling/portable/package/runtime.package.js +321 -0
  462. package/src/tooling/portable/package/schema.transition.companion.js +196 -0
  463. package/src/tooling/portable/package/semantic.package.graph.js +272 -0
  464. package/src/tooling/portable/package/semantic.package.js +203 -0
  465. package/src/tooling/portable/package/semantic.package.schema-resolution.js +158 -0
  466. package/src/tooling/portable/package/semantic.package.transition-registry.js +189 -0
  467. package/src/tooling/portable/package/semantic.package.types.js +18 -0
  468. package/src/tooling/portable/providers/schema.bootstrap.provenance.js +10 -0
  469. package/src/tooling/portable/providers/schema.provider.qualification.js +52 -0
  470. package/src/tooling/portable/providers/schema.providers.js +458 -0
  471. package/src/tooling/portable/publication/runtime.publication.js +53 -0
  472. package/src/tooling/portable/qualification.js +150 -0
  473. package/src/tooling/portable/reduction/reduction.composition.js +229 -0
  474. package/src/tooling/portable/reduction/reduction.eligibility.helpers.js +258 -0
  475. package/src/tooling/portable/reduction/reduction.eligibility.js +191 -0
  476. package/src/tooling/portable/reduction/reduction.operations.js +30 -0
  477. package/src/tooling/portable/reduction/reduction.preflight.js +85 -0
  478. package/src/tooling/portable/reduction/reduction.shared.js +173 -0
  479. package/src/tooling/portable/schema/bootstrap/canonical.pack.js +24 -0
  480. package/src/tooling/portable/schema/bootstrap/docs-3988951208eb9a8926e84ab42625d4b42fa00c2d/party/role/tiinex.party.role.v1.schema.md +289 -0
  481. package/src/tooling/portable/schema/bootstrap/docs-3988951208eb9a8926e84ab42625d4b42fa00c2d/validation/report/tiinex.validation.report.v1.schema.md +300 -0
  482. package/src/tooling/portable/schema/bootstrap/qualified-local-root/tiinex.root.v1.runtime-projection.json +48 -0
  483. package/src/tooling/portable/schema/bootstrap/qualified-local-root/tiinex.root.v1.schema.md +865 -0
  484. package/src/tooling/portable/schema/contract.compile.js +406 -0
  485. package/src/tooling/portable/schema/contract.compile.utils.js +9 -0
  486. package/src/tooling/portable/schema/contract.constraints.js +117 -0
  487. package/src/tooling/portable/schema/contract.envelope.validate.js +177 -0
  488. package/src/tooling/portable/schema/contract.field-domain.compile.js +399 -0
  489. package/src/tooling/portable/schema/contract.field-domain.js +247 -0
  490. package/src/tooling/portable/schema/contract.field-shape.compile.js +34 -0
  491. package/src/tooling/portable/schema/contract.inheritance.inline.js +103 -0
  492. package/src/tooling/portable/schema/contract.inheritance.js +210 -0
  493. package/src/tooling/portable/schema/contract.inheritance.record.js +76 -0
  494. package/src/tooling/portable/schema/contract.machine-shape.js +309 -0
  495. package/src/tooling/portable/schema/contract.project.js +81 -0
  496. package/src/tooling/portable/schema/contract.semantic-resolution.js +82 -0
  497. package/src/tooling/portable/schema/contract.validate.js +0 -0
  498. package/src/tooling/portable/schema/lexical.shape.v1.js +338 -0
  499. package/src/tooling/portable/schema/llm.companion.js +108 -0
  500. package/src/tooling/portable/schema/named.declarations.js +162 -0
  501. package/src/tooling/portable/schema/ordinary.contract.js +193 -0
  502. package/src/tooling/portable/schema/ordinary.fields.js +205 -0
  503. package/src/tooling/portable/schema/qualifiedLocalRoot.projection.js +70 -0
  504. package/src/tooling/portable/schema/qualifiedLocalRoot.runtime.js +170 -0
  505. package/src/tooling/portable/schema/schema.contract.js +465 -0
  506. package/src/tooling/portable/schema/schema.guide.js +326 -0
  507. package/src/tooling/portable/schema/schema.snapshot.js +119 -0
  508. package/src/tooling/portable/session/portable.session.js +145 -0
  509. package/src/tooling/portable/transfer/transfer.plan.js +102 -0
  510. package/src/transitions/record.transitions.js +484 -0
  511. package/src/transitions/transition.validate.js +129 -0
  512. package/src/validation/findings.js +76 -0
  513. package/src/validation/validateArtifact.js +216 -0
  514. package/src/workspaces/workspace.entrypointCapability.js +44 -0
  515. package/src/workspaces/workspace.materialRole.js +242 -0
  516. package/src/workspaces/workspace.recordPaths.js +426 -0
  517. package/tools/tiinex-portable.mjs +6 -0
@@ -0,0 +1,366 @@
1
+ import { buildExportPackageContract, buildExportPackageReceipt, finalizeExportPackageManifestPaths } from './package.manifest.js';
2
+ import { packageAssetBytes, packageFileByteView, packageFileBytes, sha256Hex, stableFingerprintBytes, utf8Bytes } from './package.bytes.js';
3
+ import { assignFinalPackagePaths, buildExportPackageFileMap, EXPORT_PACKAGE_FILE_MAP_PATH, finalizeFile, inspectExportPackageFileMap } from './package.fileMap.js';
4
+ import { workspaceContextOwnedMarkdown } from './package.workspaceContext.js';
5
+ import { inspectExportPackageControlConsistency, packageMaterialRepresentationSha256 } from './package.controlIntegrity.js';
6
+ import { buildExportPackageControlIndex, EXPORT_PACKAGE_CONTROL_PATHS, inspectExportPackageControlTopology } from './package.controlTopology.js';
7
+
8
+ export const EXPORT_PACKAGE_BUNDLE_SCHEMA_ID = 'tiinex.export.package.bundle.v1';
9
+ export const EXPORT_PACKAGE_BUILD_RECEIPT_SCHEMA_ID = 'tiinex.export.package.build.receipt.v1';
10
+
11
+ export function buildExportPackageBundle(workspace = {}, input = {}) {
12
+ const records = Array.isArray(input.records) ? input.records : (Array.isArray(workspace.records) ? workspace.records : []);
13
+ const assets = Array.isArray(input.assets) ? input.assets : (Array.isArray(workspace.assets) ? workspace.assets : []);
14
+ const workspaceCandidates = Array.isArray(input.workspaceCandidates) ? input.workspaceCandidates : (Array.isArray(workspace.workspaceMergeCandidates) ? workspace.workspaceMergeCandidates : []);
15
+ const initialContract = input.contract || buildExportPackageContract(workspace, Object.assign({}, input, { records, assets, workspaceCandidates }));
16
+ const initialManifest = initialContract.manifest || {};
17
+ const builtAt = typeof input.clock === 'function' ? input.clock() : (input.builtAt || new Date().toISOString());
18
+ const allowBlocked = input.allowBlocked === true;
19
+ const includeDegraded = input.includeDegraded !== false;
20
+ const recordIndex = indexByIdAndPath(records);
21
+ const assetIndex = indexByIdAndPath(assets);
22
+ const candidateIndex = indexByIdAndPath(workspaceCandidates);
23
+ const findings = [];
24
+ const materialFiles = [];
25
+
26
+ const blocked = initialManifest.status === 'blocked' && !allowBlocked;
27
+ if (blocked) {
28
+ findings.push(bundleFinding('error', 'export.package.bundle.blocked', 'Package bundle was not built because the manifest is blocked.', { packageId: initialManifest.packageId || '' }));
29
+ } else if (initialManifest.status === 'degraded' && !includeDegraded) {
30
+ findings.push(bundleFinding('error', 'export.package.bundle.degraded-disabled', 'Package bundle was not built because degraded package entries were not allowed.', { packageId: initialManifest.packageId || '' }));
31
+ } else {
32
+ materialFiles.push(...buildLocalDraftFiles(initialManifest.material?.localDrafts || [], recordIndex, findings));
33
+ materialFiles.push(...buildSourceReferenceFiles(initialManifest.material?.sourceReferences || [], findings));
34
+ materialFiles.push(...buildAssetFiles(initialManifest.material?.assets || [], assetIndex, findings));
35
+ materialFiles.push(...buildWorkspaceCandidateFiles(initialManifest.material?.workspaceContextCandidates || [], candidateIndex, findings));
36
+ materialFiles.push(...buildWorkspaceContextFiles(initialManifest.material?.workspaceContext || {}, workspace, findings));
37
+ }
38
+
39
+ const finalMaterialFiles = assignFinalPackagePaths(materialFiles, findings);
40
+ const manifest = finalizeExportPackageManifestPaths(initialManifest, finalMaterialFiles);
41
+ const receipt = buildExportPackageReceipt(manifest, input);
42
+ const contract = deepFreeze({ ...initialContract, status: manifest.status || initialContract.status || 'unknown', manifest, receipt });
43
+ const buildReceipt = buildPackageBuildReceipt({ contract, manifest, receipt, builtAt, materialFiles: finalMaterialFiles, findings, blocked });
44
+ const controlFiles = buildControlFiles({ contract, manifest, receipt, buildReceipt, findings });
45
+ const governedFiles = assignFinalPackagePaths([...controlFiles, ...finalMaterialFiles], findings).map(finalizeFile);
46
+ const fileMap = buildExportPackageFileMap(governedFiles, { packageId: manifest.packageId || '' });
47
+ const fileMapFile = makeJsonFile(EXPORT_PACKAGE_FILE_MAP_PATH, 'package-file-map', fileMap);
48
+ const files = Object.freeze([...governedFiles, fileMapFile]);
49
+ const packageFingerprint = stableFingerprint(files.map((file) => ({ path: file.path, fingerprint: file.fingerprint, bytes: file.bytes })));
50
+ const counts = Object.freeze({
51
+ files: files.length,
52
+ controlFiles: files.filter((file) => file.path.startsWith('tiinex.package/')).length,
53
+ materialFiles: finalMaterialFiles.length,
54
+ localDraftFiles: files.filter((file) => file.kind === 'artifact-markdown').length,
55
+ sourceReferenceFiles: files.filter((file) => file.kind === 'source-reference').length,
56
+ assetContentFiles: files.filter((file) => file.kind === 'asset-content').length,
57
+ assetReferenceFiles: files.filter((file) => file.kind === 'asset-source-reference').length,
58
+ assetMetadataFiles: files.filter((file) => file.kind === 'asset-metadata').length,
59
+ workspaceCandidateFiles: files.filter((file) => file.kind === 'workspace-candidate').length,
60
+ workspaceContextFiles: files.filter((file) => file.kind === 'workspace-context' || file.kind === 'workspace-context-markdown').length,
61
+ blocked: manifest.counts?.blocked || 0,
62
+ errors: findings.filter((finding) => finding.severity === 'error').length,
63
+ warnings: findings.filter((finding) => finding.severity === 'warning').length,
64
+ findings: findings.length
65
+ });
66
+ const status = counts.errors || blocked ? 'blocked' : (manifest.status === 'degraded' || counts.warnings ? 'degraded' : 'ready');
67
+
68
+ return deepFreeze({
69
+ schema: EXPORT_PACKAGE_BUNDLE_SCHEMA_ID,
70
+ packageId: manifest.packageId || receipt.packageId || '',
71
+ builtAt,
72
+ status,
73
+ boundary: 'Platform-neutral package representation with durable serialized file-map authority. It writes no zip by itself, mutates no source, fetches no remote content, and preserves local/source/asset/workspace-context boundaries.',
74
+ packageFingerprint,
75
+ packageRepresentationSha256: fileMap.representationSha256,
76
+ contract,
77
+ manifest,
78
+ receipt,
79
+ buildReceipt,
80
+ fileMap,
81
+ counts,
82
+ files,
83
+ findings: Object.freeze(findings)
84
+ });
85
+ }
86
+
87
+ export function inspectExportPackageBundle(bundle = {}) {
88
+ const files = Array.isArray(bundle.files) ? bundle.files : [];
89
+ const paths = new Set();
90
+ const findings = [];
91
+ for (const file of files) {
92
+ if (!file.path) findings.push(bundleFinding('error', 'export.package.bundle.file.path-missing', 'Package file is missing a path.', { kind: file.kind || '' }));
93
+ if (file.path && paths.has(file.path)) findings.push(bundleFinding('error', 'export.package.bundle.file.path-duplicate', 'Package file path is duplicated.', { path: file.path }));
94
+ paths.add(file.path);
95
+ if (file.path && isUnsafePackagePath(file.path)) findings.push(bundleFinding('error', 'export.package.bundle.file.path-unsafe', 'Package file path is unsafe.', { path: file.path }));
96
+ const data = packageFileByteView(file);
97
+ if (Number(file.bytes || 0) !== data.byteLength) findings.push(bundleFinding('error', 'export.package.bundle.file.bytes-mismatch', 'Package file byte count does not match exact serialized bytes.', { path: file.path || '' }));
98
+ if (file.sha256 && file.sha256 !== sha256Hex(data)) findings.push(bundleFinding('error', 'export.package.bundle.file.sha256-mismatch', 'Package file SHA-256 does not match exact serialized bytes.', { path: file.path || '' }));
99
+ if (file.fingerprint && file.fingerprint !== stableFingerprintBytes(data)) findings.push(bundleFinding('error', 'export.package.bundle.file.fingerprint-mismatch', 'Package file compatibility fingerprint does not match exact serialized bytes.', { path: file.path || '' }));
100
+ }
101
+ const controlTopology = inspectExportPackageControlTopology(files);
102
+ findings.push(...controlTopology.findings);
103
+ findings.push(...inspectExportPackageControlConsistency(files, { controls: controlTopology.controls, topologyChecked: true }));
104
+
105
+ const fileMapFile = files.find((file) => file.path === EXPORT_PACKAGE_CONTROL_PATHS.fileMap);
106
+ const fileMap = controlTopology.controls.fileMap || parseJsonFile(fileMapFile) || bundle.fileMap || null;
107
+ if (!fileMap) {
108
+ findings.push(bundleFinding('error', 'export.package.bundle.file-map-unreadable', 'Package bundle is missing a readable durable file map.'));
109
+ } else {
110
+ const manifestFile = files.find((file) => file.path === EXPORT_PACKAGE_CONTROL_PATHS.manifest);
111
+ const manifest = controlTopology.controls.manifest || parseJsonFile(manifestFile) || bundle.manifest || {};
112
+ const fileMapInspection = inspectExportPackageFileMap(fileMap, files, manifest);
113
+ findings.push(...fileMapInspection.findings);
114
+ }
115
+ return Object.freeze({
116
+ schema: 'tiinex.export.package.bundle.inspection.v2',
117
+ status: findings.some((finding) => finding.severity === 'error') ? 'invalid' : 'valid',
118
+ counts: Object.freeze({ files: files.length, findings: findings.length, errors: findings.filter((finding) => finding.severity === 'error').length }),
119
+ findings: Object.freeze(findings)
120
+ });
121
+ }
122
+
123
+ function buildControlFiles({ contract, manifest, receipt, buildReceipt, findings }) {
124
+ const index = buildExportPackageControlIndex({
125
+ packageId: manifest.packageId || '',
126
+ status: manifest.status || 'unknown',
127
+ entries: flattenManifestEntries(manifest)
128
+ });
129
+ return [
130
+ makeJsonFile(EXPORT_PACKAGE_CONTROL_PATHS.index, 'package-index', index),
131
+ makeJsonFile(EXPORT_PACKAGE_CONTROL_PATHS.manifest, 'package-manifest', manifest),
132
+ makeJsonFile(EXPORT_PACKAGE_CONTROL_PATHS.receipt, 'package-receipt', receipt),
133
+ makeJsonFile(EXPORT_PACKAGE_CONTROL_PATHS.buildReceipt, 'package-build-receipt', buildReceipt),
134
+ makeJsonFile(EXPORT_PACKAGE_CONTROL_PATHS.contract, 'package-contract', contract),
135
+ makeJsonFile(EXPORT_PACKAGE_CONTROL_PATHS.findings, 'package-findings', { schema: 'tiinex.export.package.findings.v1', findings })
136
+ ];
137
+ }
138
+
139
+ function buildLocalDraftFiles(entries = [], recordIndex = new Map(), findings = []) {
140
+ return entries.map((entry) => {
141
+ const record = lookupEntry(recordIndex, entry) || {};
142
+ const markdown = record.markdown || record.content || record.text || '';
143
+ if (!markdown) findings.push(bundleFinding('error', 'export.package.bundle.local-draft.content-missing', 'Local draft manifest entry had no Markdown content to bundle.', { entryId: entry.id || '', path: entry.path || '' }));
144
+ return makeTextFile(entry.packagePath || `artifacts/${normalizeRelativePath(entry.path || entry.id || 'draft.md')}`, 'artifact-markdown', markdown, {
145
+ entryId: entry.id || '',
146
+ logicalKind: 'local-draft',
147
+ title: entry.title || record.title || '',
148
+ boundary: entry.boundary || 'Local draft Markdown bundled as local/session material.'
149
+ });
150
+ });
151
+ }
152
+
153
+ function buildSourceReferenceFiles(entries = [], findings = []) {
154
+ return entries.map((entry) => {
155
+ if (entry.status === 'degraded-reference') findings.push(bundleFinding('warning', 'export.package.bundle.source-reference.degraded', 'Source reference bundled with degraded exactness; no fallback lookup is attempted.', { entryId: entry.id || '', path: entry.path || '', repo: entry.repo || '' }));
156
+ const sourceReference = {
157
+ schema: 'tiinex.export.package.source-reference.v2',
158
+ id: entry.id || '',
159
+ title: entry.title || '',
160
+ status: entry.status || 'degraded-reference',
161
+ boundary: entry.boundary || 'Source-backed material remains a reference.',
162
+ target: entry.target || {}
163
+ };
164
+ return makeJsonFile(entry.packagePath || `sources/${normalizeRelativePath(entry.id || 'source.source.json')}`, 'source-reference', sourceReference, {
165
+ entryId: entry.id || '',
166
+ logicalKind: 'source-reference',
167
+ sourceBoundary: entry.target?.boundary || ''
168
+ });
169
+ });
170
+ }
171
+
172
+ function buildAssetFiles(entries = [], assetIndex = new Map(), findings = []) {
173
+ return entries.map((entry) => {
174
+ const asset = lookupEntry(assetIndex, entry) || {};
175
+ if (entry.status === 'source-reference') {
176
+ return makeJsonFile(entry.packagePath, 'asset-source-reference', {
177
+ schema: 'tiinex.export.package.asset-source-reference.v1',
178
+ id: entry.id || '',
179
+ title: entry.title || '',
180
+ path: entry.path || '',
181
+ mediaType: entry.mediaType || asset.type || asset.mimeType || '',
182
+ byteSize: Number(entry.byteSize || asset.size || 0),
183
+ status: 'source-reference',
184
+ boundary: entry.boundary || asset.source?.boundary || 'Source-backed asset remains a reference.',
185
+ target: entry.sourceReference || {}
186
+ }, { entryId: entry.id || '', logicalKind: 'asset-source-reference', sourceBoundary: entry.sourceReference?.boundary || '' });
187
+ }
188
+ if (entry.status === 'content-available') {
189
+ const projection = packageAssetBytes(asset);
190
+ if (!projection.bytes.byteLength) findings.push(bundleFinding('error', 'export.package.bundle.asset.content-missing', 'Asset manifest claimed owned content but exact bytes were unavailable.', { entryId: entry.id || '', path: entry.path || '' }));
191
+ return makeBinaryFile(entry.packagePath, 'asset-content', projection.bytes, {
192
+ entryId: entry.id || '',
193
+ logicalKind: 'owned-local-asset',
194
+ mediaType: entry.mediaType || projection.mediaType || 'application/octet-stream',
195
+ boundary: entry.boundary || asset.source?.boundary || 'Owned local asset bytes bundled without source promotion.',
196
+ ...(projection.representation.startsWith('utf8-') ? { content: asset.content || asset.text || '' } : {})
197
+ });
198
+ }
199
+ findings.push(bundleFinding('warning', 'export.package.bundle.asset.metadata-only', 'Local asset bundled as metadata-only descriptor because full owned bytes are unavailable.', { entryId: entry.id || '', path: entry.path || '' }));
200
+ return makeJsonFile(entry.packagePath, 'asset-metadata', {
201
+ schema: 'tiinex.export.package.asset-metadata.v2',
202
+ id: entry.id || '',
203
+ title: entry.title || '',
204
+ path: entry.path || '',
205
+ mediaType: entry.mediaType || asset.type || asset.mimeType || '',
206
+ size: Number(entry.byteSize || asset.size || 0),
207
+ status: 'metadata-only',
208
+ boundary: entry.boundary || asset.source?.boundary || 'Metadata-only local asset entry; content requires reselection.'
209
+ }, { entryId: entry.id || '', logicalKind: 'asset-metadata' });
210
+ });
211
+ }
212
+
213
+ function buildWorkspaceCandidateFiles(entries = [], candidateIndex = new Map(), findings = []) {
214
+ return entries.map((entry) => {
215
+ const candidate = lookupEntry(candidateIndex, entry) || {};
216
+ findings.push(bundleFinding('info', 'export.package.bundle.workspace-candidate.descriptor', 'Legacy/I/O workspace candidate bundled as descriptor only; canonical workspace context is separate.', { entryId: entry.id || '', path: entry.path || '' }));
217
+ return makeJsonFile(entry.packagePath, 'workspace-candidate', {
218
+ schema: 'tiinex.export.package.workspace-candidate.v1',
219
+ id: entry.id || '',
220
+ title: entry.title || candidate.title || '',
221
+ path: entry.path || candidate.path || '',
222
+ status: entry.status || 'open-or-merge-required',
223
+ boundary: entry.boundary || 'Compatibility workspace candidate descriptor; not canonical runtime workspace context.'
224
+ }, { entryId: entry.id || '', logicalKind: 'workspace-candidate' });
225
+ });
226
+ }
227
+
228
+ function buildWorkspaceContextFiles(entry = {}, workspace = {}, findings = []) {
229
+ if (!entry.id) return [];
230
+ const context = entry.context || {};
231
+ const out = [makeJsonFile(entry.packagePath || 'context/workspace.json', 'workspace-context', context, {
232
+ entryId: entry.id,
233
+ logicalKind: 'workspace-context',
234
+ boundary: entry.boundary || context.boundary || ''
235
+ })];
236
+ const markdown = workspaceContextOwnedMarkdown(workspace);
237
+ if (context.workspaceMarkdown?.available) {
238
+ if (!markdown) findings.push(bundleFinding('error', 'export.package.bundle.workspace-context.markdown-missing', 'Workspace context claimed owned local workspace Markdown but exact content was unavailable.', { entryId: entry.id }));
239
+ else out.push(makeTextFile(context.workspaceMarkdown.packagePath || 'context/workspace.workspace.md', 'workspace-context-markdown', markdown, {
240
+ entryId: `${entry.id}:markdown`,
241
+ logicalKind: 'workspace-context-markdown',
242
+ mediaType: 'text/markdown',
243
+ boundary: 'Owned local workspace artifact/context Markdown. It remains local until explicit publication.'
244
+ }));
245
+ }
246
+ return out;
247
+ }
248
+
249
+ function buildPackageBuildReceipt({ contract, manifest, receipt, builtAt, materialFiles, findings, blocked }) {
250
+ const status = blocked || findings.some((finding) => finding.severity === 'error') ? 'blocked' : (manifest.status === 'degraded' || findings.some((finding) => finding.severity === 'warning') ? 'degraded' : 'ready');
251
+ return Object.freeze({
252
+ schema: EXPORT_PACKAGE_BUILD_RECEIPT_SCHEMA_ID,
253
+ packageId: manifest.packageId || receipt.packageId || '',
254
+ at: builtAt,
255
+ operation: 'export-package-file-map-built',
256
+ state: status === 'blocked' ? 'blocked' : 'built-governed-file-map',
257
+ status,
258
+ boundary: 'Build receipt records deterministic package material/control construction before ZIP serialization. Exact serialized file bytes are governed by tiinex.package/file-map.json; no remote/source mutation occurred.',
259
+ manifestFingerprint: manifest.integrity?.fingerprint || '',
260
+ materialRepresentationSha256: packageMaterialRepresentationSha256(materialFiles),
261
+ contractStatus: contract.status || manifest.status || 'unknown',
262
+ counts: Object.freeze({ materialFiles: materialFiles.length, findings: findings.length, errors: findings.filter((finding) => finding.severity === 'error').length, warnings: findings.filter((finding) => finding.severity === 'warning').length }),
263
+ findings: Object.freeze(findings.slice())
264
+ });
265
+ }
266
+
267
+ function flattenManifestEntries(manifest = {}) {
268
+ const material = manifest.material || {};
269
+ return [
270
+ ...(material.localDrafts || []),
271
+ ...(material.sourceReferences || []),
272
+ ...(material.assets || []),
273
+ ...(material.workspaceContextCandidates || []),
274
+ ...(material.workspaceContext ? [material.workspaceContext] : [])
275
+ ].map((entry) => ({ id: entry.id || '', kind: entry.kind || '', path: entry.path || '', packagePath: entry.packagePath || '', packagePaths: entry.packagePaths || [], status: entry.status || '' }));
276
+ }
277
+
278
+ function makeTextFile(path, kind, content, extra = {}) {
279
+ const text = String(content ?? '');
280
+ return finalizeFile({
281
+ path: normalizeRelativePath(path),
282
+ kind,
283
+ mediaType: extra.mediaType || (kind.includes('markdown') ? 'text/markdown' : 'text/plain'),
284
+ content: text,
285
+ ...omit(extra, ['mediaType'])
286
+ });
287
+ }
288
+
289
+ function makeBinaryFile(path, kind, data, extra = {}) {
290
+ return finalizeFile({
291
+ path: normalizeRelativePath(path),
292
+ kind,
293
+ mediaType: extra.mediaType || 'application/octet-stream',
294
+ data,
295
+ ...omit(extra, ['mediaType', 'content']),
296
+ ...(typeof extra.content === 'string' ? { content: extra.content } : {})
297
+ });
298
+ }
299
+
300
+ function makeJsonFile(path, kind, value, extra = {}) {
301
+ const content = `${stablePrettyJson(value)}\n`;
302
+ return finalizeFile({
303
+ path: normalizeRelativePath(path),
304
+ kind,
305
+ mediaType: 'application/json',
306
+ content,
307
+ ...extra
308
+ });
309
+ }
310
+
311
+ function parseJsonFile(file = {}) {
312
+ try {
313
+ const data = packageFileBytes(file);
314
+ return JSON.parse(new TextDecoder().decode(data));
315
+ } catch (_) {
316
+ return null;
317
+ }
318
+ }
319
+
320
+ function indexByIdAndPath(items = []) {
321
+ const index = new Map();
322
+ for (const item of items) {
323
+ for (const key of [item.id, item.path, item.title, item.name]) if (key) index.set(String(key), item);
324
+ }
325
+ return index;
326
+ }
327
+ function lookupEntry(index, entry = {}) {
328
+ for (const key of [entry.id, entry.path, entry.title]) if (key && index.has(String(key))) return index.get(String(key));
329
+ return null;
330
+ }
331
+ function normalizeRelativePath(path = '') {
332
+ const input = String(path || '').trim().replace(/\\/g, '/').replace(/^\/+/, '');
333
+ const parts = [];
334
+ for (const part of input.split('/')) {
335
+ const clean = part.trim();
336
+ if (!clean || clean === '.' || clean === '..') continue;
337
+ parts.push(clean.replace(/[\u0000-\u001f<>:"|?*]/g, '_'));
338
+ }
339
+ return parts.join('/') || 'entry';
340
+ }
341
+ function isUnsafePackagePath(path = '') { return !path || path.startsWith('/') || path.split('/').includes('..') || /[\\\u0000-\u001f]/.test(path); }
342
+ function stableFingerprint(value) {
343
+ const text = stableStringify(value);
344
+ let hash = 2166136261;
345
+ for (let index = 0; index < text.length; index += 1) { hash ^= text.charCodeAt(index); hash = Math.imul(hash, 16777619); }
346
+ return `tixfp1-${(hash >>> 0).toString(16).padStart(8, '0')}`;
347
+ }
348
+ function stableStringify(value) { return JSON.stringify(sortForJson(value)); }
349
+ function stablePrettyJson(value) { return JSON.stringify(sortForJson(value), null, 2); }
350
+ function sortForJson(value) {
351
+ if (Array.isArray(value)) return value.map(sortForJson);
352
+ if (!value || typeof value !== 'object') return value;
353
+ return Object.fromEntries(Object.keys(value).sort().map((key) => [key, sortForJson(value[key])]));
354
+ }
355
+ function omit(object = {}, keys = []) {
356
+ const out = {};
357
+ for (const [key, value] of Object.entries(object)) if (!keys.includes(key)) out[key] = value;
358
+ return out;
359
+ }
360
+ function bundleFinding(severity, code, message, extra = {}) { return Object.freeze(Object.assign({ severity, code, message }, extra)); }
361
+ function deepFreeze(value) {
362
+ if (!value || typeof value !== 'object' || Object.isFrozen(value)) return value;
363
+ if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) return value;
364
+ for (const child of Object.values(value)) deepFreeze(child);
365
+ return Object.freeze(value);
366
+ }
@@ -0,0 +1,164 @@
1
+ const TEXT_ENCODER = new TextEncoder();
2
+ const TEXT_DECODER = new TextDecoder();
3
+
4
+ export function utf8Bytes(value = '') {
5
+ return TEXT_ENCODER.encode(String(value ?? ''));
6
+ }
7
+
8
+ export function utf8Text(value = new Uint8Array()) {
9
+ return TEXT_DECODER.decode(toUint8Array(value));
10
+ }
11
+
12
+ export function toUint8Array(value) {
13
+ if (value instanceof Uint8Array) return value.slice();
14
+ if (value instanceof ArrayBuffer) return new Uint8Array(value.slice(0));
15
+ if (ArrayBuffer.isView(value)) return new Uint8Array(value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength));
16
+ if (Array.isArray(value) && value.every((item) => Number.isInteger(item) && item >= 0 && item <= 255)) return Uint8Array.from(value);
17
+ if (value === undefined || value === null) return new Uint8Array();
18
+ return utf8Bytes(String(value));
19
+ }
20
+
21
+ export function bytesFromDataUrl(value = '') {
22
+ const text = String(value || '');
23
+ const match = text.match(/^data:([^;,]*)(;base64)?,(.*)$/s);
24
+ if (!match) return null;
25
+ const mediaType = match[1] || 'text/plain';
26
+ const base64 = Boolean(match[2]);
27
+ const payload = match[3] || '';
28
+ try {
29
+ const bytes = base64 ? decodeBase64(payload) : utf8Bytes(decodeURIComponent(payload.replace(/\+/g, '%20')));
30
+ return Object.freeze({ bytes, mediaType });
31
+ } catch (_) {
32
+ return null;
33
+ }
34
+ }
35
+
36
+ export function packageAssetBytes(asset = {}) {
37
+ if (asset.bytes instanceof Uint8Array || asset.bytes instanceof ArrayBuffer || ArrayBuffer.isView(asset.bytes) || Array.isArray(asset.bytes)) {
38
+ return Object.freeze({ bytes: toUint8Array(asset.bytes), mediaType: String(asset.type || asset.mimeType || 'application/octet-stream'), representation: 'raw-bytes' });
39
+ }
40
+ if (typeof asset.dataUrl === 'string' && asset.dataUrl) {
41
+ const decoded = bytesFromDataUrl(asset.dataUrl);
42
+ if (decoded) return Object.freeze({ bytes: decoded.bytes, mediaType: String(asset.type || asset.mimeType || decoded.mediaType || 'application/octet-stream'), representation: 'decoded-data-url' });
43
+ }
44
+ if (typeof asset.content === 'string') return Object.freeze({ bytes: utf8Bytes(asset.content), mediaType: String(asset.type || asset.mimeType || 'text/plain'), representation: 'utf8-content' });
45
+ if (typeof asset.text === 'string') return Object.freeze({ bytes: utf8Bytes(asset.text), mediaType: String(asset.type || asset.mimeType || 'text/plain'), representation: 'utf8-text' });
46
+ return Object.freeze({ bytes: new Uint8Array(), mediaType: String(asset.type || asset.mimeType || 'application/octet-stream'), representation: 'unavailable' });
47
+ }
48
+
49
+ export function packageFileByteView(file = {}) {
50
+ if (file.data instanceof Uint8Array) return file.data;
51
+ if (file.bytesData instanceof Uint8Array) return file.bytesData;
52
+ if (file.bytes instanceof Uint8Array) return file.bytes;
53
+ return packageFileBytes(file);
54
+ }
55
+
56
+ export function packageFileBytes(file = {}) {
57
+ if (file.data instanceof Uint8Array || file.data instanceof ArrayBuffer || ArrayBuffer.isView(file.data) || Array.isArray(file.data)) return toUint8Array(file.data);
58
+ if (file.bytesData instanceof Uint8Array || file.bytesData instanceof ArrayBuffer || ArrayBuffer.isView(file.bytesData) || Array.isArray(file.bytesData)) return toUint8Array(file.bytesData);
59
+ if (typeof file.content === 'string') return utf8Bytes(file.content);
60
+ if (typeof file.markdown === 'string') return utf8Bytes(file.markdown);
61
+ if (file.bytes instanceof Uint8Array || file.bytes instanceof ArrayBuffer || ArrayBuffer.isView(file.bytes) || Array.isArray(file.bytes)) return toUint8Array(file.bytes);
62
+ return new Uint8Array();
63
+ }
64
+
65
+ export function stableFingerprintBytes(value) {
66
+ const bytes = toUint8Array(value);
67
+ let hash = 2166136261;
68
+ for (const byte of bytes) {
69
+ hash ^= byte;
70
+ hash = Math.imul(hash, 16777619);
71
+ }
72
+ return `tixfp1-${(hash >>> 0).toString(16).padStart(8, '0')}`;
73
+ }
74
+
75
+ export function sha256Hex(value) {
76
+ const bytes = readOnlyUint8View(value);
77
+ const words = [];
78
+ const bitLength = bytes.length * 8;
79
+ const paddedLength = (((bytes.length + 9 + 63) >> 6) << 6);
80
+ const padded = new Uint8Array(paddedLength);
81
+ padded.set(bytes);
82
+ padded[bytes.length] = 0x80;
83
+ const view = new DataView(padded.buffer);
84
+ const high = Math.floor(bitLength / 0x100000000);
85
+ const low = bitLength >>> 0;
86
+ view.setUint32(paddedLength - 8, high, false);
87
+ view.setUint32(paddedLength - 4, low, false);
88
+
89
+ let h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a;
90
+ let h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19;
91
+ const w = new Uint32Array(64);
92
+
93
+ for (let offset = 0; offset < padded.length; offset += 64) {
94
+ for (let i = 0; i < 16; i += 1) w[i] = view.getUint32(offset + i * 4, false);
95
+ for (let i = 16; i < 64; i += 1) {
96
+ const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ (w[i - 15] >>> 3);
97
+ const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ (w[i - 2] >>> 10);
98
+ w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;
99
+ }
100
+ let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7;
101
+ for (let i = 0; i < 64; i += 1) {
102
+ const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);
103
+ const ch = (e & f) ^ (~e & g);
104
+ // Keep compression-round additions inline. A rest-parameter add helper allocates
105
+ // per round and turns large recipient-package integrity checks into a CPU hotspot.
106
+ const temp1 = (h + s1 + ch + K[i] + w[i]) >>> 0;
107
+ const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);
108
+ const maj = (a & b) ^ (a & c) ^ (b & c);
109
+ const temp2 = (s0 + maj) >>> 0;
110
+ h = g; g = f; f = e; e = (d + temp1) >>> 0;
111
+ d = c; c = b; b = a; a = (temp1 + temp2) >>> 0;
112
+ }
113
+ h0 = (h0 + a) >>> 0; h1 = (h1 + b) >>> 0; h2 = (h2 + c) >>> 0; h3 = (h3 + d) >>> 0;
114
+ h4 = (h4 + e) >>> 0; h5 = (h5 + f) >>> 0; h6 = (h6 + g) >>> 0; h7 = (h7 + h) >>> 0;
115
+ }
116
+ words.push(h0, h1, h2, h3, h4, h5, h6, h7);
117
+ return words.map((word) => (word >>> 0).toString(16).padStart(8, '0')).join('');
118
+ }
119
+
120
+
121
+ function readOnlyUint8View(value) {
122
+ if (value instanceof Uint8Array) return value;
123
+ if (value instanceof ArrayBuffer) return new Uint8Array(value);
124
+ if (ArrayBuffer.isView(value)) return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
125
+ if (Array.isArray(value) && value.every((item) => Number.isInteger(item) && item >= 0 && item <= 255)) return Uint8Array.from(value);
126
+ if (value === undefined || value === null) return new Uint8Array();
127
+ return utf8Bytes(String(value));
128
+ }
129
+
130
+ function rotr(value, bits) { return (value >>> bits) | (value << (32 - bits)); }
131
+ function decodeBase64(value = '') {
132
+ const clean = String(value || '').replace(/\s+/g, '');
133
+ if (typeof atob === 'function') {
134
+ const binary = atob(clean);
135
+ const out = new Uint8Array(binary.length);
136
+ for (let i = 0; i < binary.length; i += 1) out[i] = binary.charCodeAt(i);
137
+ return out;
138
+ }
139
+ const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
140
+ let buffer = 0, bits = 0;
141
+ const out = [];
142
+ for (const char of clean.replace(/=+$/, '')) {
143
+ const valueIndex = alphabet.indexOf(char);
144
+ if (valueIndex < 0) throw new Error('invalid-base64');
145
+ buffer = (buffer << 6) | valueIndex;
146
+ bits += 6;
147
+ if (bits >= 8) {
148
+ bits -= 8;
149
+ out.push((buffer >>> bits) & 0xff);
150
+ }
151
+ }
152
+ return Uint8Array.from(out);
153
+ }
154
+
155
+ const K = new Uint32Array([
156
+ 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
157
+ 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
158
+ 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
159
+ 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
160
+ 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
161
+ 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
162
+ 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
163
+ 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
164
+ ]);
@@ -0,0 +1,42 @@
1
+ import { packageFileByteView, packageFileBytes, sha256Hex, utf8Bytes } from './package.bytes.js';
2
+ import { exportPackageManifestFingerprint } from './package.manifest.js';
3
+ import { inspectExportPackageControlTopology } from './package.controlTopology.js';
4
+
5
+ export function inspectExportPackageControlConsistency(files = [], input = {}) {
6
+ const topology = input.topologyChecked
7
+ ? { findings: [], controls: input.controls || {} }
8
+ : inspectExportPackageControlTopology(files);
9
+ const findings = [...topology.findings];
10
+ const manifest = topology.controls.manifest || null;
11
+ const receipt = topology.controls.receipt || null;
12
+ const buildReceipt = topology.controls.buildReceipt || null;
13
+ const contract = topology.controls.contract || null;
14
+ if (!manifest || !receipt || !buildReceipt || !contract) return findings;
15
+
16
+ const expectedFingerprint = exportPackageManifestFingerprint(manifest);
17
+ if (String(manifest.integrity?.fingerprint || '') !== expectedFingerprint) findings.push(finding('error', 'export.package.bundle.manifest-fingerprint-mismatch', 'Manifest semantic fingerprint does not match its declared material/status authority.'));
18
+ if (String(receipt.packageId || '') !== String(manifest.packageId || '')) findings.push(finding('error', 'export.package.bundle.receipt-package-id-mismatch', 'Receipt package identity differs from manifest package identity.'));
19
+ if (String(receipt.manifestFingerprint || '') !== expectedFingerprint) findings.push(finding('error', 'export.package.bundle.receipt-manifest-mismatch', 'Receipt no longer corresponds to the exact manifest semantic fingerprint.'));
20
+ if (String(buildReceipt.packageId || '') !== String(manifest.packageId || '')) findings.push(finding('error', 'export.package.bundle.build-receipt-package-id-mismatch', 'Build receipt package identity differs from manifest package identity.'));
21
+ if (String(buildReceipt.manifestFingerprint || '') !== expectedFingerprint) findings.push(finding('error', 'export.package.bundle.build-receipt-manifest-mismatch', 'Build receipt no longer corresponds to the exact manifest semantic fingerprint.'));
22
+ if (String(buildReceipt.materialRepresentationSha256 || '') !== packageMaterialRepresentationSha256(files)) findings.push(finding('error', 'export.package.bundle.build-receipt-material-mismatch', 'Build receipt no longer corresponds to the exact governed material byte representation.'));
23
+ if (String(contract.manifest?.integrity?.fingerprint || '') !== expectedFingerprint || String(contract.manifest?.packageId || '') !== String(manifest.packageId || '')) findings.push(finding('error', 'export.package.bundle.contract-manifest-mismatch', 'Embedded contract manifest differs from the serialized manifest control authority.'));
24
+ if (String(contract.receipt?.manifestFingerprint || '') !== String(receipt.manifestFingerprint || '') || String(contract.receipt?.receiptId || '') !== String(receipt.receiptId || '')) findings.push(finding('error', 'export.package.bundle.contract-receipt-mismatch', 'Embedded contract receipt differs from the serialized receipt control authority.'));
25
+ return findings;
26
+ }
27
+
28
+
29
+ export function packageMaterialRepresentationSha256(files = []) {
30
+ const entries = files
31
+ .filter((file) => file?.path && !String(file.path).startsWith('tiinex.package/'))
32
+ .map((file) => ({
33
+ path: String(file.path || ''),
34
+ entryId: String(file.entryId || ''),
35
+ kind: String(file.kind || ''),
36
+ bytes: packageFileByteView(file).byteLength,
37
+ sha256: sha256Hex(packageFileByteView(file))
38
+ }))
39
+ .sort((a, b) => a.path.localeCompare(b.path) || a.entryId.localeCompare(b.entryId));
40
+ return sha256Hex(utf8Bytes(JSON.stringify(entries)));
41
+ }
42
+ function finding(severity, code, message, extra = {}) { return Object.freeze({ severity, code, message, ...extra }); }