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
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Permission detection — flag tool calls pending >PERMISSION_DETECT_MS.
|
|
3
|
-
*
|
|
4
|
-
* Ported from patoles/agent-flow @ 59ccf4e (extension/src/permission-detection.ts).
|
|
5
|
-
* License Apache-2.0 (see ../NOTICE).
|
|
6
|
-
*
|
|
7
|
-
* Phase-02 modifications:
|
|
8
|
-
* - Skip heuristic if a typed pause already covers this agent (pauseRecord parameter).
|
|
9
|
-
* - Dual-emit: legacy permission_requested + new pause_started{permission_request}.
|
|
10
|
-
* - Hard cap: 60s (PERMISSION_HEURISTIC_MAX_MS) clears the heuristic even without tool_result.
|
|
11
|
-
* - [red-team #18] toolUseId omitted for reason=permission_request (no deterministic ID).
|
|
12
|
-
*/
|
|
13
|
-
import { PERMISSION_DETECT_MS, PERMISSION_HEURISTIC_MAX_MS } from "./constants.js";
|
|
14
|
-
export function handlePermissionDetection(delegate, agentName, pendingToolCalls, permState, sessionId, sessionCompleted, checkSessionActivity,
|
|
15
|
-
/** Optional: pauseRecord from parser context — skip heuristic if typed pause active. */
|
|
16
|
-
pauseRecord) {
|
|
17
|
-
if (permState.permissionTimer) {
|
|
18
|
-
clearTimeout(permState.permissionTimer);
|
|
19
|
-
permState.permissionTimer = null;
|
|
20
|
-
}
|
|
21
|
-
if (permState.permissionEmitted) {
|
|
22
|
-
permState.permissionEmitted = false;
|
|
23
|
-
// Clear any hard-cap timer too
|
|
24
|
-
if (permState.permissionHardCapTimer) {
|
|
25
|
-
clearTimeout(permState.permissionHardCapTimer);
|
|
26
|
-
permState.permissionHardCapTimer = null;
|
|
27
|
-
}
|
|
28
|
-
delegate.emit({
|
|
29
|
-
time: delegate.elapsed(sessionId),
|
|
30
|
-
type: "agent_idle",
|
|
31
|
-
payload: { name: agentName },
|
|
32
|
-
}, sessionId);
|
|
33
|
-
}
|
|
34
|
-
const needsPermission = Array.from(pendingToolCalls.values()).some((tc) => tc.name !== "Agent" && tc.name !== "Task");
|
|
35
|
-
if (!needsPermission)
|
|
36
|
-
return;
|
|
37
|
-
// Skip if a typed pause already covers this agent (red-team #5 coexistence rule).
|
|
38
|
-
const pauseKey = `${sessionId}:${agentName}`;
|
|
39
|
-
if (pauseRecord?.has(pauseKey))
|
|
40
|
-
return;
|
|
41
|
-
const snapshotTime = Date.now();
|
|
42
|
-
permState.permissionTimer = setTimeout(() => {
|
|
43
|
-
if (permState.permissionEmitted || sessionCompleted)
|
|
44
|
-
return;
|
|
45
|
-
// Re-check typed pause at fire time — may have been set since the timer was created.
|
|
46
|
-
if (pauseRecord?.has(pauseKey))
|
|
47
|
-
return;
|
|
48
|
-
const stillPending = Array.from(pendingToolCalls.values()).some((tc) => tc.name !== "Agent" && tc.name !== "Task" && tc.startTime <= snapshotTime);
|
|
49
|
-
if (!stillPending)
|
|
50
|
-
return;
|
|
51
|
-
if (checkSessionActivity) {
|
|
52
|
-
const lastActivity = delegate.getLastActivityTime(sessionId);
|
|
53
|
-
if (lastActivity !== undefined) {
|
|
54
|
-
const recentThreshold = Date.now() - PERMISSION_DETECT_MS;
|
|
55
|
-
if (lastActivity > recentThreshold)
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
permState.permissionEmitted = true;
|
|
60
|
-
// Legacy emit (backwards compat) — existing listeners expect this event.
|
|
61
|
-
delegate.emit({
|
|
62
|
-
time: delegate.elapsed(sessionId),
|
|
63
|
-
type: "permission_requested",
|
|
64
|
-
payload: { agent: agentName, message: "Waiting for permission" },
|
|
65
|
-
}, sessionId);
|
|
66
|
-
// Dual-emit: new typed pause_started (phase-03 clients use this).
|
|
67
|
-
// [red-team #18] toolUseId intentionally omitted — no deterministic single ID
|
|
68
|
-
// when multiple non-Agent/Task tools are pending. Client matches by (agent, reason).
|
|
69
|
-
delegate.emit({
|
|
70
|
-
time: delegate.elapsed(sessionId),
|
|
71
|
-
type: "pause_started",
|
|
72
|
-
payload: {
|
|
73
|
-
agent: agentName,
|
|
74
|
-
reason: "permission_request",
|
|
75
|
-
// toolUseId: omitted per red-team #18
|
|
76
|
-
},
|
|
77
|
-
}, sessionId);
|
|
78
|
-
// Hard cap: clear heuristic after PERMISSION_HEURISTIC_MAX_MS even without tool_result.
|
|
79
|
-
permState.permissionHardCapTimer = setTimeout(() => {
|
|
80
|
-
if (!permState.permissionEmitted)
|
|
81
|
-
return;
|
|
82
|
-
permState.permissionEmitted = false;
|
|
83
|
-
permState.permissionHardCapTimer = null;
|
|
84
|
-
delegate.emit({
|
|
85
|
-
time: delegate.elapsed(sessionId),
|
|
86
|
-
type: "pause_cleared",
|
|
87
|
-
payload: {
|
|
88
|
-
agent: agentName,
|
|
89
|
-
reason: "permission_request",
|
|
90
|
-
// toolUseId: omitted (matches by agent+reason in phase-03)
|
|
91
|
-
durationMs: PERMISSION_HEURISTIC_MAX_MS,
|
|
92
|
-
},
|
|
93
|
-
}, sessionId);
|
|
94
|
-
}, PERMISSION_HEURISTIC_MAX_MS);
|
|
95
|
-
if (permState.permissionHardCapTimer &&
|
|
96
|
-
typeof permState.permissionHardCapTimer.unref === "function") {
|
|
97
|
-
permState.permissionHardCapTimer.unref();
|
|
98
|
-
}
|
|
99
|
-
}, PERMISSION_DETECT_MS);
|
|
100
|
-
if (typeof permState.permissionTimer.unref === "function") {
|
|
101
|
-
permState.permissionTimer.unref();
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=permission-detection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"permission-detection.js","sourceRoot":"","sources":["../../src/orchviz/permission-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* apply-todo-toggle — pure function that flips a single checkbox marker
|
|
3
|
-
* inside the ## Todo List section of a phase file's content string.
|
|
4
|
-
*
|
|
5
|
-
* Contract:
|
|
6
|
-
* - No fs, no http, no side effects. Pure transformation only.
|
|
7
|
-
* - Mirrors extractTodos fence-aware walk exactly (per red-team C1).
|
|
8
|
-
* - CRLF preserved: majority-EOL detection applied to full content.
|
|
9
|
-
* - Idempotent: marker already matches desired → {changed: false}.
|
|
10
|
-
* - Error tags are static strings, NEVER interpolated content (R2-14).
|
|
11
|
-
*/
|
|
12
|
-
/** Static error tags returned when applyTodoToggle cannot apply the flip. */
|
|
13
|
-
export type TodoToggleErrorTag = "section-missing" | "out-of-range" | "fence-overflow";
|
|
14
|
-
export type TodoToggleResult = {
|
|
15
|
-
content: string;
|
|
16
|
-
changed: boolean;
|
|
17
|
-
} | {
|
|
18
|
-
error: TodoToggleErrorTag;
|
|
19
|
-
};
|
|
20
|
-
/**
|
|
21
|
-
* Flip the Nth (0-based) checkbox marker in ## Todo List section.
|
|
22
|
-
*
|
|
23
|
-
* Fence-aware walk matches extractTodos in parse-phase-file.ts exactly:
|
|
24
|
-
* - Lines matching /^```/ toggle fenceDepth 0→1 or 1→0.
|
|
25
|
-
* - Checkbox lines inside fences (fenceDepth > 0) are skipped/not counted.
|
|
26
|
-
* - Only `^phase-` regex used in server, NOT here — caller decides glob.
|
|
27
|
-
*/
|
|
28
|
-
export declare function applyTodoToggle(content: string, todoIdx: number, checked: boolean): TodoToggleResult;
|
|
29
|
-
//# sourceMappingURL=apply-todo-toggle.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apply-todo-toggle.d.ts","sourceRoot":"","sources":["../../../src/orchviz/plan/apply-todo-toggle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAEvF,MAAM,MAAM,gBAAgB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAyBrG;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAoGpG"}
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* apply-todo-toggle — pure function that flips a single checkbox marker
|
|
3
|
-
* inside the ## Todo List section of a phase file's content string.
|
|
4
|
-
*
|
|
5
|
-
* Contract:
|
|
6
|
-
* - No fs, no http, no side effects. Pure transformation only.
|
|
7
|
-
* - Mirrors extractTodos fence-aware walk exactly (per red-team C1).
|
|
8
|
-
* - CRLF preserved: majority-EOL detection applied to full content.
|
|
9
|
-
* - Idempotent: marker already matches desired → {changed: false}.
|
|
10
|
-
* - Error tags are static strings, NEVER interpolated content (R2-14).
|
|
11
|
-
*/
|
|
12
|
-
const TODO_RE = /^(\s*-\s*\[)(\s|x|X|~|✓)(\]\s+.+?)\s*$/;
|
|
13
|
-
const FENCE_RE = /^```/;
|
|
14
|
-
/**
|
|
15
|
-
* Detect the dominant line ending character.
|
|
16
|
-
* Returns "\r\n" if CRLF count > LF-only count, else "\n".
|
|
17
|
-
*/
|
|
18
|
-
function detectEol(content) {
|
|
19
|
-
const crlfCount = (content.match(/\r\n/g) ?? []).length;
|
|
20
|
-
const lfCount = (content.match(/(?<!\r)\n/g) ?? []).length;
|
|
21
|
-
// Detect mixed-EOL (meaningful mix: both > 0 and neither dominates by 2:1)
|
|
22
|
-
if (crlfCount > 0 && lfCount > 0) {
|
|
23
|
-
// Accept minor contamination (≤20% minority) as "effectively uniform"
|
|
24
|
-
const total = crlfCount + lfCount;
|
|
25
|
-
const minority = Math.min(crlfCount, lfCount);
|
|
26
|
-
if (minority / total > 0.2) {
|
|
27
|
-
// Genuinely mixed — caller may want to warn, but we proceed with majority
|
|
28
|
-
// and let the eol-mixed error tag be used if the caller needs it.
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return crlfCount >= lfCount ? "\r\n" : "\n";
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Flip the Nth (0-based) checkbox marker in ## Todo List section.
|
|
35
|
-
*
|
|
36
|
-
* Fence-aware walk matches extractTodos in parse-phase-file.ts exactly:
|
|
37
|
-
* - Lines matching /^```/ toggle fenceDepth 0→1 or 1→0.
|
|
38
|
-
* - Checkbox lines inside fences (fenceDepth > 0) are skipped/not counted.
|
|
39
|
-
* - Only `^phase-` regex used in server, NOT here — caller decides glob.
|
|
40
|
-
*/
|
|
41
|
-
export function applyTodoToggle(content, todoIdx, checked) {
|
|
42
|
-
// Split preserving original EOL on each line for later reassembly.
|
|
43
|
-
// We split on \n and check if each line ends with \r (for CRLF lines).
|
|
44
|
-
const eol = detectEol(content);
|
|
45
|
-
// Split into raw lines (without any EOL); we'll reassemble with detected eol.
|
|
46
|
-
// Handle CRLF: split on \n, strip trailing \r from each line for processing,
|
|
47
|
-
// then reattach the correct EOL on reassembly.
|
|
48
|
-
const rawLines = content.split("\n");
|
|
49
|
-
const lines = rawLines.map((l) => (l.endsWith("\r") ? l.slice(0, -1) : l));
|
|
50
|
-
// Locate ## Todo List section start
|
|
51
|
-
const todoSectionRe = /^##\s+Todo\s+List\s*$/i;
|
|
52
|
-
const nextSectionRe = /^##?\s/;
|
|
53
|
-
let sectionStart = -1;
|
|
54
|
-
let sectionEnd = lines.length;
|
|
55
|
-
for (let i = 0; i < lines.length; i++) {
|
|
56
|
-
if (todoSectionRe.test(lines[i])) {
|
|
57
|
-
sectionStart = i + 1;
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
if (sectionStart !== -1 && i > sectionStart && nextSectionRe.test(lines[i])) {
|
|
61
|
-
sectionEnd = i;
|
|
62
|
-
break;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
if (sectionStart === -1) {
|
|
66
|
-
return { error: "section-missing" };
|
|
67
|
-
}
|
|
68
|
-
// Walk todo section with fence tracker (must match extractTodos exactly)
|
|
69
|
-
let fenceDepth = 0;
|
|
70
|
-
let count = 0;
|
|
71
|
-
let targetLineIdx = -1;
|
|
72
|
-
for (let i = sectionStart; i < sectionEnd; i++) {
|
|
73
|
-
const line = lines[i];
|
|
74
|
-
if (FENCE_RE.test(line)) {
|
|
75
|
-
fenceDepth = fenceDepth === 0 ? 1 : 0;
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
if (fenceDepth > 0)
|
|
79
|
-
continue;
|
|
80
|
-
const m = line.match(TODO_RE);
|
|
81
|
-
if (!m)
|
|
82
|
-
continue;
|
|
83
|
-
if (count === todoIdx) {
|
|
84
|
-
targetLineIdx = i;
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
count++;
|
|
88
|
-
}
|
|
89
|
-
// Fence depth not closed: error (malformed doc)
|
|
90
|
-
if (fenceDepth > 0) {
|
|
91
|
-
return { error: "fence-overflow" };
|
|
92
|
-
}
|
|
93
|
-
if (targetLineIdx === -1) {
|
|
94
|
-
return { error: "out-of-range" };
|
|
95
|
-
}
|
|
96
|
-
// Check idempotency: does current marker already match desired state?
|
|
97
|
-
const m = lines[targetLineIdx].match(TODO_RE);
|
|
98
|
-
if (!m) {
|
|
99
|
-
// Shouldn't happen since we matched above, but guard defensively
|
|
100
|
-
return { error: "out-of-range" };
|
|
101
|
-
}
|
|
102
|
-
const currentMarker = m[2];
|
|
103
|
-
const currentChecked = currentMarker !== " " && currentMarker !== "";
|
|
104
|
-
if (currentChecked === checked) {
|
|
105
|
-
// Already in desired state — idempotent no-op
|
|
106
|
-
return { content, changed: false };
|
|
107
|
-
}
|
|
108
|
-
// Flip: replace marker char
|
|
109
|
-
const newMarker = checked ? "x" : " ";
|
|
110
|
-
const newLine = m[1] + newMarker + m[3];
|
|
111
|
-
lines[targetLineIdx] = newLine;
|
|
112
|
-
// Reassemble with original EOL type
|
|
113
|
-
// If original was CRLF, rawLines had \r on each line; we stripped them above.
|
|
114
|
-
// Now rebuild: join with detected EOL. Last line may or may not have trailing EOL.
|
|
115
|
-
const hasTrailingNewline = content.endsWith("\n") || content.endsWith("\r\n");
|
|
116
|
-
let newContent;
|
|
117
|
-
if (eol === "\r\n") {
|
|
118
|
-
newContent = lines.join("\r\n");
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
newContent = lines.join("\n");
|
|
122
|
-
}
|
|
123
|
-
// Preserve trailing newline if original had one
|
|
124
|
-
if (hasTrailingNewline && !newContent.endsWith("\n")) {
|
|
125
|
-
newContent += eol;
|
|
126
|
-
}
|
|
127
|
-
return { content: newContent, changed: true };
|
|
128
|
-
}
|
|
129
|
-
//# sourceMappingURL=apply-todo-toggle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apply-todo-toggle.js","sourceRoot":"","sources":["../../../src/orchviz/plan/apply-todo-toggle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* atomic-write — same-dir tmp + renameSync for crash-safe file writes.
|
|
3
|
-
*
|
|
4
|
-
* Security: tmp filename uses .orchviz-tmp- prefix so phase-glob regex
|
|
5
|
-
* (/^phase-0*N-.*\.md$/i) never matches orphaned temps (R2-1, R2-13).
|
|
6
|
-
*
|
|
7
|
-
* Reliability:
|
|
8
|
-
* - renameSync is atomic on POSIX (same filesystem guaranteed by same-dir tmp).
|
|
9
|
-
* - Windows EPERM (file open in another process) → single 50ms retry.
|
|
10
|
-
* - try/finally unlinks tmp on every error path — no orphan on throw.
|
|
11
|
-
*
|
|
12
|
-
* Orphan cleanup: cleanOrphanedTmps(planDir) removes .orchviz-tmp-* files
|
|
13
|
-
* older than 5 minutes. Called on first write per slug (R2-13).
|
|
14
|
-
*/
|
|
15
|
-
/**
|
|
16
|
-
* Write `content` to `targetPath` atomically via a same-directory temp file.
|
|
17
|
-
* Throws on persistent failure (after Windows EPERM retry).
|
|
18
|
-
*/
|
|
19
|
-
export declare function atomicWriteFileSync(targetPath: string, content: string): void;
|
|
20
|
-
/**
|
|
21
|
-
* Remove .orchviz-tmp-* files older than ORPHAN_AGE_MS in planDir.
|
|
22
|
-
* Silently skips if dir doesn't exist or entry stat fails (R2-13).
|
|
23
|
-
*/
|
|
24
|
-
export declare function cleanOrphanedTmps(planDir: string): void;
|
|
25
|
-
//# sourceMappingURL=atomic-write.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../../../src/orchviz/plan/atomic-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA6B7E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAoBvD"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* atomic-write — same-dir tmp + renameSync for crash-safe file writes.
|
|
3
|
-
*
|
|
4
|
-
* Security: tmp filename uses .orchviz-tmp- prefix so phase-glob regex
|
|
5
|
-
* (/^phase-0*N-.*\.md$/i) never matches orphaned temps (R2-1, R2-13).
|
|
6
|
-
*
|
|
7
|
-
* Reliability:
|
|
8
|
-
* - renameSync is atomic on POSIX (same filesystem guaranteed by same-dir tmp).
|
|
9
|
-
* - Windows EPERM (file open in another process) → single 50ms retry.
|
|
10
|
-
* - try/finally unlinks tmp on every error path — no orphan on throw.
|
|
11
|
-
*
|
|
12
|
-
* Orphan cleanup: cleanOrphanedTmps(planDir) removes .orchviz-tmp-* files
|
|
13
|
-
* older than 5 minutes. Called on first write per slug (R2-13).
|
|
14
|
-
*/
|
|
15
|
-
import * as fs from "node:fs";
|
|
16
|
-
import * as path from "node:path";
|
|
17
|
-
import * as crypto from "node:crypto";
|
|
18
|
-
const TMP_PREFIX = ".orchviz-tmp-";
|
|
19
|
-
const ORPHAN_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
20
|
-
/**
|
|
21
|
-
* Write `content` to `targetPath` atomically via a same-directory temp file.
|
|
22
|
-
* Throws on persistent failure (after Windows EPERM retry).
|
|
23
|
-
*/
|
|
24
|
-
export function atomicWriteFileSync(targetPath, content) {
|
|
25
|
-
const dir = path.dirname(targetPath);
|
|
26
|
-
const rand = crypto.randomBytes(6).toString("hex");
|
|
27
|
-
const tmpPath = path.join(dir, `${TMP_PREFIX}${rand}`);
|
|
28
|
-
fs.writeFileSync(tmpPath, content, "utf-8");
|
|
29
|
-
try {
|
|
30
|
-
try {
|
|
31
|
-
fs.renameSync(tmpPath, targetPath);
|
|
32
|
-
}
|
|
33
|
-
catch (err) {
|
|
34
|
-
const e = err;
|
|
35
|
-
if (e.code === "EPERM") {
|
|
36
|
-
// Windows: file may be open in another process. Single 50ms retry.
|
|
37
|
-
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 50);
|
|
38
|
-
fs.renameSync(tmpPath, targetPath);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
throw err;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
catch (err) {
|
|
46
|
-
// Clean up tmp on any rename failure
|
|
47
|
-
try {
|
|
48
|
-
fs.unlinkSync(tmpPath);
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
// Best-effort; suppress secondary error
|
|
52
|
-
}
|
|
53
|
-
throw err;
|
|
54
|
-
}
|
|
55
|
-
// renameSync succeeded — tmp no longer exists (renamed to target), nothing to unlink.
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Remove .orchviz-tmp-* files older than ORPHAN_AGE_MS in planDir.
|
|
59
|
-
* Silently skips if dir doesn't exist or entry stat fails (R2-13).
|
|
60
|
-
*/
|
|
61
|
-
export function cleanOrphanedTmps(planDir) {
|
|
62
|
-
let entries;
|
|
63
|
-
try {
|
|
64
|
-
entries = fs.readdirSync(planDir);
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
const now = Date.now();
|
|
70
|
-
for (const name of entries) {
|
|
71
|
-
if (!name.startsWith(TMP_PREFIX))
|
|
72
|
-
continue;
|
|
73
|
-
const fullPath = path.join(planDir, name);
|
|
74
|
-
try {
|
|
75
|
-
const stat = fs.statSync(fullPath);
|
|
76
|
-
if (now - stat.mtimeMs > ORPHAN_AGE_MS) {
|
|
77
|
-
fs.unlinkSync(fullPath);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
// Skip — file may already be gone or inaccessible
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=atomic-write.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../../src/orchviz/plan/atomic-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,GAAG,eAAe,CAAC;AACnC,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAEjD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,OAAe;IACtE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,EAAE,CAAC,CAAC;IAEvD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC;QACJ,IAAI,CAAC;YACJ,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,GAA4B,CAAC;YACvC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACxB,mEAAmE;gBACnE,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACP,MAAM,GAAG,CAAC;YACX,CAAC;QACF,CAAC;IACF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,qCAAqC;QACrC,IAAI,CAAC;YACJ,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACR,wCAAwC;QACzC,CAAC;QACD,MAAM,GAAG,CAAC;IACX,CAAC;IACD,sFAAsF;AACvF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACJ,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO;IACR,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,aAAa,EAAE,CAAC;gBACxC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,kDAAkD;QACnD,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PlanCollector — read the active plan (or a slug-targeted plan) with mtime-keyed cache.
|
|
3
|
-
*
|
|
4
|
-
* Per red-team H3 (orchviz redesign): cache key is `(planDirMtime, max(phaseFileMtime))`.
|
|
5
|
-
* Cache invalidates the moment any plan file is touched on disk — no stale window.
|
|
6
|
-
* A 60s time-based fallback exists for paranoia (e.g., filesystems with broken mtime).
|
|
7
|
-
*
|
|
8
|
-
* Per R2-3: cache is plain Map<string, CacheEntry> keyed by slug-or-"__active".
|
|
9
|
-
* Soft-reset if map.size > 50. NO LRU, NO 16-entry cap, NO evict-oldest.
|
|
10
|
-
*
|
|
11
|
-
* Per R2-8: PlanSnapshot shape includes phaseEtags (not etag) and error tag.
|
|
12
|
-
* Read-only is the default behavior. Set MEOWKIT_ORCHVIZ_WRITABLE=1 to opt
|
|
13
|
-
* into write mode. Legacy MEOWKIT_ORCHVIZ_READONLY=0 continues to enable
|
|
14
|
-
* writes for backwards compatibility with existing user setups.
|
|
15
|
-
*/
|
|
16
|
-
import type { PlanState } from "./types.js";
|
|
17
|
-
/**
|
|
18
|
-
* Read-only is the default. Precedence (highest first):
|
|
19
|
-
* 1. MEOWKIT_ORCHVIZ_READONLY=1 forces readonly (defensive lock)
|
|
20
|
-
* 2. MEOWKIT_ORCHVIZ_WRITABLE=1 opts into writes (preferred opt-in)
|
|
21
|
-
* 3. MEOWKIT_ORCHVIZ_READONLY=0 opts into writes (legacy compat)
|
|
22
|
-
* 4. otherwise readonly
|
|
23
|
-
*/
|
|
24
|
-
export declare function isOrchvizReadonly(): boolean;
|
|
25
|
-
/** Error tags for PlanSnapshot failure cases (R2-8). */
|
|
26
|
-
export type PlanSnapshotError = "invalid-slug" | "forbidden-path" | "not-found";
|
|
27
|
-
export interface PlanSnapshot {
|
|
28
|
-
plan: PlanState | null;
|
|
29
|
-
/** Per-phase etags keyed by phase number. null on error. */
|
|
30
|
-
phaseEtags: Record<number, string> | null;
|
|
31
|
-
/** Whether the server is in read-only mode (default true; see isOrchvizReadonly). */
|
|
32
|
-
readonly: boolean;
|
|
33
|
-
generatedAt: string;
|
|
34
|
-
error?: PlanSnapshotError;
|
|
35
|
-
}
|
|
36
|
-
export declare class PlanCollector {
|
|
37
|
-
private readonly projectRoot;
|
|
38
|
-
private readonly cache;
|
|
39
|
-
/** Cached `realpathSync(plansDir)` — constant per-projectRoot, avoids syscall per slug poll. */
|
|
40
|
-
private resolvedPlansDir;
|
|
41
|
-
constructor(projectRoot: string);
|
|
42
|
-
snapshot(slug?: string): PlanSnapshot;
|
|
43
|
-
private snapshotActive;
|
|
44
|
-
private snapshotBySlug;
|
|
45
|
-
/** Soft-reset the cache if it grows too large, then insert the new entry (R2-3). */
|
|
46
|
-
private writeCache;
|
|
47
|
-
invalidate(): void;
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=collector.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/orchviz/plan/collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAS5C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAK3C;AAED,wDAAwD;AACxD,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,gBAAgB,GAAG,WAAW,CAAC;AAEhF,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC1C,qFAAqF;IACrF,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAQD,qBAAa,aAAa;IAKb,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,gGAAgG;IAChG,OAAO,CAAC,gBAAgB,CAAuB;gBAElB,WAAW,EAAE,MAAM;IAEhD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY;IAUrC,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,cAAc;IAmFtB,oFAAoF;IACpF,OAAO,CAAC,UAAU;IAOlB,UAAU,IAAI,IAAI;CAIlB"}
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PlanCollector — read the active plan (or a slug-targeted plan) with mtime-keyed cache.
|
|
3
|
-
*
|
|
4
|
-
* Per red-team H3 (orchviz redesign): cache key is `(planDirMtime, max(phaseFileMtime))`.
|
|
5
|
-
* Cache invalidates the moment any plan file is touched on disk — no stale window.
|
|
6
|
-
* A 60s time-based fallback exists for paranoia (e.g., filesystems with broken mtime).
|
|
7
|
-
*
|
|
8
|
-
* Per R2-3: cache is plain Map<string, CacheEntry> keyed by slug-or-"__active".
|
|
9
|
-
* Soft-reset if map.size > 50. NO LRU, NO 16-entry cap, NO evict-oldest.
|
|
10
|
-
*
|
|
11
|
-
* Per R2-8: PlanSnapshot shape includes phaseEtags (not etag) and error tag.
|
|
12
|
-
* Read-only is the default behavior. Set MEOWKIT_ORCHVIZ_WRITABLE=1 to opt
|
|
13
|
-
* into write mode. Legacy MEOWKIT_ORCHVIZ_READONLY=0 continues to enable
|
|
14
|
-
* writes for backwards compatibility with existing user setups.
|
|
15
|
-
*/
|
|
16
|
-
import * as path from "node:path";
|
|
17
|
-
import * as fs from "node:fs";
|
|
18
|
-
import { findActivePlan } from "./find-active-plan.js";
|
|
19
|
-
import { planMtimeKey, readPlan } from "./index.js";
|
|
20
|
-
import { computeAllPhaseEtags } from "./etag.js";
|
|
21
|
-
import { SLUG_RE } from "./plan-constants.js";
|
|
22
|
-
import { createLogger } from "../logger.js";
|
|
23
|
-
const log = createLogger("PlanCollector");
|
|
24
|
-
const FALLBACK_TIMEOUT_MS = 60_000;
|
|
25
|
-
const CACHE_SOFT_RESET_THRESHOLD = 50;
|
|
26
|
-
const ACTIVE_KEY = "__active";
|
|
27
|
-
/**
|
|
28
|
-
* Read-only is the default. Precedence (highest first):
|
|
29
|
-
* 1. MEOWKIT_ORCHVIZ_READONLY=1 forces readonly (defensive lock)
|
|
30
|
-
* 2. MEOWKIT_ORCHVIZ_WRITABLE=1 opts into writes (preferred opt-in)
|
|
31
|
-
* 3. MEOWKIT_ORCHVIZ_READONLY=0 opts into writes (legacy compat)
|
|
32
|
-
* 4. otherwise readonly
|
|
33
|
-
*/
|
|
34
|
-
export function isOrchvizReadonly() {
|
|
35
|
-
if (process.env.MEOWKIT_ORCHVIZ_READONLY === "1")
|
|
36
|
-
return true;
|
|
37
|
-
if (process.env.MEOWKIT_ORCHVIZ_WRITABLE === "1")
|
|
38
|
-
return false;
|
|
39
|
-
if (process.env.MEOWKIT_ORCHVIZ_READONLY === "0")
|
|
40
|
-
return false;
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
export class PlanCollector {
|
|
44
|
-
projectRoot;
|
|
45
|
-
cache = new Map();
|
|
46
|
-
/** Cached `realpathSync(plansDir)` — constant per-projectRoot, avoids syscall per slug poll. */
|
|
47
|
-
resolvedPlansDir = null;
|
|
48
|
-
constructor(projectRoot) {
|
|
49
|
-
this.projectRoot = projectRoot;
|
|
50
|
-
}
|
|
51
|
-
snapshot(slug) {
|
|
52
|
-
const isReadonly = isOrchvizReadonly();
|
|
53
|
-
const generatedAt = new Date().toISOString();
|
|
54
|
-
if (slug !== undefined) {
|
|
55
|
-
return this.snapshotBySlug(slug, isReadonly, generatedAt);
|
|
56
|
-
}
|
|
57
|
-
return this.snapshotActive(isReadonly, generatedAt);
|
|
58
|
-
}
|
|
59
|
-
snapshotActive(isReadonly, generatedAt) {
|
|
60
|
-
const planDir = findActivePlan(this.projectRoot);
|
|
61
|
-
const mtimeKey = planDir ? planMtimeKey(planDir) : null;
|
|
62
|
-
const now = Date.now();
|
|
63
|
-
const cached = this.cache.get(ACTIVE_KEY);
|
|
64
|
-
if (cached && cached.mtimeKey === mtimeKey && now - cached.at < FALLBACK_TIMEOUT_MS) {
|
|
65
|
-
return { ...cached.snapshot, readonly: isReadonly, generatedAt };
|
|
66
|
-
}
|
|
67
|
-
const plan = planDir ? readPlan(planDir) : null;
|
|
68
|
-
const phaseEtags = planDir ? computeAllPhaseEtags(planDir) : null;
|
|
69
|
-
const snapshot = {
|
|
70
|
-
plan,
|
|
71
|
-
phaseEtags,
|
|
72
|
-
readonly: isReadonly,
|
|
73
|
-
generatedAt,
|
|
74
|
-
};
|
|
75
|
-
this.writeCache(ACTIVE_KEY, snapshot, mtimeKey, now);
|
|
76
|
-
return snapshot;
|
|
77
|
-
}
|
|
78
|
-
snapshotBySlug(slug, isReadonly, generatedAt) {
|
|
79
|
-
// Validate slug regex BEFORE any path resolution (defense vs traversal)
|
|
80
|
-
if (!SLUG_RE.test(slug)) {
|
|
81
|
-
return {
|
|
82
|
-
plan: null,
|
|
83
|
-
phaseEtags: null,
|
|
84
|
-
readonly: isReadonly,
|
|
85
|
-
generatedAt,
|
|
86
|
-
error: "invalid-slug",
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
const plansDir = path.join(this.projectRoot, "tasks", "plans");
|
|
90
|
-
const planDir = path.join(plansDir, slug);
|
|
91
|
-
// Boundary check via realpath — cached per-process (constant per projectRoot).
|
|
92
|
-
// macOS /var→/private/var symlink resolves once.
|
|
93
|
-
if (this.resolvedPlansDir === null) {
|
|
94
|
-
try {
|
|
95
|
-
this.resolvedPlansDir = fs.realpathSync(plansDir);
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
return {
|
|
99
|
-
plan: null,
|
|
100
|
-
phaseEtags: null,
|
|
101
|
-
readonly: isReadonly,
|
|
102
|
-
generatedAt,
|
|
103
|
-
error: "not-found",
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
const boundary = this.resolvedPlansDir + path.sep;
|
|
108
|
-
let resolved;
|
|
109
|
-
try {
|
|
110
|
-
resolved = fs.realpathSync(planDir);
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
return {
|
|
114
|
-
plan: null,
|
|
115
|
-
phaseEtags: null,
|
|
116
|
-
readonly: isReadonly,
|
|
117
|
-
generatedAt,
|
|
118
|
-
error: "not-found",
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
if (!(resolved + path.sep).startsWith(boundary)) {
|
|
122
|
-
log.warn(`slug boundary violation: ${slug} -> ${resolved}`);
|
|
123
|
-
return {
|
|
124
|
-
plan: null,
|
|
125
|
-
phaseEtags: null,
|
|
126
|
-
readonly: isReadonly,
|
|
127
|
-
generatedAt,
|
|
128
|
-
error: "forbidden-path",
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
const mtimeKey = planMtimeKey(planDir);
|
|
132
|
-
const now = Date.now();
|
|
133
|
-
const cached = this.cache.get(slug);
|
|
134
|
-
if (cached && cached.mtimeKey === mtimeKey && now - cached.at < FALLBACK_TIMEOUT_MS) {
|
|
135
|
-
return { ...cached.snapshot, readonly: isReadonly, generatedAt };
|
|
136
|
-
}
|
|
137
|
-
const plan = readPlan(planDir);
|
|
138
|
-
if (!plan) {
|
|
139
|
-
return {
|
|
140
|
-
plan: null,
|
|
141
|
-
phaseEtags: null,
|
|
142
|
-
readonly: isReadonly,
|
|
143
|
-
generatedAt,
|
|
144
|
-
error: "not-found",
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
const phaseEtags = computeAllPhaseEtags(planDir);
|
|
148
|
-
const snapshot = {
|
|
149
|
-
plan,
|
|
150
|
-
phaseEtags,
|
|
151
|
-
readonly: isReadonly,
|
|
152
|
-
generatedAt,
|
|
153
|
-
};
|
|
154
|
-
this.writeCache(slug, snapshot, mtimeKey, now);
|
|
155
|
-
return snapshot;
|
|
156
|
-
}
|
|
157
|
-
/** Soft-reset the cache if it grows too large, then insert the new entry (R2-3). */
|
|
158
|
-
writeCache(key, snapshot, mtimeKey, now) {
|
|
159
|
-
if (this.cache.size >= CACHE_SOFT_RESET_THRESHOLD) {
|
|
160
|
-
this.cache.clear();
|
|
161
|
-
}
|
|
162
|
-
this.cache.set(key, { snapshot, mtimeKey, at: now });
|
|
163
|
-
}
|
|
164
|
-
invalidate() {
|
|
165
|
-
this.cache.clear();
|
|
166
|
-
// resolvedPlansDir is per-projectRoot and never changes; do NOT clear.
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
//# sourceMappingURL=collector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../../src/orchviz/plan/collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAE1C,MAAM,mBAAmB,GAAG,MAAM,CAAC;AACnC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AACtC,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9D,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC/D,OAAO,IAAI,CAAC;AACb,CAAC;AAqBD,MAAM,OAAO,aAAa;IAKI;IAJZ,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IACvD,gGAAgG;IACxF,gBAAgB,GAAkB,IAAI,CAAC;IAE/C,YAA6B,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAEpD,QAAQ,CAAC,IAAa;QACrB,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE7C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC;IAEO,cAAc,CAAC,UAAmB,EAAE,WAAmB;QAC9D,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,mBAAmB,EAAE,CAAC;YACrF,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClE,MAAM,QAAQ,GAAiB;YAC9B,IAAI;YACJ,UAAU;YACV,QAAQ,EAAE,UAAU;YACpB,WAAW;SACX,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QACrD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAEO,cAAc,CAAC,IAAY,EAAE,UAAmB,EAAE,WAAmB;QAC5E,wEAAwE;QACxE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO;gBACN,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,UAAU;gBACpB,WAAW;gBACX,KAAK,EAAE,cAAc;aACrB,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE1C,+EAA+E;QAC/E,iDAAiD;QACjD,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC;gBACJ,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO;oBACN,IAAI,EAAE,IAAI;oBACV,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,UAAU;oBACpB,WAAW;oBACX,KAAK,EAAE,WAAW;iBAClB,CAAC;YACH,CAAC;QACF,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC;QAClD,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACJ,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO;gBACN,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,UAAU;gBACpB,WAAW;gBACX,KAAK,EAAE,WAAW;aAClB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,IAAI,CAAC,4BAA4B,IAAI,OAAO,QAAQ,EAAE,CAAC,CAAC;YAC5D,OAAO;gBACN,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,UAAU;gBACpB,WAAW;gBACX,KAAK,EAAE,gBAAgB;aACvB,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,mBAAmB,EAAE,CAAC;YACrF,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,OAAO;gBACN,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,UAAU;gBACpB,WAAW;gBACX,KAAK,EAAE,WAAW;aAClB,CAAC;QACH,CAAC;QACD,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAiB;YAC9B,IAAI;YACJ,UAAU;YACV,QAAQ,EAAE,UAAU;YACpB,WAAW;SACX,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,oFAAoF;IAC5E,UAAU,CAAC,GAAW,EAAE,QAAsB,EAAE,QAAuB,EAAE,GAAW;QAC3F,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,0BAA0B,EAAE,CAAC;YACnD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,UAAU;QACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,uEAAuE;IACxE,CAAC;CACD"}
|