@lesliechan721/aw 0.1.0-beta.5 → 0.1.0-beta.50
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 -90
- package/dist/authoring/scripts/lib/skill-scaffold.mjs +99 -120
- 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 +346 -1131
- package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
- 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 +20 -5
- 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/test-plugin-scripts.d.ts +2 -0
- package/dist/scripts/test-plugin-scripts.js +47 -76
- 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.js +2 -2
- package/dist/src/adapters/helpers.js.map +1 -1
- package/dist/src/authoring/workspace-commands.d.ts +17 -1
- package/dist/src/authoring/workspace-commands.js +21 -4
- 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 +264 -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/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 +146 -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 +46 -0
- package/dist/src/commands/operation-planner.js +141 -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 +23 -3
- package/dist/src/commands/plugin-capabilities.js.map +1 -1
- package/dist/src/commands/rebuild-command.d.ts +77 -31
- package/dist/src/commands/rebuild-command.js +4862 -729
- package/dist/src/commands/rebuild-command.js.map +1 -1
- package/dist/src/commands/rebuild-integration.d.ts +131 -21
- package/dist/src/commands/rebuild-integration.js +2866 -1339
- package/dist/src/commands/rebuild-integration.js.map +1 -1
- package/dist/src/commands/rebuild-operations.d.ts +58 -30
- package/dist/src/commands/rebuild-operations.js +260 -319
- 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 +228 -0
- package/dist/src/commands/review-inspection.js +1341 -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 +24 -50
- 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 +2787 -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 +250 -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 +127 -31
- package/dist/src/commands/write-commands.js.map +1 -1
- package/dist/src/constants.d.ts +7 -1
- package/dist/src/constants.js +7 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/eval/manifest-v1.d.ts +71 -0
- package/dist/src/eval/manifest-v1.js +370 -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 +236 -109
- package/dist/src/generators/local-plugin.js.map +1 -1
- package/dist/src/index.d.ts +10 -4
- package/dist/src/index.js +1793 -486
- package/dist/src/index.js.map +1 -1
- package/dist/src/output/command-receipt.d.ts +43 -46
- package/dist/src/output/command-receipt.js +256 -80
- 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 +1 -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 +179 -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 +13 -0
- package/dist/src/review/skill-materialization.js +75 -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 +16 -0
- package/dist/src/tui/config-leaf-editor.js +206 -0
- package/dist/src/tui/config-leaf-editor.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 +8941 -1872
- 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 +3211 -388
- package/dist/src/tui/controller-runtime.js.map +1 -1
- package/dist/src/tui/controller.d.ts +615 -45
- package/dist/src/tui/controller.js +3558 -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 +567 -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 +223 -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 +1295 -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 +244 -20
- 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 +41 -8
- package/dist/src/utils/agent-version.js.map +1 -1
- package/dist/src/utils/artifact-plan.d.ts +5 -4
- package/dist/src/utils/artifact-plan.js +18 -7
- package/dist/src/utils/artifact-plan.js.map +1 -1
- package/dist/src/utils/artifact-renderer.d.ts +17 -7
- package/dist/src/utils/artifact-renderer.js +214 -216
- package/dist/src/utils/artifact-renderer.js.map +1 -1
- package/dist/src/utils/artifact-request.d.ts +21 -0
- package/dist/src/utils/artifact-request.js +78 -0
- package/dist/src/utils/artifact-request.js.map +1 -0
- 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 +22 -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/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 +747 -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-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 +4 -0
- package/dist/src/utils/dynamic-skill-tree.js +35 -5
- 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 +18 -1
- package/dist/src/utils/local-marketplace.js +354 -84
- package/dist/src/utils/local-marketplace.js.map +1 -1
- 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 +55 -7
- package/dist/src/utils/native-cli.js +400 -58
- package/dist/src/utils/native-cli.js.map +1 -1
- 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 +84 -20
- package/dist/src/utils/ownership.js +179 -222
- 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 +33 -0
- package/dist/src/utils/plugin-config-impact.js +298 -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 +1000 -296
- 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 +65 -125
- package/dist/src/utils/plugin-scripts.js +484 -524
- package/dist/src/utils/plugin-scripts.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/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/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 +92 -10
- package/dist/vitest.config.js.map +1 -1
- package/package.json +27 -18
- 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/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
|
@@ -2,225 +2,57 @@ import { spawn } from 'node:child_process';
|
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import fs from 'fs-extra';
|
|
5
|
-
import { inferLifecycleScriptRunnerFromPath, PLUGIN_SCRIPT_TIMEOUT_DEFAULT_MS, PLUGIN_SCRIPT_TIMEOUT_MAX_MS, PLUGIN_SCRIPT_TIMEOUT_MIN_MS, resolveLifecycleScriptForOs, } from './plugin-script-contract.js';
|
|
6
|
-
import { resolveAwHome, } from './paths.js';
|
|
7
|
-
import { resolveEffectivePluginConfig } from './plugin-config.js';
|
|
8
5
|
import { redactString } from '../output/redact.js';
|
|
6
|
+
import { createWindowsJobInvocation, observeProcessTree, terminateProcessTree, } from './process-tree.js';
|
|
7
|
+
import { resolveAwHome } from './paths.js';
|
|
8
|
+
import { resolveEffectivePluginConfig } from './plugin-config.js';
|
|
9
9
|
import { assertTestWritablePath } from './test-path-fence.js';
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
function lifecycleClaudeHome(env) {
|
|
24
|
-
return env.AW_CLAUDE_HOME || path.join(resolveAwHome(env), 'isolated-claude-home');
|
|
25
|
-
}
|
|
26
|
-
function assertLifecycleStagingPathForTests(targetPath, source) {
|
|
27
|
-
return assertTestWritablePath(targetPath, source, '用 createIsolatedTestEnv() 生成默认 AW_HOME/TMPDIR,或通过 registerWritableStateRoot() 登记 plugin lifecycle staging 路径。');
|
|
28
|
-
}
|
|
29
|
-
export async function resolveBundledPluginFilePath(options) {
|
|
30
|
-
const resolvedBundleRoot = await fs.realpath(options.bundleRoot);
|
|
31
|
-
const resolvedPath = await fs.realpath(path.join(options.bundleRoot, stripDotSlash(options.pluginRelativePath)));
|
|
32
|
-
if (!isInsidePath(resolvedPath, resolvedBundleRoot)) {
|
|
33
|
-
throw new Error(`${options.fieldName} "${options.pluginRelativePath}" resolves outside the plugin bundle root.`);
|
|
34
|
-
}
|
|
35
|
-
return resolvedPath;
|
|
36
|
-
}
|
|
37
|
-
async function createTargetFromPlugin(options) {
|
|
38
|
-
const selector = options.plugin.manifest.scripts?.lifecycle?.[options.event];
|
|
39
|
-
if (!selector) {
|
|
40
|
-
return {
|
|
41
|
-
noOp: true,
|
|
42
|
-
source: options.source,
|
|
43
|
-
bundleRoot: options.plugin.rootDir,
|
|
44
|
-
sourceManifest: options.plugin.manifest,
|
|
45
|
-
manifestPath: options.plugin.manifestPath,
|
|
46
|
-
manifestDigest: await calculateFileDigest(options.plugin.manifestPath),
|
|
47
|
-
warnings: options.warnings ?? [],
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
const entry = resolveLifecycleScriptForOs(selector, options.runtimeOs);
|
|
51
|
-
if (!entry) {
|
|
52
|
-
throw new Error(`Plugin "${options.plugin.manifest.name}" declares "${options.event}" lifecycle scripts, but none support ${options.runtimeOs}.`);
|
|
53
|
-
}
|
|
54
|
-
const bundleRoot = await fs.realpath(options.plugin.rootDir);
|
|
55
|
-
const entryPath = await resolveBundledPluginFilePath({
|
|
56
|
-
bundleRoot,
|
|
57
|
-
pluginRelativePath: entry.path,
|
|
58
|
-
fieldName: 'Lifecycle script',
|
|
59
|
-
});
|
|
60
|
-
return {
|
|
61
|
-
noOp: false,
|
|
62
|
-
source: options.source,
|
|
63
|
-
entry,
|
|
64
|
-
entryPath,
|
|
65
|
-
bundleRoot,
|
|
66
|
-
sourceManifest: options.plugin.manifest,
|
|
67
|
-
manifestPath: options.plugin.manifestPath,
|
|
68
|
-
manifestDigest: await calculateFileDigest(options.plugin.manifestPath),
|
|
69
|
-
warnings: options.warnings ?? [],
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
async function resolveCurrentPlugin(_pluginName, currentPlugin, _env) {
|
|
73
|
-
return currentPlugin;
|
|
74
|
-
}
|
|
75
|
-
function createMissingLifecycleWarning(pluginName, event) {
|
|
76
|
-
return `No executable ${event} lifecycle script was found for ${pluginName}; continuing cleanup without running a lifecycle script.`;
|
|
77
|
-
}
|
|
78
|
-
export async function resolveLifecycleScriptTarget(options) {
|
|
79
|
-
const runtime = options.runtimeOs ?? runtimeOs();
|
|
80
|
-
const warnings = [];
|
|
81
|
-
const currentPlugin = await resolveCurrentPlugin(options.pluginName, options.currentPlugin, options.env ?? process.env);
|
|
82
|
-
if (currentPlugin) {
|
|
83
|
-
return createTargetFromPlugin({
|
|
84
|
-
event: options.event,
|
|
85
|
-
plugin: currentPlugin,
|
|
86
|
-
source: 'currentCatalog',
|
|
87
|
-
runtimeOs: runtime,
|
|
88
|
-
warnings,
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
if (options.event === 'uninstall') {
|
|
92
|
-
warnings.push(createMissingLifecycleWarning(options.pluginName, options.event));
|
|
93
|
-
}
|
|
94
|
-
return { noOp: true, source: 'none', warnings };
|
|
95
|
-
}
|
|
96
|
-
function stripDotSlash(value) {
|
|
97
|
-
return value.startsWith('./') ? value.slice(2) : value;
|
|
98
|
-
}
|
|
99
|
-
function resolveAutoRunner(entry) {
|
|
100
|
-
if (entry.runner !== 'auto') {
|
|
101
|
-
return entry.runner;
|
|
10
|
+
import { attachSafeOperationError } from './safe-operation-diagnostic.js';
|
|
11
|
+
import { collectSensitiveTokenRepresentations, containsBlockedSensitiveToken, } from './sensitive-content.js';
|
|
12
|
+
export { calculateFileDigest } from './bundle-integrity.js';
|
|
13
|
+
export const PLUGIN_SCRIPT_TIMEOUT_DEFAULT_MS = 300_000;
|
|
14
|
+
export const PLUGIN_SCRIPT_TIMEOUT_MIN_MS = 1_000;
|
|
15
|
+
export const PLUGIN_SCRIPT_TIMEOUT_MAX_MS = 1_800_000;
|
|
16
|
+
const OUTPUT_LIMIT = 64 * 1024;
|
|
17
|
+
const WINDOWS_JOB_CLOSE_TIMEOUT_MS = 4_500;
|
|
18
|
+
class PluginProcessInputError extends Error {
|
|
19
|
+
constructor(cause) {
|
|
20
|
+
super('Plugin process input could not be sent.', { cause });
|
|
21
|
+
this.name = 'PluginProcessInputError';
|
|
102
22
|
}
|
|
103
|
-
const runner = inferLifecycleScriptRunnerFromPath(entry.path);
|
|
104
|
-
if (!runner) {
|
|
105
|
-
throw new Error(`Unable to infer lifecycle script runner from "${entry.path}".`);
|
|
106
|
-
}
|
|
107
|
-
return runner;
|
|
108
23
|
}
|
|
109
|
-
export function
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
let backslashes = 0;
|
|
118
|
-
for (const character of value) {
|
|
119
|
-
if (character === '\\') {
|
|
120
|
-
backslashes += 1;
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
if (character === '"') {
|
|
124
|
-
escaped += '\\'.repeat(backslashes * 2 + 1);
|
|
125
|
-
escaped += '"';
|
|
126
|
-
backslashes = 0;
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
escaped += '\\'.repeat(backslashes);
|
|
130
|
-
backslashes = 0;
|
|
131
|
-
escaped += character === '%' ? '%%' : character;
|
|
132
|
-
}
|
|
133
|
-
escaped += '\\'.repeat(backslashes * 2);
|
|
134
|
-
escaped += '"';
|
|
135
|
-
return escaped;
|
|
136
|
-
}
|
|
137
|
-
export function buildLifecycleScriptInvocation(options) {
|
|
138
|
-
const runner = resolveAutoRunner(options.entry);
|
|
139
|
-
const scriptArgs = options.entry.args ?? [];
|
|
140
|
-
if (!scriptArgs.every((arg) => typeof arg === 'string')) {
|
|
141
|
-
throw new Error('Lifecycle script args must be strings.');
|
|
142
|
-
}
|
|
143
|
-
if (runner === 'node') {
|
|
144
|
-
return {
|
|
145
|
-
command: process.execPath,
|
|
146
|
-
args: [options.entryPath, ...scriptArgs],
|
|
147
|
-
cwd: options.cwd,
|
|
148
|
-
env: options.env,
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
if (runner === 'sh' || runner === 'bash') {
|
|
152
|
-
return {
|
|
153
|
-
command: runner,
|
|
154
|
-
args: [options.entryPath, ...scriptArgs],
|
|
155
|
-
cwd: options.cwd,
|
|
156
|
-
env: options.env,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
if (runner === 'pwsh' || runner === 'powershell') {
|
|
160
|
-
return {
|
|
161
|
-
command: runner,
|
|
162
|
-
args: ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', options.entryPath, ...scriptArgs],
|
|
163
|
-
cwd: options.cwd,
|
|
164
|
-
env: options.env,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
return {
|
|
168
|
-
command: 'cmd',
|
|
169
|
-
args: ['/d', '/s', '/c', [options.entryPath, ...scriptArgs].map(quoteCmdArgument).join(' ')],
|
|
170
|
-
cwd: options.cwd,
|
|
171
|
-
env: options.env,
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
function validateTimeoutMs(value, source) {
|
|
175
|
-
if (!Number.isInteger(value) ||
|
|
176
|
-
value < PLUGIN_SCRIPT_TIMEOUT_MIN_MS ||
|
|
177
|
-
value > PLUGIN_SCRIPT_TIMEOUT_MAX_MS) {
|
|
178
|
-
throw new Error(`${source} lifecycle script timeout must be an integer between ${PLUGIN_SCRIPT_TIMEOUT_MIN_MS} and ${PLUGIN_SCRIPT_TIMEOUT_MAX_MS} ms.`);
|
|
179
|
-
}
|
|
180
|
-
return value;
|
|
24
|
+
export async function resolveBundledPluginFilePath(options) {
|
|
25
|
+
const bundleRoot = await fs.realpath(options.bundleRoot);
|
|
26
|
+
const relativePath = options.pluginRelativePath.startsWith('./') ? options.pluginRelativePath.slice(2) : options.pluginRelativePath;
|
|
27
|
+
const entryPath = await fs.realpath(path.join(bundleRoot, relativePath));
|
|
28
|
+
const relative = path.relative(bundleRoot, entryPath);
|
|
29
|
+
if (relative.startsWith('..') || path.isAbsolute(relative))
|
|
30
|
+
throw new Error(`${options.fieldName} resolves outside the plugin bundle root.`);
|
|
31
|
+
return entryPath;
|
|
181
32
|
}
|
|
182
|
-
export function
|
|
183
|
-
|
|
184
|
-
return validateTimeoutMs(options.cliTimeoutMs, 'CLI');
|
|
185
|
-
}
|
|
186
|
-
const manifestTimeout = options.manifest?.scripts?.timeoutMs;
|
|
187
|
-
if (manifestTimeout !== undefined) {
|
|
188
|
-
return validateTimeoutMs(manifestTimeout, 'Manifest');
|
|
189
|
-
}
|
|
190
|
-
return PLUGIN_SCRIPT_TIMEOUT_DEFAULT_MS;
|
|
33
|
+
export function buildNodeScriptInvocation(options) {
|
|
34
|
+
return { command: process.execPath, args: [options.entryPath, ...(options.args ?? [])], cwd: options.cwd, env: options.env, ...(options.stdin === undefined ? {} : { stdin: options.stdin }) };
|
|
191
35
|
}
|
|
192
36
|
export function buildPluginScriptSpawnEnv(options) {
|
|
193
|
-
if ((options.platform === undefined) === (options.distribution === undefined)) {
|
|
194
|
-
throw new Error('Plugin script spawn requires exactly one platform or distribution surface.');
|
|
195
|
-
}
|
|
196
37
|
const input = options.commandEnv;
|
|
197
|
-
const runtime = options.runtimeOs ?? runtimeOs();
|
|
198
38
|
const output = {
|
|
199
|
-
AW_HOME: resolveAwHome(input),
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
AW_PLUGIN_CONTEXT: options.contextPath,
|
|
204
|
-
AW_PLUGIN_ROOT: options.bundleRoot,
|
|
205
|
-
AW_PLUGIN_NAME: options.plugin.name,
|
|
206
|
-
AW_PLUGIN_VERSION: options.plugin.version,
|
|
207
|
-
AW_PLUGIN_EVENT: options.event,
|
|
208
|
-
AW_PLUGIN_SCOPE: options.scope,
|
|
39
|
+
AW_HOME: resolveAwHome(input), AW_CODEX_HOME: input.AW_CODEX_HOME || path.join(resolveAwHome(input), 'isolated-codex-home'),
|
|
40
|
+
AW_CLAUDE_HOME: input.AW_CLAUDE_HOME || path.join(resolveAwHome(input), 'isolated-claude-home'), PATH: input.PATH ?? input.Path ?? '',
|
|
41
|
+
AW_PLUGIN_CONTEXT: options.contextPath, AW_PLUGIN_ROOT: options.bundleRoot, AW_PLUGIN_NAME: options.plugin.name,
|
|
42
|
+
AW_PLUGIN_VERSION: options.plugin.version, AW_PLUGIN_EVENT: options.event, AW_PLUGIN_SCOPE: options.scope,
|
|
209
43
|
};
|
|
210
44
|
if (options.platform)
|
|
211
45
|
output.AW_PLUGIN_PLATFORM = options.platform;
|
|
212
46
|
if (options.distribution)
|
|
213
47
|
output.AW_PLUGIN_DISTRIBUTION = options.distribution;
|
|
214
|
-
if (
|
|
48
|
+
if (process.platform === 'win32') {
|
|
215
49
|
output.USERPROFILE = path.join(options.tempDir, 'home');
|
|
216
50
|
output.TEMP = path.join(options.tempDir, 'tmp');
|
|
217
51
|
output.TMP = output.TEMP;
|
|
218
|
-
if (input.SystemRoot)
|
|
52
|
+
if (input.SystemRoot)
|
|
219
53
|
output.SystemRoot = input.SystemRoot;
|
|
220
|
-
|
|
221
|
-
if (input.ComSpec) {
|
|
54
|
+
if (input.ComSpec)
|
|
222
55
|
output.ComSpec = input.ComSpec;
|
|
223
|
-
}
|
|
224
56
|
}
|
|
225
57
|
else {
|
|
226
58
|
output.HOME = path.join(options.tempDir, 'home');
|
|
@@ -228,358 +60,486 @@ export function buildPluginScriptSpawnEnv(options) {
|
|
|
228
60
|
}
|
|
229
61
|
return output;
|
|
230
62
|
}
|
|
231
|
-
export function
|
|
232
|
-
|
|
63
|
+
export function resolvePluginScriptTimeoutMs(options) {
|
|
64
|
+
const value = options.cliTimeoutMs ?? options.manifestTimeoutMs ?? PLUGIN_SCRIPT_TIMEOUT_DEFAULT_MS;
|
|
65
|
+
if (!Number.isInteger(value) || value < PLUGIN_SCRIPT_TIMEOUT_MIN_MS || value > PLUGIN_SCRIPT_TIMEOUT_MAX_MS)
|
|
66
|
+
throw new Error('Plugin script timeout is outside the supported range.');
|
|
67
|
+
return value;
|
|
68
|
+
}
|
|
69
|
+
function collectScalarLeafTokens(value) {
|
|
70
|
+
if (typeof value === 'string')
|
|
71
|
+
return value === '' ? [] : [value];
|
|
72
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
73
|
+
return [String(value)];
|
|
74
|
+
if (value === null || typeof value !== 'object')
|
|
75
|
+
return [];
|
|
76
|
+
return Object.values(value).flatMap(collectScalarLeafTokens);
|
|
233
77
|
}
|
|
234
78
|
export function collectSensitivePluginConfigValues(manifest, values) {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
.
|
|
240
|
-
|
|
241
|
-
.
|
|
79
|
+
return Object.entries(manifest.config?.fields ?? {}).flatMap(([key, field]) => {
|
|
80
|
+
const value = values[key];
|
|
81
|
+
if (value === undefined)
|
|
82
|
+
return [];
|
|
83
|
+
if (field.sensitive)
|
|
84
|
+
return collectScalarLeafTokens(value);
|
|
85
|
+
if (field.type !== 'object' || typeof value !== 'object')
|
|
86
|
+
return [];
|
|
87
|
+
return Object.entries(value).flatMap(([property, childValue]) => {
|
|
88
|
+
const child = field.properties?.[property]
|
|
89
|
+
?? (field.additionalProperties === false ? undefined : field.additionalProperties);
|
|
90
|
+
return child?.sensitive ? collectScalarLeafTokens(childValue) : [];
|
|
91
|
+
});
|
|
92
|
+
});
|
|
242
93
|
}
|
|
243
|
-
export function
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
94
|
+
export function assertNoSensitiveConfigValues(value, sensitiveValues, message) {
|
|
95
|
+
const strings = [];
|
|
96
|
+
const visit = (entry) => {
|
|
97
|
+
if (typeof entry === 'string') {
|
|
98
|
+
strings.push(entry);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (Array.isArray(entry)) {
|
|
102
|
+
entry.forEach(visit);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (entry !== null && typeof entry === 'object') {
|
|
106
|
+
Object.entries(entry).forEach(([key, child]) => {
|
|
107
|
+
strings.push(key);
|
|
108
|
+
visit(child);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
visit(value);
|
|
113
|
+
if (strings.some((entry) => containsBlockedSensitiveToken(entry, sensitiveValues))) {
|
|
114
|
+
throw new Error(message);
|
|
247
115
|
}
|
|
248
|
-
return output;
|
|
249
116
|
}
|
|
250
|
-
export function
|
|
251
|
-
|
|
252
|
-
|
|
117
|
+
export function assertNoSensitiveConfigInFiles(files, sensitiveValues, message) {
|
|
118
|
+
assertNoSensitiveConfigValues(Object.entries(files).map(([relativePath, content]) => ({
|
|
119
|
+
relativePath,
|
|
120
|
+
content: content.toString('utf8'),
|
|
121
|
+
})), sensitiveValues, message);
|
|
253
122
|
}
|
|
254
|
-
|
|
255
|
-
if (
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
123
|
+
function findSensitiveTokenMatches(value, sensitiveValue, startLimit) {
|
|
124
|
+
if (sensitiveValue === '')
|
|
125
|
+
return [];
|
|
126
|
+
const matches = [];
|
|
127
|
+
for (let start = value.indexOf(sensitiveValue); start >= 0 && start < startLimit; start = value.indexOf(sensitiveValue, start + 1)) {
|
|
128
|
+
matches.push({ start, end: start + sensitiveValue.length });
|
|
260
129
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
env: options.commandEnv,
|
|
276
|
-
});
|
|
277
|
-
if (effective.issues.length > 0) {
|
|
278
|
-
throw new Error(`Invalid AW config for ${options.target.sourceManifest.name}: ${effective.issues.map((issue) => `${issue.key} (${issue.type})`).join(', ')}.`);
|
|
130
|
+
return matches;
|
|
131
|
+
}
|
|
132
|
+
function collectMergedSensitiveTokenMatches(value, sensitiveValues, startLimit) {
|
|
133
|
+
const matches = collectSensitiveTokenRepresentations(sensitiveValues)
|
|
134
|
+
.flatMap((representation) => findSensitiveTokenMatches(value, representation, startLimit))
|
|
135
|
+
.sort((left, right) => left.start - right.start || right.end - left.end);
|
|
136
|
+
const merged = [];
|
|
137
|
+
for (const match of matches) {
|
|
138
|
+
const previous = merged.at(-1);
|
|
139
|
+
if (previous && match.start < previous.end) {
|
|
140
|
+
previous.end = Math.max(previous.end, match.end);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
merged.push({ ...match });
|
|
279
144
|
}
|
|
280
|
-
configStores = {
|
|
281
|
-
user: effective.stores.user.path,
|
|
282
|
-
project: effective.stores.project.path,
|
|
283
|
-
projectLocal: effective.stores.projectLocal.path,
|
|
284
|
-
};
|
|
285
|
-
config = {
|
|
286
|
-
schema: options.target.sourceManifest.config.schema,
|
|
287
|
-
values: effective.values,
|
|
288
|
-
sources: effective.sources,
|
|
289
|
-
issues: effective.issues,
|
|
290
|
-
};
|
|
291
145
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
const
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
146
|
+
return merged;
|
|
147
|
+
}
|
|
148
|
+
function redactSensitiveTokenWindow(value, sensitiveValues, windowEnd) {
|
|
149
|
+
const matches = collectMergedSensitiveTokenMatches(value, sensitiveValues, windowEnd);
|
|
150
|
+
let output = '';
|
|
151
|
+
let offset = 0;
|
|
152
|
+
for (const match of matches) {
|
|
153
|
+
output += `${value.slice(offset, match.start)}[REDACTED]`;
|
|
154
|
+
offset = Math.min(match.end, windowEnd);
|
|
155
|
+
}
|
|
156
|
+
return output + value.slice(offset, windowEnd);
|
|
157
|
+
}
|
|
158
|
+
export function redactPluginScriptOutput(value, sensitiveValues) {
|
|
159
|
+
return redactString(redactSensitiveTokenWindow(value, sensitiveValues, value.length));
|
|
160
|
+
}
|
|
161
|
+
export function truncatePluginScriptOutput(value) {
|
|
162
|
+
return value.slice(0, OUTPUT_LIMIT);
|
|
163
|
+
}
|
|
164
|
+
export function summarizePluginScriptOutput(value, sensitiveValues) {
|
|
165
|
+
return redactString(redactSensitiveTokenWindow(value, sensitiveValues, Math.min(value.length, OUTPUT_LIMIT))).trim();
|
|
166
|
+
}
|
|
167
|
+
function summarizePreApplyFailureOutput(value, roots, sensitiveValues) {
|
|
168
|
+
const summary = redactString(sanitizePreApplyErrorMessage(value, roots, sensitiveValues, Math.min(value.length, OUTPUT_LIMIT))).trim();
|
|
169
|
+
const lines = summary.split('\n').map((line) => line.trim()).filter(Boolean);
|
|
170
|
+
const includesRuntimeStack = lines.some((line) => line.startsWith('file://')
|
|
171
|
+
|| line.startsWith('at ')
|
|
172
|
+
|| /^Node\.js v/u.test(line));
|
|
173
|
+
if (!includesRuntimeStack)
|
|
174
|
+
return summary;
|
|
175
|
+
return lines.find((line) => /^(?:[A-Za-z]*Error|Error):/u.test(line)) ?? '';
|
|
176
|
+
}
|
|
177
|
+
function resolveOutputCaptureLimit(sensitiveValues) {
|
|
178
|
+
const maxSensitiveTokenLength = collectSensitiveTokenRepresentations(sensitiveValues).reduce((maximum, value) => Math.max(maximum, value.length), 0);
|
|
179
|
+
return OUTPUT_LIMIT + maxSensitiveTokenLength;
|
|
180
|
+
}
|
|
181
|
+
function privateRootVariants(root) {
|
|
182
|
+
const normalized = path.resolve(root);
|
|
183
|
+
return [...new Set([
|
|
184
|
+
normalized,
|
|
185
|
+
normalized.replaceAll('\\', '/'),
|
|
186
|
+
...(normalized.startsWith('/var/') ? [`/private${normalized}`] : []),
|
|
187
|
+
...(normalized.startsWith('/private/var/') ? [normalized.slice('/private'.length)] : []),
|
|
188
|
+
])];
|
|
189
|
+
}
|
|
190
|
+
function sanitizePreApplyErrorMessage(value, roots, sensitiveValues, windowEnd = value.length) {
|
|
191
|
+
const matches = [
|
|
192
|
+
...roots
|
|
193
|
+
.filter(({ root }) => root.trim() !== '')
|
|
194
|
+
.flatMap(({ root, replacement }) => privateRootVariants(root)
|
|
195
|
+
.flatMap((variant) => findSensitiveTokenMatches(value, variant, windowEnd)
|
|
196
|
+
.map((match) => ({ ...match, replacement })))),
|
|
197
|
+
...collectSensitiveTokenRepresentations(sensitiveValues)
|
|
198
|
+
.flatMap((representation) => findSensitiveTokenMatches(value, representation, windowEnd)
|
|
199
|
+
.map((match) => ({ ...match, replacement: '[REDACTED]' }))),
|
|
200
|
+
].sort((left, right) => left.start - right.start || right.end - left.end);
|
|
201
|
+
const merged = [];
|
|
202
|
+
for (const match of matches) {
|
|
203
|
+
const previous = merged.at(-1);
|
|
204
|
+
if (previous && match.start < previous.end) {
|
|
205
|
+
previous.end = Math.max(previous.end, match.end);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
merged.push({ ...match, replacement: match.replacement ?? '[REDACTED]' });
|
|
209
|
+
}
|
|
331
210
|
}
|
|
332
|
-
|
|
333
|
-
|
|
211
|
+
let output = '';
|
|
212
|
+
let offset = 0;
|
|
213
|
+
for (const match of merged) {
|
|
214
|
+
output += `${value.slice(offset, match.start)}${match.replacement}`;
|
|
215
|
+
offset = Math.min(match.end, windowEnd);
|
|
334
216
|
}
|
|
335
|
-
return
|
|
336
|
-
context,
|
|
337
|
-
contextPath,
|
|
338
|
-
tempDir,
|
|
339
|
-
sensitiveValues: collectSensitivePluginConfigValues(options.target.sourceManifest, config.values),
|
|
340
|
-
cleanup: async () => {
|
|
341
|
-
await fs.remove(tempDir);
|
|
342
|
-
},
|
|
343
|
-
};
|
|
217
|
+
return output + value.slice(offset, windowEnd);
|
|
344
218
|
}
|
|
345
|
-
export
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
219
|
+
export function createDefaultPluginProcessRunner(dependencies = {}) {
|
|
220
|
+
const platform = dependencies.platform ?? process.platform;
|
|
221
|
+
const spawnImpl = dependencies.spawn ?? spawn;
|
|
222
|
+
const observeProcessTreeImpl = dependencies.observeProcessTree ?? observeProcessTree;
|
|
223
|
+
const terminateProcessTreeImpl = dependencies.terminateProcessTree ?? terminateProcessTree;
|
|
224
|
+
const createWindowsJobInvocationImpl = dependencies.createWindowsJobInvocation ??
|
|
225
|
+
(dependencies.spawn ? undefined : createWindowsJobInvocation);
|
|
226
|
+
return {
|
|
227
|
+
run(invocation, options) {
|
|
228
|
+
return new Promise((resolve, reject) => {
|
|
229
|
+
options.signal?.throwIfAborted();
|
|
230
|
+
const marker = randomUUID();
|
|
231
|
+
const windowsJobInvocation = platform === 'win32' && createWindowsJobInvocationImpl
|
|
232
|
+
? createWindowsJobInvocationImpl(invocation.command, invocation.args)
|
|
233
|
+
: undefined;
|
|
234
|
+
// Keep long Catalog snapshot directories accessible to libuv's Windows cwd resolution.
|
|
235
|
+
const cwd = platform === 'win32' ? path.win32.toNamespacedPath(invocation.cwd) : invocation.cwd;
|
|
236
|
+
const child = spawnImpl(windowsJobInvocation?.command ?? invocation.command, windowsJobInvocation?.args ?? invocation.args, { cwd, env: { ...invocation.env, AW_NATIVE_CLI_PROCESS_MARKER: marker }, shell: false, stdio: ['pipe', 'pipe', 'pipe'], detached: platform !== 'win32' });
|
|
237
|
+
let stdout = '';
|
|
238
|
+
let stderr = '';
|
|
239
|
+
let timedOut = false;
|
|
240
|
+
let aborted = false;
|
|
241
|
+
let settled = false;
|
|
242
|
+
let terminating = false;
|
|
243
|
+
let stdoutBytes = 0;
|
|
244
|
+
let stdoutTruncated = false;
|
|
245
|
+
let inputCompleted = child.stdin === null;
|
|
246
|
+
let inputError;
|
|
247
|
+
let childExited = false;
|
|
248
|
+
let cleanupCompleted = false;
|
|
249
|
+
let completedExitCode = null;
|
|
250
|
+
let completedSignal = null;
|
|
251
|
+
let windowsJobCloseTimer;
|
|
252
|
+
const outputCaptureLimit = resolveOutputCaptureLimit(options.sensitiveValues ?? []);
|
|
253
|
+
let observation;
|
|
254
|
+
if (!windowsJobInvocation && child.pid !== undefined)
|
|
255
|
+
observation = observeProcessTreeImpl(child.pid, marker);
|
|
256
|
+
const timer = setTimeout(() => { timedOut = true; terminate(); }, options.timeoutMs);
|
|
257
|
+
const abort = () => { aborted = true; terminate(); };
|
|
258
|
+
const cleanup = () => { clearTimeout(timer); if (windowsJobCloseTimer)
|
|
259
|
+
clearTimeout(windowsJobCloseTimer); options.signal?.removeEventListener('abort', abort); observation?.dispose(); };
|
|
260
|
+
const result = () => ({ exitCode: completedExitCode, signal: completedSignal, stdout, stderr, timedOut, ...(stdoutTruncated ? { stdoutTruncated: true } : {}) });
|
|
261
|
+
const settleImmediately = (error) => {
|
|
262
|
+
if (settled)
|
|
263
|
+
return;
|
|
264
|
+
settled = true;
|
|
265
|
+
cleanup();
|
|
266
|
+
reject(error);
|
|
267
|
+
};
|
|
268
|
+
const settleIfComplete = () => {
|
|
269
|
+
if (settled || !childExited || !cleanupCompleted || !inputCompleted)
|
|
270
|
+
return;
|
|
271
|
+
settled = true;
|
|
272
|
+
cleanup();
|
|
273
|
+
if (aborted) {
|
|
274
|
+
try {
|
|
275
|
+
options.signal?.throwIfAborted();
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
reject(error);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
392
281
|
}
|
|
393
|
-
|
|
394
|
-
|
|
282
|
+
if (inputError && !(inputError.code === 'EPIPE'
|
|
283
|
+
&& completedExitCode === 0
|
|
284
|
+
&& completedSignal === null) && !timedOut && completedExitCode === 0 && completedSignal === null) {
|
|
285
|
+
reject(new PluginProcessInputError(inputError));
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
resolve(result());
|
|
289
|
+
};
|
|
290
|
+
function terminate(requireConfirmedCleanup = false, allowUnobservedWindowsProcessOnNormalCompletion = false) {
|
|
291
|
+
if (settled || terminating)
|
|
292
|
+
return;
|
|
293
|
+
terminating = true;
|
|
294
|
+
clearTimeout(timer);
|
|
295
|
+
const direct = (signal) => { if (child.exitCode === null && child.signalCode === null)
|
|
296
|
+
child.kill(signal); };
|
|
297
|
+
if (windowsJobInvocation) {
|
|
298
|
+
try {
|
|
299
|
+
if (child.exitCode === null && child.signalCode === null && child.kill('SIGKILL') === false) {
|
|
300
|
+
throw new Error('Windows Job helper did not accept termination.');
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
settleImmediately(error);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
windowsJobCloseTimer = setTimeout(() => settleImmediately(new Error('Windows Job helper exit could not be confirmed.')), WINDOWS_JOB_CLOSE_TIMEOUT_MS);
|
|
308
|
+
windowsJobCloseTimer.unref();
|
|
395
309
|
return;
|
|
396
310
|
}
|
|
311
|
+
const termination = child.pid === undefined
|
|
312
|
+
? Promise.resolve(direct('SIGKILL'))
|
|
313
|
+
: terminateProcessTreeImpl(child.pid, direct, {}, {
|
|
314
|
+
observation,
|
|
315
|
+
requireConfirmedCleanup,
|
|
316
|
+
...(allowUnobservedWindowsProcessOnNormalCompletion
|
|
317
|
+
? { allowUnobservedWindowsProcessOnNormalCompletion: true }
|
|
318
|
+
: {}),
|
|
319
|
+
});
|
|
320
|
+
void Promise.resolve(termination).then(() => { cleanupCompleted = true; settleIfComplete(); }, (error) => settleImmediately(error));
|
|
397
321
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
322
|
+
child.stdout?.setEncoding('utf8');
|
|
323
|
+
child.stderr?.setEncoding('utf8');
|
|
324
|
+
child.stdout?.on('data', (chunk) => {
|
|
325
|
+
if (options.maxStdoutBytes === undefined) {
|
|
326
|
+
if (stdout.length < outputCaptureLimit)
|
|
327
|
+
stdout += chunk.slice(0, outputCaptureLimit - stdout.length);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
const bytes = Buffer.from(chunk, 'utf8');
|
|
331
|
+
const remaining = Math.max(0, options.maxStdoutBytes - stdoutBytes);
|
|
332
|
+
stdout += bytes.subarray(0, remaining).toString('utf8');
|
|
333
|
+
stdoutBytes += bytes.length;
|
|
334
|
+
if (stdoutBytes > options.maxStdoutBytes) {
|
|
335
|
+
stdoutTruncated = true;
|
|
336
|
+
terminate(true);
|
|
337
|
+
}
|
|
404
338
|
});
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
if (settled ||
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
339
|
+
child.stderr?.on('data', (chunk) => { if (stderr.length < outputCaptureLimit)
|
|
340
|
+
stderr += chunk.slice(0, outputCaptureLimit - stderr.length); });
|
|
341
|
+
child.on('error', (error) => { if (!settled && (!terminating || windowsJobInvocation))
|
|
342
|
+
settleImmediately(error); });
|
|
343
|
+
const complete = (exitCode, signal) => {
|
|
344
|
+
if (settled)
|
|
345
|
+
return;
|
|
346
|
+
childExited = true;
|
|
347
|
+
completedExitCode = exitCode;
|
|
348
|
+
completedSignal = signal;
|
|
349
|
+
if (windowsJobInvocation) {
|
|
350
|
+
cleanupCompleted = true;
|
|
351
|
+
settleIfComplete();
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
if (terminating) {
|
|
355
|
+
settleIfComplete();
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
terminate(true, platform === 'win32' && exitCode === 0 && signal === null);
|
|
414
359
|
};
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
child.on('close', (exitCode, signal) => {
|
|
436
|
-
if (settled || terminating)
|
|
437
|
-
return;
|
|
438
|
-
settled = true;
|
|
439
|
-
cleanup();
|
|
440
|
-
resolve({ exitCode, signal, stdout, stderr, timedOut });
|
|
360
|
+
child.on(platform === 'win32' ? 'close' : 'exit', complete);
|
|
361
|
+
if (child.stdin) {
|
|
362
|
+
const completeInput = (error) => {
|
|
363
|
+
if (error !== undefined && error !== null)
|
|
364
|
+
inputError = error;
|
|
365
|
+
inputCompleted = true;
|
|
366
|
+
settleIfComplete();
|
|
367
|
+
};
|
|
368
|
+
child.stdin.once('error', completeInput);
|
|
369
|
+
child.stdin.once('finish', completeInput);
|
|
370
|
+
try {
|
|
371
|
+
child.stdin.end(invocation.stdin ?? '', completeInput);
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
completeInput(error);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
options.signal?.addEventListener('abort', abort, { once: true });
|
|
378
|
+
if (options.signal?.aborted)
|
|
379
|
+
abort();
|
|
441
380
|
});
|
|
442
|
-
options.signal?.addEventListener('abort', abort, { once: true });
|
|
443
|
-
if (options.signal?.aborted)
|
|
444
|
-
abort();
|
|
445
|
-
});
|
|
446
|
-
},
|
|
447
|
-
};
|
|
448
|
-
async function emitLifecycleEvent(context, event) {
|
|
449
|
-
const commandEvent = {
|
|
450
|
-
type: event.type,
|
|
451
|
-
message: event.message,
|
|
452
|
-
data: event.data,
|
|
453
|
-
level: event.level,
|
|
454
|
-
source: {
|
|
455
|
-
plugin: event.plugin,
|
|
456
|
-
platform: event.platform,
|
|
457
|
-
scope: event.scope,
|
|
458
|
-
action: 'lifecycle',
|
|
459
381
|
},
|
|
460
382
|
};
|
|
461
|
-
await context.reporter.event(commandEvent);
|
|
462
|
-
await context.debugLogger.log(commandEvent);
|
|
463
383
|
}
|
|
464
|
-
export
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
message: `${options.event} lifecycle script is not declared.`,
|
|
491
|
-
plugin: options.pluginName,
|
|
492
|
-
platform: options.platform,
|
|
493
|
-
scope: options.scope,
|
|
494
|
-
level: 'debug',
|
|
495
|
-
});
|
|
496
|
-
return { executed: false, target };
|
|
497
|
-
}
|
|
498
|
-
const writtenContext = await writeLifecycleScriptContext({
|
|
499
|
-
sourceId: options.currentPlugin?.sourceId,
|
|
500
|
-
sourceIdentity: options.currentPlugin?.sourceIdentity,
|
|
501
|
-
target,
|
|
502
|
-
event: options.event,
|
|
503
|
-
platform: options.platform,
|
|
504
|
-
scope: options.scope,
|
|
505
|
-
cwd: options.cwd,
|
|
506
|
-
commandEnv: options.context.env,
|
|
507
|
-
artifacts: options.artifacts,
|
|
508
|
-
});
|
|
384
|
+
export const defaultPluginProcessRunner = createDefaultPluginProcessRunner();
|
|
385
|
+
export async function runPreApplyScript(options) {
|
|
386
|
+
const declaration = options.plugin.manifest.scripts?.preApply;
|
|
387
|
+
if (!declaration)
|
|
388
|
+
return;
|
|
389
|
+
const awHome = resolveAwHome(options.context.env);
|
|
390
|
+
const codexHome = options.context.env.AW_CODEX_HOME || path.join(awHome, 'isolated-codex-home');
|
|
391
|
+
const claudeHome = options.context.env.AW_CLAUDE_HOME || path.join(awHome, 'isolated-claude-home');
|
|
392
|
+
let tempDir;
|
|
393
|
+
let interruptSignal;
|
|
394
|
+
let interruptReason;
|
|
395
|
+
let sensitiveValues = [];
|
|
396
|
+
let runnerCleanupConfirmed = false;
|
|
397
|
+
let removeInterruptListeners;
|
|
398
|
+
const privateRoots = () => [
|
|
399
|
+
...(tempDir ? [
|
|
400
|
+
{ root: path.join(tempDir, 'home'), replacement: '[temporary-home]' },
|
|
401
|
+
{ root: path.join(tempDir, 'tmp'), replacement: '[temporary]' },
|
|
402
|
+
{ root: tempDir, replacement: '[temporary]' },
|
|
403
|
+
] : []),
|
|
404
|
+
{ root: codexHome, replacement: '[codex-home]' },
|
|
405
|
+
{ root: claudeHome, replacement: '[claude-home]' },
|
|
406
|
+
{ root: awHome, replacement: '[aw-home]' },
|
|
407
|
+
{ root: options.plugin.rootDir, replacement: '[plugin-root]' },
|
|
408
|
+
{ root: options.cwd, replacement: '[project-root]' },
|
|
409
|
+
];
|
|
509
410
|
try {
|
|
510
|
-
await
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
const
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
const
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
scope: options.scope,
|
|
555
|
-
level: result.exitCode === 0 && !result.timedOut ? 'info' : 'warning',
|
|
556
|
-
data: {
|
|
557
|
-
event: options.event,
|
|
558
|
-
exitCode: result.exitCode,
|
|
559
|
-
signal: result.signal,
|
|
560
|
-
timedOut: result.timedOut,
|
|
561
|
-
stdout: stdoutSummary,
|
|
562
|
-
stderr: stderrSummary,
|
|
563
|
-
},
|
|
564
|
-
});
|
|
565
|
-
if (result.timedOut) {
|
|
566
|
-
throw new Error(`Lifecycle script "${options.event}" timed out after ${timeoutMs} ms. stderr: ${stderrSummary}`);
|
|
411
|
+
const entryPath = await resolveBundledPluginFilePath({ bundleRoot: options.plugin.rootDir, pluginRelativePath: declaration.path, fieldName: 'preApply script' });
|
|
412
|
+
const effective = options.plugin.manifest.config?.fields
|
|
413
|
+
? await resolveEffectivePluginConfig({ sourceId: options.plugin.sourceId, sourceIdentity: options.plugin.sourceIdentity, logicalIdentity: options.plugin.catalogLogicalIdentity, pluginName: options.plugin.manifest.name, manifest: options.plugin.manifest, targetScope: options.scope, cwd: options.cwd, env: options.context.env })
|
|
414
|
+
: { values: {}, issues: [] };
|
|
415
|
+
if (effective.issues.length > 0)
|
|
416
|
+
throw new Error(`preApply config is invalid for ${options.plugin.manifest.name}.`);
|
|
417
|
+
const payload = {
|
|
418
|
+
schemaVersion: 1,
|
|
419
|
+
plugin: { pluginId: options.plugin.pluginId ?? `${options.plugin.sourceId}/${options.plugin.manifest.name}`, name: options.plugin.manifest.name, version: options.plugin.manifest.version, rootDir: options.plugin.rootDir },
|
|
420
|
+
target: { platform: options.platform, scope: options.scope, ...(options.scope === 'project' ? { projectRoot: options.cwd } : {}) },
|
|
421
|
+
config: { values: effective.values },
|
|
422
|
+
};
|
|
423
|
+
const tempRoot = assertTestWritablePath(path.join(awHome, 'tmp'), 'preApply temp root');
|
|
424
|
+
await fs.ensureDir(tempRoot);
|
|
425
|
+
tempDir = await fs.mkdtemp(path.join(tempRoot, 'plugin-pre-apply-'));
|
|
426
|
+
await fs.ensureDir(path.join(tempDir, 'home'));
|
|
427
|
+
await fs.ensureDir(path.join(tempDir, 'tmp'));
|
|
428
|
+
const env = buildPluginScriptSpawnEnv({ commandEnv: options.context.env, contextPath: '', tempDir, plugin: payload.plugin, event: 'preApply', platform: options.platform, scope: options.scope, bundleRoot: options.plugin.rootDir });
|
|
429
|
+
delete env.AW_PLUGIN_CONTEXT;
|
|
430
|
+
sensitiveValues = collectSensitivePluginConfigValues(options.plugin.manifest, effective.values);
|
|
431
|
+
const invocation = buildNodeScriptInvocation({ entryPath, cwd: options.plugin.rootDir, env, stdin: `${JSON.stringify(payload)}\n` });
|
|
432
|
+
const runOptions = { timeoutMs: resolvePluginScriptTimeoutMs({ cliTimeoutMs: options.scriptTimeoutMs, manifestTimeoutMs: declaration.timeoutMs }) };
|
|
433
|
+
const interruptController = new AbortController();
|
|
434
|
+
const handleInterrupt = (signal) => {
|
|
435
|
+
if (interruptSignal)
|
|
436
|
+
return;
|
|
437
|
+
interruptSignal = signal;
|
|
438
|
+
interruptReason = new Error(`preApply interrupted by ${signal}.`);
|
|
439
|
+
interruptController.abort(interruptReason);
|
|
440
|
+
};
|
|
441
|
+
const handleSigint = () => handleInterrupt('SIGINT');
|
|
442
|
+
const handleSigterm = () => handleInterrupt('SIGTERM');
|
|
443
|
+
process.on('SIGINT', handleSigint);
|
|
444
|
+
process.on('SIGTERM', handleSigterm);
|
|
445
|
+
removeInterruptListeners = () => {
|
|
446
|
+
process.removeListener('SIGINT', handleSigint);
|
|
447
|
+
process.removeListener('SIGTERM', handleSigterm);
|
|
448
|
+
};
|
|
449
|
+
let result;
|
|
450
|
+
try {
|
|
451
|
+
result = options.runner
|
|
452
|
+
? await options.runner.run(invocation, { ...runOptions, signal: interruptController.signal })
|
|
453
|
+
: await defaultPluginProcessRunner.run(invocation, { ...runOptions, sensitiveValues, signal: interruptController.signal });
|
|
454
|
+
runnerCleanupConfirmed = true;
|
|
567
455
|
}
|
|
456
|
+
catch (error) {
|
|
457
|
+
if (interruptSignal && error === interruptReason) {
|
|
458
|
+
runnerCleanupConfirmed = true;
|
|
459
|
+
}
|
|
460
|
+
else if (interruptSignal) {
|
|
461
|
+
throw new Error(`preApply process cleanup failed after ${interruptSignal}.`);
|
|
462
|
+
}
|
|
463
|
+
else if (error instanceof PluginProcessInputError) {
|
|
464
|
+
throw attachSafeOperationError(new Error('preApply input could not be sent.'), {
|
|
465
|
+
code: 'preApplyInputFailed',
|
|
466
|
+
stage: 'preApply',
|
|
467
|
+
safeMessage: 'The preApply context could not be sent to the process.',
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
const causeCode = error && typeof error === 'object' && 'code' in error
|
|
472
|
+
&& typeof error.code === 'string' ? error.code : undefined;
|
|
473
|
+
const safeCauseCode = causeCode === 'ENOENT' || causeCode === 'EACCES' || causeCode === 'EPERM'
|
|
474
|
+
? causeCode : undefined;
|
|
475
|
+
throw attachSafeOperationError(new Error('preApply could not start.'), {
|
|
476
|
+
code: safeCauseCode === 'ENOENT' ? 'preApplyExecutableMissing' : 'preApplyStartFailed',
|
|
477
|
+
stage: 'preApply',
|
|
478
|
+
safeMessage: causeCode === 'ENOENT'
|
|
479
|
+
? 'The preApply executable is not available.'
|
|
480
|
+
: 'The preApply process could not start.',
|
|
481
|
+
...(safeCauseCode ? {
|
|
482
|
+
cause: { code: safeCauseCode, safeMessage: `Process start failed (${safeCauseCode}).` },
|
|
483
|
+
} : {}),
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
if (!result)
|
|
488
|
+
return;
|
|
489
|
+
const stdout = summarizePreApplyFailureOutput(result.stdout, privateRoots(), sensitiveValues);
|
|
490
|
+
const stderr = summarizePreApplyFailureOutput(result.stderr, privateRoots(), sensitiveValues);
|
|
491
|
+
const output = [
|
|
492
|
+
...(stdout ? [`stdout: ${stdout}`] : []),
|
|
493
|
+
...(stderr ? [`stderr: ${stderr}`] : []),
|
|
494
|
+
].join('; ');
|
|
495
|
+
if (result.timedOut)
|
|
496
|
+
throw attachSafeOperationError(new Error(`preApply timed out.${output ? ` ${output}` : ''}`), {
|
|
497
|
+
code: 'preApplyTimedOut',
|
|
498
|
+
stage: 'preApply',
|
|
499
|
+
safeMessage: 'The preApply process timed out.',
|
|
500
|
+
exitCode: 124,
|
|
501
|
+
});
|
|
568
502
|
if (result.exitCode !== 0) {
|
|
569
|
-
throw new Error(`
|
|
503
|
+
throw attachSafeOperationError(new Error(`preApply failed with exit code ${result.exitCode}.${output ? ` ${output}` : ''}`), {
|
|
504
|
+
code: 'preApplyExited',
|
|
505
|
+
stage: 'preApply',
|
|
506
|
+
safeMessage: 'The preApply process exited unsuccessfully.',
|
|
507
|
+
...(result.exitCode === null ? {} : { exitCode: result.exitCode }),
|
|
508
|
+
});
|
|
570
509
|
}
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
};
|
|
510
|
+
}
|
|
511
|
+
catch (error) {
|
|
512
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
513
|
+
const failure = new Error(redactString(sanitizePreApplyErrorMessage(message, privateRoots(), sensitiveValues)));
|
|
514
|
+
const diagnostic = error && typeof error === 'object' && 'operationDiagnostic' in error
|
|
515
|
+
? error.operationDiagnostic
|
|
516
|
+
: undefined;
|
|
517
|
+
throw diagnostic ? Object.assign(failure, { operationDiagnostic: diagnostic }) : failure;
|
|
580
518
|
}
|
|
581
519
|
finally {
|
|
582
|
-
|
|
520
|
+
let tempCleanupError;
|
|
521
|
+
try {
|
|
522
|
+
if (tempDir)
|
|
523
|
+
await fs.remove(tempDir);
|
|
524
|
+
}
|
|
525
|
+
catch (error) {
|
|
526
|
+
tempCleanupError = error;
|
|
527
|
+
}
|
|
528
|
+
removeInterruptListeners?.();
|
|
529
|
+
if (interruptSignal) {
|
|
530
|
+
if (tempCleanupError) {
|
|
531
|
+
process.stderr.write(`preApply temporary directory cleanup failed after ${interruptSignal}.\n`);
|
|
532
|
+
process.exit(1);
|
|
533
|
+
}
|
|
534
|
+
if (!runnerCleanupConfirmed) {
|
|
535
|
+
process.stderr.write(`preApply process cleanup failed after ${interruptSignal}.\n`);
|
|
536
|
+
process.exit(1);
|
|
537
|
+
}
|
|
538
|
+
process.exit(interruptSignal === 'SIGINT' ? 130 : 143);
|
|
539
|
+
}
|
|
540
|
+
if (tempCleanupError) {
|
|
541
|
+
throw tempCleanupError;
|
|
542
|
+
}
|
|
583
543
|
}
|
|
584
544
|
}
|
|
585
545
|
//# sourceMappingURL=plugin-scripts.js.map
|