@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.
- package/LICENSE +201 -0
- package/NOTICE +31 -0
- package/README.md +45 -0
- package/package.json +176 -0
- package/src/actions/record.actions.js +312 -0
- package/src/adapters/adapter.contracts.js +143 -0
- package/src/adapters/archive/archive.adapter.js +502 -0
- package/src/adapters/archive/archive.portableChangeset.js +141 -0
- package/src/adapters/archive/archive.transport.js +124 -0
- package/src/artifacts/artifact.localDraft.js +27 -0
- package/src/artifacts/artifact.normalize.js +28 -0
- package/src/artifacts/artifact.parse.js +207 -0
- package/src/artifacts/artifact.record.js +83 -0
- package/src/audit/audit.run.js +103 -0
- package/src/audit/audit.summary.js +7 -0
- package/src/diagnostics/sourceBoundary.report.js +112 -0
- package/src/export/package.apply.js +349 -0
- package/src/export/package.builder.js +366 -0
- package/src/export/package.bytes.js +164 -0
- package/src/export/package.controlIntegrity.js +42 -0
- package/src/export/package.controlTopology.js +97 -0
- package/src/export/package.fileMap.js +174 -0
- package/src/export/package.manifest.js +401 -0
- package/src/export/package.preflight.js +204 -0
- package/src/export/package.sourceReference.js +81 -0
- package/src/export/package.workspaceContext.js +144 -0
- package/src/export/package.zip.js +128 -0
- package/src/export/tree.bundle.js +278 -0
- package/src/governance/governance.boundary.js +196 -0
- package/src/integrity/integrity.c14nV2.js +190 -0
- package/src/integrity/integrity.methodReference.js +73 -0
- package/src/integrity/integrity.validate.js +56 -0
- package/src/lineage/lineage.candidateResolution.js +46 -0
- package/src/lineage/lineage.githubIssueComment.js +106 -0
- package/src/lineage/lineage.githubIssueLocal.js +196 -0
- package/src/lineage/lineage.githubIssueTarget.js +89 -0
- package/src/lineage/lineage.integrity.js +133 -0
- package/src/lineage/lineage.materialPreference.js +26 -0
- package/src/lineage/lineage.model.js +63 -0
- package/src/lineage/lineage.parentAuthority.js +5 -0
- package/src/lineage/lineage.parentBinding.js +104 -0
- package/src/lineage/lineage.pathBasis.js +47 -0
- package/src/lineage/lineage.resolve.js +388 -0
- package/src/lineage/lineage.sourceScope.js +74 -0
- package/src/lineage/lineage.targetKeys.js +80 -0
- package/src/lineage/lineage.traverse.js +132 -0
- package/src/public/applicationProjection.js +236 -0
- package/src/public/companionResources.js +246 -0
- package/src/public/index.js +16 -0
- package/src/public/node.js +2 -0
- package/src/public/schemaAncestry.js +26 -0
- package/src/publication/publication.contract.js +196 -0
- package/src/publication/publication.preflight.js +159 -0
- package/src/publication/publication.targetContract.js +241 -0
- package/src/reingest/reingest.plan.js +162 -0
- package/src/release/plan.mjs +28 -0
- package/src/release/policy.mjs +100 -0
- package/src/release/run.mjs +74 -0
- package/src/schemas/capability.registry.js +226 -0
- package/src/schemas/companion.js +245 -0
- package/src/schemas/contracts.js +6 -0
- package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.js +14 -0
- package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.json +23 -0
- package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.runtime.json +4283 -0
- package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.source.js +9 -0
- package/src/schemas/coordination/project/tiinex.project.v1.schema.js +26 -0
- package/src/schemas/coordination/project/tiinex.project.v1.schema.json +23 -0
- package/src/schemas/coordination/project/tiinex.project.v1.schema.runtime.json +1985 -0
- package/src/schemas/coordination/project/tiinex.project.v1.schema.source.js +9 -0
- package/src/schemas/core/decision/tiinex.decision.v1.schema.js +14 -0
- package/src/schemas/core/decision/tiinex.decision.v1.schema.json +24 -0
- package/src/schemas/core/decision/tiinex.decision.v1.schema.runtime.json +1700 -0
- package/src/schemas/core/decision/tiinex.decision.v1.schema.source.js +9 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.capabilities.js +14 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.en.i18n.json +6 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.findings.js +9 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.presenter.js +1 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.schema.js +32 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.schema.json +24 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.schema.runtime.json +2184 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.schema.source.js +9 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.sv.i18n.json +6 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.transitions.js +1 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.validate.js +10 -0
- package/src/schemas/core/feedback/tiinex.feedback.v1.schema.js +14 -0
- package/src/schemas/core/feedback/tiinex.feedback.v1.schema.json +23 -0
- package/src/schemas/core/feedback/tiinex.feedback.v1.schema.runtime.json +1773 -0
- package/src/schemas/core/feedback/tiinex.feedback.v1.schema.source.js +9 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.capabilities.js +11 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.contract.js +40 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.en.i18n.json +9 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.findings.js +12 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.localMaterialization.js +89 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.presenter.js +8 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.js +34 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.json +23 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.runtime.json +2029 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.source.js +9 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.sv.i18n.json +9 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.transitions.js +1 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.validate.js +25 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.capabilities.js +14 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.en.i18n.json +6 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.findings.js +9 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.presenter.js +1 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.schema.js +31 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.schema.json +23 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.schema.runtime.json +2033 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.schema.source.js +9 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.sv.i18n.json +6 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.transitions.js +1 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.validate.js +10 -0
- package/src/schemas/core/relation/tiinex.relation.v1.capabilities.js +7 -0
- package/src/schemas/core/relation/tiinex.relation.v1.contract.js +3 -0
- package/src/schemas/core/relation/tiinex.relation.v1.en.i18n.json +4 -0
- package/src/schemas/core/relation/tiinex.relation.v1.findings.js +9 -0
- package/src/schemas/core/relation/tiinex.relation.v1.localMaterialization.js +153 -0
- package/src/schemas/core/relation/tiinex.relation.v1.presenter.js +3 -0
- package/src/schemas/core/relation/tiinex.relation.v1.schema.js +20 -0
- package/src/schemas/core/relation/tiinex.relation.v1.schema.json +23 -0
- package/src/schemas/core/relation/tiinex.relation.v1.schema.runtime.json +1668 -0
- package/src/schemas/core/relation/tiinex.relation.v1.schema.source.js +9 -0
- package/src/schemas/core/relation/tiinex.relation.v1.sv.i18n.json +4 -0
- package/src/schemas/core/relation/tiinex.relation.v1.transitions.js +1 -0
- package/src/schemas/core/relation/tiinex.relation.v1.validate.js +36 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.capabilities.js +14 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.contract.js +57 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.en.i18n.json +4 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.findings.js +13 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.presenter.js +3 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.js +20 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.json +24 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.runtime.json +3315 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.source.js +9 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.sv.i18n.json +4 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.transitions.js +1 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.validate.js +78 -0
- package/src/schemas/core/signal/tiinex.signal.v1.schema.js +14 -0
- package/src/schemas/core/signal/tiinex.signal.v1.schema.json +23 -0
- package/src/schemas/core/signal/tiinex.signal.v1.schema.runtime.json +1733 -0
- package/src/schemas/core/signal/tiinex.signal.v1.schema.source.js +9 -0
- package/src/schemas/core/task/tiinex.task.v1.capabilities.js +11 -0
- package/src/schemas/core/task/tiinex.task.v1.contract.js +3 -0
- package/src/schemas/core/task/tiinex.task.v1.en.i18n.json +15 -0
- package/src/schemas/core/task/tiinex.task.v1.findings.js +18 -0
- package/src/schemas/core/task/tiinex.task.v1.localMaterialization.js +148 -0
- package/src/schemas/core/task/tiinex.task.v1.presenter.js +8 -0
- package/src/schemas/core/task/tiinex.task.v1.schema.js +35 -0
- package/src/schemas/core/task/tiinex.task.v1.schema.json +23 -0
- package/src/schemas/core/task/tiinex.task.v1.schema.runtime.json +1708 -0
- package/src/schemas/core/task/tiinex.task.v1.schema.source.js +9 -0
- package/src/schemas/core/task/tiinex.task.v1.sv.i18n.json +15 -0
- package/src/schemas/core/task/tiinex.task.v1.transitions.js +3 -0
- package/src/schemas/core/task/tiinex.task.v1.validate.js +41 -0
- package/src/schemas/core/topic/tiinex.topic.v1.capabilities.js +14 -0
- package/src/schemas/core/topic/tiinex.topic.v1.creation.js +46 -0
- package/src/schemas/core/topic/tiinex.topic.v1.en.i18n.json +8 -0
- package/src/schemas/core/topic/tiinex.topic.v1.findings.js +11 -0
- package/src/schemas/core/topic/tiinex.topic.v1.localMaterialization.js +135 -0
- package/src/schemas/core/topic/tiinex.topic.v1.presenter.js +1 -0
- package/src/schemas/core/topic/tiinex.topic.v1.schema.js +34 -0
- package/src/schemas/core/topic/tiinex.topic.v1.schema.json +23 -0
- package/src/schemas/core/topic/tiinex.topic.v1.schema.runtime.json +1699 -0
- package/src/schemas/core/topic/tiinex.topic.v1.schema.source.js +9 -0
- package/src/schemas/core/topic/tiinex.topic.v1.sv.i18n.json +8 -0
- package/src/schemas/core/topic/tiinex.topic.v1.transitions.js +31 -0
- package/src/schemas/core/topic/tiinex.topic.v1.validate.js +11 -0
- package/src/schemas/creation.capability.js +289 -0
- package/src/schemas/creation.contracts.js +334 -0
- package/src/schemas/creation.executionSnapshot.js +79 -0
- package/src/schemas/creation.factoryQualification.js +73 -0
- package/src/schemas/creation.renderer.js +244 -0
- package/src/schemas/creation.representation.js +279 -0
- package/src/schemas/creation.rootMetadata.js +6 -0
- package/src/schemas/creation.schemaReferences.js +65 -0
- package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.js +14 -0
- package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.json +23 -0
- package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.runtime.json +1873 -0
- package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.source.js +9 -0
- package/src/schemas/discovery/tiinex.discovery.v1.schema.js +14 -0
- package/src/schemas/discovery/tiinex.discovery.v1.schema.json +23 -0
- package/src/schemas/discovery/tiinex.discovery.v1.schema.runtime.json +1839 -0
- package/src/schemas/discovery/tiinex.discovery.v1.schema.source.js +9 -0
- package/src/schemas/generic.artifact.module.js +25 -0
- package/src/schemas/party/organization/tiinex.party.organization.v1.schema.js +26 -0
- package/src/schemas/party/organization/tiinex.party.organization.v1.schema.json +23 -0
- package/src/schemas/party/organization/tiinex.party.organization.v1.schema.runtime.json +2249 -0
- package/src/schemas/party/organization/tiinex.party.organization.v1.schema.source.js +9 -0
- package/src/schemas/party/role/tiinex.party.role.v1.schema.js +26 -0
- package/src/schemas/party/role/tiinex.party.role.v1.schema.json +24 -0
- package/src/schemas/party/role/tiinex.party.role.v1.schema.runtime.json +2091 -0
- package/src/schemas/party/role/tiinex.party.role.v1.schema.source.js +9 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.capabilities.js +14 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.en.i18n.json +4 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.findings.js +1 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.presenter.js +1 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.js +29 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.json +21 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.runtime.json +2180 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.source.js +9 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.sv.i18n.json +4 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.transitions.js +1 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.validate.js +1 -0
- package/src/schemas/reduction/tiinex.reduction.v1.schema.js +26 -0
- package/src/schemas/reduction/tiinex.reduction.v1.schema.json +23 -0
- package/src/schemas/reduction/tiinex.reduction.v1.schema.runtime.json +1733 -0
- package/src/schemas/reduction/tiinex.reduction.v1.schema.source.js +9 -0
- package/src/schemas/reference.shapes.js +33 -0
- package/src/schemas/registry.js +36 -0
- package/src/schemas/resolver.js +13 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.capabilities.js +14 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.en.i18n.json +4 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.findings.js +1 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.presenter.js +1 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.schema.js +29 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.schema.json +21 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.schema.runtime.json +2093 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.schema.source.js +9 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.sv.i18n.json +4 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.transitions.js +1 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.validate.js +1 -0
- package/src/schemas/schema.factory.descriptor.js +104 -0
- package/src/schemas/schema.githubSourceTarget.js +131 -0
- package/src/schemas/schema.identity.js +10 -0
- package/src/schemas/schema.reference.js +133 -0
- package/src/schemas/schema.source.js +239 -0
- package/src/schemas/tiinex.root.v1.capabilities.js +14 -0
- package/src/schemas/tiinex.root.v1.classify.js +55 -0
- package/src/schemas/tiinex.root.v1.en.i18n.json +24 -0
- package/src/schemas/tiinex.root.v1.fallback.js +84 -0
- package/src/schemas/tiinex.root.v1.findings.js +19 -0
- package/src/schemas/tiinex.root.v1.presenter.js +5 -0
- package/src/schemas/tiinex.root.v1.schema.js +29 -0
- package/src/schemas/tiinex.root.v1.schema.json +24 -0
- package/src/schemas/tiinex.root.v1.schema.runtime.json +1574 -0
- package/src/schemas/tiinex.root.v1.schema.source.js +9 -0
- package/src/schemas/tiinex.root.v1.sv.i18n.json +24 -0
- package/src/schemas/tiinex.root.v1.transitions.js +1 -0
- package/src/schemas/tiinex.root.v1.validate.js +36 -0
- package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.js +14 -0
- package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.json +23 -0
- package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.runtime.json +2027 -0
- package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.source.js +9 -0
- package/src/schemas/validation/method/tiinex.validation.method.v1.schema.js +14 -0
- package/src/schemas/validation/method/tiinex.validation.method.v1.schema.json +23 -0
- package/src/schemas/validation/method/tiinex.validation.method.v1.schema.runtime.json +1848 -0
- package/src/schemas/validation/method/tiinex.validation.method.v1.schema.source.js +9 -0
- package/src/schemas/validation/report/tiinex.validation.report.v1.schema.js +14 -0
- package/src/schemas/validation/report/tiinex.validation.report.v1.schema.json +23 -0
- package/src/schemas/validation/report/tiinex.validation.report.v1.schema.runtime.json +2015 -0
- package/src/schemas/validation/report/tiinex.validation.report.v1.schema.source.js +9 -0
- package/src/schemas/workspace/tiinex.workspace.v1.capabilities.js +12 -0
- package/src/schemas/workspace/tiinex.workspace.v1.en.i18n.json +7 -0
- package/src/schemas/workspace/tiinex.workspace.v1.findings.js +5 -0
- package/src/schemas/workspace/tiinex.workspace.v1.presenter.js +27 -0
- package/src/schemas/workspace/tiinex.workspace.v1.schema.js +30 -0
- package/src/schemas/workspace/tiinex.workspace.v1.schema.json +23 -0
- package/src/schemas/workspace/tiinex.workspace.v1.schema.runtime.json +1596 -0
- package/src/schemas/workspace/tiinex.workspace.v1.schema.source.js +9 -0
- package/src/schemas/workspace/tiinex.workspace.v1.sv.i18n.json +7 -0
- package/src/schemas/workspace/tiinex.workspace.v1.transitions.js +10 -0
- package/src/schemas/workspace/tiinex.workspace.v1.validate.js +10 -0
- package/src/sources/github/github.issueTarget.js +127 -0
- package/src/sources/origin.references.js +249 -0
- package/src/sources/source.explicitTargets.js +49 -0
- package/src/sources/transport.levels.js +107 -0
- package/src/tooling/portable/adapters/cli/cli.cold-start-input.js +34 -0
- package/src/tooling/portable/adapters/cli/cli.command-input.js +455 -0
- package/src/tooling/portable/adapters/cli/cli.common-author.js +249 -0
- package/src/tooling/portable/adapters/cli/cli.common-output.js +330 -0
- package/src/tooling/portable/adapters/cli/cli.editor-assistance.js +13 -0
- package/src/tooling/portable/adapters/cli/cli.ground-materialize.js +96 -0
- package/src/tooling/portable/adapters/cli/cli.ground-recovery.js +99 -0
- package/src/tooling/portable/adapters/cli/cli.handoff-manufacture.js +345 -0
- package/src/tooling/portable/adapters/cli/cli.handoff-sibling-allocation.js +31 -0
- package/src/tooling/portable/adapters/cli/cli.help.js +80 -0
- package/src/tooling/portable/adapters/cli/cli.land.js +13 -0
- package/src/tooling/portable/adapters/cli/cli.local-output.js +72 -0
- package/src/tooling/portable/adapters/cli/cli.material-policy.js +6 -0
- package/src/tooling/portable/adapters/cli/cli.operator-bridge.js +18 -0
- package/src/tooling/portable/adapters/cli/cli.reduction-input.js +14 -0
- package/src/tooling/portable/adapters/cli/cli.run.js +434 -0
- package/src/tooling/portable/adapters/llm/llm.entrypoint.js +34 -0
- package/src/tooling/portable/adapters/node/checkpoint.verify.js +267 -0
- package/src/tooling/portable/adapters/node/handoff.manufacture.bootstrap.js +109 -0
- package/src/tooling/portable/adapters/node/handoff.manufacture.enumeration.js +94 -0
- package/src/tooling/portable/adapters/node/handoff.manufacture.js +193 -0
- package/src/tooling/portable/adapters/node/handoff.manufacture.multiRoot.js +49 -0
- package/src/tooling/portable/adapters/node/handoff.manufacture.packageParent.js +130 -0
- package/src/tooling/portable/adapters/node/handoff.manufacture.requirements.js +353 -0
- package/src/tooling/portable/adapters/node/handoff.manufacture.scope.js +147 -0
- package/src/tooling/portable/adapters/node/workspaceCarrier.manufacture.js +62 -0
- package/src/tooling/portable/assets/asset.operations.js +170 -0
- package/src/tooling/portable/audit/audit.capability.js +119 -0
- package/src/tooling/portable/bootstrap/artifact.result.selfverify.mjs +109 -0
- package/src/tooling/portable/bootstrap/bootstrap.case.mjs +43 -0
- package/src/tooling/portable/bootstrap/tiinex.llm.bootstrap.md +814 -0
- package/src/tooling/portable/bootstrap/tiinex.llm.bootstrap.pointer.json +25 -0
- package/src/tooling/portable/checkpoint/portable.checkpoint.js +89 -0
- package/src/tooling/portable/conformance/checkpoint.qualification.js +271 -0
- package/src/tooling/portable/draft/draft.create.js +389 -0
- package/src/tooling/portable/draft/draft.crud.js +175 -0
- package/src/tooling/portable/draft/draft.exact.js +173 -0
- package/src/tooling/portable/draft/draft.operations.js +265 -0
- package/src/tooling/portable/draft/draft.qualification.js +45 -0
- package/src/tooling/portable/draft/draft.set.js +193 -0
- package/src/tooling/portable/draft/draft.validation-context.js +7 -0
- package/src/tooling/portable/editor/authoring.parent.js +37 -0
- package/src/tooling/portable/editor/editor.assistance.js +221 -0
- package/src/tooling/portable/editor/staged.validation.js +96 -0
- package/src/tooling/portable/engine.facade.js +468 -0
- package/src/tooling/portable/findings.js +92 -0
- package/src/tooling/portable/grounding/grounding.capsule.js +128 -0
- package/src/tooling/portable/grounding/grounding.continuity.js +283 -0
- package/src/tooling/portable/grounding/grounding.participantAuthority.js +20 -0
- package/src/tooling/portable/grounding/grounding.planningContext.js +34 -0
- package/src/tooling/portable/grounding/grounding.readiness.authority.js +17 -0
- package/src/tooling/portable/grounding/grounding.readiness.js +316 -0
- package/src/tooling/portable/grounding/grounding.readiness.support.js +245 -0
- package/src/tooling/portable/grounding/grounding.sourceEvidence.js +71 -0
- package/src/tooling/portable/grounding/grounding.workContext.js +72 -0
- package/src/tooling/portable/grounding/grounding.workProvenance.js +153 -0
- package/src/tooling/portable/handoff/carrierLineage.js +214 -0
- package/src/tooling/portable/handoff/carrierProfile.js +54 -0
- package/src/tooling/portable/handoff/carrierProjection.js +193 -0
- package/src/tooling/portable/handoff/carrierProjection.routeQualification.js +228 -0
- package/src/tooling/portable/handoff/carrierProjection.shared.js +7 -0
- package/src/tooling/portable/handoff/carrierProjection.workspaces.js +54 -0
- package/src/tooling/portable/handoff/coldConsumerEntrypoint.js +185 -0
- package/src/tooling/portable/handoff/coldStartQualification.contract.js +184 -0
- package/src/tooling/portable/handoff/coldStartQualification.grounding.js +392 -0
- package/src/tooling/portable/handoff/coldStartQualification.js +22 -0
- package/src/tooling/portable/handoff/coldStartQualification.materials.js +364 -0
- package/src/tooling/portable/handoff/coldStartQualification.observation.js +220 -0
- package/src/tooling/portable/handoff/coldStartQualification.run.js +81 -0
- package/src/tooling/portable/handoff/coldStartQualification.shared.js +57 -0
- package/src/tooling/portable/handoff/coldStartRolePointers.js +39 -0
- package/src/tooling/portable/handoff/contextAudit.js +247 -0
- package/src/tooling/portable/handoff/contracts/tiinex.handoff.package.v1.schema.md +409 -0
- package/src/tooling/portable/handoff/handoffAuthoringPlan.js +35 -0
- package/src/tooling/portable/handoff/handoffEndpointProjection.js +61 -0
- package/src/tooling/portable/handoff/handoffLeafProjection.js +91 -0
- package/src/tooling/portable/handoff/humanOutputPresentation.js +21 -0
- package/src/tooling/portable/handoff/manufacture.js +84 -0
- package/src/tooling/portable/handoff/materialClosure.archiveV2.binding.js +72 -0
- package/src/tooling/portable/handoff/materialClosure.archiveV2.direct.js +160 -0
- package/src/tooling/portable/handoff/materialClosure.archiveV2.indexes.js +36 -0
- package/src/tooling/portable/handoff/materialClosure.archiveV2.js +247 -0
- package/src/tooling/portable/handoff/materialClosure.archiveV2.projectionProvider.js +44 -0
- package/src/tooling/portable/handoff/materialClosure.archiveV2.workspace.js +226 -0
- package/src/tooling/portable/handoff/materialClosure.descriptor.js +169 -0
- package/src/tooling/portable/handoff/materialClosure.inputBinding.js +372 -0
- package/src/tooling/portable/handoff/materialClosure.inputBinding.support.js +62 -0
- package/src/tooling/portable/handoff/materialClosure.materialized.js +143 -0
- package/src/tooling/portable/handoff/materialClosure.materials.js +116 -0
- package/src/tooling/portable/handoff/materialClosure.package.js +181 -0
- package/src/tooling/portable/handoff/materialClosure.plan.js +204 -0
- package/src/tooling/portable/handoff/materialClosure.readiness.js +36 -0
- package/src/tooling/portable/handoff/materialClosure.requirements.js +137 -0
- package/src/tooling/portable/handoff/operatorContextProjection.js +105 -0
- package/src/tooling/portable/handoff/pointerEntrypoint.js +138 -0
- package/src/tooling/portable/handoff/qualifiedHandoffFixture.js +34 -0
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.build.js +321 -0
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.closure.js +126 -0
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.inspect.js +194 -0
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.materials.js +207 -0
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.projection.js +69 -0
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.roles.js +166 -0
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.routes.js +113 -0
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.shared.js +87 -0
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.workspaces.js +160 -0
- package/src/tooling/portable/handoff/recipientV2.artifactFirstPhase1.js +44 -0
- package/src/tooling/portable/handoff/recipientV2.artifactInspection.js +55 -0
- package/src/tooling/portable/handoff/recipientV2.artifacts.js +174 -0
- package/src/tooling/portable/handoff/recipientV2.coldProjection.js +24 -0
- package/src/tooling/portable/handoff/recipientV2.delivery.js +48 -0
- package/src/tooling/portable/handoff/recipientV2.endpointRolePointers.js +179 -0
- package/src/tooling/portable/handoff/recipientV2.entryContract.js +28 -0
- package/src/tooling/portable/handoff/recipientV2.humanOutput.js +78 -0
- package/src/tooling/portable/handoff/recipientV2.inspect.helpers.js +218 -0
- package/src/tooling/portable/handoff/recipientV2.inspect.js +194 -0
- package/src/tooling/portable/handoff/recipientV2.inspect.pathToken.js +9 -0
- package/src/tooling/portable/handoff/recipientV2.inspect.projection.js +58 -0
- package/src/tooling/portable/handoff/recipientV2.inspect.workspaces.js +177 -0
- package/src/tooling/portable/handoff/recipientV2.lineage.js +142 -0
- package/src/tooling/portable/handoff/recipientV2.packageV1.build.js +147 -0
- package/src/tooling/portable/handoff/recipientV2.packageV1.constants.js +4 -0
- package/src/tooling/portable/handoff/recipientV2.packageV1.contract.js +101 -0
- package/src/tooling/portable/handoff/recipientV2.packageV1.inspect.helpers.js +126 -0
- package/src/tooling/portable/handoff/recipientV2.packageV1.inspect.js +185 -0
- package/src/tooling/portable/handoff/recipientV2.packageV1.js +12 -0
- package/src/tooling/portable/handoff/recipientV2.packageV1.shared.js +24 -0
- package/src/tooling/portable/handoff/recipientV2.packageV1.workspaceProjection.js +22 -0
- package/src/tooling/portable/handoff/recipientV2.pointer.js +40 -0
- package/src/tooling/portable/handoff/recipientV2.routeSelection.js +16 -0
- package/src/tooling/portable/handoff/recipientV2.topology.helpers.js +20 -0
- package/src/tooling/portable/handoff/recipientV2.topology.js +320 -0
- package/src/tooling/portable/handoff/recipientV2.topology.materials.js +70 -0
- package/src/tooling/portable/handoff/recipientV2.topology.workspaces.js +193 -0
- package/src/tooling/portable/handoff/recipientV2.transportManifest.js +123 -0
- package/src/tooling/portable/handoff/recipientV2.workspaceRepresentation.js +163 -0
- package/src/tooling/portable/handoff/routeArtifactConformance.js +130 -0
- package/src/tooling/portable/handoff/toolingBootstrap.js +67 -0
- package/src/tooling/portable/handoff/transportCompanion.js +175 -0
- package/src/tooling/portable/handoff/workspaceByteProvider.archive.js +95 -0
- package/src/tooling/portable/handoff/workspaceByteProvider.js +271 -0
- package/src/tooling/portable/handoff/workspaceCarrier.manufacture.js +93 -0
- package/src/tooling/portable/handoff/workspaceLandingPlan.js +142 -0
- package/src/tooling/portable/handoff/workspacePackageSources.js +105 -0
- package/src/tooling/portable/handoff/workspaceQualifiedReference.js +10 -0
- package/src/tooling/portable/handoff/workspaceSourceIdentity.js +52 -0
- package/src/tooling/portable/handoff/workspaceTargetConformance.js +134 -0
- package/src/tooling/portable/host/host.capabilities.js +181 -0
- package/src/tooling/portable/host/tool.bindings.js +357 -0
- package/src/tooling/portable/host/tool.receiptNormalization.js +141 -0
- package/src/tooling/portable/index.js +52 -0
- package/src/tooling/portable/input/node.input.js +184 -0
- package/src/tooling/portable/input/portable.input.js +249 -0
- package/src/tooling/portable/lifecycle/lifecycle.action.js +11 -0
- package/src/tooling/portable/lifecycle/lifecycle.material.js +173 -0
- package/src/tooling/portable/lifecycle/lifecycle.operations.js +34 -0
- package/src/tooling/portable/lifecycle/lifecycle.readiness.js +247 -0
- package/src/tooling/portable/lineage/lineage.integrity.apply.audit.js +22 -0
- package/src/tooling/portable/lineage/lineage.integrity.apply.evidence.js +36 -0
- package/src/tooling/portable/lineage/lineage.integrity.apply.js +306 -0
- package/src/tooling/portable/lineage/lineage.integrity.apply.structure.js +178 -0
- package/src/tooling/portable/lineage/lineage.integrity.plan.js +377 -0
- package/src/tooling/portable/lineage/lineage.integrity.projection.human.js +82 -0
- package/src/tooling/portable/lineage/lineage.integrity.projection.js +349 -0
- package/src/tooling/portable/lineage/lineage.operations.js +32 -0
- package/src/tooling/portable/lineage/lineage.print.js +398 -0
- package/src/tooling/portable/lineage/lineage.print.render.js +88 -0
- package/src/tooling/portable/lineage/lineage.print.utils.js +58 -0
- package/src/tooling/portable/lineage/lineage.publicationProviderReceipts.js +141 -0
- package/src/tooling/portable/lineage/lineage.publicationQualification.js +183 -0
- package/src/tooling/portable/lineage/lineage.search.js +301 -0
- package/src/tooling/portable/live/live.artifact.js +192 -0
- package/src/tooling/portable/live/live.export.js +107 -0
- package/src/tooling/portable/live/live.lineage.closure.js +71 -0
- package/src/tooling/portable/live/live.lineage.js +338 -0
- package/src/tooling/portable/live/live.protocol.js +181 -0
- package/src/tooling/portable/materialization/durable.materialize.js +162 -0
- package/src/tooling/portable/materialization/epistemic.plan.js +239 -0
- package/src/tooling/portable/materialization/loaded.parent.js +54 -0
- package/src/tooling/portable/materialization/materialization.facade.js +30 -0
- package/src/tooling/portable/operation.catalog.js +393 -0
- package/src/tooling/portable/operation.catalog.package.js +183 -0
- package/src/tooling/portable/operation.result.js +25 -0
- package/src/tooling/portable/orchestration/task.prepare.js +191 -0
- package/src/tooling/portable/output/artifact.result.package.js +308 -0
- package/src/tooling/portable/output/deterministic.zip.js +88 -0
- package/src/tooling/portable/output/node.artifact-set.js +223 -0
- package/src/tooling/portable/output/node.draft.js +41 -0
- package/src/tooling/portable/output/node.zip.js +39 -0
- package/src/tooling/portable/output/recipientV2.zip.js +59 -0
- package/src/tooling/portable/overview/blockingCue.js +16 -0
- package/src/tooling/portable/overview/operatingOverview.js +413 -0
- package/src/tooling/portable/package/generation.binding.js +314 -0
- package/src/tooling/portable/package/generation.binding.projection.js +128 -0
- package/src/tooling/portable/package/material.graph.js +236 -0
- package/src/tooling/portable/package/runtime.package.js +321 -0
- package/src/tooling/portable/package/schema.transition.companion.js +196 -0
- package/src/tooling/portable/package/semantic.package.graph.js +272 -0
- package/src/tooling/portable/package/semantic.package.js +203 -0
- package/src/tooling/portable/package/semantic.package.schema-resolution.js +158 -0
- package/src/tooling/portable/package/semantic.package.transition-registry.js +189 -0
- package/src/tooling/portable/package/semantic.package.types.js +18 -0
- package/src/tooling/portable/providers/schema.bootstrap.provenance.js +10 -0
- package/src/tooling/portable/providers/schema.provider.qualification.js +52 -0
- package/src/tooling/portable/providers/schema.providers.js +458 -0
- package/src/tooling/portable/publication/runtime.publication.js +53 -0
- package/src/tooling/portable/qualification.js +150 -0
- package/src/tooling/portable/reduction/reduction.composition.js +229 -0
- package/src/tooling/portable/reduction/reduction.eligibility.helpers.js +258 -0
- package/src/tooling/portable/reduction/reduction.eligibility.js +191 -0
- package/src/tooling/portable/reduction/reduction.operations.js +30 -0
- package/src/tooling/portable/reduction/reduction.preflight.js +85 -0
- package/src/tooling/portable/reduction/reduction.shared.js +173 -0
- package/src/tooling/portable/schema/bootstrap/canonical.pack.js +24 -0
- package/src/tooling/portable/schema/bootstrap/docs-3988951208eb9a8926e84ab42625d4b42fa00c2d/party/role/tiinex.party.role.v1.schema.md +289 -0
- package/src/tooling/portable/schema/bootstrap/docs-3988951208eb9a8926e84ab42625d4b42fa00c2d/validation/report/tiinex.validation.report.v1.schema.md +300 -0
- package/src/tooling/portable/schema/bootstrap/qualified-local-root/tiinex.root.v1.runtime-projection.json +48 -0
- package/src/tooling/portable/schema/bootstrap/qualified-local-root/tiinex.root.v1.schema.md +865 -0
- package/src/tooling/portable/schema/contract.compile.js +406 -0
- package/src/tooling/portable/schema/contract.compile.utils.js +9 -0
- package/src/tooling/portable/schema/contract.constraints.js +117 -0
- package/src/tooling/portable/schema/contract.envelope.validate.js +177 -0
- package/src/tooling/portable/schema/contract.field-domain.compile.js +399 -0
- package/src/tooling/portable/schema/contract.field-domain.js +247 -0
- package/src/tooling/portable/schema/contract.field-shape.compile.js +34 -0
- package/src/tooling/portable/schema/contract.inheritance.inline.js +103 -0
- package/src/tooling/portable/schema/contract.inheritance.js +210 -0
- package/src/tooling/portable/schema/contract.inheritance.record.js +76 -0
- package/src/tooling/portable/schema/contract.machine-shape.js +309 -0
- package/src/tooling/portable/schema/contract.project.js +81 -0
- package/src/tooling/portable/schema/contract.semantic-resolution.js +82 -0
- package/src/tooling/portable/schema/contract.validate.js +0 -0
- package/src/tooling/portable/schema/lexical.shape.v1.js +338 -0
- package/src/tooling/portable/schema/llm.companion.js +108 -0
- package/src/tooling/portable/schema/named.declarations.js +162 -0
- package/src/tooling/portable/schema/ordinary.contract.js +193 -0
- package/src/tooling/portable/schema/ordinary.fields.js +205 -0
- package/src/tooling/portable/schema/qualifiedLocalRoot.projection.js +70 -0
- package/src/tooling/portable/schema/qualifiedLocalRoot.runtime.js +170 -0
- package/src/tooling/portable/schema/schema.contract.js +465 -0
- package/src/tooling/portable/schema/schema.guide.js +326 -0
- package/src/tooling/portable/schema/schema.snapshot.js +119 -0
- package/src/tooling/portable/session/portable.session.js +145 -0
- package/src/tooling/portable/transfer/transfer.plan.js +102 -0
- package/src/transitions/record.transitions.js +484 -0
- package/src/transitions/transition.validate.js +129 -0
- package/src/validation/findings.js +76 -0
- package/src/validation/validateArtifact.js +216 -0
- package/src/workspaces/workspace.entrypointCapability.js +44 -0
- package/src/workspaces/workspace.materialRole.js +242 -0
- package/src/workspaces/workspace.recordPaths.js +426 -0
- 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
|
+
}
|