@nodetool-ai/websocket 0.8.2 → 0.8.4-a24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/agent/run-node-tool.d.ts.map +1 -1
- package/dist/agent/run-node-tool.js +11 -1
- package/dist/agent/run-node-tool.js.map +1 -1
- package/dist/chat-prediction-forwarder.d.ts +5 -3
- package/dist/chat-prediction-forwarder.d.ts.map +1 -1
- package/dist/chat-prediction-forwarder.js +6 -4
- package/dist/chat-prediction-forwarder.js.map +1 -1
- package/dist/chat-turn-registry.d.ts +2 -1
- package/dist/chat-turn-registry.d.ts.map +1 -1
- package/dist/chat-turn-registry.js +8 -1
- package/dist/chat-turn-registry.js.map +1 -1
- package/dist/collection-api.d.ts.map +1 -1
- package/dist/collection-api.js +3 -5
- package/dist/collection-api.js.map +1 -1
- package/dist/custom-providers.d.ts.map +1 -1
- package/dist/custom-providers.js +6 -1
- package/dist/custom-providers.js.map +1 -1
- package/dist/e2e-server.js +1 -1
- package/dist/e2e-server.js.map +1 -1
- package/dist/example-workflows.d.ts.map +1 -1
- package/dist/example-workflows.js +7 -1
- package/dist/example-workflows.js.map +1 -1
- package/dist/fake-runtime.d.ts +54 -8
- package/dist/fake-runtime.d.ts.map +1 -1
- package/dist/fake-runtime.js +228 -15
- package/dist/fake-runtime.js.map +1 -1
- package/dist/file-api.d.ts.map +1 -1
- package/dist/file-api.js +6 -8
- package/dist/file-api.js.map +1 -1
- package/dist/generation-recovery.d.ts.map +1 -1
- package/dist/generation-recovery.js +7 -4
- package/dist/generation-recovery.js.map +1 -1
- package/dist/headless-job-runner.d.ts.map +1 -1
- package/dist/headless-job-runner.js +8 -2
- package/dist/headless-job-runner.js.map +1 -1
- package/dist/http-api.d.ts +4 -2
- package/dist/http-api.d.ts.map +1 -1
- package/dist/http-api.js +67 -16
- package/dist/http-api.js.map +1 -1
- package/dist/http-body-schemas.d.ts +2 -0
- package/dist/http-body-schemas.d.ts.map +1 -1
- package/dist/http-body-schemas.js +8 -1
- package/dist/http-body-schemas.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/job-control.d.ts +8 -0
- package/dist/job-control.d.ts.map +1 -1
- package/dist/job-control.js +12 -0
- package/dist/job-control.js.map +1 -1
- package/dist/lib/admin.d.ts +7 -0
- package/dist/lib/admin.d.ts.map +1 -0
- package/dist/lib/admin.js +19 -0
- package/dist/lib/admin.js.map +1 -0
- package/dist/lib/app-instances-service.d.ts +35 -0
- package/dist/lib/app-instances-service.d.ts.map +1 -1
- package/dist/lib/app-instances-service.js +3 -4
- package/dist/lib/app-instances-service.js.map +1 -1
- package/dist/lib/app-project-export.d.ts +12 -0
- package/dist/lib/app-project-export.d.ts.map +1 -0
- package/dist/lib/app-project-export.js +42 -0
- package/dist/lib/app-project-export.js.map +1 -0
- package/dist/lib/applications-service.d.ts.map +1 -1
- package/dist/lib/applications-service.js +7 -2
- package/dist/lib/applications-service.js.map +1 -1
- package/dist/lib/asset-export.d.ts +7 -3
- package/dist/lib/asset-export.d.ts.map +1 -1
- package/dist/lib/asset-export.js +16 -8
- package/dist/lib/asset-export.js.map +1 -1
- package/dist/lib/asset-paths.d.ts +1 -1
- package/dist/lib/asset-paths.js +1 -1
- package/dist/lib/asset-response.d.ts.map +1 -1
- package/dist/lib/asset-response.js +13 -6
- package/dist/lib/asset-response.js.map +1 -1
- package/dist/lib/cloud-profile.d.ts +10 -0
- package/dist/lib/cloud-profile.d.ts.map +1 -0
- package/dist/lib/cloud-profile.js +13 -0
- package/dist/lib/cloud-profile.js.map +1 -0
- package/dist/lib/example-apps.d.ts +3 -0
- package/dist/lib/example-apps.d.ts.map +1 -1
- package/dist/lib/example-apps.js +3 -2
- package/dist/lib/example-apps.js.map +1 -1
- package/dist/lib/http-user-id.d.ts +2 -0
- package/dist/lib/http-user-id.d.ts.map +1 -0
- package/dist/lib/http-user-id.js +4 -0
- package/dist/lib/http-user-id.js.map +1 -0
- package/dist/lib/json-body.d.ts +11 -0
- package/dist/lib/json-body.d.ts.map +1 -0
- package/dist/lib/json-body.js +13 -0
- package/dist/lib/json-body.js.map +1 -0
- package/dist/lib/project-archive-host.d.ts +14 -0
- package/dist/lib/project-archive-host.d.ts.map +1 -0
- package/dist/lib/project-archive-host.js +24 -0
- package/dist/lib/project-archive-host.js.map +1 -0
- package/dist/lib/project-archive.d.ts +103 -0
- package/dist/lib/project-archive.d.ts.map +1 -0
- package/dist/lib/project-archive.js +610 -0
- package/dist/lib/project-archive.js.map +1 -0
- package/dist/lib/public-routes.d.ts +15 -0
- package/dist/lib/public-routes.d.ts.map +1 -1
- package/dist/lib/public-routes.js +27 -0
- package/dist/lib/public-routes.js.map +1 -1
- package/dist/lib/public-workflow-share.d.ts +12 -1
- package/dist/lib/public-workflow-share.d.ts.map +1 -1
- package/dist/lib/public-workflow-share.js +45 -2
- package/dist/lib/public-workflow-share.js.map +1 -1
- package/dist/lib/python-metadata-roots.d.ts +27 -0
- package/dist/lib/python-metadata-roots.d.ts.map +1 -0
- package/dist/lib/python-metadata-roots.js +92 -0
- package/dist/lib/python-metadata-roots.js.map +1 -0
- package/dist/lib/runtime-detection.d.ts +1 -1
- package/dist/lib/runtime-detection.d.ts.map +1 -1
- package/dist/lib/runtime-detection.js +2 -1
- package/dist/lib/runtime-detection.js.map +1 -1
- package/dist/lib/server-auth-token.d.ts +18 -0
- package/dist/lib/server-auth-token.d.ts.map +1 -0
- package/dist/lib/server-auth-token.js +28 -0
- package/dist/lib/server-auth-token.js.map +1 -0
- package/dist/lib/thumbnail.d.ts.map +1 -1
- package/dist/lib/thumbnail.js +3 -1
- package/dist/lib/thumbnail.js.map +1 -1
- package/dist/lib/timeline-bundle.d.ts +70 -0
- package/dist/lib/timeline-bundle.d.ts.map +1 -1
- package/dist/lib/timeline-bundle.js +28 -10
- package/dist/lib/timeline-bundle.js.map +1 -1
- package/dist/lib/timeline-media-export.d.ts +18 -0
- package/dist/lib/timeline-media-export.d.ts.map +1 -0
- package/dist/lib/timeline-media-export.js +66 -0
- package/dist/lib/timeline-media-export.js.map +1 -0
- package/dist/lib/timeline-premiere-import.d.ts +24 -0
- package/dist/lib/timeline-premiere-import.d.ts.map +1 -0
- package/dist/lib/timeline-premiere-import.js +112 -0
- package/dist/lib/timeline-premiere-import.js.map +1 -0
- package/dist/lib/timeline-premiere.d.ts +38 -0
- package/dist/lib/timeline-premiere.d.ts.map +1 -0
- package/dist/lib/timeline-premiere.js +87 -0
- package/dist/lib/timeline-premiere.js.map +1 -0
- package/dist/lib/zip-stream.d.ts +3 -0
- package/dist/lib/zip-stream.d.ts.map +1 -1
- package/dist/lib/zip-stream.js +6 -0
- package/dist/lib/zip-stream.js.map +1 -1
- package/dist/mcp-agent-tools.d.ts +48 -0
- package/dist/mcp-agent-tools.d.ts.map +1 -1
- package/dist/mcp-agent-tools.js +15 -2
- package/dist/mcp-agent-tools.js.map +1 -1
- package/dist/mcp-server.d.ts +7 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +163 -16
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-skill-prompts.d.ts +23 -0
- package/dist/mcp-skill-prompts.d.ts.map +1 -0
- package/dist/mcp-skill-prompts.js +91 -0
- package/dist/mcp-skill-prompts.js.map +1 -0
- package/dist/mcp-tool-deps.d.ts.map +1 -1
- package/dist/mcp-tool-deps.js +8 -1
- package/dist/mcp-tool-deps.js.map +1 -1
- package/dist/model-download-runtime.d.ts.map +1 -1
- package/dist/model-download-runtime.js +2 -1
- package/dist/model-download-runtime.js.map +1 -1
- package/dist/models-api.d.ts.map +1 -1
- package/dist/models-api.js +6 -2
- package/dist/models-api.js.map +1 -1
- package/dist/node-registry-setup.d.ts +8 -5
- package/dist/node-registry-setup.d.ts.map +1 -1
- package/dist/node-registry-setup.js +22 -10
- package/dist/node-registry-setup.js.map +1 -1
- package/dist/oauth-api.d.ts.map +1 -1
- package/dist/oauth-api.js +45 -23
- package/dist/oauth-api.js.map +1 -1
- package/dist/openai-api.d.ts.map +1 -1
- package/dist/openai-api.js +10 -2
- package/dist/openai-api.js.map +1 -1
- package/dist/pack-source.d.ts +15 -0
- package/dist/pack-source.d.ts.map +1 -0
- package/dist/pack-source.js +85 -0
- package/dist/pack-source.js.map +1 -0
- package/dist/plugins/websocket.d.ts.map +1 -1
- package/dist/plugins/websocket.js +31 -5
- package/dist/plugins/websocket.js.map +1 -1
- package/dist/routes/applications.d.ts +1 -0
- package/dist/routes/applications.d.ts.map +1 -1
- package/dist/routes/applications.js +24 -0
- package/dist/routes/applications.js.map +1 -1
- package/dist/routes/assets.d.ts.map +1 -1
- package/dist/routes/assets.js +31 -41
- package/dist/routes/assets.js.map +1 -1
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +6 -0
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/documents.d.ts.map +1 -1
- package/dist/routes/documents.js +32 -1
- package/dist/routes/documents.js.map +1 -1
- package/dist/routes/fal-pricing-estimate.d.ts.map +1 -1
- package/dist/routes/fal-pricing-estimate.js +2 -0
- package/dist/routes/fal-pricing-estimate.js.map +1 -1
- package/dist/routes/files.d.ts.map +1 -1
- package/dist/routes/files.js +2 -0
- package/dist/routes/files.js.map +1 -1
- package/dist/routes/games.d.ts +38 -0
- package/dist/routes/games.d.ts.map +1 -0
- package/dist/routes/games.js +159 -0
- package/dist/routes/games.js.map +1 -0
- package/dist/routes/integrations.d.ts.map +1 -1
- package/dist/routes/integrations.js +22 -26
- package/dist/routes/integrations.js.map +1 -1
- package/dist/routes/js-scripts.d.ts +1 -1
- package/dist/routes/js-scripts.d.ts.map +1 -1
- package/dist/routes/js-scripts.js +1 -1
- package/dist/routes/js-scripts.js.map +1 -1
- package/dist/routes/kie-pricing.js +1 -1
- package/dist/routes/kie-pricing.js.map +1 -1
- package/dist/routes/nodes.d.ts.map +1 -1
- package/dist/routes/nodes.js +13 -1
- package/dist/routes/nodes.js.map +1 -1
- package/dist/routes/project-archive.d.ts +18 -0
- package/dist/routes/project-archive.d.ts.map +1 -0
- package/dist/routes/project-archive.js +98 -0
- package/dist/routes/project-archive.js.map +1 -0
- package/dist/routes/storage.d.ts.map +1 -1
- package/dist/routes/storage.js +2 -0
- package/dist/routes/storage.js.map +1 -1
- package/dist/routes/storyboards.d.ts.map +1 -1
- package/dist/routes/storyboards.js +6 -3
- package/dist/routes/storyboards.js.map +1 -1
- package/dist/routes/timelines.d.ts +8 -4
- package/dist/routes/timelines.d.ts.map +1 -1
- package/dist/routes/timelines.js +209 -16
- package/dist/routes/timelines.js.map +1 -1
- package/dist/screenshot-docs-seed.d.ts +24 -0
- package/dist/screenshot-docs-seed.d.ts.map +1 -0
- package/dist/screenshot-docs-seed.js +421 -0
- package/dist/screenshot-docs-seed.js.map +1 -0
- package/dist/screenshot-projects.d.ts.map +1 -1
- package/dist/screenshot-projects.js +9 -9
- package/dist/screenshot-projects.js.map +1 -1
- package/dist/screenshot-server.js +274 -17
- package/dist/screenshot-server.js.map +1 -1
- package/dist/sdk/sdk-node-type-inventory-service.d.ts +1 -1
- package/dist/sdk/sdk-node-type-inventory-service.d.ts.map +1 -1
- package/dist/sdk/sdk-node-type-inventory-service.js +4 -4
- package/dist/sdk/sdk-node-type-inventory-service.js.map +1 -1
- package/dist/sdk/sdk-v1-service.js +1 -1
- package/dist/sdk/sdk-v1-service.js.map +1 -1
- package/dist/server.d.ts +7 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1482 -1487
- package/dist/server.js.map +1 -1
- package/dist/session/chat-prompt.d.ts.map +1 -1
- package/dist/session/chat-prompt.js +6 -0
- package/dist/session/chat-prompt.js.map +1 -1
- package/dist/session/chat-turn.d.ts +10 -0
- package/dist/session/chat-turn.d.ts.map +1 -1
- package/dist/session/chat-turn.js +103 -20
- package/dist/session/chat-turn.js.map +1 -1
- package/dist/session/client-tool-gate.d.ts +23 -0
- package/dist/session/client-tool-gate.d.ts.map +1 -0
- package/dist/session/client-tool-gate.js +59 -0
- package/dist/session/client-tool-gate.js.map +1 -0
- package/dist/session/commands.d.ts +14 -0
- package/dist/session/commands.d.ts.map +1 -1
- package/dist/session/commands.js +113 -14
- package/dist/session/commands.js.map +1 -1
- package/dist/session/inference.d.ts +25 -2
- package/dist/session/inference.d.ts.map +1 -1
- package/dist/session/inference.js +105 -21
- package/dist/session/inference.js.map +1 -1
- package/dist/session/job-execution.d.ts +0 -1
- package/dist/session/job-execution.d.ts.map +1 -1
- package/dist/session/job-execution.js +43 -39
- package/dist/session/job-execution.js.map +1 -1
- package/dist/storage-api.d.ts +0 -4
- package/dist/storage-api.d.ts.map +1 -1
- package/dist/storage-api.js +3 -26
- package/dist/storage-api.js.map +1 -1
- package/dist/test-ui-server.d.ts +15 -3
- package/dist/test-ui-server.d.ts.map +1 -1
- package/dist/test-ui-server.js +74 -12
- package/dist/test-ui-server.js.map +1 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +24 -4
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/triggers/file-watch.d.ts +2 -2
- package/dist/triggers/file-watch.d.ts.map +1 -1
- package/dist/triggers/file-watch.js +44 -21
- package/dist/triggers/file-watch.js.map +1 -1
- package/dist/triggers/scheduler.d.ts.map +1 -1
- package/dist/triggers/scheduler.js +7 -5
- package/dist/triggers/scheduler.js.map +1 -1
- package/dist/trpc/error-formatter.d.ts.map +1 -1
- package/dist/trpc/error-formatter.js +2 -1
- package/dist/trpc/error-formatter.js.map +1 -1
- package/dist/trpc/routers/app-instances.d.ts +63 -0
- package/dist/trpc/routers/app-instances.d.ts.map +1 -1
- package/dist/trpc/routers/app-runs.d.ts +28 -0
- package/dist/trpc/routers/app-runs.d.ts.map +1 -1
- package/dist/trpc/routers/applications.d.ts +7 -0
- package/dist/trpc/routers/applications.d.ts.map +1 -1
- package/dist/trpc/routers/assets.d.ts +8 -0
- package/dist/trpc/routers/assets.d.ts.map +1 -1
- package/dist/trpc/routers/assets.js +16 -5
- package/dist/trpc/routers/assets.js.map +1 -1
- package/dist/trpc/routers/collections.d.ts.map +1 -1
- package/dist/trpc/routers/collections.js +16 -10
- package/dist/trpc/routers/collections.js.map +1 -1
- package/dist/trpc/routers/credits.d.ts.map +1 -1
- package/dist/trpc/routers/credits.js +11 -1
- package/dist/trpc/routers/credits.js.map +1 -1
- package/dist/trpc/routers/extension.d.ts +17 -3
- package/dist/trpc/routers/extension.d.ts.map +1 -1
- package/dist/trpc/routers/extension.js +40 -7
- package/dist/trpc/routers/extension.js.map +1 -1
- package/dist/trpc/routers/gameDraftHistory.d.ts +1 -2
- package/dist/trpc/routers/gameDraftHistory.d.ts.map +1 -1
- package/dist/trpc/routers/gameDraftHistory.js +1 -1
- package/dist/trpc/routers/gameDraftHistory.js.map +1 -1
- package/dist/trpc/routers/games.d.ts +20478 -24667
- package/dist/trpc/routers/games.d.ts.map +1 -1
- package/dist/trpc/routers/games.js +325 -143
- package/dist/trpc/routers/games.js.map +1 -1
- package/dist/trpc/routers/jobs.d.ts +7 -0
- package/dist/trpc/routers/jobs.d.ts.map +1 -1
- package/dist/trpc/routers/jobs.js +10 -3
- package/dist/trpc/routers/jobs.js.map +1 -1
- package/dist/trpc/routers/js-scripts.d.ts.map +1 -1
- package/dist/trpc/routers/js-scripts.js +18 -2
- package/dist/trpc/routers/js-scripts.js.map +1 -1
- package/dist/trpc/routers/messages.d.ts +10 -0
- package/dist/trpc/routers/messages.d.ts.map +1 -1
- package/dist/trpc/routers/messages.js +16 -2
- package/dist/trpc/routers/messages.js.map +1 -1
- package/dist/trpc/routers/models.d.ts.map +1 -1
- package/dist/trpc/routers/models.js +58 -37
- package/dist/trpc/routers/models.js.map +1 -1
- package/dist/trpc/routers/packs.d.ts.map +1 -1
- package/dist/trpc/routers/packs.js +19 -5
- package/dist/trpc/routers/packs.js.map +1 -1
- package/dist/trpc/routers/projects.d.ts +66 -2
- package/dist/trpc/routers/projects.d.ts.map +1 -1
- package/dist/trpc/routers/projects.js +19 -2
- package/dist/trpc/routers/projects.js.map +1 -1
- package/dist/trpc/routers/settings.d.ts.map +1 -1
- package/dist/trpc/routers/settings.js +30 -5
- package/dist/trpc/routers/settings.js.map +1 -1
- package/dist/trpc/routers/sketch.d.ts +30 -0
- package/dist/trpc/routers/sketch.d.ts.map +1 -1
- package/dist/trpc/routers/sketch.js +2 -2
- package/dist/trpc/routers/sketch.js.map +1 -1
- package/dist/trpc/routers/storyboards.d.ts +171 -1
- package/dist/trpc/routers/storyboards.d.ts.map +1 -1
- package/dist/trpc/routers/storyboards.js +8 -5
- package/dist/trpc/routers/storyboards.js.map +1 -1
- package/dist/trpc/routers/threads.d.ts.map +1 -1
- package/dist/trpc/routers/threads.js +11 -2
- package/dist/trpc/routers/threads.js.map +1 -1
- package/dist/trpc/routers/timeline.d.ts +379 -0
- package/dist/trpc/routers/timeline.d.ts.map +1 -1
- package/dist/trpc/routers/timeline.js +15 -2
- package/dist/trpc/routers/timeline.js.map +1 -1
- package/dist/trpc/routers/triggers.d.ts.map +1 -1
- package/dist/trpc/routers/triggers.js +18 -3
- package/dist/trpc/routers/triggers.js.map +1 -1
- package/dist/trpc/routers/users.d.ts +3 -2
- package/dist/trpc/routers/users.d.ts.map +1 -1
- package/dist/trpc/routers/users.js +25 -27
- package/dist/trpc/routers/users.js.map +1 -1
- package/dist/trpc/routers/worker.d.ts.map +1 -1
- package/dist/trpc/routers/worker.js +37 -14
- package/dist/trpc/routers/worker.js.map +1 -1
- package/dist/trpc/routers/workflows.d.ts +190 -0
- package/dist/trpc/routers/workflows.d.ts.map +1 -1
- package/dist/trpc/routers/workflows.js +56 -15
- package/dist/trpc/routers/workflows.js.map +1 -1
- package/dist/trpc/sandbox-coverage.d.ts.map +1 -1
- package/dist/trpc/sandbox-coverage.js +34 -0
- package/dist/trpc/sandbox-coverage.js.map +1 -1
- package/dist/websocket-client-session.d.ts +2 -2
- package/dist/websocket-client-session.d.ts.map +1 -1
- package/dist/websocket-client-session.js +9 -3
- package/dist/websocket-client-session.js.map +1 -1
- package/dist/worker-settings-env.d.ts +23 -0
- package/dist/worker-settings-env.d.ts.map +1 -0
- package/dist/worker-settings-env.js +47 -0
- package/dist/worker-settings-env.js.map +1 -0
- package/dist/workflow-interface-service.d.ts +7 -0
- package/dist/workflow-interface-service.d.ts.map +1 -1
- package/package.json +51 -46
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.nodetool-project` project files: a whole project in one zip.
|
|
3
|
+
*
|
|
4
|
+
* Layout:
|
|
5
|
+
* manifest.json — format, version, project name and kind,
|
|
6
|
+
* row counts, and a sha256 for every file
|
|
7
|
+
* records.json — every project row, table by table
|
|
8
|
+
* (`PROJECT_ARCHIVE_TABLES` in models)
|
|
9
|
+
* assets/<asset id><ext> — stored bytes of each non-folder asset
|
|
10
|
+
* workspaces/<workspace id>/… — every file in the project's workspaces
|
|
11
|
+
*
|
|
12
|
+
* Export copies rows whole, minus the owner and project columns, and the
|
|
13
|
+
* workspace path, which only means something on the exporting machine.
|
|
14
|
+
*
|
|
15
|
+
* Import always creates a new project. Every row gets a fresh id, and every
|
|
16
|
+
* reference to an exported id is rewritten wherever it appears: id columns,
|
|
17
|
+
* document JSON, `asset://` locators, workspace file paths, and JSON files in
|
|
18
|
+
* workspaces. Resource ids are 32 lowercase hex characters, so a reference is
|
|
19
|
+
* any such token that names an exported row. Bytes are stored first and the
|
|
20
|
+
* rows are inserted in one transaction, so a failed import leaves nothing
|
|
21
|
+
* visible and removes the bytes it stored.
|
|
22
|
+
*/
|
|
23
|
+
import { createHash } from "node:crypto";
|
|
24
|
+
import { rm } from "node:fs/promises";
|
|
25
|
+
import nodePath from "node:path";
|
|
26
|
+
import { strFromU8, strToU8, unzipSync } from "fflate";
|
|
27
|
+
import { z } from "zod";
|
|
28
|
+
import { getManagedWorkspaceDir, managedWorkspaceKey, workspaceStorageKind } from "@nodetool-ai/config";
|
|
29
|
+
import { Asset, createTimeOrderedUuid, persistProjectArchive, PERSONAL_PROJECT_KIND, Project, PROJECT_ARCHIVE_TABLE_NAMES, PROJECT_ARCHIVE_TABLES, projectArchiveColumns, projectArchivePrimaryKey, readProjectArchiveRecords, Workspace } from "@nodetool-ai/models";
|
|
30
|
+
import { getAssetFileName } from "@nodetool-ai/protocol";
|
|
31
|
+
import { getAssetStorageKey, localAssetPath, retrieveAssetBytes } from "./asset-paths.js";
|
|
32
|
+
import { unzipBounded } from "./timeline-bundle.js";
|
|
33
|
+
import { exportSourceSize, MAX_ZIP_ENTRY_BYTES, sha256OfSource } from "./zip-stream.js";
|
|
34
|
+
export const PROJECT_ARCHIVE_FORMAT = "nodetool-project";
|
|
35
|
+
export const PROJECT_ARCHIVE_VERSION = 1;
|
|
36
|
+
export const PROJECT_ARCHIVE_EXTENSION = ".nodetool-project";
|
|
37
|
+
/** Largest project file an import inflates, summed over its entries. */
|
|
38
|
+
export const MAX_PROJECT_ARCHIVE_BYTES = 1024 * 1024 * 1024;
|
|
39
|
+
/** Most entries a project file may hold. */
|
|
40
|
+
export const MAX_PROJECT_ARCHIVE_ENTRIES = 100_000;
|
|
41
|
+
const fileEntry = z.object({
|
|
42
|
+
file: z.string(),
|
|
43
|
+
bytes: z.number().int().nonnegative(),
|
|
44
|
+
sha256: z.string()
|
|
45
|
+
});
|
|
46
|
+
const manifestSchema = z.object({
|
|
47
|
+
format: z.literal(PROJECT_ARCHIVE_FORMAT),
|
|
48
|
+
version: z.number().int(),
|
|
49
|
+
nodetool_version: z.string().optional(),
|
|
50
|
+
created_at: z.string(),
|
|
51
|
+
project: z.object({
|
|
52
|
+
id: z.string(),
|
|
53
|
+
name: z.string(),
|
|
54
|
+
kind: z.string(),
|
|
55
|
+
thread_id: z.string().nullable().optional()
|
|
56
|
+
}),
|
|
57
|
+
counts: z.record(z.string(), z.number()),
|
|
58
|
+
assets: z.array(fileEntry.extend({ id: z.string() })),
|
|
59
|
+
workspace_files: z.array(fileEntry.extend({ workspace_id: z.string(), path: z.string() })),
|
|
60
|
+
skipped: z.array(z.object({ kind: z.string(), id: z.string(), reason: z.string() }))
|
|
61
|
+
});
|
|
62
|
+
const recordsSchema = z.record(z.string(), z.array(z.record(z.string(), z.unknown())));
|
|
63
|
+
/** Columns never written to a file: they name the exporting owner and project. */
|
|
64
|
+
const OWNER_COLUMNS = ["user_id", "project_id"];
|
|
65
|
+
/**
|
|
66
|
+
* Nullable columns that link to another row. On import each keeps its link
|
|
67
|
+
* only when the file carries the row it names.
|
|
68
|
+
*/
|
|
69
|
+
const OPTIONAL_REFERENCES = {
|
|
70
|
+
assets: { job_id: null, workflow_id: "workflows", sketch_document_id: "image_documents", timeline_id: "timeline_sequences" },
|
|
71
|
+
workflows: { workspace_id: "workspaces" },
|
|
72
|
+
storyboards: { timeline_id: "timeline_sequences" },
|
|
73
|
+
scripts: { timeline_id: "timeline_sequences", storyboard_id: "storyboards" },
|
|
74
|
+
timeline_sequences: { workflow_id: "workflows" },
|
|
75
|
+
image_documents: { workflow_id: "workflows", thumbnail_asset_id: "assets" },
|
|
76
|
+
threads: { workflow_id: "workflows" },
|
|
77
|
+
messages: { workflow_id: "workflows" },
|
|
78
|
+
game_draft_changes: { thread_id: "threads", message_id: "messages" }
|
|
79
|
+
};
|
|
80
|
+
function assetEntryName(asset) {
|
|
81
|
+
return `assets/${getAssetFileName(asset.id, asset.content_type)}`;
|
|
82
|
+
}
|
|
83
|
+
/** An asset's bytes as a local file when there is one, else read whole. */
|
|
84
|
+
async function assetSource(storage, asset) {
|
|
85
|
+
const path = await localAssetPath(storage, asset.user_id, asset.id, asset.content_type);
|
|
86
|
+
if (path) {
|
|
87
|
+
const { stat } = await import("node:fs/promises");
|
|
88
|
+
try {
|
|
89
|
+
return { path, size: (await stat(path)).size };
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return retrieveAssetBytes(storage, asset.user_id, asset.id, asset.content_type);
|
|
96
|
+
}
|
|
97
|
+
function stripOwner(row) {
|
|
98
|
+
const copy = { ...row };
|
|
99
|
+
for (const key of OWNER_COLUMNS)
|
|
100
|
+
delete copy[key];
|
|
101
|
+
return copy;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Write a project to `writer`. The caller has checked that `userId` owns the
|
|
105
|
+
* project. Returns the manifest that was written.
|
|
106
|
+
*/
|
|
107
|
+
export async function writeProjectArchive(options, writer) {
|
|
108
|
+
const { userId, storage } = options;
|
|
109
|
+
const project = await Project.findOwned(userId, options.projectId);
|
|
110
|
+
if (!project)
|
|
111
|
+
throw new Error("Project not found");
|
|
112
|
+
const records = await readProjectArchiveRecords(userId, project.id);
|
|
113
|
+
let totalBytes = 0;
|
|
114
|
+
let totalEntries = 0;
|
|
115
|
+
let directoryBytes = 22;
|
|
116
|
+
// Leave room for the multipart upload framing under the HTTP body limit.
|
|
117
|
+
const uploadLimit = MAX_PROJECT_ARCHIVE_BYTES - 64 * 1024;
|
|
118
|
+
const addEntry = async (name, source, entryOptions) => {
|
|
119
|
+
totalBytes += exportSourceSize(source);
|
|
120
|
+
totalEntries += 1;
|
|
121
|
+
directoryBytes += 46 + Buffer.byteLength(name);
|
|
122
|
+
if (totalEntries > MAX_PROJECT_ARCHIVE_ENTRIES) {
|
|
123
|
+
throw new ProjectArchiveError("Project exceeds the importable archive entry limit");
|
|
124
|
+
}
|
|
125
|
+
if (totalBytes > (options.maxBytes ?? MAX_PROJECT_ARCHIVE_BYTES)) {
|
|
126
|
+
throw new ProjectArchiveError("Project exceeds the importable archive size limit");
|
|
127
|
+
}
|
|
128
|
+
await writer.add(name, source, entryOptions);
|
|
129
|
+
if (writer.bytesWritten + directoryBytes > uploadLimit) {
|
|
130
|
+
throw new ProjectArchiveError("Project exceeds the importable upload size limit");
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const manifest = {
|
|
134
|
+
format: PROJECT_ARCHIVE_FORMAT,
|
|
135
|
+
version: PROJECT_ARCHIVE_VERSION,
|
|
136
|
+
created_at: new Date().toISOString(),
|
|
137
|
+
project: {
|
|
138
|
+
id: project.id,
|
|
139
|
+
name: project.name,
|
|
140
|
+
kind: project.kind,
|
|
141
|
+
thread_id: project.thread_id
|
|
142
|
+
},
|
|
143
|
+
counts: {},
|
|
144
|
+
assets: [],
|
|
145
|
+
workspace_files: [],
|
|
146
|
+
skipped: []
|
|
147
|
+
};
|
|
148
|
+
if (options.nodetoolVersion) {
|
|
149
|
+
manifest.nodetool_version = options.nodetoolVersion;
|
|
150
|
+
}
|
|
151
|
+
// A game keeps its source in a workspace. A game made before workspaces
|
|
152
|
+
// were filed under projects may point outside this one, so that workspace
|
|
153
|
+
// travels too, limited to the game's own folder.
|
|
154
|
+
const gameRoots = new Map();
|
|
155
|
+
for (const game of records.games) {
|
|
156
|
+
const id = String(game["workspace_id"]);
|
|
157
|
+
gameRoots.set(id, [
|
|
158
|
+
...(gameRoots.get(id) ?? []),
|
|
159
|
+
String(game["source_root"])
|
|
160
|
+
]);
|
|
161
|
+
}
|
|
162
|
+
const workspaceRows = records.workspaces.map((row) => new Workspace(row));
|
|
163
|
+
const projectWorkspaceIds = new Set(workspaceRows.map((row) => row.id));
|
|
164
|
+
for (const id of gameRoots.keys()) {
|
|
165
|
+
if (projectWorkspaceIds.has(id))
|
|
166
|
+
continue;
|
|
167
|
+
const row = await Workspace.find(userId, id);
|
|
168
|
+
if (!row) {
|
|
169
|
+
manifest.skipped.push({
|
|
170
|
+
kind: "workspace",
|
|
171
|
+
id,
|
|
172
|
+
reason: "A game's workspace no longer exists"
|
|
173
|
+
});
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
workspaceRows.push(row);
|
|
177
|
+
records.workspaces.push({
|
|
178
|
+
id: row.id,
|
|
179
|
+
name: row.name,
|
|
180
|
+
is_default: false,
|
|
181
|
+
created_at: row.created_at,
|
|
182
|
+
updated_at: row.updated_at
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
for (const row of records.assets) {
|
|
186
|
+
const asset = new Asset(row);
|
|
187
|
+
if (asset.content_type === "folder")
|
|
188
|
+
continue;
|
|
189
|
+
const source = await assetSource(storage, asset);
|
|
190
|
+
if (!source) {
|
|
191
|
+
manifest.skipped.push({
|
|
192
|
+
kind: "asset",
|
|
193
|
+
id: asset.id,
|
|
194
|
+
reason: "No stored media"
|
|
195
|
+
});
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const size = exportSourceSize(source);
|
|
199
|
+
if (size > MAX_ZIP_ENTRY_BYTES) {
|
|
200
|
+
manifest.skipped.push({
|
|
201
|
+
kind: "asset",
|
|
202
|
+
id: asset.id,
|
|
203
|
+
reason: "Larger than 4 GiB"
|
|
204
|
+
});
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
const file = assetEntryName(asset);
|
|
208
|
+
manifest.assets.push({
|
|
209
|
+
id: asset.id,
|
|
210
|
+
file,
|
|
211
|
+
bytes: size,
|
|
212
|
+
sha256: await sha256OfSource(source)
|
|
213
|
+
});
|
|
214
|
+
await addEntry(file, source);
|
|
215
|
+
}
|
|
216
|
+
for (const row of workspaceRows) {
|
|
217
|
+
const workspace = options.openWorkspace(row);
|
|
218
|
+
if (!workspace) {
|
|
219
|
+
manifest.skipped.push({
|
|
220
|
+
kind: "workspace",
|
|
221
|
+
id: row.id,
|
|
222
|
+
reason: "Workspace storage is unavailable"
|
|
223
|
+
});
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
const roots = projectWorkspaceIds.has(row.id)
|
|
227
|
+
? [""]
|
|
228
|
+
: (gameRoots.get(row.id) ?? []);
|
|
229
|
+
for (const root of roots) {
|
|
230
|
+
let entries;
|
|
231
|
+
try {
|
|
232
|
+
entries = await workspace.list(root, { recursive: true });
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
manifest.skipped.push({
|
|
236
|
+
kind: "workspace",
|
|
237
|
+
id: row.id,
|
|
238
|
+
reason: `Listing failed: ${error instanceof Error ? error.message : String(error)}`
|
|
239
|
+
});
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
for (const entry of entries) {
|
|
243
|
+
if (entry.isDirectory)
|
|
244
|
+
continue;
|
|
245
|
+
const bytes = await workspace.read(entry.path);
|
|
246
|
+
if (!bytes)
|
|
247
|
+
continue;
|
|
248
|
+
if (bytes.byteLength > MAX_ZIP_ENTRY_BYTES) {
|
|
249
|
+
manifest.skipped.push({
|
|
250
|
+
kind: "workspace_file",
|
|
251
|
+
id: `${row.id}/${entry.path}`,
|
|
252
|
+
reason: "Larger than 4 GiB"
|
|
253
|
+
});
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
const file = `workspaces/${row.id}/${entry.path}`;
|
|
257
|
+
manifest.workspace_files.push({
|
|
258
|
+
workspace_id: row.id,
|
|
259
|
+
path: entry.path,
|
|
260
|
+
file,
|
|
261
|
+
bytes: bytes.byteLength,
|
|
262
|
+
sha256: createHash("sha256").update(bytes).digest("hex")
|
|
263
|
+
});
|
|
264
|
+
await addEntry(file, bytes);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const assetIds = new Set(records.assets.map((row) => String(row["id"])));
|
|
269
|
+
const written = {};
|
|
270
|
+
for (const name of PROJECT_ARCHIVE_TABLE_NAMES) {
|
|
271
|
+
written[name] = records[name].map((row) => {
|
|
272
|
+
const copy = stripOwner(row);
|
|
273
|
+
if (name === "workspaces")
|
|
274
|
+
delete copy["path"];
|
|
275
|
+
// A root-level asset's parent is the owner's id.
|
|
276
|
+
if (name === "assets" && !assetIds.has(String(copy["parent_id"]))) {
|
|
277
|
+
copy["parent_id"] = null;
|
|
278
|
+
}
|
|
279
|
+
return copy;
|
|
280
|
+
});
|
|
281
|
+
manifest.counts[name] = written[name].length;
|
|
282
|
+
}
|
|
283
|
+
await addEntry("records.json", strToU8(JSON.stringify(written)), {
|
|
284
|
+
compress: true
|
|
285
|
+
});
|
|
286
|
+
await addEntry("manifest.json", strToU8(JSON.stringify(manifest, null, 2)), { compress: true });
|
|
287
|
+
return manifest;
|
|
288
|
+
}
|
|
289
|
+
// ---------------------------------------------------------------------------
|
|
290
|
+
// Import
|
|
291
|
+
// ---------------------------------------------------------------------------
|
|
292
|
+
const RESOURCE_ID_TOKEN = /(?<![0-9a-f])[0-9a-f]{32}(?![0-9a-f])/g;
|
|
293
|
+
/** Rewrites every exported id inside a value to its imported id. */
|
|
294
|
+
class IdRemapper {
|
|
295
|
+
ids;
|
|
296
|
+
constructor(ids) {
|
|
297
|
+
this.ids = ids;
|
|
298
|
+
}
|
|
299
|
+
string(value) {
|
|
300
|
+
const exact = this.ids.get(value);
|
|
301
|
+
if (exact)
|
|
302
|
+
return exact;
|
|
303
|
+
return value.replace(RESOURCE_ID_TOKEN, (token) => this.ids.get(token) ?? token);
|
|
304
|
+
}
|
|
305
|
+
value(value) {
|
|
306
|
+
if (typeof value === "string")
|
|
307
|
+
return this.string(value);
|
|
308
|
+
if (Array.isArray(value))
|
|
309
|
+
return value.map((item) => this.value(item));
|
|
310
|
+
if (value && typeof value === "object") {
|
|
311
|
+
return Object.fromEntries(Object.entries(value).map(([key, child]) => [
|
|
312
|
+
this.string(key),
|
|
313
|
+
this.value(child)
|
|
314
|
+
]));
|
|
315
|
+
}
|
|
316
|
+
return value;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
export class ProjectArchiveError extends Error {
|
|
320
|
+
constructor(message) {
|
|
321
|
+
super(message);
|
|
322
|
+
this.name = "ProjectArchiveError";
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/** A managed folder for an imported workspace, the shape `isManaged` accepts. */
|
|
326
|
+
export async function managedImportWorkspacePath(userId, workspaceId) {
|
|
327
|
+
const segment = createHash("sha256").update(workspaceId).digest("hex");
|
|
328
|
+
if (workspaceStorageKind() === "cloud") {
|
|
329
|
+
return `${managedWorkspaceKey(userId)}/projects/${segment}`;
|
|
330
|
+
}
|
|
331
|
+
const dir = nodePath.join(getManagedWorkspaceDir(userId), "projects", segment);
|
|
332
|
+
return dir;
|
|
333
|
+
}
|
|
334
|
+
function parseJsonEntry(entries, name, schema) {
|
|
335
|
+
const bytes = entries[name];
|
|
336
|
+
if (!bytes)
|
|
337
|
+
throw new ProjectArchiveError(`Project file has no ${name}`);
|
|
338
|
+
let raw;
|
|
339
|
+
try {
|
|
340
|
+
raw = JSON.parse(strFromU8(bytes));
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
throw new ProjectArchiveError(`${name} is not valid JSON`);
|
|
344
|
+
}
|
|
345
|
+
const parsed = schema.safeParse(raw);
|
|
346
|
+
if (!parsed.success) {
|
|
347
|
+
throw new ProjectArchiveError(`${name} is invalid: ${parsed.error.message}`);
|
|
348
|
+
}
|
|
349
|
+
return parsed.data;
|
|
350
|
+
}
|
|
351
|
+
function sha256(bytes) {
|
|
352
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
353
|
+
}
|
|
354
|
+
/** Reads a project file's manifest without importing it. */
|
|
355
|
+
export function readProjectArchiveManifest(zipBytes) {
|
|
356
|
+
const entries = unzipSync(zipBytes, {
|
|
357
|
+
filter: (file) => file.name === "manifest.json"
|
|
358
|
+
});
|
|
359
|
+
return parseJsonEntry(entries, "manifest.json", manifestSchema);
|
|
360
|
+
}
|
|
361
|
+
/** Import a project file as a new project owned by `userId`. */
|
|
362
|
+
export async function importProjectArchive(zipBytes, options) {
|
|
363
|
+
const { userId, storage } = options;
|
|
364
|
+
let entries;
|
|
365
|
+
try {
|
|
366
|
+
entries = unzipBounded(zipBytes, {
|
|
367
|
+
maxBytes: options.maxBytes ?? MAX_PROJECT_ARCHIVE_BYTES,
|
|
368
|
+
maxEntries: MAX_PROJECT_ARCHIVE_ENTRIES
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
throw new ProjectArchiveError(error instanceof Error ? error.message : String(error));
|
|
373
|
+
}
|
|
374
|
+
const manifest = parseJsonEntry(entries, "manifest.json", manifestSchema);
|
|
375
|
+
if (manifest.version > PROJECT_ARCHIVE_VERSION) {
|
|
376
|
+
throw new ProjectArchiveError(`Project file version ${manifest.version} is newer than this install reads (${PROJECT_ARCHIVE_VERSION})`);
|
|
377
|
+
}
|
|
378
|
+
const rawRecords = parseJsonEntry(entries, "records.json", recordsSchema);
|
|
379
|
+
const records = {};
|
|
380
|
+
for (const name of PROJECT_ARCHIVE_TABLE_NAMES) {
|
|
381
|
+
records[name] = rawRecords[name] ?? [];
|
|
382
|
+
}
|
|
383
|
+
// Fresh ids for the project and every row.
|
|
384
|
+
const ids = new Map();
|
|
385
|
+
const newProjectId = createTimeOrderedUuid();
|
|
386
|
+
ids.set(manifest.project.id, newProjectId);
|
|
387
|
+
for (const name of PROJECT_ARCHIVE_TABLE_NAMES) {
|
|
388
|
+
const key = projectArchivePrimaryKey(name);
|
|
389
|
+
for (const row of records[name]) {
|
|
390
|
+
const id = row[key];
|
|
391
|
+
if (typeof id !== "string" || id === "") {
|
|
392
|
+
throw new ProjectArchiveError(`A ${name} row has no ${key}`);
|
|
393
|
+
}
|
|
394
|
+
if (ids.has(id)) {
|
|
395
|
+
throw new ProjectArchiveError(`Duplicate id ${id} in ${name}`);
|
|
396
|
+
}
|
|
397
|
+
ids.set(id, createTimeOrderedUuid());
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
const tableIds = new Map(PROJECT_ARCHIVE_TABLE_NAMES.map((name) => [
|
|
401
|
+
name, new Set(records[name].map((row) => row[projectArchivePrimaryKey(name)]))
|
|
402
|
+
]));
|
|
403
|
+
for (const name of PROJECT_ARCHIVE_TABLE_NAMES) {
|
|
404
|
+
const spec = PROJECT_ARCHIVE_TABLES[name];
|
|
405
|
+
if (!("parent" in spec))
|
|
406
|
+
continue;
|
|
407
|
+
const parentIds = tableIds.get(spec.parent.name);
|
|
408
|
+
for (const row of records[name]) {
|
|
409
|
+
if (!parentIds?.has(row[spec.parent.column])) {
|
|
410
|
+
throw new ProjectArchiveError(`${name}.${spec.parent.column} must name a row in ${spec.parent.name}`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
for (const row of records.games) {
|
|
415
|
+
if (!tableIds.get("workspaces")?.has(row["workspace_id"])) {
|
|
416
|
+
throw new ProjectArchiveError("games.workspace_id must name an archived workspace");
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
const remap = new IdRemapper(ids);
|
|
420
|
+
const workspacePath = options.workspacePath ?? managedImportWorkspacePath;
|
|
421
|
+
const imported = {};
|
|
422
|
+
for (const name of PROJECT_ARCHIVE_TABLE_NAMES) {
|
|
423
|
+
const columns = new Set(projectArchiveColumns(name));
|
|
424
|
+
const optionalRefs = OPTIONAL_REFERENCES[name] ?? {};
|
|
425
|
+
imported[name] = records[name].map((source) => {
|
|
426
|
+
const row = remap.value(source);
|
|
427
|
+
if (columns.has("user_id"))
|
|
428
|
+
row["user_id"] = userId;
|
|
429
|
+
if (columns.has("project_id"))
|
|
430
|
+
row["project_id"] = newProjectId;
|
|
431
|
+
// A link to something the file does not carry would name a row on the
|
|
432
|
+
// exporting install, so it is dropped rather than left dangling.
|
|
433
|
+
for (const [ref, table] of Object.entries(optionalRefs)) {
|
|
434
|
+
if (source[ref] != null && (!table || !tableIds.get(table)?.has(source[ref])))
|
|
435
|
+
row[ref] = null;
|
|
436
|
+
}
|
|
437
|
+
return row;
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
for (const [index, row] of imported.assets.entries()) {
|
|
441
|
+
// A root-level asset's parent is its owner's id, which differs here.
|
|
442
|
+
if (!tableIds.get("assets")?.has(records.assets[index]["parent_id"])) {
|
|
443
|
+
row["parent_id"] = userId;
|
|
444
|
+
}
|
|
445
|
+
// An external path names a file on the exporting machine. Kept, it would
|
|
446
|
+
// let a file point an asset at any path on this one.
|
|
447
|
+
row["external_path"] = null;
|
|
448
|
+
}
|
|
449
|
+
// An import never publishes anything.
|
|
450
|
+
for (const row of imported.workflows)
|
|
451
|
+
row["access"] = "private";
|
|
452
|
+
const missing = [];
|
|
453
|
+
const checksumMismatches = [];
|
|
454
|
+
const storedAssets = [];
|
|
455
|
+
const createdWorkspaces = [];
|
|
456
|
+
try {
|
|
457
|
+
const workspaces = new Map();
|
|
458
|
+
for (const [index, row] of imported.workspaces.entries()) {
|
|
459
|
+
row["path"] = await workspacePath(userId, String(row["id"]));
|
|
460
|
+
row["is_default"] = false;
|
|
461
|
+
const opened = options.openWorkspace(new Workspace(row));
|
|
462
|
+
if (!opened) {
|
|
463
|
+
if (workspaceStorageKind() !== "cloud")
|
|
464
|
+
await rm(String(row["path"]), { recursive: true, force: true });
|
|
465
|
+
throw new ProjectArchiveError("Workspace storage is unavailable");
|
|
466
|
+
}
|
|
467
|
+
createdWorkspaces.push(opened);
|
|
468
|
+
workspaces.set(String(records.workspaces[index]["id"]), opened);
|
|
469
|
+
}
|
|
470
|
+
// Asset bytes.
|
|
471
|
+
const assetRows = new Map(imported.assets.map((row, index) => [
|
|
472
|
+
String(records.assets[index]["id"]),
|
|
473
|
+
row
|
|
474
|
+
]));
|
|
475
|
+
for (const entry of manifest.assets) {
|
|
476
|
+
const row = assetRows.get(entry.id);
|
|
477
|
+
if (!row)
|
|
478
|
+
continue;
|
|
479
|
+
const bytes = entries[entry.file];
|
|
480
|
+
if (!bytes) {
|
|
481
|
+
missing.push(entry.file);
|
|
482
|
+
continue;
|
|
483
|
+
}
|
|
484
|
+
if (sha256(bytes) !== entry.sha256)
|
|
485
|
+
checksumMismatches.push(entry.file);
|
|
486
|
+
const assetId = String(row["id"]);
|
|
487
|
+
const contentType = String(row["content_type"]);
|
|
488
|
+
row["size"] = bytes.byteLength;
|
|
489
|
+
storedAssets.push({ assetId, contentType });
|
|
490
|
+
if (options.storeAssetBytes) {
|
|
491
|
+
await options.storeAssetBytes({ userId, assetId, contentType, bytes });
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
await storage.store(getAssetStorageKey(userId, assetId, contentType), bytes, contentType);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
// Versioned game drafts name a digest of their contents. Rehash after
|
|
498
|
+
// rewriting IDs, then update both the filenames and history references.
|
|
499
|
+
const draftVersions = new Map();
|
|
500
|
+
const draftPaths = new Map();
|
|
501
|
+
for (const entry of manifest.workspace_files) {
|
|
502
|
+
const match = /\/drafts\/([a-f0-9]{64}(?:\.[A-Za-z0-9_-]+\.[a-f0-9]{32})?)\.json$/.exec(entry.path);
|
|
503
|
+
const bytes = entries[entry.file];
|
|
504
|
+
if (!match || !bytes)
|
|
505
|
+
continue;
|
|
506
|
+
const previous = match[1];
|
|
507
|
+
const rewritten = remapJsonText(bytes, remap);
|
|
508
|
+
const next = sha256(rewritten) + remap.string(previous.slice(64));
|
|
509
|
+
draftVersions.set(previous, next);
|
|
510
|
+
draftPaths.set(entry.path, remap.string(entry.path.slice(0, -previous.length - 5)) + next + ".json");
|
|
511
|
+
}
|
|
512
|
+
for (const [index, row] of imported.games.entries()) {
|
|
513
|
+
const original = records.games[index];
|
|
514
|
+
const previous = original?.["draft_version_id"];
|
|
515
|
+
if (typeof previous === "string" && draftVersions.has(previous))
|
|
516
|
+
row["draft_version_id"] = draftVersions.get(previous);
|
|
517
|
+
}
|
|
518
|
+
for (const [index, row] of imported.game_draft_changes.entries()) {
|
|
519
|
+
const previous = records.game_draft_changes[index]?.["before_digest"];
|
|
520
|
+
if (typeof previous === "string" && draftVersions.has(previous))
|
|
521
|
+
row["before_digest"] = draftVersions.get(previous);
|
|
522
|
+
}
|
|
523
|
+
for (const entry of manifest.workspace_files) {
|
|
524
|
+
const workspace = workspaces.get(entry.workspace_id);
|
|
525
|
+
if (!workspace)
|
|
526
|
+
continue;
|
|
527
|
+
const bytes = entries[entry.file];
|
|
528
|
+
if (!bytes) {
|
|
529
|
+
missing.push(entry.file);
|
|
530
|
+
continue;
|
|
531
|
+
}
|
|
532
|
+
if (sha256(bytes) !== entry.sha256)
|
|
533
|
+
checksumMismatches.push(entry.file);
|
|
534
|
+
const path = draftPaths.get(entry.path) ?? remap.string(entry.path);
|
|
535
|
+
// Game sources and drafts are JSON that names their own ids.
|
|
536
|
+
const data = path.endsWith(".json")
|
|
537
|
+
? remapJsonText(bytes, remap)
|
|
538
|
+
: bytes;
|
|
539
|
+
await workspace.write(path, data);
|
|
540
|
+
}
|
|
541
|
+
const project = new Project({
|
|
542
|
+
id: newProjectId,
|
|
543
|
+
user_id: userId,
|
|
544
|
+
name: options.name?.trim() || manifest.project.name,
|
|
545
|
+
// Every account has exactly one Personal project, so its copy is an
|
|
546
|
+
// ordinary named project.
|
|
547
|
+
kind: manifest.project.kind === PERSONAL_PROJECT_KIND
|
|
548
|
+
? ""
|
|
549
|
+
: manifest.project.kind,
|
|
550
|
+
thread_id: null
|
|
551
|
+
});
|
|
552
|
+
const threadId = manifest.project.thread_id;
|
|
553
|
+
project.thread_id = typeof threadId === "string" && tableIds.get("threads")?.has(threadId) ? remap.string(threadId) : null;
|
|
554
|
+
project.beforeSave();
|
|
555
|
+
await persistProjectArchive({
|
|
556
|
+
project: {
|
|
557
|
+
id: project.id,
|
|
558
|
+
user_id: project.user_id,
|
|
559
|
+
name: project.name,
|
|
560
|
+
kind: project.kind,
|
|
561
|
+
archived_at: null,
|
|
562
|
+
deleted_at: null,
|
|
563
|
+
thread_id: project.thread_id,
|
|
564
|
+
created_at: project.created_at,
|
|
565
|
+
updated_at: project.updated_at
|
|
566
|
+
},
|
|
567
|
+
records: imported
|
|
568
|
+
});
|
|
569
|
+
const counts = {};
|
|
570
|
+
for (const name of PROJECT_ARCHIVE_TABLE_NAMES) {
|
|
571
|
+
counts[name] = imported[name].length;
|
|
572
|
+
}
|
|
573
|
+
return {
|
|
574
|
+
project,
|
|
575
|
+
counts,
|
|
576
|
+
missing,
|
|
577
|
+
checksumMismatches,
|
|
578
|
+
skipped: manifest.skipped
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
catch (error) {
|
|
582
|
+
await Promise.allSettled([
|
|
583
|
+
...storedAssets.map(({ assetId, contentType }) => options.removeAssetBytes
|
|
584
|
+
? options.removeAssetBytes(userId, assetId, contentType)
|
|
585
|
+
: storage.delete(storage.uriForKey(getAssetStorageKey(userId, assetId, contentType)))),
|
|
586
|
+
...createdWorkspaces.map(async (workspace) => {
|
|
587
|
+
try {
|
|
588
|
+
await workspace.deleteAll("");
|
|
589
|
+
}
|
|
590
|
+
finally {
|
|
591
|
+
if (workspace.localDir)
|
|
592
|
+
await rm(workspace.localDir, { recursive: true, force: true });
|
|
593
|
+
}
|
|
594
|
+
})
|
|
595
|
+
]);
|
|
596
|
+
throw error;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
/** A JSON file's text with exported ids rewritten; other bytes unchanged. */
|
|
600
|
+
function remapJsonText(bytes, remap) {
|
|
601
|
+
let text;
|
|
602
|
+
try {
|
|
603
|
+
text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
604
|
+
}
|
|
605
|
+
catch {
|
|
606
|
+
return bytes;
|
|
607
|
+
}
|
|
608
|
+
return strToU8(remap.string(text));
|
|
609
|
+
}
|
|
610
|
+
//# sourceMappingURL=project-archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-archive.js","sourceRoot":"","sources":["../../src/lib/project-archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -99,4 +99,19 @@ export declare function isPublicAtlasCloudWebhookRequest(pathname: string, metho
|
|
|
99
99
|
* covered by the global `@fastify/rate-limit` plugin registered before auth.
|
|
100
100
|
*/
|
|
101
101
|
export declare function isPublicAuthExemptRoute(pathname: string, method: string): boolean;
|
|
102
|
+
/**
|
|
103
|
+
* The path the router will match for `url`. find-my-way runs `decodeURI` on
|
|
104
|
+
* the path before choosing a route, so `/%61pi/workflows` reaches the
|
|
105
|
+
* `/api/workflows` handler. Every auth decision must test this decoded form,
|
|
106
|
+
* never the raw `req.url`. Returns null for malformed escapes, which the
|
|
107
|
+
* router refuses anyway.
|
|
108
|
+
*/
|
|
109
|
+
export declare function routedPathname(url: string): string | null;
|
|
110
|
+
/**
|
|
111
|
+
* GETs the bundled frontend serves without auth: anything outside the API,
|
|
112
|
+
* WebSocket, OpenAI-compatible, tRPC and MCP prefixes. `GET /mcp` is the MCP
|
|
113
|
+
* SSE stream, so it stays behind auth to bind the session's user. A path that
|
|
114
|
+
* does not decode is never treated as a static asset.
|
|
115
|
+
*/
|
|
116
|
+
export declare function isStaticAppRequest(pathname: string | null, method: string): boolean;
|
|
102
117
|
//# sourceMappingURL=public-routes.d.ts.map
|