@xemahq/biome-sdk 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +62 -0
- package/dist/adapter/index.d.ts +7 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/index.js +23 -0
- package/dist/adapter/index.js.map +1 -0
- package/dist/adapter/lib/action.d.ts +25 -0
- package/dist/adapter/lib/action.d.ts.map +1 -0
- package/dist/adapter/lib/action.js +3 -0
- package/dist/adapter/lib/action.js.map +1 -0
- package/dist/adapter/lib/provider-module.d.ts +41 -0
- package/dist/adapter/lib/provider-module.d.ts.map +1 -0
- package/dist/adapter/lib/provider-module.js +7 -0
- package/dist/adapter/lib/provider-module.js.map +1 -0
- package/dist/adapter/lib/resource.d.ts +25 -0
- package/dist/adapter/lib/resource.d.ts.map +1 -0
- package/dist/adapter/lib/resource.js +3 -0
- package/dist/adapter/lib/resource.js.map +1 -0
- package/dist/adapter/lib/result.d.ts +18 -0
- package/dist/adapter/lib/result.d.ts.map +1 -0
- package/dist/adapter/lib/result.js +12 -0
- package/dist/adapter/lib/result.js.map +1 -0
- package/dist/adapter/lib/sidecar-contract.d.ts +91 -0
- package/dist/adapter/lib/sidecar-contract.d.ts.map +1 -0
- package/dist/adapter/lib/sidecar-contract.js +19 -0
- package/dist/adapter/lib/sidecar-contract.js.map +1 -0
- package/dist/adapter/lib/webhook.d.ts +49 -0
- package/dist/adapter/lib/webhook.d.ts.map +1 -0
- package/dist/adapter/lib/webhook.js +3 -0
- package/dist/adapter/lib/webhook.js.map +1 -0
- package/dist/agent-workspace/index.d.ts +8 -0
- package/dist/agent-workspace/index.d.ts.map +1 -0
- package/dist/agent-workspace/index.js +24 -0
- package/dist/agent-workspace/index.js.map +1 -0
- package/dist/agent-workspace/lib/errors/error-codes.d.ts +16 -0
- package/dist/agent-workspace/lib/errors/error-codes.d.ts.map +1 -0
- package/dist/agent-workspace/lib/errors/error-codes.js +37 -0
- package/dist/agent-workspace/lib/errors/error-codes.js.map +1 -0
- package/dist/agent-workspace/lib/errors/index.d.ts +4 -0
- package/dist/agent-workspace/lib/errors/index.d.ts.map +1 -0
- package/dist/agent-workspace/lib/errors/index.js +20 -0
- package/dist/agent-workspace/lib/errors/index.js.map +1 -0
- package/dist/agent-workspace/lib/errors/mount-plan-error.d.ts +16 -0
- package/dist/agent-workspace/lib/errors/mount-plan-error.d.ts.map +1 -0
- package/dist/agent-workspace/lib/errors/mount-plan-error.js +26 -0
- package/dist/agent-workspace/lib/errors/mount-plan-error.js.map +1 -0
- package/dist/agent-workspace/lib/errors/mount-resolver-error.d.ts +34 -0
- package/dist/agent-workspace/lib/errors/mount-resolver-error.d.ts.map +1 -0
- package/dist/agent-workspace/lib/errors/mount-resolver-error.js +50 -0
- package/dist/agent-workspace/lib/errors/mount-resolver-error.js.map +1 -0
- package/dist/agent-workspace/lib/mount-resolver.d.ts +10 -0
- package/dist/agent-workspace/lib/mount-resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/mount-resolver.js +3 -0
- package/dist/agent-workspace/lib/mount-resolver.js.map +1 -0
- package/dist/agent-workspace/lib/mount-source.d.ts +4 -0
- package/dist/agent-workspace/lib/mount-source.d.ts.map +1 -0
- package/dist/agent-workspace/lib/mount-source.js +3 -0
- package/dist/agent-workspace/lib/mount-source.js.map +1 -0
- package/dist/agent-workspace/lib/refid-resolver.d.ts +23 -0
- package/dist/agent-workspace/lib/refid-resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/refid-resolver.js +103 -0
- package/dist/agent-workspace/lib/refid-resolver.js.map +1 -0
- package/dist/agent-workspace/lib/registries.d.ts +30 -0
- package/dist/agent-workspace/lib/registries.d.ts.map +1 -0
- package/dist/agent-workspace/lib/registries.js +88 -0
- package/dist/agent-workspace/lib/registries.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/agent-definition.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/agent-definition.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/agent-definition.resolver.js +25 -0
- package/dist/agent-workspace/lib/resolvers/agent-definition.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/artifact-store-collection.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/artifact-store-collection.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/artifact-store-collection.resolver.js +28 -0
- package/dist/agent-workspace/lib/resolvers/artifact-store-collection.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/artifact-version.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/artifact-version.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/artifact-version.resolver.js +25 -0
- package/dist/agent-workspace/lib/resolvers/artifact-version.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/clients.d.ts +122 -0
- package/dist/agent-workspace/lib/resolvers/clients.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/clients.js +3 -0
- package/dist/agent-workspace/lib/resolvers/clients.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/deliverable-specs.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/deliverable-specs.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/deliverable-specs.resolver.js +24 -0
- package/dist/agent-workspace/lib/resolvers/deliverable-specs.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/deliverables.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/deliverables.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/deliverables.resolver.js +28 -0
- package/dist/agent-workspace/lib/resolvers/deliverables.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/index.d.ts +20 -0
- package/dist/agent-workspace/lib/resolvers/index.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/index.js +36 -0
- package/dist/agent-workspace/lib/resolvers/index.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/instruction-section.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/instruction-section.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/instruction-section.resolver.js +22 -0
- package/dist/agent-workspace/lib/resolvers/instruction-section.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/kb-pages.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/kb-pages.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/kb-pages.resolver.js +36 -0
- package/dist/agent-workspace/lib/resolvers/kb-pages.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/kb-space.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/kb-space.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/kb-space.resolver.js +26 -0
- package/dist/agent-workspace/lib/resolvers/kb-space.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/rendered-agents-md.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/rendered-agents-md.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/rendered-agents-md.resolver.js +23 -0
- package/dist/agent-workspace/lib/resolvers/rendered-agents-md.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/rendered-context-json.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/rendered-context-json.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/rendered-context-json.resolver.js +24 -0
- package/dist/agent-workspace/lib/resolvers/rendered-context-json.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/rendered-system-overlay.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/rendered-system-overlay.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/rendered-system-overlay.resolver.js +23 -0
- package/dist/agent-workspace/lib/resolvers/rendered-system-overlay.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/scm-repo.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/scm-repo.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/scm-repo.resolver.js +28 -0
- package/dist/agent-workspace/lib/resolvers/scm-repo.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/session-attachment.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/session-attachment.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/session-attachment.resolver.js +28 -0
- package/dist/agent-workspace/lib/resolvers/session-attachment.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/skill-bundle.resolver.d.ts +13 -0
- package/dist/agent-workspace/lib/resolvers/skill-bundle.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/skill-bundle.resolver.js +29 -0
- package/dist/agent-workspace/lib/resolvers/skill-bundle.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/static-literal.resolver.d.ts +11 -0
- package/dist/agent-workspace/lib/resolvers/static-literal.resolver.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/static-literal.resolver.js +33 -0
- package/dist/agent-workspace/lib/resolvers/static-literal.resolver.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/types.d.ts +35 -0
- package/dist/agent-workspace/lib/resolvers/types.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/types.js +3 -0
- package/dist/agent-workspace/lib/resolvers/types.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/utils/agent-run-context-cache.d.ts +70 -0
- package/dist/agent-workspace/lib/resolvers/utils/agent-run-context-cache.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/utils/agent-run-context-cache.js +90 -0
- package/dist/agent-workspace/lib/resolvers/utils/agent-run-context-cache.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/utils/auth.d.ts +5 -0
- package/dist/agent-workspace/lib/resolvers/utils/auth.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/utils/auth.js +19 -0
- package/dist/agent-workspace/lib/resolvers/utils/auth.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/utils/size-cap.d.ts +3 -0
- package/dist/agent-workspace/lib/resolvers/utils/size-cap.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/utils/size-cap.js +23 -0
- package/dist/agent-workspace/lib/resolvers/utils/size-cap.js.map +1 -0
- package/dist/agent-workspace/lib/resolvers/utils/streaming.d.ts +3 -0
- package/dist/agent-workspace/lib/resolvers/utils/streaming.d.ts.map +1 -0
- package/dist/agent-workspace/lib/resolvers/utils/streaming.js +11 -0
- package/dist/agent-workspace/lib/resolvers/utils/streaming.js.map +1 -0
- package/dist/agent-workspace/lib/workspace-renderer.d.ts +13 -0
- package/dist/agent-workspace/lib/workspace-renderer.d.ts.map +1 -0
- package/dist/agent-workspace/lib/workspace-renderer.js +3 -0
- package/dist/agent-workspace/lib/workspace-renderer.js.map +1 -0
- package/dist/api/index.d.ts +11 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +27 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/lib/api-manifest.d.ts +29 -0
- package/dist/api/lib/api-manifest.d.ts.map +1 -0
- package/dist/api/lib/api-manifest.js +28 -0
- package/dist/api/lib/api-manifest.js.map +1 -0
- package/dist/api/lib/biome-db.d.ts +2 -0
- package/dist/api/lib/biome-db.d.ts.map +1 -0
- package/dist/api/lib/biome-db.js +13 -0
- package/dist/api/lib/biome-db.js.map +1 -0
- package/dist/api/lib/code-tool-context.d.ts +16 -0
- package/dist/api/lib/code-tool-context.d.ts.map +1 -0
- package/dist/api/lib/code-tool-context.js +12 -0
- package/dist/api/lib/code-tool-context.js.map +1 -0
- package/dist/api/lib/code-tool-descriptor.d.ts +49 -0
- package/dist/api/lib/code-tool-descriptor.d.ts.map +1 -0
- package/dist/api/lib/code-tool-descriptor.js +3 -0
- package/dist/api/lib/code-tool-descriptor.js.map +1 -0
- package/dist/api/lib/code-tool.decorator.d.ts +17 -0
- package/dist/api/lib/code-tool.decorator.d.ts.map +1 -0
- package/dist/api/lib/code-tool.decorator.js +38 -0
- package/dist/api/lib/code-tool.decorator.js.map +1 -0
- package/dist/api/lib/mutation-context.d.ts +16 -0
- package/dist/api/lib/mutation-context.d.ts.map +1 -0
- package/dist/api/lib/mutation-context.js +17 -0
- package/dist/api/lib/mutation-context.js.map +1 -0
- package/dist/api/lib/pagination.d.ts +8 -0
- package/dist/api/lib/pagination.d.ts.map +1 -0
- package/dist/api/lib/pagination.js +7 -0
- package/dist/api/lib/pagination.js.map +1 -0
- package/dist/api/lib/provider-kind-mirror.d.ts +7 -0
- package/dist/api/lib/provider-kind-mirror.d.ts.map +1 -0
- package/dist/api/lib/provider-kind-mirror.js +11 -0
- package/dist/api/lib/provider-kind-mirror.js.map +1 -0
- package/dist/api/lib/request-context.d.ts +21 -0
- package/dist/api/lib/request-context.d.ts.map +1 -0
- package/dist/api/lib/request-context.js +51 -0
- package/dist/api/lib/request-context.js.map +1 -0
- package/dist/api/lib/route-registry-entry.d.ts +11 -0
- package/dist/api/lib/route-registry-entry.d.ts.map +1 -0
- package/dist/api/lib/route-registry-entry.js +3 -0
- package/dist/api/lib/route-registry-entry.js.map +1 -0
- package/dist/api/nest/controller-base.d.ts +6 -0
- package/dist/api/nest/controller-base.d.ts.map +1 -0
- package/dist/api/nest/controller-base.js +28 -0
- package/dist/api/nest/controller-base.js.map +1 -0
- package/dist/api/nest/events/events.controller.d.ts +10 -0
- package/dist/api/nest/events/events.controller.d.ts.map +1 -0
- package/dist/api/nest/events/events.controller.js +56 -0
- package/dist/api/nest/events/events.controller.js.map +1 -0
- package/dist/api/nest/health/health.controller.d.ts +19 -0
- package/dist/api/nest/health/health.controller.d.ts.map +1 -0
- package/dist/api/nest/health/health.controller.js +63 -0
- package/dist/api/nest/health/health.controller.js.map +1 -0
- package/dist/api/nest/health/health.module.d.ts +6 -0
- package/dist/api/nest/health/health.module.d.ts.map +1 -0
- package/dist/api/nest/health/health.module.js +29 -0
- package/dist/api/nest/health/health.module.js.map +1 -0
- package/dist/api/nest/index.d.ts +7 -0
- package/dist/api/nest/index.d.ts.map +1 -0
- package/dist/api/nest/index.js +23 -0
- package/dist/api/nest/index.js.map +1 -0
- package/dist/api/nest/module.d.ts +6 -0
- package/dist/api/nest/module.d.ts.map +1 -0
- package/dist/api/nest/module.js +34 -0
- package/dist/api/nest/module.js.map +1 -0
- package/dist/api/nest/request-context.d.ts +17 -0
- package/dist/api/nest/request-context.d.ts.map +1 -0
- package/dist/api/nest/request-context.js +75 -0
- package/dist/api/nest/request-context.js.map +1 -0
- package/dist/builder/index.d.ts +7 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +23 -0
- package/dist/builder/index.js.map +1 -0
- package/dist/builder/lib/content-walker.d.ts +27 -0
- package/dist/builder/lib/content-walker.d.ts.map +1 -0
- package/dist/builder/lib/content-walker.js +274 -0
- package/dist/builder/lib/content-walker.js.map +1 -0
- package/dist/builder/lib/contribution-schemas.d.ts +348 -0
- package/dist/builder/lib/contribution-schemas.d.ts.map +1 -0
- package/dist/builder/lib/contribution-schemas.js +301 -0
- package/dist/builder/lib/contribution-schemas.js.map +1 -0
- package/dist/builder/lib/define-biome.d.ts +17 -0
- package/dist/builder/lib/define-biome.d.ts.map +1 -0
- package/dist/builder/lib/define-biome.js +11 -0
- package/dist/builder/lib/define-biome.js.map +1 -0
- package/dist/builder/lib/define-helpers.d.ts +6 -0
- package/dist/builder/lib/define-helpers.d.ts.map +1 -0
- package/dist/builder/lib/define-helpers.js +20 -0
- package/dist/builder/lib/define-helpers.js.map +1 -0
- package/dist/builder/lib/extends-precedence.d.ts +14 -0
- package/dist/builder/lib/extends-precedence.d.ts.map +1 -0
- package/dist/builder/lib/extends-precedence.js +113 -0
- package/dist/builder/lib/extends-precedence.js.map +1 -0
- package/dist/builder/lib/workflow-phase-config-loader.d.ts +18 -0
- package/dist/builder/lib/workflow-phase-config-loader.d.ts.map +1 -0
- package/dist/builder/lib/workflow-phase-config-loader.js +78 -0
- package/dist/builder/lib/workflow-phase-config-loader.js.map +1 -0
- package/dist/host/index.d.ts +11 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +38 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/lib/agents-cross-validate.d.ts +7 -0
- package/dist/host/lib/agents-cross-validate.d.ts.map +1 -0
- package/dist/host/lib/agents-cross-validate.js +157 -0
- package/dist/host/lib/agents-cross-validate.js.map +1 -0
- package/dist/host/lib/biome-manifest.d.ts +808 -0
- package/dist/host/lib/biome-manifest.d.ts.map +1 -0
- package/dist/host/lib/biome-manifest.js +490 -0
- package/dist/host/lib/biome-manifest.js.map +1 -0
- package/dist/host/lib/bootstrap-contributions-service.d.ts +35 -0
- package/dist/host/lib/bootstrap-contributions-service.d.ts.map +1 -0
- package/dist/host/lib/bootstrap-contributions-service.js +79 -0
- package/dist/host/lib/bootstrap-contributions-service.js.map +1 -0
- package/dist/host/lib/default-state.d.ts +3 -0
- package/dist/host/lib/default-state.d.ts.map +1 -0
- package/dist/host/lib/default-state.js +20 -0
- package/dist/host/lib/default-state.js.map +1 -0
- package/dist/host/lib/integration-cross-validate.d.ts +12 -0
- package/dist/host/lib/integration-cross-validate.d.ts.map +1 -0
- package/dist/host/lib/integration-cross-validate.js +66 -0
- package/dist/host/lib/integration-cross-validate.js.map +1 -0
- package/dist/host/lib/system-overlay-contribution.d.ts +14 -0
- package/dist/host/lib/system-overlay-contribution.d.ts.map +1 -0
- package/dist/host/lib/system-overlay-contribution.js +3 -0
- package/dist/host/lib/system-overlay-contribution.js.map +1 -0
- package/dist/host/lib/topology.d.ts +7 -0
- package/dist/host/lib/topology.d.ts.map +1 -0
- package/dist/host/lib/topology.js +105 -0
- package/dist/host/lib/topology.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator-adapter/index.d.ts +3 -0
- package/dist/orchestrator-adapter/index.d.ts.map +1 -0
- package/dist/orchestrator-adapter/index.js +19 -0
- package/dist/orchestrator-adapter/index.js.map +1 -0
- package/dist/orchestrator-adapter/lib/orchestrator-adapter-registry.d.ts +6 -0
- package/dist/orchestrator-adapter/lib/orchestrator-adapter-registry.d.ts.map +1 -0
- package/dist/orchestrator-adapter/lib/orchestrator-adapter-registry.js +11 -0
- package/dist/orchestrator-adapter/lib/orchestrator-adapter-registry.js.map +1 -0
- package/dist/orchestrator-adapter/lib/orchestrator-adapter.d.ts +11 -0
- package/dist/orchestrator-adapter/lib/orchestrator-adapter.d.ts.map +1 -0
- package/dist/orchestrator-adapter/lib/orchestrator-adapter.js +3 -0
- package/dist/orchestrator-adapter/lib/orchestrator-adapter.js.map +1 -0
- package/package.json +110 -0
- package/src/adapter/index.ts +6 -0
- package/src/adapter/lib/action.ts +60 -0
- package/src/adapter/lib/provider-module.ts +140 -0
- package/src/adapter/lib/resource.ts +52 -0
- package/src/adapter/lib/result.ts +53 -0
- package/src/adapter/lib/sidecar-contract.ts +169 -0
- package/src/adapter/lib/webhook.ts +142 -0
- package/src/agent-workspace/index.ts +7 -0
- package/src/agent-workspace/lib/errors/error-codes.ts +44 -0
- package/src/agent-workspace/lib/errors/index.ts +3 -0
- package/src/agent-workspace/lib/errors/mount-plan-error.ts +29 -0
- package/src/agent-workspace/lib/errors/mount-resolver-error.ts +56 -0
- package/src/agent-workspace/lib/mount-resolver.ts +35 -0
- package/src/agent-workspace/lib/mount-source.ts +11 -0
- package/src/agent-workspace/lib/refid-resolver.ts +135 -0
- package/src/agent-workspace/lib/registries.ts +150 -0
- package/src/agent-workspace/lib/resolvers/agent-definition.resolver.ts +45 -0
- package/src/agent-workspace/lib/resolvers/artifact-store-collection.resolver.ts +43 -0
- package/src/agent-workspace/lib/resolvers/artifact-version.resolver.ts +52 -0
- package/src/agent-workspace/lib/resolvers/clients.ts +297 -0
- package/src/agent-workspace/lib/resolvers/deliverable-specs.resolver.ts +33 -0
- package/src/agent-workspace/lib/resolvers/deliverables.resolver.ts +41 -0
- package/src/agent-workspace/lib/resolvers/index.ts +19 -0
- package/src/agent-workspace/lib/resolvers/instruction-section.resolver.ts +36 -0
- package/src/agent-workspace/lib/resolvers/kb-pages.resolver.ts +62 -0
- package/src/agent-workspace/lib/resolvers/kb-space.resolver.ts +34 -0
- package/src/agent-workspace/lib/resolvers/rendered-agents-md.resolver.ts +40 -0
- package/src/agent-workspace/lib/resolvers/rendered-context-json.resolver.ts +41 -0
- package/src/agent-workspace/lib/resolvers/rendered-system-overlay.resolver.ts +39 -0
- package/src/agent-workspace/lib/resolvers/scm-repo.resolver.ts +43 -0
- package/src/agent-workspace/lib/resolvers/session-attachment.resolver.ts +37 -0
- package/src/agent-workspace/lib/resolvers/skill-bundle.resolver.ts +42 -0
- package/src/agent-workspace/lib/resolvers/static-literal.resolver.ts +69 -0
- package/src/agent-workspace/lib/resolvers/types.ts +94 -0
- package/src/agent-workspace/lib/resolvers/utils/agent-run-context-cache.ts +206 -0
- package/src/agent-workspace/lib/resolvers/utils/auth.ts +39 -0
- package/src/agent-workspace/lib/resolvers/utils/size-cap.ts +38 -0
- package/src/agent-workspace/lib/resolvers/utils/streaming.ts +22 -0
- package/src/agent-workspace/lib/workspace-renderer.ts +25 -0
- package/src/api/index.ts +10 -0
- package/src/api/lib/api-manifest.ts +54 -0
- package/src/api/lib/biome-db.ts +28 -0
- package/src/api/lib/code-tool-context.ts +45 -0
- package/src/api/lib/code-tool-descriptor.ts +102 -0
- package/src/api/lib/code-tool.decorator.ts +111 -0
- package/src/api/lib/mutation-context.ts +49 -0
- package/src/api/lib/pagination.ts +17 -0
- package/src/api/lib/provider-kind-mirror.ts +16 -0
- package/src/api/lib/request-context.ts +90 -0
- package/src/api/lib/route-registry-entry.ts +35 -0
- package/src/api/nest/controller-base.ts +59 -0
- package/src/api/nest/events/events.controller.ts +48 -0
- package/src/api/nest/health/health.controller.ts +36 -0
- package/src/api/nest/health/health.module.ts +29 -0
- package/src/api/nest/index.ts +6 -0
- package/src/api/nest/module.ts +51 -0
- package/src/api/nest/request-context.ts +166 -0
- package/src/builder/index.ts +26 -0
- package/src/builder/lib/content-walker.ts +383 -0
- package/src/builder/lib/contribution-schemas.ts +572 -0
- package/src/builder/lib/define-biome.ts +84 -0
- package/src/builder/lib/define-helpers.ts +42 -0
- package/src/builder/lib/extends-precedence.ts +195 -0
- package/src/builder/lib/workflow-phase-config-loader.ts +163 -0
- package/src/host/index.ts +39 -0
- package/src/host/lib/agents-cross-validate.ts +283 -0
- package/src/host/lib/biome-manifest.ts +1060 -0
- package/src/host/lib/bootstrap-contributions-service.ts +233 -0
- package/src/host/lib/default-state.ts +40 -0
- package/src/host/lib/integration-cross-validate.ts +140 -0
- package/src/host/lib/system-overlay-contribution.ts +53 -0
- package/src/host/lib/topology.ts +174 -0
- package/src/index.ts +58 -0
- package/src/orchestrator-adapter/index.ts +2 -0
- package/src/orchestrator-adapter/lib/orchestrator-adapter-registry.ts +8 -0
- package/src/orchestrator-adapter/lib/orchestrator-adapter.ts +20 -0
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// Content walker — resolves a manifest's content directories to absolute
|
|
3
|
+
// file paths. Used by:
|
|
4
|
+
// - server-side seeders (enumerate + parse files at boot)
|
|
5
|
+
// - in-biome install functions (when they need to register imperative
|
|
6
|
+
// content alongside declarative content)
|
|
7
|
+
//
|
|
8
|
+
// All paths returned are absolute. Paths declared in xema-biome.json are
|
|
9
|
+
// resolved relative to the biome package root (the directory containing
|
|
10
|
+
// the manifest). Symbolic links are followed; hidden files (basename
|
|
11
|
+
// starting with `.`) are skipped.
|
|
12
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
13
|
+
|
|
14
|
+
import type { Dirent } from 'node:fs';
|
|
15
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
16
|
+
import { dirname, join, resolve } from 'node:path';
|
|
17
|
+
import { fileURLToPath } from 'node:url';
|
|
18
|
+
|
|
19
|
+
import * as YAML from 'js-yaml';
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
contentKindToDir,
|
|
23
|
+
isServerBiomeManifest,
|
|
24
|
+
type BiomeManifest,
|
|
25
|
+
} from '../../host';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Content kinds backed by a directory of YAML/Markdown files. Kept as a
|
|
29
|
+
* free-form string alias because callers pass directory-token strings
|
|
30
|
+
* from `xema-biome.json` (the closed enum surface is `ContributionKind`
|
|
31
|
+
* — this helper bridges to the on-disk directory layout). Unknown tokens
|
|
32
|
+
* fail fast in `contentKindToDir`.
|
|
33
|
+
*/
|
|
34
|
+
export type ContentKind = string;
|
|
35
|
+
|
|
36
|
+
/** File extensions per content kind (used to filter walk results). */
|
|
37
|
+
const CONTENT_KIND_EXTENSIONS: Readonly<Record<ContentKind, readonly string[]>> = {
|
|
38
|
+
agents: ['.md'],
|
|
39
|
+
workspaceManifests: ['.yaml', '.yml'],
|
|
40
|
+
workspaceManifestTemplates: ['.hbs', '.yaml', '.yml'],
|
|
41
|
+
toolProfiles: ['.yaml', '.yml'],
|
|
42
|
+
mcpCatalog: ['.yaml', '.yml'],
|
|
43
|
+
mcpTools: ['.yaml', '.yml', '.json'],
|
|
44
|
+
// OpenCode skills are folders containing SKILL.md — walker returns the
|
|
45
|
+
// SKILL.md path; callers can dirname() if they need the folder.
|
|
46
|
+
openCodeSkills: ['.md'],
|
|
47
|
+
openCodeTools: ['.ts', '.js', '.mjs'],
|
|
48
|
+
openCodePlugins: ['.ts', '.js', '.mjs'],
|
|
49
|
+
roleCapabilities: ['.yaml', '.yml'],
|
|
50
|
+
workflowConfig: ['.yaml', '.yml'],
|
|
51
|
+
deliverableSpecs: ['.yaml', '.yml', '.md', '.json'],
|
|
52
|
+
artifactTypes: ['.yaml', '.yml'],
|
|
53
|
+
biomeInstallSchema: ['.json'],
|
|
54
|
+
icons: ['.svg'],
|
|
55
|
+
projectKits: ['.yaml', '.yml'],
|
|
56
|
+
provisioningScaffolds: ['.yaml', '.yml', '.json'],
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Resolve a biome's package root from `import.meta.url` (the biome's
|
|
61
|
+
* src/index.ts). Walks upward until it finds a `xema-biome.json` —
|
|
62
|
+
* works for both the source layout (`biomes/<tier>/<id>/src/index.ts`)
|
|
63
|
+
* and the built layout (`biomes/<tier>/<id>/dist/index.js`).
|
|
64
|
+
*/
|
|
65
|
+
export function resolvePluginRoot(importMetaUrl: string): string {
|
|
66
|
+
let dir = dirname(fileURLToPath(importMetaUrl));
|
|
67
|
+
// Walk up to 5 levels max to avoid runaway. Real layout never needs more than 2.
|
|
68
|
+
for (let i = 0; i < 5; i++) {
|
|
69
|
+
if (existsSync(join(dir, 'xema-biome.json'))) {
|
|
70
|
+
return dir;
|
|
71
|
+
}
|
|
72
|
+
const parent = dirname(dir);
|
|
73
|
+
if (parent === dir) break;
|
|
74
|
+
dir = parent;
|
|
75
|
+
}
|
|
76
|
+
throw new Error(
|
|
77
|
+
`resolvePluginRoot: could not locate xema-biome.json walking up from ${importMetaUrl}`,
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Resolve the absolute directory for a given content kind, or `null` if
|
|
83
|
+
* the manifest does not ship that kind. Web manifests have no content
|
|
84
|
+
* directories — callers always pass server manifests; we return `null`
|
|
85
|
+
* for web manifests instead of throwing so seeders that scan a mixed
|
|
86
|
+
* tree don't need their own target check.
|
|
87
|
+
*
|
|
88
|
+
* Path is conventional: `<biomeRoot>/<contentKindToDir(kind)>/`.
|
|
89
|
+
*/
|
|
90
|
+
export function resolveContentDir(
|
|
91
|
+
biomeRoot: string,
|
|
92
|
+
manifest: BiomeManifest,
|
|
93
|
+
kind: ContentKind,
|
|
94
|
+
): string | null {
|
|
95
|
+
if (!isServerBiomeManifest(manifest)) return null;
|
|
96
|
+
const ships = manifest.xema.ships?.content ?? [];
|
|
97
|
+
if (!ships.includes(kind)) return null;
|
|
98
|
+
return resolve(biomeRoot, contentKindToDir(kind));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface ContentFile {
|
|
102
|
+
/** Absolute path to the file. */
|
|
103
|
+
readonly absolutePath: string;
|
|
104
|
+
/** File basename (e.g. `build.md`). */
|
|
105
|
+
readonly basename: string;
|
|
106
|
+
/** Slug derived by stripping the extension. */
|
|
107
|
+
readonly slug: string;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Walk every biome under the given scan roots for a single content kind.
|
|
112
|
+
*
|
|
113
|
+
* Each scan root is a directory containing biome folders (e.g.
|
|
114
|
+
* `biomes/kernel`, `biomes/platform`). For each subdirectory:
|
|
115
|
+
* 1. Parse `xema-biome.json` (skip if missing).
|
|
116
|
+
* 2. Resolve the manifest's `content[kind]` path (skip if not declared).
|
|
117
|
+
* 3. `walkContent()` that directory for the kind's extensions.
|
|
118
|
+
*
|
|
119
|
+
* Returns a flat list, each entry tagged with the originating biome id
|
|
120
|
+
* so seeders can attribute the row in DB upserts. Order is stable:
|
|
121
|
+
* scan-roots are visited in the supplied order; within a root, biomes
|
|
122
|
+
* are visited alphabetically.
|
|
123
|
+
*
|
|
124
|
+
* Used by every per-service seeder (mcp-catalog, tool-profile,
|
|
125
|
+
* agent-session-profile, …) so the FS-discovery path stays DRY.
|
|
126
|
+
*/
|
|
127
|
+
export function enumerateContentAcrossBiomeTree(
|
|
128
|
+
scanRoots: readonly string[],
|
|
129
|
+
kind: ContentKind,
|
|
130
|
+
): Array<ContentFile & { biomeId: string; biomeRoot: string }> {
|
|
131
|
+
const out: Array<ContentFile & { biomeId: string; biomeRoot: string }> = [];
|
|
132
|
+
for (const root of scanRoots) {
|
|
133
|
+
if (!existsSync(root)) continue;
|
|
134
|
+
let entries: Dirent[];
|
|
135
|
+
try {
|
|
136
|
+
entries = readdirSync(root, { withFileTypes: true }) as Dirent[];
|
|
137
|
+
} catch {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const subdirs = entries
|
|
141
|
+
.filter((e) => e.isDirectory())
|
|
142
|
+
.map((e) => e.name)
|
|
143
|
+
.sort();
|
|
144
|
+
for (const dirName of subdirs) {
|
|
145
|
+
const biomeRoot = join(root, dirName);
|
|
146
|
+
const manifestPath = join(biomeRoot, 'xema-biome.json');
|
|
147
|
+
if (!existsSync(manifestPath)) continue;
|
|
148
|
+
let raw: unknown;
|
|
149
|
+
try {
|
|
150
|
+
raw = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
151
|
+
} catch {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
// We intentionally do NOT call `parseBiomeManifest` here — this
|
|
155
|
+
// helper is used during seeder boot, where a malformed manifest
|
|
156
|
+
// should be flagged by biome-host's own validation rather than
|
|
157
|
+
// crashing every consumer. Callers receive only well-formed entries
|
|
158
|
+
// because resolveContentDir returns null for missing/invalid kinds
|
|
159
|
+
// and for non-server manifests.
|
|
160
|
+
const shape = raw as {
|
|
161
|
+
xema?: {
|
|
162
|
+
id?: string;
|
|
163
|
+
target?: string;
|
|
164
|
+
ships?: { content?: readonly string[] };
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
const biomeId = shape?.xema?.id;
|
|
168
|
+
if (typeof biomeId !== 'string') continue;
|
|
169
|
+
if (shape.xema?.target !== 'server') continue;
|
|
170
|
+
const dir = resolveContentDir(biomeRoot, raw as BiomeManifest, kind);
|
|
171
|
+
if (!dir) continue;
|
|
172
|
+
for (const file of walkContent(dir, kind)) {
|
|
173
|
+
out.push({ ...file, biomeId, biomeRoot });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export interface BiomeContentBinding {
|
|
181
|
+
/** Biome id from `xema-biome.json` `xema.id`. */
|
|
182
|
+
readonly biomeId: string;
|
|
183
|
+
/** Absolute path to the biome package root (containing the manifest). */
|
|
184
|
+
readonly biomeRoot: string;
|
|
185
|
+
/** Absolute path to the resolved content directory for the requested kind. */
|
|
186
|
+
readonly contentDir: string;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Walk every biome under the given scan roots and return a binding for
|
|
191
|
+
* each biome that declares the requested content kind. Unlike
|
|
192
|
+
* `enumerateContentAcrossBiomeTree`, this does NOT list files — it
|
|
193
|
+
* returns the directory roots so callers with sub-directory conventions
|
|
194
|
+
* (e.g. `<contentDir>/actions/*.yaml` vs `<contentDir>/workflows/*.yaml`)
|
|
195
|
+
* can do their own walking.
|
|
196
|
+
*
|
|
197
|
+
* Order is stable: scan roots in supplied order; biomes alphabetically
|
|
198
|
+
* within each root. Biomes missing `xema-biome.json` or not declaring
|
|
199
|
+
* the kind are silently skipped.
|
|
200
|
+
*/
|
|
201
|
+
export function enumerateBiomesWithContent(
|
|
202
|
+
scanRoots: readonly string[],
|
|
203
|
+
kind: ContentKind,
|
|
204
|
+
): BiomeContentBinding[] {
|
|
205
|
+
const out: BiomeContentBinding[] = [];
|
|
206
|
+
for (const root of scanRoots) {
|
|
207
|
+
if (!existsSync(root)) continue;
|
|
208
|
+
let entries: Dirent[];
|
|
209
|
+
try {
|
|
210
|
+
entries = readdirSync(root, { withFileTypes: true }) as Dirent[];
|
|
211
|
+
} catch {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
const subdirs = entries
|
|
215
|
+
.filter((e) => e.isDirectory())
|
|
216
|
+
.map((e) => e.name)
|
|
217
|
+
.sort();
|
|
218
|
+
for (const dirName of subdirs) {
|
|
219
|
+
const biomeRoot = join(root, dirName);
|
|
220
|
+
const manifestPath = join(biomeRoot, 'xema-biome.json');
|
|
221
|
+
if (!existsSync(manifestPath)) continue;
|
|
222
|
+
let raw: unknown;
|
|
223
|
+
try {
|
|
224
|
+
raw = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
225
|
+
} catch {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
const shape = raw as {
|
|
229
|
+
xema?: { id?: string; target?: string };
|
|
230
|
+
};
|
|
231
|
+
const biomeId = shape?.xema?.id;
|
|
232
|
+
if (typeof biomeId !== 'string') continue;
|
|
233
|
+
if (shape.xema?.target !== 'server') continue;
|
|
234
|
+
const contentDir = resolveContentDir(biomeRoot, raw as BiomeManifest, kind);
|
|
235
|
+
if (!contentDir) continue;
|
|
236
|
+
if (!existsSync(contentDir)) continue;
|
|
237
|
+
out.push({ biomeId, biomeRoot, contentDir });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return out;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Resolve server-biome scan roots. Two-tier lookup — fail-fast on
|
|
245
|
+
* misconfiguration, no silent fallbacks:
|
|
246
|
+
*
|
|
247
|
+
* 1. `XEMA_BIOME_SCAN_ROOTS_SERVER` env (CSV of absolute paths) —
|
|
248
|
+
* explicit, required in any non-monorepo environment (prod, CI,
|
|
249
|
+
* Docker). Every consuming service MUST set it in its Helm /
|
|
250
|
+
* compose config; missing env in those environments is a critical
|
|
251
|
+
* misconfiguration that crashes the seeder loudly so it's caught
|
|
252
|
+
* at first deploy, not after silent under-seeding.
|
|
253
|
+
* 2. Monorepo dev fallback — walk up from `cwd` looking for a
|
|
254
|
+
* `pnpm-workspace.yaml` next to a `biomes/` tree. Active only
|
|
255
|
+
* when running from inside the source repo.
|
|
256
|
+
*
|
|
257
|
+
* Throwing on missing config is intentional. We intentionally do NOT
|
|
258
|
+
* fall back to a container path like `/app/biomes/` — that would
|
|
259
|
+
* silently mask a missing env var in production, which is precisely
|
|
260
|
+
* the failure mode this contract exists to prevent.
|
|
261
|
+
*/
|
|
262
|
+
export function resolveDefaultBiomeScanRoots(cwd: string = process.cwd()): string[] {
|
|
263
|
+
const envOverride = process.env.XEMA_BIOME_SCAN_ROOTS_SERVER;
|
|
264
|
+
if (envOverride && envOverride.length > 0) {
|
|
265
|
+
return envOverride
|
|
266
|
+
.split(',')
|
|
267
|
+
.map((p) => p.trim())
|
|
268
|
+
.filter((p) => p.length > 0);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Monorepo dev fallback.
|
|
272
|
+
let cursor = cwd;
|
|
273
|
+
for (let i = 0; i < 8; i++) {
|
|
274
|
+
if (
|
|
275
|
+
existsSync(join(cursor, 'biomes')) &&
|
|
276
|
+
existsSync(join(cursor, 'pnpm-workspace.yaml'))
|
|
277
|
+
) {
|
|
278
|
+
return [join(cursor, 'biomes', 'kernel'), join(cursor, 'biomes', 'platform')];
|
|
279
|
+
}
|
|
280
|
+
const parent = dirname(cursor);
|
|
281
|
+
if (parent === cursor) break;
|
|
282
|
+
cursor = parent;
|
|
283
|
+
}
|
|
284
|
+
throw new Error(
|
|
285
|
+
`resolveDefaultBiomeScanRoots: XEMA_BIOME_SCAN_ROOTS_SERVER is unset and no ` +
|
|
286
|
+
`monorepo workspace was found walking up from ${cwd}. Every service that ` +
|
|
287
|
+
`consumes biome content (artifact-store-api, deliverable-specs-api, ` +
|
|
288
|
+
`workflow-engine-api, llm-registry-api, biome-host-api) MUST declare ` +
|
|
289
|
+
`XEMA_BIOME_SCAN_ROOTS_SERVER in its Helm + docker-compose env; this ` +
|
|
290
|
+
`error means a deployment is missing that config.`,
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Walk a content directory for a given kind, returning every file whose
|
|
296
|
+
* extension matches the kind. Returns [] if the directory does not exist
|
|
297
|
+
* (so callers do not need to existsSync first). Throws if the directory
|
|
298
|
+
* exists but is not readable.
|
|
299
|
+
*/
|
|
300
|
+
export function walkContent(contentDir: string, kind: ContentKind): ContentFile[] {
|
|
301
|
+
if (!existsSync(contentDir)) return [];
|
|
302
|
+
const exts = CONTENT_KIND_EXTENSIONS[kind];
|
|
303
|
+
if (!exts) {
|
|
304
|
+
throw new Error(
|
|
305
|
+
`walkContent: unknown legacy content kind "${kind}". ` +
|
|
306
|
+
`Extend CONTENT_KIND_EXTENSIONS or migrate the caller to the xema.contributions protocol.`,
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
const out: ContentFile[] = [];
|
|
310
|
+
|
|
311
|
+
const stack: string[] = [contentDir];
|
|
312
|
+
while (stack.length > 0) {
|
|
313
|
+
const current = stack.pop();
|
|
314
|
+
if (!current) break;
|
|
315
|
+
let entries: Dirent[];
|
|
316
|
+
try {
|
|
317
|
+
entries = readdirSync(current, { withFileTypes: true }) as Dirent[];
|
|
318
|
+
} catch (err) {
|
|
319
|
+
throw new Error(
|
|
320
|
+
`walkContent: failed to read ${current}: ${(err as Error).message}`,
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
for (const entry of entries) {
|
|
324
|
+
if (entry.name.startsWith('.')) continue;
|
|
325
|
+
const full = join(current, entry.name);
|
|
326
|
+
if (entry.isDirectory()) {
|
|
327
|
+
// Skills are folder-shaped (SKILL.md inside) — recurse.
|
|
328
|
+
if (kind === 'openCodeSkills' || kind === 'deliverableSpecs') {
|
|
329
|
+
stack.push(full);
|
|
330
|
+
}
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
if (!entry.isFile() && !entry.isSymbolicLink()) continue;
|
|
334
|
+
// Defensive: resolve symlinks to a real file before checking extension.
|
|
335
|
+
try {
|
|
336
|
+
const stat = statSync(full);
|
|
337
|
+
if (!stat.isFile()) continue;
|
|
338
|
+
} catch {
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
if (!exts.some((ext) => entry.name.endsWith(ext))) continue;
|
|
342
|
+
const slug = stripExtension(entry.name);
|
|
343
|
+
out.push({ absolutePath: full, basename: entry.name, slug });
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Stable ordering for reproducible seed runs.
|
|
347
|
+
out.sort((a, b) => a.absolutePath.localeCompare(b.absolutePath));
|
|
348
|
+
return out;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function stripExtension(basename: string): string {
|
|
352
|
+
const dot = basename.lastIndexOf('.');
|
|
353
|
+
if (dot <= 0) return basename;
|
|
354
|
+
return basename.slice(0, dot);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// ── YAML/Markdown parsing ──────────────────────────────────────────────
|
|
358
|
+
|
|
359
|
+
const FRONTMATTER_REGEX = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
|
|
360
|
+
|
|
361
|
+
export function readYamlFile(path: string): unknown {
|
|
362
|
+
const raw = readFileSync(path, 'utf-8');
|
|
363
|
+
return YAML.load(raw);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Parse a markdown file with YAML frontmatter. Returns `null` for the
|
|
368
|
+
* frontmatter half if the file has none — callers should fail fast in
|
|
369
|
+
* that case (every Xema agent .md file MUST have frontmatter).
|
|
370
|
+
*/
|
|
371
|
+
export function readMarkdownWithFrontmatter(path: string): {
|
|
372
|
+
frontmatter: unknown;
|
|
373
|
+
body: string;
|
|
374
|
+
} {
|
|
375
|
+
const raw = readFileSync(path, 'utf-8');
|
|
376
|
+
const match = raw.match(FRONTMATTER_REGEX);
|
|
377
|
+
if (!match) {
|
|
378
|
+
return { frontmatter: null, body: raw };
|
|
379
|
+
}
|
|
380
|
+
const yamlPart = match[1] ?? '';
|
|
381
|
+
const body = match[2] ?? '';
|
|
382
|
+
return { frontmatter: YAML.load(yamlPart), body };
|
|
383
|
+
}
|