@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,181 @@
1
+ import { portableFinding } from '../findings.js';
2
+ import { buildPortableToolBindings, normalizePortableHostTools } from './tool.bindings.js';
3
+
4
+ export const PORTABLE_HOST_CAPABILITIES_SCHEMA_ID = 'tiinex.portable.host-capabilities.v1';
5
+ export const PORTABLE_TOOLING_DISCOVERY_SCHEMA_ID = 'tiinex.portable.tooling-discovery.v1';
6
+
7
+ export function discoverPortableHostCapabilities(input = {}, options = {}) {
8
+ const tools = normalizePortableHostTools(input.tools || input.availableTools || options.tools || []);
9
+ const toolBindings = buildPortableToolBindings({ tools });
10
+ const explicit = input.capabilities || input.hostCapabilities || directCapabilityProfile(input) || options.capabilities || directCapabilityProfile(options) || {};
11
+ const findings = [...(toolBindings.findings || [])];
12
+ const inferred = inferToolCapabilities(toolBindings);
13
+ const capabilities = Object.freeze({
14
+ materialAccess: Object.freeze({
15
+ attachments: explicitBoolean(explicit.materialAccess?.attachments, inferred.attachments),
16
+ projectSources: explicitBoolean(explicit.materialAccess?.projectSources, inferred.projectSources),
17
+ filesystemRead: explicitBoolean(explicit.materialAccess?.filesystemRead ?? explicit.materialAccess?.filesystem, inferred.filesystemRead),
18
+ archiveRead: explicitBoolean(explicit.materialAccess?.archiveRead ?? explicit.materialAccess?.archives, inferred.archiveRead),
19
+ repositorySearch: explicitBoolean(explicit.materialAccess?.repositorySearch ?? explicit.repositories?.search, inferred.repositorySearch),
20
+ repositoryRead: explicitBoolean(explicit.materialAccess?.repositoryRead ?? explicit.repositories?.read, inferred.repositoryRead),
21
+ repositoryWrite: explicitBoolean(explicit.materialAccess?.repositoryWrite ?? explicit.repositories?.write, inferred.repositoryWrite),
22
+ httpRead: explicitBoolean(explicit.materialAccess?.httpRead, inferred.httpRead)
23
+ }),
24
+ execution: Object.freeze({
25
+ javascript: explicitBoolean(explicit.execution?.javascript, inferred.javascript),
26
+ shell: explicitBoolean(explicit.execution?.shell, inferred.shell),
27
+ process: explicitBoolean(explicit.execution?.process ?? explicit.execution?.processExecution, inferred.shell || inferred.javascript),
28
+ networkFromExecutionSandbox: explicitBoolean(explicit.execution?.networkFromExecutionSandbox ?? explicit.execution?.network, false)
29
+ }),
30
+ multimodal: Object.freeze({
31
+ images: explicitBoolean(explicit.multimodal?.images, inferred.images),
32
+ pdf: explicitBoolean(explicit.multimodal?.pdf, inferred.pdf)
33
+ }),
34
+ mutation: Object.freeze({
35
+ localDraftResult: true,
36
+ filesystemWrite: explicitBoolean(explicit.mutation?.filesystemWrite, inferred.filesystemWrite),
37
+ repositoryWrite: explicitBoolean(explicit.mutation?.repositoryWrite ?? explicit.repositories?.write, inferred.repositoryWrite),
38
+ remoteWriteAvailable: explicitBoolean(explicit.mutation?.remoteWriteAvailable, inferred.remoteWriteAvailable || inferred.repositoryWrite),
39
+ remoteWriteAuthorized: explicit.mutation?.remoteWriteAuthorized === true || options.allowRemoteWrite === true
40
+ }),
41
+ interaction: Object.freeze({
42
+ artifactReturn: explicitBoolean(explicit.interaction?.artifactReturn, inferred.artifactReturn),
43
+ humanConfirmation: explicitBoolean(explicit.interaction?.humanConfirmation, inferred.humanConfirmation),
44
+ authenticationRequest: explicitBoolean(explicit.interaction?.authenticationRequest, inferred.authenticationRequest),
45
+ copyableTextPresentation: explicitBoolean(explicit.interaction?.copyableTextPresentation, inferred.copyableTextPresentation)
46
+ })
47
+ });
48
+
49
+ if (capabilities.mutation.remoteWriteAvailable && !capabilities.mutation.remoteWriteAuthorized) {
50
+ findings.push(portableFinding('info', 'portable.host.remote-write.not-authorized', 'A remote write tool appears available, but portable tooling will not treat it as authorized without explicit human approval.'));
51
+ }
52
+ if (!capabilities.materialAccess.repositorySearch && !capabilities.materialAccess.repositoryRead) {
53
+ findings.push(portableFinding('info', 'portable.host.repository-provider.unavailable', 'No host repository search/read capability was discovered; unknown schemas require supplied, cached, local, archive, HTTP, or separately fetched material.'));
54
+ }
55
+
56
+ return Object.freeze({
57
+ schema: PORTABLE_TOOLING_DISCOVERY_SCHEMA_ID,
58
+ profile: Object.freeze({
59
+ schema: PORTABLE_HOST_CAPABILITIES_SCHEMA_ID,
60
+ capabilityInstance: buildCapabilityInstance(input, options),
61
+ capabilities,
62
+ tools: Object.freeze(tools),
63
+ toolBindings: toolBindings.bindings
64
+ }),
65
+ routes: buildTaskRoutes(capabilities),
66
+ findings: Object.freeze(findings)
67
+ });
68
+ }
69
+
70
+ export function portableTaskRoute(task = '', profileOrCapabilities = {}) {
71
+ const capabilities = profileOrCapabilities.capabilities || profileOrCapabilities;
72
+ return buildTaskRoutes(capabilities)[normalizeTask(task)] || buildUnknownRoute(task);
73
+ }
74
+
75
+ function buildTaskRoutes(capabilities = {}) {
76
+ const access = capabilities.materialAccess || {};
77
+ const multimodal = capabilities.multimodal || {};
78
+ const repositoryReady = Boolean(access.repositorySearch && access.repositoryRead);
79
+ const suppliedReady = Boolean(access.attachments || access.projectSources || access.filesystemRead || access.archiveRead);
80
+ return Object.freeze({
81
+ 'load-material': route('load-material', suppliedReady ? 'ready' : 'host-adapter-required', suppliedReady
82
+ ? ['attachments-or-project-sources', 'filesystem-or-archive-provider']
83
+ : ['provide-readable-material-explicitly']),
84
+ 'resolve-unknown-schema': route('resolve-unknown-schema', repositoryReady || suppliedReady || access.httpRead ? 'ready' : 'blocked', [
85
+ 'loaded-schema-material',
86
+ 'explicit-schema-cache',
87
+ ...(access.filesystemRead ? ['local-directory-or-checkout'] : []),
88
+ ...(access.archiveRead ? ['archive-provider'] : []),
89
+ ...(repositoryReady ? ['host-repository-provider'] : []),
90
+ ...(access.httpRead ? ['explicit-http-provider'] : []),
91
+ 'preserve-only'
92
+ ]),
93
+ 'search-lineage': route('search-lineage', suppliedReady ? 'ready' : 'material-required', ['load-material', 'search-loaded-lineage']),
94
+ 'create-local-draft': route('create-local-draft', 'ready', ['resolve-schema-material', 'schema-guide', 'plan-artifact', 'create-local-draft', 'validate-draft', 'stage-draft']),
95
+ 'materialize-durable-findings': route('materialize-durable-findings', 'ready', ['plan-durable-materialization', 'resolve-schema-material', 'create-local-draft', 'validate-draft', 'stage-draft']),
96
+ 'qualify-checkpoint': route('qualify-checkpoint', 'ready', ['describe-checkpoint-gate', 'execute-fixed-gates-in-trusted-node-adapter', 'qualify-checkpoint']),
97
+ 'create-checkpoint': route('create-checkpoint', 'ready', ['serialize-explicit-session-state', 'create-checkpoint']),
98
+ 'build-runtime-package': route('build-runtime-package', 'ready', ['collect-loaded-and-staged-material', 'build-runtime-package', 'roundtrip-runtime-package', ...(capabilities.mutation?.filesystemWrite ? ['optional-local-zip-write'] : [])]),
99
+ 'analyze-image-asset': route('analyze-image-asset', access.archiveRead && multimodal.images ? 'ready' : 'host-adapter-required', [
100
+ 'discover-asset',
101
+ ...(access.archiveRead ? ['materialize-archive-entry'] : ['request-archive-reader']),
102
+ ...(multimodal.images ? ['host-image-analysis'] : ['request-multimodal-image-capability'])
103
+ ]),
104
+ 'publish-or-remote-write': route('publish-or-remote-write', capabilities.mutation?.remoteWriteAuthorized ? 'authorized' : 'blocked', capabilities.mutation?.remoteWriteAuthorized
105
+ ? ['explicit-human-approved-adapter']
106
+ : ['request-explicit-human-authorization'])
107
+ });
108
+ }
109
+
110
+ function directCapabilityProfile(value = {}) {
111
+ if (!value || typeof value !== 'object') return null;
112
+ return (value.materialAccess || value.repositories || value.execution || value.multimodal || value.mutation || value.interaction) ? value : null;
113
+ }
114
+
115
+ function inferToolCapabilities(toolBindings = {}) {
116
+ const bindings = toolBindings.bindings || {};
117
+ const available = (name) => Boolean(bindings[name]?.selected);
118
+ return {
119
+ attachments: available('attachments'),
120
+ projectSources: available('projectSources'),
121
+ filesystemRead: available('filesystemRead'),
122
+ archiveRead: available('archiveRead'),
123
+ repositorySearch: available('repositorySearch'),
124
+ repositoryRead: available('repositoryRead'),
125
+ repositoryWrite: available('repositoryWrite'),
126
+ httpRead: available('httpRead'),
127
+ javascript: available('javascript'),
128
+ shell: available('shell'),
129
+ images: available('images'),
130
+ pdf: available('pdf'),
131
+ filesystemWrite: available('filesystemWrite'),
132
+ remoteWriteAvailable: available('remoteWriteAvailable'),
133
+ artifactReturn: available('artifactReturn'),
134
+ humanConfirmation: available('humanConfirmation'),
135
+ authenticationRequest: available('authenticationRequest'),
136
+ copyableTextPresentation: available('copyableTextPresentation')
137
+ };
138
+ }
139
+
140
+
141
+ function buildCapabilityInstance(input = {}, options = {}) {
142
+ const provider = normalizeIdentity(input.provider || options.provider || {}, 'provider');
143
+ const host = normalizeIdentity(input.hostIdentity || input.hostContext || input.host || options.hostIdentity || options.hostContext || {}, 'host');
144
+ const session = normalizeIdentity(input.session || input.sessionContext || options.session || {}, 'session');
145
+ const explicitInstanceId = String(input.capabilityInstanceId || options.capabilityInstanceId || session.capabilityInstanceId || '').trim();
146
+ const instanceId = explicitInstanceId || (session.id ? `session:${session.id}` : '');
147
+ return Object.freeze({
148
+ schema: 'tiinex.portable.host-capability-instance.v1',
149
+ instanceId,
150
+ state: instanceId ? 'session-bound' : 'unbound',
151
+ provider: Object.freeze({ id: provider.id, name: provider.name, declared: provider.declared }),
152
+ host: Object.freeze({ id: host.id, name: host.name, declared: host.declared }),
153
+ session: Object.freeze({ id: session.id, name: session.name, declared: session.declared }),
154
+ authority: Object.freeze({ providerNameGrantsCapability: false, hostNameGrantsCapability: false, currentSessionBindingsRequired: true, advertisementIsExerciseEvidence: false })
155
+ });
156
+ }
157
+
158
+ function normalizeIdentity(value, kind) {
159
+ if (typeof value === 'string') return { id: value.trim(), name: value.trim(), declared: Boolean(value.trim()), capabilityInstanceId: '' };
160
+ if (!value || typeof value !== 'object') return { id: '', name: '', declared: false, capabilityInstanceId: '' };
161
+ const id = String(value.id || value.identifier || value.slug || '').trim();
162
+ const name = String(value.name || value.label || id || '').trim();
163
+ return { id, name, declared: Boolean(id || name), capabilityInstanceId: kind === 'session' ? String(value.capabilityInstanceId || '').trim() : '' };
164
+ }
165
+
166
+ function route(task, status, sequence) {
167
+ return Object.freeze({ task, status, sequence: Object.freeze([...new Set(sequence.filter(Boolean))]) });
168
+ }
169
+
170
+ function buildUnknownRoute(task) {
171
+ return route(normalizeTask(task) || 'unknown', 'unknown-task', ['inspect-operation-catalog']);
172
+ }
173
+
174
+ function normalizeTask(value = '') {
175
+ return String(value || '').trim().toLowerCase().replace(/[_\s]+/g, '-');
176
+ }
177
+
178
+ function explicitBoolean(value, fallback = false) {
179
+ if (value === true || value === false) return value;
180
+ return Boolean(fallback);
181
+ }
@@ -0,0 +1,357 @@
1
+ import { portableFinding, summarizePortableFindings } from '../findings.js';
2
+ import { normalizeInterpretations, normalizeList, normalizeLocalFiles, normalizeRepositoryFiles, serializableSchema } from './tool.receiptNormalization.js';
3
+
4
+ export const PORTABLE_TOOL_BINDINGS_SCHEMA_ID = 'tiinex.portable.tool-bindings.v1';
5
+ export const PORTABLE_HOST_ACTION_PLAN_SCHEMA_ID = 'tiinex.portable.host-action-plan.v1';
6
+ export const PORTABLE_HOST_ACTION_RECEIPT_SCHEMA_ID = 'tiinex.portable.host-action-receipt.v1';
7
+ export const PORTABLE_HOST_ACTION_ACCEPTANCE_SCHEMA_ID = 'tiinex.portable.host-action-acceptance.v1';
8
+
9
+ const CAPABILITIES = Object.freeze({
10
+ attachments: capability('attachments', [/attachment/, /uploaded file/, /project source/]),
11
+ projectSources: capability('projectSources', [/project source/, /file library/]),
12
+ filesystemRead: capability('filesystemRead', [/filesystem/, /read file/, /open file/, /container/, /shell/, /terminal/]),
13
+ archiveRead: capability('archiveRead', [/\bzip\b/, /archive/, /extract/, /unpack/]),
14
+ repositorySearch: capability('repositorySearch', [/github.*search/, /repository.*search/, /search.*repository/, /search files.*repo/, /code search/], [/web search/, /news search/, /product search/]),
15
+ repositoryRead: capability('repositoryRead', [/github.*fetch/, /fetch file/, /repository content/, /read.*github/, /read.*repository/, /repo.*file/]),
16
+ repositoryWrite: capability('repositoryWrite', [/github.*create/, /github.*update/, /repository.*write/, /write.*repository/, /create.*repository file/, /update.*repository file/]),
17
+ httpRead: capability('httpRead', [/http/, /web fetch/, /download url/, /open url/]),
18
+ javascript: capability('javascript', [/javascript/, /\bnode\b/, /code execution/, /python/]),
19
+ shell: capability('shell', [/shell/, /terminal/, /container/, /exec/]),
20
+ images: capability('images', [/vision/, /image analysis/, /open image/, /multimodal/, /screenshot/]),
21
+ pdf: capability('pdf', [/pdf/, /screenshot.*page/, /render.*pdf/]),
22
+ filesystemWrite: capability('filesystemWrite', [/write file/, /save file/, /filesystem.*write/, /create.*local file/], [/github/, /repository/, /remote write/]),
23
+ remoteWriteAvailable: capability('remoteWriteAvailable', [/github.*create/, /github.*update/, /remote write/, /create.*repository file/, /update.*repository file/]),
24
+ artifactReturn: capability('artifactReturn', [/return.*artifact/, /return.*file/, /artifact.*output/, /download.*file/, /attach.*output/]),
25
+ humanConfirmation: capability('humanConfirmation', [/human.*confirm/, /ask.*user/, /request.*approval/, /confirmation.*prompt/, /user.*approval/]),
26
+ authenticationRequest: capability('authenticationRequest', [/request.*authentication/, /oauth/, /sign[ -]?in request/, /authentication.*prompt/]),
27
+ copyableTextPresentation: capability('copyableTextPresentation', [/copyable.*text/, /clipboard/, /code block/, /copy.*text/, /text.*presentation/])
28
+ });
29
+
30
+ const ACTIONS = Object.freeze({
31
+ 'repository-schema-resolution': Object.freeze({
32
+ aliases: ['repository-search-and-read', 'resolve-schema-material', 'resolve-unknown-schema'],
33
+ steps: ['repositorySearch', 'repositoryRead']
34
+ }),
35
+ 'repository-search': Object.freeze({ aliases: ['repositorysearch'], steps: ['repositorySearch'] }),
36
+ 'repository-read': Object.freeze({ aliases: ['repositoryread'], steps: ['repositoryRead'] }),
37
+ 'repository-write': Object.freeze({ aliases: ['repositorywrite'], steps: ['repositoryWrite'], requiresAuthorization: true }),
38
+ 'filesystem-read': Object.freeze({ aliases: ['filesystemread', 'read-file'], steps: ['filesystemRead'] }),
39
+ 'archive-read': Object.freeze({ aliases: ['archiveread', 'extract-archive'], steps: ['archiveRead'] }),
40
+ 'image-analysis': Object.freeze({ aliases: ['images', 'multimodal.images', 'open-image-with-host-vision'], steps: ['images'] }),
41
+ 'pdf-analysis': Object.freeze({ aliases: ['pdf', 'multimodal.pdf', 'open-or-render-pdf-with-host-reader'], steps: ['pdf'] }),
42
+ 'filesystem-write': Object.freeze({ aliases: ['filesystemwrite', 'write-file'], steps: ['filesystemWrite'] }),
43
+ 'artifact-return': Object.freeze({ aliases: ['artifactreturn', 'return-artifact'], steps: ['artifactReturn'] }),
44
+ 'human-confirmation': Object.freeze({ aliases: ['humanconfirmation', 'request-confirmation'], steps: ['humanConfirmation'] }),
45
+ 'authentication-request': Object.freeze({ aliases: ['authenticationrequest', 'request-authentication'], steps: ['authenticationRequest'] }),
46
+ 'copyable-text-presentation': Object.freeze({ aliases: ['copyabletextpresentation', 'present-copyable-text'], steps: ['copyableTextPresentation'] }),
47
+ 'remote-write': Object.freeze({ aliases: ['remotewriteavailable', 'publish-or-remote-write'], steps: ['remoteWriteAvailable'], requiresAuthorization: true })
48
+ });
49
+
50
+ export function normalizePortableHostTools(value = []) {
51
+ const list = Array.isArray(value) ? value : value ? [value] : [];
52
+ return list.map((item, index) => {
53
+ if (typeof item === 'string') return Object.freeze({ id: item, name: item, description: '', capabilities: Object.freeze([]), inputSchema: null });
54
+ const name = String(item?.name || item?.id || item?.tool || `tool-${index + 1}`).trim();
55
+ return Object.freeze({
56
+ id: String(item?.id || name),
57
+ name,
58
+ description: String(item?.description || item?.summary || ''),
59
+ capabilities: Object.freeze(normalizeList(item?.capabilities || item?.tags || [])),
60
+ inputSchema: serializableSchema(item?.inputSchema || item?.parameters || null)
61
+ });
62
+ });
63
+ }
64
+
65
+ export function buildPortableToolBindings(input = {}, options = {}) {
66
+ const tools = normalizePortableHostTools(input.tools || input.availableTools || options.tools || []);
67
+ const bindings = {};
68
+ const findings = [];
69
+ for (const [capabilityName, descriptor] of Object.entries(CAPABILITIES)) {
70
+ const candidates = tools
71
+ .map((tool) => scoreTool(tool, capabilityName, descriptor))
72
+ .filter((candidate) => candidate.score > 0)
73
+ .sort((a, b) => b.score - a.score || a.tool.name.localeCompare(b.tool.name));
74
+ bindings[capabilityName] = Object.freeze({
75
+ capability: capabilityName,
76
+ status: candidates.length ? 'bound' : 'unbound',
77
+ selected: candidates[0] || null,
78
+ alternatives: Object.freeze(candidates.slice(1, 4))
79
+ });
80
+ }
81
+ if (tools.length && !bindings.repositorySearch.selected && bindings.repositoryRead.selected) {
82
+ findings.push(portableFinding('info', 'portable.tool-binding.repository-search.unbound', 'A repository reader was found without a repository search tool; exact paths or a separate search capability will be required.'));
83
+ }
84
+ return Object.freeze({
85
+ schema: PORTABLE_TOOL_BINDINGS_SCHEMA_ID,
86
+ tools: Object.freeze(tools),
87
+ bindings: Object.freeze(bindings),
88
+ findings: Object.freeze(findings),
89
+ findingSummary: summarizePortableFindings(findings)
90
+ });
91
+ }
92
+
93
+ export function planPortableHostAction(input = {}, options = {}) {
94
+ const requested = normalizeAction(input.action || input.capability || input.request?.capability || options.action || '');
95
+ const blueprint = ACTIONS[requested] || null;
96
+ const toolBindings = input.toolBindings?.bindings
97
+ ? input.toolBindings
98
+ : buildPortableToolBindings(input.host || input, options.host || options);
99
+ const findings = [...(toolBindings.findings || [])];
100
+ if (!blueprint) findings.push(portableFinding('error', 'portable.host-action.action.unknown', 'Host action planning requires a recognized action or capability.', { action: requested }));
101
+ const actionId = `host-action:${stableHash(stableStringify({ action: requested, request: sanitizeRequest(input.request || input.providerRequest || input) }))}`;
102
+ const steps = (blueprint?.steps || []).map((capabilityName, index) => {
103
+ const binding = toolBindings.bindings?.[capabilityName] || null;
104
+ if (!binding?.selected) findings.push(portableFinding('error', 'portable.host-action.tool.unbound', 'No concrete host tool is bound for a required capability.', { capability: capabilityName, action: requested }));
105
+ return Object.freeze({
106
+ stepId: `${actionId}:${index + 1}`,
107
+ capability: capabilityName,
108
+ status: binding?.selected ? 'ready' : 'blocked',
109
+ tool: binding?.selected?.tool || null,
110
+ score: binding?.selected?.score || 0,
111
+ reasons: binding?.selected?.reasons || Object.freeze([]),
112
+ alternatives: Object.freeze((binding?.alternatives || []).map((entry) => entry.tool)),
113
+ argumentsTemplate: argumentsTemplate(capabilityName, input.request || input.providerRequest || input),
114
+ expectedResult: expectedResult(capabilityName)
115
+ });
116
+ });
117
+ const authorized = blueprint?.requiresAuthorization ? Boolean(input.authorized || input.allowRemoteWrite || options.allowRemoteWrite) : true;
118
+ if (blueprint?.requiresAuthorization && !authorized) findings.push(portableFinding('error', 'portable.host-action.authorization.required', 'This host action requires explicit human authorization.', { action: requested }));
119
+ const blocked = !blueprint || steps.some((step) => step.status === 'blocked') || !authorized;
120
+ return Object.freeze({
121
+ schema: PORTABLE_HOST_ACTION_PLAN_SCHEMA_ID,
122
+ actionId,
123
+ action: requested,
124
+ status: blocked ? (blueprint?.requiresAuthorization && !authorized ? 'authorization-required' : 'blocked') : 'ready',
125
+ steps: Object.freeze(steps),
126
+ receiptContract: Object.freeze({
127
+ schema: PORTABLE_HOST_ACTION_RECEIPT_SCHEMA_ID,
128
+ actionId,
129
+ action: requested,
130
+ steps: Object.freeze(steps.map((step) => Object.freeze({
131
+ stepId: step.stepId,
132
+ toolId: step.tool?.id || '<bound tool id>',
133
+ status: 'completed',
134
+ normalized: expectedReceiptShape(step.capability)
135
+ })))
136
+ }),
137
+ continuation: continuationFor(requested, input.request || input.providerRequest || input),
138
+ boundary: Object.freeze({
139
+ execution: 'performed by the host or LLM, not by this plan',
140
+ remoteWrite: requested === 'remote-write' ? 'explicit-human-authorization-required' : false,
141
+ sourceMutation: false,
142
+ rawToolOutputIsNotProvenance: true,
143
+ receiptMustBeExplicit: true
144
+ }),
145
+ findings: Object.freeze(findings),
146
+ findingSummary: summarizePortableFindings(findings)
147
+ });
148
+ }
149
+
150
+ export function acceptPortableHostActionReceipt(input = {}, options = {}) {
151
+ const plan = input.plan || input.hostActionPlan || options.plan || {};
152
+ const receipt = input.receipt || input.hostReceipt || {};
153
+ const priorAcceptance = input.priorAcceptance || input.previousAcceptance || options.priorAcceptance || {};
154
+ const findings = [];
155
+ const expectedSteps = Array.isArray(plan.steps) ? plan.steps : [];
156
+ const actualSteps = Array.isArray(receipt.steps) ? receipt.steps : [];
157
+ if (!plan.actionId) findings.push(portableFinding('error', 'portable.host-receipt.plan.required', 'Receipt acceptance requires the original host action plan.'));
158
+ if (receipt.schema && receipt.schema !== PORTABLE_HOST_ACTION_RECEIPT_SCHEMA_ID) findings.push(portableFinding('error', 'portable.host-receipt.schema.invalid', 'Host receipt used an unexpected schema.', { actual: receipt.schema }));
159
+ if (plan.actionId && receipt.actionId !== plan.actionId) findings.push(portableFinding('error', 'portable.host-receipt.action-id.mismatch', 'Host receipt actionId does not match the plan.', { expected: plan.actionId, actual: receipt.actionId || '' }));
160
+ const normalizedFiles = [];
161
+ const interpretations = [];
162
+ for (const expected of expectedSteps) {
163
+ const actual = actualSteps.find((step) => step.stepId === expected.stepId);
164
+ if (!actual) {
165
+ findings.push(portableFinding('error', 'portable.host-receipt.step.missing', 'A required host action step is missing from the receipt.', { stepId: expected.stepId, capability: expected.capability }));
166
+ continue;
167
+ }
168
+ if (actual.status !== 'completed') findings.push(portableFinding('error', 'portable.host-receipt.step.incomplete', 'A host action step did not complete.', { stepId: expected.stepId, status: actual.status || '' }));
169
+ if (expected.tool?.id && actual.toolId && actual.toolId !== expected.tool.id) findings.push(portableFinding('warning', 'portable.host-receipt.tool.changed', 'The receipt used a different tool than the selected binding; the normalized result is accepted only through the explicit receipt.', { expectedToolId: expected.tool.id, actualToolId: actual.toolId }));
170
+ const normalized = actual.normalized || {};
171
+ if (expected.capability === 'repositoryRead') normalizedFiles.push(...normalizeRepositoryFiles(normalized, findings, expected.argumentsTemplate || {}));
172
+ if (expected.capability === 'filesystemRead' || expected.capability === 'archiveRead') normalizedFiles.push(...normalizeLocalFiles(normalized, findings, expected.capability));
173
+ if (expected.capability === 'images' || expected.capability === 'pdf') interpretations.push(...normalizeInterpretations(normalized, findings, expected.capability));
174
+ }
175
+ const prior = acceptedPriorMaterial(priorAcceptance, findings);
176
+ const repositoryFiles = uniqueAcceptedFiles([
177
+ ...prior.repositoryFiles,
178
+ ...normalizedFiles.filter((file) => file.source?.repository)
179
+ ]);
180
+ const localFiles = uniqueAcceptedFiles([
181
+ ...prior.localFiles,
182
+ ...normalizedFiles.filter((file) => !file.source?.repository)
183
+ ]);
184
+ const summary = summarizePortableFindings(findings);
185
+ const providerResponses = repositoryFiles.length
186
+ ? Object.freeze([Object.freeze({
187
+ providerId: 'host-repository',
188
+ priority: 85,
189
+ remoteFetch: true,
190
+ files: Object.freeze(repositoryFiles)
191
+ })])
192
+ : Object.freeze([]);
193
+ return Object.freeze({
194
+ schema: PORTABLE_HOST_ACTION_ACCEPTANCE_SCHEMA_ID,
195
+ actionId: plan.actionId || receipt.actionId || '',
196
+ action: plan.action || receipt.action || '',
197
+ status: summary.counts.error ? 'rejected' : 'accepted',
198
+ providerResponses,
199
+ material: Object.freeze({ files: Object.freeze(localFiles) }),
200
+ interpretations: Object.freeze(interpretations),
201
+ cumulativeRecovery: Object.freeze({
202
+ priorAccepted: prior.accepted,
203
+ repositoryFiles: repositoryFiles.length,
204
+ localFiles: localFiles.length,
205
+ boundary: 'Prior accepted recovery material is carried forward only through explicit accept-host-receipt input; no hidden session memory or cache authority is used.'
206
+ }),
207
+ continuation: plan.continuation || null,
208
+ boundary: Object.freeze({
209
+ repositorySourceRequiresExplicitReceiptMetadata: true,
210
+ localMaterialIsNeverPromotedToRepositorySource: true,
211
+ interpretationsAreGeneratedAndSeparateFromSourceMaterial: true,
212
+ rawToolOutputRetainedByHostOnly: true
213
+ }),
214
+ findings: Object.freeze(findings),
215
+ findingSummary: summary
216
+ });
217
+ }
218
+
219
+ function acceptedPriorMaterial(value = {}, findings = []) {
220
+ const prior = value?.result || value || {};
221
+ const supplied = Boolean(prior && Object.keys(prior).length);
222
+ if (!supplied) return Object.freeze({ accepted: false, repositoryFiles: Object.freeze([]), localFiles: Object.freeze([]) });
223
+ if (String(prior.status || '') !== 'accepted') {
224
+ findings.push(portableFinding('error', 'portable.host-receipt.prior-unaccepted', 'Cumulative receipt acceptance requires a previously accepted host-action result.'));
225
+ return Object.freeze({ accepted: false, repositoryFiles: Object.freeze([]), localFiles: Object.freeze([]) });
226
+ }
227
+ const repositoryFiles = [];
228
+ for (const response of Array.isArray(prior.providerResponses) ? prior.providerResponses : []) {
229
+ for (const file of Array.isArray(response?.files) ? response.files : []) {
230
+ if (file?.source?.receiptQualification === 'accepted-host-repository-read') repositoryFiles.push(file);
231
+ }
232
+ }
233
+ const localFiles = Array.isArray(prior.material?.files) ? prior.material.files.filter(Boolean) : [];
234
+ return Object.freeze({
235
+ accepted: true,
236
+ repositoryFiles: Object.freeze(repositoryFiles),
237
+ localFiles: Object.freeze(localFiles)
238
+ });
239
+ }
240
+
241
+ function uniqueAcceptedFiles(files = []) {
242
+ const out = [];
243
+ const seen = new Set();
244
+ for (const file of files) {
245
+ const source = file?.source || {};
246
+ const key = [
247
+ String(source.repository || ''),
248
+ String(source.commit || source.ref || ''),
249
+ String(source.path || file?.path || ''),
250
+ String(file?.content || '')
251
+ ].join('\u0000');
252
+ if (seen.has(key)) continue;
253
+ seen.add(key);
254
+ out.push(file);
255
+ }
256
+ return out;
257
+ }
258
+
259
+ function capability(name, patterns, negativePatterns = []) { return Object.freeze({ name, patterns, negativePatterns }); }
260
+
261
+ function scoreTool(tool, capabilityName, descriptor) {
262
+ const corpus = `${tool.name} ${tool.description}`.toLowerCase();
263
+ const explicit = tool.capabilities.map((value) => value.toLowerCase());
264
+ let score = 0;
265
+ const reasons = [];
266
+ if (explicit.includes(capabilityName.toLowerCase())) { score += 120; reasons.push('explicit-capability-tag'); }
267
+ for (const pattern of descriptor.patterns) {
268
+ if (pattern.test(corpus)) { score += patternScore(pattern, tool.name); reasons.push(`matched:${pattern.source}`); }
269
+ }
270
+ for (const pattern of descriptor.negativePatterns || []) {
271
+ if (pattern.test(corpus)) { score -= 80; reasons.push(`negative:${pattern.source}`); }
272
+ }
273
+ if (score > 0 && tool.name.toLowerCase().includes('github') && capabilityName.startsWith('repository')) score += 35;
274
+ if (score > 0 && /fetch_file|open_image|read_file|search$|\.search/.test(tool.name.toLowerCase())) score += 10;
275
+ return Object.freeze({ tool, score: Math.max(0, score), reasons: Object.freeze(reasons) });
276
+ }
277
+
278
+ function patternScore(pattern, name = '') {
279
+ const source = pattern.source;
280
+ if (String(name).toLowerCase().match(pattern)) return 50;
281
+ if (/github|repository|fetch file|open image/.test(source)) return 35;
282
+ return 20;
283
+ }
284
+
285
+ function normalizeAction(value = '') {
286
+ const normalized = String(value || '').trim().toLowerCase().replace(/[_\s]+/g, '-');
287
+ for (const [name, blueprint] of Object.entries(ACTIONS)) {
288
+ if (normalized === name || blueprint.aliases.includes(normalized)) return name;
289
+ }
290
+ return normalized;
291
+ }
292
+
293
+ function argumentsTemplate(capabilityName, request = {}) {
294
+ if (capabilityName === 'repositorySearch') return Object.freeze({
295
+ repository: request.repository || '<explicit repository>',
296
+ queries: request.searchQueries || [request.schemaId ? `${request.schemaId}.schema.md` : '<query>'],
297
+ ref: request.ref || '<explicit ref>'
298
+ });
299
+ if (capabilityName === 'repositoryRead') return Object.freeze({
300
+ repository: request.repository || '<explicit repository>',
301
+ path: request.path || '<exact path selected from search result or expectedPaths>',
302
+ ref: request.ref || '<explicit ref>'
303
+ });
304
+ if (capabilityName === 'repositoryWrite') return Object.freeze({ repository: request.repository || '<explicit repository>', path: request.path || '<explicit target path>', ref: request.ref || '<explicit ref>', content: '<explicit reviewed content>' });
305
+ if (capabilityName === 'filesystemRead') return Object.freeze({ path: request.path || request.localPath || '<local path>' });
306
+ if (capabilityName === 'archiveRead') return Object.freeze({ archivePath: request.archivePath || request.locator?.archivePath || '<archive path>', entryPath: request.entryPath || request.locator?.entryPath || '<entry path>' });
307
+ if (capabilityName === 'images' || capabilityName === 'pdf') return Object.freeze({ path: request.asset?.path || request.assetPath || request.path || '<asset path>', locator: request.asset?.locator || request.locator || null });
308
+ if (capabilityName === 'filesystemWrite') return Object.freeze({ path: request.path || '<output path>', content: '<explicit local content>' });
309
+ if (capabilityName === 'remoteWriteAvailable') return Object.freeze({ target: request.target || '<explicit authorized remote target>', content: '<explicit reviewed content>' });
310
+ if (capabilityName === 'artifactReturn') return Object.freeze({ artifact: request.artifact || '<explicit local artifact/result>' });
311
+ if (capabilityName === 'humanConfirmation') return Object.freeze({ prompt: request.prompt || request.purpose || '<bounded confirmation request>' });
312
+ if (capabilityName === 'authenticationRequest') return Object.freeze({ service: request.service || '<service>', purpose: request.purpose || '<bounded authentication purpose>' });
313
+ if (capabilityName === 'copyableTextPresentation') return Object.freeze({ text: request.text || '<exact text>', presentation: 'copyable' });
314
+ return Object.freeze({});
315
+ }
316
+
317
+ function expectedResult(capabilityName) {
318
+ if (capabilityName === 'repositorySearch') return Object.freeze({ paths: ['<repository path>'], repository: '<owner/name>', ref: '<resolved ref or commit>' });
319
+ if (capabilityName === 'repositoryRead') return Object.freeze({ files: [{ path: '<repository path>', content: '<UTF-8 text>', source: { repository: '<owner/name>', ref: '<ref>', commit: '<commit when available>', path: '<repository path>', authority: '<explicit claim>' } }] });
320
+ if (capabilityName === 'repositoryWrite') return Object.freeze({ status: '<completed status>', target: { repository: '<owner/name>', path: '<path>', ref: '<ref>' }, receipt: '<host evidence>' });
321
+ if (capabilityName === 'filesystemRead' || capabilityName === 'archiveRead') return Object.freeze({ files: [{ path: '<local or archive-relative path>', content: '<UTF-8 text or explicit asset locator>' }] });
322
+ if (capabilityName === 'images' || capabilityName === 'pdf') return Object.freeze({ assetPath: '<asset path>', description: '<generated description>', observations: ['<bounded observation>'], qualification: { mode: 'host-multimodal' } });
323
+ if (capabilityName === 'artifactReturn') return Object.freeze({ status: 'completed', artifactReference: '<host-returned artifact reference>' });
324
+ if (capabilityName === 'humanConfirmation') return Object.freeze({ status: 'completed', confirmed: '<true|false>', responder: '<explicit responder when available>' });
325
+ if (capabilityName === 'authenticationRequest') return Object.freeze({ status: 'completed', authenticationState: '<authorized|declined|unavailable>', credentialMaterial: 'not-returned-to-portable-tooling' });
326
+ if (capabilityName === 'copyableTextPresentation') return Object.freeze({ status: 'completed', presentation: 'copyable-text' });
327
+ return Object.freeze({ status: '<completed status>', result: '<explicit normalized result>' });
328
+ }
329
+
330
+ function expectedReceiptShape(capabilityName) { return expectedResult(capabilityName); }
331
+
332
+ function continuationFor(action, request = {}) {
333
+ if (action === 'repository-schema-resolution') return Object.freeze({ operation: request.nextOperation || 'resolve-schema-material', mergeAs: 'providerResponses' });
334
+ if (action === 'image-analysis' || action === 'pdf-analysis') return Object.freeze({ operation: 'accept-host-receipt', mergeAs: 'interpretations' });
335
+ return Object.freeze({ operation: 'accept-host-receipt', mergeAs: 'material-or-result' });
336
+ }
337
+
338
+ function sanitizeRequest(value = {}) {
339
+ const safe = {};
340
+ for (const key of ['schemaId', 'repository', 'ref', 'path', 'assetPath', 'capability', 'purpose', 'searchQueries', 'expectedPaths', 'nextOperation']) {
341
+ if (value[key] !== undefined) safe[key] = value[key];
342
+ }
343
+ if (value.asset) safe.asset = { path: value.asset.path, mimeType: value.asset.mimeType, locator: value.asset.locator };
344
+ return safe;
345
+ }
346
+
347
+ function stableStringify(value) { return JSON.stringify(sortValue(value)); }
348
+ function sortValue(value) {
349
+ if (Array.isArray(value)) return value.map(sortValue);
350
+ if (!value || typeof value !== 'object') return value;
351
+ return Object.fromEntries(Object.keys(value).sort().map((key) => [key, sortValue(value[key])]));
352
+ }
353
+ function stableHash(value = '') {
354
+ let hash = 2166136261;
355
+ for (const char of String(value)) { hash ^= char.charCodeAt(0); hash = Math.imul(hash, 16777619); }
356
+ return (hash >>> 0).toString(16).padStart(8, '0');
357
+ }