@imgly/codesign-mcp 0.1.6 → 0.1.8
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/README.md +5 -10
- package/assets/docs/api/index.d.ts +9 -3
- package/assets/docs/guide/SKILL.md +2 -2
- package/assets/docs/guide/api/node/classes/creativeengine.md +13 -13
- package/assets/docs/guide/edit-image/transform/scale.md +1 -3
- package/assets/docs/guide/filters-and-effects/duotone.md +1 -1
- package/assets/docs/guide/get-started/bun.md +0 -2
- package/assets/docs/guide/get-started/deno.md +0 -1
- package/assets/docs/guide/get-started/vanilla.md +0 -2
- package/assets/docs/guide/import-media/default-assets.md +20 -24
- package/assets/docs/guide/plugins/print-ready-pdf.md +0 -2
- package/assets/docs/guide/serve-assets.md +80 -23
- package/assets/docs/handbook/SKILL.md +6 -7
- package/dist/assets/inline.generated.js +12 -12
- package/dist/assets/inline.generated.js.map +1 -1
- package/dist/cli/http.d.ts.map +1 -1
- package/dist/cli/http.js +29 -5
- package/dist/cli/http.js.map +1 -1
- package/dist/cli/stdio.d.ts.map +1 -1
- package/dist/cli/stdio.js +145 -48
- package/dist/cli/stdio.js.map +1 -1
- package/dist/cli/trial-license.generated.d.ts +1 -1
- package/dist/cli/trial-license.generated.js +1 -1
- package/dist/cli/trial-license.generated.js.map +1 -1
- package/dist/config.d.ts +17 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +20 -1
- package/dist/config.js.map +1 -1
- package/dist/diagnostics/bundle.d.ts +3 -0
- package/dist/diagnostics/bundle.d.ts.map +1 -1
- package/dist/diagnostics/bundle.js +25 -22
- package/dist/diagnostics/bundle.js.map +1 -1
- package/dist/diagnostics/events.d.ts +6 -0
- package/dist/diagnostics/events.d.ts.map +1 -1
- package/dist/diagnostics/events.js.map +1 -1
- package/dist/diagnostics/prompt.d.ts +3 -0
- package/dist/diagnostics/prompt.d.ts.map +1 -0
- package/dist/diagnostics/prompt.js +21 -0
- package/dist/diagnostics/prompt.js.map +1 -0
- package/dist/diagnostics/router.d.ts +12 -0
- package/dist/diagnostics/router.d.ts.map +1 -0
- package/dist/diagnostics/router.js +64 -0
- package/dist/diagnostics/router.js.map +1 -0
- package/dist/diagnostics/spa-assets.generated.d.ts.map +1 -0
- package/dist/diagnostics/spa-assets.generated.js +1231 -0
- package/dist/diagnostics/spa-assets.generated.js.map +1 -0
- package/dist/diagnostics/status.d.ts +38 -0
- package/dist/diagnostics/status.d.ts.map +1 -0
- package/dist/diagnostics/status.js +53 -0
- package/dist/diagnostics/status.js.map +1 -0
- package/dist/diagnostics/summary.d.ts +48 -0
- package/dist/diagnostics/summary.d.ts.map +1 -0
- package/dist/diagnostics/summary.js +116 -0
- package/dist/diagnostics/summary.js.map +1 -0
- package/dist/diagnostics/tool.d.ts +16 -0
- package/dist/diagnostics/tool.d.ts.map +1 -0
- package/dist/diagnostics/tool.js +90 -0
- package/dist/diagnostics/tool.js.map +1 -0
- package/dist/engine/asset-sources.d.ts +8 -0
- package/dist/engine/asset-sources.d.ts.map +1 -1
- package/dist/engine/asset-sources.js +9 -2
- package/dist/engine/asset-sources.js.map +1 -1
- package/dist/engine/cesdk-adapter.d.ts +5 -1
- package/dist/engine/cesdk-adapter.d.ts.map +1 -1
- package/dist/engine/cesdk-adapter.js +8 -1
- package/dist/engine/cesdk-adapter.js.map +1 -1
- package/dist/engine/engine-capacity.d.ts +16 -0
- package/dist/engine/engine-capacity.d.ts.map +1 -0
- package/dist/engine/engine-capacity.js +48 -0
- package/dist/engine/engine-capacity.js.map +1 -0
- package/dist/engine/engine-slots.d.ts +48 -0
- package/dist/engine/engine-slots.d.ts.map +1 -0
- package/dist/engine/engine-slots.js +182 -0
- package/dist/engine/engine-slots.js.map +1 -0
- package/dist/engine/uri-resolver.js.map +1 -1
- package/dist/server.d.ts +25 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +24 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/engine.d.ts +92 -14
- package/dist/tools/engine.d.ts.map +1 -1
- package/dist/tools/engine.js +147 -20
- package/dist/tools/engine.js.map +1 -1
- package/dist/tools/export.d.ts.map +1 -1
- package/dist/tools/export.js +34 -4
- package/dist/tools/export.js.map +1 -1
- package/dist/tools/index.js +2 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/load.d.ts.map +1 -1
- package/dist/tools/load.js +26 -19
- package/dist/tools/load.js.map +1 -1
- package/dist/tools/preview.d.ts.map +1 -1
- package/dist/tools/preview.js +60 -40
- package/dist/tools/preview.js.map +1 -1
- package/dist/tools/{open-editor.d.ts → view.d.ts} +3 -3
- package/dist/tools/view.d.ts.map +1 -0
- package/dist/tools/{open-editor.js → view.js} +20 -18
- package/dist/tools/view.js.map +1 -0
- package/dist/viewer/listener.d.ts +2 -0
- package/dist/viewer/listener.d.ts.map +1 -1
- package/dist/viewer/listener.js +2 -0
- package/dist/viewer/listener.js.map +1 -1
- package/dist/viewer/presigned-r2-url-builder.d.ts +1 -1
- package/dist/viewer/presigned-r2-url-builder.js +1 -1
- package/dist/viewer/presigned-r2-url-builder.js.map +1 -1
- package/dist/viewer/router.d.ts.map +1 -1
- package/dist/viewer/router.js +8 -17
- package/dist/viewer/router.js.map +1 -1
- package/dist/viewer/session-mount.js.map +1 -1
- package/dist/viewer/spa-assets.generated.d.ts.map +1 -1
- package/dist/viewer/spa-assets.generated.js +750 -869
- package/dist/viewer/spa-assets.generated.js.map +1 -1
- package/dist/viewer/url-builder.d.ts +4 -3
- package/dist/viewer/url-builder.d.ts.map +1 -1
- package/dist/viewer/url-builder.js +4 -4
- package/dist/viewer/url-builder.js.map +1 -1
- package/package.json +7 -6
- package/dist/dashboard/router.d.ts +0 -3
- package/dist/dashboard/router.d.ts.map +0 -1
- package/dist/dashboard/router.js +0 -19
- package/dist/dashboard/router.js.map +0 -1
- package/dist/dashboard/spa-assets.generated.d.ts.map +0 -1
- package/dist/dashboard/spa-assets.generated.js +0 -220
- package/dist/dashboard/spa-assets.generated.js.map +0 -1
- package/dist/metrics/mount.d.ts +0 -11
- package/dist/metrics/mount.d.ts.map +0 -1
- package/dist/metrics/mount.js +0 -13
- package/dist/metrics/mount.js.map +0 -1
- package/dist/metrics/recorder.d.ts +0 -55
- package/dist/metrics/recorder.d.ts.map +0 -1
- package/dist/metrics/recorder.js +0 -97
- package/dist/metrics/recorder.js.map +0 -1
- package/dist/test/scripts/changelog-add.d.ts +0 -8
- package/dist/test/scripts/changelog-add.d.ts.map +0 -1
- package/dist/test/scripts/changelog-add.js +0 -50
- package/dist/test/scripts/changelog-add.js.map +0 -1
- package/dist/test/scripts/changelog-collate.d.ts +0 -38
- package/dist/test/scripts/changelog-collate.d.ts.map +0 -1
- package/dist/test/scripts/changelog-collate.js +0 -171
- package/dist/test/scripts/changelog-collate.js.map +0 -1
- package/dist/test/test/changelog.test.d.ts +0 -2
- package/dist/test/test/changelog.test.d.ts.map +0 -1
- package/dist/test/test/changelog.test.js +0 -293
- package/dist/test/test/changelog.test.js.map +0 -1
- package/dist/test/test/cli/dispatcher.test.d.ts +0 -2
- package/dist/test/test/cli/dispatcher.test.d.ts.map +0 -1
- package/dist/test/test/cli/dispatcher.test.js +0 -54
- package/dist/test/test/cli/dispatcher.test.js.map +0 -1
- package/dist/test/test/cli/redirect-console.test.d.ts +0 -2
- package/dist/test/test/cli/redirect-console.test.d.ts.map +0 -1
- package/dist/test/test/cli/redirect-console.test.js +0 -78
- package/dist/test/test/cli/redirect-console.test.js.map +0 -1
- package/dist/test/test/cli/resolve-license.test.d.ts +0 -2
- package/dist/test/test/cli/resolve-license.test.d.ts.map +0 -1
- package/dist/test/test/cli/resolve-license.test.js +0 -29
- package/dist/test/test/cli/resolve-license.test.js.map +0 -1
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts +0 -2
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts.map +0 -1
- package/dist/test/test/cli/stdio-diagnostics.test.js +0 -31
- package/dist/test/test/cli/stdio-diagnostics.test.js.map +0 -1
- package/dist/test/test/cli/stdio-license.test.d.ts +0 -2
- package/dist/test/test/cli/stdio-license.test.d.ts.map +0 -1
- package/dist/test/test/cli/stdio-license.test.js +0 -19
- package/dist/test/test/cli/stdio-license.test.js.map +0 -1
- package/dist/test/test/config.test.d.ts +0 -2
- package/dist/test/test/config.test.d.ts.map +0 -1
- package/dist/test/test/config.test.js +0 -95
- package/dist/test/test/config.test.js.map +0 -1
- package/dist/test/test/cross-ref.test.d.ts +0 -2
- package/dist/test/test/cross-ref.test.d.ts.map +0 -1
- package/dist/test/test/cross-ref.test.js +0 -39
- package/dist/test/test/cross-ref.test.js.map +0 -1
- package/dist/test/test/diagnostics/bundle.test.d.ts +0 -2
- package/dist/test/test/diagnostics/bundle.test.d.ts.map +0 -1
- package/dist/test/test/diagnostics/bundle.test.js +0 -53
- package/dist/test/test/diagnostics/bundle.test.js.map +0 -1
- package/dist/test/test/diagnostics/compose.test.d.ts +0 -2
- package/dist/test/test/diagnostics/compose.test.d.ts.map +0 -1
- package/dist/test/test/diagnostics/compose.test.js +0 -31
- package/dist/test/test/diagnostics/compose.test.js.map +0 -1
- package/dist/test/test/diagnostics/file-sink.test.d.ts +0 -2
- package/dist/test/test/diagnostics/file-sink.test.d.ts.map +0 -1
- package/dist/test/test/diagnostics/file-sink.test.js +0 -113
- package/dist/test/test/diagnostics/file-sink.test.js.map +0 -1
- package/dist/test/test/diagnostics/redact.test.d.ts +0 -2
- package/dist/test/test/diagnostics/redact.test.d.ts.map +0 -1
- package/dist/test/test/diagnostics/redact.test.js +0 -59
- package/dist/test/test/diagnostics/redact.test.js.map +0 -1
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts +0 -2
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts.map +0 -1
- package/dist/test/test/diagnostics/tool-call-adapter.test.js +0 -34
- package/dist/test/test/diagnostics/tool-call-adapter.test.js.map +0 -1
- package/dist/test/test/engine/asset-sources.test.d.ts +0 -2
- package/dist/test/test/engine/asset-sources.test.d.ts.map +0 -1
- package/dist/test/test/engine/asset-sources.test.js +0 -100
- package/dist/test/test/engine/asset-sources.test.js.map +0 -1
- package/dist/test/test/engine/cesdk-adapter.test.d.ts +0 -2
- package/dist/test/test/engine/cesdk-adapter.test.d.ts.map +0 -1
- package/dist/test/test/engine/cesdk-adapter.test.js +0 -32
- package/dist/test/test/engine/cesdk-adapter.test.js.map +0 -1
- package/dist/test/test/engine/mutex.test.d.ts +0 -2
- package/dist/test/test/engine/mutex.test.d.ts.map +0 -1
- package/dist/test/test/engine/mutex.test.js +0 -63
- package/dist/test/test/engine/mutex.test.js.map +0 -1
- package/dist/test/test/engine/session.test.d.ts +0 -2
- package/dist/test/test/engine/session.test.d.ts.map +0 -1
- package/dist/test/test/engine/session.test.js +0 -159
- package/dist/test/test/engine/session.test.js.map +0 -1
- package/dist/test/test/engine/unsplash-source.test.d.ts +0 -2
- package/dist/test/test/engine/unsplash-source.test.d.ts.map +0 -1
- package/dist/test/test/engine/unsplash-source.test.js +0 -129
- package/dist/test/test/engine/unsplash-source.test.js.map +0 -1
- package/dist/test/test/engine/uri-resolver.test.d.ts +0 -2
- package/dist/test/test/engine/uri-resolver.test.d.ts.map +0 -1
- package/dist/test/test/engine/uri-resolver.test.js +0 -38
- package/dist/test/test/engine/uri-resolver.test.js.map +0 -1
- package/dist/test/test/gateway/hosted-stub.test.d.ts +0 -2
- package/dist/test/test/gateway/hosted-stub.test.d.ts.map +0 -1
- package/dist/test/test/gateway/hosted-stub.test.js +0 -11
- package/dist/test/test/gateway/hosted-stub.test.js.map +0 -1
- package/dist/test/test/gateway/local.test.d.ts +0 -2
- package/dist/test/test/gateway/local.test.d.ts.map +0 -1
- package/dist/test/test/gateway/local.test.js +0 -29
- package/dist/test/test/gateway/local.test.js.map +0 -1
- package/dist/test/test/handbook-contract.test.d.ts +0 -2
- package/dist/test/test/handbook-contract.test.d.ts.map +0 -1
- package/dist/test/test/handbook-contract.test.js +0 -79
- package/dist/test/test/handbook-contract.test.js.map +0 -1
- package/dist/test/test/http/server.test.d.ts +0 -2
- package/dist/test/test/http/server.test.d.ts.map +0 -1
- package/dist/test/test/http/server.test.js +0 -338
- package/dist/test/test/http/server.test.js.map +0 -1
- package/dist/test/test/http/session-id-header.test.d.ts +0 -2
- package/dist/test/test/http/session-id-header.test.d.ts.map +0 -1
- package/dist/test/test/http/session-id-header.test.js +0 -76
- package/dist/test/test/http/session-id-header.test.js.map +0 -1
- package/dist/test/test/http/session-manager.test.d.ts +0 -2
- package/dist/test/test/http/session-manager.test.d.ts.map +0 -1
- package/dist/test/test/http/session-manager.test.js +0 -97
- package/dist/test/test/http/session-manager.test.js.map +0 -1
- package/dist/test/test/http/workspace-auth.test.d.ts +0 -2
- package/dist/test/test/http/workspace-auth.test.d.ts.map +0 -1
- package/dist/test/test/http/workspace-auth.test.js +0 -40
- package/dist/test/test/http/workspace-auth.test.js.map +0 -1
- package/dist/test/test/metrics/mount.test.d.ts +0 -2
- package/dist/test/test/metrics/mount.test.d.ts.map +0 -1
- package/dist/test/test/metrics/mount.test.js +0 -59
- package/dist/test/test/metrics/mount.test.js.map +0 -1
- package/dist/test/test/metrics/recorder.test.d.ts +0 -2
- package/dist/test/test/metrics/recorder.test.d.ts.map +0 -1
- package/dist/test/test/metrics/recorder.test.js +0 -118
- package/dist/test/test/metrics/recorder.test.js.map +0 -1
- package/dist/test/test/revisions/hash.test.d.ts +0 -2
- package/dist/test/test/revisions/hash.test.d.ts.map +0 -1
- package/dist/test/test/revisions/hash.test.js +0 -33
- package/dist/test/test/revisions/hash.test.js.map +0 -1
- package/dist/test/test/revisions/store.test.d.ts +0 -2
- package/dist/test/test/revisions/store.test.d.ts.map +0 -1
- package/dist/test/test/revisions/store.test.js +0 -315
- package/dist/test/test/revisions/store.test.js.map +0 -1
- package/dist/test/test/server.metrics.test.d.ts +0 -2
- package/dist/test/test/server.metrics.test.d.ts.map +0 -1
- package/dist/test/test/server.metrics.test.js +0 -87
- package/dist/test/test/server.metrics.test.js.map +0 -1
- package/dist/test/test/server.test.d.ts +0 -2
- package/dist/test/test/server.test.d.ts.map +0 -1
- package/dist/test/test/server.test.js +0 -146
- package/dist/test/test/server.test.js.map +0 -1
- package/dist/test/test/skill-tools.test.d.ts +0 -2
- package/dist/test/test/skill-tools.test.d.ts.map +0 -1
- package/dist/test/test/skill-tools.test.js +0 -84
- package/dist/test/test/skill-tools.test.js.map +0 -1
- package/dist/test/test/smoke.test.d.ts +0 -2
- package/dist/test/test/smoke.test.d.ts.map +0 -1
- package/dist/test/test/smoke.test.js +0 -8
- package/dist/test/test/smoke.test.js.map +0 -1
- package/dist/test/test/tools/asset-generate.test.d.ts +0 -2
- package/dist/test/test/tools/asset-generate.test.d.ts.map +0 -1
- package/dist/test/test/tools/asset-generate.test.js +0 -66
- package/dist/test/test/tools/asset-generate.test.js.map +0 -1
- package/dist/test/test/tools/asset-search.test.d.ts +0 -2
- package/dist/test/test/tools/asset-search.test.d.ts.map +0 -1
- package/dist/test/test/tools/asset-search.test.js +0 -121
- package/dist/test/test/tools/asset-search.test.js.map +0 -1
- package/dist/test/test/tools/edit-harness.d.ts +0 -14
- package/dist/test/test/tools/edit-harness.d.ts.map +0 -1
- package/dist/test/test/tools/edit-harness.js +0 -30
- package/dist/test/test/tools/edit-harness.js.map +0 -1
- package/dist/test/test/tools/edit.telemetry.test.d.ts +0 -2
- package/dist/test/test/tools/edit.telemetry.test.d.ts.map +0 -1
- package/dist/test/test/tools/edit.telemetry.test.js +0 -46
- package/dist/test/test/tools/edit.telemetry.test.js.map +0 -1
- package/dist/test/test/tools/edit.test.d.ts +0 -2
- package/dist/test/test/tools/edit.test.d.ts.map +0 -1
- package/dist/test/test/tools/edit.test.js +0 -267
- package/dist/test/test/tools/edit.test.js.map +0 -1
- package/dist/test/test/tools/export-harness.d.ts +0 -13
- package/dist/test/test/tools/export-harness.d.ts.map +0 -1
- package/dist/test/test/tools/export-harness.js +0 -27
- package/dist/test/test/tools/export-harness.js.map +0 -1
- package/dist/test/test/tools/export.telemetry.test.d.ts +0 -2
- package/dist/test/test/tools/export.telemetry.test.d.ts.map +0 -1
- package/dist/test/test/tools/export.telemetry.test.js +0 -65
- package/dist/test/test/tools/export.telemetry.test.js.map +0 -1
- package/dist/test/test/tools/export.test.d.ts +0 -2
- package/dist/test/test/tools/export.test.d.ts.map +0 -1
- package/dist/test/test/tools/export.test.js +0 -174
- package/dist/test/test/tools/export.test.js.map +0 -1
- package/dist/test/test/tools/history.test.d.ts +0 -2
- package/dist/test/test/tools/history.test.d.ts.map +0 -1
- package/dist/test/test/tools/history.test.js +0 -29
- package/dist/test/test/tools/history.test.js.map +0 -1
- package/dist/test/test/tools/import.test.d.ts +0 -2
- package/dist/test/test/tools/import.test.d.ts.map +0 -1
- package/dist/test/test/tools/import.test.js +0 -122
- package/dist/test/test/tools/import.test.js.map +0 -1
- package/dist/test/test/tools/index.test.d.ts +0 -2
- package/dist/test/test/tools/index.test.d.ts.map +0 -1
- package/dist/test/test/tools/index.test.js +0 -117
- package/dist/test/test/tools/index.test.js.map +0 -1
- package/dist/test/test/tools/inspect.test.d.ts +0 -2
- package/dist/test/test/tools/inspect.test.d.ts.map +0 -1
- package/dist/test/test/tools/inspect.test.js +0 -62
- package/dist/test/test/tools/inspect.test.js.map +0 -1
- package/dist/test/test/tools/list.test.d.ts +0 -2
- package/dist/test/test/tools/list.test.d.ts.map +0 -1
- package/dist/test/test/tools/list.test.js +0 -23
- package/dist/test/test/tools/list.test.js.map +0 -1
- package/dist/test/test/tools/load.integration.test.d.ts +0 -2
- package/dist/test/test/tools/load.integration.test.d.ts.map +0 -1
- package/dist/test/test/tools/load.integration.test.js +0 -165
- package/dist/test/test/tools/load.integration.test.js.map +0 -1
- package/dist/test/test/tools/load.test.d.ts +0 -2
- package/dist/test/test/tools/load.test.d.ts.map +0 -1
- package/dist/test/test/tools/load.test.js +0 -387
- package/dist/test/test/tools/load.test.js.map +0 -1
- package/dist/test/test/tools/metrics.test.d.ts +0 -2
- package/dist/test/test/tools/metrics.test.d.ts.map +0 -1
- package/dist/test/test/tools/metrics.test.js +0 -29
- package/dist/test/test/tools/metrics.test.js.map +0 -1
- package/dist/test/test/tools/open-editor.test.d.ts +0 -2
- package/dist/test/test/tools/open-editor.test.d.ts.map +0 -1
- package/dist/test/test/tools/open-editor.test.js +0 -53
- package/dist/test/test/tools/open-editor.test.js.map +0 -1
- package/dist/test/test/tools/preview-harness.d.ts +0 -9
- package/dist/test/test/tools/preview-harness.d.ts.map +0 -1
- package/dist/test/test/tools/preview-harness.js +0 -23
- package/dist/test/test/tools/preview-harness.js.map +0 -1
- package/dist/test/test/tools/preview.telemetry.test.d.ts +0 -2
- package/dist/test/test/tools/preview.telemetry.test.d.ts.map +0 -1
- package/dist/test/test/tools/preview.telemetry.test.js +0 -36
- package/dist/test/test/tools/preview.telemetry.test.js.map +0 -1
- package/dist/test/test/tools/preview.test.d.ts +0 -2
- package/dist/test/test/tools/preview.test.d.ts.map +0 -1
- package/dist/test/test/tools/preview.test.js +0 -75
- package/dist/test/test/tools/preview.test.js.map +0 -1
- package/dist/test/test/tools/rename.test.d.ts +0 -2
- package/dist/test/test/tools/rename.test.d.ts.map +0 -1
- package/dist/test/test/tools/rename.test.js +0 -16
- package/dist/test/test/tools/rename.test.js.map +0 -1
- package/dist/test/test/tools/save.test.d.ts +0 -2
- package/dist/test/test/tools/save.test.d.ts.map +0 -1
- package/dist/test/test/tools/save.test.js +0 -137
- package/dist/test/test/tools/save.test.js.map +0 -1
- package/dist/test/test/tools/schema-best-practices.d.ts +0 -13
- package/dist/test/test/tools/schema-best-practices.d.ts.map +0 -1
- package/dist/test/test/tools/schema-best-practices.js +0 -169
- package/dist/test/test/tools/schema-best-practices.js.map +0 -1
- package/dist/test/test/tools/schema-best-practices.test.d.ts +0 -3
- package/dist/test/test/tools/schema-best-practices.test.d.ts.map +0 -1
- package/dist/test/test/tools/schema-best-practices.test.js +0 -194
- package/dist/test/test/tools/schema-best-practices.test.js.map +0 -1
- package/dist/test/test/tools/spans.test.d.ts +0 -2
- package/dist/test/test/tools/spans.test.d.ts.map +0 -1
- package/dist/test/test/tools/spans.test.js +0 -84
- package/dist/test/test/tools/spans.test.js.map +0 -1
- package/dist/test/test/viewer/broadcaster.test.d.ts +0 -2
- package/dist/test/test/viewer/broadcaster.test.d.ts.map +0 -1
- package/dist/test/test/viewer/broadcaster.test.js +0 -53
- package/dist/test/test/viewer/broadcaster.test.js.map +0 -1
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts +0 -2
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts.map +0 -1
- package/dist/test/test/viewer/cesdk-cdn.test.js +0 -19
- package/dist/test/test/viewer/cesdk-cdn.test.js.map +0 -1
- package/dist/test/test/viewer/config-route.test.d.ts +0 -2
- package/dist/test/test/viewer/config-route.test.d.ts.map +0 -1
- package/dist/test/test/viewer/config-route.test.js +0 -28
- package/dist/test/test/viewer/config-route.test.js.map +0 -1
- package/dist/test/test/viewer/resource-route.test.d.ts +0 -2
- package/dist/test/test/viewer/resource-route.test.d.ts.map +0 -1
- package/dist/test/test/viewer/resource-route.test.js +0 -70
- package/dist/test/test/viewer/resource-route.test.js.map +0 -1
- package/dist/test/test/viewer/router.test.d.ts +0 -2
- package/dist/test/test/viewer/router.test.d.ts.map +0 -1
- package/dist/test/test/viewer/router.test.js +0 -227
- package/dist/test/test/viewer/router.test.js.map +0 -1
- package/dist/test/test/viewer/session-mount.test.d.ts +0 -2
- package/dist/test/test/viewer/session-mount.test.d.ts.map +0 -1
- package/dist/test/test/viewer/session-mount.test.js +0 -52
- package/dist/test/test/viewer/session-mount.test.js.map +0 -1
- package/dist/test/test/viewer/spa-version.test.d.ts +0 -2
- package/dist/test/test/viewer/spa-version.test.d.ts.map +0 -1
- package/dist/test/test/viewer/spa-version.test.js +0 -14
- package/dist/test/test/viewer/spa-version.test.js.map +0 -1
- package/dist/test/test/viewer/url-builder.test.d.ts +0 -2
- package/dist/test/test/viewer/url-builder.test.d.ts.map +0 -1
- package/dist/test/test/viewer/url-builder.test.js +0 -98
- package/dist/test/test/viewer/url-builder.test.js.map +0 -1
- package/dist/test/test/workspace/content-hash.test.d.ts +0 -2
- package/dist/test/test/workspace/content-hash.test.d.ts.map +0 -1
- package/dist/test/test/workspace/content-hash.test.js +0 -17
- package/dist/test/test/workspace/content-hash.test.js.map +0 -1
- package/dist/test/test/workspace/hosted-stub.test.d.ts +0 -2
- package/dist/test/test/workspace/hosted-stub.test.d.ts.map +0 -1
- package/dist/test/test/workspace/hosted-stub.test.js +0 -30
- package/dist/test/test/workspace/hosted-stub.test.js.map +0 -1
- package/dist/test/test/workspace/in-memory.test.d.ts +0 -2
- package/dist/test/test/workspace/in-memory.test.d.ts.map +0 -1
- package/dist/test/test/workspace/in-memory.test.js +0 -4
- package/dist/test/test/workspace/in-memory.test.js.map +0 -1
- package/dist/test/test/workspace/node-fs.test.d.ts +0 -2
- package/dist/test/test/workspace/node-fs.test.d.ts.map +0 -1
- package/dist/test/test/workspace/node-fs.test.js +0 -20
- package/dist/test/test/workspace/node-fs.test.js.map +0 -1
- package/dist/test/test/workspace/s3.test.d.ts +0 -2
- package/dist/test/test/workspace/s3.test.d.ts.map +0 -1
- package/dist/test/test/workspace/s3.test.js +0 -153
- package/dist/test/test/workspace/s3.test.js.map +0 -1
- package/dist/test/test/workspace/scoped.test.d.ts +0 -2
- package/dist/test/test/workspace/scoped.test.d.ts.map +0 -1
- package/dist/test/test/workspace/scoped.test.js +0 -59
- package/dist/test/test/workspace/scoped.test.js.map +0 -1
- package/dist/test/test/workspace/shared-contract.d.ts +0 -3
- package/dist/test/test/workspace/shared-contract.d.ts.map +0 -1
- package/dist/test/test/workspace/shared-contract.js +0 -92
- package/dist/test/test/workspace/shared-contract.js.map +0 -1
- package/dist/test/tsconfig.test.tsbuildinfo +0 -1
- package/dist/test/vitest.config.d.ts +0 -3
- package/dist/test/vitest.config.d.ts.map +0 -1
- package/dist/test/vitest.config.js +0 -8
- package/dist/test/vitest.config.js.map +0 -1
- package/dist/tools/metrics.d.ts +0 -11
- package/dist/tools/metrics.d.ts.map +0 -1
- package/dist/tools/metrics.js +0 -28
- package/dist/tools/metrics.js.map +0 -1
- package/dist/tools/open-editor.d.ts.map +0 -1
- package/dist/tools/open-editor.js.map +0 -1
- /package/dist/{dashboard → diagnostics}/spa-assets.generated.d.ts +0 -0
package/dist/config.js
CHANGED
|
@@ -87,7 +87,7 @@ export function loadConfig(env = process.env) {
|
|
|
87
87
|
cesdkLicense,
|
|
88
88
|
buildId: env.IMGLY_BUILD_ID ?? 'dev',
|
|
89
89
|
port: intEnv(env, 'PORT', 8080),
|
|
90
|
-
|
|
90
|
+
maxHttpEngines: intEnv(env, 'IMGLY_MAX_HTTP_ENGINES', 8),
|
|
91
91
|
idleTimeoutMs: intEnv(env, 'IMGLY_SESSION_IDLE_TIMEOUT', 900) * 1000,
|
|
92
92
|
logLevel: env.IMGLY_LOG_LEVEL ?? 'info',
|
|
93
93
|
workspace,
|
|
@@ -100,6 +100,17 @@ export function loadConfig(env = process.env) {
|
|
|
100
100
|
cfg.publicBaseUrl = env.IMGLY_PUBLIC_BASE_URL.replace(/\/+$/, '');
|
|
101
101
|
return cfg;
|
|
102
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Machine-wide cap on concurrently booting CE.SDK engines for the LOCAL stdio
|
|
105
|
+
* transport (CODE-59). Distinct from IMGLY_MAX_HTTP_ENGINES (per HTTP server
|
|
106
|
+
* process): different scope, different default, and different at-capacity
|
|
107
|
+
* behavior (stdio fails fast; HTTP evicts/queues). Floored at 1 so a stray 0
|
|
108
|
+
* cannot brick the server. Read here (not in loadConfig) because the stdio path
|
|
109
|
+
* never calls loadConfig.
|
|
110
|
+
*/
|
|
111
|
+
export function resolveMaxStdioEngines(env = process.env) {
|
|
112
|
+
return Math.max(1, Math.floor(intEnv(env, 'IMGLY_MAX_STDIO_ENGINES', 4)));
|
|
113
|
+
}
|
|
103
114
|
/**
|
|
104
115
|
* Local diagnostics file logging is ON by default so evidence exists before a
|
|
105
116
|
* user knows they hit a bug. Disable with IMGLY_DIAGNOSTICS_FILE=false (or 0).
|
|
@@ -107,6 +118,14 @@ export function loadConfig(env = process.env) {
|
|
|
107
118
|
export function diagnosticsFileEnabled(env = process.env) {
|
|
108
119
|
return boolEnv(env, 'IMGLY_DIAGNOSTICS_FILE', true);
|
|
109
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* The diagnostics TOOL + served viewer + prompt (CODE-62). On by default;
|
|
123
|
+
* independent of IMGLY_DIAGNOSTICS_FILE (which governs whether anything is
|
|
124
|
+
* logged). Disable with IMGLY_DIAGNOSTICS_TOOL=false (or 0).
|
|
125
|
+
*/
|
|
126
|
+
export function diagnosticsToolEnabled(env = process.env) {
|
|
127
|
+
return boolEnv(env, 'IMGLY_DIAGNOSTICS_TOOL', true);
|
|
128
|
+
}
|
|
110
129
|
/**
|
|
111
130
|
* Where diagnostics NDJSON is written. Explicit IMGLY_DIAGNOSTICS_DIR wins;
|
|
112
131
|
* otherwise <workspaceRoot>/logs, where workspaceRoot mirrors the stdio default
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/config.ts\n//\n// The IMGLY_* configuration contract (spec §9.2). One image, switched purely\n// by runtime env. Non-secret knobs are plain env vars; the four secrets\n// (license, gateway key, two S3 keys) also accept the `*_FILE` convention via\n// resolveSecret — the de-facto Docker/K8s secret standard. No secret is ever\n// logged or written; loadConfig only reads.\nimport { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join as joinPath } from 'node:path';\n\nexport type Env = Record<string, string | undefined>;\n\n/**\n * Resolve a secret: prefer `<NAME>_FILE` (trimmed file contents — secret files\n * end in a newline) and fall back to the plain `<NAME>` env var. A superset of\n * \"just env vars\": production mounts a file, local dev passes the raw value.\n */\nexport function resolveSecret(\n name: string,\n env: Env = process.env\n): string | undefined {\n const filePath = env[`${name}_FILE`];\n if (filePath) return readFileSync(filePath, 'utf8').trim();\n return env[name];\n}\n\nexport type WorkspaceMode = 'header' | 'session' | 'single';\nexport type WorkspaceBackend = 'local' | 's3';\n\nexport interface S3Config {\n bucket: string;\n endpoint?: string;\n region: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n}\n\nexport interface WorkspaceConfig {\n backend: WorkspaceBackend;\n /** local backend only */\n dir?: string;\n /** s3 backend only */\n s3?: S3Config;\n}\n\nexport interface ServerConfig {\n cesdkLicense: string;\n /**\n * Build identity, surfaced as the MCP `serverInfo.version`. Lets a client\n * (e.g. the deploy smoketest) detect a stale, not-yet-rolled-out container:\n * the deploy injects the git SHA, the smoketest asserts the running server\n * reports it. Default `'dev'` for local runs.\n */\n buildId: string;\n port: number;\n /** Max concurrent engines/sessions — the RAM cap (spec §9.2). */\n maxEngines: number;\n idleTimeoutMs: number;\n logLevel: string;\n workspace: WorkspaceConfig;\n auth: {\n mode: WorkspaceMode;\n /** header carrying the trusted workspaceId (header mode). */\n header: string;\n /** fixed workspaceId (single mode). */\n fixedWorkspaceId?: string;\n };\n gateway: { apiKey?: string; baseUrl?: string };\n viewerCorsOrigins?: string[];\n /**\n * Public origin of this deployment (e.g. the Cloudflare Worker URL),\n * no trailing slash. Used to build viewer URLs the MCP client's human can\n * actually open. Absent → loopback URLs (local dev).\n */\n publicBaseUrl?: string;\n}\n\nfunction requireEnv(env: Env, name: string): string {\n const v = env[name];\n if (!v) throw new Error(`config: ${name} is required`);\n return v;\n}\n\nfunction intEnv(env: Env, name: string, fallback: number): number {\n const raw = env[name];\n if (raw === undefined) return fallback;\n const n = Number(raw);\n if (!Number.isFinite(n)) throw new Error(`config: ${name} must be a number`);\n return n;\n}\n\nfunction boolEnv(env: Env, name: string, fallback: boolean): boolean {\n const raw = env[name];\n if (raw === undefined) return fallback;\n return raw === 'true' || raw === '1';\n}\n\nexport function loadConfig(env: Env = process.env): ServerConfig {\n const cesdkLicense = resolveSecret('IMGLY_CESDK_LICENSE', env);\n if (!cesdkLicense) throw new Error('config: IMGLY_CESDK_LICENSE is required');\n\n const mode = (env.IMGLY_WORKSPACE_MODE ?? 'header') as WorkspaceMode;\n if (mode !== 'header' && mode !== 'session' && mode !== 'single')\n throw new Error(\n `config: IMGLY_WORKSPACE_MODE must be header|session|single (got \"${mode}\")`\n );\n\n const auth: ServerConfig['auth'] = {\n mode,\n header: env.IMGLY_AUTH_WORKSPACE_HEADER ?? 'X-Workspace-Id'\n };\n if (mode === 'single') {\n auth.fixedWorkspaceId = requireEnv(env, 'IMGLY_WORKSPACE_ID');\n }\n\n const backend = (env.IMGLY_WORKSPACE_BACKEND ?? 'local') as WorkspaceBackend;\n if (backend !== 'local' && backend !== 's3')\n throw new Error(\n `config: IMGLY_WORKSPACE_BACKEND must be local|s3 (got \"${backend}\")`\n );\n\n let workspace: WorkspaceConfig;\n if (backend === 's3') {\n const s3: S3Config = {\n bucket: requireEnv(env, 'IMGLY_WORKSPACE_S3_BUCKET'),\n region: env.IMGLY_WORKSPACE_S3_REGION ?? 'auto'\n };\n if (env.IMGLY_WORKSPACE_S3_ENDPOINT)\n s3.endpoint = env.IMGLY_WORKSPACE_S3_ENDPOINT;\n // Keys are optional: absent -> AWS default credential chain (IAM role).\n const accessKeyId = resolveSecret('IMGLY_WORKSPACE_S3_ACCESS_KEY_ID', env);\n const secretAccessKey = resolveSecret(\n 'IMGLY_WORKSPACE_S3_SECRET_ACCESS_KEY',\n env\n );\n if (accessKeyId) s3.accessKeyId = accessKeyId;\n if (secretAccessKey) s3.secretAccessKey = secretAccessKey;\n workspace = { backend, s3 };\n } else {\n workspace = { backend, dir: env.IMGLY_WORKSPACE_DIR ?? '/data' };\n }\n\n const gateway: ServerConfig['gateway'] = {};\n const gatewayKey = resolveSecret('IMGLY_GATEWAY_API_KEY', env);\n if (gatewayKey) gateway.apiKey = gatewayKey;\n if (env.IMGLY_GATEWAY_BASE_URL) gateway.baseUrl = env.IMGLY_GATEWAY_BASE_URL;\n\n const cfg: ServerConfig = {\n cesdkLicense,\n buildId: env.IMGLY_BUILD_ID ?? 'dev',\n port: intEnv(env, 'PORT', 8080),\n maxEngines: intEnv(env, 'IMGLY_MAX_ENGINES', 8),\n idleTimeoutMs: intEnv(env, 'IMGLY_SESSION_IDLE_TIMEOUT', 900) * 1000,\n logLevel: env.IMGLY_LOG_LEVEL ?? 'info',\n workspace,\n auth,\n gateway\n };\n if (env.IMGLY_VIEWER_CORS_ORIGINS)\n cfg.viewerCorsOrigins = env.IMGLY_VIEWER_CORS_ORIGINS.split(',').map((s) =>\n s.trim()\n );\n if (env.IMGLY_PUBLIC_BASE_URL)\n cfg.publicBaseUrl = env.IMGLY_PUBLIC_BASE_URL.replace(/\\/+$/, '');\n return cfg;\n}\n\n/**\n * Local diagnostics file logging is ON by default so evidence exists before a\n * user knows they hit a bug. Disable with IMGLY_DIAGNOSTICS_FILE=false (or 0).\n */\nexport function diagnosticsFileEnabled(env: Env = process.env): boolean {\n return boolEnv(env, 'IMGLY_DIAGNOSTICS_FILE', true);\n}\n\n/**\n * Where diagnostics NDJSON is written. Explicit IMGLY_DIAGNOSTICS_DIR wins;\n * otherwise <workspaceRoot>/logs, where workspaceRoot mirrors the stdio default\n * ($CODESIGN_WORKSPACE ?? ~/.codesign/workspace).\n */\nexport function resolveDiagnosticsDir(env: Env = process.env): string {\n if (env.IMGLY_DIAGNOSTICS_DIR) return env.IMGLY_DIAGNOSTICS_DIR;\n const workspaceRoot =\n env.CODESIGN_WORKSPACE ?? joinPath(homedir(), '.codesign', 'workspace');\n return joinPath(workspaceRoot, 'logs');\n}\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/config.ts\n//\n// The IMGLY_* configuration contract (spec §9.2). One image, switched purely\n// by runtime env. Non-secret knobs are plain env vars; the four secrets\n// (license, gateway key, two S3 keys) also accept the `*_FILE` convention via\n// resolveSecret — the de-facto Docker/K8s secret standard. No secret is ever\n// logged or written; loadConfig only reads.\nimport { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join as joinPath } from 'node:path';\n\nexport type Env = Record<string, string | undefined>;\n\n/**\n * Resolve a secret: prefer `<NAME>_FILE` (trimmed file contents — secret files\n * end in a newline) and fall back to the plain `<NAME>` env var. A superset of\n * \"just env vars\": production mounts a file, local dev passes the raw value.\n */\nexport function resolveSecret(\n name: string,\n env: Env = process.env\n): string | undefined {\n const filePath = env[`${name}_FILE`];\n if (filePath) return readFileSync(filePath, 'utf8').trim();\n return env[name];\n}\n\nexport type WorkspaceMode = 'header' | 'session' | 'single';\nexport type WorkspaceBackend = 'local' | 's3';\n\nexport interface S3Config {\n bucket: string;\n endpoint?: string;\n region: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n}\n\nexport interface WorkspaceConfig {\n backend: WorkspaceBackend;\n /** local backend only */\n dir?: string;\n /** s3 backend only */\n s3?: S3Config;\n}\n\nexport interface ServerConfig {\n cesdkLicense: string;\n /**\n * Build identity, surfaced as the MCP `serverInfo.version`. Lets a client\n * (e.g. the deploy smoketest) detect a stale, not-yet-rolled-out container:\n * the deploy injects the git SHA, the smoketest asserts the running server\n * reports it. Default `'dev'` for local runs.\n */\n buildId: string;\n port: number;\n /** Max concurrent engines/sessions per HTTP server process — the RAM cap (spec §9.2). */\n maxHttpEngines: number;\n idleTimeoutMs: number;\n logLevel: string;\n workspace: WorkspaceConfig;\n auth: {\n mode: WorkspaceMode;\n /** header carrying the trusted workspaceId (header mode). */\n header: string;\n /** fixed workspaceId (single mode). */\n fixedWorkspaceId?: string;\n };\n gateway: { apiKey?: string; baseUrl?: string };\n viewerCorsOrigins?: string[];\n /**\n * Public origin of this deployment (e.g. the Cloudflare Worker URL),\n * no trailing slash. Used to build viewer URLs the MCP client's human can\n * actually open. Absent → loopback URLs (local dev).\n */\n publicBaseUrl?: string;\n}\n\nfunction requireEnv(env: Env, name: string): string {\n const v = env[name];\n if (!v) throw new Error(`config: ${name} is required`);\n return v;\n}\n\nfunction intEnv(env: Env, name: string, fallback: number): number {\n const raw = env[name];\n if (raw === undefined) return fallback;\n const n = Number(raw);\n if (!Number.isFinite(n)) throw new Error(`config: ${name} must be a number`);\n return n;\n}\n\nfunction boolEnv(env: Env, name: string, fallback: boolean): boolean {\n const raw = env[name];\n if (raw === undefined) return fallback;\n return raw === 'true' || raw === '1';\n}\n\nexport function loadConfig(env: Env = process.env): ServerConfig {\n const cesdkLicense = resolveSecret('IMGLY_CESDK_LICENSE', env);\n if (!cesdkLicense) throw new Error('config: IMGLY_CESDK_LICENSE is required');\n\n const mode = (env.IMGLY_WORKSPACE_MODE ?? 'header') as WorkspaceMode;\n if (mode !== 'header' && mode !== 'session' && mode !== 'single')\n throw new Error(\n `config: IMGLY_WORKSPACE_MODE must be header|session|single (got \"${mode}\")`\n );\n\n const auth: ServerConfig['auth'] = {\n mode,\n header: env.IMGLY_AUTH_WORKSPACE_HEADER ?? 'X-Workspace-Id'\n };\n if (mode === 'single') {\n auth.fixedWorkspaceId = requireEnv(env, 'IMGLY_WORKSPACE_ID');\n }\n\n const backend = (env.IMGLY_WORKSPACE_BACKEND ?? 'local') as WorkspaceBackend;\n if (backend !== 'local' && backend !== 's3')\n throw new Error(\n `config: IMGLY_WORKSPACE_BACKEND must be local|s3 (got \"${backend}\")`\n );\n\n let workspace: WorkspaceConfig;\n if (backend === 's3') {\n const s3: S3Config = {\n bucket: requireEnv(env, 'IMGLY_WORKSPACE_S3_BUCKET'),\n region: env.IMGLY_WORKSPACE_S3_REGION ?? 'auto'\n };\n if (env.IMGLY_WORKSPACE_S3_ENDPOINT)\n s3.endpoint = env.IMGLY_WORKSPACE_S3_ENDPOINT;\n // Keys are optional: absent -> AWS default credential chain (IAM role).\n const accessKeyId = resolveSecret('IMGLY_WORKSPACE_S3_ACCESS_KEY_ID', env);\n const secretAccessKey = resolveSecret(\n 'IMGLY_WORKSPACE_S3_SECRET_ACCESS_KEY',\n env\n );\n if (accessKeyId) s3.accessKeyId = accessKeyId;\n if (secretAccessKey) s3.secretAccessKey = secretAccessKey;\n workspace = { backend, s3 };\n } else {\n workspace = { backend, dir: env.IMGLY_WORKSPACE_DIR ?? '/data' };\n }\n\n const gateway: ServerConfig['gateway'] = {};\n const gatewayKey = resolveSecret('IMGLY_GATEWAY_API_KEY', env);\n if (gatewayKey) gateway.apiKey = gatewayKey;\n if (env.IMGLY_GATEWAY_BASE_URL) gateway.baseUrl = env.IMGLY_GATEWAY_BASE_URL;\n\n const cfg: ServerConfig = {\n cesdkLicense,\n buildId: env.IMGLY_BUILD_ID ?? 'dev',\n port: intEnv(env, 'PORT', 8080),\n maxHttpEngines: intEnv(env, 'IMGLY_MAX_HTTP_ENGINES', 8),\n idleTimeoutMs: intEnv(env, 'IMGLY_SESSION_IDLE_TIMEOUT', 900) * 1000,\n logLevel: env.IMGLY_LOG_LEVEL ?? 'info',\n workspace,\n auth,\n gateway\n };\n if (env.IMGLY_VIEWER_CORS_ORIGINS)\n cfg.viewerCorsOrigins = env.IMGLY_VIEWER_CORS_ORIGINS.split(',').map((s) =>\n s.trim()\n );\n if (env.IMGLY_PUBLIC_BASE_URL)\n cfg.publicBaseUrl = env.IMGLY_PUBLIC_BASE_URL.replace(/\\/+$/, '');\n return cfg;\n}\n\n/**\n * Machine-wide cap on concurrently booting CE.SDK engines for the LOCAL stdio\n * transport (CODE-59). Distinct from IMGLY_MAX_HTTP_ENGINES (per HTTP server\n * process): different scope, different default, and different at-capacity\n * behavior (stdio fails fast; HTTP evicts/queues). Floored at 1 so a stray 0\n * cannot brick the server. Read here (not in loadConfig) because the stdio path\n * never calls loadConfig.\n */\nexport function resolveMaxStdioEngines(env: Env = process.env): number {\n return Math.max(1, Math.floor(intEnv(env, 'IMGLY_MAX_STDIO_ENGINES', 4)));\n}\n\n/**\n * Local diagnostics file logging is ON by default so evidence exists before a\n * user knows they hit a bug. Disable with IMGLY_DIAGNOSTICS_FILE=false (or 0).\n */\nexport function diagnosticsFileEnabled(env: Env = process.env): boolean {\n return boolEnv(env, 'IMGLY_DIAGNOSTICS_FILE', true);\n}\n\n/**\n * The diagnostics TOOL + served viewer + prompt (CODE-62). On by default;\n * independent of IMGLY_DIAGNOSTICS_FILE (which governs whether anything is\n * logged). Disable with IMGLY_DIAGNOSTICS_TOOL=false (or 0).\n */\nexport function diagnosticsToolEnabled(env: Env = process.env): boolean {\n return boolEnv(env, 'IMGLY_DIAGNOSTICS_TOOL', true);\n}\n\n/**\n * Where diagnostics NDJSON is written. Explicit IMGLY_DIAGNOSTICS_DIR wins;\n * otherwise <workspaceRoot>/logs, where workspaceRoot mirrors the stdio default\n * ($CODESIGN_WORKSPACE ?? ~/.codesign/workspace).\n */\nexport function resolveDiagnosticsDir(env: Env = process.env): string {\n if (env.IMGLY_DIAGNOSTICS_DIR) return env.IMGLY_DIAGNOSTICS_DIR;\n const workspaceRoot =\n env.CODESIGN_WORKSPACE ?? joinPath(homedir(), '.codesign', 'workspace');\n return joinPath(workspaceRoot, 'logs');\n}\n"]}
|
|
@@ -4,7 +4,10 @@ export interface BundleFile {
|
|
|
4
4
|
bytes: Buffer;
|
|
5
5
|
}
|
|
6
6
|
export declare function collectBundleFiles(dir: string, meta: Record<string, unknown>): Promise<BundleFile[]>;
|
|
7
|
+
/** Redact each COMPLETE line; drop an incomplete trailing line (mid-write). */
|
|
8
|
+
export declare function scrubNdjson(raw: string): string;
|
|
7
9
|
export declare function buildBundleMeta(env?: Env): Record<string, unknown>;
|
|
8
10
|
export declare function runDiagnose(env?: Env): Promise<string>;
|
|
11
|
+
export declare function packStoreZip(files: BundleFile[]): Buffer;
|
|
9
12
|
export declare function writeStoreZip(files: BundleFile[], outPath: string): Promise<void>;
|
|
10
13
|
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/diagnostics/bundle.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAIxC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,UAAU,EAAE,CAAC,CAgBvB;
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/diagnostics/bundle.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAIxC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,UAAU,EAAE,CAAC,CAgBvB;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAW/C;AAED,wBAAgB,eAAe,CAC7B,GAAG,GAAE,GAAiB,GACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB;AAED,wBAAsB,WAAW,CAAC,GAAG,GAAE,GAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWzE;AAsBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CA0DxD;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -30,7 +30,7 @@ export async function collectBundleFiles(dir, meta) {
|
|
|
30
30
|
return files;
|
|
31
31
|
}
|
|
32
32
|
/** Redact each COMPLETE line; drop an incomplete trailing line (mid-write). */
|
|
33
|
-
function scrubNdjson(raw) {
|
|
33
|
+
export function scrubNdjson(raw) {
|
|
34
34
|
if (raw.length === 0)
|
|
35
35
|
return '';
|
|
36
36
|
const endsClean = raw.endsWith('\n');
|
|
@@ -91,7 +91,7 @@ function crc32(buf) {
|
|
|
91
91
|
c = CRC_TABLE[(c ^ buf[i]) & 0xff] ^ (c >>> 8);
|
|
92
92
|
return (c ^ 0xffffffff) >>> 0;
|
|
93
93
|
}
|
|
94
|
-
export
|
|
94
|
+
export function packStoreZip(files) {
|
|
95
95
|
const chunks = [];
|
|
96
96
|
const central = [];
|
|
97
97
|
let offset = 0;
|
|
@@ -100,42 +100,42 @@ export async function writeStoreZip(files, outPath) {
|
|
|
100
100
|
const crc = crc32(file.bytes);
|
|
101
101
|
const compressed = deflateRawSync(file.bytes);
|
|
102
102
|
const local = Buffer.alloc(30);
|
|
103
|
-
local.writeUInt32LE(0x04034b50, 0);
|
|
104
|
-
local.writeUInt16LE(20, 4);
|
|
105
|
-
local.writeUInt16LE(0, 6);
|
|
106
|
-
local.writeUInt16LE(8, 8);
|
|
107
|
-
local.writeUInt16LE(0, 10);
|
|
108
|
-
local.writeUInt16LE(0, 12);
|
|
103
|
+
local.writeUInt32LE(0x04034b50, 0);
|
|
104
|
+
local.writeUInt16LE(20, 4);
|
|
105
|
+
local.writeUInt16LE(0, 6);
|
|
106
|
+
local.writeUInt16LE(8, 8);
|
|
107
|
+
local.writeUInt16LE(0, 10);
|
|
108
|
+
local.writeUInt16LE(0, 12);
|
|
109
109
|
local.writeUInt32LE(crc, 14);
|
|
110
110
|
local.writeUInt32LE(compressed.length, 18);
|
|
111
111
|
local.writeUInt32LE(file.bytes.length, 22);
|
|
112
112
|
local.writeUInt16LE(nameBuf.length, 26);
|
|
113
|
-
local.writeUInt16LE(0, 28);
|
|
113
|
+
local.writeUInt16LE(0, 28);
|
|
114
114
|
chunks.push(local, nameBuf, compressed);
|
|
115
115
|
const cd = Buffer.alloc(46);
|
|
116
|
-
cd.writeUInt32LE(0x02014b50, 0);
|
|
117
|
-
cd.writeUInt16LE(20, 4);
|
|
118
|
-
cd.writeUInt16LE(20, 6);
|
|
119
|
-
cd.writeUInt16LE(0, 8);
|
|
120
|
-
cd.writeUInt16LE(8, 10);
|
|
116
|
+
cd.writeUInt32LE(0x02014b50, 0);
|
|
117
|
+
cd.writeUInt16LE(20, 4);
|
|
118
|
+
cd.writeUInt16LE(20, 6);
|
|
119
|
+
cd.writeUInt16LE(0, 8);
|
|
120
|
+
cd.writeUInt16LE(8, 10);
|
|
121
121
|
cd.writeUInt16LE(0, 12);
|
|
122
122
|
cd.writeUInt16LE(0, 14);
|
|
123
123
|
cd.writeUInt32LE(crc, 16);
|
|
124
124
|
cd.writeUInt32LE(compressed.length, 20);
|
|
125
125
|
cd.writeUInt32LE(file.bytes.length, 24);
|
|
126
126
|
cd.writeUInt16LE(nameBuf.length, 28);
|
|
127
|
-
cd.writeUInt16LE(0, 30);
|
|
128
|
-
cd.writeUInt16LE(0, 32);
|
|
129
|
-
cd.writeUInt16LE(0, 34);
|
|
130
|
-
cd.writeUInt16LE(0, 36);
|
|
131
|
-
cd.writeUInt32LE(0, 38);
|
|
132
|
-
cd.writeUInt32LE(offset, 42);
|
|
127
|
+
cd.writeUInt16LE(0, 30);
|
|
128
|
+
cd.writeUInt16LE(0, 32);
|
|
129
|
+
cd.writeUInt16LE(0, 34);
|
|
130
|
+
cd.writeUInt16LE(0, 36);
|
|
131
|
+
cd.writeUInt32LE(0, 38);
|
|
132
|
+
cd.writeUInt32LE(offset, 42);
|
|
133
133
|
central.push(cd, nameBuf);
|
|
134
134
|
offset += local.length + nameBuf.length + compressed.length;
|
|
135
135
|
}
|
|
136
136
|
const centralBuf = Buffer.concat(central);
|
|
137
137
|
const end = Buffer.alloc(22);
|
|
138
|
-
end.writeUInt32LE(0x06054b50, 0);
|
|
138
|
+
end.writeUInt32LE(0x06054b50, 0);
|
|
139
139
|
end.writeUInt16LE(0, 4);
|
|
140
140
|
end.writeUInt16LE(0, 6);
|
|
141
141
|
end.writeUInt16LE(files.length, 8);
|
|
@@ -143,6 +143,9 @@ export async function writeStoreZip(files, outPath) {
|
|
|
143
143
|
end.writeUInt32LE(centralBuf.length, 12);
|
|
144
144
|
end.writeUInt32LE(offset, 16);
|
|
145
145
|
end.writeUInt16LE(0, 20);
|
|
146
|
-
|
|
146
|
+
return Buffer.concat([...chunks, centralBuf, end]);
|
|
147
|
+
}
|
|
148
|
+
export async function writeStoreZip(files, outPath) {
|
|
149
|
+
await writeFile(outPath, packStoreZip(files));
|
|
147
150
|
}
|
|
148
151
|
//# sourceMappingURL=bundle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/diagnostics/bundle.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/diagnostics/bundle.ts\n//\n// Behind `codesign-mcp diagnose`: collect the rotated NDJSON, scrub raw text\n// (belt-and-suspenders over write-time redaction), add a non-secret meta.json,\n// and pack it all into a single zero-dependency STORE zip the user forwards.\n// No network. Works whether or not a server is running (it just reads disk;\n// the active file's incomplete trailing line is skipped).\nimport { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { arch, platform } from 'node:os';\nimport { createRequire } from 'node:module';\nimport { deflateRawSync } from 'node:zlib';\nimport type { Env } from '../config.js';\nimport { resolveDiagnosticsDir } from '../config.js';\nimport { redactText } from './redact.js';\n\nexport interface BundleFile {\n name: string;\n bytes: Buffer;\n}\n\nexport async function collectBundleFiles(\n dir: string,\n meta: Record<string, unknown>\n): Promise<BundleFile[]> {\n const names = (await readdir(dir).catch(() => [] as string[]))\n .filter((n) => /^diagnostics(\\.\\d+)?\\.ndjson$/.test(n))\n .sort();\n const files: BundleFile[] = [];\n for (const name of names) {\n const raw = await readFile(join(dir, name), 'utf8').catch(() => '');\n const scrubbed = scrubNdjson(raw);\n if (scrubbed.length > 0)\n files.push({ name, bytes: Buffer.from(scrubbed, 'utf8') });\n }\n files.push({\n name: 'meta.json',\n bytes: Buffer.from(redactText(JSON.stringify(meta, null, 2)), 'utf8')\n });\n return files;\n}\n\n/** Redact each COMPLETE line; drop an incomplete trailing line (mid-write). */\nfunction scrubNdjson(raw: string): string {\n if (raw.length === 0) return '';\n const endsClean = raw.endsWith('\\n');\n const lines = raw.split('\\n');\n if (!endsClean) lines.pop(); // partial trailing line\n return (\n lines\n .filter((l) => l.length > 0)\n .map((l) => redactText(l))\n .join('\\n') + '\\n'\n );\n}\n\nexport function buildBundleMeta(\n env: Env = process.env\n): Record<string, unknown> {\n const require = createRequire(import.meta.url);\n let cesdkVersion = 'unknown';\n try {\n cesdkVersion = (\n require('@cesdk/engine/package.json') as { version: string }\n ).version;\n } catch {\n // engine package layout may not expose package.json; leave 'unknown'\n }\n return {\n buildId: env.IMGLY_BUILD_ID ?? 'dev',\n os: platform(),\n arch: arch(),\n node: process.version,\n cesdkEngine: cesdkVersion,\n diagnosticsDir: resolveDiagnosticsDir(env)\n };\n}\n\nexport async function runDiagnose(env: Env = process.env): Promise<string> {\n const dir = resolveDiagnosticsDir(env);\n // Ensure the dir exists — on a fresh install there may be no logs yet but the\n // user still expects a zip (it will contain only meta.json).\n await mkdir(dir, { recursive: true });\n const files = await collectBundleFiles(dir, buildBundleMeta(env));\n // Timestamp is injected by the caller of Date.now at runtime — fine in product code.\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n const outPath = join(dir, `diagnostics-${stamp}.zip`);\n await writeStoreZip(files, outPath);\n return outPath;\n}\n\n// --- Minimal ZIP writer (deflate, zero deps) ---------------------------------\n// One local-file-header + data per entry, then a central directory. Enough for\n// any unzip tool to open; we deflate with node:zlib to keep bundles small.\nconst CRC_TABLE = (() => {\n const t = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n t[n] = c >>> 0;\n }\n return t;\n})();\n\nfunction crc32(buf: Buffer): number {\n let c = 0xffffffff;\n for (let i = 0; i < buf.length; i++)\n c = CRC_TABLE[(c ^ buf[i]) & 0xff] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n}\n\nexport async function writeStoreZip(\n files: BundleFile[],\n outPath: string\n): Promise<void> {\n const chunks: Buffer[] = [];\n const central: Buffer[] = [];\n let offset = 0;\n\n for (const file of files) {\n const nameBuf = Buffer.from(file.name, 'utf8');\n const crc = crc32(file.bytes);\n const compressed = deflateRawSync(file.bytes);\n const local = Buffer.alloc(30);\n local.writeUInt32LE(0x04034b50, 0); // local file header signature\n local.writeUInt16LE(20, 4); // version needed\n local.writeUInt16LE(0, 6); // flags\n local.writeUInt16LE(8, 8); // method: deflate\n local.writeUInt16LE(0, 10); // mod time\n local.writeUInt16LE(0, 12); // mod date\n local.writeUInt32LE(crc, 14);\n local.writeUInt32LE(compressed.length, 18);\n local.writeUInt32LE(file.bytes.length, 22);\n local.writeUInt16LE(nameBuf.length, 26);\n local.writeUInt16LE(0, 28); // extra len\n chunks.push(local, nameBuf, compressed);\n\n const cd = Buffer.alloc(46);\n cd.writeUInt32LE(0x02014b50, 0); // central dir header signature\n cd.writeUInt16LE(20, 4); // version made by\n cd.writeUInt16LE(20, 6); // version needed\n cd.writeUInt16LE(0, 8); // flags\n cd.writeUInt16LE(8, 10); // method\n cd.writeUInt16LE(0, 12);\n cd.writeUInt16LE(0, 14);\n cd.writeUInt32LE(crc, 16);\n cd.writeUInt32LE(compressed.length, 20);\n cd.writeUInt32LE(file.bytes.length, 24);\n cd.writeUInt16LE(nameBuf.length, 28);\n cd.writeUInt16LE(0, 30); // extra\n cd.writeUInt16LE(0, 32); // comment\n cd.writeUInt16LE(0, 34); // disk #\n cd.writeUInt16LE(0, 36); // internal attrs\n cd.writeUInt32LE(0, 38); // external attrs\n cd.writeUInt32LE(offset, 42); // local header offset\n central.push(cd, nameBuf);\n\n offset += local.length + nameBuf.length + compressed.length;\n }\n\n const centralBuf = Buffer.concat(central);\n const end = Buffer.alloc(22);\n end.writeUInt32LE(0x06054b50, 0); // end of central dir signature\n end.writeUInt16LE(0, 4);\n end.writeUInt16LE(0, 6);\n end.writeUInt16LE(files.length, 8);\n end.writeUInt16LE(files.length, 10);\n end.writeUInt32LE(centralBuf.length, 12);\n end.writeUInt32LE(offset, 16);\n end.writeUInt16LE(0, 20);\n\n await writeFile(outPath, Buffer.concat([...chunks, centralBuf, end]));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/diagnostics/bundle.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/diagnostics/bundle.ts\n//\n// Behind `codesign-mcp diagnose`: collect the rotated NDJSON, scrub raw text\n// (belt-and-suspenders over write-time redaction), add a non-secret meta.json,\n// and pack it all into a single zero-dependency STORE zip the user forwards.\n// No network. Works whether or not a server is running (it just reads disk;\n// the active file's incomplete trailing line is skipped).\nimport { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { arch, platform } from 'node:os';\nimport { createRequire } from 'node:module';\nimport { deflateRawSync } from 'node:zlib';\nimport type { Env } from '../config.js';\nimport { resolveDiagnosticsDir } from '../config.js';\nimport { redactText } from './redact.js';\n\nexport interface BundleFile {\n name: string;\n bytes: Buffer;\n}\n\nexport async function collectBundleFiles(\n dir: string,\n meta: Record<string, unknown>\n): Promise<BundleFile[]> {\n const names = (await readdir(dir).catch(() => [] as string[]))\n .filter((n) => /^diagnostics(\\.\\d+)?\\.ndjson$/.test(n))\n .sort();\n const files: BundleFile[] = [];\n for (const name of names) {\n const raw = await readFile(join(dir, name), 'utf8').catch(() => '');\n const scrubbed = scrubNdjson(raw);\n if (scrubbed.length > 0)\n files.push({ name, bytes: Buffer.from(scrubbed, 'utf8') });\n }\n files.push({\n name: 'meta.json',\n bytes: Buffer.from(redactText(JSON.stringify(meta, null, 2)), 'utf8')\n });\n return files;\n}\n\n/** Redact each COMPLETE line; drop an incomplete trailing line (mid-write). */\nexport function scrubNdjson(raw: string): string {\n if (raw.length === 0) return '';\n const endsClean = raw.endsWith('\\n');\n const lines = raw.split('\\n');\n if (!endsClean) lines.pop(); // partial trailing line\n return (\n lines\n .filter((l) => l.length > 0)\n .map((l) => redactText(l))\n .join('\\n') + '\\n'\n );\n}\n\nexport function buildBundleMeta(\n env: Env = process.env\n): Record<string, unknown> {\n const require = createRequire(import.meta.url);\n let cesdkVersion = 'unknown';\n try {\n cesdkVersion = (\n require('@cesdk/engine/package.json') as { version: string }\n ).version;\n } catch {\n // engine package layout may not expose package.json; leave 'unknown'\n }\n return {\n buildId: env.IMGLY_BUILD_ID ?? 'dev',\n os: platform(),\n arch: arch(),\n node: process.version,\n cesdkEngine: cesdkVersion,\n diagnosticsDir: resolveDiagnosticsDir(env)\n };\n}\n\nexport async function runDiagnose(env: Env = process.env): Promise<string> {\n const dir = resolveDiagnosticsDir(env);\n // Ensure the dir exists — on a fresh install there may be no logs yet but the\n // user still expects a zip (it will contain only meta.json).\n await mkdir(dir, { recursive: true });\n const files = await collectBundleFiles(dir, buildBundleMeta(env));\n // Timestamp is injected by the caller of Date.now at runtime — fine in product code.\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n const outPath = join(dir, `diagnostics-${stamp}.zip`);\n await writeStoreZip(files, outPath);\n return outPath;\n}\n\n// --- Minimal ZIP writer (deflate, zero deps) ---------------------------------\n// One local-file-header + data per entry, then a central directory. Enough for\n// any unzip tool to open; we deflate with node:zlib to keep bundles small.\nconst CRC_TABLE = (() => {\n const t = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n t[n] = c >>> 0;\n }\n return t;\n})();\n\nfunction crc32(buf: Buffer): number {\n let c = 0xffffffff;\n for (let i = 0; i < buf.length; i++)\n c = CRC_TABLE[(c ^ buf[i]) & 0xff] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n}\n\nexport function packStoreZip(files: BundleFile[]): Buffer {\n const chunks: Buffer[] = [];\n const central: Buffer[] = [];\n let offset = 0;\n\n for (const file of files) {\n const nameBuf = Buffer.from(file.name, 'utf8');\n const crc = crc32(file.bytes);\n const compressed = deflateRawSync(file.bytes);\n const local = Buffer.alloc(30);\n local.writeUInt32LE(0x04034b50, 0);\n local.writeUInt16LE(20, 4);\n local.writeUInt16LE(0, 6);\n local.writeUInt16LE(8, 8);\n local.writeUInt16LE(0, 10);\n local.writeUInt16LE(0, 12);\n local.writeUInt32LE(crc, 14);\n local.writeUInt32LE(compressed.length, 18);\n local.writeUInt32LE(file.bytes.length, 22);\n local.writeUInt16LE(nameBuf.length, 26);\n local.writeUInt16LE(0, 28);\n chunks.push(local, nameBuf, compressed);\n\n const cd = Buffer.alloc(46);\n cd.writeUInt32LE(0x02014b50, 0);\n cd.writeUInt16LE(20, 4);\n cd.writeUInt16LE(20, 6);\n cd.writeUInt16LE(0, 8);\n cd.writeUInt16LE(8, 10);\n cd.writeUInt16LE(0, 12);\n cd.writeUInt16LE(0, 14);\n cd.writeUInt32LE(crc, 16);\n cd.writeUInt32LE(compressed.length, 20);\n cd.writeUInt32LE(file.bytes.length, 24);\n cd.writeUInt16LE(nameBuf.length, 28);\n cd.writeUInt16LE(0, 30);\n cd.writeUInt16LE(0, 32);\n cd.writeUInt16LE(0, 34);\n cd.writeUInt16LE(0, 36);\n cd.writeUInt32LE(0, 38);\n cd.writeUInt32LE(offset, 42);\n central.push(cd, nameBuf);\n\n offset += local.length + nameBuf.length + compressed.length;\n }\n\n const centralBuf = Buffer.concat(central);\n const end = Buffer.alloc(22);\n end.writeUInt32LE(0x06054b50, 0);\n end.writeUInt16LE(0, 4);\n end.writeUInt16LE(0, 6);\n end.writeUInt16LE(files.length, 8);\n end.writeUInt16LE(files.length, 10);\n end.writeUInt32LE(centralBuf.length, 12);\n end.writeUInt32LE(offset, 16);\n end.writeUInt16LE(0, 20);\n\n return Buffer.concat([...chunks, centralBuf, end]);\n}\n\nexport async function writeStoreZip(\n files: BundleFile[],\n outPath: string\n): Promise<void> {\n await writeFile(outPath, packStoreZip(files));\n}\n"]}
|
|
@@ -28,6 +28,12 @@ export type DiagnosticEvent = {
|
|
|
28
28
|
};
|
|
29
29
|
export interface DiagnosticsSink {
|
|
30
30
|
emit(event: DiagnosticEvent): void;
|
|
31
|
+
/**
|
|
32
|
+
* Await all queued writes. Optional — a sink may write synchronously or drop
|
|
33
|
+
* events. Call before `process.exit` so a fire-and-forget sink doesn't lose
|
|
34
|
+
* the last events (e.g. the shutdown breadcrumb).
|
|
35
|
+
*/
|
|
36
|
+
flush?(): Promise<void>;
|
|
31
37
|
}
|
|
32
38
|
/** The off-switch: a sink that accepts and discards every event. */
|
|
33
39
|
export declare const NOOP_DIAGNOSTICS_SINK: DiagnosticsSink;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/diagnostics/events.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,eAAe,GACvB;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAC7D,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAEN,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/diagnostics/events.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,eAAe,GACvB;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAC7D,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAEN,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC;;;;OAIG;IACH,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,oEAAoE;AACpE,eAAO,MAAM,qBAAqB,EAAE,eAA+B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/diagnostics/events.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/diagnostics/events.ts"],"names":[],"mappings":"AAiDA,oEAAoE;AACpE,MAAM,CAAC,MAAM,qBAAqB,GAAoB,EAAE,IAAI,KAAI,CAAC,EAAE,CAAC","sourcesContent":["// packages/codesign-mcp/src/diagnostics/events.ts\n//\n// The single transport shape for the diagnostics stream. Every diagnostic datum\n// — tool call, engine console line, lifecycle breadcrumb — is one DiagnosticEvent,\n// one NDJSON line. Sinks (file today; OTel/in-memory later) consume this union.\nimport type { Span } from '../tools/spans.js';\n\nexport interface ErrorInfo {\n message: string;\n stack?: string;\n}\n\nexport type DiagnosticEvent =\n | {\n kind: 'tool_call';\n timestamp: number;\n tool: string;\n succeeded: boolean;\n totalMs: number;\n spans: Span[];\n error?: ErrorInfo;\n args?: unknown;\n result?: unknown;\n revision?: string;\n session?: string;\n }\n | {\n kind: 'engine_log';\n timestamp: number;\n level: 'log' | 'info' | 'warn' | 'error' | 'debug' | 'trace';\n text: string;\n }\n | {\n kind: 'lifecycle';\n timestamp: number;\n text: string;\n error?: ErrorInfo;\n };\n\nexport interface DiagnosticsSink {\n emit(event: DiagnosticEvent): void;\n /**\n * Await all queued writes. Optional — a sink may write synchronously or drop\n * events. Call before `process.exit` so a fire-and-forget sink doesn't lose\n * the last events (e.g. the shutdown breadcrumb).\n */\n flush?(): Promise<void>;\n}\n\n/** The off-switch: a sink that accepts and discards every event. */\nexport const NOOP_DIAGNOSTICS_SINK: DiagnosticsSink = { emit() {} };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/diagnostics/prompt.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAElE,wBAAgB,uBAAuB,IAAI,6BAA6B,CAqBvE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function createDiagnosticsPrompt() {
|
|
2
|
+
return {
|
|
3
|
+
name: 'diagnostics',
|
|
4
|
+
description: 'Show what this codesign MCP server is running and open the local diagnostics viewer.',
|
|
5
|
+
get: () => ({
|
|
6
|
+
description: 'Report versions and open the diagnostics viewer.',
|
|
7
|
+
messages: [
|
|
8
|
+
{
|
|
9
|
+
role: 'user',
|
|
10
|
+
content: {
|
|
11
|
+
type: 'text',
|
|
12
|
+
text: 'Call the `diagnostics` tool with action "status" and report the MCP build id and CE.SDK engine version. ' +
|
|
13
|
+
'Then call `diagnostics` with action "open" and give me the clickable viewer URL — it has a Download-ZIP button ' +
|
|
14
|
+
'to send diagnostics to IMG.LY.'
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
})
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/diagnostics/prompt.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,sFAAsF;QACxF,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACV,WAAW,EAAE,kDAAkD;YAC/D,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EACF,0GAA0G;4BAC1G,iHAAiH;4BACjH,gCAAgC;qBACnC;iBACF;aACF;SACF,CAAC;KACH,CAAC;AACJ,CAAC","sourcesContent":["// packages/codesign-mcp/src/diagnostics/prompt.ts\n//\n// The /codesign-diagnostics slash command (CODE-62). One MCP prompt that tells\n// the agent to self-report versions and hand the human the local viewer link.\n// stdio-only (its payload is \"open the viewer\", which is loopback-local).\nimport type { CodesignMcpPromptRegistration } from '../server.js';\n\nexport function createDiagnosticsPrompt(): CodesignMcpPromptRegistration {\n return {\n name: 'diagnostics',\n description:\n 'Show what this codesign MCP server is running and open the local diagnostics viewer.',\n get: () => ({\n description: 'Report versions and open the diagnostics viewer.',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text:\n 'Call the `diagnostics` tool with action \"status\" and report the MCP build id and CE.SDK engine version. ' +\n 'Then call `diagnostics` with action \"open\" and give me the clickable viewer URL — it has a Download-ZIP button ' +\n 'to send diagnostics to IMG.LY.'\n }\n }\n ]\n })\n };\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import type { Env } from '../config.js';
|
|
3
|
+
import type { DiagnosticsSink } from './events.js';
|
|
4
|
+
export interface CreateDiagnosticsRouterOptions {
|
|
5
|
+
/** The active diagnostics sink — only flush() is used, before reads. */
|
|
6
|
+
diag: DiagnosticsSink;
|
|
7
|
+
/** Diagnostics dir (always resolved; may contain no files yet). */
|
|
8
|
+
dir: string;
|
|
9
|
+
env: Env;
|
|
10
|
+
}
|
|
11
|
+
export declare function createDiagnosticsRouter(opts: CreateDiagnosticsRouterOptions): Router;
|
|
12
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/diagnostics/router.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,MAAM,EACP,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AASnD,MAAM,WAAW,8BAA8B;IAC7C,wEAAwE;IACxE,IAAI,EAAE,eAAe,CAAC;IACtB,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,GAAG,CAAC;CACV;AAID,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,8BAA8B,GACnC,MAAM,CAyDR"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// packages/codesign-mcp/src/diagnostics/router.ts
|
|
2
|
+
//
|
|
3
|
+
// Loopback-only routes for the served diagnostics viewer (CODE-62). Mounted on
|
|
4
|
+
// the SAME ephemeral 127.0.0.1 listener as the design viewer (stdio only). Reads
|
|
5
|
+
// the redacted on-disk stream; flushes the sink before every read so the newest
|
|
6
|
+
// events are visible. Never mounted on the hosted HTTP transport.
|
|
7
|
+
import { Router } from 'express';
|
|
8
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { buildBundleMeta, collectBundleFiles, packStoreZip, scrubNdjson } from './bundle.js';
|
|
11
|
+
import { SPA_ASSETS } from './spa-assets.generated.js';
|
|
12
|
+
const NDJSON_RE = /^diagnostics(\.\d+)?\.ndjson$/;
|
|
13
|
+
export function createDiagnosticsRouter(opts) {
|
|
14
|
+
const { diag, dir, env } = opts;
|
|
15
|
+
const router = Router();
|
|
16
|
+
router.get('/diagnostics', (_req, res) => {
|
|
17
|
+
// Root-absolute endpoints: on the stdio listener this router is mounted at
|
|
18
|
+
// root, so `/diagnostics/...` resolves correctly.
|
|
19
|
+
const inject = `window.__DIAGNOSTICS_STREAM__=${JSON.stringify('/diagnostics/stream.ndjson')};` +
|
|
20
|
+
`window.__DIAGNOSTICS_BUNDLE__=${JSON.stringify('/diagnostics/bundle.zip')};`;
|
|
21
|
+
const html = SPA_ASSETS['index.html'].replace('/*__DIAGNOSTICS_INJECT__*/', inject);
|
|
22
|
+
res.type('html').send(html);
|
|
23
|
+
});
|
|
24
|
+
router.get('/diagnostics/stream.ndjson', async (_req, res, next) => {
|
|
25
|
+
try {
|
|
26
|
+
await diag.flush?.();
|
|
27
|
+
const names = (await readdir(dir).catch(() => []))
|
|
28
|
+
.filter((n) => NDJSON_RE.test(n))
|
|
29
|
+
.sort();
|
|
30
|
+
let out = '';
|
|
31
|
+
for (const name of names) {
|
|
32
|
+
const raw = await readFile(join(dir, name), 'utf8').catch(() => '');
|
|
33
|
+
if (raw.length > 0)
|
|
34
|
+
out += scrubNdjson(raw);
|
|
35
|
+
}
|
|
36
|
+
res.type('application/x-ndjson').send(out);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
next(err);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
router.get('/diagnostics/bundle.zip', async (_req, res, next) => {
|
|
43
|
+
try {
|
|
44
|
+
await diag.flush?.();
|
|
45
|
+
const files = await collectBundleFiles(dir, buildBundleMeta(env));
|
|
46
|
+
res
|
|
47
|
+
.type('application/zip')
|
|
48
|
+
.set('Content-Disposition', 'attachment; filename="diagnostics.zip"')
|
|
49
|
+
.send(packStoreZip(files));
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
next(err);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// Sanitising error handler — fs error messages carry absolute paths. MUST be
|
|
56
|
+
// last and take all four args.
|
|
57
|
+
router.use((_err, _req, res, _next) => {
|
|
58
|
+
if (res.headersSent)
|
|
59
|
+
return;
|
|
60
|
+
res.status(500).type('text').send('internal error');
|
|
61
|
+
});
|
|
62
|
+
return router;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/diagnostics/router.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/diagnostics/router.ts\n//\n// Loopback-only routes for the served diagnostics viewer (CODE-62). Mounted on\n// the SAME ephemeral 127.0.0.1 listener as the design viewer (stdio only). Reads\n// the redacted on-disk stream; flushes the sink before every read so the newest\n// events are visible. Never mounted on the hosted HTTP transport.\nimport {\n type NextFunction,\n type Request,\n type Response,\n Router\n} from 'express';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Env } from '../config.js';\nimport type { DiagnosticsSink } from './events.js';\nimport {\n buildBundleMeta,\n collectBundleFiles,\n packStoreZip,\n scrubNdjson\n} from './bundle.js';\nimport { SPA_ASSETS } from './spa-assets.generated.js';\n\nexport interface CreateDiagnosticsRouterOptions {\n /** The active diagnostics sink — only flush() is used, before reads. */\n diag: DiagnosticsSink;\n /** Diagnostics dir (always resolved; may contain no files yet). */\n dir: string;\n env: Env;\n}\n\nconst NDJSON_RE = /^diagnostics(\\.\\d+)?\\.ndjson$/;\n\nexport function createDiagnosticsRouter(\n opts: CreateDiagnosticsRouterOptions\n): Router {\n const { diag, dir, env } = opts;\n const router = Router();\n\n router.get('/diagnostics', (_req, res) => {\n // Root-absolute endpoints: on the stdio listener this router is mounted at\n // root, so `/diagnostics/...` resolves correctly.\n const inject =\n `window.__DIAGNOSTICS_STREAM__=${JSON.stringify('/diagnostics/stream.ndjson')};` +\n `window.__DIAGNOSTICS_BUNDLE__=${JSON.stringify('/diagnostics/bundle.zip')};`;\n const html = SPA_ASSETS['index.html'].replace(\n '/*__DIAGNOSTICS_INJECT__*/',\n inject\n );\n res.type('html').send(html);\n });\n\n router.get('/diagnostics/stream.ndjson', async (_req, res, next) => {\n try {\n await diag.flush?.();\n const names = (await readdir(dir).catch(() => [] as string[]))\n .filter((n) => NDJSON_RE.test(n))\n .sort();\n let out = '';\n for (const name of names) {\n const raw = await readFile(join(dir, name), 'utf8').catch(() => '');\n if (raw.length > 0) out += scrubNdjson(raw);\n }\n res.type('application/x-ndjson').send(out);\n } catch (err) {\n next(err);\n }\n });\n\n router.get('/diagnostics/bundle.zip', async (_req, res, next) => {\n try {\n await diag.flush?.();\n const files = await collectBundleFiles(dir, buildBundleMeta(env));\n res\n .type('application/zip')\n .set('Content-Disposition', 'attachment; filename=\"diagnostics.zip\"')\n .send(packStoreZip(files));\n } catch (err) {\n next(err);\n }\n });\n\n // Sanitising error handler — fs error messages carry absolute paths. MUST be\n // last and take all four args.\n router.use(\n (_err: unknown, _req: Request, res: Response, _next: NextFunction) => {\n if (res.headersSent) return;\n res.status(500).type('text').send('internal error');\n }\n );\n\n return router;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spa-assets.generated.d.ts","sourceRoot":"","sources":["../../src/diagnostics/spa-assets.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA4sC7C,CAAC"}
|