mewkit 1.15.0 → 1.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +24 -0
- package/README.md +29 -70
- package/dist/commands/visual-plan.d.ts +23 -0
- package/dist/commands/visual-plan.d.ts.map +1 -0
- package/dist/commands/visual-plan.js +26 -0
- package/dist/commands/visual-plan.js.map +1 -0
- package/dist/core/capability.d.ts +81 -81
- package/dist/core/consolidation-ledger.d.ts.map +1 -1
- package/dist/core/consolidation-ledger.js +13 -11
- package/dist/core/consolidation-ledger.js.map +1 -1
- package/dist/core/install-metadata.d.ts +27 -27
- package/dist/core/plugin-manifest.d.ts +16 -16
- package/dist/core/release-metadata.d.ts +2 -2
- package/dist/core/task-record.d.ts +8 -8
- package/dist/index.js +33 -21
- package/dist/index.js.map +1 -1
- package/dist/local-web/atomic-write.d.ts +15 -0
- package/dist/local-web/atomic-write.d.ts.map +1 -0
- package/dist/local-web/atomic-write.js +69 -0
- package/dist/local-web/atomic-write.js.map +1 -0
- package/dist/local-web/constants.d.ts +13 -0
- package/dist/local-web/constants.d.ts.map +1 -0
- package/dist/local-web/constants.js +13 -0
- package/dist/local-web/constants.js.map +1 -0
- package/dist/local-web/etag.d.ts +19 -0
- package/dist/local-web/etag.d.ts.map +1 -0
- package/dist/local-web/etag.js +32 -0
- package/dist/local-web/etag.js.map +1 -0
- package/dist/local-web/host-guard.d.ts +12 -0
- package/dist/local-web/host-guard.d.ts.map +1 -0
- package/dist/local-web/host-guard.js +18 -0
- package/dist/local-web/host-guard.js.map +1 -0
- package/dist/local-web/index.d.ts +23 -0
- package/dist/local-web/index.d.ts.map +1 -0
- package/dist/local-web/index.js +23 -0
- package/dist/local-web/index.js.map +1 -0
- package/dist/local-web/local-server.d.ts +37 -0
- package/dist/local-web/local-server.d.ts.map +1 -0
- package/dist/local-web/local-server.js +85 -0
- package/dist/local-web/local-server.js.map +1 -0
- package/dist/local-web/open-browser.d.ts +12 -0
- package/dist/local-web/open-browser.d.ts.map +1 -0
- package/dist/{orchviz/open-url.js → local-web/open-browser.js} +9 -8
- package/dist/local-web/open-browser.js.map +1 -0
- package/dist/local-web/origin-guard.d.ts +11 -0
- package/dist/local-web/origin-guard.d.ts.map +1 -0
- package/dist/local-web/origin-guard.js +15 -0
- package/dist/local-web/origin-guard.js.map +1 -0
- package/dist/local-web/path-boundary.d.ts +20 -0
- package/dist/local-web/path-boundary.d.ts.map +1 -0
- package/dist/local-web/path-boundary.js +39 -0
- package/dist/local-web/path-boundary.js.map +1 -0
- package/dist/local-web/request-body.d.ts +24 -0
- package/dist/local-web/request-body.d.ts.map +1 -0
- package/dist/local-web/request-body.js +68 -0
- package/dist/local-web/request-body.js.map +1 -0
- package/dist/local-web/static-handler.d.ts +14 -0
- package/dist/local-web/static-handler.d.ts.map +1 -0
- package/dist/{orchviz/server → local-web}/static-handler.js +11 -6
- package/dist/local-web/static-handler.js.map +1 -0
- package/dist/migrate/reconcile/portable-manifest.d.ts +12 -12
- package/dist/migrate/reconcile/portable-registry.d.ts +24 -24
- package/dist/migrate/types.d.ts +10 -10
- package/dist/{orchviz/token-estimator.d.ts → token-estimator/index.d.ts} +6 -1
- package/dist/token-estimator/index.d.ts.map +1 -0
- package/dist/{orchviz/token-estimator.js → token-estimator/index.js} +11 -2
- package/dist/token-estimator/index.js.map +1 -0
- package/dist/visual-plan/__fixtures__/valid-plan.d.ts +15 -0
- package/dist/visual-plan/__fixtures__/valid-plan.d.ts.map +1 -0
- package/dist/visual-plan/__fixtures__/valid-plan.js +79 -0
- package/dist/visual-plan/__fixtures__/valid-plan.js.map +1 -0
- package/dist/visual-plan/application/apply-feedback.d.ts +31 -0
- package/dist/visual-plan/application/apply-feedback.d.ts.map +1 -0
- package/dist/visual-plan/application/apply-feedback.js +85 -0
- package/dist/visual-plan/application/apply-feedback.js.map +1 -0
- package/dist/visual-plan/application/apply-patch-op.d.ts +13 -0
- package/dist/visual-plan/application/apply-patch-op.d.ts.map +1 -0
- package/dist/visual-plan/application/apply-patch-op.js +72 -0
- package/dist/visual-plan/application/apply-patch-op.js.map +1 -0
- package/dist/visual-plan/application/approve.d.ts +24 -0
- package/dist/visual-plan/application/approve.d.ts.map +1 -0
- package/dist/visual-plan/application/approve.js +53 -0
- package/dist/visual-plan/application/approve.js.map +1 -0
- package/dist/visual-plan/application/clock.d.ts +8 -0
- package/dist/visual-plan/application/clock.d.ts.map +1 -0
- package/dist/visual-plan/application/clock.js +10 -0
- package/dist/visual-plan/application/clock.js.map +1 -0
- package/dist/visual-plan/application/export-plan.d.ts +19 -0
- package/dist/visual-plan/application/export-plan.d.ts.map +1 -0
- package/dist/visual-plan/application/export-plan.js +74 -0
- package/dist/visual-plan/application/export-plan.js.map +1 -0
- package/dist/visual-plan/application/patch-plan.d.ts +26 -0
- package/dist/visual-plan/application/patch-plan.d.ts.map +1 -0
- package/dist/visual-plan/application/patch-plan.js +48 -0
- package/dist/visual-plan/application/patch-plan.js.map +1 -0
- package/dist/visual-plan/application/prepare-feedback.d.ts +24 -0
- package/dist/visual-plan/application/prepare-feedback.d.ts.map +1 -0
- package/dist/visual-plan/application/prepare-feedback.js +70 -0
- package/dist/visual-plan/application/prepare-feedback.js.map +1 -0
- package/dist/visual-plan/application/rehash.d.ts +19 -0
- package/dist/visual-plan/application/rehash.d.ts.map +1 -0
- package/dist/visual-plan/application/rehash.js +43 -0
- package/dist/visual-plan/application/rehash.js.map +1 -0
- package/dist/visual-plan/application/status.d.ts +20 -0
- package/dist/visual-plan/application/status.d.ts.map +1 -0
- package/dist/visual-plan/application/status.js +27 -0
- package/dist/visual-plan/application/status.js.map +1 -0
- package/dist/visual-plan/application/validate-plan.d.ts +30 -0
- package/dist/visual-plan/application/validate-plan.d.ts.map +1 -0
- package/dist/visual-plan/application/validate-plan.js +59 -0
- package/dist/visual-plan/application/validate-plan.js.map +1 -0
- package/dist/visual-plan/domain/coverage.d.ts +35 -0
- package/dist/visual-plan/domain/coverage.d.ts.map +1 -0
- package/dist/visual-plan/domain/coverage.js +99 -0
- package/dist/visual-plan/domain/coverage.js.map +1 -0
- package/dist/visual-plan/domain/cross-refs.d.ts +20 -0
- package/dist/visual-plan/domain/cross-refs.d.ts.map +1 -0
- package/dist/visual-plan/domain/cross-refs.js +92 -0
- package/dist/visual-plan/domain/cross-refs.js.map +1 -0
- package/dist/visual-plan/domain/errors.d.ts +43 -0
- package/dist/visual-plan/domain/errors.d.ts.map +1 -0
- package/dist/visual-plan/domain/errors.js +33 -0
- package/dist/visual-plan/domain/errors.js.map +1 -0
- package/dist/visual-plan/domain/feedback-schemas.d.ts +160 -0
- package/dist/visual-plan/domain/feedback-schemas.d.ts.map +1 -0
- package/dist/visual-plan/domain/feedback-schemas.js +71 -0
- package/dist/visual-plan/domain/feedback-schemas.js.map +1 -0
- package/dist/visual-plan/domain/ids.d.ts +21 -0
- package/dist/visual-plan/domain/ids.d.ts.map +1 -0
- package/dist/visual-plan/domain/ids.js +25 -0
- package/dist/visual-plan/domain/ids.js.map +1 -0
- package/dist/visual-plan/domain/patches.d.ts +176 -0
- package/dist/visual-plan/domain/patches.d.ts.map +1 -0
- package/dist/visual-plan/domain/patches.js +41 -0
- package/dist/visual-plan/domain/patches.js.map +1 -0
- package/dist/visual-plan/domain/sanitizer-config.d.ts +61 -0
- package/dist/visual-plan/domain/sanitizer-config.d.ts.map +1 -0
- package/dist/visual-plan/domain/sanitizer-config.js +70 -0
- package/dist/visual-plan/domain/sanitizer-config.js.map +1 -0
- package/dist/visual-plan/domain/schemas.d.ts +1492 -0
- package/dist/visual-plan/domain/schemas.d.ts.map +1 -0
- package/dist/visual-plan/domain/schemas.js +166 -0
- package/dist/visual-plan/domain/schemas.js.map +1 -0
- package/dist/visual-plan/domain/wireframe-theme.d.ts +24 -0
- package/dist/visual-plan/domain/wireframe-theme.d.ts.map +1 -0
- package/dist/visual-plan/domain/wireframe-theme.js +169 -0
- package/dist/visual-plan/domain/wireframe-theme.js.map +1 -0
- package/dist/visual-plan/infrastructure/atomic-write.d.ts +11 -0
- package/dist/visual-plan/infrastructure/atomic-write.d.ts.map +1 -0
- package/dist/visual-plan/infrastructure/atomic-write.js +44 -0
- package/dist/visual-plan/infrastructure/atomic-write.js.map +1 -0
- package/dist/visual-plan/infrastructure/feedback-repository.d.ts +18 -0
- package/dist/visual-plan/infrastructure/feedback-repository.d.ts.map +1 -0
- package/dist/visual-plan/infrastructure/feedback-repository.js +59 -0
- package/dist/visual-plan/infrastructure/feedback-repository.js.map +1 -0
- package/dist/visual-plan/infrastructure/hashing.d.ts +37 -0
- package/dist/visual-plan/infrastructure/hashing.d.ts.map +1 -0
- package/dist/visual-plan/infrastructure/hashing.js +81 -0
- package/dist/visual-plan/infrastructure/hashing.js.map +1 -0
- package/dist/visual-plan/infrastructure/plan-state.d.ts +32 -0
- package/dist/visual-plan/infrastructure/plan-state.d.ts.map +1 -0
- package/dist/visual-plan/infrastructure/plan-state.js +58 -0
- package/dist/visual-plan/infrastructure/plan-state.js.map +1 -0
- package/dist/visual-plan/infrastructure/receipt-repository.d.ts +17 -0
- package/dist/visual-plan/infrastructure/receipt-repository.d.ts.map +1 -0
- package/dist/visual-plan/infrastructure/receipt-repository.js +59 -0
- package/dist/visual-plan/infrastructure/receipt-repository.js.map +1 -0
- package/dist/visual-plan/infrastructure/visual-plan-repository.d.ts +38 -0
- package/dist/visual-plan/infrastructure/visual-plan-repository.d.ts.map +1 -0
- package/dist/visual-plan/infrastructure/visual-plan-repository.js +97 -0
- package/dist/visual-plan/infrastructure/visual-plan-repository.js.map +1 -0
- package/dist/visual-plan/infrastructure/wireframe-sanitizer.d.ts +41 -0
- package/dist/visual-plan/infrastructure/wireframe-sanitizer.d.ts.map +1 -0
- package/dist/visual-plan/infrastructure/wireframe-sanitizer.js +72 -0
- package/dist/visual-plan/infrastructure/wireframe-sanitizer.js.map +1 -0
- package/dist/visual-plan/interface/cli.d.ts +29 -0
- package/dist/visual-plan/interface/cli.d.ts.map +1 -0
- package/dist/visual-plan/interface/cli.js +280 -0
- package/dist/visual-plan/interface/cli.js.map +1 -0
- package/dist/visual-plan/interface/studio.d.ts +20 -0
- package/dist/visual-plan/interface/studio.d.ts.map +1 -0
- package/dist/visual-plan/interface/studio.js +74 -0
- package/dist/visual-plan/interface/studio.js.map +1 -0
- package/dist/visual-plan/server/csp.d.ts +13 -0
- package/dist/visual-plan/server/csp.d.ts.map +1 -0
- package/dist/visual-plan/server/csp.js +17 -0
- package/dist/visual-plan/server/csp.js.map +1 -0
- package/dist/visual-plan/server/edit-lock.d.ts +28 -0
- package/dist/visual-plan/server/edit-lock.d.ts.map +1 -0
- package/dist/visual-plan/server/edit-lock.js +71 -0
- package/dist/visual-plan/server/edit-lock.js.map +1 -0
- package/dist/visual-plan/server/routes/feedback.d.ts +12 -0
- package/dist/visual-plan/server/routes/feedback.d.ts.map +1 -0
- package/dist/visual-plan/server/routes/feedback.js +63 -0
- package/dist/visual-plan/server/routes/feedback.js.map +1 -0
- package/dist/visual-plan/server/routes/get-plan.d.ts +14 -0
- package/dist/visual-plan/server/routes/get-plan.d.ts.map +1 -0
- package/dist/visual-plan/server/routes/get-plan.js +38 -0
- package/dist/visual-plan/server/routes/get-plan.js.map +1 -0
- package/dist/visual-plan/server/routes/patch.d.ts +10 -0
- package/dist/visual-plan/server/routes/patch.d.ts.map +1 -0
- package/dist/visual-plan/server/routes/patch.js +66 -0
- package/dist/visual-plan/server/routes/patch.js.map +1 -0
- package/dist/visual-plan/server/visual-plan-server.d.ts +30 -0
- package/dist/visual-plan/server/visual-plan-server.d.ts.map +1 -0
- package/dist/visual-plan/server/visual-plan-server.js +79 -0
- package/dist/visual-plan/server/visual-plan-server.js.map +1 -0
- package/dist/visual-plan-web/architects-daughter-latin-400-normal.woff +0 -0
- package/dist/visual-plan-web/architects-daughter-latin-400-normal.woff2 +0 -0
- package/dist/visual-plan-web/architects-daughter-latin-ext-400-normal.woff +0 -0
- package/dist/visual-plan-web/architects-daughter-latin-ext-400-normal.woff2 +0 -0
- package/dist/visual-plan-web/index.css +1 -0
- package/dist/visual-plan-web/index.html +17 -0
- package/dist/visual-plan-web/index.js +187 -0
- package/package.json +15 -18
- package/dist/commands/orchviz.d.ts +0 -12
- package/dist/commands/orchviz.d.ts.map +0 -1
- package/dist/commands/orchviz.js +0 -157
- package/dist/commands/orchviz.js.map +0 -1
- package/dist/migrate/converters/md-to-codex-rules.d.ts +0 -10
- package/dist/migrate/converters/md-to-codex-rules.d.ts.map +0 -1
- package/dist/migrate/converters/md-to-codex-rules.js +0 -133
- package/dist/migrate/converters/md-to-codex-rules.js.map +0 -1
- package/dist/orchviz/constants.d.ts +0 -72
- package/dist/orchviz/constants.d.ts.map +0 -1
- package/dist/orchviz/constants.js +0 -105
- package/dist/orchviz/constants.js.map +0 -1
- package/dist/orchviz/fs-utils.d.ts +0 -24
- package/dist/orchviz/fs-utils.d.ts.map +0 -1
- package/dist/orchviz/fs-utils.js +0 -49
- package/dist/orchviz/fs-utils.js.map +0 -1
- package/dist/orchviz/index.d.ts +0 -29
- package/dist/orchviz/index.d.ts.map +0 -1
- package/dist/orchviz/index.js +0 -28
- package/dist/orchviz/index.js.map +0 -1
- package/dist/orchviz/log-persister.d.ts +0 -22
- package/dist/orchviz/log-persister.d.ts.map +0 -1
- package/dist/orchviz/log-persister.js +0 -96
- package/dist/orchviz/log-persister.js.map +0 -1
- package/dist/orchviz/logger.d.ts +0 -13
- package/dist/orchviz/logger.d.ts.map +0 -1
- package/dist/orchviz/logger.js +0 -47
- package/dist/orchviz/logger.js.map +0 -1
- package/dist/orchviz/open-url.d.ts +0 -11
- package/dist/orchviz/open-url.d.ts.map +0 -1
- package/dist/orchviz/open-url.js.map +0 -1
- package/dist/orchviz/overlay/collector.d.ts +0 -29
- package/dist/orchviz/overlay/collector.d.ts.map +0 -1
- package/dist/orchviz/overlay/collector.js +0 -38
- package/dist/orchviz/overlay/collector.js.map +0 -1
- package/dist/orchviz/overlay/gate-readers.d.ts +0 -18
- package/dist/orchviz/overlay/gate-readers.d.ts.map +0 -1
- package/dist/orchviz/overlay/gate-readers.js +0 -111
- package/dist/orchviz/overlay/gate-readers.js.map +0 -1
- package/dist/orchviz/overlay/session-state-readers.d.ts +0 -18
- package/dist/orchviz/overlay/session-state-readers.d.ts.map +0 -1
- package/dist/orchviz/overlay/session-state-readers.js +0 -78
- package/dist/orchviz/overlay/session-state-readers.js.map +0 -1
- package/dist/orchviz/parser/handle-progress.d.ts +0 -9
- package/dist/orchviz/parser/handle-progress.d.ts.map +0 -1
- package/dist/orchviz/parser/handle-progress.js +0 -38
- package/dist/orchviz/parser/handle-progress.js.map +0 -1
- package/dist/orchviz/parser/handle-system.d.ts +0 -22
- package/dist/orchviz/parser/handle-system.d.ts.map +0 -1
- package/dist/orchviz/parser/handle-system.js +0 -99
- package/dist/orchviz/parser/handle-system.js.map +0 -1
- package/dist/orchviz/parser/handle-text.d.ts +0 -10
- package/dist/orchviz/parser/handle-text.d.ts.map +0 -1
- package/dist/orchviz/parser/handle-text.js +0 -83
- package/dist/orchviz/parser/handle-text.js.map +0 -1
- package/dist/orchviz/parser/handle-thinking.d.ts +0 -10
- package/dist/orchviz/parser/handle-thinking.d.ts.map +0 -1
- package/dist/orchviz/parser/handle-thinking.js +0 -35
- package/dist/orchviz/parser/handle-thinking.js.map +0 -1
- package/dist/orchviz/parser/handle-tool-result.d.ts +0 -10
- package/dist/orchviz/parser/handle-tool-result.d.ts.map +0 -1
- package/dist/orchviz/parser/handle-tool-result.js +0 -130
- package/dist/orchviz/parser/handle-tool-result.js.map +0 -1
- package/dist/orchviz/parser/handle-tool-use.d.ts +0 -11
- package/dist/orchviz/parser/handle-tool-use.d.ts.map +0 -1
- package/dist/orchviz/parser/handle-tool-use.js +0 -120
- package/dist/orchviz/parser/handle-tool-use.js.map +0 -1
- package/dist/orchviz/parser/index.d.ts +0 -38
- package/dist/orchviz/parser/index.d.ts.map +0 -1
- package/dist/orchviz/parser/index.js +0 -144
- package/dist/orchviz/parser/index.js.map +0 -1
- package/dist/orchviz/parser/label-helpers.d.ts +0 -9
- package/dist/orchviz/parser/label-helpers.d.ts.map +0 -1
- package/dist/orchviz/parser/label-helpers.js +0 -44
- package/dist/orchviz/parser/label-helpers.js.map +0 -1
- package/dist/orchviz/parser/strip-ansi.d.ts +0 -6
- package/dist/orchviz/parser/strip-ansi.d.ts.map +0 -1
- package/dist/orchviz/parser/strip-ansi.js +0 -14
- package/dist/orchviz/parser/strip-ansi.js.map +0 -1
- package/dist/orchviz/parser/utils.d.ts +0 -20
- package/dist/orchviz/parser/utils.d.ts.map +0 -1
- package/dist/orchviz/parser/utils.js +0 -54
- package/dist/orchviz/parser/utils.js.map +0 -1
- package/dist/orchviz/permission-detection.d.ts +0 -32
- package/dist/orchviz/permission-detection.d.ts.map +0 -1
- package/dist/orchviz/permission-detection.js +0 -104
- package/dist/orchviz/permission-detection.js.map +0 -1
- package/dist/orchviz/plan/apply-todo-toggle.d.ts +0 -29
- package/dist/orchviz/plan/apply-todo-toggle.d.ts.map +0 -1
- package/dist/orchviz/plan/apply-todo-toggle.js +0 -129
- package/dist/orchviz/plan/apply-todo-toggle.js.map +0 -1
- package/dist/orchviz/plan/atomic-write.d.ts +0 -25
- package/dist/orchviz/plan/atomic-write.d.ts.map +0 -1
- package/dist/orchviz/plan/atomic-write.js +0 -85
- package/dist/orchviz/plan/atomic-write.js.map +0 -1
- package/dist/orchviz/plan/collector.d.ts +0 -49
- package/dist/orchviz/plan/collector.d.ts.map +0 -1
- package/dist/orchviz/plan/collector.js +0 -169
- package/dist/orchviz/plan/collector.js.map +0 -1
- package/dist/orchviz/plan/etag.d.ts +0 -24
- package/dist/orchviz/plan/etag.d.ts.map +0 -1
- package/dist/orchviz/plan/etag.js +0 -58
- package/dist/orchviz/plan/etag.js.map +0 -1
- package/dist/orchviz/plan/find-active-plan.d.ts +0 -9
- package/dist/orchviz/plan/find-active-plan.d.ts.map +0 -1
- package/dist/orchviz/plan/find-active-plan.js +0 -90
- package/dist/orchviz/plan/find-active-plan.js.map +0 -1
- package/dist/orchviz/plan/index.d.ts +0 -23
- package/dist/orchviz/plan/index.d.ts.map +0 -1
- package/dist/orchviz/plan/index.js +0 -91
- package/dist/orchviz/plan/index.js.map +0 -1
- package/dist/orchviz/plan/list-plans.d.ts +0 -19
- package/dist/orchviz/plan/list-plans.d.ts.map +0 -1
- package/dist/orchviz/plan/list-plans.js +0 -143
- package/dist/orchviz/plan/list-plans.js.map +0 -1
- package/dist/orchviz/plan/parse-phase-file.d.ts +0 -13
- package/dist/orchviz/plan/parse-phase-file.d.ts.map +0 -1
- package/dist/orchviz/plan/parse-phase-file.js +0 -134
- package/dist/orchviz/plan/parse-phase-file.js.map +0 -1
- package/dist/orchviz/plan/parse-plan-file.d.ts +0 -19
- package/dist/orchviz/plan/parse-plan-file.d.ts.map +0 -1
- package/dist/orchviz/plan/parse-plan-file.js +0 -62
- package/dist/orchviz/plan/parse-plan-file.js.map +0 -1
- package/dist/orchviz/plan/plan-constants.d.ts +0 -17
- package/dist/orchviz/plan/plan-constants.d.ts.map +0 -1
- package/dist/orchviz/plan/plan-constants.js +0 -19
- package/dist/orchviz/plan/plan-constants.js.map +0 -1
- package/dist/orchviz/plan/plan-lifecycle.d.ts +0 -17
- package/dist/orchviz/plan/plan-lifecycle.d.ts.map +0 -1
- package/dist/orchviz/plan/plan-lifecycle.js +0 -97
- package/dist/orchviz/plan/plan-lifecycle.js.map +0 -1
- package/dist/orchviz/plan/types.d.ts +0 -46
- package/dist/orchviz/plan/types.d.ts.map +0 -1
- package/dist/orchviz/plan/types.js +0 -6
- package/dist/orchviz/plan/types.js.map +0 -1
- package/dist/orchviz/protocol.d.ts +0 -171
- package/dist/orchviz/protocol.d.ts.map +0 -1
- package/dist/orchviz/protocol.js +0 -23
- package/dist/orchviz/protocol.js.map +0 -1
- package/dist/orchviz/redact.d.ts +0 -10
- package/dist/orchviz/redact.d.ts.map +0 -1
- package/dist/orchviz/redact.js +0 -38
- package/dist/orchviz/redact.js.map +0 -1
- package/dist/orchviz/sanitize.d.ts +0 -11
- package/dist/orchviz/sanitize.d.ts.map +0 -1
- package/dist/orchviz/sanitize.js +0 -38
- package/dist/orchviz/sanitize.js.map +0 -1
- package/dist/orchviz/server/api-handlers.d.ts +0 -55
- package/dist/orchviz/server/api-handlers.d.ts.map +0 -1
- package/dist/orchviz/server/api-handlers.js +0 -112
- package/dist/orchviz/server/api-handlers.js.map +0 -1
- package/dist/orchviz/server/index.d.ts +0 -36
- package/dist/orchviz/server/index.d.ts.map +0 -1
- package/dist/orchviz/server/index.js +0 -144
- package/dist/orchviz/server/index.js.map +0 -1
- package/dist/orchviz/server/sse-handler.d.ts +0 -28
- package/dist/orchviz/server/sse-handler.d.ts.map +0 -1
- package/dist/orchviz/server/sse-handler.js +0 -217
- package/dist/orchviz/server/sse-handler.js.map +0 -1
- package/dist/orchviz/server/static-handler.d.ts +0 -9
- package/dist/orchviz/server/static-handler.d.ts.map +0 -1
- package/dist/orchviz/server/static-handler.js.map +0 -1
- package/dist/orchviz/server/write-handlers.d.ts +0 -20
- package/dist/orchviz/server/write-handlers.d.ts.map +0 -1
- package/dist/orchviz/server/write-handlers.js +0 -184
- package/dist/orchviz/server/write-handlers.js.map +0 -1
- package/dist/orchviz/server/write-utils.d.ts +0 -59
- package/dist/orchviz/server/write-utils.d.ts.map +0 -1
- package/dist/orchviz/server/write-utils.js +0 -161
- package/dist/orchviz/server/write-utils.js.map +0 -1
- package/dist/orchviz/session-discovery.d.ts +0 -19
- package/dist/orchviz/session-discovery.d.ts.map +0 -1
- package/dist/orchviz/session-discovery.js +0 -104
- package/dist/orchviz/session-discovery.js.map +0 -1
- package/dist/orchviz/session-manager.d.ts +0 -17
- package/dist/orchviz/session-manager.d.ts.map +0 -1
- package/dist/orchviz/session-manager.js +0 -63
- package/dist/orchviz/session-manager.js.map +0 -1
- package/dist/orchviz/session-runtime.d.ts +0 -21
- package/dist/orchviz/session-runtime.d.ts.map +0 -1
- package/dist/orchviz/session-runtime.js +0 -135
- package/dist/orchviz/session-runtime.js.map +0 -1
- package/dist/orchviz/session-watcher.d.ts +0 -33
- package/dist/orchviz/session-watcher.d.ts.map +0 -1
- package/dist/orchviz/session-watcher.js +0 -135
- package/dist/orchviz/session-watcher.js.map +0 -1
- package/dist/orchviz/subagent-meta.d.ts +0 -12
- package/dist/orchviz/subagent-meta.d.ts.map +0 -1
- package/dist/orchviz/subagent-meta.js +0 -34
- package/dist/orchviz/subagent-meta.js.map +0 -1
- package/dist/orchviz/subagent-scanner.d.ts +0 -15
- package/dist/orchviz/subagent-scanner.d.ts.map +0 -1
- package/dist/orchviz/subagent-scanner.js +0 -27
- package/dist/orchviz/subagent-scanner.js.map +0 -1
- package/dist/orchviz/subagent-watcher.d.ts +0 -20
- package/dist/orchviz/subagent-watcher.d.ts.map +0 -1
- package/dist/orchviz/subagent-watcher.js +0 -160
- package/dist/orchviz/subagent-watcher.js.map +0 -1
- package/dist/orchviz/token-estimator.d.ts.map +0 -1
- package/dist/orchviz/token-estimator.js.map +0 -1
- package/dist/orchviz/tool-input-data.d.ts +0 -11
- package/dist/orchviz/tool-input-data.d.ts.map +0 -1
- package/dist/orchviz/tool-input-data.js +0 -74
- package/dist/orchviz/tool-input-data.js.map +0 -1
- package/dist/orchviz/tool-summarizer.d.ts +0 -16
- package/dist/orchviz/tool-summarizer.d.ts.map +0 -1
- package/dist/orchviz/tool-summarizer.js +0 -129
- package/dist/orchviz/tool-summarizer.js.map +0 -1
- package/dist/orchviz-web/fira-code-cyrillic-400-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-cyrillic-400-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-cyrillic-500-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-cyrillic-500-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-cyrillic-ext-400-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-cyrillic-ext-500-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-cyrillic-ext-500-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-greek-400-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-greek-400-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-greek-500-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-greek-500-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-greek-ext-400-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-greek-ext-400-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-greek-ext-500-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-greek-ext-500-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-latin-400-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-latin-400-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-latin-500-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-latin-500-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-latin-ext-400-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-latin-ext-400-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-latin-ext-500-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-latin-ext-500-normal.woff2 +0 -0
- package/dist/orchviz-web/fira-code-symbols2-400-normal.woff +0 -0
- package/dist/orchviz-web/fira-code-symbols2-500-normal.woff +0 -0
- package/dist/orchviz-web/index.css +0 -1
- package/dist/orchviz-web/index.html +0 -18
- package/dist/orchviz-web/index.js +0 -53
- package/dist/orchviz-web/inter-cyrillic-400-normal.woff +0 -0
- package/dist/orchviz-web/inter-cyrillic-400-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-cyrillic-500-normal.woff +0 -0
- package/dist/orchviz-web/inter-cyrillic-500-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-cyrillic-600-normal.woff +0 -0
- package/dist/orchviz-web/inter-cyrillic-600-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-cyrillic-ext-400-normal.woff +0 -0
- package/dist/orchviz-web/inter-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-cyrillic-ext-500-normal.woff +0 -0
- package/dist/orchviz-web/inter-cyrillic-ext-500-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-cyrillic-ext-600-normal.woff +0 -0
- package/dist/orchviz-web/inter-cyrillic-ext-600-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-greek-400-normal.woff +0 -0
- package/dist/orchviz-web/inter-greek-400-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-greek-500-normal.woff +0 -0
- package/dist/orchviz-web/inter-greek-500-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-greek-600-normal.woff +0 -0
- package/dist/orchviz-web/inter-greek-600-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-greek-ext-400-normal.woff +0 -0
- package/dist/orchviz-web/inter-greek-ext-400-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-greek-ext-500-normal.woff +0 -0
- package/dist/orchviz-web/inter-greek-ext-500-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-greek-ext-600-normal.woff +0 -0
- package/dist/orchviz-web/inter-greek-ext-600-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-latin-400-normal.woff +0 -0
- package/dist/orchviz-web/inter-latin-400-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-latin-500-normal.woff +0 -0
- package/dist/orchviz-web/inter-latin-500-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-latin-600-normal.woff +0 -0
- package/dist/orchviz-web/inter-latin-600-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-latin-ext-400-normal.woff +0 -0
- package/dist/orchviz-web/inter-latin-ext-400-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-latin-ext-500-normal.woff +0 -0
- package/dist/orchviz-web/inter-latin-ext-500-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-latin-ext-600-normal.woff +0 -0
- package/dist/orchviz-web/inter-latin-ext-600-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-vietnamese-400-normal.woff +0 -0
- package/dist/orchviz-web/inter-vietnamese-400-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-vietnamese-500-normal.woff +0 -0
- package/dist/orchviz-web/inter-vietnamese-500-normal.woff2 +0 -0
- package/dist/orchviz-web/inter-vietnamese-600-normal.woff +0 -0
- package/dist/orchviz-web/inter-vietnamese-600-normal.woff2 +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source-hash computation + stale detection for the visual artifact.
|
|
3
|
+
*
|
|
4
|
+
* The artifact pins the SHA-256 of the Markdown plan it was generated from
|
|
5
|
+
* (`source.planHash`) and of every phase file (`source.phaseHashes`). If a
|
|
6
|
+
* human edits `plan.md`/`phase-*.md` after generation, the recomputed hash
|
|
7
|
+
* diverges and validation reports STALE_SOURCE_HASH — the artifact must be
|
|
8
|
+
* regenerated or re-hashed (`rehash`) before it can be approved (red-team M1).
|
|
9
|
+
*
|
|
10
|
+
* `artifactHash` (SHA-256 of the plan.json bytes) is the pointer cached in
|
|
11
|
+
* `.plan-state.json.visual.hash`; it detects artifact drift, not source drift.
|
|
12
|
+
*/
|
|
13
|
+
import * as crypto from "node:crypto";
|
|
14
|
+
import * as fs from "node:fs";
|
|
15
|
+
import * as path from "node:path";
|
|
16
|
+
import { err, ErrorCode } from "../domain/errors.js";
|
|
17
|
+
/** Match `phase-NN-*.md`; capture the (possibly zero-padded) phase number. */
|
|
18
|
+
const PHASE_FILE_RE = /^phase-(\d+)-.*\.md$/i;
|
|
19
|
+
/** SHA-256 of a UTF-8 string, `sha256:`-prefixed lowercase hex. */
|
|
20
|
+
export function sha256(content) {
|
|
21
|
+
return `sha256:${crypto.createHash("sha256").update(content, "utf-8").digest("hex")}`;
|
|
22
|
+
}
|
|
23
|
+
/** SHA-256 of a file's bytes, or `null` if it cannot be read. */
|
|
24
|
+
export function hashFile(filePath) {
|
|
25
|
+
try {
|
|
26
|
+
return `sha256:${crypto.createHash("sha256").update(fs.readFileSync(filePath)).digest("hex")}`;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** SHA-256 of the artifact's on-disk bytes (the `.plan-state.json` pointer). */
|
|
33
|
+
export function artifactHash(planDir, artifactRelPath) {
|
|
34
|
+
return hashFile(path.join(planDir, artifactRelPath));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Recompute source hashes from disk. `planPath` is resolved relative to
|
|
38
|
+
* `planDir`; phase files are discovered by the `phase-NN-*.md` convention in
|
|
39
|
+
* the plan directory. Missing plan file → empty planHash (validation catches it).
|
|
40
|
+
*/
|
|
41
|
+
export function computeSourceHashes(planDir, planPath) {
|
|
42
|
+
const planHash = hashFile(path.join(planDir, planPath)) ?? "";
|
|
43
|
+
const phaseHashes = {};
|
|
44
|
+
let entries = [];
|
|
45
|
+
try {
|
|
46
|
+
entries = fs.readdirSync(planDir);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
entries = [];
|
|
50
|
+
}
|
|
51
|
+
for (const name of entries.sort()) {
|
|
52
|
+
const m = name.match(PHASE_FILE_RE);
|
|
53
|
+
if (!m)
|
|
54
|
+
continue;
|
|
55
|
+
const key = String(parseInt(m[1], 10));
|
|
56
|
+
const h = hashFile(path.join(planDir, name));
|
|
57
|
+
if (h)
|
|
58
|
+
phaseHashes[key] = h;
|
|
59
|
+
}
|
|
60
|
+
return { planHash, phaseHashes };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Compare the artifact's pinned source hashes against freshly-computed ones.
|
|
64
|
+
* Any divergence (plan bytes changed, a phase added/removed/edited) is a
|
|
65
|
+
* STALE_SOURCE_HASH error with the exact JSON path.
|
|
66
|
+
*/
|
|
67
|
+
export function checkSourceFreshness(plan, planDir) {
|
|
68
|
+
const errors = [];
|
|
69
|
+
const fresh = computeSourceHashes(planDir, plan.source.planPath);
|
|
70
|
+
if (fresh.planHash !== plan.source.planHash) {
|
|
71
|
+
errors.push(err("source.planHash", ErrorCode.STALE_SOURCE_HASH, `plan.md hash diverged (expected ${plan.source.planHash || "<empty>"}, on disk ${fresh.planHash || "<missing>"})`));
|
|
72
|
+
}
|
|
73
|
+
const keys = new Set([...Object.keys(plan.source.phaseHashes), ...Object.keys(fresh.phaseHashes)]);
|
|
74
|
+
for (const k of keys) {
|
|
75
|
+
if (plan.source.phaseHashes[k] !== fresh.phaseHashes[k]) {
|
|
76
|
+
errors.push(err(`source.phaseHashes.${k}`, ErrorCode.STALE_SOURCE_HASH, `phase ${k} hash diverged`));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return errors;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=hashing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashing.js","sourceRoot":"","sources":["../../../src/visual-plan/infrastructure/hashing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.plan-state.json` schema-1.3 additive `visual` block reader/writer.
|
|
3
|
+
*
|
|
4
|
+
* Verified reality: NO CLI code parses `.plan-state.json` today — schema "1.2"
|
|
5
|
+
* lives in an agent-authored skill doc, and the file is agent-written. So this
|
|
6
|
+
* module owns ONLY the `visual` block: it does a read-modify-write that
|
|
7
|
+
* preserves every field it does not own (`phases`, `handoff`, and any unknown
|
|
8
|
+
* key). It never invents the rest of the file; if the file is absent it writes
|
|
9
|
+
* a minimal object carrying just the `visual` block (the schema-1.3 doc itself
|
|
10
|
+
* lands in Phase 3).
|
|
11
|
+
*/
|
|
12
|
+
import type { VisualPlan } from "../domain/schemas.js";
|
|
13
|
+
/** The additive `visual` pointer block (schema 1.3). Snake_case matches the file's style. */
|
|
14
|
+
export interface VisualBlock {
|
|
15
|
+
schema: "visual-plan/v1";
|
|
16
|
+
path: string;
|
|
17
|
+
revision: number;
|
|
18
|
+
hash: string;
|
|
19
|
+
source_plan_hash: string;
|
|
20
|
+
review_status: string;
|
|
21
|
+
pending_feedback: string[];
|
|
22
|
+
}
|
|
23
|
+
/** Derive the `visual` block from the artifact + its on-disk hash. */
|
|
24
|
+
export declare function buildVisualBlock(plan: VisualPlan, planDir: string): VisualBlock;
|
|
25
|
+
/** Read the whole `.plan-state.json` as an object, or `null` when absent/unparseable. */
|
|
26
|
+
export declare function readPlanState(planDir: string): Record<string, unknown> | null;
|
|
27
|
+
/**
|
|
28
|
+
* Write the `visual` block into `.plan-state.json`, preserving every other
|
|
29
|
+
* field (read-modify-write). Creates a minimal file if none exists.
|
|
30
|
+
*/
|
|
31
|
+
export declare function writeVisualBlock(planDir: string, visual: VisualBlock): void;
|
|
32
|
+
//# sourceMappingURL=plan-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-state.d.ts","sourceRoot":"","sources":["../../../src/visual-plan/infrastructure/plan-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMvD,6FAA6F;AAC7F,MAAM,WAAW,WAAW;IAC3B,MAAM,EAAE,gBAAgB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAU/E;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAc7E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAI3E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.plan-state.json` schema-1.3 additive `visual` block reader/writer.
|
|
3
|
+
*
|
|
4
|
+
* Verified reality: NO CLI code parses `.plan-state.json` today — schema "1.2"
|
|
5
|
+
* lives in an agent-authored skill doc, and the file is agent-written. So this
|
|
6
|
+
* module owns ONLY the `visual` block: it does a read-modify-write that
|
|
7
|
+
* preserves every field it does not own (`phases`, `handoff`, and any unknown
|
|
8
|
+
* key). It never invents the rest of the file; if the file is absent it writes
|
|
9
|
+
* a minimal object carrying just the `visual` block (the schema-1.3 doc itself
|
|
10
|
+
* lands in Phase 3).
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from "node:fs";
|
|
13
|
+
import * as path from "node:path";
|
|
14
|
+
import { atomicWriteFileSync } from "./atomic-write.js";
|
|
15
|
+
import { artifactHash } from "./hashing.js";
|
|
16
|
+
const PLAN_STATE_FILE = ".plan-state.json";
|
|
17
|
+
/** POSIX-style pointer stored in the artifact + plan-state (stable across OSes). */
|
|
18
|
+
const ARTIFACT_POINTER = "visual-plan/plan.json";
|
|
19
|
+
/** Derive the `visual` block from the artifact + its on-disk hash. */
|
|
20
|
+
export function buildVisualBlock(plan, planDir) {
|
|
21
|
+
return {
|
|
22
|
+
schema: "visual-plan/v1",
|
|
23
|
+
path: ARTIFACT_POINTER,
|
|
24
|
+
revision: plan.revision,
|
|
25
|
+
hash: artifactHash(planDir, ARTIFACT_POINTER) ?? "",
|
|
26
|
+
source_plan_hash: plan.source.planHash,
|
|
27
|
+
review_status: plan.review.status,
|
|
28
|
+
pending_feedback: [...plan.review.pendingFeedbackBatchIds],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Read the whole `.plan-state.json` as an object, or `null` when absent/unparseable. */
|
|
32
|
+
export function readPlanState(planDir) {
|
|
33
|
+
const full = path.join(planDir, PLAN_STATE_FILE);
|
|
34
|
+
let text;
|
|
35
|
+
try {
|
|
36
|
+
text = fs.readFileSync(full, "utf-8");
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const parsed = JSON.parse(text);
|
|
43
|
+
return parsed !== null && typeof parsed === "object" ? parsed : null;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Write the `visual` block into `.plan-state.json`, preserving every other
|
|
51
|
+
* field (read-modify-write). Creates a minimal file if none exists.
|
|
52
|
+
*/
|
|
53
|
+
export function writeVisualBlock(planDir, visual) {
|
|
54
|
+
const existing = readPlanState(planDir) ?? {};
|
|
55
|
+
existing.visual = visual;
|
|
56
|
+
atomicWriteFileSync(path.join(planDir, PLAN_STATE_FILE), `${JSON.stringify(existing, null, 2)}\n`);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=plan-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-state.js","sourceRoot":"","sources":["../../../src/visual-plan/infrastructure/plan-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAC3C,oFAAoF;AACpF,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAajD,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,OAAe;IACjE,OAAO;QACN,MAAM,EAAE,gBAAgB;QACxB,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC,IAAI,EAAE;QACnD,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;QACtC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QACjC,gBAAgB,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC;KAC1D,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,aAAa,CAAC,OAAe;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACjD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACJ,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;QAC3C,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAkC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnG,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,MAAmB;IACpE,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolution-receipt storage under `<plan-dir>/visual-plan/resolutions/`.
|
|
3
|
+
*
|
|
4
|
+
* A receipt records the per-operation outcome of applying a feedback batch
|
|
5
|
+
* (applied | rejected | unresolved). Receipt EXISTENCE is the "batch resolved"
|
|
6
|
+
* marker — the batch file itself stays byte-immutable. `writeReceipt` is
|
|
7
|
+
* write-once (a second apply of the same batch is refused). The batch/receipt id
|
|
8
|
+
* is validated against the strict pattern BEFORE any path join (red-team M8).
|
|
9
|
+
*/
|
|
10
|
+
import { type ResolutionReceipt } from "../domain/feedback-schemas.js";
|
|
11
|
+
/** True when a resolution receipt already exists for this batch (⇒ already applied). */
|
|
12
|
+
export declare function receiptExists(planDir: string, batchId: string): boolean;
|
|
13
|
+
/** Persist a receipt write-once. Returns false if a receipt for this batch already exists. */
|
|
14
|
+
export declare function writeReceipt(planDir: string, receipt: ResolutionReceipt): boolean;
|
|
15
|
+
/** Read + validate every receipt in the plan (for approve's unresolved-check). */
|
|
16
|
+
export declare function listReceipts(planDir: string): ResolutionReceipt[];
|
|
17
|
+
//# sourceMappingURL=receipt-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt-repository.d.ts","sourceRoot":"","sources":["../../../src/visual-plan/infrastructure/receipt-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAWhG,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAMjF;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAkBjE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolution-receipt storage under `<plan-dir>/visual-plan/resolutions/`.
|
|
3
|
+
*
|
|
4
|
+
* A receipt records the per-operation outcome of applying a feedback batch
|
|
5
|
+
* (applied | rejected | unresolved). Receipt EXISTENCE is the "batch resolved"
|
|
6
|
+
* marker — the batch file itself stays byte-immutable. `writeReceipt` is
|
|
7
|
+
* write-once (a second apply of the same batch is refused). The batch/receipt id
|
|
8
|
+
* is validated against the strict pattern BEFORE any path join (red-team M8).
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from "node:fs";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { isValidFeedbackBatchId } from "../domain/ids.js";
|
|
13
|
+
import { ResolutionReceiptSchema } from "../domain/feedback-schemas.js";
|
|
14
|
+
import { atomicWriteFileSync } from "./atomic-write.js";
|
|
15
|
+
const RESOLUTIONS_DIR = path.join("visual-plan", "resolutions");
|
|
16
|
+
/** Receipt path for a batch id, validating the id BEFORE the join. Throws on a bad id. */
|
|
17
|
+
function receiptPath(planDir, batchId) {
|
|
18
|
+
if (!isValidFeedbackBatchId(batchId))
|
|
19
|
+
throw new Error(`invalid batch id: ${JSON.stringify(batchId)}`);
|
|
20
|
+
return path.join(planDir, RESOLUTIONS_DIR, `${batchId}.json`);
|
|
21
|
+
}
|
|
22
|
+
/** True when a resolution receipt already exists for this batch (⇒ already applied). */
|
|
23
|
+
export function receiptExists(planDir, batchId) {
|
|
24
|
+
return fs.existsSync(receiptPath(planDir, batchId));
|
|
25
|
+
}
|
|
26
|
+
/** Persist a receipt write-once. Returns false if a receipt for this batch already exists. */
|
|
27
|
+
export function writeReceipt(planDir, receipt) {
|
|
28
|
+
const file = receiptPath(planDir, receipt.batchId);
|
|
29
|
+
if (fs.existsSync(file))
|
|
30
|
+
return false; // double-apply guard
|
|
31
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
32
|
+
atomicWriteFileSync(file, `${JSON.stringify(receipt, null, 2)}\n`);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
/** Read + validate every receipt in the plan (for approve's unresolved-check). */
|
|
36
|
+
export function listReceipts(planDir) {
|
|
37
|
+
let entries;
|
|
38
|
+
try {
|
|
39
|
+
entries = fs.readdirSync(path.join(planDir, RESOLUTIONS_DIR));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
const out = [];
|
|
45
|
+
for (const name of entries) {
|
|
46
|
+
if (!name.endsWith(".json"))
|
|
47
|
+
continue;
|
|
48
|
+
try {
|
|
49
|
+
const parsed = ResolutionReceiptSchema.safeParse(JSON.parse(fs.readFileSync(path.join(planDir, RESOLUTIONS_DIR, name), "utf-8")));
|
|
50
|
+
if (parsed.success)
|
|
51
|
+
out.push(parsed.data);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// skip unreadable/invalid receipt
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=receipt-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt-repository.js","sourceRoot":"","sources":["../../../src/visual-plan/infrastructure/receipt-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAA0B,MAAM,+BAA+B,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAEhE,0FAA0F;AAC1F,SAAS,WAAW,CAAC,OAAe,EAAE,OAAe;IACpD,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtG,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAe;IAC7D,OAAO,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,OAA0B;IACvE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,qBAAqB;IAC5D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,mBAAmB,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC;AACb,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,YAAY,CAAC,OAAe;IAC3C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACJ,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;IACD,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAY,CAAC,CAAC;YAC7I,IAAI,MAAM,CAAC,OAAO;gBAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACR,kCAAkC;QACnC,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem gateway for the canonical visual artifact.
|
|
3
|
+
*
|
|
4
|
+
* The artifact always lives at `<plan-dir>/visual-plan/plan.json`. All access
|
|
5
|
+
* goes through realpath containment: the resolved artifact path MUST stay
|
|
6
|
+
* inside the resolved plan directory, so a symlinked `visual-plan/` cannot
|
|
7
|
+
* redirect reads/writes outside the plan (non-functional requirement: no path
|
|
8
|
+
* escapes the plan directory). Writes are atomic (same-dir tmp + rename).
|
|
9
|
+
*/
|
|
10
|
+
import { type ValidationError } from "../domain/errors.js";
|
|
11
|
+
/** Artifact location relative to the plan directory. */
|
|
12
|
+
export declare const ARTIFACT_REL_PATH: string;
|
|
13
|
+
/** Thrown when a plan directory or artifact path fails containment/existence checks. */
|
|
14
|
+
export declare class PlanPathError extends Error {
|
|
15
|
+
constructor(message: string);
|
|
16
|
+
}
|
|
17
|
+
/** Resolve `input` to an existing directory's realpath. Throws `PlanPathError` otherwise. */
|
|
18
|
+
export declare function resolvePlanDir(input: string): string;
|
|
19
|
+
/** Absolute artifact path, guaranteed contained within `planDir` (realpath checks). */
|
|
20
|
+
export declare function artifactPath(planDir: string): string;
|
|
21
|
+
/** True when an artifact file exists for this plan directory. */
|
|
22
|
+
export declare function artifactExists(planDir: string): boolean;
|
|
23
|
+
export interface RawArtifactRead {
|
|
24
|
+
raw?: unknown;
|
|
25
|
+
error?: ValidationError;
|
|
26
|
+
}
|
|
27
|
+
/** Read + JSON-parse the artifact. Missing/invalid file yields a typed error, never a throw. */
|
|
28
|
+
export declare function readArtifactRaw(planDir: string): RawArtifactRead;
|
|
29
|
+
/**
|
|
30
|
+
* Canonical on-disk serialization for the artifact (pretty JSON + trailing
|
|
31
|
+
* newline). Exposed so a caller can hash the EXACT bytes a subsequent
|
|
32
|
+
* `writeArtifact` will persist (used by prepare-feedback for a crash-safe
|
|
33
|
+
* batch-then-artifact write order).
|
|
34
|
+
*/
|
|
35
|
+
export declare function serializeArtifact(artifact: unknown): string;
|
|
36
|
+
/** Atomically write the artifact as canonical pretty JSON. */
|
|
37
|
+
export declare function writeArtifact(planDir: string, artifact: unknown): void;
|
|
38
|
+
//# sourceMappingURL=visual-plan-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-plan-repository.d.ts","sourceRoot":"","sources":["../../../src/visual-plan/infrastructure/visual-plan-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3E,wDAAwD;AACxD,eAAO,MAAM,iBAAiB,QAAwC,CAAC;AAEvE,wFAAwF;AACxF,qBAAa,aAAc,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI3B;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYpD;AAQD,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAiBpD;AAED,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,MAAM,WAAW,eAAe;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAchE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAE3D;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAEtE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem gateway for the canonical visual artifact.
|
|
3
|
+
*
|
|
4
|
+
* The artifact always lives at `<plan-dir>/visual-plan/plan.json`. All access
|
|
5
|
+
* goes through realpath containment: the resolved artifact path MUST stay
|
|
6
|
+
* inside the resolved plan directory, so a symlinked `visual-plan/` cannot
|
|
7
|
+
* redirect reads/writes outside the plan (non-functional requirement: no path
|
|
8
|
+
* escapes the plan directory). Writes are atomic (same-dir tmp + rename).
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from "node:fs";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { err, ErrorCode } from "../domain/errors.js";
|
|
13
|
+
import { atomicWriteFileSync } from "./atomic-write.js";
|
|
14
|
+
/** Artifact location relative to the plan directory. */
|
|
15
|
+
export const ARTIFACT_REL_PATH = path.join("visual-plan", "plan.json");
|
|
16
|
+
/** Thrown when a plan directory or artifact path fails containment/existence checks. */
|
|
17
|
+
export class PlanPathError extends Error {
|
|
18
|
+
constructor(message) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = "PlanPathError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Resolve `input` to an existing directory's realpath. Throws `PlanPathError` otherwise. */
|
|
24
|
+
export function resolvePlanDir(input) {
|
|
25
|
+
const abs = path.resolve(input);
|
|
26
|
+
let real;
|
|
27
|
+
try {
|
|
28
|
+
real = fs.realpathSync(abs);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw new PlanPathError(`plan directory not found: ${abs}`);
|
|
32
|
+
}
|
|
33
|
+
if (!fs.statSync(real).isDirectory()) {
|
|
34
|
+
throw new PlanPathError(`not a directory: ${real}`);
|
|
35
|
+
}
|
|
36
|
+
return real;
|
|
37
|
+
}
|
|
38
|
+
/** True when `candidate`'s realpath is `planDir` itself or strictly inside it. */
|
|
39
|
+
function isContained(candidate, realPlan) {
|
|
40
|
+
const real = fs.realpathSync(candidate);
|
|
41
|
+
return real === realPlan || real.startsWith(realPlan + path.sep);
|
|
42
|
+
}
|
|
43
|
+
/** Absolute artifact path, guaranteed contained within `planDir` (realpath checks). */
|
|
44
|
+
export function artifactPath(planDir) {
|
|
45
|
+
const full = path.resolve(planDir, ARTIFACT_REL_PATH);
|
|
46
|
+
const rel = path.relative(planDir, full);
|
|
47
|
+
if (rel.startsWith("..") || path.isAbsolute(rel)) {
|
|
48
|
+
throw new PlanPathError(`artifact path escapes plan directory: ${full}`);
|
|
49
|
+
}
|
|
50
|
+
const realPlan = fs.realpathSync(planDir);
|
|
51
|
+
// Guard against a symlinked visual-plan/ directory redirecting outside the plan dir.
|
|
52
|
+
const dir = path.dirname(full);
|
|
53
|
+
if (fs.existsSync(dir) && !isContained(dir, realPlan)) {
|
|
54
|
+
throw new PlanPathError(`visual-plan directory resolves outside the plan directory: ${fs.realpathSync(dir)}`);
|
|
55
|
+
}
|
|
56
|
+
// Guard against a symlinked plan.json file redirecting reads outside the plan dir.
|
|
57
|
+
if (fs.existsSync(full) && !isContained(full, realPlan)) {
|
|
58
|
+
throw new PlanPathError(`artifact file resolves outside the plan directory: ${fs.realpathSync(full)}`);
|
|
59
|
+
}
|
|
60
|
+
return full;
|
|
61
|
+
}
|
|
62
|
+
/** True when an artifact file exists for this plan directory. */
|
|
63
|
+
export function artifactExists(planDir) {
|
|
64
|
+
return fs.existsSync(artifactPath(planDir));
|
|
65
|
+
}
|
|
66
|
+
/** Read + JSON-parse the artifact. Missing/invalid file yields a typed error, never a throw. */
|
|
67
|
+
export function readArtifactRaw(planDir) {
|
|
68
|
+
const full = artifactPath(planDir);
|
|
69
|
+
let text;
|
|
70
|
+
try {
|
|
71
|
+
text = fs.readFileSync(full, "utf-8");
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return { error: err(ARTIFACT_REL_PATH, ErrorCode.ARTIFACT_MISSING, `no visual artifact at ${ARTIFACT_REL_PATH}`) };
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
return { raw: JSON.parse(text) };
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
const detail = e instanceof Error ? e.message : String(e);
|
|
81
|
+
return { error: err(ARTIFACT_REL_PATH, ErrorCode.ARTIFACT_INVALID_JSON, `artifact is not valid JSON: ${detail}`) };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Canonical on-disk serialization for the artifact (pretty JSON + trailing
|
|
86
|
+
* newline). Exposed so a caller can hash the EXACT bytes a subsequent
|
|
87
|
+
* `writeArtifact` will persist (used by prepare-feedback for a crash-safe
|
|
88
|
+
* batch-then-artifact write order).
|
|
89
|
+
*/
|
|
90
|
+
export function serializeArtifact(artifact) {
|
|
91
|
+
return `${JSON.stringify(artifact, null, 2)}\n`;
|
|
92
|
+
}
|
|
93
|
+
/** Atomically write the artifact as canonical pretty JSON. */
|
|
94
|
+
export function writeArtifact(planDir, artifact) {
|
|
95
|
+
atomicWriteFileSync(artifactPath(planDir), serializeArtifact(artifact));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=visual-plan-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-plan-repository.js","sourceRoot":"","sources":["../../../src/visual-plan/infrastructure/visual-plan-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Save-time wireframe sanitizer (Node side, jsdom-backed DOMPurify).
|
|
3
|
+
*
|
|
4
|
+
* Engine decision (red-team H2): ONE vetted engine — DOMPurify — on both sides.
|
|
5
|
+
* MeowKit has no HTML parser in runtime deps today; DOMPurify + jsdom are added
|
|
6
|
+
* as runtime deps precisely for this. Regex-only sanitization is forbidden.
|
|
7
|
+
*
|
|
8
|
+
* Reject, not repair: we normalize the input through the DOM (so pure formatting
|
|
9
|
+
* differences — quote style, self-closing, whitespace — do NOT count), then
|
|
10
|
+
* sanitize with the SHARED allowlist config. If the sanitized output differs
|
|
11
|
+
* from the normalized input, the sanitizer removed something unsafe/unlisted and
|
|
12
|
+
* we REJECT with a JSON path. The Phase-4 browser renderer re-runs the identical
|
|
13
|
+
* engine + config; the shared adversarial corpus runs in both environments.
|
|
14
|
+
*/
|
|
15
|
+
/** Result of a reject-mode sanitize check. `safe:false` carries a short reason. */
|
|
16
|
+
export interface SanitizeCheck {
|
|
17
|
+
safe: boolean;
|
|
18
|
+
reason?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* True when `html` is safe under the shared allowlist. Any content DOMPurify
|
|
22
|
+
* would strip (disallowed tag/attr, unsafe URL scheme, event handler, inline
|
|
23
|
+
* style, SVG/MathML) makes it unsafe — the artifact is rejected, never repaired.
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkWireframeHtml(html: string): SanitizeCheck;
|
|
26
|
+
/**
|
|
27
|
+
* Return the SANITIZED wireframe HTML (safe to embed). Used by the HTML export
|
|
28
|
+
* to inline wireframes offline. The artifact was already reject-validated at
|
|
29
|
+
* save time; this re-sanitize is the export's own boundary.
|
|
30
|
+
*/
|
|
31
|
+
export declare function sanitizeWireframeHtml(html: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Replace the TEXT content of a schema-backed wireframe field (Phase 5 edit).
|
|
34
|
+
* The field is targeted by a `wf-field-<fieldId>` class (class is allowlisted, so
|
|
35
|
+
* no sanitizer-config change is needed). `textContent` assignment escapes the
|
|
36
|
+
* new value, so an edit can never introduce markup. `fieldId` is charset-safe
|
|
37
|
+
* (ENTITY_ID_RE) so it is a valid class token. Returns null if the field is
|
|
38
|
+
* absent (the caller rejects the patch).
|
|
39
|
+
*/
|
|
40
|
+
export declare function editWireframeField(html: string, fieldId: string, text: string): string | null;
|
|
41
|
+
//# sourceMappingURL=wireframe-sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireframe-sanitizer.d.ts","sourceRoot":"","sources":["../../../src/visual-plan/infrastructure/wireframe-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH,mFAAmF;AACnF,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAQ9D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO7F"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Save-time wireframe sanitizer (Node side, jsdom-backed DOMPurify).
|
|
3
|
+
*
|
|
4
|
+
* Engine decision (red-team H2): ONE vetted engine — DOMPurify — on both sides.
|
|
5
|
+
* MeowKit has no HTML parser in runtime deps today; DOMPurify + jsdom are added
|
|
6
|
+
* as runtime deps precisely for this. Regex-only sanitization is forbidden.
|
|
7
|
+
*
|
|
8
|
+
* Reject, not repair: we normalize the input through the DOM (so pure formatting
|
|
9
|
+
* differences — quote style, self-closing, whitespace — do NOT count), then
|
|
10
|
+
* sanitize with the SHARED allowlist config. If the sanitized output differs
|
|
11
|
+
* from the normalized input, the sanitizer removed something unsafe/unlisted and
|
|
12
|
+
* we REJECT with a JSON path. The Phase-4 browser renderer re-runs the identical
|
|
13
|
+
* engine + config; the shared adversarial corpus runs in both environments.
|
|
14
|
+
*/
|
|
15
|
+
import createDOMPurify from "dompurify";
|
|
16
|
+
import { JSDOM } from "jsdom";
|
|
17
|
+
import { WIREFRAME_SANITIZE_CONFIG } from "../domain/sanitizer-config.js";
|
|
18
|
+
// One jsdom window + DOMPurify instance for the process. jsdom is heavy to
|
|
19
|
+
// construct; reuse is safe because sanitize() is stateless per call.
|
|
20
|
+
const jsdomWindow = new JSDOM("").window;
|
|
21
|
+
const purify = createDOMPurify(jsdomWindow);
|
|
22
|
+
/**
|
|
23
|
+
* DOM-normalize `html` so the reject-diff ignores cosmetic reformatting: set it
|
|
24
|
+
* as innerHTML on a detached element and read it back. Both the normalized input
|
|
25
|
+
* and the DOMPurify output pass through this same DOM serialization path.
|
|
26
|
+
*/
|
|
27
|
+
function domNormalize(html) {
|
|
28
|
+
const el = jsdomWindow.document.createElement("div");
|
|
29
|
+
el.innerHTML = html;
|
|
30
|
+
return el.innerHTML;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* True when `html` is safe under the shared allowlist. Any content DOMPurify
|
|
34
|
+
* would strip (disallowed tag/attr, unsafe URL scheme, event handler, inline
|
|
35
|
+
* style, SVG/MathML) makes it unsafe — the artifact is rejected, never repaired.
|
|
36
|
+
*/
|
|
37
|
+
export function checkWireframeHtml(html) {
|
|
38
|
+
const normalized = domNormalize(html);
|
|
39
|
+
const clean = purify.sanitize(html, WIREFRAME_SANITIZE_CONFIG);
|
|
40
|
+
if (clean === normalized)
|
|
41
|
+
return { safe: true };
|
|
42
|
+
return {
|
|
43
|
+
safe: false,
|
|
44
|
+
reason: "wireframe HTML contains disallowed or unsafe markup (sanitizer would strip content — reject, not repair)",
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Return the SANITIZED wireframe HTML (safe to embed). Used by the HTML export
|
|
49
|
+
* to inline wireframes offline. The artifact was already reject-validated at
|
|
50
|
+
* save time; this re-sanitize is the export's own boundary.
|
|
51
|
+
*/
|
|
52
|
+
export function sanitizeWireframeHtml(html) {
|
|
53
|
+
return purify.sanitize(html, WIREFRAME_SANITIZE_CONFIG);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Replace the TEXT content of a schema-backed wireframe field (Phase 5 edit).
|
|
57
|
+
* The field is targeted by a `wf-field-<fieldId>` class (class is allowlisted, so
|
|
58
|
+
* no sanitizer-config change is needed). `textContent` assignment escapes the
|
|
59
|
+
* new value, so an edit can never introduce markup. `fieldId` is charset-safe
|
|
60
|
+
* (ENTITY_ID_RE) so it is a valid class token. Returns null if the field is
|
|
61
|
+
* absent (the caller rejects the patch).
|
|
62
|
+
*/
|
|
63
|
+
export function editWireframeField(html, fieldId, text) {
|
|
64
|
+
const el = jsdomWindow.document.createElement("div");
|
|
65
|
+
el.innerHTML = html;
|
|
66
|
+
const target = el.querySelector(`.wf-field-${fieldId}`);
|
|
67
|
+
if (!target)
|
|
68
|
+
return null;
|
|
69
|
+
target.textContent = text;
|
|
70
|
+
return el.innerHTML;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=wireframe-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireframe-sanitizer.js","sourceRoot":"","sources":["../../../src/visual-plan/infrastructure/wireframe-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,eAAe,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE1E,2EAA2E;AAC3E,qEAAqE;AACrE,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;AACzC,MAAM,MAAM,GAAG,eAAe,CAAC,WAA+D,CAAC,CAAC;AAQhG;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAY;IACjC,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACrD,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,CAAC,SAAS,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC9C,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;IAC/D,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAChD,OAAO;QACN,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,0GAA0G;KAClH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IACjD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAe,EAAE,IAAY;IAC7E,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACrD,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC;IACpB,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,CAAC,SAAS,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mewkit visual-plan <subcommand>` dispatch + reporter.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands: validate | status | approve | rehash | export | prepare-feedback
|
|
5
|
+
* (sync) and edit | view (long-running studio). Each resolves
|
|
6
|
+
* the plan directory, runs the matching application function, and reports in
|
|
7
|
+
* human or `--json` form. Exit codes: 0 ok, 1 contract/precondition failure,
|
|
8
|
+
* 2 usage/path error. Sets `process.exitCode` (never calls `process.exit`) so
|
|
9
|
+
* the surface stays unit-testable.
|
|
10
|
+
*/
|
|
11
|
+
export interface VisualPlanCliArgs {
|
|
12
|
+
subcommand?: string;
|
|
13
|
+
planDir?: string;
|
|
14
|
+
revision?: string | number;
|
|
15
|
+
json?: boolean;
|
|
16
|
+
open?: boolean;
|
|
17
|
+
noOpen?: boolean;
|
|
18
|
+
force?: boolean;
|
|
19
|
+
port?: number;
|
|
20
|
+
format?: string;
|
|
21
|
+
ops?: string;
|
|
22
|
+
batch?: string;
|
|
23
|
+
check?: boolean;
|
|
24
|
+
receipt?: string;
|
|
25
|
+
op?: string;
|
|
26
|
+
}
|
|
27
|
+
/** Dispatch a `visual-plan` subcommand. Returns a promise for the long-running studio commands. */
|
|
28
|
+
export declare function visualPlanCommand(args: VisualPlanCliArgs): void | Promise<void>;
|
|
29
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/visual-plan/interface/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmBH,MAAM,WAAW,iBAAiB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;CACZ;AAoMD,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC/E"}
|