@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,84 @@
1
+ import { summarizePortableFindings } from '../findings.js';
2
+ import { inspectPortableToolingBootstrap } from './toolingBootstrap.js';
3
+ import { upgradeRecipientRelativeHandoffTransportPackageV2 } from './materialClosure.archiveV2.js';
4
+ import { buildRecipientRelativeHandoffV2DirectBaseline } from './materialClosure.archiveV2.direct.js';
5
+ import { qualifyMajorCarrierReadiness } from './carrierLineage.js';
6
+ import { manufactureRecipientRelativeWorkspacePackage } from './workspaceCarrier.manufacture.js';
7
+
8
+ export function manufactureRecipientRelativeHandoffPackage(input = {}, options = {}) {
9
+ if (String(input.carrierMode || '') === 'workspace') return manufactureRecipientRelativeWorkspacePackage(input, options);
10
+ const baseline = buildRecipientRelativeHandoffV2DirectBaseline(input, options);
11
+ const upgraded = upgradeRecipientRelativeHandoffTransportPackageV2(baseline, input, options);
12
+ const toolingBootstrapInspection = upgraded.inspection?.bootstrapInspection || inspectPortableToolingBootstrap(baseline.bundle || upgraded.bundle || {});
13
+ const majorReadiness = qualifyMajorCarrierReadiness({
14
+ ...input,
15
+ carrierProfile: input.carrierProfile || null
16
+ }, input.carrierLineage || upgraded.carrierProjection?.lineage || baseline.carrierProjection?.lineage || {});
17
+ const majorFindings = majorReadiness.state === 'blocked' ? [Object.freeze({ severity: 'error', code: 'portable.handoff-carrier-lineage.major.not-self-contained', message: 'Major Handoff carrier requires complete replacement-capable carried Workspace snapshots.' })] : [];
18
+ const findings = Object.freeze([
19
+ ...majorFindings,
20
+ ...(baseline.findings || []),
21
+ ...(upgraded.findings || []),
22
+ ...(upgraded.inspection?.findings || []),
23
+ ...(upgraded.closureInspection?.findings || []),
24
+ ...(upgraded.carrierInspection?.findings || []),
25
+ ...(upgraded.pointerEntrypointInspection?.findings || []),
26
+ ...(upgraded.coldConsumerEntrypointInspection?.findings || []),
27
+ ...(upgraded.companionInspection?.findings || []),
28
+ ...(upgraded.roundtrip?.findings || []),
29
+ ...(toolingBootstrapInspection?.findings || [])
30
+ ]);
31
+ const status = baseline.status !== 'blocked' && upgraded.status !== 'blocked' && toolingBootstrapInspection?.status === 'valid' && majorReadiness.state !== 'blocked' ? upgraded.status : 'blocked';
32
+ return Object.freeze({
33
+ schema: 'tiinex.portable.handoff-manufacturing.v2',
34
+ status,
35
+ executable: Boolean(baseline.executable) && status !== 'blocked',
36
+ transportExecutable: status !== 'blocked',
37
+ verification: Object.freeze({
38
+ baselineManufacture: String(baseline.status || 'unavailable'),
39
+ manufacturePath: 'direct-qualified-workspace-to-archive',
40
+ packageInspection: String(upgraded.inspection?.status || 'unavailable'),
41
+ closureInspection: String(upgraded.closureInspection?.status || 'unavailable'),
42
+ carrierInspection: String(upgraded.carrierInspection?.status || 'unavailable'),
43
+ selectedHandoffConformance: (upgraded.carrierProjection?.routes || []).length > 0 && (upgraded.carrierProjection?.routes || []).every((route) => route.conformance?.status === 'qualified') ? 'qualified' : 'blocked',
44
+ pointerEntrypointInspection: String(upgraded.pointerEntrypointInspection?.status || 'unavailable'),
45
+ coldConsumerEntrypointInspection: String(upgraded.coldConsumerEntrypointInspection?.status || 'unavailable'),
46
+ companionInspection: String(upgraded.companionInspection?.status || 'unavailable'),
47
+ roundtrip: upgraded.roundtrip ? String(upgraded.roundtrip.status || 'unknown') : 'not-requested',
48
+ toolingBootstrap: String(toolingBootstrapInspection?.status || 'unavailable')
49
+ }),
50
+ plan: baseline.plan,
51
+ bundle: upgraded.bundle || baseline.bundle,
52
+ descriptor: upgraded.descriptor || baseline.descriptor,
53
+ transportCompanion: upgraded.transportCompanion || baseline.transportCompanion,
54
+ inspection: upgraded.inspection || baseline.inspection,
55
+ closureInspection: upgraded.closureInspection || baseline.closureInspection,
56
+ carrierProjection: upgraded.carrierProjection || baseline.carrierProjection,
57
+ carrierInspection: upgraded.carrierInspection || baseline.carrierInspection,
58
+ pointerEntrypointProjection: upgraded.pointerEntrypointProjection || baseline.pointerEntrypointProjection,
59
+ pointerEntrypointInspection: upgraded.pointerEntrypointInspection || baseline.pointerEntrypointInspection,
60
+ coldConsumerProjection: upgraded.coldConsumerProjection || baseline.coldConsumerProjection,
61
+ coldConsumerEntrypointInspection: upgraded.coldConsumerEntrypointInspection || baseline.coldConsumerEntrypointInspection,
62
+ companionInspection: upgraded.companionInspection || baseline.companionInspection,
63
+ roundtrip: upgraded.roundtrip || null,
64
+ toolingBootstrap: input.toolingBootstrap || null,
65
+ manufacturingEvidence: input.manufacturingEvidence || null,
66
+ toolingBootstrapInspection,
67
+ carrierLineage: upgraded.carrierProjection?.lineage || baseline.carrierProjection?.lineage || input.carrierLineage || null,
68
+ majorReadiness,
69
+ operationBoundary: Object.freeze({
70
+ operationClass: 'local-handoff-package-manufacture',
71
+ inputScope: 'caller-provided-local-workspace-material-and-optional-parent-package',
72
+ localPackageConstruction: true,
73
+ sourceMutation: false,
74
+ remoteMutation: false,
75
+ physicalRoundtripVerification: upgraded.roundtrip ? String(upgraded.roundtrip.status || 'unknown') : 'not-requested',
76
+ hostBehaviorAuthority: 'none'
77
+ }),
78
+ migration: upgraded.migration || null,
79
+ baseline: Object.freeze({ schema: baseline.schema, status: baseline.status, packageRepresentationSha256: String(baseline.bundle?.packageRepresentationSha256 || ''), representation: 'semantic-control-plus-detached-material-without-exploded-workspace-carrier' }),
80
+ findings,
81
+ findingSummary: summarizePortableFindings(findings),
82
+ boundary: 'Canonical archive-backed Handoff manufacturing facade. It fails closed unless each carrier workspace is bound to one exact carried tiinex.workspace.v1 artifact and one independently verified complete workspace archive.'
83
+ });
84
+ }
@@ -0,0 +1,72 @@
1
+ import { packageFileBytes, sha256Hex, utf8Bytes } from '../../../export/package.bytes.js';
2
+ import {
3
+ HANDOFF_WORKSPACE_ARCHIVE_BINDING_SCHEMA_ID,
4
+ HANDOFF_WORKSPACE_ARCHIVE_CODEC,
5
+ HANDOFF_WORKSPACE_ARCHIVE_PROVIDER_KIND,
6
+ HANDOFF_WORKSPACE_INNER_PATH_NORMALIZATION,
7
+ normalizeHandoffWorkspaceInnerPath
8
+ } from './workspaceByteProvider.js';
9
+
10
+ export function buildWorkspaceArchiveBinding({ workspace = {}, qualified = {}, archiveFile = {}, targetFile = {}, coverage = '' } = {}) {
11
+ const materialization = coverage === 'bounded' || String(workspace.materialization || '') === 'bounded' ? 'bounded' : 'complete';
12
+ const evidence = materialization === 'bounded' ? (workspace.scopeEvidence || {}) : (workspace.completenessEvidence || {});
13
+ const entries = (qualified.entries || []).map((entry) => Object.freeze({ path: entry.path, bytes: entry.bytes, sha256: entry.sha256, referenceTarget: entry.referenceTarget }));
14
+ const entriesFingerprint = sha256Hex(utf8Bytes(stableJson(entries)));
15
+ const totalBytes = entries.reduce((sum, entry) => sum + Number(entry.bytes || 0), 0);
16
+ return deepFreeze({
17
+ schema: HANDOFF_WORKSPACE_ARCHIVE_BINDING_SCHEMA_ID,
18
+ version: 1,
19
+ workspaceId: String(workspace.id || ''),
20
+ transportCorrelationKey: String(workspace.transportCorrelationKey || ''),
21
+ workspaceTarget: Object.freeze({
22
+ packagePath: String(targetFile.path || ''),
23
+ innerPath: String(qualified.target?.path || ''),
24
+ bytes: Number(targetFile.bytes || 0),
25
+ sha256: String(targetFile.sha256 || ''),
26
+ schema: 'tiinex.workspace.v1',
27
+ selfIntegrity: Object.freeze({ state: String(qualified.target?.selfIntegrity?.state || ''), value: String(qualified.target?.selfIntegrity?.value || '') }),
28
+ locatorAuthority: false
29
+ }),
30
+ coverage: materialization,
31
+ representation: Object.freeze({
32
+ kind: materialization === 'bounded' ? 'bounded-workspace-snapshot' : 'complete-workspace-snapshot',
33
+ packagePath: String(archiveFile.path || ''),
34
+ mediaType: 'application/zip',
35
+ codec: HANDOFF_WORKSPACE_ARCHIVE_CODEC,
36
+ bytes: Number(archiveFile.bytes || 0),
37
+ digest: Object.freeze({ method: 'sha256', value: String(archiveFile.sha256 || ''), target: 'archive-bytes-as-carried' }),
38
+ deterministic: true,
39
+ locatorAuthority: false
40
+ }),
41
+ entryMap: Object.freeze({ normalization: HANDOFF_WORKSPACE_INNER_PATH_NORMALIZATION, count: entries.length, entries: Object.freeze(entries) }),
42
+ completeness: materialization === 'complete' ? Object.freeze({ state: 'qualified', basis: 'exact-qualified-workspace-completeness-evidence-plus-complete-archive-entry-set', entryCount: entries.length, totalBytes, entriesFingerprint }) : Object.freeze({}),
43
+ scope: materialization === 'bounded' ? Object.freeze({ ...evidence, state: 'qualified', entryCount: entries.length, totalBytes, entriesFingerprint }) : Object.freeze({}),
44
+ selection: Object.freeze({ rule: materialization === 'bounded' ? 'explicit-binding-per-bounded-scope' : 'exactly-one-binding-per-workspace', representationArtifactAuthority: 'explicit-recipient-workspace-representation-link' }),
45
+ provider: Object.freeze({ kind: HANDOFF_WORKSPACE_ARCHIVE_PROVIDER_KIND, state: 'ready', addressing: 'qualified-workspace-id-plus-normalized-inner-path', fallback: 'none', materialization }),
46
+ authority: Object.freeze({ workspaceIdentity: 'exact-workspace-target-byte-identity', archiveIdentity: 'exact-archive-byte-digest', pathAuthority: false, adjacencyAuthority: false, orderingAuthority: false, priorProvenanceAuthority: false })
47
+ });
48
+ }
49
+
50
+ export function detachedParentCandidates(materialized = [], byPath = new Map()) {
51
+ const out = [];
52
+ const seen = new Set();
53
+ for (const material of materialized || []) {
54
+ const packagePath = String(material.packagePath || '');
55
+ const workspacePath = normalizedOrEmpty(material.provenance?.path || material.originalPath || material.path || '');
56
+ if (!packagePath || !workspacePath) continue;
57
+ const files = byPath.get(packagePath) || [];
58
+ if (files.length !== 1) continue;
59
+ const data = packageFileBytes(files[0]);
60
+ const sha256 = sha256Hex(data);
61
+ const key = `${workspacePath}\u0000${sha256}`;
62
+ if (seen.has(key)) continue;
63
+ seen.add(key);
64
+ out.push(Object.freeze({ path: workspacePath, data, bytes: data.byteLength, sha256 }));
65
+ }
66
+ return Object.freeze(out);
67
+ }
68
+
69
+ function normalizedOrEmpty(value = '') { const normalized = normalizeHandoffWorkspaceInnerPath(value); return normalized.state === 'qualified' ? normalized.path : ''; }
70
+ function stableJson(value) { return JSON.stringify(sortJson(value)); }
71
+ function sortJson(value) { if (Array.isArray(value)) return value.map(sortJson); if (!value || typeof value !== 'object') return value; return Object.fromEntries(Object.keys(value).sort().map((key) => [key, sortJson(value[key])])); }
72
+ function deepFreeze(value) { if (!value || typeof value !== 'object' || Object.isFrozen(value)) return value; if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) return value; for (const child of Object.values(value)) deepFreeze(child); return Object.freeze(value); }
@@ -0,0 +1,160 @@
1
+ import { buildExportPackageBundle } from '../../../export/package.builder.js';
2
+ import { buildExportPackageFileMap, finalizeFile } from '../../../export/package.fileMap.js';
3
+ import { packageFileBytes, sha256Hex, stableFingerprintBytes, utf8Bytes } from '../../../export/package.bytes.js';
4
+ import { packageMaterialRepresentationSha256 } from '../../../export/package.controlIntegrity.js';
5
+ import { planRecipientRelativeHandoffMaterialClosure, workspaceMaterializationCorrelationKey } from './materialClosure.plan.js';
6
+ import { buildHandoffClosureDescriptor, HANDOFF_CLOSURE_DESCRIPTOR_PATH } from './materialClosure.descriptor.js';
7
+ import { qualifyHandoffMaterialClosurePlanReadiness } from './materialClosure.readiness.js';
8
+ import { qualifyHandoffMaterialClosurePlanInputBinding } from './materialClosure.inputBinding.js';
9
+ import { qualifyHandoffMaterializedOutput } from './materialClosure.materialized.js';
10
+ import { HANDOFF_CARRIER_PROJECTION_PATH } from './carrierProjection.js';
11
+ import { HANDOFF_COLD_CONSUMER_ENTRYPOINT_PATH } from './coldConsumerEntrypoint.js';
12
+ import { HANDOFF_POINTER_ENTRYPOINT_PREFIX } from './pointerEntrypoint.js';
13
+ import { HANDOFF_TRANSPORT_COMPANION_PATH } from './transportCompanion.js';
14
+
15
+ export const PORTABLE_HANDOFF_V2_DIRECT_BASELINE_SCHEMA_ID = 'tiinex.portable.handoff-v2-direct-baseline.v1';
16
+
17
+ export function buildRecipientRelativeHandoffV2DirectBaseline(input = {}, options = {}) {
18
+ const plan = input.plan || planRecipientRelativeHandoffMaterialClosure(input, options);
19
+ const planReadiness = qualifyHandoffMaterialClosurePlanReadiness(plan);
20
+ const planInputBinding = qualifyHandoffMaterialClosurePlanInputBinding(plan, input, { externallySupplied: Boolean(input.plan) });
21
+ const materializedOutputQualification = qualifyHandoffMaterializedOutput(plan);
22
+ const baseBundle = input.baseBundle || buildExportPackageBundle(input.workspace || {}, { ...(input.packageInput || {}), ...(options.packageInput || {}) });
23
+ const extraFiles = [];
24
+ const packagedMaterial = [];
25
+ for (const entry of materializedOutputQualification.state === 'qualified' ? materializedOutputQualification.expected : []) {
26
+ const file = finalizeFile({
27
+ path: materialPackagePath(entry),
28
+ kind: 'handoff-material',
29
+ logicalKind: 'recipient-relative-material',
30
+ entryId: entry.requirementId,
31
+ mediaType: entry.mediaType || 'application/octet-stream',
32
+ data: entry.data,
33
+ boundary: 'Recipient-relative exact byte carrier. Canonical artifact/source/workspace authority remains external and is preserved in the closure descriptor.'
34
+ });
35
+ extraFiles.push(file);
36
+ packagedMaterial.push(Object.freeze({ ...entry, packagePath: file.path, bytes: file.bytes, sha256: file.sha256 }));
37
+ }
38
+
39
+ const directWorkspaceSources = [];
40
+ const packagedWorkspaces = [];
41
+ const planByCorrelation = indexPlanWorkspaces(plan.workspaceMaterializations || []);
42
+ const rawCorrelationCounts = countRawCorrelations(input.workspaceMaterializations || []);
43
+ let workspaceCorrelationBlocked = false;
44
+ for (const rawWorkspace of input.workspaceMaterializations || []) {
45
+ const transportCorrelationKey = workspaceMaterializationCorrelationKey(rawWorkspace);
46
+ const matches = planByCorrelation.get(transportCorrelationKey) || [];
47
+ const rawCount = rawCorrelationCounts.get(transportCorrelationKey) || 0;
48
+ const qualifiedWorkspace = matches.length === 1 && rawCount === 1 ? matches[0] : null;
49
+ const correlationStatus = qualifiedWorkspace ? 'qualified' : (matches.length > 1 || rawCount > 1 ? 'ambiguous' : 'unresolved');
50
+ if (!qualifiedWorkspace) workspaceCorrelationBlocked = true;
51
+ const workspaceId = String(qualifiedWorkspace?.id || rawWorkspace.id || rawWorkspace.workspaceId || 'workspace');
52
+ packagedWorkspaces.push(Object.freeze({
53
+ id: workspaceId,
54
+ transportCorrelationKey,
55
+ correlationStatus,
56
+ entries: Object.freeze((qualifiedWorkspace?.includedEntries || []).map((entry) => Object.freeze({ ...entry })))
57
+ }));
58
+ directWorkspaceSources.push(Object.freeze({ workspaceId, transportCorrelationKey, correlationStatus, workspace: rawWorkspace }));
59
+ }
60
+ if ((plan.workspaceMaterializations || []).length !== packagedWorkspaces.length) workspaceCorrelationBlocked = true;
61
+
62
+ let bootstrapPath = '';
63
+ let bootstrapCarrierBlocked = false;
64
+ if (plan.bootstrap?.status === 'present') {
65
+ const bootstrapPresented = input.bootstrap?.present === true || input.bootstrap?.include === true;
66
+ const bootstrapData = packageFileBytes(input.bootstrap || {});
67
+ if (!bootstrapPresented || bootstrapData.byteLength === 0) bootstrapCarrierBlocked = true;
68
+ else {
69
+ bootstrapPath = safePath(input.bootstrap?.path || 'tiinex.package/bootstrap.md');
70
+ extraFiles.push(finalizeFile({ path: bootstrapPath, kind: 'handoff-bootstrap', logicalKind: 'transport-orientation', mediaType: String(input.bootstrap?.mediaType || input.bootstrap?.type || 'text/markdown'), data: bootstrapData, boundary: 'Optional transport orientation only; not a Tiinex artifact or workspace lineage member.' }));
71
+ }
72
+ }
73
+
74
+ let additionalTransportBlocked = false;
75
+ const additionalTransportPaths = new Set();
76
+ for (const entry of input.additionalTransportFiles || []) {
77
+ const filePath = safePath(entry.path || '');
78
+ const data = packageFileBytes(entry);
79
+ if (!filePath || data.byteLength === 0 || additionalTransportPaths.has(filePath) || reservedGeneratedPath(filePath)) {
80
+ additionalTransportBlocked = true;
81
+ continue;
82
+ }
83
+ additionalTransportPaths.add(filePath);
84
+ extraFiles.push(finalizeFile({
85
+ path: filePath,
86
+ kind: String(entry.kind || 'handoff-transport-material'),
87
+ logicalKind: String(entry.logicalKind || 'recipient-relative-transport-material'),
88
+ entryId: String(entry.entryId || ''),
89
+ mediaType: String(entry.mediaType || entry.type || 'application/octet-stream'),
90
+ data,
91
+ boundary: String(entry.boundary || 'Additional recipient-relative transport byte; package placement does not create semantic authority.'),
92
+ sourceBoundary: String(entry.sourceBoundary || '')
93
+ }));
94
+ }
95
+
96
+ const localRunId = String(input.localRunId || `handoff-closure:${stableFingerprintBytes(utf8Bytes(JSON.stringify({ handoff: plan.handoff, required: plan.requirements?.required?.map((x) => [x.requirementId, x.disposition]), reference: plan.requirements?.reference?.map((x) => [x.requirementId, x.disposition]) })))}`);
97
+ const descriptor = buildHandoffClosureDescriptor(plan, { materialized: packagedMaterial, workspaces: packagedWorkspaces, bootstrapPath, localRunId, planInputBinding, materializedOutputQualification });
98
+ const descriptorFile = finalizeFile({ path: HANDOFF_CLOSURE_DESCRIPTOR_PATH, kind: 'handoff-closure-descriptor', logicalKind: 'disposable-transport-control', mediaType: 'application/json', content: `${stablePrettyJson(descriptor)}\n`, boundary: descriptor.boundary });
99
+ const semanticReady = planReadiness.state === 'qualified' && planReadiness.expectedRequiredClosureReady && planInputBinding.state === 'qualified' && materializedOutputQualification.state === 'qualified' && baseBundle.status !== 'blocked' && !workspaceCorrelationBlocked && !bootstrapCarrierBlocked && !additionalTransportBlocked;
100
+ const status = semanticReady ? (baseBundle.status === 'degraded' ? 'degraded' : 'ready') : 'blocked';
101
+
102
+ const oldFileMapPath = 'tiinex.package/file-map.json';
103
+ const buildReceiptPath = 'tiinex.package/build-receipt.json';
104
+ const baseGoverned = [...(baseBundle.files || []).filter((file) => ![oldFileMapPath, buildReceiptPath].includes(String(file.path || ''))), ...extraFiles, descriptorFile].map(finalizeFile);
105
+ const materialRepresentationSha256 = packageMaterialRepresentationSha256(baseGoverned);
106
+ const priorBuildReceipt = parseJsonFile((baseBundle.files || []).find((file) => String(file.path || '') === buildReceiptPath)) || {};
107
+ const buildReceipt = Object.freeze({ ...priorBuildReceipt, operation: 'archive-backed-handoff-carrier-v2-direct-baseline', materialRepresentationSha256, counts: Object.freeze({ ...(priorBuildReceipt.counts || {}), materialFiles: baseGoverned.filter((file) => file.path && !String(file.path).startsWith('tiinex.package/')).length }), handoffCarrierVersion: 2 });
108
+ const buildReceiptFile = finalizeFile({ path: buildReceiptPath, kind: 'package-build-receipt', mediaType: 'application/json', content: `${stablePrettyJson(buildReceipt)}\n` });
109
+ const governed = [...baseGoverned, buildReceiptFile].map(finalizeFile);
110
+ const fileMap = buildExportPackageFileMap(governed, { packageId: baseBundle.packageId || '' });
111
+ const fileMapFile = finalizeFile({ path: oldFileMapPath, kind: 'package-file-map', mediaType: 'application/json', content: `${stablePrettyJson(fileMap)}\n` });
112
+ const files = Object.freeze([...governed, fileMapFile]);
113
+ const bundle = deepFreeze({ ...baseBundle, status, files, fileMap, packageRepresentationSha256: fileMap.representationSha256, handoffClosure: descriptor, boundary: `${baseBundle.boundary || ''} Direct v2 semantic baseline retains planning/closure truth without exploded complete-workspace outer carriage.` });
114
+
115
+ return deepFreeze({
116
+ schema: PORTABLE_HANDOFF_V2_DIRECT_BASELINE_SCHEMA_ID,
117
+ status,
118
+ executable: semanticReady,
119
+ transportExecutable: false,
120
+ plan,
121
+ planReadiness,
122
+ planInputBinding,
123
+ materializedOutputQualification,
124
+ bundle,
125
+ descriptor,
126
+ directWorkspaceSources: Object.freeze(directWorkspaceSources),
127
+ findings: Object.freeze([...(plan.findings || [])]),
128
+ boundary: 'Internal canonical archive-backed manufacture baseline. It reuses shared planning/material-closure owners while deliberately omitting exploded complete-Workspace carrier bytes before archive-backed representation is built.'
129
+ });
130
+ }
131
+
132
+ function indexPlanWorkspaces(items = []) {
133
+ const map = new Map();
134
+ for (const workspace of items) {
135
+ const key = String(workspace.transportCorrelationKey || '');
136
+ const list = map.get(key) || [];
137
+ list.push(workspace);
138
+ map.set(key, list);
139
+ }
140
+ return map;
141
+ }
142
+ function countRawCorrelations(items = []) {
143
+ const map = new Map();
144
+ for (const workspace of items) {
145
+ const key = workspaceMaterializationCorrelationKey(workspace);
146
+ map.set(key, (map.get(key) || 0) + 1);
147
+ }
148
+ return map;
149
+ }
150
+ function reservedGeneratedPath(value = '') {
151
+ const path = String(value || '');
152
+ return path.startsWith(HANDOFF_POINTER_ENTRYPOINT_PREFIX) || ['tiinex.package/file-map.json', 'tiinex.package/build-receipt.json', HANDOFF_CLOSURE_DESCRIPTOR_PATH, HANDOFF_CARRIER_PROJECTION_PATH, HANDOFF_COLD_CONSUMER_ENTRYPOINT_PATH, HANDOFF_TRANSPORT_COMPANION_PATH].includes(path);
153
+ }
154
+ function materialPackagePath(entry = {}) { return safePath(entry.requestedPackagePath || `handoff.material/${safeToken(entry.requirementId || 'material')}/material.bin`); }
155
+ function safePath(value = '') { return String(value || '').replace(/\\/g, '/').replace(/^\/+/, '').split('/').filter((part) => part && part !== '.' && part !== '..').map((part) => part.replace(/[\u0000-\u001f<>:"|?*]/g, '_')).join('/') || 'material.bin'; }
156
+ function safeToken(value = '') { const raw = String(value || ''); const token = raw.trim().replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, ''); if (!token) return 'material'; if (token.length <= 100) return token; return `${token.slice(0, 87)}-${sha256Hex(utf8Bytes(raw)).slice(0, 12)}`; }
157
+ function parseJsonFile(file = {}) { try { return JSON.parse(new TextDecoder().decode(packageFileBytes(file))); } catch { return null; } }
158
+ function stablePrettyJson(value) { return JSON.stringify(sortJson(value), null, 2); }
159
+ function sortJson(value) { if (Array.isArray(value)) return value.map(sortJson); if (!value || typeof value !== 'object') return value; if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) return undefined; return Object.fromEntries(Object.keys(value).sort().flatMap((key) => { const sorted = sortJson(value[key]); return typeof sorted === 'undefined' ? [] : [[key, sorted]]; })); }
160
+ function deepFreeze(value) { if (!value || typeof value !== 'object' || Object.isFrozen(value)) return value; if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) return value; for (const child of Object.values(value)) deepFreeze(child); return Object.freeze(value); }
@@ -0,0 +1,36 @@
1
+ export function indexDirectWorkspaceSources(items = []) {
2
+ const map = new Map();
3
+ for (const item of items) {
4
+ const key = String(item?.transportCorrelationKey || '');
5
+ if (!key || String(item?.correlationStatus || '') !== 'qualified' || !item?.workspace) continue;
6
+ const list = map.get(key) || [];
7
+ list.push(item);
8
+ map.set(key, list);
9
+ }
10
+ return map;
11
+ }
12
+
13
+ export function resolveDirectWorkspaceSource(index, correlationKey = '') {
14
+ const items = index.get(String(correlationKey || '')) || [];
15
+ return items.length === 1 ? items[0] : null;
16
+ }
17
+
18
+ export function indexUniqueArchiveBaselineFiles(files = [], findings = []) {
19
+ const map = new Map();
20
+ for (const file of files) {
21
+ const path = String(file.path || '');
22
+ const list = map.get(path) || [];
23
+ list.push(file);
24
+ map.set(path, list);
25
+ }
26
+ for (const [path, filesAtPath] of map) {
27
+ if (filesAtPath.length > 1) findings.push(Object.freeze({
28
+ severity: 'error',
29
+ code: 'portable.handoff-v2.outer-file-map.duplicate-path',
30
+ message: 'Baseline package contains duplicate outer paths; v2 refuses ambiguous byte selection.',
31
+ path,
32
+ count: filesAtPath.length
33
+ }));
34
+ }
35
+ return map;
36
+ }
@@ -0,0 +1,247 @@
1
+ import { finalizeFile } from '../../../export/package.fileMap.js';
2
+ import { packageFileBytes } from '../../../export/package.bytes.js';
3
+ import { exportFileMapZipUint8Array } from '../../../export/package.zip.js';
4
+ import { buildHandoffCarrierProjection, HANDOFF_CARRIER_PROJECTION_PATH, inspectHandoffCarrierProjection } from './carrierProjection.js';
5
+ import { HANDOFF_COLD_CONSUMER_ENTRYPOINT_PATH } from './coldConsumerEntrypoint.js';
6
+ import { HANDOFF_CLOSURE_DESCRIPTOR_PATH, HANDOFF_CLOSURE_DESCRIPTOR_V2_SCHEMA_ID } from './materialClosure.descriptor.js';
7
+ import { HANDOFF_POINTER_ENTRYPOINT_PREFIX } from './pointerEntrypoint.js';
8
+ import { buildHandoffTransportCompanionProjection, HANDOFF_TRANSPORT_COMPANION_PATH, inspectHandoffTransportCompanion } from './transportCompanion.js';
9
+ import { normalizeHandoffWorkspaceInnerPath } from './workspaceByteProvider.js';
10
+ import { indexWorkspaceTargetDeclarations, mapArchiveRequirements, qualifyDirectWorkspaceForArchive, qualifyWorkspaceForArchive } from './materialClosure.archiveV2.workspace.js';
11
+ import { buildRecipientFacingV2Topology, RECIPIENT_V2_FORMAT_ID } from './recipientV2.topology.js';
12
+ import { inspectRecipientFacingV2Topology, roundTripRecipientFacingV2Topology } from './recipientV2.inspect.js';
13
+ import { indexDirectWorkspaceSources, indexUniqueArchiveBaselineFiles, resolveDirectWorkspaceSource } from './materialClosure.archiveV2.indexes.js';
14
+ import { buildDirectArchiveProjectionProvider } from './materialClosure.archiveV2.projectionProvider.js';
15
+ import { buildWorkspaceArchiveBinding, detachedParentCandidates } from './materialClosure.archiveV2.binding.js';
16
+
17
+ export const PORTABLE_HANDOFF_TRANSPORT_PACKAGE_V2_SCHEMA_ID = 'tiinex.portable.handoff-transport-package.v2';
18
+
19
+ export function upgradeRecipientRelativeHandoffTransportPackageV2(baseline = {}, input = {}, options = {}) {
20
+ const findings = [];
21
+ const baselineBundle = baseline.bundle || {};
22
+ const baselineDescriptor = baseline.descriptor || baselineBundle.handoffClosure || {};
23
+ if (!baselineBundle.files?.length || !baselineDescriptor.workspaceMaterializations?.length) {
24
+ return blockedUpgrade(baseline, [finding('error', 'portable.handoff-v2.baseline.unavailable', 'Archive-backed v2 manufacture requires a qualified recipient-relative semantic/control baseline.')]);
25
+ }
26
+
27
+ const byPath = indexUniqueArchiveBaselineFiles(baselineBundle.files || [], findings);
28
+ const archiveBindings = [];
29
+ const workspaceMaterializations = [];
30
+ const workspaceFiles = [];
31
+ const removedWorkspacePaths = new Set();
32
+ const workspaceEntryByQualifiedPath = new Map();
33
+ const workspaceTargetDeclarations = indexWorkspaceTargetDeclarations(input.workspaceTargets || input.workspaceTargetBindings || []);
34
+ const directSourcesByCorrelation = indexDirectWorkspaceSources(baseline.directWorkspaceSources || []);
35
+ let avoidedExplodedWorkspaceFiles = 0;
36
+ const records = [];
37
+ const parentCandidates = detachedParentCandidates(baselineDescriptor.materialized || [], byPath);
38
+
39
+ for (const workspace of baselineDescriptor.workspaceMaterializations || []) {
40
+ const directSource = resolveDirectWorkspaceSource(directSourcesByCorrelation, workspace.transportCorrelationKey);
41
+ const qualified = directSource
42
+ ? qualifyDirectWorkspaceForArchive(workspace, directSource.workspace, workspaceTargetDeclarations.get(String(workspace.id || '')) || [], parentCandidates)
43
+ : qualifyWorkspaceForArchive(workspace, byPath, workspaceTargetDeclarations.get(String(workspace.id || '')) || [], parentCandidates);
44
+ findings.push(...qualified.findings);
45
+ if (qualified.status !== 'qualified') continue;
46
+ const workspaceId = String(workspace.id || '');
47
+ const archivePath = `handoff.workspaces/${safeToken(workspaceId)}/workspace.snapshot.zip`;
48
+ const targetPath = `handoff.workspaces/${safeToken(workspaceId)}/workspace.artifact.md`;
49
+ const archiveBytes = exportFileMapZipUint8Array(qualified.entries.map((entry) => ({ path: entry.path, data: entry.data })), 'portable.handoff-v2.workspace-archive.path.invalid');
50
+ const coverage = String(workspace.materialization || '') === 'bounded' ? 'bounded' : 'complete';
51
+ const coverageEvidence = coverage === 'bounded' ? (workspace.scopeEvidence || {}) : (workspace.completenessEvidence || {});
52
+ const archiveFile = finalizeFile({ path: archivePath, kind: 'handoff-workspace-archive', logicalKind: coverage === 'bounded' ? 'recipient-relative-bounded-workspace-archive' : 'recipient-relative-complete-workspace-archive', mediaType: 'application/zip', data: archiveBytes, boundary: coverage === 'bounded' ? 'Exact bounded Workspace Representation entry set; omitted source paths remain outside representation and detached recovery remains separate.' : 'Exact complete Workspace snapshot representation; Workspace identity comes only from the exact qualified target plus binding, never archive name/placement.' });
53
+ const targetFile = finalizeFile({ path: targetPath, kind: 'handoff-workspace-target', logicalKind: 'recipient-relative-workspace-identity-target', mediaType: 'text/markdown', data: qualified.target.data, boundary: 'Exact tiinex.workspace.v1 target binding carrier id to Workspace identity; package name/placement have no authority.' });
54
+ workspaceFiles.push(targetFile, archiveFile);
55
+ for (const entry of qualified.entries) {
56
+ if (entry.packagePath && byPath.has(entry.packagePath)) removedWorkspacePaths.add(entry.packagePath);
57
+ else avoidedExplodedWorkspaceFiles += 1;
58
+ workspaceEntryByQualifiedPath.set(`${workspaceId}\u0000${entry.path}`, entry);
59
+ }
60
+ const binding = buildWorkspaceArchiveBinding({ workspace, qualified, archiveFile, targetFile, coverage });
61
+ const entries = binding.entryMap.entries;
62
+ archiveBindings.push(binding);
63
+ workspaceMaterializations.push(deepFreeze({ ...workspace, includedEntries: Object.freeze(entries) }));
64
+ records.push(Object.freeze({ workspace, binding, qualified, archiveFile }));
65
+ }
66
+
67
+ if (workspaceMaterializations.length !== (baselineDescriptor.workspaceMaterializations || []).length) {
68
+ return blockedUpgrade(baseline, findings.length ? findings : [finding('error', 'portable.handoff-v2.workspace.unqualified', 'One or more workspace snapshots could not qualify for archive-backed carriage.')]);
69
+ }
70
+
71
+ const removedMaterialPaths = new Set();
72
+ const materialized = (baselineDescriptor.materialized || []).map((material) => {
73
+ const workspaceId = String(material.provenance?.workspaceId || '');
74
+ const relative = normalizedOrEmpty(material.provenance?.path || material.originalPath || '');
75
+ const entry = workspaceId && relative ? workspaceEntryByQualifiedPath.get(`${workspaceId}\u0000${relative}`) : null;
76
+ if (entry && Number(material.bytes || 0) === entry.bytes && String(material.sha256 || '') === entry.sha256) {
77
+ if (material.packagePath) removedMaterialPaths.add(String(material.packagePath));
78
+ return deepFreeze({ ...material, packagePath: '', carrierKind: 'workspace-archive-entry', workspaceId, workspaceRelativePath: relative, authority: Object.freeze({ ...(material.authority || {}), carrierDedupBasis: 'exact-qualified-workspace-archive-entry-byte-identity' }) });
79
+ }
80
+ return material;
81
+ });
82
+
83
+ const bindingByWorkspace = new Map(archiveBindings.map((binding) => [binding.workspaceId, binding]));
84
+ const requirements = mapArchiveRequirements(baselineDescriptor.requirements || {}, materialized, bindingByWorkspace);
85
+ const descriptor = deepFreeze({
86
+ ...baselineDescriptor,
87
+ schema: HANDOFF_CLOSURE_DESCRIPTOR_V2_SCHEMA_ID,
88
+ version: 2,
89
+ boundary: 'Disposable recipient-relative transport metadata with exact archive-backed Workspace binding. Safe to delete with the package; not a Tiinex artifact, semantic Parent, workspace owner, package identity, Handoff acceptance/completion state, or semantic provider authority.',
90
+ requirements,
91
+ materialized: Object.freeze(materialized),
92
+ workspaceMaterializations: Object.freeze(workspaceMaterializations),
93
+ workspaceArchiveBindings: Object.freeze(archiveBindings),
94
+ providerProvenance: Object.freeze(materialized.map((entry) => Object.freeze({ requirementId: entry.requirementId, provider: entry.provider || {}, provenance: entry.provenance || {}, carrierKind: String(entry.carrierKind || 'detached-material') }))),
95
+ roundtripVerification: Object.freeze({
96
+ state: 'build-verified',
97
+ verifier: 'durable-outer-file-map-plus-qualified-workspace-archive-provider-rehydration-required',
98
+ descriptorPath: HANDOFF_CLOSURE_DESCRIPTOR_PATH,
99
+ expectedMaterial: Object.freeze([
100
+ ...materialized.filter((entry) => entry.carrierKind !== 'workspace-archive-entry').map((entry) => Object.freeze({ packagePath: entry.packagePath, bytes: entry.bytes, sha256: entry.sha256 })),
101
+ ...archiveBindings.flatMap((binding) => [
102
+ Object.freeze({ packagePath: binding.workspaceTarget.packagePath, bytes: binding.workspaceTarget.bytes, sha256: binding.workspaceTarget.sha256 }),
103
+ Object.freeze({ packagePath: binding.representation.packagePath, bytes: binding.representation.bytes, sha256: binding.representation.digest.value })
104
+ ])
105
+ ]),
106
+ note: 'Outer file-map integrity governs package files. Workspace entry identity/coverage is independently re-established from the exact archive digest, entry map, per-entry byte identity, and exact carried Workspace target; descriptor presence alone proves neither delivery nor Handoff acceptance.'
107
+ })
108
+ });
109
+
110
+ const generatedPaths = new Set([HANDOFF_CLOSURE_DESCRIPTOR_PATH, HANDOFF_CARRIER_PROJECTION_PATH, HANDOFF_COLD_CONSUMER_ENTRYPOINT_PATH, HANDOFF_TRANSPORT_COMPANION_PATH, 'tiinex.package/file-map.json', 'tiinex.package/build-receipt.json']);
111
+ const retained = (baselineBundle.files || []).filter((file) => {
112
+ const path = String(file.path || '');
113
+ return !generatedPaths.has(path) && !path.startsWith(HANDOFF_POINTER_ENTRYPOINT_PREFIX) && !removedWorkspacePaths.has(path) && !removedMaterialPaths.has(path);
114
+ });
115
+ const descriptorFile = finalizeFile({ path: HANDOFF_CLOSURE_DESCRIPTOR_PATH, kind: 'handoff-closure-descriptor', logicalKind: 'disposable-transport-control', mediaType: 'application/json', content: `${stablePrettyJson(descriptor)}\n`, boundary: descriptor.boundary });
116
+ const projectionBundle = { ...baselineBundle, files: [...retained, ...workspaceFiles, descriptorFile], handoffClosure: descriptor };
117
+ const provider = buildDirectArchiveProjectionProvider(records);
118
+ const carrierProjection = buildHandoffCarrierProjection({ bundle: projectionBundle, descriptor, workspaceByteProvider: provider, carrierLineage: input.carrierLineage || baseline.carrierProjection?.lineage || null, routes: input.transportRoutes || input.handoffRoutes || (baseline.carrierProjection?.routes || []).map((route) => ({ workspaceId: route.workspaceId, path: route.workspaceRelativePath, purpose: route.purpose })) });
119
+ const createdAt=baselineBundle.manifest?.createdAt||baselineBundle.builtAt||'';
120
+ const transportStatus = baseline.status === 'blocked' || carrierProjection.status !== 'ready' ? 'blocked' : baseline.status;
121
+ const transportCompanion = buildHandoffTransportCompanionProjection({ bundle: projectionBundle, descriptor, packageStatus: transportStatus, participation: input.transportParticipation || input.participation || {} });
122
+ const companionFile = finalizeFile({ path: HANDOFF_TRANSPORT_COMPANION_PATH, kind: 'handoff-transport-companion', logicalKind: 'disposable-transport-projection', mediaType: 'application/json', content: `${stablePrettyJson(transportCompanion)}\n`, boundary: transportCompanion.boundary });
123
+ const companionInspectionRaw = inspectHandoffTransportCompanion({ ...projectionBundle, status: transportStatus, handoffClosure: descriptor, files: Object.freeze([...projectionBundle.files, companionFile]) });
124
+
125
+ // Recipient-v2 is the canonical carrier. Do not serialize and fully re-inspect the hidden
126
+ // legacy export-package control graph before building the recipient surface: that duplicated
127
+ // whole-archive hashing and let an implementation-only representation gate the real carrier.
128
+ // The direct closure/carrier builders qualify exact source bytes first; the visible recipient
129
+ // surface is then independently inspected, and optional roundtrip verifies its serialized bytes.
130
+ const recipientSurface = buildRecipientFacingV2Topology({
131
+ bundle: projectionBundle,
132
+ descriptor,
133
+ carrierProjection,
134
+ carrierProfile: input.carrierProfile || null,
135
+ routeSelector: input.recipientRouteSelector || '',
136
+ createdAt,
137
+ artifactFirstDualProjectionPhase1: options.artifactFirstDualProjectionPhase1 === true || input.artifactFirstDualProjectionPhase1 === true,
138
+ artifactFirstCleanCarrierPhase2: options.artifactFirstCleanCarrierPhase2 === true || input.artifactFirstCleanCarrierPhase2 === true,
139
+ legacyRecipientV2Compatibility: options.legacyRecipientV2Compatibility === true || input.legacyRecipientV2Compatibility === true
140
+ });
141
+ findings.push(...(recipientSurface.findings || []));
142
+ const bundle = deepFreeze({ ...baselineBundle, status: transportStatus, files: recipientSurface.files, fileMap: null, packageRepresentationSha256: '', handoffClosure: null, transportFormat: RECIPIENT_V2_FORMAT_ID, boundary: `${baselineBundle.boundary || ''} Recipient-facing v2 exposes a flat qualified-artifact/payload root; legacy control JSON is not serialized.` });
143
+ const fullRecipientVerificationRequested = options.verifyRoundtrip !== false && input.verifyRoundtrip !== false;
144
+ const constructionInspection = constructionRecipientV2Inspection(recipientSurface, carrierProjection, descriptor);
145
+ const normalReadyPath = carrierProjection.status === 'ready' && constructionInspection.status === 'valid';
146
+ // On the normal ready path, full verification needs one independent inspection of the
147
+ // physically serialized carrier, not two equivalent logical inspections of the same
148
+ // constructed bytes. Blocked/diagnostic manufacture keeps the prior logical inspection
149
+ // before roundtrip so fail-closed findings and suppressed route projections remain unchanged.
150
+ const sourceInspection = fullRecipientVerificationRequested && !normalReadyPath
151
+ ? inspectRecipientFacingV2Topology(bundle)
152
+ : constructionInspection;
153
+ const runtime = fullRecipientVerificationRequested ? roundTripRecipientFacingV2Topology(bundle, sourceInspection) : null;
154
+ const inspection = fullRecipientVerificationRequested && normalReadyPath
155
+ ? (runtime?.inspection || constructionInspection)
156
+ : sourceInspection;
157
+ const carrierReady = carrierProjection.status === 'ready';
158
+ const flatReady = recipientSurface.status === 'ready' && inspection.status === 'valid' && (!runtime || runtime.status === 'passed');
159
+ const verificationReady = carrierReady && flatReady && companionInspectionRaw.status === 'valid';
160
+ const closureInspection = deepFreeze({ schema: 'tiinex.portable.handoff-v2.recipient-closure.inspection.v1', status: inspection.status, workspaceByteProvider: inspection.workspaceByteProvider, findings: inspection.findings });
161
+ const carrierInspection = deepFreeze({ schema: 'tiinex.portable.handoff-v2.recipient-carrier.inspection.v1', status: inspection.status, projection: inspection.carrierProjection, findings: inspection.findings });
162
+ const pointerEntrypointInspection = deepFreeze({ schema: 'tiinex.portable.handoff-v2.recipient-pointer.inspection.v1', status: inspection.status, entries: inspection.routes, findings: inspection.findings });
163
+ const coldConsumerEntrypointInspection = deepFreeze({ schema: 'tiinex.portable.handoff-v2.recipient-orientation.inspection.v1', status: inspection.status, projection: inspection.coldConsumerProjection, findings: inspection.findings });
164
+ const companionInspection = deepFreeze({ schema: 'tiinex.portable.handoff-v2.internal-companion.inspection.v1', status: companionInspectionRaw.status, projection: transportCompanion, serialized: false, findings: companionInspectionRaw.findings || [] });
165
+ if (!verificationReady) findings.push(finding('error', 'portable.handoff-v2.verification.blocked', 'Canonical recipient-v2 package failed one or more direct carrier, recipient-facing topology/provider/route, companion, or roundtrip verification gates.', { carrierProjection: carrierProjection.status, recipientSurface: recipientSurface.status, recipientInspection: inspection.status, companionInspection: companionInspectionRaw.status, roundtrip: runtime?.status || 'not-requested' }));
166
+
167
+ const __out = deepFreeze({
168
+ schema: PORTABLE_HANDOFF_TRANSPORT_PACKAGE_V2_SCHEMA_ID,
169
+ status: verificationReady ? transportStatus : 'blocked',
170
+ bundle,
171
+ descriptor: inspection.descriptor || descriptor,
172
+ carrierProjection: inspection.carrierProjection,
173
+ pointerEntrypointProjection: Object.freeze({ schema: 'tiinex.portable.handoff-v2.recipient-pointer-projection.v1', entries: inspection.routes || Object.freeze([]) }),
174
+ coldConsumerProjection: inspection.coldConsumerProjection,
175
+ transportCompanion,
176
+ recipientSurface,
177
+ inspection,
178
+ closureInspection,
179
+ carrierInspection,
180
+ pointerEntrypointInspection,
181
+ coldConsumerEntrypointInspection,
182
+ companionInspection,
183
+ roundtrip: runtime,
184
+ findings: Object.freeze(dedupeFindings(findings)),
185
+ migration: Object.freeze({ mode: 'canonical-archive-backed-recipient', recipientTopology: RECIPIENT_V2_FORMAT_ID, manufacturePath: directSourcesByCorrelation.size ? 'direct-qualified-workspace-to-archive' : 'archive-baseline-upgrade', removedExplodedWorkspaceFiles: removedWorkspacePaths.size, avoidedExplodedWorkspaceFiles, deduplicatedDetachedMaterialFiles: removedMaterialPaths.size, exposedWorkspaceTargets: archiveBindings.length, workspaceArchives: archiveBindings.length }),
186
+ boundary: 'Canonical recipient transport representation only. No semantic Workspace identity is minted and this result carries no remote mutation authority.'
187
+ });
188
+ return __out;
189
+ }
190
+
191
+
192
+ function constructionRecipientV2Inspection(recipientSurface = {}, carrierProjection = {}, descriptor = {}) {
193
+ const topology = recipientSurface.topology || {};
194
+ const findings = Object.freeze([...(recipientSurface.findings || [])]);
195
+ const status = recipientSurface.status === 'ready' && !findings.some((item) => item.severity === 'error') ? 'valid' : 'invalid';
196
+ return deepFreeze({
197
+ schema: 'tiinex.portable.recipient-facing-handoff-v2.construction-inspection.v1',
198
+ detected: true,
199
+ status,
200
+ format: RECIPIENT_V2_FORMAT_ID,
201
+ verificationMode: 'construction-qualified; physical re-ingest required for independent recipient verification',
202
+ rootArtifact: topology.root ? Object.freeze({ path: String(topology.root.path || ''), sha256: String(topology.root.sha256 || '') }) : null,
203
+ readArtifact: topology.read ? Object.freeze({ path: String(topology.read.path || ''), status: 'qualified' }) : null,
204
+ workspaces: Object.freeze((topology.workspaces || []).map((item) => Object.freeze({
205
+ workspaceId: String(item.workspaceId || ''),
206
+ workspaceArtifactPath: String(item.workspacePath || ''),
207
+ workspaceArchivePath: String(item.archivePath || ''),
208
+ sourceWorkspaceTargetInnerPath: String(item.sourceWorkspaceTargetInnerPath || ''),
209
+ sourceWorkspaceTargetSha256: String(item.sourceWorkspaceTargetSha256 || '')
210
+ }))),
211
+ routes: Object.freeze((topology.routes || []).map((item) => Object.freeze({
212
+ pointerPath: String(item.pointerPath || ''),
213
+ workspaceId: String(item.workspaceId || ''),
214
+ workspaceRelativeHandoffPath: String(item.workspaceRelativeHandoffPath || ''),
215
+ endpointRolePointers: Object.freeze((topology.endpointRoles || [])
216
+ .filter((role) => String(role.routeId || '') === String(item.routeId || ''))
217
+ .map((role) => String(role.pointerPath || ''))
218
+ .filter(Boolean)),
219
+ participantRolePointers: Object.freeze((topology.participantRoles || [])
220
+ .filter((role) => String(role.routeId || '') === String(item.routeId || ''))
221
+ .map((role) => String(role.pointerPath || ''))
222
+ .filter(Boolean))
223
+ }))),
224
+ endpointRoles: Object.freeze((topology.endpointRoles || []).map((item) => Object.freeze({ ...item }))),
225
+ participantRoles: Object.freeze((topology.participantRoles || []).map((item) => Object.freeze({ ...item }))),
226
+ caches: Object.freeze((topology.caches || []).map((item) => Object.freeze({ ...item }))),
227
+ descriptor,
228
+ carrierProjection,
229
+ coldConsumerProjection: null,
230
+ bootstrapInspection: null,
231
+ findings,
232
+ findingSummary: Object.freeze({ errors: findings.filter((item) => item.severity === 'error').length, findings: findings.length }),
233
+ boundary: 'Producer-side construction qualification only. Independent recipient qualification is intentionally deferred to physical package re-ingest when full roundtrip is not requested.'
234
+ });
235
+ }
236
+
237
+ function normalizedOrEmpty(value = '') { const normalized = normalizeHandoffWorkspaceInnerPath(value); return normalized.state === 'qualified' ? normalized.path : ''; }
238
+ function blockedUpgrade(baseline = {}, findings = []) { return deepFreeze({ schema: PORTABLE_HANDOFF_TRANSPORT_PACKAGE_V2_SCHEMA_ID, status: 'blocked', bundle: baseline.bundle || null, descriptor: baseline.descriptor || null, carrierProjection: baseline.carrierProjection || null, findings: Object.freeze(dedupeFindings(findings)), migration: Object.freeze({ mode: 'canonical-archive-backed-recipient', state: 'blocked-before-representation-switch' }), boundary: 'Canonical archive-backed recipient manufacture failed closed before changing the baseline carrier representation.' }); }
239
+ function findFile(bundle = {}, path = '') { return (bundle.files || []).find((file) => String(file.path || '') === String(path || '')) || null; }
240
+ function parseJsonFile(file = null) { try { return file ? JSON.parse(decodeUtf8(packageFileBytes(file))) : null; } catch { return null; } }
241
+ function decodeUtf8(data) { try { return new TextDecoder('utf-8', { fatal: true }).decode(data); } catch { return ''; } }
242
+ function safeToken(value = '') { return String(value || '').trim().replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 100) || 'workspace'; }
243
+ function stablePrettyJson(value) { return JSON.stringify(sortJson(value), null, 2); }
244
+ function sortJson(value) { if (Array.isArray(value)) return value.map(sortJson); if (!value || typeof value !== 'object') return value; if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) return undefined; return Object.fromEntries(Object.keys(value).sort().flatMap((key) => { const sorted = sortJson(value[key]); return typeof sorted === 'undefined' ? [] : [[key, sorted]]; })); }
245
+ function finding(severity, code, message, extra = {}) { return Object.freeze({ severity, code, message, ...extra }); }
246
+ function dedupeFindings(items = []) { const map = new Map(); for (const item of items) { const key = `${item.severity || ''}:${item.code || ''}:${item.workspaceId || ''}:${item.path || ''}:${item.packagePath || ''}`; if (!map.has(key)) map.set(key, item); } return [...map.values()]; }
247
+ function deepFreeze(value) { if (!value || typeof value !== 'object' || Object.isFrozen(value)) return value; if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) return value; for (const child of Object.values(value)) deepFreeze(child); return Object.freeze(value); }