@lesliechan721/aw 0.1.0-beta.6 → 0.1.0-beta.60
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/dist/authoring/assets/aw-config.mjs +100 -501
- package/dist/authoring/assets/aw-config.mjs.map +1 -1
- package/dist/authoring/assets/aw-runtime-config.d.mts +13 -0
- package/dist/authoring/assets/aw-runtime-config.mjs +199 -0
- package/dist/authoring/assets/aw-runtime-config.mjs.map +1 -0
- package/dist/authoring/scripts/add-skill.mjs +4 -4
- package/dist/authoring/scripts/add-skill.mjs.map +1 -1
- package/dist/authoring/scripts/init-plugin.mjs +67 -97
- package/dist/authoring/scripts/init-plugin.mjs.map +1 -1
- package/dist/authoring/scripts/lib/plugin-root.mjs +4 -4
- package/dist/authoring/scripts/lib/plugin-root.mjs.map +1 -1
- package/dist/authoring/scripts/lib/plugin-version-check.d.mts +1 -0
- package/dist/authoring/scripts/lib/plugin-version-check.mjs +229 -8
- package/dist/authoring/scripts/lib/plugin-version-check.mjs.map +1 -1
- package/dist/authoring/scripts/lib/skill-scaffold.d.mts +77 -92
- package/dist/authoring/scripts/lib/skill-scaffold.mjs +99 -124
- package/dist/authoring/scripts/lib/skill-scaffold.mjs.map +1 -1
- package/dist/authoring/scripts/plugin-status.mjs +8 -11
- package/dist/authoring/scripts/plugin-status.mjs.map +1 -1
- package/dist/authoring/scripts/remove-plugin.mjs +3 -2
- package/dist/authoring/scripts/remove-plugin.mjs.map +1 -1
- package/dist/authoring/scripts/validate-plugin.mjs +552 -1142
- package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
- package/dist/native-runtime/reader-runtime.mjs +34 -0
- package/dist/native-runtime/reader.d.mts +6 -0
- package/dist/native-runtime/reader.mjs +11 -0
- package/dist/scripts/aw-skill-eval-materializer.d.ts +26 -0
- package/dist/scripts/aw-skill-eval-materializer.js +306 -0
- package/dist/scripts/aw-skill-eval-materializer.js.map +1 -0
- package/dist/scripts/bundle-plugins.d.ts +1 -0
- package/dist/scripts/bundle-plugins.js +19 -8
- package/dist/scripts/bundle-plugins.js.map +1 -1
- package/dist/scripts/plugin-staging.d.ts +7 -9
- package/dist/scripts/plugin-staging.js +18 -29
- package/dist/scripts/plugin-staging.js.map +1 -1
- package/dist/scripts/plugin-test-reporter.d.mts +2 -0
- package/dist/scripts/plugin-test-reporter.mjs +21 -0
- package/dist/scripts/plugin-test-reporter.mjs.map +1 -0
- package/dist/scripts/test-plugin-scripts.d.ts +5 -0
- package/dist/scripts/test-plugin-scripts.js +208 -89
- package/dist/scripts/test-plugin-scripts.js.map +1 -1
- package/dist/scripts/test-workers.d.mts +24 -0
- package/dist/scripts/test-workers.mjs +59 -0
- package/dist/scripts/test-workers.mjs.map +1 -0
- package/dist/src/adapters/helpers.d.ts +7 -0
- package/dist/src/adapters/helpers.js +2 -2
- package/dist/src/adapters/helpers.js.map +1 -1
- package/dist/src/authoring/workspace-commands.d.ts +19 -1
- package/dist/src/authoring/workspace-commands.js +24 -5
- package/dist/src/authoring/workspace-commands.js.map +1 -1
- package/dist/src/commands/aw-capabilities.d.ts +78 -0
- package/dist/src/commands/aw-capabilities.js +266 -0
- package/dist/src/commands/aw-capabilities.js.map +1 -0
- package/dist/src/commands/catalog-dev-source.d.ts +154 -0
- package/dist/src/commands/catalog-dev-source.js +655 -0
- package/dist/src/commands/catalog-dev-source.js.map +1 -0
- package/dist/src/commands/catalog-generation.d.ts +21 -0
- package/dist/src/commands/catalog-generation.js +9 -0
- package/dist/src/commands/catalog-generation.js.map +1 -0
- package/dist/src/commands/catalog-publication-inspection.d.ts +71 -30
- package/dist/src/commands/catalog-publication-inspection.js +475 -63
- package/dist/src/commands/catalog-publication-inspection.js.map +1 -1
- package/dist/src/commands/catalog-publication-journal.d.ts +68 -0
- package/dist/src/commands/catalog-publication-journal.js +292 -0
- package/dist/src/commands/catalog-publication-journal.js.map +1 -0
- package/dist/src/commands/catalog-publication-target.d.ts +18 -0
- package/dist/src/commands/catalog-publication-target.js +95 -0
- package/dist/src/commands/catalog-publication-target.js.map +1 -0
- package/dist/src/commands/catalog-publish.d.ts +73 -15
- package/dist/src/commands/catalog-publish.js +701 -212
- package/dist/src/commands/catalog-publish.js.map +1 -1
- package/dist/src/commands/catalog-source.d.ts +60 -22
- package/dist/src/commands/catalog-source.js +311 -91
- package/dist/src/commands/catalog-source.js.map +1 -1
- package/dist/src/commands/catalog-status.d.ts +18 -22
- package/dist/src/commands/catalog-status.js +81 -115
- package/dist/src/commands/catalog-status.js.map +1 -1
- package/dist/src/commands/catalog-store.d.ts +104 -0
- package/dist/src/commands/catalog-store.js +685 -0
- package/dist/src/commands/catalog-store.js.map +1 -0
- package/dist/src/commands/catalog-workspace-resolution.d.ts +13 -0
- package/dist/src/commands/catalog-workspace-resolution.js +42 -0
- package/dist/src/commands/catalog-workspace-resolution.js.map +1 -0
- package/dist/src/commands/console.js +28 -17
- package/dist/src/commands/console.js.map +1 -1
- package/dist/src/commands/dependency-operation-plan.d.ts +52 -15
- package/dist/src/commands/dependency-operation-plan.js +289 -7
- package/dist/src/commands/dependency-operation-plan.js.map +1 -1
- package/dist/src/commands/init.d.ts +5 -11
- package/dist/src/commands/init.js +30 -51
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/managed-commands.d.ts +28 -0
- package/dist/src/commands/managed-commands.js +315 -0
- package/dist/src/commands/managed-commands.js.map +1 -0
- package/dist/src/commands/offline-cleanup-evidence.d.ts +67 -0
- package/dist/src/commands/offline-cleanup-evidence.js +181 -0
- package/dist/src/commands/offline-cleanup-evidence.js.map +1 -0
- package/dist/src/commands/operation-plan.d.ts +182 -0
- package/dist/src/commands/operation-plan.js +71 -0
- package/dist/src/commands/operation-plan.js.map +1 -0
- package/dist/src/commands/operation-planner.d.ts +47 -0
- package/dist/src/commands/operation-planner.js +142 -0
- package/dist/src/commands/operation-planner.js.map +1 -0
- package/dist/src/commands/options.d.ts +9 -7
- package/dist/src/commands/options.js +83 -21
- package/dist/src/commands/options.js.map +1 -1
- package/dist/src/commands/plugin-capabilities.js +65 -4
- package/dist/src/commands/plugin-capabilities.js.map +1 -1
- package/dist/src/commands/rebuild-command.d.ts +78 -31
- package/dist/src/commands/rebuild-command.js +5229 -942
- package/dist/src/commands/rebuild-command.js.map +1 -1
- package/dist/src/commands/rebuild-integration.d.ts +143 -21
- package/dist/src/commands/rebuild-integration.js +3384 -1342
- package/dist/src/commands/rebuild-integration.js.map +1 -1
- package/dist/src/commands/rebuild-operations.d.ts +60 -30
- package/dist/src/commands/rebuild-operations.js +267 -320
- package/dist/src/commands/rebuild-operations.js.map +1 -1
- package/dist/src/commands/reconcile-operation-plan.d.ts +28 -0
- package/dist/src/commands/reconcile-operation-plan.js +47 -0
- package/dist/src/commands/reconcile-operation-plan.js.map +1 -0
- package/dist/src/commands/review-inspection.d.ts +60 -0
- package/dist/src/commands/review-inspection.js +422 -0
- package/dist/src/commands/review-inspection.js.map +1 -0
- package/dist/src/commands/review-preparation.d.ts +49 -0
- package/dist/src/commands/review-preparation.js +427 -0
- package/dist/src/commands/review-preparation.js.map +1 -0
- package/dist/src/commands/runtime.d.ts +1 -5
- package/dist/src/commands/runtime.js +27 -53
- package/dist/src/commands/runtime.js.map +1 -1
- package/dist/src/commands/skill-eval.d.ts +39 -0
- package/dist/src/commands/skill-eval.js +400 -0
- package/dist/src/commands/skill-eval.js.map +1 -0
- package/dist/src/commands/status-v6.d.ts +279 -0
- package/dist/src/commands/status-v6.js +2785 -0
- package/dist/src/commands/status-v6.js.map +1 -0
- package/dist/src/commands/sync-command.d.ts +40 -0
- package/dist/src/commands/sync-command.js +254 -0
- package/dist/src/commands/sync-command.js.map +1 -0
- package/dist/src/commands/wizard.d.ts +8 -5
- package/dist/src/commands/wizard.js +6 -4
- package/dist/src/commands/wizard.js.map +1 -1
- package/dist/src/commands/write-commands.d.ts +9 -3
- package/dist/src/commands/write-commands.js +136 -31
- package/dist/src/commands/write-commands.js.map +1 -1
- package/dist/src/constants.d.ts +7 -2
- package/dist/src/constants.js +7 -2
- package/dist/src/constants.js.map +1 -1
- package/dist/src/eval/manifest-v1.d.ts +68 -0
- package/dist/src/eval/manifest-v1.js +353 -0
- package/dist/src/eval/manifest-v1.js.map +1 -0
- package/dist/src/generators/local-plugin.d.ts +5 -1
- package/dist/src/generators/local-plugin.js +261 -109
- package/dist/src/generators/local-plugin.js.map +1 -1
- package/dist/src/generators/permissions.d.ts +5 -2
- package/dist/src/generators/permissions.js +28 -15
- package/dist/src/generators/permissions.js.map +1 -1
- package/dist/src/index.d.ts +10 -4
- package/dist/src/index.js +1774 -609
- package/dist/src/index.js.map +1 -1
- package/dist/src/output/command-receipt.d.ts +47 -46
- package/dist/src/output/command-receipt.js +277 -79
- package/dist/src/output/command-receipt.js.map +1 -1
- package/dist/src/output/model.d.ts +3 -44
- package/dist/src/output/model.js +1 -144
- package/dist/src/output/model.js.map +1 -1
- package/dist/src/output/rebuild-progress.js +15 -13
- package/dist/src/output/rebuild-progress.js.map +1 -1
- package/dist/src/portable/commands.d.ts +46 -7
- package/dist/src/portable/commands.js +349 -37
- package/dist/src/portable/commands.js.map +1 -1
- package/dist/src/portable/materializer.d.ts +17 -4
- package/dist/src/portable/materializer.js +186 -41
- package/dist/src/portable/materializer.js.map +1 -1
- package/dist/src/portable/skills-cli.d.ts +15 -7
- package/dist/src/portable/skills-cli.js +74 -20
- package/dist/src/portable/skills-cli.js.map +1 -1
- package/dist/src/review/eval-source-input.d.ts +43 -0
- package/dist/src/review/eval-source-input.js +207 -0
- package/dist/src/review/eval-source-input.js.map +1 -0
- package/dist/src/review/review-profile.d.ts +17 -0
- package/dist/src/review/review-profile.js +234 -0
- package/dist/src/review/review-profile.js.map +1 -0
- package/dist/src/review/review-selection.d.ts +30 -0
- package/dist/src/review/review-selection.js +527 -0
- package/dist/src/review/review-selection.js.map +1 -0
- package/dist/src/review/review-types.d.ts +68 -0
- package/dist/src/review/review-types.js +16 -0
- package/dist/src/review/review-types.js.map +1 -0
- package/dist/src/review/skill-materialization.d.ts +26 -0
- package/dist/src/review/skill-materialization.js +217 -0
- package/dist/src/review/skill-materialization.js.map +1 -0
- package/dist/src/review/source-binding.d.ts +183 -0
- package/dist/src/review/source-binding.js +708 -0
- package/dist/src/review/source-binding.js.map +1 -0
- package/dist/src/tui/catalog-freshness.d.ts +1 -0
- package/dist/src/tui/catalog-freshness.js +2 -0
- package/dist/src/tui/catalog-freshness.js.map +1 -0
- package/dist/src/tui/catalog-generation.d.ts +21 -0
- package/dist/src/tui/catalog-generation.js +156 -0
- package/dist/src/tui/catalog-generation.js.map +1 -0
- package/dist/src/tui/catalog-sources/projection.d.ts +4 -0
- package/dist/src/tui/catalog-sources/projection.js +17 -0
- package/dist/src/tui/catalog-sources/projection.js.map +1 -0
- package/dist/src/tui/catalog-sources/review.d.ts +3 -0
- package/dist/src/tui/catalog-sources/review.js +13 -0
- package/dist/src/tui/catalog-sources/review.js.map +1 -0
- package/dist/src/tui/catalog-sources/screens.d.ts +12 -0
- package/dist/src/tui/catalog-sources/screens.js +40 -0
- package/dist/src/tui/catalog-sources/screens.js.map +1 -0
- package/dist/src/tui/catalog-sources/session.d.ts +32 -0
- package/dist/src/tui/catalog-sources/session.js +300 -0
- package/dist/src/tui/catalog-sources/session.js.map +1 -0
- package/dist/src/tui/catalog-sources/types.d.ts +54 -0
- package/dist/src/tui/catalog-sources/types.js +2 -0
- package/dist/src/tui/catalog-sources/types.js.map +1 -0
- package/dist/src/tui/catalog-store-task.d.ts +16 -0
- package/dist/src/tui/catalog-store-task.js +19 -0
- package/dist/src/tui/catalog-store-task.js.map +1 -0
- package/dist/src/tui/clipboard.d.ts +13 -0
- package/dist/src/tui/clipboard.js +95 -0
- package/dist/src/tui/clipboard.js.map +1 -0
- package/dist/src/tui/components.d.ts +110 -3
- package/dist/src/tui/components.js +183 -36
- package/dist/src/tui/components.js.map +1 -1
- package/dist/src/tui/config-array-draft.d.ts +29 -0
- package/dist/src/tui/config-array-draft.js +48 -0
- package/dist/src/tui/config-array-draft.js.map +1 -0
- package/dist/src/tui/config-leaf-editor.d.ts +19 -0
- package/dist/src/tui/config-leaf-editor.js +212 -0
- package/dist/src/tui/config-leaf-editor.js.map +1 -0
- package/dist/src/tui/config-references.d.ts +34 -0
- package/dist/src/tui/config-references.js +70 -0
- package/dist/src/tui/config-references.js.map +1 -0
- package/dist/src/tui/config-value-presentation.d.ts +20 -0
- package/dist/src/tui/config-value-presentation.js +104 -0
- package/dist/src/tui/config-value-presentation.js.map +1 -0
- package/dist/src/tui/console-app-v4.d.ts +14 -4
- package/dist/src/tui/console-app-v4.js +9205 -1951
- package/dist/src/tui/console-app-v4.js.map +1 -1
- package/dist/src/tui/content-item-card.d.ts +13 -0
- package/dist/src/tui/content-item-card.js +51 -0
- package/dist/src/tui/content-item-card.js.map +1 -0
- package/dist/src/tui/controller-runtime.d.ts +10 -2
- package/dist/src/tui/controller-runtime.js +3289 -388
- package/dist/src/tui/controller-runtime.js.map +1 -1
- package/dist/src/tui/controller.d.ts +622 -45
- package/dist/src/tui/controller.js +3589 -768
- package/dist/src/tui/controller.js.map +1 -1
- package/dist/src/tui/dependency-graph-view.d.ts +39 -0
- package/dist/src/tui/dependency-graph-view.js +121 -0
- package/dist/src/tui/dependency-graph-view.js.map +1 -0
- package/dist/src/tui/dependency-graph.d.ts +81 -0
- package/dist/src/tui/dependency-graph.js +452 -0
- package/dist/src/tui/dependency-graph.js.map +1 -0
- package/dist/src/tui/diagnostic-projection.d.ts +23 -0
- package/dist/src/tui/diagnostic-projection.js +595 -0
- package/dist/src/tui/diagnostic-projection.js.map +1 -0
- package/dist/src/tui/diagnostics.d.ts +3 -3
- package/dist/src/tui/diagnostics.js +14 -2
- package/dist/src/tui/diagnostics.js.map +1 -1
- package/dist/src/tui/entity-cards.d.ts +55 -0
- package/dist/src/tui/entity-cards.js +220 -0
- package/dist/src/tui/entity-cards.js.map +1 -0
- package/dist/src/tui/glossary.d.ts +23 -0
- package/dist/src/tui/glossary.js +42 -0
- package/dist/src/tui/glossary.js.map +1 -0
- package/dist/src/tui/index.d.ts +6 -1
- package/dist/src/tui/index.js +5 -1
- package/dist/src/tui/index.js.map +1 -1
- package/dist/src/tui/input-display.d.ts +9 -0
- package/dist/src/tui/input-display.js +58 -0
- package/dist/src/tui/input-display.js.map +1 -0
- package/dist/src/tui/keys.d.ts +44 -0
- package/dist/src/tui/keys.js +43 -15
- package/dist/src/tui/keys.js.map +1 -1
- package/dist/src/tui/lifecycle-action-view.d.ts +6 -0
- package/dist/src/tui/lifecycle-action-view.js +36 -0
- package/dist/src/tui/lifecycle-action-view.js.map +1 -0
- package/dist/src/tui/model.d.ts +224 -31
- package/dist/src/tui/model.js +1510 -397
- package/dist/src/tui/model.js.map +1 -1
- package/dist/src/tui/operation-diagnostic-screens.d.ts +8 -0
- package/dist/src/tui/operation-diagnostic-screens.js +71 -0
- package/dist/src/tui/operation-diagnostic-screens.js.map +1 -0
- package/dist/src/tui/operation-history.d.ts +81 -0
- package/dist/src/tui/operation-history.js +136 -0
- package/dist/src/tui/operation-history.js.map +1 -0
- package/dist/src/tui/operation-review-planner.d.ts +21 -0
- package/dist/src/tui/operation-review-planner.js +1392 -0
- package/dist/src/tui/operation-review-planner.js.map +1 -0
- package/dist/src/tui/plugin-content.d.ts +31 -0
- package/dist/src/tui/plugin-content.js +680 -0
- package/dist/src/tui/plugin-content.js.map +1 -0
- package/dist/src/tui/plugin-detail.d.ts +52 -0
- package/dist/src/tui/plugin-detail.js +165 -0
- package/dist/src/tui/plugin-detail.js.map +1 -0
- package/dist/src/tui/plugin-write-task.d.ts +69 -0
- package/dist/src/tui/plugin-write-task.js +286 -0
- package/dist/src/tui/plugin-write-task.js.map +1 -0
- package/dist/src/tui/project-inventory.d.ts +68 -0
- package/dist/src/tui/project-inventory.js +203 -0
- package/dist/src/tui/project-inventory.js.map +1 -0
- package/dist/src/tui/prompt.js +4 -15
- package/dist/src/tui/prompt.js.map +1 -1
- package/dist/src/tui/query-header.d.ts +30 -0
- package/dist/src/tui/query-header.js +40 -0
- package/dist/src/tui/query-header.js.map +1 -0
- package/dist/src/tui/reader.d.ts +37 -0
- package/dist/src/tui/reader.js +47 -0
- package/dist/src/tui/reader.js.map +1 -0
- package/dist/src/tui/router.d.ts +197 -10
- package/dist/src/tui/router.js +338 -50
- package/dist/src/tui/router.js.map +1 -1
- package/dist/src/tui/screen-registry.d.ts +701 -0
- package/dist/src/tui/screen-registry.js +230 -0
- package/dist/src/tui/screen-registry.js.map +1 -0
- package/dist/src/tui/session-console-app.d.ts +6 -0
- package/dist/src/tui/session-console-app.js +13 -0
- package/dist/src/tui/session-console-app.js.map +1 -0
- package/dist/src/tui/session-host.d.ts +45 -0
- package/dist/src/tui/session-host.js +209 -0
- package/dist/src/tui/session-host.js.map +1 -0
- package/dist/src/tui/source-detail-card.d.ts +29 -0
- package/dist/src/tui/source-detail-card.js +45 -0
- package/dist/src/tui/source-detail-card.js.map +1 -0
- package/dist/src/tui/source-ref-presets.d.ts +3 -0
- package/dist/src/tui/source-ref-presets.js +11 -0
- package/dist/src/tui/source-ref-presets.js.map +1 -0
- package/dist/src/tui/theme.d.ts +12 -0
- package/dist/src/tui/theme.js +12 -0
- package/dist/src/tui/theme.js.map +1 -1
- package/dist/src/tui/viewport.d.ts +1 -0
- package/dist/src/tui/viewport.js +23 -0
- package/dist/src/tui/viewport.js.map +1 -1
- package/dist/src/tui/views.js +31 -3
- package/dist/src/tui/views.js.map +1 -1
- package/dist/src/tui/wizard.js +37 -13
- package/dist/src/tui/wizard.js.map +1 -1
- package/dist/src/types.d.ts +264 -21
- package/dist/src/types.js +1 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/agent-version.d.ts +7 -1
- package/dist/src/utils/agent-version.js +36 -7
- package/dist/src/utils/agent-version.js.map +1 -1
- package/dist/src/utils/artifact-plan.d.ts +8 -6
- package/dist/src/utils/artifact-plan.js +67 -13
- package/dist/src/utils/artifact-plan.js.map +1 -1
- package/dist/src/utils/artifact-renderer.d.ts +24 -10
- package/dist/src/utils/artifact-renderer.js +230 -220
- package/dist/src/utils/artifact-renderer.js.map +1 -1
- package/dist/src/utils/artifact-request.d.ts +32 -0
- package/dist/src/utils/artifact-request.js +90 -0
- package/dist/src/utils/artifact-request.js.map +1 -0
- package/dist/src/utils/artifact-sources.d.ts +4 -0
- package/dist/src/utils/artifact-sources.js +17 -0
- package/dist/src/utils/artifact-sources.js.map +1 -1
- package/dist/src/utils/aw-home-mutation-lock.d.ts +1 -0
- package/dist/src/utils/aw-home-mutation-lock.js +32 -4
- package/dist/src/utils/aw-home-mutation-lock.js.map +1 -1
- package/dist/src/utils/bundle-integrity.d.ts +0 -1
- package/dist/src/utils/bundle-integrity.js +0 -25
- package/dist/src/utils/bundle-integrity.js.map +1 -1
- package/dist/src/utils/bundle-layout.js +29 -29
- package/dist/src/utils/bundle-layout.js.map +1 -1
- package/dist/src/utils/catalog-capability-projection.d.ts +8 -0
- package/dist/src/utils/catalog-capability-projection.js +14 -0
- package/dist/src/utils/catalog-capability-projection.js.map +1 -0
- package/dist/src/utils/catalog-digests.d.ts +10 -0
- package/dist/src/utils/catalog-digests.js +57 -20
- package/dist/src/utils/catalog-digests.js.map +1 -1
- package/dist/src/utils/catalog-generation-control-snapshot.d.ts +11 -0
- package/dist/src/utils/catalog-generation-control-snapshot.js +45 -0
- package/dist/src/utils/catalog-generation-control-snapshot.js.map +1 -0
- package/dist/src/utils/catalog-generation-error.d.ts +16 -0
- package/dist/src/utils/catalog-generation-error.js +30 -0
- package/dist/src/utils/catalog-generation-error.js.map +1 -0
- package/dist/src/utils/catalog-generation-resolver.d.ts +44 -0
- package/dist/src/utils/catalog-generation-resolver.js +273 -0
- package/dist/src/utils/catalog-generation-resolver.js.map +1 -0
- package/dist/src/utils/catalog-generation-service.d.ts +172 -0
- package/dist/src/utils/catalog-generation-service.js +1271 -0
- package/dist/src/utils/catalog-generation-service.js.map +1 -0
- package/dist/src/utils/catalog-generation-state.d.ts +22 -0
- package/dist/src/utils/catalog-generation-state.js +192 -0
- package/dist/src/utils/catalog-generation-state.js.map +1 -0
- package/dist/src/utils/catalog-generation-store.d.ts +58 -0
- package/dist/src/utils/catalog-generation-store.js +452 -0
- package/dist/src/utils/catalog-generation-store.js.map +1 -0
- package/dist/src/utils/catalog-manifest-v7.d.ts +5 -0
- package/dist/src/utils/{catalog-manifest-v4.js → catalog-manifest-v7.js} +35 -43
- package/dist/src/utils/catalog-manifest-v7.js.map +1 -0
- package/dist/src/utils/catalog-operation-context.d.ts +20 -0
- package/dist/src/utils/catalog-operation-context.js +142 -0
- package/dist/src/utils/catalog-operation-context.js.map +1 -0
- package/dist/src/utils/catalog-public-error.d.ts +7 -3
- package/dist/src/utils/catalog-public-error.js +28 -8
- package/dist/src/utils/catalog-public-error.js.map +1 -1
- package/dist/src/utils/catalog-runtime-projection.d.ts +3 -0
- package/dist/src/utils/catalog-runtime-projection.js +5 -40
- package/dist/src/utils/catalog-runtime-projection.js.map +1 -1
- package/dist/src/utils/catalog-snapshot.d.ts +5 -3
- package/dist/src/utils/catalog-snapshot.js +11 -3
- package/dist/src/utils/catalog-snapshot.js.map +1 -1
- package/dist/src/utils/catalog-source-identity.d.ts +1 -0
- package/dist/src/utils/catalog-source-identity.js +21 -2
- package/dist/src/utils/catalog-source-identity.js.map +1 -1
- package/dist/src/utils/catalog-source-impact.d.ts +21 -0
- package/dist/src/utils/catalog-source-impact.js +344 -0
- package/dist/src/utils/catalog-source-impact.js.map +1 -0
- package/dist/src/utils/catalog-source-references.d.ts +3 -2
- package/dist/src/utils/catalog-source-references.js +195 -347
- package/dist/src/utils/catalog-source-references.js.map +1 -1
- package/dist/src/utils/catalog-sources.d.ts +15 -1
- package/dist/src/utils/catalog-sources.js +206 -27
- package/dist/src/utils/catalog-sources.js.map +1 -1
- package/dist/src/utils/claude-skills-root.d.ts +8 -0
- package/dist/src/utils/claude-skills-root.js +76 -0
- package/dist/src/utils/claude-skills-root.js.map +1 -0
- package/dist/src/utils/codex-config.d.ts +2 -0
- package/dist/src/utils/codex-config.js +26 -5
- package/dist/src/utils/codex-config.js.map +1 -1
- package/dist/src/utils/codex-manager.d.ts +79 -0
- package/dist/src/utils/codex-manager.js +735 -0
- package/dist/src/utils/codex-manager.js.map +1 -0
- package/dist/src/utils/codex-marketplace-path.d.ts +5 -0
- package/dist/src/utils/codex-marketplace-path.js +45 -0
- package/dist/src/utils/codex-marketplace-path.js.map +1 -0
- package/dist/src/utils/codex-native-observation.d.ts +49 -0
- package/dist/src/utils/codex-native-observation.js +154 -0
- package/dist/src/utils/codex-native-observation.js.map +1 -0
- package/dist/src/utils/codex-native-render-receipt.d.ts +40 -0
- package/dist/src/utils/codex-native-render-receipt.js +205 -0
- package/dist/src/utils/codex-native-render-receipt.js.map +1 -0
- package/dist/src/utils/codex-reconciler.d.ts +126 -0
- package/dist/src/utils/codex-reconciler.js +298 -0
- package/dist/src/utils/codex-reconciler.js.map +1 -0
- package/dist/src/utils/codex-shared-native.d.ts +43 -0
- package/dist/src/utils/codex-shared-native.js +81 -0
- package/dist/src/utils/codex-shared-native.js.map +1 -0
- package/dist/src/utils/codex-skill-staging.d.ts +2 -0
- package/dist/src/utils/codex-skill-staging.js.map +1 -1
- package/dist/src/utils/codex-skills-root.d.ts +4 -0
- package/dist/src/utils/codex-skills-root.js +25 -0
- package/dist/src/utils/codex-skills-root.js.map +1 -0
- package/dist/src/utils/codex-surface-analysis.d.ts +46 -0
- package/dist/src/utils/codex-surface-analysis.js +247 -0
- package/dist/src/utils/codex-surface-analysis.js.map +1 -0
- package/dist/src/utils/dynamic-skill-tree.d.ts +5 -0
- package/dist/src/utils/dynamic-skill-tree.js +56 -7
- package/dist/src/utils/dynamic-skill-tree.js.map +1 -1
- package/dist/src/utils/git-catalog-provider.d.ts +16 -0
- package/dist/src/utils/git-catalog-provider.js +177 -145
- package/dist/src/utils/git-catalog-provider.js.map +1 -1
- package/dist/src/utils/local-marketplace.d.ts +27 -1
- package/dist/src/utils/local-marketplace.js +434 -84
- package/dist/src/utils/local-marketplace.js.map +1 -1
- package/dist/src/utils/managed-command-closure.d.ts +3 -0
- package/dist/src/utils/managed-command-closure.js +35 -0
- package/dist/src/utils/managed-command-closure.js.map +1 -0
- package/dist/src/utils/managed-command-evidence.d.ts +7 -0
- package/dist/src/utils/managed-command-evidence.js +86 -0
- package/dist/src/utils/managed-command-evidence.js.map +1 -0
- package/dist/src/utils/managed-command-materialization.d.ts +115 -0
- package/dist/src/utils/managed-command-materialization.js +359 -0
- package/dist/src/utils/managed-command-materialization.js.map +1 -0
- package/dist/src/utils/managed-command-runtime.d.ts +33 -0
- package/dist/src/utils/managed-command-runtime.js +121 -0
- package/dist/src/utils/managed-command-runtime.js.map +1 -0
- package/dist/src/utils/managed-command-store.d.ts +128 -0
- package/dist/src/utils/managed-command-store.js +589 -0
- package/dist/src/utils/managed-command-store.js.map +1 -0
- package/dist/src/utils/manifest.d.ts +1 -3
- package/dist/src/utils/manifest.js +1 -3
- package/dist/src/utils/manifest.js.map +1 -1
- package/dist/src/utils/multi-source-catalog.d.ts +3 -9
- package/dist/src/utils/multi-source-catalog.js +54 -110
- package/dist/src/utils/multi-source-catalog.js.map +1 -1
- package/dist/src/utils/native-cli.d.ts +61 -7
- package/dist/src/utils/native-cli.js +426 -58
- package/dist/src/utils/native-cli.js.map +1 -1
- package/dist/src/utils/native-tool-context.d.ts +14 -0
- package/dist/src/utils/native-tool-context.js +38 -0
- package/dist/src/utils/native-tool-context.js.map +1 -0
- package/dist/src/utils/native-tool-review.d.ts +21 -0
- package/dist/src/utils/native-tool-review.js +102 -0
- package/dist/src/utils/native-tool-review.js.map +1 -0
- package/dist/src/utils/orphan-marketplace-cleanup.js +0 -4
- package/dist/src/utils/orphan-marketplace-cleanup.js.map +1 -1
- package/dist/src/utils/ownership.d.ts +88 -20
- package/dist/src/utils/ownership.js +185 -223
- package/dist/src/utils/ownership.js.map +1 -1
- package/dist/src/utils/path-catalog-provider.d.ts +1 -1
- package/dist/src/utils/path-catalog-provider.js +54 -65
- package/dist/src/utils/path-catalog-provider.js.map +1 -1
- package/dist/src/utils/paths.d.ts +0 -1
- package/dist/src/utils/paths.js +0 -1
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/plugin-config-impact.d.ts +40 -0
- package/dist/src/utils/plugin-config-impact.js +373 -0
- package/dist/src/utils/plugin-config-impact.js.map +1 -0
- package/dist/src/utils/plugin-config-write.d.ts +52 -27
- package/dist/src/utils/plugin-config-write.js +1112 -298
- package/dist/src/utils/plugin-config-write.js.map +1 -1
- package/dist/src/utils/plugin-config.d.ts +153 -93
- package/dist/src/utils/plugin-config.js +1116 -968
- package/dist/src/utils/plugin-config.js.map +1 -1
- package/dist/src/utils/plugin-intent-state.d.ts +49 -0
- package/dist/src/utils/plugin-intent-state.js +320 -0
- package/dist/src/utils/plugin-intent-state.js.map +1 -0
- package/dist/src/utils/plugin-scripts.d.ts +66 -125
- package/dist/src/utils/plugin-scripts.js +518 -526
- package/dist/src/utils/plugin-scripts.js.map +1 -1
- package/dist/src/utils/process-lock.js +14 -5
- package/dist/src/utils/process-lock.js.map +1 -1
- package/dist/src/utils/process-tree.d.ts +2 -2
- package/dist/src/utils/process-tree.js +1 -1
- package/dist/src/utils/process-tree.js.map +1 -1
- package/dist/src/utils/project-boundary.d.ts +11 -13
- package/dist/src/utils/project-boundary.js +28 -34
- package/dist/src/utils/project-boundary.js.map +1 -1
- package/dist/src/utils/rendered-contract.js +18 -1
- package/dist/src/utils/rendered-contract.js.map +1 -1
- package/dist/src/utils/runtime-config.d.ts +20 -0
- package/dist/src/utils/runtime-config.js +75 -0
- package/dist/src/utils/runtime-config.js.map +1 -0
- package/dist/src/utils/runtime-skill-closure.js +47 -6
- package/dist/src/utils/runtime-skill-closure.js.map +1 -1
- package/dist/src/utils/safe-fs.d.ts +21 -0
- package/dist/src/utils/safe-fs.js +111 -0
- package/dist/src/utils/safe-fs.js.map +1 -0
- package/dist/src/utils/safe-operation-diagnostic.d.ts +15 -0
- package/dist/src/utils/safe-operation-diagnostic.js +33 -0
- package/dist/src/utils/safe-operation-diagnostic.js.map +1 -0
- package/dist/src/utils/sensitive-content.d.ts +4 -0
- package/dist/src/utils/sensitive-content.js +36 -0
- package/dist/src/utils/sensitive-content.js.map +1 -0
- package/dist/src/utils/state-paths.js +7 -2
- package/dist/src/utils/state-paths.js.map +1 -1
- package/dist/src/utils/target-eligibility.d.ts +8 -2
- package/dist/src/utils/target-eligibility.js +17 -8
- package/dist/src/utils/target-eligibility.js.map +1 -1
- package/dist/src/utils/windows-claude-shim.d.ts +7 -0
- package/dist/src/utils/windows-claude-shim.js +10 -0
- package/dist/src/utils/windows-claude-shim.js.map +1 -0
- package/dist/src/utils/windows-npm-shim.d.ts +14 -0
- package/dist/src/utils/windows-npm-shim.js +140 -0
- package/dist/src/utils/windows-npm-shim.js.map +1 -0
- package/dist/vitest.config.js +100 -9
- package/dist/vitest.config.js.map +1 -1
- package/package.json +31 -21
- package/dist/authoring/scripts/check-plugin-versions.d.mts +0 -2
- package/dist/authoring/scripts/check-plugin-versions.mjs +0 -5
- package/dist/authoring/scripts/check-plugin-versions.mjs.map +0 -1
- package/dist/scripts/aw-skill-eval-engine.d.ts +0 -13
- package/dist/scripts/aw-skill-eval-engine.js +0 -31
- package/dist/scripts/aw-skill-eval-engine.js.map +0 -1
- package/dist/scripts/codex-eval-app-server.d.ts +0 -89
- package/dist/scripts/codex-eval-app-server.js +0 -1228
- package/dist/scripts/codex-eval-app-server.js.map +0 -1
- package/dist/scripts/codex-eval-isolation.d.ts +0 -61
- package/dist/scripts/codex-eval-isolation.js +0 -318
- package/dist/scripts/codex-eval-isolation.js.map +0 -1
- package/dist/scripts/codex-eval-process-management.d.ts +0 -8
- package/dist/scripts/codex-eval-process-management.js +0 -69
- package/dist/scripts/codex-eval-process-management.js.map +0 -1
- package/dist/scripts/codex-eval-process-tree.d.ts +0 -38
- package/dist/scripts/codex-eval-process-tree.js +0 -803
- package/dist/scripts/codex-eval-process-tree.js.map +0 -1
- package/dist/scripts/codex-eval-runtime-config.d.ts +0 -62
- package/dist/scripts/codex-eval-runtime-config.js +0 -843
- package/dist/scripts/codex-eval-runtime-config.js.map +0 -1
- package/dist/scripts/codex-trigger-eval.d.ts +0 -84
- package/dist/scripts/codex-trigger-eval.js +0 -968
- package/dist/scripts/codex-trigger-eval.js.map +0 -1
- package/dist/scripts/eval-plugin-skills-audited.d.ts +0 -6
- package/dist/scripts/eval-plugin-skills-audited.js +0 -261
- package/dist/scripts/eval-plugin-skills-audited.js.map +0 -1
- package/dist/scripts/eval-plugin-skills.d.ts +0 -45
- package/dist/scripts/eval-plugin-skills.js +0 -1586
- package/dist/scripts/eval-plugin-skills.js.map +0 -1
- package/dist/scripts/eval-run-layout.d.ts +0 -17
- package/dist/scripts/eval-run-layout.js +0 -26
- package/dist/scripts/eval-run-layout.js.map +0 -1
- package/dist/scripts/plugin-eval-contract.d.ts +0 -185
- package/dist/scripts/plugin-eval-contract.js +0 -695
- package/dist/scripts/plugin-eval-contract.js.map +0 -1
- package/dist/scripts/plugin-eval-materializer.d.ts +0 -13
- package/dist/scripts/plugin-eval-materializer.js +0 -421
- package/dist/scripts/plugin-eval-materializer.js.map +0 -1
- package/dist/scripts/skill-reporting.d.ts +0 -212
- package/dist/scripts/skill-reporting.js +0 -922
- package/dist/scripts/skill-reporting.js.map +0 -1
- package/dist/src/commands/review-publication.d.ts +0 -99
- package/dist/src/commands/review-publication.js +0 -904
- package/dist/src/commands/review-publication.js.map +0 -1
- package/dist/src/commands/status-v4.d.ts +0 -123
- package/dist/src/commands/status-v4.js +0 -905
- package/dist/src/commands/status-v4.js.map +0 -1
- package/dist/src/commands/status.d.ts +0 -93
- package/dist/src/commands/status.js +0 -442
- package/dist/src/commands/status.js.map +0 -1
- package/dist/src/utils/active-marketplace-runtime-lock.d.ts +0 -12
- package/dist/src/utils/active-marketplace-runtime-lock.js +0 -133
- package/dist/src/utils/active-marketplace-runtime-lock.js.map +0 -1
- package/dist/src/utils/catalog-manifest-v3.d.ts +0 -2
- package/dist/src/utils/catalog-manifest-v3.js +0 -3
- package/dist/src/utils/catalog-manifest-v3.js.map +0 -1
- package/dist/src/utils/catalog-manifest-v4.d.ts +0 -5
- package/dist/src/utils/catalog-manifest-v4.js.map +0 -1
- package/dist/src/utils/catalog-source-cache.d.ts +0 -62
- package/dist/src/utils/catalog-source-cache.js +0 -296
- package/dist/src/utils/catalog-source-cache.js.map +0 -1
- package/dist/src/utils/codex-project-surface.d.ts +0 -3
- package/dist/src/utils/codex-project-surface.js +0 -49
- package/dist/src/utils/codex-project-surface.js.map +0 -1
- package/dist/src/utils/lifecycle-active-store.d.ts +0 -175
- package/dist/src/utils/lifecycle-active-store.js +0 -1276
- package/dist/src/utils/lifecycle-active-store.js.map +0 -1
- package/dist/src/utils/plugin-release.d.ts +0 -2
- package/dist/src/utils/plugin-release.js +0 -2
- package/dist/src/utils/plugin-release.js.map +0 -1
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { canonicalJson, computeCanonicalDirectoryDigest, computeEvalFileDigest, computeEvalProviderDigest, computeSkillDigest, } from '@lesliechan721/agent-skill-eval';
|
|
4
|
+
import { calculateCatalogWorkspaceSourceIdentity, GENERATED_OUTPUT_MARKER_FILENAME, readCatalogWorkspace, formatPluginConfigIssue, validatePluginConfigCandidate, } from '@lesliechan721/aw-plugin-core';
|
|
5
|
+
import fs from 'fs-extra';
|
|
6
|
+
import { assertNoSensitiveProfileConfig, readAwSkillEvalManifest, } from '../eval/manifest-v1.js';
|
|
7
|
+
import { resolveArtifactRenderConfig } from '../utils/artifact-renderer.js';
|
|
8
|
+
import { CLI_RESERVED_IMPORTS } from '../utils/manifest.js';
|
|
9
|
+
import { resolvePluginMetaDependencyClosure } from '../utils/plugin-dependencies.js';
|
|
10
|
+
import { parseAwSourceBindingEvalInput, resolveAwSourceBindingEvalProvider, resolveEvalSourceBindingInput, } from './eval-source-input.js';
|
|
11
|
+
import { normalizeReviewProfileConfig, parseReviewProfile } from './review-profile.js';
|
|
12
|
+
import { resolveReviewSelection } from './review-selection.js';
|
|
13
|
+
export { computeAwSourceBindingSelectedCasesDigest, computeAwSourceBindingSuiteDefaultsDigest, resolveAwSourceBindingEvalProvider, resolveEvalSourceBindingInput, selectAwSourceBindingEvalCases, } from './eval-source-input.js';
|
|
14
|
+
export const AW_SOURCE_BINDING_FILENAME = 'aw-source-binding.json';
|
|
15
|
+
const digestPattern = /^sha256:[0-9a-f]{64}$/u;
|
|
16
|
+
const safeIdPattern = /^[a-z0-9][a-z0-9-]*$/u;
|
|
17
|
+
const unsupportedV1Message = 'AW source binding schema version 1 is unsupported. Run "aw skill eval prepare" or "aw skill materialize" again.';
|
|
18
|
+
function digestCanonical(value) {
|
|
19
|
+
return `sha256:${crypto.createHash('sha256').update(canonicalJson(value)).digest('hex')}`;
|
|
20
|
+
}
|
|
21
|
+
function strictRecord(value, keys) {
|
|
22
|
+
return !!value
|
|
23
|
+
&& typeof value === 'object'
|
|
24
|
+
&& !Array.isArray(value)
|
|
25
|
+
&& Object.keys(value).length === keys.length
|
|
26
|
+
&& Object.keys(value).every((key) => keys.includes(key));
|
|
27
|
+
}
|
|
28
|
+
function nonEmptyString(value) {
|
|
29
|
+
return typeof value === 'string' && value.trim() !== '' && value === value.trim();
|
|
30
|
+
}
|
|
31
|
+
function digestString(value) {
|
|
32
|
+
return typeof value === 'string' && digestPattern.test(value);
|
|
33
|
+
}
|
|
34
|
+
function scopeValue(value) {
|
|
35
|
+
return value === 'project' || value === 'user';
|
|
36
|
+
}
|
|
37
|
+
function safeId(value) {
|
|
38
|
+
return typeof value === 'string' && safeIdPattern.test(value);
|
|
39
|
+
}
|
|
40
|
+
function normalizeRelativePath(value) {
|
|
41
|
+
if (typeof value !== 'string'
|
|
42
|
+
|| value === ''
|
|
43
|
+
|| value.includes('\\')
|
|
44
|
+
|| path.posix.isAbsolute(value)
|
|
45
|
+
|| path.win32.isAbsolute(value)
|
|
46
|
+
|| path.posix.normalize(value) !== value
|
|
47
|
+
|| value === '..'
|
|
48
|
+
|| value.startsWith('../')) {
|
|
49
|
+
throw new Error('Source binding artifact path must be a safe relative POSIX path.');
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
function normalizeSource(value) {
|
|
54
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
55
|
+
throw new Error('Source binding source must be an object.');
|
|
56
|
+
}
|
|
57
|
+
const row = value;
|
|
58
|
+
if (row.kind === 'workspace') {
|
|
59
|
+
if (!strictRecord(row, ['kind', 'workspaceIdentity', 'sourceIdentity'])
|
|
60
|
+
|| !nonEmptyString(row.workspaceIdentity)
|
|
61
|
+
|| !digestString(row.sourceIdentity))
|
|
62
|
+
throw new Error('Source binding Workspace identity is invalid.');
|
|
63
|
+
return {
|
|
64
|
+
kind: 'workspace',
|
|
65
|
+
workspaceIdentity: row.workspaceIdentity,
|
|
66
|
+
sourceIdentity: row.sourceIdentity,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (row.kind !== 'catalog-snapshot'
|
|
70
|
+
|| !strictRecord(row, [
|
|
71
|
+
'kind',
|
|
72
|
+
'sourceId',
|
|
73
|
+
'catalogSourceIdentity',
|
|
74
|
+
'logicalIdentity',
|
|
75
|
+
'snapshotDigest',
|
|
76
|
+
'workspaceIdentity',
|
|
77
|
+
'workspaceSourceIdentity',
|
|
78
|
+
])
|
|
79
|
+
|| !safeId(row.sourceId)
|
|
80
|
+
|| !digestString(row.catalogSourceIdentity)
|
|
81
|
+
|| !nonEmptyString(row.logicalIdentity)
|
|
82
|
+
|| !digestString(row.snapshotDigest)
|
|
83
|
+
|| !nonEmptyString(row.workspaceIdentity)
|
|
84
|
+
|| !digestString(row.workspaceSourceIdentity))
|
|
85
|
+
throw new Error('Source binding Catalog snapshot identity is invalid.');
|
|
86
|
+
return {
|
|
87
|
+
kind: 'catalog-snapshot',
|
|
88
|
+
sourceId: row.sourceId,
|
|
89
|
+
catalogSourceIdentity: row.catalogSourceIdentity,
|
|
90
|
+
logicalIdentity: row.logicalIdentity,
|
|
91
|
+
snapshotDigest: row.snapshotDigest,
|
|
92
|
+
workspaceIdentity: row.workspaceIdentity,
|
|
93
|
+
workspaceSourceIdentity: row.workspaceSourceIdentity,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function normalizeSubject(value) {
|
|
97
|
+
const row = value;
|
|
98
|
+
if (!strictRecord(row, ['plugin', ...(row?.skill === undefined ? [] : ['skill']), ...(row?.suite === undefined ? [] : ['suite'])])
|
|
99
|
+
|| !safeId(row.plugin)
|
|
100
|
+
|| (row.skill !== undefined && !safeId(row.skill))
|
|
101
|
+
|| (row.suite !== undefined && !safeId(row.suite)))
|
|
102
|
+
throw new Error('Source binding subject is invalid.');
|
|
103
|
+
if (row.suite !== undefined && row.skill === undefined) {
|
|
104
|
+
throw new Error('Source binding suite requires a Skill subject.');
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
plugin: row.plugin,
|
|
108
|
+
...(row.skill === undefined ? {} : { skill: row.skill }),
|
|
109
|
+
...(row.suite === undefined ? {} : { suite: row.suite }),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function normalizeProfile(value) {
|
|
113
|
+
const row = value;
|
|
114
|
+
if (row?.kind === 'review')
|
|
115
|
+
return parseReviewProfile(value);
|
|
116
|
+
if (!strictRecord(row, ['kind', 'id', 'scope', 'inputDigest',
|
|
117
|
+
...(row?.kind === 'eval' && row.config !== undefined ? ['config'] : [])])
|
|
118
|
+
|| !scopeValue(row.scope)
|
|
119
|
+
|| !digestString(row.inputDigest))
|
|
120
|
+
throw new Error('Source binding profile is invalid.');
|
|
121
|
+
if (row.kind === 'eval' && safeId(row.id)) {
|
|
122
|
+
return {
|
|
123
|
+
kind: 'eval', id: row.id, scope: row.scope, inputDigest: row.inputDigest,
|
|
124
|
+
...(row.config === undefined ? {} : { config: normalizeReviewProfileConfig(row.config) }),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (row.kind === 'portable' && row.id === `agent-skills-${row.scope}`) {
|
|
128
|
+
return {
|
|
129
|
+
kind: 'portable',
|
|
130
|
+
id: `agent-skills-${row.scope}`,
|
|
131
|
+
scope: row.scope,
|
|
132
|
+
inputDigest: row.inputDigest,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
throw new Error('Source binding profile kind or id is invalid.');
|
|
136
|
+
}
|
|
137
|
+
function normalizeArtifact(value) {
|
|
138
|
+
const row = value;
|
|
139
|
+
if (!row || typeof row !== 'object' || Array.isArray(row) || !digestString(row.digest)) {
|
|
140
|
+
throw new Error('Source binding artifact is invalid.');
|
|
141
|
+
}
|
|
142
|
+
const relativePath = normalizeRelativePath(row.path);
|
|
143
|
+
if (row.kind === 'eval-target') {
|
|
144
|
+
if (!strictRecord(row, ['kind', 'skill', 'path', 'digest']) || !safeId(row.skill)) {
|
|
145
|
+
throw new Error('Source binding Eval Skill artifact is invalid.');
|
|
146
|
+
}
|
|
147
|
+
return { kind: row.kind, skill: row.skill, path: relativePath, digest: row.digest };
|
|
148
|
+
}
|
|
149
|
+
if (row.kind === 'portable-skill' || row.kind === 'review-skill') {
|
|
150
|
+
if (!strictRecord(row, ['kind', 'plugin', 'skill', 'path', 'digest'])
|
|
151
|
+
|| !safeId(row.plugin)
|
|
152
|
+
|| !safeId(row.skill))
|
|
153
|
+
throw new Error('Source binding materialized Skill artifact is invalid.');
|
|
154
|
+
return {
|
|
155
|
+
kind: row.kind,
|
|
156
|
+
plugin: row.plugin,
|
|
157
|
+
skill: row.skill,
|
|
158
|
+
path: relativePath,
|
|
159
|
+
digest: row.digest,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
if (row.kind === 'eval-workspace' || row.kind === 'eval-cases') {
|
|
163
|
+
if (!strictRecord(row, ['kind', 'path', 'digest'])) {
|
|
164
|
+
throw new Error('Source binding Eval artifact is invalid.');
|
|
165
|
+
}
|
|
166
|
+
return { kind: row.kind, path: relativePath, digest: row.digest };
|
|
167
|
+
}
|
|
168
|
+
throw new Error('Source binding artifact kind is invalid.');
|
|
169
|
+
}
|
|
170
|
+
export function parseAwSourceBinding(value) {
|
|
171
|
+
const row = value;
|
|
172
|
+
if (row?.schemaVersion === 1 && row.kind === 'aw-source-binding') {
|
|
173
|
+
throw new Error(unsupportedV1Message);
|
|
174
|
+
}
|
|
175
|
+
if (!strictRecord(row, [
|
|
176
|
+
'schemaVersion',
|
|
177
|
+
'kind',
|
|
178
|
+
'source',
|
|
179
|
+
'subject',
|
|
180
|
+
'profile',
|
|
181
|
+
...(row?.evalInput === undefined ? [] : ['evalInput']),
|
|
182
|
+
'artifacts',
|
|
183
|
+
'finalDigest',
|
|
184
|
+
])
|
|
185
|
+
|| row.schemaVersion !== 2
|
|
186
|
+
|| row.kind !== 'aw-source-binding'
|
|
187
|
+
|| !Array.isArray(row.artifacts)
|
|
188
|
+
|| row.artifacts.length === 0
|
|
189
|
+
|| !digestString(row.finalDigest))
|
|
190
|
+
throw new Error('Source binding receipt is invalid.');
|
|
191
|
+
const binding = {
|
|
192
|
+
schemaVersion: 2,
|
|
193
|
+
kind: 'aw-source-binding',
|
|
194
|
+
source: normalizeSource(row.source),
|
|
195
|
+
subject: normalizeSubject(row.subject),
|
|
196
|
+
profile: normalizeProfile(row.profile),
|
|
197
|
+
...(row.evalInput === undefined ? {} : { evalInput: parseAwSourceBindingEvalInput(row.evalInput) }),
|
|
198
|
+
artifacts: row.artifacts.map(normalizeArtifact),
|
|
199
|
+
finalDigest: row.finalDigest,
|
|
200
|
+
};
|
|
201
|
+
const paths = binding.artifacts.map((artifact) => artifact.path);
|
|
202
|
+
if (new Set(paths).size !== paths.length || paths.includes(AW_SOURCE_BINDING_FILENAME)) {
|
|
203
|
+
throw new Error('Source binding artifact paths must be unique and exclude the receipt.');
|
|
204
|
+
}
|
|
205
|
+
if (binding.profile.kind === 'eval') {
|
|
206
|
+
const expectedKinds = ['eval-cases', 'eval-target', 'eval-workspace'];
|
|
207
|
+
if (binding.artifacts.length !== 3
|
|
208
|
+
|| [...binding.artifacts.map((artifact) => artifact.kind)].sort().join(',') !== expectedKinds.join(',')
|
|
209
|
+
|| binding.subject.skill === undefined
|
|
210
|
+
|| binding.subject.suite === undefined
|
|
211
|
+
|| binding.evalInput === undefined
|
|
212
|
+
|| binding.artifacts.some((artifact) => artifact.kind === 'eval-target' && artifact.skill !== binding.subject.skill))
|
|
213
|
+
throw new Error('Source binding artifacts do not match the Eval profile.');
|
|
214
|
+
}
|
|
215
|
+
else if (binding.profile.kind === 'portable') {
|
|
216
|
+
if (binding.subject.skill !== undefined
|
|
217
|
+
|| binding.subject.suite !== undefined
|
|
218
|
+
|| binding.evalInput !== undefined
|
|
219
|
+
|| binding.artifacts.some((artifact) => artifact.kind !== 'portable-skill')
|
|
220
|
+
|| new Set(binding.artifacts.map((artifact) => artifact.kind === 'portable-skill' ? artifact.skill : '')).size !== binding.artifacts.length)
|
|
221
|
+
throw new Error('Source binding artifacts do not match the portable profile.');
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
const reviewArtifacts = binding.artifacts.filter((artifact) => artifact.kind === 'review-skill');
|
|
225
|
+
if (binding.subject.suite !== undefined
|
|
226
|
+
|| binding.evalInput !== undefined
|
|
227
|
+
|| reviewArtifacts.length !== binding.artifacts.length
|
|
228
|
+
|| reviewArtifacts.some((artifact) => artifact.plugin !== binding.subject.plugin)
|
|
229
|
+
|| new Set(reviewArtifacts.map((artifact) => artifact.skill)).size !== reviewArtifacts.length
|
|
230
|
+
|| (binding.subject.skill !== undefined
|
|
231
|
+
&& (reviewArtifacts.length !== 1 || reviewArtifacts[0].skill !== binding.subject.skill)))
|
|
232
|
+
throw new Error('Source binding artifacts do not match the Review profile.');
|
|
233
|
+
}
|
|
234
|
+
return binding;
|
|
235
|
+
}
|
|
236
|
+
function bindingDigest(binding) {
|
|
237
|
+
return digestCanonical(binding);
|
|
238
|
+
}
|
|
239
|
+
async function artifactDigest(rootDir, artifact) {
|
|
240
|
+
const relativePath = normalizeRelativePath(artifact.path);
|
|
241
|
+
const absolutePath = path.resolve(rootDir, ...relativePath.split('/'));
|
|
242
|
+
const relative = path.relative(rootDir, absolutePath);
|
|
243
|
+
if (relative === '' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
244
|
+
throw new Error('Source binding artifact escapes its materialization root.');
|
|
245
|
+
}
|
|
246
|
+
let current = rootDir;
|
|
247
|
+
for (const segment of relativePath.split('/')) {
|
|
248
|
+
current = path.join(current, segment);
|
|
249
|
+
const info = await fs.lstat(current);
|
|
250
|
+
if (info.isSymbolicLink())
|
|
251
|
+
throw new Error('Source binding artifact path contains a symbolic link.');
|
|
252
|
+
}
|
|
253
|
+
if (artifact.kind === 'eval-workspace')
|
|
254
|
+
return computeCanonicalDirectoryDigest(absolutePath);
|
|
255
|
+
if (artifact.kind === 'eval-cases')
|
|
256
|
+
return computeEvalFileDigest(absolutePath);
|
|
257
|
+
return computeSkillDigest(absolutePath);
|
|
258
|
+
}
|
|
259
|
+
export async function writeAwSourceBinding(options) {
|
|
260
|
+
const rootDir = await fs.realpath(options.rootDir);
|
|
261
|
+
const artifacts = [];
|
|
262
|
+
for (const artifact of options.artifacts) {
|
|
263
|
+
artifacts.push({ ...artifact, digest: await artifactDigest(rootDir, artifact) });
|
|
264
|
+
}
|
|
265
|
+
const unsigned = {
|
|
266
|
+
schemaVersion: 2,
|
|
267
|
+
kind: 'aw-source-binding',
|
|
268
|
+
source: options.source,
|
|
269
|
+
subject: options.subject,
|
|
270
|
+
profile: options.profile,
|
|
271
|
+
...(options.evalInput === undefined ? {} : { evalInput: options.evalInput }),
|
|
272
|
+
artifacts,
|
|
273
|
+
};
|
|
274
|
+
const binding = parseAwSourceBinding({ ...unsigned, finalDigest: bindingDigest(unsigned) });
|
|
275
|
+
const bindingPath = path.join(rootDir, AW_SOURCE_BINDING_FILENAME);
|
|
276
|
+
await fs.writeFile(bindingPath, `${JSON.stringify(binding, null, 2)}\n`, { flag: 'wx' });
|
|
277
|
+
return { bindingPath, binding };
|
|
278
|
+
}
|
|
279
|
+
export async function resolveWorkspaceBindingSource(workspace) {
|
|
280
|
+
return {
|
|
281
|
+
kind: 'workspace',
|
|
282
|
+
workspaceIdentity: workspace.workspaceIdentity,
|
|
283
|
+
sourceIdentity: await calculateCatalogWorkspaceSourceIdentity(workspace),
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
export async function resolveCatalogSnapshotBindingSource(source) {
|
|
287
|
+
const markerPath = path.join(source.rootDir, GENERATED_OUTPUT_MARKER_FILENAME);
|
|
288
|
+
const markerInfo = await fs.lstat(markerPath);
|
|
289
|
+
if (!markerInfo.isFile() || markerInfo.isSymbolicLink()) {
|
|
290
|
+
throw new Error('Validated Catalog snapshot marker is unsafe.');
|
|
291
|
+
}
|
|
292
|
+
const marker = await fs.readJson(markerPath);
|
|
293
|
+
if (!strictRecord(marker, ['schemaVersion', 'kind', 'workspaceIdentity', 'sourceIdentity'])
|
|
294
|
+
|| marker.schemaVersion !== 1
|
|
295
|
+
|| marker.kind !== 'catalog'
|
|
296
|
+
|| !nonEmptyString(marker.workspaceIdentity)
|
|
297
|
+
|| !digestString(marker.sourceIdentity))
|
|
298
|
+
throw new Error('Validated Catalog snapshot marker is invalid.');
|
|
299
|
+
return {
|
|
300
|
+
kind: 'catalog-snapshot',
|
|
301
|
+
sourceId: source.sourceId,
|
|
302
|
+
catalogSourceIdentity: source.sourceIdentity,
|
|
303
|
+
logicalIdentity: source.logicalIdentity,
|
|
304
|
+
snapshotDigest: source.snapshotDigest,
|
|
305
|
+
workspaceIdentity: marker.workspaceIdentity,
|
|
306
|
+
workspaceSourceIdentity: marker.sourceIdentity,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
export function resolveEvalProfileBindingInput(profile, plugins, configOverrides = {}) {
|
|
310
|
+
assertNoSensitiveProfileConfig(profile, plugins);
|
|
311
|
+
const normalizedConfig = normalizeReviewProfileConfig(configOverrides);
|
|
312
|
+
const selectedPlugins = new Set(profile.plugins.map((entry) => entry.name));
|
|
313
|
+
if (Object.keys(normalizedConfig).some((name) => !selectedPlugins.has(name))) {
|
|
314
|
+
throw new Error('Eval config overrides must name plugins in the selected profile.');
|
|
315
|
+
}
|
|
316
|
+
assertNoSensitiveProfileConfig({
|
|
317
|
+
...profile,
|
|
318
|
+
plugins: profile.plugins.map((entry) => ({
|
|
319
|
+
...entry,
|
|
320
|
+
config: { ...entry.config, ...(normalizedConfig[entry.name] ?? {}) },
|
|
321
|
+
})),
|
|
322
|
+
}, plugins);
|
|
323
|
+
const explicitConfig = new Map(profile.plugins.map((entry) => [entry.name, entry.config]));
|
|
324
|
+
const overrides = new Map(Object.entries(profile.configByScope ?? {}).map(([scope, entries]) => [
|
|
325
|
+
scope,
|
|
326
|
+
new Map(entries?.map((entry) => [entry.name, entry.config]) ?? []),
|
|
327
|
+
]));
|
|
328
|
+
const closure = resolvePluginMetaDependencyClosure(plugins, profile.plugins.map((entry) => entry.name));
|
|
329
|
+
const materializationProfile = {
|
|
330
|
+
id: profile.id,
|
|
331
|
+
scope: profile.scope,
|
|
332
|
+
plugins: closure.map((plugin) => ({
|
|
333
|
+
name: plugin.manifest.name,
|
|
334
|
+
configByScope: Object.fromEntries([
|
|
335
|
+
profile.scope,
|
|
336
|
+
...((plugin.manifest.artifacts?.targets ?? []).some((target) => target.platform === 'codex'
|
|
337
|
+
&& target.target === 'codex.skill'
|
|
338
|
+
&& target.scopes.includes(profile.scope)
|
|
339
|
+
&& target.delivery?.mode === 'codex-native')
|
|
340
|
+
? ['user']
|
|
341
|
+
: []),
|
|
342
|
+
].sort().map((scope) => [
|
|
343
|
+
scope,
|
|
344
|
+
{
|
|
345
|
+
...(explicitConfig.get(plugin.manifest.name) ?? {}),
|
|
346
|
+
...(overrides.get(scope)?.get(plugin.manifest.name) ?? {}),
|
|
347
|
+
...(normalizedConfig[plugin.manifest.name] ?? {}),
|
|
348
|
+
},
|
|
349
|
+
])),
|
|
350
|
+
})),
|
|
351
|
+
};
|
|
352
|
+
for (const plugin of closure) {
|
|
353
|
+
const installation = materializationProfile.plugins.find((entry) => entry.name === plugin.manifest.name);
|
|
354
|
+
for (const [scope, config] of Object.entries(installation.configByScope)) {
|
|
355
|
+
for (const [key, field] of Object.entries(plugin.manifest.config?.fields ?? {})) {
|
|
356
|
+
if (field.required === true && field.default === undefined && !Object.hasOwn(config, key)) {
|
|
357
|
+
throw new Error(`Eval profile "${profile.id}" is missing required config "${key}" `
|
|
358
|
+
+ `for plugin "${plugin.manifest.name}" in ${scope} scope.`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (plugin.manifest.config) {
|
|
362
|
+
const defaults = Object.fromEntries(Object.entries(plugin.manifest.config.fields)
|
|
363
|
+
.flatMap(([key, field]) => field.default === undefined ? [] : [[key, field.default]]));
|
|
364
|
+
const issues = validatePluginConfigCandidate(plugin.manifest.config, { ...defaults, ...config });
|
|
365
|
+
if (issues.length > 0) {
|
|
366
|
+
throw new Error(`Eval profile "${profile.id}" has invalid config for plugin "${plugin.manifest.name}" in ${scope} scope: ${formatPluginConfigIssue(issues[0])}`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
materializationProfile,
|
|
373
|
+
profile: {
|
|
374
|
+
kind: 'eval',
|
|
375
|
+
id: profile.id,
|
|
376
|
+
scope: profile.scope,
|
|
377
|
+
inputDigest: digestCanonical(materializationProfile),
|
|
378
|
+
...(Object.keys(normalizedConfig).length === 0 ? {} : { config: normalizedConfig }),
|
|
379
|
+
},
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
export async function resolvePortablePluginProfileConfig(options) {
|
|
383
|
+
const config = await resolveArtifactRenderConfig({
|
|
384
|
+
sourceId: options.sourceId ?? options.plugin.sourceId,
|
|
385
|
+
sourceIdentity: options.catalogSourceIdentity ?? options.plugin.sourceIdentity,
|
|
386
|
+
logicalIdentity: options.logicalIdentity ?? options.plugin.catalogLogicalIdentity,
|
|
387
|
+
pluginName: options.plugin.manifest.name,
|
|
388
|
+
manifest: options.plugin.manifest,
|
|
389
|
+
scope: options.scope,
|
|
390
|
+
cwd: options.cwd,
|
|
391
|
+
env: options.env,
|
|
392
|
+
});
|
|
393
|
+
if (config.issues.length > 0) {
|
|
394
|
+
throw new Error(`Portable materialization config is invalid: ${config.issues.map((issue) => issue.message).join('; ')}`);
|
|
395
|
+
}
|
|
396
|
+
return {
|
|
397
|
+
config,
|
|
398
|
+
digest: digestCanonical({ values: config.values, sources: config.sources }),
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
export async function resolvePortableProfileBindingInput(options) {
|
|
402
|
+
const closure = resolvePluginMetaDependencyClosure(options.plugins, [options.pluginName]);
|
|
403
|
+
const configDigests = [];
|
|
404
|
+
for (const plugin of closure) {
|
|
405
|
+
if (!plugin.manifest.distributions?.agentSkills)
|
|
406
|
+
continue;
|
|
407
|
+
const resolved = await resolvePortablePluginProfileConfig({ ...options, plugin });
|
|
408
|
+
const id = options.sourceId ? `${options.sourceId}/${plugin.manifest.name}` : plugin.manifest.name;
|
|
409
|
+
configDigests.push([id, resolved.digest]);
|
|
410
|
+
}
|
|
411
|
+
return {
|
|
412
|
+
kind: 'portable',
|
|
413
|
+
id: `agent-skills-${options.scope}`,
|
|
414
|
+
scope: options.scope,
|
|
415
|
+
inputDigest: `sha256:${crypto.createHash('sha256')
|
|
416
|
+
.update(JSON.stringify(configDigests))
|
|
417
|
+
.digest('hex')}`,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
function sameSubject(left, right) {
|
|
421
|
+
return left.plugin === right.plugin && left.skill === right.skill && left.suite === right.suite;
|
|
422
|
+
}
|
|
423
|
+
async function currentWorkspaceProfile(options) {
|
|
424
|
+
const plugin = options.workspace.plugins.find((entry) => entry.manifest.name === options.binding.subject.plugin);
|
|
425
|
+
if (!plugin)
|
|
426
|
+
throw new Error('The bound plugin is not present in the current Workspace.');
|
|
427
|
+
if (options.binding.profile.kind === 'eval') {
|
|
428
|
+
const loaded = await readAwSkillEvalManifest({ plugin, skill: options.binding.subject.skill });
|
|
429
|
+
const suite = loaded.manifest.suites.find((entry) => entry.id === options.binding.subject.suite);
|
|
430
|
+
const profile = loaded.manifest.profiles.find((entry) => entry.id === options.binding.profile.id);
|
|
431
|
+
if (!suite || !profile || suite.profiles && !suite.profiles.includes(profile.id)) {
|
|
432
|
+
throw new Error('The bound Eval suite or profile is not present in the current Workspace.');
|
|
433
|
+
}
|
|
434
|
+
return resolveEvalProfileBindingInput(profile, options.workspace.plugins, options.binding.profile.config).profile;
|
|
435
|
+
}
|
|
436
|
+
if (options.binding.profile.kind === 'review') {
|
|
437
|
+
const skills = options.binding.artifacts.flatMap((artifact) => artifact.kind === 'review-skill' ? [artifact.skill] : []);
|
|
438
|
+
const selection = await resolveReviewSelection({
|
|
439
|
+
cwd: options.workspace.workspaceRoot,
|
|
440
|
+
workspaceRoot: options.workspace.workspaceRoot,
|
|
441
|
+
target: options.binding.subject.plugin,
|
|
442
|
+
skills,
|
|
443
|
+
platform: options.binding.profile.platform,
|
|
444
|
+
scope: options.binding.profile.scope,
|
|
445
|
+
config: options.binding.profile.config,
|
|
446
|
+
env: options.env,
|
|
447
|
+
});
|
|
448
|
+
const profile = selection.profiles[0]?.profile;
|
|
449
|
+
if (!profile)
|
|
450
|
+
throw new Error('The bound Review profile is not present in the current Workspace.');
|
|
451
|
+
return profile;
|
|
452
|
+
}
|
|
453
|
+
const source = options.binding.source;
|
|
454
|
+
return resolvePortableProfileBindingInput({
|
|
455
|
+
plugins: options.workspace.plugins,
|
|
456
|
+
pluginName: options.binding.subject.plugin,
|
|
457
|
+
scope: options.binding.profile.scope,
|
|
458
|
+
cwd: options.cwd,
|
|
459
|
+
env: options.env,
|
|
460
|
+
...(source.kind === 'catalog-snapshot'
|
|
461
|
+
? {
|
|
462
|
+
sourceId: source.sourceId,
|
|
463
|
+
catalogSourceIdentity: source.catalogSourceIdentity,
|
|
464
|
+
logicalIdentity: source.logicalIdentity,
|
|
465
|
+
}
|
|
466
|
+
: {}),
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
export async function resolveCurrentWorkspaceAwSourceBinding(options) {
|
|
470
|
+
return {
|
|
471
|
+
source: options.context.source,
|
|
472
|
+
profile: await currentWorkspaceProfile({
|
|
473
|
+
workspace: options.context.workspace,
|
|
474
|
+
binding: options.binding,
|
|
475
|
+
cwd: options.cwd ?? options.context.workspace.workspaceRoot,
|
|
476
|
+
env: options.env,
|
|
477
|
+
}),
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
export async function createAwSourceBindingWorkspaceValidationContext(workspaceRoot) {
|
|
481
|
+
const workspace = await readCatalogWorkspace(workspaceRoot, { reservedImports: CLI_RESERVED_IMPORTS });
|
|
482
|
+
return { workspace, source: await resolveWorkspaceBindingSource(workspace) };
|
|
483
|
+
}
|
|
484
|
+
export async function readAwSourceBinding(bindingPath) {
|
|
485
|
+
const resolved = path.resolve(bindingPath);
|
|
486
|
+
const info = await fs.lstat(resolved);
|
|
487
|
+
if (!info.isFile() || info.isSymbolicLink() || path.basename(resolved) !== AW_SOURCE_BINDING_FILENAME) {
|
|
488
|
+
throw new Error('AW source binding receipt path is invalid.');
|
|
489
|
+
}
|
|
490
|
+
const binding = parseAwSourceBinding(await fs.readJson(resolved));
|
|
491
|
+
const unsigned = {
|
|
492
|
+
schemaVersion: binding.schemaVersion,
|
|
493
|
+
kind: binding.kind,
|
|
494
|
+
source: binding.source,
|
|
495
|
+
subject: binding.subject,
|
|
496
|
+
profile: binding.profile,
|
|
497
|
+
...(binding.evalInput === undefined ? {} : { evalInput: binding.evalInput }),
|
|
498
|
+
artifacts: binding.artifacts,
|
|
499
|
+
};
|
|
500
|
+
if (binding.finalDigest !== bindingDigest(unsigned)) {
|
|
501
|
+
throw new Error('AW source binding receipt digest is invalid.');
|
|
502
|
+
}
|
|
503
|
+
return binding;
|
|
504
|
+
}
|
|
505
|
+
function bindingMatchesWorkspaceSource(binding, current) {
|
|
506
|
+
return binding.kind === 'workspace'
|
|
507
|
+
? binding.workspaceIdentity === current.workspaceIdentity
|
|
508
|
+
&& binding.sourceIdentity === current.sourceIdentity
|
|
509
|
+
: binding.workspaceIdentity === current.workspaceIdentity
|
|
510
|
+
&& binding.workspaceSourceIdentity === current.sourceIdentity;
|
|
511
|
+
}
|
|
512
|
+
async function currentPortableArtifactOwners(options) {
|
|
513
|
+
const closure = resolvePluginMetaDependencyClosure(options.workspace.plugins, [options.binding.subject.plugin]);
|
|
514
|
+
const owners = new Map();
|
|
515
|
+
const record = (skill, plugin) => {
|
|
516
|
+
owners.set(skill, owners.has(skill) ? null : plugin);
|
|
517
|
+
};
|
|
518
|
+
for (const plugin of closure) {
|
|
519
|
+
const distribution = plugin.manifest.distributions?.agentSkills;
|
|
520
|
+
if (!distribution)
|
|
521
|
+
continue;
|
|
522
|
+
const dynamicKeys = new Set((plugin.manifest.artifacts?.targets ?? [])
|
|
523
|
+
.filter((target) => target.target === 'agent-skills.skill')
|
|
524
|
+
.map((target) => target.skillKey));
|
|
525
|
+
for (const target of plugin.manifest.artifacts?.targets ?? []) {
|
|
526
|
+
if (target.target === 'agent-skills.skill'
|
|
527
|
+
&& target.scopes.includes(options.binding.profile.scope))
|
|
528
|
+
record(target.skillKey, plugin.manifest.name);
|
|
529
|
+
}
|
|
530
|
+
if (!distribution.skills)
|
|
531
|
+
continue;
|
|
532
|
+
const root = path.join(plugin.rootDir, distribution.skills.replace(/^\.\//u, ''));
|
|
533
|
+
const rootInfo = await fs.lstat(root).catch(() => null);
|
|
534
|
+
if (!rootInfo?.isDirectory() || rootInfo.isSymbolicLink())
|
|
535
|
+
continue;
|
|
536
|
+
for (const entry of await fs.readdir(root, { withFileTypes: true })) {
|
|
537
|
+
if (dynamicKeys.has(entry.name))
|
|
538
|
+
continue;
|
|
539
|
+
const info = await fs.lstat(path.join(root, entry.name)).catch(() => null);
|
|
540
|
+
if (entry.isDirectory() && info?.isDirectory() && !info.isSymbolicLink()) {
|
|
541
|
+
record(entry.name, plugin.manifest.name);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
return owners;
|
|
546
|
+
}
|
|
547
|
+
async function currentEvalInput(options) {
|
|
548
|
+
const evalInput = options.binding.evalInput;
|
|
549
|
+
if (options.binding.profile.kind !== 'eval' || !evalInput) {
|
|
550
|
+
throw new Error('The source binding does not contain Eval input.');
|
|
551
|
+
}
|
|
552
|
+
const plugin = options.workspace.plugins.find((entry) => entry.manifest.name === options.binding.subject.plugin);
|
|
553
|
+
if (!plugin)
|
|
554
|
+
throw new Error('The bound plugin is not present in the current Workspace.');
|
|
555
|
+
const loaded = await readAwSkillEvalManifest({ plugin, skill: options.binding.subject.skill });
|
|
556
|
+
const suite = loaded.manifest.suites.find((entry) => entry.id === options.binding.subject.suite);
|
|
557
|
+
if (!suite)
|
|
558
|
+
throw new Error('The bound Eval suite is not present in the current Workspace.');
|
|
559
|
+
const preparedEvalRoot = path.join(options.preparedRoot, 'workspace', 'eval');
|
|
560
|
+
const provider = await resolveAwSourceBindingEvalProvider({
|
|
561
|
+
evalRoot: loaded.evalRoot,
|
|
562
|
+
preparedEvalRoot,
|
|
563
|
+
suite,
|
|
564
|
+
});
|
|
565
|
+
const resolved = await resolveEvalSourceBindingInput({
|
|
566
|
+
workspaceRoot: options.workspace.workspaceRoot,
|
|
567
|
+
evalRoot: loaded.evalRoot,
|
|
568
|
+
manifestPath: loaded.manifestPath,
|
|
569
|
+
suite,
|
|
570
|
+
defaults: loaded.manifest.defaults,
|
|
571
|
+
cases: loaded.casesBySuite.get(suite.id),
|
|
572
|
+
corpusPaths: loaded.manifest.suites.map((entry) => entry.cases),
|
|
573
|
+
selection: { caseIds: evalInput.selectedCaseIds },
|
|
574
|
+
providerDigest: computeEvalProviderDigest(provider),
|
|
575
|
+
preparedEvalRoot,
|
|
576
|
+
});
|
|
577
|
+
const casesArtifact = options.binding.artifacts.find((artifact) => artifact.kind === 'eval-cases');
|
|
578
|
+
if (!casesArtifact)
|
|
579
|
+
throw new Error('The source binding does not contain prepared Eval cases.');
|
|
580
|
+
const preparedCases = await fs.readJson(path.join(options.preparedRoot, ...casesArtifact.path.split('/')));
|
|
581
|
+
if (digestCanonical(preparedCases) !== resolved.input.selectedCasesDigest) {
|
|
582
|
+
throw new Error('Prepared Eval cases do not match the current selected source cases.');
|
|
583
|
+
}
|
|
584
|
+
return resolved.input;
|
|
585
|
+
}
|
|
586
|
+
export async function validateAwSourceBindingForWorkspace(options) {
|
|
587
|
+
const bindingPath = path.resolve(options.bindingPath);
|
|
588
|
+
const info = await fs.lstat(bindingPath).catch(() => null);
|
|
589
|
+
if (!info) {
|
|
590
|
+
return {
|
|
591
|
+
state: 'incomplete',
|
|
592
|
+
binding: null,
|
|
593
|
+
outputs: [],
|
|
594
|
+
issues: [{ code: 'sourceBindingMissing', message: 'AW source binding receipt is missing.' }],
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
if (!info.isFile() || info.isSymbolicLink() || path.basename(bindingPath) !== AW_SOURCE_BINDING_FILENAME) {
|
|
598
|
+
return {
|
|
599
|
+
state: 'invalid',
|
|
600
|
+
binding: null,
|
|
601
|
+
outputs: [],
|
|
602
|
+
issues: [{ code: 'sourceBindingInvalid', message: 'AW source binding receipt path is invalid.' }],
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
let binding;
|
|
606
|
+
try {
|
|
607
|
+
binding = await readAwSourceBinding(bindingPath);
|
|
608
|
+
}
|
|
609
|
+
catch (error) {
|
|
610
|
+
const message = error instanceof Error && error.message === unsupportedV1Message
|
|
611
|
+
? unsupportedV1Message
|
|
612
|
+
: 'AW source binding receipt is invalid.';
|
|
613
|
+
return {
|
|
614
|
+
state: 'invalid',
|
|
615
|
+
binding: null,
|
|
616
|
+
outputs: [],
|
|
617
|
+
issues: [{ code: 'sourceBindingInvalid', message }],
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
const issues = [];
|
|
621
|
+
if (!sameSubject(binding.subject, options.expectedSubject)) {
|
|
622
|
+
issues.push({ code: 'sourceBindingSubjectDrift', message: 'The bound subject does not match the requested source subject.' });
|
|
623
|
+
}
|
|
624
|
+
if (!bindingMatchesWorkspaceSource(binding.source, options.context.source)) {
|
|
625
|
+
issues.push({ code: 'sourceBindingSourceDrift', message: 'The current Workspace source identity differs from the bound source.' });
|
|
626
|
+
}
|
|
627
|
+
try {
|
|
628
|
+
const current = await resolveCurrentWorkspaceAwSourceBinding({
|
|
629
|
+
context: options.context,
|
|
630
|
+
binding,
|
|
631
|
+
cwd: options.cwd,
|
|
632
|
+
env: options.env,
|
|
633
|
+
});
|
|
634
|
+
if (binding.profile.kind !== current.profile.kind
|
|
635
|
+
|| binding.profile.id !== current.profile.id
|
|
636
|
+
|| binding.profile.scope !== current.profile.scope
|
|
637
|
+
|| binding.profile.inputDigest !== current.profile.inputDigest) {
|
|
638
|
+
issues.push({ code: 'sourceBindingProfileDrift', message: 'The current profile input differs from the bound profile.' });
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
catch {
|
|
642
|
+
issues.push({ code: 'sourceBindingProfileDrift', message: 'The current profile input cannot be validated.' });
|
|
643
|
+
}
|
|
644
|
+
const rootDir = path.dirname(bindingPath);
|
|
645
|
+
if (binding.profile.kind === 'eval') {
|
|
646
|
+
try {
|
|
647
|
+
const current = await currentEvalInput({
|
|
648
|
+
workspace: options.context.workspace,
|
|
649
|
+
binding,
|
|
650
|
+
preparedRoot: rootDir,
|
|
651
|
+
});
|
|
652
|
+
if (canonicalJson(current) !== canonicalJson(binding.evalInput)) {
|
|
653
|
+
issues.push({
|
|
654
|
+
code: 'sourceBindingEvalInputDrift',
|
|
655
|
+
message: 'The current Eval source input differs from the bound source input.',
|
|
656
|
+
});
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
catch {
|
|
660
|
+
issues.push({
|
|
661
|
+
code: 'sourceBindingEvalInputDrift',
|
|
662
|
+
message: 'The current Eval source input cannot be validated against the prepared input.',
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
let portableOwners = null;
|
|
667
|
+
if (binding.profile.kind === 'portable') {
|
|
668
|
+
try {
|
|
669
|
+
portableOwners = await currentPortableArtifactOwners({
|
|
670
|
+
workspace: options.context.workspace,
|
|
671
|
+
binding,
|
|
672
|
+
});
|
|
673
|
+
}
|
|
674
|
+
catch {
|
|
675
|
+
portableOwners = new Map();
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
for (const artifact of binding.artifacts) {
|
|
679
|
+
if (artifact.kind === 'portable-skill'
|
|
680
|
+
&& portableOwners?.get(artifact.skill) !== artifact.plugin) {
|
|
681
|
+
issues.push({
|
|
682
|
+
code: 'sourceBindingArtifactDrift',
|
|
683
|
+
message: `The current source does not declare ${artifact.plugin}/${artifact.skill} in the bound dependency closure.`,
|
|
684
|
+
});
|
|
685
|
+
}
|
|
686
|
+
try {
|
|
687
|
+
const actual = await artifactDigest(rootDir, artifact);
|
|
688
|
+
if (actual !== artifact.digest) {
|
|
689
|
+
issues.push({ code: 'sourceBindingArtifactDrift', message: `The materialized artifact differs from its binding: ${artifact.path}` });
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
catch {
|
|
693
|
+
issues.push({ code: 'sourceBindingArtifactDrift', message: `The materialized artifact is missing or invalid: ${artifact.path}` });
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
return issues.length === 0
|
|
697
|
+
? {
|
|
698
|
+
state: 'verified',
|
|
699
|
+
binding,
|
|
700
|
+
outputs: binding.artifacts.map((artifact) => ({
|
|
701
|
+
...artifact,
|
|
702
|
+
path: path.resolve(rootDir, ...artifact.path.split('/')),
|
|
703
|
+
})),
|
|
704
|
+
issues: [],
|
|
705
|
+
}
|
|
706
|
+
: { state: 'drifted', binding, outputs: [], issues };
|
|
707
|
+
}
|
|
708
|
+
//# sourceMappingURL=source-binding.js.map
|