abelien-harness 0.14.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +9 -0
- package/README.md +2 -2
- package/package.json +2 -1
- package/skills/abelien-algorithm/SKILL.md +1 -0
- package/skills/abelien-algorithm/actions/algorithm.candidates.json +43 -0
- package/skills/abelien-algorithm/actions/algorithm.finalize.json +38 -0
- package/skills/abelien-algorithm/actions/algorithm.lane-state.json +38 -0
- package/skills/abelien-algorithm/actions/algorithm.research.json +70 -0
- package/skills/abelien-algorithm/bindings.json +58 -0
- package/skills/abelien-algorithm/contract/host-tools.generated.json +1235 -0
- package/skills/abelien-algorithm/domain.json +8 -2
- package/skills/abelien-algorithm/references/actions.generated.md +289 -0
- package/skills/abelien-algorithm/schemas/algorithm-common.v1.json +22 -0
- package/skills/abelien-algorithm/schemas/candidates-input.v1.json +15 -0
- package/skills/abelien-algorithm/schemas/candidates-result.v1.json +17 -0
- package/skills/abelien-algorithm/schemas/finalize-input.v1.json +17 -0
- package/skills/abelien-algorithm/schemas/finalize-result.v1.json +28 -0
- package/skills/abelien-algorithm/schemas/lane-state-input.v1.json +14 -0
- package/skills/abelien-algorithm/schemas/lane-state-result.v1.json +14 -0
- package/skills/abelien-algorithm/schemas/research-input.v1.json +45 -0
- package/skills/abelien-algorithm/schemas/research-result.v1.json +19 -0
- package/skills/abelien-appearance/SKILL.md +2 -1
- package/skills/abelien-appearance/domain.json +69 -0
- package/skills/abelien-appearance/references/points.md +61 -0
- package/skills/abelien-appearance/schemas/points-fallback-input.v1.json +16 -0
- package/skills/abelien-appearance/schemas/points-fallback-result.v1.json +18 -0
- package/skills/abelien-appearance/schemas/points-input.v1.json +36 -0
- package/skills/abelien-appearance/schemas/points-reading.v1.json +90 -0
- package/skills/abelien-appearance/schemas/points-result.v1.json +60 -0
- package/skills/abelien-appearance/scripts/points.mjs +163 -0
- package/skills/abelien-appearance/scripts/schemas.mjs +27 -0
- package/skills/abelien-hardware/SKILL.md +8 -0
- package/skills/abelien-hardware/actions/hardware.change-scope.json +31 -0
- package/skills/abelien-hardware/actions/hardware.finalize.json +33 -0
- package/skills/abelien-hardware/actions/hardware.guide.json +27 -0
- package/skills/abelien-hardware/actions/hardware.prepare.json +28 -0
- package/skills/abelien-hardware/actions/hardware.replace-plan.json +31 -0
- package/skills/abelien-hardware/actions/hardware.resource.json +27 -0
- package/skills/abelien-hardware/actions/hardware.search.json +97 -0
- package/skills/abelien-hardware/actions/hardware.select.json +64 -0
- package/skills/abelien-hardware/actions/hardware.selection-commit.json +68 -0
- package/skills/abelien-hardware/actions/hardware.selection-propose.json +52 -0
- package/skills/abelien-hardware/actions/hardware.selection-recall.json +47 -0
- package/skills/abelien-hardware/actions/hardware.web-extract.json +28 -0
- package/skills/abelien-hardware/actions/hardware.web-merge.json +48 -0
- package/skills/abelien-hardware/actions/hardware.web-search.json +87 -0
- package/skills/abelien-hardware/actions/hardware.wiki.json +27 -0
- package/skills/abelien-hardware/actions/hardware.workflow.json +31 -0
- package/skills/abelien-hardware/assets/pdf-drawing-prompt.txt +1 -0
- package/skills/abelien-hardware/bindings.json +302 -0
- package/skills/abelien-hardware/contract/host-tools.generated.json +15924 -0
- package/skills/abelien-hardware/contract/online-supplement-host.md +2 -0
- package/skills/abelien-hardware/contract/web-evidence-contract.md +4 -0
- package/skills/abelien-hardware/domain.json +96 -2
- package/skills/abelien-hardware/references/actions.generated.md +1487 -0
- package/skills/abelien-hardware/references/selection-evidence-v2.md +57 -0
- package/skills/abelien-hardware/schemas/change-scope-input.v1.json +29 -0
- package/skills/abelien-hardware/schemas/change-scope-result.v1.json +21 -0
- package/skills/abelien-hardware/schemas/hardware-common.v1.json +188 -0
- package/skills/abelien-hardware/schemas/hardware-selection-actions.v1.json +121 -0
- package/skills/abelien-hardware/schemas/hardware-selection.v2.json +496 -0
- package/skills/abelien-hardware/schemas/host-tools-input.v1.json +292 -0
- package/skills/abelien-hardware/schemas/proposal-input.v1.json +149 -0
- package/skills/abelien-hardware/schemas/proposal-result.v1.json +25 -0
- package/skills/abelien-hardware/schemas/replace-plan-input.v1.json +32 -0
- package/skills/abelien-hardware/schemas/replace-plan-result.v1.json +16 -0
- package/skills/abelien-hardware/schemas/search-input.v1.json +42 -0
- package/skills/abelien-hardware/schemas/search-result.v1.json +18 -0
- package/skills/abelien-hardware/schemas/select-input.v1.json +39 -0
- package/skills/abelien-hardware/schemas/select-result.v1.json +27 -0
- package/skills/abelien-hardware/schemas/web-merge-input.v1.json +52 -0
- package/skills/abelien-hardware/schemas/web-merge-result.v1.json +18 -0
- package/skills/abelien-hardware/schemas/web-search-input.v1.json +42 -0
- package/skills/abelien-hardware/schemas/web-search-result.v1.json +18 -0
- package/skills/abelien-hardware/scripts/admission.mjs +4 -2
- package/skills/abelien-hardware/scripts/provider-chain-contract.mjs +20 -7
- package/skills/abelien-hardware/scripts/selection-bom-use.mjs +47 -0
- package/skills/abelien-hardware/scripts/selection-commit.mjs +29 -0
- package/skills/abelien-hardware/scripts/selection-model.mjs +252 -0
- package/skills/abelien-hardware/scripts/selection-propose.mjs +256 -0
- package/skills/abelien-hardware/scripts/selection-recall.mjs +150 -0
- package/skills/abelien-hardware/scripts/selection-revision-store.mjs +97 -0
- package/skills/abelien-hardware/scripts/web-evidence-storage.mjs +6 -2
- package/skills/abelien-hardware/scripts/web-integrity.mjs +3 -1
- package/skills/abelien-hardware/scripts/web-merge.mjs +32 -3
- package/skills/abelien-hardware/scripts/web-pdf.mjs +135 -0
- package/skills/abelien-hardware/scripts/web-provider-chain.mjs +55 -6
- package/skills/abelien-hardware/workflows/definitions/136ef3d91d059f43e80a91338748f9d26a65be0cae6fc1ac553177f25af1faa5.json +176 -0
- package/skills/abelien-hardware/workflows/definitions/857a5b729a5164c4727d281d64b66941281173ebdde975a20f19a2a2acfbff3a.json +150 -0
- package/skills/abelien-hardware/workflows/definitions/b63cb14e876b7d274da3ecefa7e3b056a113ace7d7fb97fcd2c74b749673b6e3.json +218 -0
- package/skills/abelien-hardware/workflows/user-journey-hardware-candidates.json +1 -1
- package/skills/abelien-hardware/workflows/user-journey-hardware-replace.json +1 -1
- package/skills/abelien-hardware/workflows/user-journey-hardware.json +1 -1
- package/skills/abelien-harness/SKILL.md +6 -0
- package/skills/abelien-harness/contract/action-registry.md +76 -0
- package/skills/abelien-harness/contract/source-registry.md +5 -2
- package/skills/abelien-harness/contract/workflow-spec.md +15 -0
- package/skills/abelien-harness/contracts/README.md +109 -0
- package/skills/abelien-harness/contracts/examples/ActionDefinition/invalid-design-example-without-result-checks.json +24 -0
- package/skills/abelien-harness/contracts/examples/ActionDefinition/invalid-postcondition-without-entry.json +31 -0
- package/skills/abelien-harness/contracts/examples/ActionDefinition/invalid-transport-in-definition.json +32 -0
- package/skills/abelien-harness/contracts/examples/ActionDefinition/invalid-unknown-effect.json +33 -0
- package/skills/abelien-harness/contracts/examples/ActionDefinition/valid-async-web-search.json +45 -0
- package/skills/abelien-harness/contracts/examples/ActionDefinition/valid-implementation-dependent-build.json +32 -0
- package/skills/abelien-harness/contracts/examples/ActionDefinition/valid-local-change-scope.json +31 -0
- package/skills/abelien-harness/contracts/examples/ActionError/invalid-missing-submission-state.json +8 -0
- package/skills/abelien-harness/contracts/examples/ActionError/invalid-transient-after-submit.json +10 -0
- package/skills/abelien-harness/contracts/examples/ActionError/invalid-unknown-retried.json +9 -0
- package/skills/abelien-harness/contracts/examples/ActionError/valid-config-blocked.json +9 -0
- package/skills/abelien-harness/contracts/examples/ActionError/valid-design-conflict.json +24 -0
- package/skills/abelien-harness/contracts/examples/ActionError/valid-unknown-reconcile.json +9 -0
- package/skills/abelien-harness/contracts/examples/AppearancePoints/invalid-fallback-with-guessed-points.json +47 -0
- package/skills/abelien-harness/contracts/examples/AppearancePoints/invalid-missing-image-ref.json +94 -0
- package/skills/abelien-harness/contracts/examples/AppearancePoints/invalid-mm-without-scale.json +104 -0
- package/skills/abelien-harness/contracts/examples/AppearancePoints/invalid-ready-without-frame.json +100 -0
- package/skills/abelien-harness/contracts/examples/AppearancePoints/valid-degraded-fallback.json +27 -0
- package/skills/abelien-harness/contracts/examples/AppearancePoints/valid-ready.json +104 -0
- package/skills/abelien-harness/contracts/examples/ArtifactApplicability/invalid-current-with-reasons.json +30 -0
- package/skills/abelien-harness/contracts/examples/ArtifactApplicability/invalid-stale-without-reasons.json +15 -0
- package/skills/abelien-harness/contracts/examples/ArtifactApplicability/valid-current.json +15 -0
- package/skills/abelien-harness/contracts/examples/ArtifactApplicability/valid-stale-after-redraw.json +30 -0
- package/skills/abelien-harness/contracts/examples/ArtifactEnvelope/invalid-degraded-without-unknowns.json +17 -0
- package/skills/abelien-harness/contracts/examples/ArtifactEnvelope/invalid-design-example-string-inputs.json +19 -0
- package/skills/abelien-harness/contracts/examples/ArtifactEnvelope/invalid-fallback-on-ready.json +27 -0
- package/skills/abelien-harness/contracts/examples/ArtifactEnvelope/valid-degraded-fallback.json +27 -0
- package/skills/abelien-harness/contracts/examples/ArtifactEnvelope/valid-ready-evidence.json +17 -0
- package/skills/abelien-harness/contracts/examples/ArtifactNeed/invalid-accept-failed.json +6 -0
- package/skills/abelien-harness/contracts/examples/ArtifactNeed/invalid-empty-quality.json +4 -0
- package/skills/abelien-harness/contracts/examples/ArtifactNeed/valid-points-accept-degraded.json +7 -0
- package/skills/abelien-harness/contracts/examples/ArtifactNeed/valid-selection-ready-only.json +6 -0
- package/skills/abelien-harness/contracts/examples/ArtifactRecord/invalid-no-provenance.json +38 -0
- package/skills/abelien-harness/contracts/examples/ArtifactRecord/valid-degraded-points.json +44 -0
- package/skills/abelien-harness/contracts/examples/BomLine/invalid-placeholder-posing-as-purchased.json +24 -0
- package/skills/abelien-harness/contracts/examples/BomLine/invalid-placeholder-without-open-issues.json +20 -0
- package/skills/abelien-harness/contracts/examples/BomLine/invalid-purchased-without-identity-status.json +23 -0
- package/skills/abelien-harness/contracts/examples/BomLine/valid-designed-substitute.json +24 -0
- package/skills/abelien-harness/contracts/examples/BomLine/valid-placeholder.json +23 -0
- package/skills/abelien-harness/contracts/examples/BomLine/valid-purchased-exact.json +24 -0
- package/skills/abelien-harness/contracts/examples/BomLine/valid-purchased-series-only.json +24 -0
- package/skills/abelien-harness/contracts/examples/ConfirmationAnswer/invalid-client-operation-id.json +17 -0
- package/skills/abelien-harness/contracts/examples/ConfirmationAnswer/valid-accept.json +17 -0
- package/skills/abelien-harness/contracts/examples/ConfirmationIdentity/invalid-missing-version.json +8 -0
- package/skills/abelien-harness/contracts/examples/ConfirmationIdentity/invalid-zero-semantics-version.json +9 -0
- package/skills/abelien-harness/contracts/examples/ConfirmationIdentity/valid-selection-card.json +9 -0
- package/skills/abelien-harness/contracts/examples/ConfirmationRequest/invalid-no-options.json +20 -0
- package/skills/abelien-harness/contracts/examples/ConfirmationRequest/invalid-ui-copy-in-option.json +25 -0
- package/skills/abelien-harness/contracts/examples/ConfirmationRequest/valid-hardware-card.json +27 -0
- package/skills/abelien-harness/contracts/examples/DispatchClaim/invalid-claim-without-fence.json +44 -0
- package/skills/abelien-harness/contracts/examples/DispatchClaim/valid-claim.json +45 -0
- package/skills/abelien-harness/contracts/examples/EffectiveAction/invalid-bound-unresolved-determinism.json +78 -0
- package/skills/abelien-harness/contracts/examples/EffectiveAction/invalid-unbound-with-binding-digest.json +69 -0
- package/skills/abelien-harness/contracts/examples/EffectiveAction/valid-bound-module.json +70 -0
- package/skills/abelien-harness/contracts/examples/EffectiveAction/valid-bound-studio-tool.json +78 -0
- package/skills/abelien-harness/contracts/examples/EffectiveAction/valid-unbound.json +69 -0
- package/skills/abelien-harness/contracts/examples/EventCursor/invalid-negative.json +4 -0
- package/skills/abelien-harness/contracts/examples/EventCursor/valid-fresh-tree.json +4 -0
- package/skills/abelien-harness/contracts/examples/EventEnvelope/invalid-legacy-state-name.json +14 -0
- package/skills/abelien-harness/contracts/examples/EventEnvelope/invalid-step-event-without-step.json +26 -0
- package/skills/abelien-harness/contracts/examples/EventEnvelope/invalid-zero-sequence.json +17 -0
- package/skills/abelien-harness/contracts/examples/EventEnvelope/valid-late-receipt-history.json +18 -0
- package/skills/abelien-harness/contracts/examples/EventEnvelope/valid-operation-accepted.json +17 -0
- package/skills/abelien-harness/contracts/examples/EventEnvelope/valid-step-waiting-on-card.json +27 -0
- package/skills/abelien-harness/contracts/examples/ExecutionClaim/invalid-zero-fence.json +7 -0
- package/skills/abelien-harness/contracts/examples/ExecutionClaim/valid-after-takeover.json +7 -0
- package/skills/abelien-harness/contracts/examples/ExecutionIdentity/invalid-fence-in-identity.json +19 -0
- package/skills/abelien-harness/contracts/examples/ExecutionIdentity/invalid-missing-target-revision.json +13 -0
- package/skills/abelien-harness/contracts/examples/ExecutionIdentity/valid-rework.json +20 -0
- package/skills/abelien-harness/contracts/examples/ExecutionIdentity/valid-web-search.json +18 -0
- package/skills/abelien-harness/contracts/examples/ExecutionManifest/invalid-alias-claimed-frozen.json +77 -0
- package/skills/abelien-harness/contracts/examples/ExecutionManifest/invalid-runtime-version-alias.json +77 -0
- package/skills/abelien-harness/contracts/examples/ExecutionManifest/valid-legacy-mapping.json +59 -0
- package/skills/abelien-harness/contracts/examples/ExecutionManifest/valid-runtime-run.json +77 -0
- package/skills/abelien-harness/contracts/examples/ImplementationBinding/invalid-credential-in-entry.json +23 -0
- package/skills/abelien-harness/contracts/examples/ImplementationBinding/invalid-module-without-export.json +19 -0
- package/skills/abelien-harness/contracts/examples/ImplementationBinding/invalid-studio-tool-with-path.json +24 -0
- package/skills/abelien-harness/contracts/examples/ImplementationBinding/invalid-unresolved-determinism.json +23 -0
- package/skills/abelien-harness/contracts/examples/ImplementationBinding/valid-http.json +23 -0
- package/skills/abelien-harness/contracts/examples/ImplementationBinding/valid-module.json +20 -0
- package/skills/abelien-harness/contracts/examples/ImplementationBinding/valid-studio-tool.json +23 -0
- package/skills/abelien-harness/contracts/examples/InputDigestSubject/invalid-shorthand-input-ref.json +22 -0
- package/skills/abelien-harness/contracts/examples/InputDigestSubject/invalid-transport-field.json +32 -0
- package/skills/abelien-harness/contracts/examples/InputDigestSubject/valid-web-search.json +31 -0
- package/skills/abelien-harness/contracts/examples/OperationRecord/invalid-prepared-but-submitted.json +36 -0
- package/skills/abelien-harness/contracts/examples/OperationRecord/invalid-unknown-not-submitted.json +36 -0
- package/skills/abelien-harness/contracts/examples/OperationRecord/valid-accepted.json +36 -0
- package/skills/abelien-harness/contracts/examples/OperationRecord/valid-prepared.json +36 -0
- package/skills/abelien-harness/contracts/examples/OperationRecord/valid-unknown.json +44 -0
- package/skills/abelien-harness/contracts/examples/PortError/invalid-unknown-code.json +4 -0
- package/skills/abelien-harness/contracts/examples/PortError/valid-fence-stale.json +9 -0
- package/skills/abelien-harness/contracts/examples/Receipt/invalid-failed-without-error.json +15 -0
- package/skills/abelien-harness/contracts/examples/Receipt/invalid-missing-implementation-identity.json +19 -0
- package/skills/abelien-harness/contracts/examples/Receipt/invalid-succeeded-with-error.json +44 -0
- package/skills/abelien-harness/contracts/examples/Receipt/valid-failed.json +39 -0
- package/skills/abelien-harness/contracts/examples/Receipt/valid-succeeded.json +20 -0
- package/skills/abelien-harness/contracts/examples/Ref/invalid-digest-with-prefix.json +5 -0
- package/skills/abelien-harness/contracts/examples/Ref/invalid-shorthand-string.json +1 -0
- package/skills/abelien-harness/contracts/examples/Ref/valid-concept-image.json +5 -0
- package/skills/abelien-harness/contracts/examples/ResourceRecord/invalid-digest-without-prefix.json +19 -0
- package/skills/abelien-harness/contracts/examples/ResourceRecord/invalid-renamed-meta.json +13 -0
- package/skills/abelien-harness/contracts/examples/ResourceRecord/valid-existing-store-shape.json +19 -0
- package/skills/abelien-harness/contracts/examples/RunRecord/invalid-child-without-parent-step.json +27 -0
- package/skills/abelien-harness/contracts/examples/RunRecord/invalid-runtime-without-manifest.json +21 -0
- package/skills/abelien-harness/contracts/examples/RunRecord/valid-legacy-child.json +27 -0
- package/skills/abelien-harness/contracts/examples/RunRecord/valid-root.json +21 -0
- package/skills/abelien-harness/contracts/examples/RunSnapshot/invalid-child-run-on-model-step.json +270 -0
- package/skills/abelien-harness/contracts/examples/RunSnapshot/invalid-legacy-state-name.json +153 -0
- package/skills/abelien-harness/contracts/examples/RunSnapshot/invalid-legacy-without-registration.json +266 -0
- package/skills/abelien-harness/contracts/examples/RunSnapshot/invalid-waiting-without-reason.json +268 -0
- package/skills/abelien-harness/contracts/examples/RunSnapshot/valid-cancelled-late-result-rework.json +139 -0
- package/skills/abelien-harness/contracts/examples/RunSnapshot/valid-legacy-hardware-subflow.json +272 -0
- package/skills/abelien-harness/contracts/examples/RunSnapshot/valid-parallel-join-degraded.json +153 -0
- package/skills/abelien-harness/contracts/examples/SkeletonOccurrence/invalid-missing-fit-envelope.json +27 -0
- package/skills/abelien-harness/contracts/examples/SkeletonOccurrence/invalid-uppercase-id.json +43 -0
- package/skills/abelien-harness/contracts/examples/SkeletonOccurrence/invalid-view-transform-fields.json +44 -0
- package/skills/abelien-harness/contracts/examples/SkeletonOccurrence/valid-speaker-1.json +43 -0
- package/skills/abelien-harness/contracts/examples/SkeletonOccurrence/valid-speaker-2.json +43 -0
- package/skills/abelien-harness/contracts/examples/Slot/invalid-box-with-diameter.json +29 -0
- package/skills/abelien-harness/contracts/examples/Slot/invalid-missing-reaction-ids.json +11 -0
- package/skills/abelien-harness/contracts/examples/Slot/invalid-two-level-path.json +11 -0
- package/skills/abelien-harness/contracts/examples/Slot/invalid-zero-quantity.json +12 -0
- package/skills/abelien-harness/contracts/examples/Slot/valid-shared-power.json +12 -0
- package/skills/abelien-harness/contracts/examples/Slot/valid-speaker-with-zone.json +33 -0
- package/skills/abelien-harness/contracts/examples/StepExecutionRecord/invalid-child-run-on-cli.json +23 -0
- package/skills/abelien-harness/contracts/examples/StepExecutionRecord/invalid-waiting-without-reason.json +19 -0
- package/skills/abelien-harness/contracts/examples/StepExecutionRecord/valid-subflow.json +31 -0
- package/skills/abelien-harness/contracts/examples/StepExecutionRecord/valid-waiting-external.json +23 -0
- package/skills/abelien-harness/contracts/examples/TargetRevisionRef/invalid-extra-parent.json +6 -0
- package/skills/abelien-harness/contracts/examples/TargetRevisionRef/valid-revision-4.json +5 -0
- package/skills/abelien-harness/contracts/examples/WaitReason/invalid-configuration-with-source-error.json +12 -0
- package/skills/abelien-harness/contracts/examples/WaitReason/invalid-confirmation-without-subject.json +4 -0
- package/skills/abelien-harness/contracts/examples/WaitReason/valid-budget.json +6 -0
- package/skills/abelien-harness/contracts/examples/WaitReason/valid-configuration.json +12 -0
- package/skills/abelien-harness/contracts/examples/WaitReason/valid-confirmation.json +13 -0
- package/skills/abelien-harness/contracts/examples/WaitReason/valid-data-dependency.json +18 -0
- package/skills/abelien-harness/contracts/examples/expectations.json +294 -0
- package/skills/abelien-harness/contracts/index.d.mts +32 -0
- package/skills/abelien-harness/contracts/index.mjs +46 -0
- package/skills/abelien-harness/contracts/ports/memory.d.mts +11 -0
- package/skills/abelien-harness/contracts/ports/memory.mjs +349 -0
- package/skills/abelien-harness/contracts/ports/ports.d.ts +115 -0
- package/skills/abelien-harness/contracts/schemas/action.v1.json +330 -0
- package/skills/abelien-harness/contracts/schemas/artifact.v1.json +102 -0
- package/skills/abelien-harness/contracts/schemas/confirmation.v1.json +64 -0
- package/skills/abelien-harness/contracts/schemas/cross-domain.v1.json +241 -0
- package/skills/abelien-harness/contracts/schemas/error.v1.json +70 -0
- package/skills/abelien-harness/contracts/schemas/event.v1.json +204 -0
- package/skills/abelien-harness/contracts/schemas/execution-identity.v1.json +72 -0
- package/skills/abelien-harness/contracts/schemas/ref.v1.json +43 -0
- package/skills/abelien-harness/contracts/schemas/run-snapshot.v1.json +176 -0
- package/skills/abelien-harness/contracts/schemas/store.v1.json +209 -0
- package/skills/abelien-harness/contracts/types.d.ts +620 -0
- package/skills/abelien-harness/contracts/validate.mjs +164 -0
- package/skills/abelien-harness/runtime/README.md +103 -0
- package/skills/abelien-harness/runtime/conformance/README.md +32 -0
- package/skills/abelien-harness/runtime/conformance/artifact-store.mjs +167 -0
- package/skills/abelien-harness/runtime/conformance/execution-store.mjs +346 -0
- package/skills/abelien-harness/runtime/conformance/fixtures.mjs +56 -0
- package/skills/abelien-harness/runtime/conformance/index.mjs +71 -0
- package/skills/abelien-harness/runtime/engine.mjs +1021 -0
- package/skills/abelien-harness/runtime/errors.mjs +80 -0
- package/skills/abelien-harness/runtime/ids.mjs +25 -0
- package/skills/abelien-harness/runtime/index.mjs +15 -0
- package/skills/abelien-harness/runtime/legacy/definitions.mjs +115 -0
- package/skills/abelien-harness/runtime/legacy/external-recovery.mjs +48 -0
- package/skills/abelien-harness/runtime/legacy/workflow-store.mjs +183 -0
- package/skills/abelien-harness/runtime/ports/file/artifact-store.mjs +103 -0
- package/skills/abelien-harness/runtime/ports/file/common.mjs +100 -0
- package/skills/abelien-harness/runtime/ports/file/execution-store.mjs +248 -0
- package/skills/abelien-harness/runtime/ports/file/index.mjs +23 -0
- package/skills/abelien-harness/runtime/ports/file/resource-store.mjs +51 -0
- package/skills/abelien-harness/runtime/snapshot.mjs +96 -0
- package/skills/abelien-harness/runtime/testing/index.mjs +123 -0
- package/skills/abelien-harness/runtime/testing/scenarios.mjs +343 -0
- package/skills/abelien-harness/runtime/workflow/flows.mjs +38 -0
- package/skills/abelien-harness/runtime/workflow/httl.mjs +77 -0
- package/skills/abelien-harness/runtime/workflow/index.mjs +168 -0
- package/skills/abelien-harness/runtime/workflow/legacy-flow.mjs +156 -0
- package/skills/abelien-harness/runtime/workflow/view.mjs +66 -0
- package/skills/abelien-harness/scripts/ab.mjs +45 -589
- package/skills/abelien-harness/scripts/action-cli.mjs +54 -0
- package/skills/abelien-harness/scripts/action-docs.mjs +293 -0
- package/skills/abelien-harness/scripts/action-registry.mjs +423 -0
- package/skills/abelien-harness/scripts/receipt.mjs +5 -1
- package/skills/abelien-harness/scripts/store.mjs +212 -0
- package/skills/abelien-harness/scripts/studio.mjs +1 -1
- package/skills/abelien-harness/scripts/template.mjs +22 -0
- package/skills/abelien-harness/scripts/web/pdf-reader.mjs +105 -0
- package/skills/abelien-harness/scripts/web/vision.mjs +85 -0
- package/skills/abelien-reference/SKILL.md +1 -1
- package/skills/abelien-reference/actions/reference.finalize.json +48 -0
- package/skills/abelien-reference/actions/reference.page.json +28 -0
- package/skills/abelien-reference/actions/reference.research.json +68 -0
- package/skills/abelien-reference/bindings.json +78 -0
- package/skills/abelien-reference/contract/host-tools.generated.json +2386 -0
- package/skills/abelien-reference/domain.json +7 -2
- package/skills/abelien-reference/references/actions.generated.md +295 -0
- package/skills/abelien-reference/references/research-contract.md +4 -34
- package/skills/abelien-reference/schemas/finalize-input.v1.json +16 -0
- package/skills/abelien-reference/schemas/host-tools.v1.json +31 -0
- package/skills/abelien-reference/schemas/research-input.v1.json +142 -0
- package/skills/abelien-structure/SKILL.md +5 -0
- package/skills/abelien-structure/domain.json +95 -0
- package/skills/abelien-structure/references/skeleton.md +54 -0
- package/skills/abelien-structure/references/structure-reasonableness.md +3 -3
- package/skills/abelien-structure/schemas/layout-check-input.v1.json +13 -0
- package/skills/abelien-structure/schemas/layout-check-result.v1.json +57 -0
- package/skills/abelien-structure/schemas/layout-proposal.v1.json +61 -0
- package/skills/abelien-structure/schemas/layout-request-input.v1.json +79 -0
- package/skills/abelien-structure/schemas/layout-request.v1.json +105 -0
- package/skills/abelien-structure/schemas/skeleton.v1.json +183 -0
- package/skills/abelien-structure/schemas/swap-candidates-input.v1.json +50 -0
- package/skills/abelien-structure/schemas/swap-candidates-result.v1.json +46 -0
- package/skills/abelien-structure/scripts/geometry.mjs +141 -0
- package/skills/abelien-structure/scripts/layout.mjs +518 -0
- package/skills/abelien-structure/scripts/schemas.mjs +28 -0
- package/skills/abelien-structure/scripts/swap.mjs +79 -0
- package/skills/abelien-workspace/SKILL.md +2 -1
- package/skills/abelien-workspace/actions/cad.build.json +29 -0
- package/skills/abelien-workspace/actions/component.search.json +27 -0
- package/skills/abelien-workspace/actions/image.generate.json +29 -0
- package/skills/abelien-workspace/actions/image.import.json +30 -0
- package/skills/abelien-workspace/actions/question.card.json +26 -0
- package/skills/abelien-workspace/actions/studio.prepare.json +28 -0
- package/skills/abelien-workspace/actions/visual.review.json +31 -0
- package/skills/abelien-workspace/actions/workspace.journey-next.json +30 -0
- package/skills/abelien-workspace/actions/workspace.lanes-next.json +30 -0
- package/skills/abelien-workspace/assets/journey-stage-plan.json +20 -20
- package/skills/abelien-workspace/bindings.json +187 -0
- package/skills/abelien-workspace/contract/host-tools.generated.json +901 -0
- package/skills/abelien-workspace/domain.json +17 -2
- package/skills/abelien-workspace/references/actions.generated.md +361 -0
- package/skills/abelien-workspace/references/journey-stage-plan.md +14 -14
- package/skills/abelien-workspace/schemas/host-tools.v1.json +173 -0
- package/skills/abelien-workspace/schemas/journey-next-input.v1.json +55 -0
- package/skills/abelien-workspace/schemas/journey-next-result.v1.json +100 -0
- package/skills/abelien-workspace/schemas/lanes-next-input.v1.json +37 -0
- package/skills/abelien-workspace/schemas/lanes-next-result.v1.json +54 -0
- package/skills/abelien-workspace/schemas/plan-common.v1.json +34 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// `ab action` 命令面与 `ab help <action_id>`(P2-05 卡 A)。ab.mjs 只在 COMMAND_HELP 与分发处接线,
|
|
2
|
+
// 域包发现由 ab.mjs 传入,本模块不反向 import ab.mjs。输出遵守单行 JSON 契约:list → data.actions,
|
|
3
|
+
// describe → data.action,manifest → data.manifest + data.execution_manifest_digest。
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { loadActionRegistry, buildManifest } from "./action-registry.mjs";
|
|
7
|
+
import { renderActionHelp } from "./action-docs.mjs";
|
|
8
|
+
|
|
9
|
+
const ACTION_ID = /^[a-z][a-z0-9-]*(\.[a-z][a-z0-9-]*)+$/;
|
|
10
|
+
const usage = message => Object.assign(new Error(message), { code: "USAGE" });
|
|
11
|
+
|
|
12
|
+
function audienceOf(flags) {
|
|
13
|
+
if (flags.audience === undefined) return "agent";
|
|
14
|
+
if (flags.audience === "host") return "host";
|
|
15
|
+
throw usage("--audience only accepts host");
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** 部署 profile:--bindings 优先,其次 AB_BINDINGS_FILE;都没有时只用各包缺省 bindings.json。 */
|
|
19
|
+
function profileFile(flags, env) {
|
|
20
|
+
const value = flags.bindings ?? env?.AB_BINDINGS_FILE;
|
|
21
|
+
if (value === undefined || value === "") return undefined;
|
|
22
|
+
if (typeof value !== "string" || !value) throw usage("--bindings requires a path");
|
|
23
|
+
const file = path.resolve(value);
|
|
24
|
+
if (!fs.existsSync(file) || !fs.statSync(file).isFile()) throw usage(`bindings profile not found: ${value}`);
|
|
25
|
+
return file;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function actionCmd(pos, flags, deps) {
|
|
29
|
+
const sub = pos[0];
|
|
30
|
+
const registry = () => loadActionRegistry({ domains: deps.domains(), profileFile: profileFile(flags, deps.env) });
|
|
31
|
+
if (sub === "list") {
|
|
32
|
+
const audience = audienceOf(flags);
|
|
33
|
+
return { actions: registry().list(audience) };
|
|
34
|
+
}
|
|
35
|
+
if (sub === "describe") {
|
|
36
|
+
const id = pos[1];
|
|
37
|
+
if (!id) throw usage("missing required argument: <action_id>");
|
|
38
|
+
if (!ACTION_ID.test(id)) throw usage(`not an action id: ${id}`);
|
|
39
|
+
return { action: registry().describe(id, audienceOf(flags)) };
|
|
40
|
+
}
|
|
41
|
+
if (sub === "manifest") {
|
|
42
|
+
return buildManifest(registry(), { domains: deps.domains(), skillsRoot: deps.skillsRoot, version: deps.version });
|
|
43
|
+
}
|
|
44
|
+
throw usage(`unknown action subcommand: ${sub ?? "(none)"}`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** 主题像动作名时从注册表生成人读详解;不是动作名或注册表里没有时返回 null,交回原来的用法错误。 */
|
|
48
|
+
export function actionHelpText(topic, deps) {
|
|
49
|
+
if (!ACTION_ID.test(topic)) return null;
|
|
50
|
+
const registry = loadActionRegistry({ domains: deps.domains(), profileFile: profileFile({}, deps.env) });
|
|
51
|
+
const hit = registry.actions.get(topic);
|
|
52
|
+
if (!hit) return null;
|
|
53
|
+
return renderActionHelp(hit.effective, registry.schema);
|
|
54
|
+
}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
// 动作手册与宿主工具 Schema 的渲染(P2-05 卡 A):同一份有效动作生成三种视图——
|
|
2
|
+
// 每个包的 references/actions.generated.md(中文参数与错误手册)、contract/host-tools.generated.json(宿主工具 Schema)
|
|
3
|
+
// 与 `ab help <action_id>` 的人读详解。手册只读动作定义与 Schema,不读绑定:换绑定(module ↔ http)不改手册。
|
|
4
|
+
// 手册用带标记的 Schema(registry.schema(id, side, {mark:true})):具名定义($defs)只在「共用类型」里写一次。
|
|
5
|
+
import { REF_MARK } from "./action-registry.mjs";
|
|
6
|
+
|
|
7
|
+
export const MANUAL_FILE = "references/actions.generated.md";
|
|
8
|
+
export const HOST_TOOLS_FILE = "contract/host-tools.generated.json";
|
|
9
|
+
export const HOST_TOOLS_SCHEMA = "abelien.host-tools.v1";
|
|
10
|
+
|
|
11
|
+
const EFFECTS = {
|
|
12
|
+
"data.read": "读受控数据,含已存产物",
|
|
13
|
+
"network.read": "访问外网",
|
|
14
|
+
"artifact.write": "写不可变产物",
|
|
15
|
+
"external.submit": "向外部服务提交",
|
|
16
|
+
"budget.consume": "消耗额度",
|
|
17
|
+
"product.commit": "提交业务修订",
|
|
18
|
+
};
|
|
19
|
+
const DETERMINISM = {
|
|
20
|
+
deterministic: "确定:冻结输入下结果相同",
|
|
21
|
+
nondeterministic: "不确定:同样输入可能得到不同结果",
|
|
22
|
+
implementation_dependent: "取决于实现,由绑定声明",
|
|
23
|
+
};
|
|
24
|
+
const CATEGORY = {
|
|
25
|
+
source: "输入错误",
|
|
26
|
+
design: "设计问题",
|
|
27
|
+
transient: "暂时故障",
|
|
28
|
+
config: "配置或授权缺失",
|
|
29
|
+
integrity: "完整性不一致",
|
|
30
|
+
terminal: "不可恢复",
|
|
31
|
+
unknown: "结果未知",
|
|
32
|
+
};
|
|
33
|
+
const DEFAULT_RECOVERY = { source: "correct_input", design: "revise_plan", transient: "retry_same_operation", config: "await_configuration",
|
|
34
|
+
integrity: "quarantine", terminal: "fail_or_fallback", unknown: "reconcile" };
|
|
35
|
+
const RECOVERY = {
|
|
36
|
+
correct_input: "修正输入后重新调用",
|
|
37
|
+
revise_plan: "带证据回到规划修正",
|
|
38
|
+
retry_same_operation: "按原操作身份有界重试",
|
|
39
|
+
await_configuration: "停下等待配置或授权",
|
|
40
|
+
quarantine: "隔离,停止自动推进",
|
|
41
|
+
fail_or_fallback: "失败收尾或走声明的替代分支",
|
|
42
|
+
reconcile: "对账原操作,不重发",
|
|
43
|
+
};
|
|
44
|
+
const CHECKS = { output_schema: "输出 Schema", ref_integrity: "引用完整性", postcondition: "领域后置条件" };
|
|
45
|
+
|
|
46
|
+
const cell = value => String(value ?? "").replace(/\r?\n+/g, " ").replace(/\|/g, "\\|").trim();
|
|
47
|
+
const code = value => `\`${String(value).replace(/`/g, "'")}\``;
|
|
48
|
+
const isObject = value => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
49
|
+
const literal = value => code(JSON.stringify(value));
|
|
50
|
+
const sentence = text => String(text).trim().replace(/[。;;.\s]+$/u, "");
|
|
51
|
+
|
|
52
|
+
/** 共用类型的收集器:同名不同定义时加序号区分。 */
|
|
53
|
+
function typeCollector() {
|
|
54
|
+
const byKey = new Map(), names = new Map();
|
|
55
|
+
return {
|
|
56
|
+
/** 记下一个具名节点,返回它在手册里的名字;不是具名节点返回 null。 */
|
|
57
|
+
name(schema) {
|
|
58
|
+
const mark = isObject(schema) ? schema[REF_MARK] : null;
|
|
59
|
+
if (!mark) return null;
|
|
60
|
+
if (byKey.has(mark.key)) return byKey.get(mark.key).name;
|
|
61
|
+
let name = mark.name;
|
|
62
|
+
for (let i = 2; names.has(name); i++) name = `${mark.name}${i}`;
|
|
63
|
+
byKey.set(mark.key, { name, definition: mark.definition });
|
|
64
|
+
names.set(name, mark.key);
|
|
65
|
+
return name;
|
|
66
|
+
},
|
|
67
|
+
entries: () => [...byKey.values()],
|
|
68
|
+
size: () => byKey.size,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** 展示用:把 allOf 的各支合并成一个对象 Schema(属性合并、required 取并集),其余原样;各支的具名标记不外溢。 */
|
|
73
|
+
export function flatten(schema) {
|
|
74
|
+
if (!isObject(schema) || !Array.isArray(schema.allOf)) return schema;
|
|
75
|
+
const { allOf, ...rest } = schema;
|
|
76
|
+
const out = { ...rest };
|
|
77
|
+
for (const part of allOf.map(flatten)) {
|
|
78
|
+
if (!isObject(part)) continue;
|
|
79
|
+
for (const [key, value] of Object.entries(part)) {
|
|
80
|
+
if (key === REF_MARK) continue;
|
|
81
|
+
if (key === "properties") {
|
|
82
|
+
const merged = { ...(out.properties ?? {}) };
|
|
83
|
+
for (const [prop, sub] of Object.entries(value)) merged[prop] = merged[prop] && isObject(sub) ? flatten({ allOf: [merged[prop], sub] }) : sub;
|
|
84
|
+
out.properties = merged;
|
|
85
|
+
} else if (key === "required") out.required = [...new Set([...(out.required ?? []), ...value])];
|
|
86
|
+
else if (key === "description") out.description ??= value;
|
|
87
|
+
else if (!(key in out)) out[key] = value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function cachePolicy(policy) {
|
|
94
|
+
const mode = { disabled: "不缓存", disabled_by_default: "缺省不缓存,部署或请求显式打开才复用", enabled: "符合条件即复用" }[policy.mode];
|
|
95
|
+
const parts = [mode, policy.allow_bypass ? "可要求重新计算" : "不能要求绕过缓存"];
|
|
96
|
+
if (policy.isolation) parts.push(policy.isolation === "work" ? "按作品隔离" : "按租户隔离");
|
|
97
|
+
return parts.join(";");
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function typeLabel(schema, types) {
|
|
101
|
+
const named = types?.name(schema);
|
|
102
|
+
if (named) return named;
|
|
103
|
+
schema = flatten(schema);
|
|
104
|
+
if (!isObject(schema)) return schema === true ? "任意" : "不允许";
|
|
105
|
+
if (schema.const !== undefined) return schema.const === null ? "null" : typeof schema.const;
|
|
106
|
+
const variants = schema.oneOf ?? schema.anyOf;
|
|
107
|
+
if (Array.isArray(variants)) return [...new Set(variants.map(variant => typeLabel(variant, types)))].join(" / ");
|
|
108
|
+
const list = [].concat(schema.type ?? (schema.enum ? [...new Set(schema.enum.map(v => v === null ? "null" : typeof v))] : []));
|
|
109
|
+
if (!list.length) return schema.properties ? "object" : "任意";
|
|
110
|
+
return list.map(type => type === "array" && isObject(schema.items) ? `array<${typeLabel(schema.items, types)}>` : type).join(" / ");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function constraints(schema) {
|
|
114
|
+
schema = flatten(schema);
|
|
115
|
+
if (!isObject(schema)) return [];
|
|
116
|
+
const out = [];
|
|
117
|
+
if (schema.const !== undefined) out.push(`固定 ${literal(schema.const)}`);
|
|
118
|
+
if (Array.isArray(schema.enum)) out.push(`取值 ${schema.enum.map(literal).join(" / ")}`);
|
|
119
|
+
const range = (min, max, unit) => min !== undefined && max !== undefined ? (min === max ? `${min}${unit}` : `${min}–${max}${unit}`)
|
|
120
|
+
: min !== undefined ? `至少 ${min}${unit}` : max !== undefined ? `至多 ${max}${unit}` : null;
|
|
121
|
+
if (schema.minLength === 1 && schema.maxLength === undefined) out.push("非空");
|
|
122
|
+
else { const length = range(schema.minLength, schema.maxLength, " 字符"); if (length) out.push(`长度 ${length}`); }
|
|
123
|
+
const items = range(schema.minItems, schema.maxItems, " 项");
|
|
124
|
+
if (items) out.push(items);
|
|
125
|
+
const number = range(schema.minimum ?? (schema.exclusiveMinimum !== undefined ? `>${schema.exclusiveMinimum}` : undefined), schema.maximum, "");
|
|
126
|
+
if (number) out.push(`范围 ${number}`);
|
|
127
|
+
if (schema.uniqueItems) out.push("不重复");
|
|
128
|
+
if (schema.pattern) out.push(`格式 ${code(schema.pattern)}`);
|
|
129
|
+
if (schema.format) out.push(`格式 ${schema.format}`);
|
|
130
|
+
if (schema.default !== undefined) out.push(`缺省 ${literal(schema.default)}`);
|
|
131
|
+
if (isObject(schema.items) && !schema.items[REF_MARK]) {
|
|
132
|
+
const inner = constraints(schema.items).filter(text => !text.startsWith("缺省"));
|
|
133
|
+
if (inner.length && !flatten(schema.items).properties) out.push(`每项:${inner.join(",")}`);
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const note = (schema, named) => [isObject(schema) && schema.description ? sentence(schema.description) : null,
|
|
139
|
+
...(named ? [] : constraints(schema))].filter(Boolean).join(";");
|
|
140
|
+
|
|
141
|
+
/** 把对象 Schema 摊平成参数行:嵌套对象与对象数组按 `a.b`、`a[].b` 展开(最多 depth 层);具名类型不展开。 */
|
|
142
|
+
export function parameterRows(schema, { prefix = "", depth = 3, types = null } = {}) {
|
|
143
|
+
schema = flatten(schema);
|
|
144
|
+
const rows = [];
|
|
145
|
+
if (!isObject(schema) || !isObject(schema.properties)) return rows;
|
|
146
|
+
const required = new Set(schema.required ?? []);
|
|
147
|
+
for (const [key, prop] of Object.entries(schema.properties)) {
|
|
148
|
+
const name = `${prefix}${key}`;
|
|
149
|
+
const named = Boolean(types?.name(prop)) || (isObject(prop) && Boolean(types?.name(prop.items)));
|
|
150
|
+
rows.push({ name, type: typeLabel(prop, types), required: required.has(key), note: note(prop, named && Boolean(types?.name(prop))) });
|
|
151
|
+
if (named || depth <= 1) continue;
|
|
152
|
+
const shown = flatten(prop);
|
|
153
|
+
if (!isObject(shown)) continue;
|
|
154
|
+
const items = flatten(shown.items);
|
|
155
|
+
const object = shown.properties ? shown : isObject(items) && items.properties ? items : null;
|
|
156
|
+
if (object) rows.push(...parameterRows(object, { prefix: `${name}${object === shown ? "." : "[]."}`, depth: depth - 1, types }));
|
|
157
|
+
}
|
|
158
|
+
return rows;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function parameterTable(schema, { depth = 3, empty = "无参数。", types = null } = {}) {
|
|
162
|
+
schema = flatten(schema);
|
|
163
|
+
const rows = parameterRows(schema, { depth, types });
|
|
164
|
+
if (!rows.length) return [isObject(schema) && schema.description ? sentence(schema.description) + "。" : empty];
|
|
165
|
+
const lines = ["| 参数 | 类型 | 必填 | 说明 |", "| --- | --- | --- | --- |"];
|
|
166
|
+
for (const row of rows) lines.push(`| ${code(row.name)} | ${cell(row.type)} | ${row.required ? "是" : "否"} | ${cell(row.note) || "—"} |`);
|
|
167
|
+
if (schema.additionalProperties === false) lines.push("", "不接受表外的字段。");
|
|
168
|
+
return lines;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function inputSection(schema, types) {
|
|
172
|
+
schema = flatten(schema);
|
|
173
|
+
const lines = [];
|
|
174
|
+
if (schema.description) lines.push(sentence(schema.description) + "。", "");
|
|
175
|
+
if (Array.isArray(schema.oneOf)) {
|
|
176
|
+
lines.push("入参是以下几种形态之一:");
|
|
177
|
+
schema.oneOf.forEach((branch, index) => {
|
|
178
|
+
const fixed = Object.entries(branch.properties ?? {}).filter(([, prop]) => prop?.const !== undefined).map(([key, prop]) => `${key} = ${literal(prop.const)}`);
|
|
179
|
+
lines.push("", `形态 ${index + 1}${fixed.length ? `(${fixed.join(",")})` : ""}:${branch.description ? sentence(branch.description) : ""}`, "",
|
|
180
|
+
...parameterTable({ ...branch, description: undefined }, { types }));
|
|
181
|
+
});
|
|
182
|
+
return lines;
|
|
183
|
+
}
|
|
184
|
+
return [...lines, ...parameterTable({ ...schema, description: undefined }, { types })];
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function errorTable(definition) {
|
|
188
|
+
const entries = Object.entries(definition.errors);
|
|
189
|
+
if (!entries.length) return ["没有声明本动作专属的错误码。"];
|
|
190
|
+
const lines = ["| 错误码 | 类别 | 处理 | 说明 |", "| --- | --- | --- | --- |"];
|
|
191
|
+
for (const [errorCode, decl] of entries.sort(([a], [b]) => a.localeCompare(b))) {
|
|
192
|
+
const category = typeof decl === "string" ? decl : decl.category;
|
|
193
|
+
const recovery = (typeof decl === "object" && decl.recovery) || DEFAULT_RECOVERY[category];
|
|
194
|
+
lines.push(`| ${code(errorCode)} | ${category}(${CATEGORY[category]}) | ${RECOVERY[recovery]} | ${cell(typeof decl === "object" ? decl.description : "") || "—"} |`);
|
|
195
|
+
}
|
|
196
|
+
return lines;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** 单个动作的手册段落(定义与 Schema,不含绑定)。level 是标题级别;types 收集用到的共用类型。 */
|
|
200
|
+
export function renderActionSection(action, inputSchema, outputSchema, { level = 2, types = typeCollector() } = {}) {
|
|
201
|
+
const definition = action.definition;
|
|
202
|
+
const h = "#".repeat(level);
|
|
203
|
+
const effects = definition.effects.length ? definition.effects.map(effect => `${code(effect)} ${EFFECTS[effect]}`).join(";") : "无(纯计算,不读写资源、不联网)";
|
|
204
|
+
const checks = definition.result_checks.map(check => check.kind === "postcondition" ? `${CHECKS[check.kind]} ${code(`${check.entry.path}#${check.entry.export}`)}` : CHECKS[check.kind]).join("、");
|
|
205
|
+
const lines = [
|
|
206
|
+
`${h} ${definition.action_id}`, "",
|
|
207
|
+
definition.description ? sentence(definition.description) + "。" : "(未写说明)", "",
|
|
208
|
+
"| 项 | 内容 |", "| --- | --- |",
|
|
209
|
+
`| 契约版本 | ${definition.contract_version} |`,
|
|
210
|
+
`| 受众 | ${(definition.audience ?? "agent") === "host" ? "host(只供宿主进程)" : "agent"} |`,
|
|
211
|
+
`| 效果 | ${cell(effects)} |`,
|
|
212
|
+
`| 确定性 | ${DETERMINISM[definition.determinism]} |`,
|
|
213
|
+
`| 缓存 | ${cell(cachePolicy(definition.cache_policy))} |`,
|
|
214
|
+
`| 完成 | 结果通过校验才算完成:${cell(checks)} |`,
|
|
215
|
+
"",
|
|
216
|
+
`${h}# 输入`, "", ...inputSection(inputSchema, types), "",
|
|
217
|
+
`${h}# 输出`, "", ...parameterTable(outputSchema, { depth: 1, empty: "无字段说明。", types }), "",
|
|
218
|
+
`${h}# 错误`, "", ...errorTable(definition), "",
|
|
219
|
+
];
|
|
220
|
+
return lines.join("\n");
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** 共用类型:每个具名定义写一次;展开时遇到新的具名定义继续追加,直到收齐。 */
|
|
224
|
+
function sharedTypes(types, level) {
|
|
225
|
+
const h = "#".repeat(level);
|
|
226
|
+
const lines = [];
|
|
227
|
+
for (let i = 0; i < types.size(); i++) {
|
|
228
|
+
const { name, definition } = types.entries()[i];
|
|
229
|
+
const flat = flatten(definition);
|
|
230
|
+
const isRecord = isObject(flat) && (flat.properties || flat.allOf);
|
|
231
|
+
lines.push(`${h} ${name}`, "");
|
|
232
|
+
if (isRecord) {
|
|
233
|
+
if (flat.description) lines.push(sentence(flat.description) + "。", "");
|
|
234
|
+
lines.push(...parameterTable({ ...flat, description: undefined }, { types, empty: "任意对象。" }), "");
|
|
235
|
+
} else {
|
|
236
|
+
const facts = [sentence(flat.description ?? ""), ...constraints(flat)].filter(Boolean);
|
|
237
|
+
lines.push(`${typeLabel({ ...flat, [REF_MARK]: undefined }, types)}${facts.map(text => `;${text}`).join("")}。`, "");
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return lines;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** 一个包的中文参数与错误手册。actions 为该包的有效动作(已按 action_id 排序),schemaOf 返回带标记的 Schema。 */
|
|
244
|
+
export function renderManual(pkg, actions, schemaOf) {
|
|
245
|
+
const types = typeCollector();
|
|
246
|
+
const lines = [
|
|
247
|
+
"<!-- 生成物:由 tools/render-actions.mjs 从本包 actions/ 与 schemas/ 生成,勿手改。 -->",
|
|
248
|
+
`# ${pkg} 动作参数与错误手册`, "",
|
|
249
|
+
"本文由本包的动作定义与 Schema 生成,参数、取值范围与错误码以此为准;何时使用、如何判断见 SKILL.md 与其他参考文档。类型名(如 `Slot`)的字段见文末「共用类型」。", "",
|
|
250
|
+
"| 动作 | 说明 |", "| --- | --- |",
|
|
251
|
+
...actions.map(action => `| ${code(action.action_id)} | ${cell(action.definition.description ? sentence(action.definition.description) : "") || "—"} |`), "",
|
|
252
|
+
];
|
|
253
|
+
for (const action of actions) lines.push(renderActionSection(action, schemaOf(action.action_id, "input", { mark: true }), schemaOf(action.action_id, "output", { mark: true }), { types }));
|
|
254
|
+
if (types.size()) lines.push("## 共用类型", "", ...sharedTypes(types, 3));
|
|
255
|
+
return lines.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** `ab help <action_id>` 的人读详解:手册段落、用到的共用类型,以及当前绑定与绑定追加的效果。 */
|
|
259
|
+
export function renderActionHelp(action, schemaOf) {
|
|
260
|
+
const types = typeCollector();
|
|
261
|
+
const binding = action.binding;
|
|
262
|
+
const where = !binding ? "未绑定(调用时按配置缺失停下)"
|
|
263
|
+
: binding.transport === "module" ? `module ${binding.entry.path}#${binding.entry.export}`
|
|
264
|
+
: binding.transport === "http" ? `http ${binding.entry.endpoint_env}${binding.entry.path ?? ""}`
|
|
265
|
+
: binding.transport === "subflow" ? `subflow ${binding.entry.workflow}` : `studio_tool ${binding.entry.tool}`;
|
|
266
|
+
const extra = binding ? binding.effects.filter(effect => !action.definition.effects.includes(effect)) : [];
|
|
267
|
+
const section = renderActionSection(action, schemaOf(action.action_id, "input", { mark: true }), schemaOf(action.action_id, "output", { mark: true }), { level: 1, types });
|
|
268
|
+
return [
|
|
269
|
+
"", section.trimEnd(), "",
|
|
270
|
+
...(types.size() ? ["## 共用类型", "", ...sharedTypes(types, 3)] : []),
|
|
271
|
+
`当前绑定:${where}${binding ? `(${binding.implementation_id})` : ""}`,
|
|
272
|
+
...(extra.length ? [`绑定追加的效果:${extra.join("、")}`] : []),
|
|
273
|
+
`数据版:ab action describe ${action.action_id}`, "",
|
|
274
|
+
].join("\n").replace(/\n{3,}/g, "\n\n");
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/** 一个包的宿主工具 Schema:各动作的自包含输入输出 Schema,以及宿主工具到动作的投影。 */
|
|
278
|
+
export function renderHostTools(pkg, actions, schemaOf, tools) {
|
|
279
|
+
return {
|
|
280
|
+
schema: HOST_TOOLS_SCHEMA,
|
|
281
|
+
package: pkg,
|
|
282
|
+
actions: actions.map(action => ({
|
|
283
|
+
action_id: action.action_id,
|
|
284
|
+
contract_version: action.contract_version,
|
|
285
|
+
definition_digest: action.definition_digest,
|
|
286
|
+
audience: action.definition.audience ?? "agent",
|
|
287
|
+
description: action.definition.description ?? null,
|
|
288
|
+
input_schema: schemaOf(action.action_id, "input"),
|
|
289
|
+
output_schema: schemaOf(action.action_id, "output"),
|
|
290
|
+
})),
|
|
291
|
+
tools: tools.map(({ package: _package, ...tool }) => tool).sort((a, b) => a.tool.localeCompare(b.tool)),
|
|
292
|
+
};
|
|
293
|
+
}
|