@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
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
-
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
|
|
3
|
-
import { describe, expect, it } from 'vitest';
|
|
4
|
-
import { createCodesignMcpServer } from '../src/server.js';
|
|
5
|
-
const FIXTURES = {
|
|
6
|
-
'docs/alpha/SKILL.md': '---\nname: alpha\ndescription: First skill.\n---\n# Alpha\nSee [more](more.md).',
|
|
7
|
-
'docs/alpha/more.md': '---\nname: more\ndescription: details\n---\nMore details.'
|
|
8
|
-
};
|
|
9
|
-
async function connect(assets = FIXTURES, extra = {}) {
|
|
10
|
-
const server = createCodesignMcpServer({ assets, ...extra });
|
|
11
|
-
const [clientT, serverT] = InMemoryTransport.createLinkedPair();
|
|
12
|
-
await server.connect(serverT);
|
|
13
|
-
const client = new Client({ name: 'test', version: '0' });
|
|
14
|
-
await client.connect(clientT);
|
|
15
|
-
return { client, server };
|
|
16
|
-
}
|
|
17
|
-
describe('createCodesignMcpServer (initialize + resources)', () => {
|
|
18
|
-
it('reports buildId as serverInfo.version (defaulting to "dev")', async () => {
|
|
19
|
-
const def = await connect();
|
|
20
|
-
expect(def.client.getServerVersion()?.version).toBe('dev');
|
|
21
|
-
// The deploy injects a git SHA; the smoketest asserts it to detect a
|
|
22
|
-
// stale, not-yet-rolled-out container.
|
|
23
|
-
const stamped = await connect(FIXTURES, { buildId: 'abc1234' });
|
|
24
|
-
expect(stamped.client.getServerVersion()?.version).toBe('abc1234');
|
|
25
|
-
});
|
|
26
|
-
it('instructions advertise the codesign tools + force-direct the model to read codesign-system first', async () => {
|
|
27
|
-
const { client } = await connect();
|
|
28
|
-
const instructions = client.getInstructions() ?? '';
|
|
29
|
-
// Short pointer-style instructions (no inlined SYSTEM body)
|
|
30
|
-
expect(instructions).toContain('This is the **codesign** MCP server');
|
|
31
|
-
expect(instructions).toContain('edit');
|
|
32
|
-
expect(instructions).toContain('preview');
|
|
33
|
-
expect(instructions).toContain('export');
|
|
34
|
-
expect(instructions).toContain('list');
|
|
35
|
-
expect(instructions).toContain('history');
|
|
36
|
-
expect(instructions).toContain('inspect');
|
|
37
|
-
expect(instructions).toContain('rename');
|
|
38
|
-
expect(instructions).toContain('open_editor');
|
|
39
|
-
// asset_generate is opt-in: with no tools registered (no gateway), the
|
|
40
|
-
// hint is omitted so we never advertise a hidden tool.
|
|
41
|
-
expect(instructions).not.toContain('asset_generate');
|
|
42
|
-
expect(instructions).toContain('parent');
|
|
43
|
-
// Hard direction: read handbook before any design call.
|
|
44
|
-
expect(instructions).toContain('handbook');
|
|
45
|
-
expect(instructions).toMatch(/[Bb]efore.*edit/);
|
|
46
|
-
// No more <codesign_skills> XML — discovery now happens via tools/list.
|
|
47
|
-
expect(instructions).not.toContain('<codesign_skills>');
|
|
48
|
-
// Cap on size — keep instructions short enough to survive Claude Code
|
|
49
|
-
// truncation (target: well under 4 KB).
|
|
50
|
-
expect(instructions.length).toBeLessThan(4096);
|
|
51
|
-
});
|
|
52
|
-
it('includes the asset-generation hint only when an asset_generate tool is registered', async () => {
|
|
53
|
-
const server = createCodesignMcpServer({
|
|
54
|
-
assets: FIXTURES,
|
|
55
|
-
tools: [
|
|
56
|
-
{
|
|
57
|
-
name: 'asset_generate',
|
|
58
|
-
description: 'gen',
|
|
59
|
-
inputSchema: { type: 'object', properties: {} },
|
|
60
|
-
call: async () => ({ content: [] })
|
|
61
|
-
}
|
|
62
|
-
]
|
|
63
|
-
});
|
|
64
|
-
const [clientT, serverT] = InMemoryTransport.createLinkedPair();
|
|
65
|
-
await server.connect(serverT);
|
|
66
|
-
const client = new Client({ name: 'test', version: '0' });
|
|
67
|
-
await client.connect(clientT);
|
|
68
|
-
const instructions = client.getInstructions() ?? '';
|
|
69
|
-
expect(instructions).toContain('Asset generation');
|
|
70
|
-
expect(instructions).toContain('asset_generate');
|
|
71
|
-
});
|
|
72
|
-
it('resources/list returns SKILL.md entry points (sub-files reachable via the read tools)', async () => {
|
|
73
|
-
const { client } = await connect();
|
|
74
|
-
const list = await client.listResources();
|
|
75
|
-
const uris = list.resources.map((r) => r.uri).sort();
|
|
76
|
-
// Only the SKILL.md is advertised — the nested `more.md` is reachable
|
|
77
|
-
// via `resources/read` or via codesign_read_alpha but not enumerated.
|
|
78
|
-
expect(uris).toEqual(['codesign://docs/alpha/SKILL.md']);
|
|
79
|
-
});
|
|
80
|
-
it('returns rewritten cross-refs in resource content', async () => {
|
|
81
|
-
const { client } = await connect();
|
|
82
|
-
const got = await client.readResource({
|
|
83
|
-
uri: 'codesign://docs/alpha/SKILL.md'
|
|
84
|
-
});
|
|
85
|
-
const text = got.contents[0].text;
|
|
86
|
-
expect(text).toContain('[more](codesign://docs/alpha/more.md)');
|
|
87
|
-
expect(text).toContain('# Alpha');
|
|
88
|
-
});
|
|
89
|
-
it('rejects unknown resource URIs with InvalidParams', async () => {
|
|
90
|
-
const { client } = await connect();
|
|
91
|
-
await expect(client.readResource({ uri: 'codesign://docs/missing/file.md' })).rejects.toMatchObject({
|
|
92
|
-
code: -32602
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
describe('createCodesignMcpServer (tools)', () => {
|
|
97
|
-
async function setup() {
|
|
98
|
-
const calls = [];
|
|
99
|
-
const { Client } = await import('@modelcontextprotocol/sdk/client/index.js');
|
|
100
|
-
const { InMemoryTransport } = await import('@modelcontextprotocol/sdk/inMemory.js');
|
|
101
|
-
const server = createCodesignMcpServer({
|
|
102
|
-
assets: { 'agent/SYSTEM.md': 'sys' },
|
|
103
|
-
tools: [
|
|
104
|
-
{
|
|
105
|
-
name: 'echo',
|
|
106
|
-
description: 'Echo arg back as text',
|
|
107
|
-
inputSchema: {
|
|
108
|
-
type: 'object',
|
|
109
|
-
properties: { msg: { type: 'string' } },
|
|
110
|
-
required: ['msg']
|
|
111
|
-
},
|
|
112
|
-
call: async (args) => {
|
|
113
|
-
calls.push({ name: 'echo', args });
|
|
114
|
-
const msg = args.msg;
|
|
115
|
-
return { content: [{ type: 'text', text: msg }] };
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
]
|
|
119
|
-
});
|
|
120
|
-
const [clientT, serverT] = InMemoryTransport.createLinkedPair();
|
|
121
|
-
await server.connect(serverT);
|
|
122
|
-
const client = new Client({ name: 'test', version: '0' });
|
|
123
|
-
await client.connect(clientT);
|
|
124
|
-
return { client, calls };
|
|
125
|
-
}
|
|
126
|
-
it('lists tools with their schemas', async () => {
|
|
127
|
-
const { client } = await setup();
|
|
128
|
-
const list = await client.listTools();
|
|
129
|
-
expect(list.tools.map((t) => t.name)).toEqual(['echo']);
|
|
130
|
-
expect(list.tools[0].description).toBe('Echo arg back as text');
|
|
131
|
-
});
|
|
132
|
-
it('forwards arguments to call() and returns content', async () => {
|
|
133
|
-
const { client, calls } = await setup();
|
|
134
|
-
const result = await client.callTool({
|
|
135
|
-
name: 'echo',
|
|
136
|
-
arguments: { msg: 'hi' }
|
|
137
|
-
});
|
|
138
|
-
expect(calls).toEqual([{ name: 'echo', args: { msg: 'hi' } }]);
|
|
139
|
-
expect(result.content).toEqual([{ type: 'text', text: 'hi' }]);
|
|
140
|
-
});
|
|
141
|
-
it('rejects unknown tool name', async () => {
|
|
142
|
-
const { client } = await setup();
|
|
143
|
-
await expect(client.callTool({ name: 'nope', arguments: {} })).rejects.toMatchObject({ code: -32602 });
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
//# sourceMappingURL=server.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../../test/server.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';\nimport { describe, expect, it } from 'vitest';\nimport { createCodesignMcpServer } from '../src/server.js';\n\nconst FIXTURES = {\n 'docs/alpha/SKILL.md':\n '---\\nname: alpha\\ndescription: First skill.\\n---\\n# Alpha\\nSee [more](more.md).',\n 'docs/alpha/more.md':\n '---\\nname: more\\ndescription: details\\n---\\nMore details.'\n};\n\nasync function connect(\n assets: Record<string, string> = FIXTURES,\n extra: { buildId?: string } = {}\n) {\n const server = createCodesignMcpServer({ assets, ...extra });\n const [clientT, serverT] = InMemoryTransport.createLinkedPair();\n await server.connect(serverT);\n const client = new Client({ name: 'test', version: '0' });\n await client.connect(clientT);\n return { client, server };\n}\n\ndescribe('createCodesignMcpServer (initialize + resources)', () => {\n it('reports buildId as serverInfo.version (defaulting to \"dev\")', async () => {\n const def = await connect();\n expect(def.client.getServerVersion()?.version).toBe('dev');\n // The deploy injects a git SHA; the smoketest asserts it to detect a\n // stale, not-yet-rolled-out container.\n const stamped = await connect(FIXTURES, { buildId: 'abc1234' });\n expect(stamped.client.getServerVersion()?.version).toBe('abc1234');\n });\n\n it('instructions advertise the codesign tools + force-direct the model to read codesign-system first', async () => {\n const { client } = await connect();\n const instructions = client.getInstructions() ?? '';\n // Short pointer-style instructions (no inlined SYSTEM body)\n expect(instructions).toContain('This is the **codesign** MCP server');\n expect(instructions).toContain('edit');\n expect(instructions).toContain('preview');\n expect(instructions).toContain('export');\n expect(instructions).toContain('list');\n expect(instructions).toContain('history');\n expect(instructions).toContain('inspect');\n expect(instructions).toContain('rename');\n expect(instructions).toContain('open_editor');\n // asset_generate is opt-in: with no tools registered (no gateway), the\n // hint is omitted so we never advertise a hidden tool.\n expect(instructions).not.toContain('asset_generate');\n expect(instructions).toContain('parent');\n // Hard direction: read handbook before any design call.\n expect(instructions).toContain('handbook');\n expect(instructions).toMatch(/[Bb]efore.*edit/);\n // No more <codesign_skills> XML — discovery now happens via tools/list.\n expect(instructions).not.toContain('<codesign_skills>');\n // Cap on size — keep instructions short enough to survive Claude Code\n // truncation (target: well under 4 KB).\n expect(instructions.length).toBeLessThan(4096);\n });\n\n it('includes the asset-generation hint only when an asset_generate tool is registered', async () => {\n const server = createCodesignMcpServer({\n assets: FIXTURES,\n tools: [\n {\n name: 'asset_generate',\n description: 'gen',\n inputSchema: { type: 'object', properties: {} },\n call: async () => ({ content: [] })\n }\n ]\n });\n const [clientT, serverT] = InMemoryTransport.createLinkedPair();\n await server.connect(serverT);\n const client = new Client({ name: 'test', version: '0' });\n await client.connect(clientT);\n const instructions = client.getInstructions() ?? '';\n expect(instructions).toContain('Asset generation');\n expect(instructions).toContain('asset_generate');\n });\n\n it('resources/list returns SKILL.md entry points (sub-files reachable via the read tools)', async () => {\n const { client } = await connect();\n const list = await client.listResources();\n const uris = list.resources.map((r) => r.uri).sort();\n // Only the SKILL.md is advertised — the nested `more.md` is reachable\n // via `resources/read` or via codesign_read_alpha but not enumerated.\n expect(uris).toEqual(['codesign://docs/alpha/SKILL.md']);\n });\n\n it('returns rewritten cross-refs in resource content', async () => {\n const { client } = await connect();\n const got = await client.readResource({\n uri: 'codesign://docs/alpha/SKILL.md'\n });\n const text = (got.contents[0] as { text?: string }).text;\n expect(text).toContain('[more](codesign://docs/alpha/more.md)');\n expect(text).toContain('# Alpha');\n });\n\n it('rejects unknown resource URIs with InvalidParams', async () => {\n const { client } = await connect();\n await expect(\n client.readResource({ uri: 'codesign://docs/missing/file.md' })\n ).rejects.toMatchObject({\n code: -32602\n });\n });\n});\n\ndescribe('createCodesignMcpServer (tools)', () => {\n async function setup() {\n const calls: { name: string; args: unknown }[] = [];\n const { Client } =\n await import('@modelcontextprotocol/sdk/client/index.js');\n const { InMemoryTransport } =\n await import('@modelcontextprotocol/sdk/inMemory.js');\n const server = createCodesignMcpServer({\n assets: { 'agent/SYSTEM.md': 'sys' },\n tools: [\n {\n name: 'echo',\n description: 'Echo arg back as text',\n inputSchema: {\n type: 'object',\n properties: { msg: { type: 'string' } },\n required: ['msg']\n },\n call: async (args) => {\n calls.push({ name: 'echo', args });\n const msg = (args as { msg: string }).msg;\n return { content: [{ type: 'text', text: msg }] };\n }\n }\n ]\n });\n const [clientT, serverT] = InMemoryTransport.createLinkedPair();\n await server.connect(serverT);\n const client = new Client({ name: 'test', version: '0' });\n await client.connect(clientT);\n return { client, calls };\n }\n\n it('lists tools with their schemas', async () => {\n const { client } = await setup();\n const list = await client.listTools();\n expect(list.tools.map((t) => t.name)).toEqual(['echo']);\n expect(list.tools[0].description).toBe('Echo arg back as text');\n });\n\n it('forwards arguments to call() and returns content', async () => {\n const { client, calls } = await setup();\n const result = await client.callTool({\n name: 'echo',\n arguments: { msg: 'hi' }\n });\n expect(calls).toEqual([{ name: 'echo', args: { msg: 'hi' } }]);\n expect(result.content).toEqual([{ type: 'text', text: 'hi' }]);\n });\n\n it('rejects unknown tool name', async () => {\n const { client } = await setup();\n await expect(\n client.callTool({ name: 'nope', arguments: {} })\n ).rejects.toMatchObject({ code: -32602 });\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-tools.test.d.ts","sourceRoot":"","sources":["../../../test/skill-tools.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { buildSkillReadTools } from '../src/skill-tools.js';
|
|
3
|
-
const ASSETS = {
|
|
4
|
-
'docs/handbook/SKILL.md': '---\nname: handbook\ndescription: Iris design loop\n---\n# 1. Soul\nbody',
|
|
5
|
-
'docs/api/SKILL.md': '---\nname: api\ndescription: TypeScript signatures\n---\n# API\nsee index.d.ts',
|
|
6
|
-
'docs/api/index.d.ts': Array.from({ length: 50 }, (_, i) => `// line ${i + 1}`).join('\n'),
|
|
7
|
-
'docs/guide/SKILL.md': '---\nname: guide\ndescription: CE.SDK reference docs\n---\n# Guide root',
|
|
8
|
-
'docs/guide/api/BlockAPI.md': '# BlockAPI\nblock-api content',
|
|
9
|
-
'docs/guide/text/custom-fonts.md': '# Custom fonts\nfont-fetching prose'
|
|
10
|
-
};
|
|
11
|
-
function findTool(tools, name) {
|
|
12
|
-
const t = tools.find((x) => x.name === name);
|
|
13
|
-
if (!t)
|
|
14
|
-
throw new Error(`tool not found: ${name}`);
|
|
15
|
-
return t;
|
|
16
|
-
}
|
|
17
|
-
describe('buildSkillReadTools (handbook / api / guide)', () => {
|
|
18
|
-
it('emits 3 tools named after the doc dirs', () => {
|
|
19
|
-
const tools = buildSkillReadTools(ASSETS);
|
|
20
|
-
expect(tools.map((t) => t.name).sort()).toEqual([
|
|
21
|
-
'api',
|
|
22
|
-
'guide',
|
|
23
|
-
'handbook'
|
|
24
|
-
]);
|
|
25
|
-
});
|
|
26
|
-
it('handbook returns the SKILL.md body', async () => {
|
|
27
|
-
const tools = buildSkillReadTools(ASSETS);
|
|
28
|
-
const tool = findTool(tools, 'handbook');
|
|
29
|
-
const result = await tool.call({});
|
|
30
|
-
const text = result.content[0].text;
|
|
31
|
-
expect(text).toContain('# 1. Soul');
|
|
32
|
-
expect(text).toContain('body');
|
|
33
|
-
});
|
|
34
|
-
it('api with no path returns SKILL.md', async () => {
|
|
35
|
-
const tools = buildSkillReadTools(ASSETS);
|
|
36
|
-
const tool = findTool(tools, 'api');
|
|
37
|
-
const result = await tool.call({});
|
|
38
|
-
const text = result.content[0].text;
|
|
39
|
-
expect(text).toContain('# API');
|
|
40
|
-
});
|
|
41
|
-
it('api with path slices a sub-file', async () => {
|
|
42
|
-
const tools = buildSkillReadTools(ASSETS);
|
|
43
|
-
const tool = findTool(tools, 'api');
|
|
44
|
-
const result = await tool.call({ path: 'index.d.ts' });
|
|
45
|
-
const text = result.content[0].text;
|
|
46
|
-
expect(text).toContain('// line 1');
|
|
47
|
-
expect(text).toContain('// line 50');
|
|
48
|
-
});
|
|
49
|
-
it('api with offset+limit returns a slice', async () => {
|
|
50
|
-
const tools = buildSkillReadTools(ASSETS);
|
|
51
|
-
const tool = findTool(tools, 'api');
|
|
52
|
-
const result = await tool.call({
|
|
53
|
-
path: 'index.d.ts',
|
|
54
|
-
offset: 10,
|
|
55
|
-
limit: 5
|
|
56
|
-
});
|
|
57
|
-
const text = result.content[0].text;
|
|
58
|
-
expect(text).toContain('// line 11');
|
|
59
|
-
expect(text).toContain('// line 15');
|
|
60
|
-
expect(text).not.toContain('// line 10\n');
|
|
61
|
-
expect(text).not.toContain('// line 16');
|
|
62
|
-
});
|
|
63
|
-
it('guide with path returns a sub-doc', async () => {
|
|
64
|
-
const tools = buildSkillReadTools(ASSETS);
|
|
65
|
-
const tool = findTool(tools, 'guide');
|
|
66
|
-
const result = await tool.call({ path: 'api/BlockAPI.md' });
|
|
67
|
-
const text = result.content[0].text;
|
|
68
|
-
expect(text).toContain('# BlockAPI');
|
|
69
|
-
});
|
|
70
|
-
it('unknown path returns isError + ENOENT-style message', async () => {
|
|
71
|
-
const tools = buildSkillReadTools(ASSETS);
|
|
72
|
-
const tool = findTool(tools, 'guide');
|
|
73
|
-
const result = await tool.call({ path: 'missing.md' });
|
|
74
|
-
expect(result.isError).toBe(true);
|
|
75
|
-
const text = result.content[0].text;
|
|
76
|
-
expect(text).toContain('missing.md');
|
|
77
|
-
expect(text.toLowerCase()).toContain('not found');
|
|
78
|
-
});
|
|
79
|
-
it('returns no tools when the doc bundle is empty', () => {
|
|
80
|
-
const tools = buildSkillReadTools({ 'docs/api/SKILL.md': 'minimal' });
|
|
81
|
-
expect(tools.map((t) => t.name).sort()).toEqual(['api']);
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
//# sourceMappingURL=skill-tools.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-tools.test.js","sourceRoot":"","sources":["../../../test/skill-tools.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest';\nimport { buildSkillReadTools } from '../src/skill-tools.js';\n\nconst ASSETS = {\n 'docs/handbook/SKILL.md':\n '---\\nname: handbook\\ndescription: Iris design loop\\n---\\n# 1. Soul\\nbody',\n 'docs/api/SKILL.md':\n '---\\nname: api\\ndescription: TypeScript signatures\\n---\\n# API\\nsee index.d.ts',\n 'docs/api/index.d.ts': Array.from(\n { length: 50 },\n (_, i) => `// line ${i + 1}`\n ).join('\\n'),\n 'docs/guide/SKILL.md':\n '---\\nname: guide\\ndescription: CE.SDK reference docs\\n---\\n# Guide root',\n 'docs/guide/api/BlockAPI.md': '# BlockAPI\\nblock-api content',\n 'docs/guide/text/custom-fonts.md': '# Custom fonts\\nfont-fetching prose'\n};\n\nfunction findTool(tools: ReturnType<typeof buildSkillReadTools>, name: string) {\n const t = tools.find((x) => x.name === name);\n if (!t) throw new Error(`tool not found: ${name}`);\n return t;\n}\n\ndescribe('buildSkillReadTools (handbook / api / guide)', () => {\n it('emits 3 tools named after the doc dirs', () => {\n const tools = buildSkillReadTools(ASSETS);\n expect(tools.map((t) => t.name).sort()).toEqual([\n 'api',\n 'guide',\n 'handbook'\n ]);\n });\n\n it('handbook returns the SKILL.md body', async () => {\n const tools = buildSkillReadTools(ASSETS);\n const tool = findTool(tools, 'handbook');\n const result = await tool.call({});\n const text = (result.content[0] as { text: string }).text;\n expect(text).toContain('# 1. Soul');\n expect(text).toContain('body');\n });\n\n it('api with no path returns SKILL.md', async () => {\n const tools = buildSkillReadTools(ASSETS);\n const tool = findTool(tools, 'api');\n const result = await tool.call({});\n const text = (result.content[0] as { text: string }).text;\n expect(text).toContain('# API');\n });\n\n it('api with path slices a sub-file', async () => {\n const tools = buildSkillReadTools(ASSETS);\n const tool = findTool(tools, 'api');\n const result = await tool.call({ path: 'index.d.ts' });\n const text = (result.content[0] as { text: string }).text;\n expect(text).toContain('// line 1');\n expect(text).toContain('// line 50');\n });\n\n it('api with offset+limit returns a slice', async () => {\n const tools = buildSkillReadTools(ASSETS);\n const tool = findTool(tools, 'api');\n const result = await tool.call({\n path: 'index.d.ts',\n offset: 10,\n limit: 5\n });\n const text = (result.content[0] as { text: string }).text;\n expect(text).toContain('// line 11');\n expect(text).toContain('// line 15');\n expect(text).not.toContain('// line 10\\n');\n expect(text).not.toContain('// line 16');\n });\n\n it('guide with path returns a sub-doc', async () => {\n const tools = buildSkillReadTools(ASSETS);\n const tool = findTool(tools, 'guide');\n const result = await tool.call({ path: 'api/BlockAPI.md' });\n const text = (result.content[0] as { text: string }).text;\n expect(text).toContain('# BlockAPI');\n });\n\n it('unknown path returns isError + ENOENT-style message', async () => {\n const tools = buildSkillReadTools(ASSETS);\n const tool = findTool(tools, 'guide');\n const result = await tool.call({ path: 'missing.md' });\n expect(result.isError).toBe(true);\n const text = (result.content[0] as { text: string }).text;\n expect(text).toContain('missing.md');\n expect(text.toLowerCase()).toContain('not found');\n });\n\n it('returns no tools when the doc bundle is empty', () => {\n const tools = buildSkillReadTools({ 'docs/api/SKILL.md': 'minimal' });\n expect(tools.map((t) => t.name).sort()).toEqual(['api']);\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"smoke.test.d.ts","sourceRoot":"","sources":["../../../test/smoke.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { createCodesignMcpServer } from '../src/index.js';
|
|
3
|
-
describe('codesign-mcp public API', () => {
|
|
4
|
-
it('exports createCodesignMcpServer', () => {
|
|
5
|
-
expect(typeof createCodesignMcpServer).toBe('function');
|
|
6
|
-
});
|
|
7
|
-
});
|
|
8
|
-
//# sourceMappingURL=smoke.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"smoke.test.js","sourceRoot":"","sources":["../../../test/smoke.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from 'vitest';\nimport { createCodesignMcpServer } from '../src/index.js';\n\ndescribe('codesign-mcp public API', () => {\n it('exports createCodesignMcpServer', () => {\n expect(typeof createCodesignMcpServer).toBe('function');\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"asset-generate.test.d.ts","sourceRoot":"","sources":["../../../../test/tools/asset-generate.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { LocalGatewayClient } from '../../src/gateway/local.js';
|
|
3
|
-
import { createAssetGenerateTool } from '../../src/tools/asset-generate.js';
|
|
4
|
-
import { LocalViewerUrlBuilder } from '../../src/viewer/url-builder.js';
|
|
5
|
-
import { InMemoryWorkspaceFS } from '../../src/workspace/in-memory.js';
|
|
6
|
-
const urlBuilder = new LocalViewerUrlBuilder({ base: 'http://127.0.0.1:9000' });
|
|
7
|
-
describe('asset_generate tool', () => {
|
|
8
|
-
it('generates an image and persists it in the workspace under assets/', async () => {
|
|
9
|
-
const fs = new InMemoryWorkspaceFS();
|
|
10
|
-
const fakeFetch = async () => new Response(new Uint8Array([1, 2, 3, 4, 5]), {
|
|
11
|
-
headers: { 'content-type': 'image/png' }
|
|
12
|
-
});
|
|
13
|
-
const client = new LocalGatewayClient({
|
|
14
|
-
apiKey: 'k',
|
|
15
|
-
endpoint: 'https://x',
|
|
16
|
-
fetch: fakeFetch
|
|
17
|
-
});
|
|
18
|
-
const tool = createAssetGenerateTool({ gateway: client, fs, urlBuilder });
|
|
19
|
-
const result = await tool.call({
|
|
20
|
-
kind: 'image',
|
|
21
|
-
prompt: 'a sunny meadow',
|
|
22
|
-
width: 512,
|
|
23
|
-
height: 512
|
|
24
|
-
});
|
|
25
|
-
expect(result.isError).toBeFalsy();
|
|
26
|
-
const body = JSON.parse(result.content[0].text);
|
|
27
|
-
expect(body.uri).toMatch(/^workspace:\/\/assets\/[0-9a-f]{12}\.png$/);
|
|
28
|
-
expect(body.mimeType).toBe('image/png');
|
|
29
|
-
// Bytes are persisted
|
|
30
|
-
const relPath = body.uri.replace('workspace://', '');
|
|
31
|
-
expect((await fs.readFile(relPath)).length).toBe(5);
|
|
32
|
-
});
|
|
33
|
-
it('returns isError when the gateway is disabled', async () => {
|
|
34
|
-
const fs = new InMemoryWorkspaceFS();
|
|
35
|
-
const client = new LocalGatewayClient({ apiKey: undefined });
|
|
36
|
-
const tool = createAssetGenerateTool({ gateway: client, fs, urlBuilder });
|
|
37
|
-
const result = await tool.call({ kind: 'image', prompt: 'x' });
|
|
38
|
-
expect(result.isError).toBe(true);
|
|
39
|
-
expect(result.content[0].text).toMatch(/disabled/i);
|
|
40
|
-
});
|
|
41
|
-
it('returns isError for non-image kinds (Phase 4 video/audio)', async () => {
|
|
42
|
-
const fs = new InMemoryWorkspaceFS();
|
|
43
|
-
const client = new LocalGatewayClient({ apiKey: 'k' });
|
|
44
|
-
const tool = createAssetGenerateTool({ gateway: client, fs, urlBuilder });
|
|
45
|
-
const result = await tool.call({ kind: 'video', prompt: 'x' });
|
|
46
|
-
expect(result.isError).toBe(true);
|
|
47
|
-
expect(result.content[0].text).toMatch(/phase 4/i);
|
|
48
|
-
});
|
|
49
|
-
it('returns an httpUrl pointing at the /r/ route', async () => {
|
|
50
|
-
const fs = new InMemoryWorkspaceFS();
|
|
51
|
-
const fakeFetch = async () => new Response(new Uint8Array([1, 2, 3, 4, 5]), {
|
|
52
|
-
headers: { 'content-type': 'image/png' }
|
|
53
|
-
});
|
|
54
|
-
const client = new LocalGatewayClient({
|
|
55
|
-
apiKey: 'k',
|
|
56
|
-
endpoint: 'https://x',
|
|
57
|
-
fetch: fakeFetch
|
|
58
|
-
});
|
|
59
|
-
const tool = createAssetGenerateTool({ gateway: client, fs, urlBuilder });
|
|
60
|
-
const result = await tool.call({ kind: 'image', prompt: 'a sunny meadow' });
|
|
61
|
-
const body = JSON.parse(result.content[0].text);
|
|
62
|
-
const relPath = body.uri.replace('workspace://', '');
|
|
63
|
-
expect(body.httpUrl).toBe(`http://127.0.0.1:9000/r/${relPath}`);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
//# sourceMappingURL=asset-generate.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"asset-generate.test.js","sourceRoot":"","sources":["../../../../test/tools/asset-generate.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest';\nimport { LocalGatewayClient } from '../../src/gateway/local.js';\nimport { createAssetGenerateTool } from '../../src/tools/asset-generate.js';\nimport { LocalViewerUrlBuilder } from '../../src/viewer/url-builder.js';\nimport { InMemoryWorkspaceFS } from '../../src/workspace/in-memory.js';\n\nconst urlBuilder = new LocalViewerUrlBuilder({ base: 'http://127.0.0.1:9000' });\n\ndescribe('asset_generate tool', () => {\n it('generates an image and persists it in the workspace under assets/', async () => {\n const fs = new InMemoryWorkspaceFS();\n const fakeFetch = async () =>\n new Response(new Uint8Array([1, 2, 3, 4, 5]), {\n headers: { 'content-type': 'image/png' }\n });\n const client = new LocalGatewayClient({\n apiKey: 'k',\n endpoint: 'https://x',\n fetch: fakeFetch as typeof globalThis.fetch\n });\n const tool = createAssetGenerateTool({ gateway: client, fs, urlBuilder });\n const result = await tool.call({\n kind: 'image',\n prompt: 'a sunny meadow',\n width: 512,\n height: 512\n });\n expect(result.isError).toBeFalsy();\n const body = JSON.parse((result.content[0] as { text: string }).text) as {\n uri: string;\n mimeType: string;\n };\n expect(body.uri).toMatch(/^workspace:\\/\\/assets\\/[0-9a-f]{12}\\.png$/);\n expect(body.mimeType).toBe('image/png');\n // Bytes are persisted\n const relPath = body.uri.replace('workspace://', '');\n expect((await fs.readFile(relPath)).length).toBe(5);\n });\n\n it('returns isError when the gateway is disabled', async () => {\n const fs = new InMemoryWorkspaceFS();\n const client = new LocalGatewayClient({ apiKey: undefined });\n const tool = createAssetGenerateTool({ gateway: client, fs, urlBuilder });\n const result = await tool.call({ kind: 'image', prompt: 'x' });\n expect(result.isError).toBe(true);\n expect((result.content[0] as { text: string }).text).toMatch(/disabled/i);\n });\n\n it('returns isError for non-image kinds (Phase 4 video/audio)', async () => {\n const fs = new InMemoryWorkspaceFS();\n const client = new LocalGatewayClient({ apiKey: 'k' });\n const tool = createAssetGenerateTool({ gateway: client, fs, urlBuilder });\n const result = await tool.call({ kind: 'video', prompt: 'x' });\n expect(result.isError).toBe(true);\n expect((result.content[0] as { text: string }).text).toMatch(/phase 4/i);\n });\n\n it('returns an httpUrl pointing at the /r/ route', async () => {\n const fs = new InMemoryWorkspaceFS();\n const fakeFetch = async () =>\n new Response(new Uint8Array([1, 2, 3, 4, 5]), {\n headers: { 'content-type': 'image/png' }\n });\n const client = new LocalGatewayClient({\n apiKey: 'k',\n endpoint: 'https://x',\n fetch: fakeFetch as typeof globalThis.fetch\n });\n const tool = createAssetGenerateTool({ gateway: client, fs, urlBuilder });\n const result = await tool.call({ kind: 'image', prompt: 'a sunny meadow' });\n const body = JSON.parse((result.content[0] as { text: string }).text) as {\n uri: string;\n httpUrl: string;\n };\n const relPath = body.uri.replace('workspace://', '');\n expect(body.httpUrl).toBe(`http://127.0.0.1:9000/r/${relPath}`);\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"asset-search.test.d.ts","sourceRoot":"","sources":["../../../../test/tools/asset-search.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { Mutex } from '../../src/engine/mutex.js';
|
|
3
|
-
import { EngineSession } from '../../src/engine/session.js';
|
|
4
|
-
import { createAssetSearchTool } from '../../src/tools/asset-search.js';
|
|
5
|
-
function makeDeps() {
|
|
6
|
-
const fakeEngine = {
|
|
7
|
-
asset: {
|
|
8
|
-
findAllSources: vi.fn(() => ['ly.img.image', 'ly.img.sticker']),
|
|
9
|
-
getSupportedMimeTypes: vi.fn((id) => id === 'ly.img.image' ? ['image/jpeg', 'image/png'] : []),
|
|
10
|
-
findAssets: vi.fn(async () => ({
|
|
11
|
-
assets: [
|
|
12
|
-
{
|
|
13
|
-
id: 'beach-1',
|
|
14
|
-
label: 'Beach',
|
|
15
|
-
groups: ['nature'],
|
|
16
|
-
meta: {
|
|
17
|
-
uri: 'https://cdn.example/beach.jpg',
|
|
18
|
-
thumbUri: 'https://cdn.example/beach-thumb.jpg',
|
|
19
|
-
width: 1200,
|
|
20
|
-
height: 800,
|
|
21
|
-
blockType: '//ly.img.ubq/graphic'
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
],
|
|
25
|
-
currentPage: 0,
|
|
26
|
-
nextPage: 1,
|
|
27
|
-
total: 42
|
|
28
|
-
}))
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
const reset = vi.fn(async () => { });
|
|
32
|
-
const adapter = {
|
|
33
|
-
create: () => fakeEngine,
|
|
34
|
-
reset,
|
|
35
|
-
loadFromString: async () => { },
|
|
36
|
-
saveToString: async () => ''
|
|
37
|
-
};
|
|
38
|
-
const session = new EngineSession({ size: 1, adapter });
|
|
39
|
-
const tool = createAssetSearchTool({ session, engineLock: new Mutex() });
|
|
40
|
-
return { fakeEngine, session, tool, reset };
|
|
41
|
-
}
|
|
42
|
-
function bodyOf(result) {
|
|
43
|
-
return JSON.parse(result.content[0].text);
|
|
44
|
-
}
|
|
45
|
-
describe('asset_search tool', () => {
|
|
46
|
-
it('lists all sources with supported MIME types when sourceId is omitted', async () => {
|
|
47
|
-
const { tool } = makeDeps();
|
|
48
|
-
const result = await tool.call({});
|
|
49
|
-
expect(result.isError).toBeUndefined();
|
|
50
|
-
expect(bodyOf(result)).toEqual({
|
|
51
|
-
sources: [
|
|
52
|
-
{ id: 'ly.img.image', supportedMimeTypes: ['image/jpeg', 'image/png'] },
|
|
53
|
-
{ id: 'ly.img.sticker', supportedMimeTypes: [] }
|
|
54
|
-
]
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
it('searches a source and returns compact asset JSON', async () => {
|
|
58
|
-
const { tool, fakeEngine } = makeDeps();
|
|
59
|
-
const result = await tool.call({
|
|
60
|
-
sourceId: 'ly.img.image',
|
|
61
|
-
query: 'beach',
|
|
62
|
-
page: 2
|
|
63
|
-
});
|
|
64
|
-
expect(result.isError).toBeUndefined();
|
|
65
|
-
expect(fakeEngine.asset.findAssets).toHaveBeenCalledWith('ly.img.image', {
|
|
66
|
-
query: 'beach',
|
|
67
|
-
page: 2,
|
|
68
|
-
perPage: 20
|
|
69
|
-
});
|
|
70
|
-
expect(bodyOf(result)).toEqual({
|
|
71
|
-
total: 42,
|
|
72
|
-
currentPage: 0,
|
|
73
|
-
nextPage: 1,
|
|
74
|
-
assets: [
|
|
75
|
-
{
|
|
76
|
-
id: 'beach-1',
|
|
77
|
-
label: 'Beach',
|
|
78
|
-
groups: ['nature'],
|
|
79
|
-
uri: 'https://cdn.example/beach.jpg',
|
|
80
|
-
thumbUri: 'https://cdn.example/beach-thumb.jpg',
|
|
81
|
-
width: 1200,
|
|
82
|
-
height: 800
|
|
83
|
-
}
|
|
84
|
-
]
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
it('clamps perPage to 50', async () => {
|
|
88
|
-
const { tool, fakeEngine } = makeDeps();
|
|
89
|
-
await tool.call({ sourceId: 'ly.img.image', perPage: 500 });
|
|
90
|
-
expect(fakeEngine.asset.findAssets).toHaveBeenCalledWith('ly.img.image', {
|
|
91
|
-
page: 0,
|
|
92
|
-
perPage: 50
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
it('errors on an unknown sourceId and lists the valid ones', async () => {
|
|
96
|
-
const { tool } = makeDeps();
|
|
97
|
-
const result = await tool.call({ sourceId: 'nope' });
|
|
98
|
-
expect(result.isError).toBe(true);
|
|
99
|
-
const text = result.content[0].text;
|
|
100
|
-
expect(text).toContain('unknown sourceId "nope"');
|
|
101
|
-
expect(text).toContain('ly.img.image');
|
|
102
|
-
expect(text).toContain('ly.img.sticker');
|
|
103
|
-
});
|
|
104
|
-
it('returns isError when findAssets rejects (scene untouched)', async () => {
|
|
105
|
-
const { tool, fakeEngine } = makeDeps();
|
|
106
|
-
fakeEngine.asset.findAssets.mockRejectedValueOnce(new Error('CDN unreachable'));
|
|
107
|
-
const result = await tool.call({ sourceId: 'ly.img.image' });
|
|
108
|
-
expect(result.isError).toBe(true);
|
|
109
|
-
expect(result.content[0].text).toContain('CDN unreachable');
|
|
110
|
-
});
|
|
111
|
-
it('reuses a warm slot without resetting the engine', async () => {
|
|
112
|
-
const { tool, session, fakeEngine, reset } = makeDeps();
|
|
113
|
-
const slot = await session.acquire(null);
|
|
114
|
-
session.commit(slot, 'rev-1');
|
|
115
|
-
reset.mockClear(); // acquire(null) above legitimately reset once
|
|
116
|
-
await tool.call({ sourceId: 'ly.img.image' });
|
|
117
|
-
expect(fakeEngine.asset.findAssets).toHaveBeenCalled();
|
|
118
|
-
expect(reset).not.toHaveBeenCalled();
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
//# sourceMappingURL=asset-search.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"asset-search.test.js","sourceRoot":"","sources":["../../../../test/tools/asset-search.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from 'vitest';\nimport { Mutex } from '../../src/engine/mutex.js';\nimport { type EngineAdapter, EngineSession } from '../../src/engine/session.js';\nimport { createAssetSearchTool } from '../../src/tools/asset-search.js';\n\ninterface FakeEngine {\n asset: {\n findAllSources: ReturnType<typeof vi.fn>;\n getSupportedMimeTypes: ReturnType<typeof vi.fn>;\n findAssets: ReturnType<typeof vi.fn>;\n };\n}\n\nfunction makeDeps() {\n const fakeEngine: FakeEngine = {\n asset: {\n findAllSources: vi.fn(() => ['ly.img.image', 'ly.img.sticker']),\n getSupportedMimeTypes: vi.fn((id: string) =>\n id === 'ly.img.image' ? ['image/jpeg', 'image/png'] : []\n ),\n findAssets: vi.fn(async () => ({\n assets: [\n {\n id: 'beach-1',\n label: 'Beach',\n groups: ['nature'],\n meta: {\n uri: 'https://cdn.example/beach.jpg',\n thumbUri: 'https://cdn.example/beach-thumb.jpg',\n width: 1200,\n height: 800,\n blockType: '//ly.img.ubq/graphic'\n }\n }\n ],\n currentPage: 0,\n nextPage: 1,\n total: 42\n }))\n }\n };\n const reset = vi.fn(async () => {});\n const adapter: EngineAdapter<FakeEngine> = {\n create: () => fakeEngine,\n reset,\n loadFromString: async () => {},\n saveToString: async () => ''\n };\n const session = new EngineSession<FakeEngine>({ size: 1, adapter });\n const tool = createAssetSearchTool({ session, engineLock: new Mutex() });\n return { fakeEngine, session, tool, reset };\n}\n\nfunction bodyOf(result: {\n content: Array<{ type: string; text?: string }>;\n}): unknown {\n return JSON.parse((result.content[0] as { text: string }).text);\n}\n\ndescribe('asset_search tool', () => {\n it('lists all sources with supported MIME types when sourceId is omitted', async () => {\n const { tool } = makeDeps();\n const result = await tool.call({});\n expect(result.isError).toBeUndefined();\n expect(bodyOf(result)).toEqual({\n sources: [\n { id: 'ly.img.image', supportedMimeTypes: ['image/jpeg', 'image/png'] },\n { id: 'ly.img.sticker', supportedMimeTypes: [] }\n ]\n });\n });\n\n it('searches a source and returns compact asset JSON', async () => {\n const { tool, fakeEngine } = makeDeps();\n const result = await tool.call({\n sourceId: 'ly.img.image',\n query: 'beach',\n page: 2\n });\n expect(result.isError).toBeUndefined();\n expect(fakeEngine.asset.findAssets).toHaveBeenCalledWith('ly.img.image', {\n query: 'beach',\n page: 2,\n perPage: 20\n });\n expect(bodyOf(result)).toEqual({\n total: 42,\n currentPage: 0,\n nextPage: 1,\n assets: [\n {\n id: 'beach-1',\n label: 'Beach',\n groups: ['nature'],\n uri: 'https://cdn.example/beach.jpg',\n thumbUri: 'https://cdn.example/beach-thumb.jpg',\n width: 1200,\n height: 800\n }\n ]\n });\n });\n\n it('clamps perPage to 50', async () => {\n const { tool, fakeEngine } = makeDeps();\n await tool.call({ sourceId: 'ly.img.image', perPage: 500 });\n expect(fakeEngine.asset.findAssets).toHaveBeenCalledWith('ly.img.image', {\n page: 0,\n perPage: 50\n });\n });\n\n it('errors on an unknown sourceId and lists the valid ones', async () => {\n const { tool } = makeDeps();\n const result = await tool.call({ sourceId: 'nope' });\n expect(result.isError).toBe(true);\n const text = (result.content[0] as { text: string }).text;\n expect(text).toContain('unknown sourceId \"nope\"');\n expect(text).toContain('ly.img.image');\n expect(text).toContain('ly.img.sticker');\n });\n\n it('returns isError when findAssets rejects (scene untouched)', async () => {\n const { tool, fakeEngine } = makeDeps();\n fakeEngine.asset.findAssets.mockRejectedValueOnce(\n new Error('CDN unreachable')\n );\n const result = await tool.call({ sourceId: 'ly.img.image' });\n expect(result.isError).toBe(true);\n expect((result.content[0] as { text: string }).text).toContain(\n 'CDN unreachable'\n );\n });\n\n it('reuses a warm slot without resetting the engine', async () => {\n const { tool, session, fakeEngine, reset } = makeDeps();\n const slot = await session.acquire(null);\n session.commit(slot, 'rev-1');\n reset.mockClear(); // acquire(null) above legitimately reset once\n await tool.call({ sourceId: 'ly.img.image' });\n expect(fakeEngine.asset.findAssets).toHaveBeenCalled();\n expect(reset).not.toHaveBeenCalled();\n });\n});\n"]}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Mutex } from '../../src/engine/mutex.js';
|
|
2
|
-
import { EngineSession } from '../../src/engine/session.js';
|
|
3
|
-
import { RevisionStore } from '../../src/revisions/store.js';
|
|
4
|
-
/**
|
|
5
|
-
* Minimal fake harness shared with edit.telemetry.test.ts.
|
|
6
|
-
* Uses a fake RevisionStore (write returns id='newrev') and a real EngineSession
|
|
7
|
-
* with a no-op adapter so the adapter cast inside edit.ts resolves correctly.
|
|
8
|
-
*/
|
|
9
|
-
export declare function makeEditHarness(): {
|
|
10
|
-
store: RevisionStore;
|
|
11
|
-
session: EngineSession<unknown>;
|
|
12
|
-
engineLock: Mutex;
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=edit-harness.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"edit-harness.d.ts","sourceRoot":"","sources":["../../../../test/tools/edit-harness.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAsB,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D;;;;GAIG;AACH,wBAAgB,eAAe;;;;EAoB9B"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
// Shared edit-tool test harness — a plain module (no test registrations) so importing it never re-runs edit.test.ts.
|
|
2
|
-
import { Mutex } from '../../src/engine/mutex.js';
|
|
3
|
-
import { EngineSession } from '../../src/engine/session.js';
|
|
4
|
-
/**
|
|
5
|
-
* Minimal fake harness shared with edit.telemetry.test.ts.
|
|
6
|
-
* Uses a fake RevisionStore (write returns id='newrev') and a real EngineSession
|
|
7
|
-
* with a no-op adapter so the adapter cast inside edit.ts resolves correctly.
|
|
8
|
-
*/
|
|
9
|
-
export function makeEditHarness() {
|
|
10
|
-
const fakeEngine = {};
|
|
11
|
-
const adapter = {
|
|
12
|
-
create: () => fakeEngine,
|
|
13
|
-
reset: async () => { },
|
|
14
|
-
loadFromString: async () => { },
|
|
15
|
-
saveToString: async () => 'SCENE'
|
|
16
|
-
};
|
|
17
|
-
const session = new EngineSession({ size: 1, adapter });
|
|
18
|
-
const store = {
|
|
19
|
-
read: async () => ({ scene: 'S', meta: { parent: null } }),
|
|
20
|
-
write: async () => ({
|
|
21
|
-
id: 'newrev',
|
|
22
|
-
meta: { parent: null },
|
|
23
|
-
scene: 'SCENE'
|
|
24
|
-
}),
|
|
25
|
-
historyOf: async () => [{ id: 'root' }],
|
|
26
|
-
readCode: async () => undefined
|
|
27
|
-
};
|
|
28
|
-
return { store, session, engineLock: new Mutex() };
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=edit-harness.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"edit-harness.js","sourceRoot":"","sources":["../../../../test/tools/edit-harness.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAsB,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGhF;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,MAAM,OAAO,GAAkB;QAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU;QACxB,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACrB,cAAc,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QAC9B,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;KAClC,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG;QACZ,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1D,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YAClB,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;YACtB,KAAK,EAAE,OAAO;SACf,CAAC;QACF,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACvC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;KACJ,CAAC;IAC9B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,KAAK,EAAE,EAAE,CAAC;AACrD,CAAC","sourcesContent":["// Shared edit-tool test harness — a plain module (no test registrations) so importing it never re-runs edit.test.ts.\nimport { Mutex } from '../../src/engine/mutex.js';\nimport { type EngineAdapter, EngineSession } from '../../src/engine/session.js';\nimport { RevisionStore } from '../../src/revisions/store.js';\n\n/**\n * Minimal fake harness shared with edit.telemetry.test.ts.\n * Uses a fake RevisionStore (write returns id='newrev') and a real EngineSession\n * with a no-op adapter so the adapter cast inside edit.ts resolves correctly.\n */\nexport function makeEditHarness() {\n const fakeEngine = {};\n const adapter: EngineAdapter = {\n create: () => fakeEngine,\n reset: async () => {},\n loadFromString: async () => {},\n saveToString: async () => 'SCENE'\n };\n const session = new EngineSession({ size: 1, adapter });\n const store = {\n read: async () => ({ scene: 'S', meta: { parent: null } }),\n write: async () => ({\n id: 'newrev',\n meta: { parent: null },\n scene: 'SCENE'\n }),\n historyOf: async () => [{ id: 'root' }],\n readCode: async () => undefined\n } as unknown as RevisionStore;\n return { store, session, engineLock: new Mutex() };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"edit.telemetry.test.d.ts","sourceRoot":"","sources":["../../../../test/tools/edit.telemetry.test.ts"],"names":[],"mappings":""}
|