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.
Files changed (338) hide show
  1. package/.env.example +9 -0
  2. package/README.md +2 -2
  3. package/package.json +2 -1
  4. package/skills/abelien-algorithm/SKILL.md +1 -0
  5. package/skills/abelien-algorithm/actions/algorithm.candidates.json +43 -0
  6. package/skills/abelien-algorithm/actions/algorithm.finalize.json +38 -0
  7. package/skills/abelien-algorithm/actions/algorithm.lane-state.json +38 -0
  8. package/skills/abelien-algorithm/actions/algorithm.research.json +70 -0
  9. package/skills/abelien-algorithm/bindings.json +58 -0
  10. package/skills/abelien-algorithm/contract/host-tools.generated.json +1235 -0
  11. package/skills/abelien-algorithm/domain.json +8 -2
  12. package/skills/abelien-algorithm/references/actions.generated.md +289 -0
  13. package/skills/abelien-algorithm/schemas/algorithm-common.v1.json +22 -0
  14. package/skills/abelien-algorithm/schemas/candidates-input.v1.json +15 -0
  15. package/skills/abelien-algorithm/schemas/candidates-result.v1.json +17 -0
  16. package/skills/abelien-algorithm/schemas/finalize-input.v1.json +17 -0
  17. package/skills/abelien-algorithm/schemas/finalize-result.v1.json +28 -0
  18. package/skills/abelien-algorithm/schemas/lane-state-input.v1.json +14 -0
  19. package/skills/abelien-algorithm/schemas/lane-state-result.v1.json +14 -0
  20. package/skills/abelien-algorithm/schemas/research-input.v1.json +45 -0
  21. package/skills/abelien-algorithm/schemas/research-result.v1.json +19 -0
  22. package/skills/abelien-appearance/SKILL.md +2 -1
  23. package/skills/abelien-appearance/domain.json +69 -0
  24. package/skills/abelien-appearance/references/points.md +61 -0
  25. package/skills/abelien-appearance/schemas/points-fallback-input.v1.json +16 -0
  26. package/skills/abelien-appearance/schemas/points-fallback-result.v1.json +18 -0
  27. package/skills/abelien-appearance/schemas/points-input.v1.json +36 -0
  28. package/skills/abelien-appearance/schemas/points-reading.v1.json +90 -0
  29. package/skills/abelien-appearance/schemas/points-result.v1.json +60 -0
  30. package/skills/abelien-appearance/scripts/points.mjs +163 -0
  31. package/skills/abelien-appearance/scripts/schemas.mjs +27 -0
  32. package/skills/abelien-hardware/SKILL.md +8 -0
  33. package/skills/abelien-hardware/actions/hardware.change-scope.json +31 -0
  34. package/skills/abelien-hardware/actions/hardware.finalize.json +33 -0
  35. package/skills/abelien-hardware/actions/hardware.guide.json +27 -0
  36. package/skills/abelien-hardware/actions/hardware.prepare.json +28 -0
  37. package/skills/abelien-hardware/actions/hardware.replace-plan.json +31 -0
  38. package/skills/abelien-hardware/actions/hardware.resource.json +27 -0
  39. package/skills/abelien-hardware/actions/hardware.search.json +97 -0
  40. package/skills/abelien-hardware/actions/hardware.select.json +64 -0
  41. package/skills/abelien-hardware/actions/hardware.selection-commit.json +68 -0
  42. package/skills/abelien-hardware/actions/hardware.selection-propose.json +52 -0
  43. package/skills/abelien-hardware/actions/hardware.selection-recall.json +47 -0
  44. package/skills/abelien-hardware/actions/hardware.web-extract.json +28 -0
  45. package/skills/abelien-hardware/actions/hardware.web-merge.json +48 -0
  46. package/skills/abelien-hardware/actions/hardware.web-search.json +87 -0
  47. package/skills/abelien-hardware/actions/hardware.wiki.json +27 -0
  48. package/skills/abelien-hardware/actions/hardware.workflow.json +31 -0
  49. package/skills/abelien-hardware/assets/pdf-drawing-prompt.txt +1 -0
  50. package/skills/abelien-hardware/bindings.json +302 -0
  51. package/skills/abelien-hardware/contract/host-tools.generated.json +15924 -0
  52. package/skills/abelien-hardware/contract/online-supplement-host.md +2 -0
  53. package/skills/abelien-hardware/contract/web-evidence-contract.md +4 -0
  54. package/skills/abelien-hardware/domain.json +96 -2
  55. package/skills/abelien-hardware/references/actions.generated.md +1487 -0
  56. package/skills/abelien-hardware/references/selection-evidence-v2.md +57 -0
  57. package/skills/abelien-hardware/schemas/change-scope-input.v1.json +29 -0
  58. package/skills/abelien-hardware/schemas/change-scope-result.v1.json +21 -0
  59. package/skills/abelien-hardware/schemas/hardware-common.v1.json +188 -0
  60. package/skills/abelien-hardware/schemas/hardware-selection-actions.v1.json +121 -0
  61. package/skills/abelien-hardware/schemas/hardware-selection.v2.json +496 -0
  62. package/skills/abelien-hardware/schemas/host-tools-input.v1.json +292 -0
  63. package/skills/abelien-hardware/schemas/proposal-input.v1.json +149 -0
  64. package/skills/abelien-hardware/schemas/proposal-result.v1.json +25 -0
  65. package/skills/abelien-hardware/schemas/replace-plan-input.v1.json +32 -0
  66. package/skills/abelien-hardware/schemas/replace-plan-result.v1.json +16 -0
  67. package/skills/abelien-hardware/schemas/search-input.v1.json +42 -0
  68. package/skills/abelien-hardware/schemas/search-result.v1.json +18 -0
  69. package/skills/abelien-hardware/schemas/select-input.v1.json +39 -0
  70. package/skills/abelien-hardware/schemas/select-result.v1.json +27 -0
  71. package/skills/abelien-hardware/schemas/web-merge-input.v1.json +52 -0
  72. package/skills/abelien-hardware/schemas/web-merge-result.v1.json +18 -0
  73. package/skills/abelien-hardware/schemas/web-search-input.v1.json +42 -0
  74. package/skills/abelien-hardware/schemas/web-search-result.v1.json +18 -0
  75. package/skills/abelien-hardware/scripts/admission.mjs +4 -2
  76. package/skills/abelien-hardware/scripts/provider-chain-contract.mjs +20 -7
  77. package/skills/abelien-hardware/scripts/selection-bom-use.mjs +47 -0
  78. package/skills/abelien-hardware/scripts/selection-commit.mjs +29 -0
  79. package/skills/abelien-hardware/scripts/selection-model.mjs +252 -0
  80. package/skills/abelien-hardware/scripts/selection-propose.mjs +256 -0
  81. package/skills/abelien-hardware/scripts/selection-recall.mjs +150 -0
  82. package/skills/abelien-hardware/scripts/selection-revision-store.mjs +97 -0
  83. package/skills/abelien-hardware/scripts/web-evidence-storage.mjs +6 -2
  84. package/skills/abelien-hardware/scripts/web-integrity.mjs +3 -1
  85. package/skills/abelien-hardware/scripts/web-merge.mjs +32 -3
  86. package/skills/abelien-hardware/scripts/web-pdf.mjs +135 -0
  87. package/skills/abelien-hardware/scripts/web-provider-chain.mjs +55 -6
  88. package/skills/abelien-hardware/workflows/definitions/136ef3d91d059f43e80a91338748f9d26a65be0cae6fc1ac553177f25af1faa5.json +176 -0
  89. package/skills/abelien-hardware/workflows/definitions/857a5b729a5164c4727d281d64b66941281173ebdde975a20f19a2a2acfbff3a.json +150 -0
  90. package/skills/abelien-hardware/workflows/definitions/b63cb14e876b7d274da3ecefa7e3b056a113ace7d7fb97fcd2c74b749673b6e3.json +218 -0
  91. package/skills/abelien-hardware/workflows/user-journey-hardware-candidates.json +1 -1
  92. package/skills/abelien-hardware/workflows/user-journey-hardware-replace.json +1 -1
  93. package/skills/abelien-hardware/workflows/user-journey-hardware.json +1 -1
  94. package/skills/abelien-harness/SKILL.md +6 -0
  95. package/skills/abelien-harness/contract/action-registry.md +76 -0
  96. package/skills/abelien-harness/contract/source-registry.md +5 -2
  97. package/skills/abelien-harness/contract/workflow-spec.md +15 -0
  98. package/skills/abelien-harness/contracts/README.md +109 -0
  99. package/skills/abelien-harness/contracts/examples/ActionDefinition/invalid-design-example-without-result-checks.json +24 -0
  100. package/skills/abelien-harness/contracts/examples/ActionDefinition/invalid-postcondition-without-entry.json +31 -0
  101. package/skills/abelien-harness/contracts/examples/ActionDefinition/invalid-transport-in-definition.json +32 -0
  102. package/skills/abelien-harness/contracts/examples/ActionDefinition/invalid-unknown-effect.json +33 -0
  103. package/skills/abelien-harness/contracts/examples/ActionDefinition/valid-async-web-search.json +45 -0
  104. package/skills/abelien-harness/contracts/examples/ActionDefinition/valid-implementation-dependent-build.json +32 -0
  105. package/skills/abelien-harness/contracts/examples/ActionDefinition/valid-local-change-scope.json +31 -0
  106. package/skills/abelien-harness/contracts/examples/ActionError/invalid-missing-submission-state.json +8 -0
  107. package/skills/abelien-harness/contracts/examples/ActionError/invalid-transient-after-submit.json +10 -0
  108. package/skills/abelien-harness/contracts/examples/ActionError/invalid-unknown-retried.json +9 -0
  109. package/skills/abelien-harness/contracts/examples/ActionError/valid-config-blocked.json +9 -0
  110. package/skills/abelien-harness/contracts/examples/ActionError/valid-design-conflict.json +24 -0
  111. package/skills/abelien-harness/contracts/examples/ActionError/valid-unknown-reconcile.json +9 -0
  112. package/skills/abelien-harness/contracts/examples/AppearancePoints/invalid-fallback-with-guessed-points.json +47 -0
  113. package/skills/abelien-harness/contracts/examples/AppearancePoints/invalid-missing-image-ref.json +94 -0
  114. package/skills/abelien-harness/contracts/examples/AppearancePoints/invalid-mm-without-scale.json +104 -0
  115. package/skills/abelien-harness/contracts/examples/AppearancePoints/invalid-ready-without-frame.json +100 -0
  116. package/skills/abelien-harness/contracts/examples/AppearancePoints/valid-degraded-fallback.json +27 -0
  117. package/skills/abelien-harness/contracts/examples/AppearancePoints/valid-ready.json +104 -0
  118. package/skills/abelien-harness/contracts/examples/ArtifactApplicability/invalid-current-with-reasons.json +30 -0
  119. package/skills/abelien-harness/contracts/examples/ArtifactApplicability/invalid-stale-without-reasons.json +15 -0
  120. package/skills/abelien-harness/contracts/examples/ArtifactApplicability/valid-current.json +15 -0
  121. package/skills/abelien-harness/contracts/examples/ArtifactApplicability/valid-stale-after-redraw.json +30 -0
  122. package/skills/abelien-harness/contracts/examples/ArtifactEnvelope/invalid-degraded-without-unknowns.json +17 -0
  123. package/skills/abelien-harness/contracts/examples/ArtifactEnvelope/invalid-design-example-string-inputs.json +19 -0
  124. package/skills/abelien-harness/contracts/examples/ArtifactEnvelope/invalid-fallback-on-ready.json +27 -0
  125. package/skills/abelien-harness/contracts/examples/ArtifactEnvelope/valid-degraded-fallback.json +27 -0
  126. package/skills/abelien-harness/contracts/examples/ArtifactEnvelope/valid-ready-evidence.json +17 -0
  127. package/skills/abelien-harness/contracts/examples/ArtifactNeed/invalid-accept-failed.json +6 -0
  128. package/skills/abelien-harness/contracts/examples/ArtifactNeed/invalid-empty-quality.json +4 -0
  129. package/skills/abelien-harness/contracts/examples/ArtifactNeed/valid-points-accept-degraded.json +7 -0
  130. package/skills/abelien-harness/contracts/examples/ArtifactNeed/valid-selection-ready-only.json +6 -0
  131. package/skills/abelien-harness/contracts/examples/ArtifactRecord/invalid-no-provenance.json +38 -0
  132. package/skills/abelien-harness/contracts/examples/ArtifactRecord/valid-degraded-points.json +44 -0
  133. package/skills/abelien-harness/contracts/examples/BomLine/invalid-placeholder-posing-as-purchased.json +24 -0
  134. package/skills/abelien-harness/contracts/examples/BomLine/invalid-placeholder-without-open-issues.json +20 -0
  135. package/skills/abelien-harness/contracts/examples/BomLine/invalid-purchased-without-identity-status.json +23 -0
  136. package/skills/abelien-harness/contracts/examples/BomLine/valid-designed-substitute.json +24 -0
  137. package/skills/abelien-harness/contracts/examples/BomLine/valid-placeholder.json +23 -0
  138. package/skills/abelien-harness/contracts/examples/BomLine/valid-purchased-exact.json +24 -0
  139. package/skills/abelien-harness/contracts/examples/BomLine/valid-purchased-series-only.json +24 -0
  140. package/skills/abelien-harness/contracts/examples/ConfirmationAnswer/invalid-client-operation-id.json +17 -0
  141. package/skills/abelien-harness/contracts/examples/ConfirmationAnswer/valid-accept.json +17 -0
  142. package/skills/abelien-harness/contracts/examples/ConfirmationIdentity/invalid-missing-version.json +8 -0
  143. package/skills/abelien-harness/contracts/examples/ConfirmationIdentity/invalid-zero-semantics-version.json +9 -0
  144. package/skills/abelien-harness/contracts/examples/ConfirmationIdentity/valid-selection-card.json +9 -0
  145. package/skills/abelien-harness/contracts/examples/ConfirmationRequest/invalid-no-options.json +20 -0
  146. package/skills/abelien-harness/contracts/examples/ConfirmationRequest/invalid-ui-copy-in-option.json +25 -0
  147. package/skills/abelien-harness/contracts/examples/ConfirmationRequest/valid-hardware-card.json +27 -0
  148. package/skills/abelien-harness/contracts/examples/DispatchClaim/invalid-claim-without-fence.json +44 -0
  149. package/skills/abelien-harness/contracts/examples/DispatchClaim/valid-claim.json +45 -0
  150. package/skills/abelien-harness/contracts/examples/EffectiveAction/invalid-bound-unresolved-determinism.json +78 -0
  151. package/skills/abelien-harness/contracts/examples/EffectiveAction/invalid-unbound-with-binding-digest.json +69 -0
  152. package/skills/abelien-harness/contracts/examples/EffectiveAction/valid-bound-module.json +70 -0
  153. package/skills/abelien-harness/contracts/examples/EffectiveAction/valid-bound-studio-tool.json +78 -0
  154. package/skills/abelien-harness/contracts/examples/EffectiveAction/valid-unbound.json +69 -0
  155. package/skills/abelien-harness/contracts/examples/EventCursor/invalid-negative.json +4 -0
  156. package/skills/abelien-harness/contracts/examples/EventCursor/valid-fresh-tree.json +4 -0
  157. package/skills/abelien-harness/contracts/examples/EventEnvelope/invalid-legacy-state-name.json +14 -0
  158. package/skills/abelien-harness/contracts/examples/EventEnvelope/invalid-step-event-without-step.json +26 -0
  159. package/skills/abelien-harness/contracts/examples/EventEnvelope/invalid-zero-sequence.json +17 -0
  160. package/skills/abelien-harness/contracts/examples/EventEnvelope/valid-late-receipt-history.json +18 -0
  161. package/skills/abelien-harness/contracts/examples/EventEnvelope/valid-operation-accepted.json +17 -0
  162. package/skills/abelien-harness/contracts/examples/EventEnvelope/valid-step-waiting-on-card.json +27 -0
  163. package/skills/abelien-harness/contracts/examples/ExecutionClaim/invalid-zero-fence.json +7 -0
  164. package/skills/abelien-harness/contracts/examples/ExecutionClaim/valid-after-takeover.json +7 -0
  165. package/skills/abelien-harness/contracts/examples/ExecutionIdentity/invalid-fence-in-identity.json +19 -0
  166. package/skills/abelien-harness/contracts/examples/ExecutionIdentity/invalid-missing-target-revision.json +13 -0
  167. package/skills/abelien-harness/contracts/examples/ExecutionIdentity/valid-rework.json +20 -0
  168. package/skills/abelien-harness/contracts/examples/ExecutionIdentity/valid-web-search.json +18 -0
  169. package/skills/abelien-harness/contracts/examples/ExecutionManifest/invalid-alias-claimed-frozen.json +77 -0
  170. package/skills/abelien-harness/contracts/examples/ExecutionManifest/invalid-runtime-version-alias.json +77 -0
  171. package/skills/abelien-harness/contracts/examples/ExecutionManifest/valid-legacy-mapping.json +59 -0
  172. package/skills/abelien-harness/contracts/examples/ExecutionManifest/valid-runtime-run.json +77 -0
  173. package/skills/abelien-harness/contracts/examples/ImplementationBinding/invalid-credential-in-entry.json +23 -0
  174. package/skills/abelien-harness/contracts/examples/ImplementationBinding/invalid-module-without-export.json +19 -0
  175. package/skills/abelien-harness/contracts/examples/ImplementationBinding/invalid-studio-tool-with-path.json +24 -0
  176. package/skills/abelien-harness/contracts/examples/ImplementationBinding/invalid-unresolved-determinism.json +23 -0
  177. package/skills/abelien-harness/contracts/examples/ImplementationBinding/valid-http.json +23 -0
  178. package/skills/abelien-harness/contracts/examples/ImplementationBinding/valid-module.json +20 -0
  179. package/skills/abelien-harness/contracts/examples/ImplementationBinding/valid-studio-tool.json +23 -0
  180. package/skills/abelien-harness/contracts/examples/InputDigestSubject/invalid-shorthand-input-ref.json +22 -0
  181. package/skills/abelien-harness/contracts/examples/InputDigestSubject/invalid-transport-field.json +32 -0
  182. package/skills/abelien-harness/contracts/examples/InputDigestSubject/valid-web-search.json +31 -0
  183. package/skills/abelien-harness/contracts/examples/OperationRecord/invalid-prepared-but-submitted.json +36 -0
  184. package/skills/abelien-harness/contracts/examples/OperationRecord/invalid-unknown-not-submitted.json +36 -0
  185. package/skills/abelien-harness/contracts/examples/OperationRecord/valid-accepted.json +36 -0
  186. package/skills/abelien-harness/contracts/examples/OperationRecord/valid-prepared.json +36 -0
  187. package/skills/abelien-harness/contracts/examples/OperationRecord/valid-unknown.json +44 -0
  188. package/skills/abelien-harness/contracts/examples/PortError/invalid-unknown-code.json +4 -0
  189. package/skills/abelien-harness/contracts/examples/PortError/valid-fence-stale.json +9 -0
  190. package/skills/abelien-harness/contracts/examples/Receipt/invalid-failed-without-error.json +15 -0
  191. package/skills/abelien-harness/contracts/examples/Receipt/invalid-missing-implementation-identity.json +19 -0
  192. package/skills/abelien-harness/contracts/examples/Receipt/invalid-succeeded-with-error.json +44 -0
  193. package/skills/abelien-harness/contracts/examples/Receipt/valid-failed.json +39 -0
  194. package/skills/abelien-harness/contracts/examples/Receipt/valid-succeeded.json +20 -0
  195. package/skills/abelien-harness/contracts/examples/Ref/invalid-digest-with-prefix.json +5 -0
  196. package/skills/abelien-harness/contracts/examples/Ref/invalid-shorthand-string.json +1 -0
  197. package/skills/abelien-harness/contracts/examples/Ref/valid-concept-image.json +5 -0
  198. package/skills/abelien-harness/contracts/examples/ResourceRecord/invalid-digest-without-prefix.json +19 -0
  199. package/skills/abelien-harness/contracts/examples/ResourceRecord/invalid-renamed-meta.json +13 -0
  200. package/skills/abelien-harness/contracts/examples/ResourceRecord/valid-existing-store-shape.json +19 -0
  201. package/skills/abelien-harness/contracts/examples/RunRecord/invalid-child-without-parent-step.json +27 -0
  202. package/skills/abelien-harness/contracts/examples/RunRecord/invalid-runtime-without-manifest.json +21 -0
  203. package/skills/abelien-harness/contracts/examples/RunRecord/valid-legacy-child.json +27 -0
  204. package/skills/abelien-harness/contracts/examples/RunRecord/valid-root.json +21 -0
  205. package/skills/abelien-harness/contracts/examples/RunSnapshot/invalid-child-run-on-model-step.json +270 -0
  206. package/skills/abelien-harness/contracts/examples/RunSnapshot/invalid-legacy-state-name.json +153 -0
  207. package/skills/abelien-harness/contracts/examples/RunSnapshot/invalid-legacy-without-registration.json +266 -0
  208. package/skills/abelien-harness/contracts/examples/RunSnapshot/invalid-waiting-without-reason.json +268 -0
  209. package/skills/abelien-harness/contracts/examples/RunSnapshot/valid-cancelled-late-result-rework.json +139 -0
  210. package/skills/abelien-harness/contracts/examples/RunSnapshot/valid-legacy-hardware-subflow.json +272 -0
  211. package/skills/abelien-harness/contracts/examples/RunSnapshot/valid-parallel-join-degraded.json +153 -0
  212. package/skills/abelien-harness/contracts/examples/SkeletonOccurrence/invalid-missing-fit-envelope.json +27 -0
  213. package/skills/abelien-harness/contracts/examples/SkeletonOccurrence/invalid-uppercase-id.json +43 -0
  214. package/skills/abelien-harness/contracts/examples/SkeletonOccurrence/invalid-view-transform-fields.json +44 -0
  215. package/skills/abelien-harness/contracts/examples/SkeletonOccurrence/valid-speaker-1.json +43 -0
  216. package/skills/abelien-harness/contracts/examples/SkeletonOccurrence/valid-speaker-2.json +43 -0
  217. package/skills/abelien-harness/contracts/examples/Slot/invalid-box-with-diameter.json +29 -0
  218. package/skills/abelien-harness/contracts/examples/Slot/invalid-missing-reaction-ids.json +11 -0
  219. package/skills/abelien-harness/contracts/examples/Slot/invalid-two-level-path.json +11 -0
  220. package/skills/abelien-harness/contracts/examples/Slot/invalid-zero-quantity.json +12 -0
  221. package/skills/abelien-harness/contracts/examples/Slot/valid-shared-power.json +12 -0
  222. package/skills/abelien-harness/contracts/examples/Slot/valid-speaker-with-zone.json +33 -0
  223. package/skills/abelien-harness/contracts/examples/StepExecutionRecord/invalid-child-run-on-cli.json +23 -0
  224. package/skills/abelien-harness/contracts/examples/StepExecutionRecord/invalid-waiting-without-reason.json +19 -0
  225. package/skills/abelien-harness/contracts/examples/StepExecutionRecord/valid-subflow.json +31 -0
  226. package/skills/abelien-harness/contracts/examples/StepExecutionRecord/valid-waiting-external.json +23 -0
  227. package/skills/abelien-harness/contracts/examples/TargetRevisionRef/invalid-extra-parent.json +6 -0
  228. package/skills/abelien-harness/contracts/examples/TargetRevisionRef/valid-revision-4.json +5 -0
  229. package/skills/abelien-harness/contracts/examples/WaitReason/invalid-configuration-with-source-error.json +12 -0
  230. package/skills/abelien-harness/contracts/examples/WaitReason/invalid-confirmation-without-subject.json +4 -0
  231. package/skills/abelien-harness/contracts/examples/WaitReason/valid-budget.json +6 -0
  232. package/skills/abelien-harness/contracts/examples/WaitReason/valid-configuration.json +12 -0
  233. package/skills/abelien-harness/contracts/examples/WaitReason/valid-confirmation.json +13 -0
  234. package/skills/abelien-harness/contracts/examples/WaitReason/valid-data-dependency.json +18 -0
  235. package/skills/abelien-harness/contracts/examples/expectations.json +294 -0
  236. package/skills/abelien-harness/contracts/index.d.mts +32 -0
  237. package/skills/abelien-harness/contracts/index.mjs +46 -0
  238. package/skills/abelien-harness/contracts/ports/memory.d.mts +11 -0
  239. package/skills/abelien-harness/contracts/ports/memory.mjs +349 -0
  240. package/skills/abelien-harness/contracts/ports/ports.d.ts +115 -0
  241. package/skills/abelien-harness/contracts/schemas/action.v1.json +330 -0
  242. package/skills/abelien-harness/contracts/schemas/artifact.v1.json +102 -0
  243. package/skills/abelien-harness/contracts/schemas/confirmation.v1.json +64 -0
  244. package/skills/abelien-harness/contracts/schemas/cross-domain.v1.json +241 -0
  245. package/skills/abelien-harness/contracts/schemas/error.v1.json +70 -0
  246. package/skills/abelien-harness/contracts/schemas/event.v1.json +204 -0
  247. package/skills/abelien-harness/contracts/schemas/execution-identity.v1.json +72 -0
  248. package/skills/abelien-harness/contracts/schemas/ref.v1.json +43 -0
  249. package/skills/abelien-harness/contracts/schemas/run-snapshot.v1.json +176 -0
  250. package/skills/abelien-harness/contracts/schemas/store.v1.json +209 -0
  251. package/skills/abelien-harness/contracts/types.d.ts +620 -0
  252. package/skills/abelien-harness/contracts/validate.mjs +164 -0
  253. package/skills/abelien-harness/runtime/README.md +103 -0
  254. package/skills/abelien-harness/runtime/conformance/README.md +32 -0
  255. package/skills/abelien-harness/runtime/conformance/artifact-store.mjs +167 -0
  256. package/skills/abelien-harness/runtime/conformance/execution-store.mjs +346 -0
  257. package/skills/abelien-harness/runtime/conformance/fixtures.mjs +56 -0
  258. package/skills/abelien-harness/runtime/conformance/index.mjs +71 -0
  259. package/skills/abelien-harness/runtime/engine.mjs +1021 -0
  260. package/skills/abelien-harness/runtime/errors.mjs +80 -0
  261. package/skills/abelien-harness/runtime/ids.mjs +25 -0
  262. package/skills/abelien-harness/runtime/index.mjs +15 -0
  263. package/skills/abelien-harness/runtime/legacy/definitions.mjs +115 -0
  264. package/skills/abelien-harness/runtime/legacy/external-recovery.mjs +48 -0
  265. package/skills/abelien-harness/runtime/legacy/workflow-store.mjs +183 -0
  266. package/skills/abelien-harness/runtime/ports/file/artifact-store.mjs +103 -0
  267. package/skills/abelien-harness/runtime/ports/file/common.mjs +100 -0
  268. package/skills/abelien-harness/runtime/ports/file/execution-store.mjs +248 -0
  269. package/skills/abelien-harness/runtime/ports/file/index.mjs +23 -0
  270. package/skills/abelien-harness/runtime/ports/file/resource-store.mjs +51 -0
  271. package/skills/abelien-harness/runtime/snapshot.mjs +96 -0
  272. package/skills/abelien-harness/runtime/testing/index.mjs +123 -0
  273. package/skills/abelien-harness/runtime/testing/scenarios.mjs +343 -0
  274. package/skills/abelien-harness/runtime/workflow/flows.mjs +38 -0
  275. package/skills/abelien-harness/runtime/workflow/httl.mjs +77 -0
  276. package/skills/abelien-harness/runtime/workflow/index.mjs +168 -0
  277. package/skills/abelien-harness/runtime/workflow/legacy-flow.mjs +156 -0
  278. package/skills/abelien-harness/runtime/workflow/view.mjs +66 -0
  279. package/skills/abelien-harness/scripts/ab.mjs +45 -589
  280. package/skills/abelien-harness/scripts/action-cli.mjs +54 -0
  281. package/skills/abelien-harness/scripts/action-docs.mjs +293 -0
  282. package/skills/abelien-harness/scripts/action-registry.mjs +423 -0
  283. package/skills/abelien-harness/scripts/receipt.mjs +5 -1
  284. package/skills/abelien-harness/scripts/store.mjs +212 -0
  285. package/skills/abelien-harness/scripts/studio.mjs +1 -1
  286. package/skills/abelien-harness/scripts/template.mjs +22 -0
  287. package/skills/abelien-harness/scripts/web/pdf-reader.mjs +105 -0
  288. package/skills/abelien-harness/scripts/web/vision.mjs +85 -0
  289. package/skills/abelien-reference/SKILL.md +1 -1
  290. package/skills/abelien-reference/actions/reference.finalize.json +48 -0
  291. package/skills/abelien-reference/actions/reference.page.json +28 -0
  292. package/skills/abelien-reference/actions/reference.research.json +68 -0
  293. package/skills/abelien-reference/bindings.json +78 -0
  294. package/skills/abelien-reference/contract/host-tools.generated.json +2386 -0
  295. package/skills/abelien-reference/domain.json +7 -2
  296. package/skills/abelien-reference/references/actions.generated.md +295 -0
  297. package/skills/abelien-reference/references/research-contract.md +4 -34
  298. package/skills/abelien-reference/schemas/finalize-input.v1.json +16 -0
  299. package/skills/abelien-reference/schemas/host-tools.v1.json +31 -0
  300. package/skills/abelien-reference/schemas/research-input.v1.json +142 -0
  301. package/skills/abelien-structure/SKILL.md +5 -0
  302. package/skills/abelien-structure/domain.json +95 -0
  303. package/skills/abelien-structure/references/skeleton.md +54 -0
  304. package/skills/abelien-structure/references/structure-reasonableness.md +3 -3
  305. package/skills/abelien-structure/schemas/layout-check-input.v1.json +13 -0
  306. package/skills/abelien-structure/schemas/layout-check-result.v1.json +57 -0
  307. package/skills/abelien-structure/schemas/layout-proposal.v1.json +61 -0
  308. package/skills/abelien-structure/schemas/layout-request-input.v1.json +79 -0
  309. package/skills/abelien-structure/schemas/layout-request.v1.json +105 -0
  310. package/skills/abelien-structure/schemas/skeleton.v1.json +183 -0
  311. package/skills/abelien-structure/schemas/swap-candidates-input.v1.json +50 -0
  312. package/skills/abelien-structure/schemas/swap-candidates-result.v1.json +46 -0
  313. package/skills/abelien-structure/scripts/geometry.mjs +141 -0
  314. package/skills/abelien-structure/scripts/layout.mjs +518 -0
  315. package/skills/abelien-structure/scripts/schemas.mjs +28 -0
  316. package/skills/abelien-structure/scripts/swap.mjs +79 -0
  317. package/skills/abelien-workspace/SKILL.md +2 -1
  318. package/skills/abelien-workspace/actions/cad.build.json +29 -0
  319. package/skills/abelien-workspace/actions/component.search.json +27 -0
  320. package/skills/abelien-workspace/actions/image.generate.json +29 -0
  321. package/skills/abelien-workspace/actions/image.import.json +30 -0
  322. package/skills/abelien-workspace/actions/question.card.json +26 -0
  323. package/skills/abelien-workspace/actions/studio.prepare.json +28 -0
  324. package/skills/abelien-workspace/actions/visual.review.json +31 -0
  325. package/skills/abelien-workspace/actions/workspace.journey-next.json +30 -0
  326. package/skills/abelien-workspace/actions/workspace.lanes-next.json +30 -0
  327. package/skills/abelien-workspace/assets/journey-stage-plan.json +20 -20
  328. package/skills/abelien-workspace/bindings.json +187 -0
  329. package/skills/abelien-workspace/contract/host-tools.generated.json +901 -0
  330. package/skills/abelien-workspace/domain.json +17 -2
  331. package/skills/abelien-workspace/references/actions.generated.md +361 -0
  332. package/skills/abelien-workspace/references/journey-stage-plan.md +14 -14
  333. package/skills/abelien-workspace/schemas/host-tools.v1.json +173 -0
  334. package/skills/abelien-workspace/schemas/journey-next-input.v1.json +55 -0
  335. package/skills/abelien-workspace/schemas/journey-next-result.v1.json +100 -0
  336. package/skills/abelien-workspace/schemas/lanes-next-input.v1.json +37 -0
  337. package/skills/abelien-workspace/schemas/lanes-next-result.v1.json +54 -0
  338. 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
+ }