studiograph 1.3.48-next.21 → 1.3.48-next.211
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 +26 -16
- package/dist/agent/agent-pool.d.ts +87 -3
- package/dist/agent/agent-pool.js +188 -15
- package/dist/agent/agent-pool.js.map +1 -1
- package/dist/agent/followups.d.ts +34 -0
- package/dist/agent/followups.js +52 -0
- package/dist/agent/followups.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +101 -4
- package/dist/agent/orchestrator.js +464 -66
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +34 -0
- package/dist/agent/prompts/entity-types-section.js +76 -0
- package/dist/agent/prompts/entity-types-section.js.map +1 -0
- package/dist/agent/prompts/system.md +112 -54
- package/dist/agent/skill-loader.d.ts +30 -17
- package/dist/agent/skill-loader.js +63 -30
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/skills/artifact-canvas/skill.md +152 -0
- package/dist/agent/skills/entity-schema.md +75 -431
- package/dist/agent/skills/interview/entity-templates.md +38 -37
- package/dist/agent/skills/interview/question-domains.md +54 -49
- package/dist/agent/skills/interview/skill.md +84 -16
- package/dist/agent/skills/schema-rules.md +28 -28
- package/dist/agent/tools/artifact-tools.d.ts +124 -0
- package/dist/agent/tools/artifact-tools.js +207 -0
- package/dist/agent/tools/artifact-tools.js.map +1 -0
- package/dist/agent/tools/capture-tools.d.ts +31 -0
- package/dist/agent/tools/capture-tools.js +40 -0
- package/dist/agent/tools/capture-tools.js.map +1 -0
- package/dist/agent/tools/folder-tools.d.ts +47 -0
- package/dist/agent/tools/folder-tools.js +249 -0
- package/dist/agent/tools/folder-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +6 -5
- package/dist/agent/tools/fs-tools.js +5 -5
- package/dist/agent/tools/fs-tools.js.map +1 -1
- package/dist/agent/tools/graph-tools.d.ts +48 -72
- package/dist/agent/tools/graph-tools.js +852 -329
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/history-tools.d.ts +95 -0
- package/dist/agent/tools/history-tools.js +461 -0
- package/dist/agent/tools/history-tools.js.map +1 -0
- package/dist/agent/tools/load-skill.d.ts +6 -5
- package/dist/agent/tools/load-skill.js +3 -3
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +5 -4
- package/dist/agent/tools/ops-tools.js +130 -236
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +87 -17
- package/dist/agent/tools/permission-tools.js +233 -43
- package/dist/agent/tools/permission-tools.js.map +1 -1
- package/dist/agent/tools/tool-loader.js +5 -4
- package/dist/agent/tools/tool-loader.js.map +1 -1
- package/dist/agent/tools/web-tools.js +58 -9
- package/dist/agent/tools/web-tools.js.map +1 -1
- package/dist/cli/commands/about.d.ts +1 -0
- package/dist/cli/commands/about.js +55 -3
- package/dist/cli/commands/about.js.map +1 -1
- package/dist/cli/commands/admin/audit-workspace.d.ts +23 -0
- package/dist/cli/commands/admin/audit-workspace.js +133 -0
- package/dist/cli/commands/admin/audit-workspace.js.map +1 -0
- package/dist/cli/commands/admin/audit.d.ts +21 -0
- package/dist/cli/commands/admin/audit.js +174 -0
- package/dist/cli/commands/admin/audit.js.map +1 -0
- package/dist/cli/commands/admin/backup.d.ts +54 -0
- package/dist/cli/commands/admin/backup.js +207 -0
- package/dist/cli/commands/admin/backup.js.map +1 -0
- package/dist/cli/commands/admin/folder.d.ts +11 -0
- package/dist/cli/commands/{collection.js → admin/folder.js} +33 -32
- package/dist/cli/commands/admin/folder.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +16 -0
- package/dist/cli/commands/admin/index.js +46 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate-assets.d.ts +53 -0
- package/dist/cli/commands/admin/migrate-assets.js +184 -0
- package/dist/cli/commands/admin/migrate-assets.js.map +1 -0
- package/dist/cli/commands/admin/migrate.d.ts +56 -0
- package/dist/cli/commands/admin/migrate.js +263 -0
- package/dist/cli/commands/admin/migrate.js.map +1 -0
- package/dist/cli/commands/admin/restore.d.ts +24 -0
- package/dist/cli/commands/admin/restore.js +228 -0
- package/dist/cli/commands/admin/restore.js.map +1 -0
- package/dist/cli/commands/admin/secrets.d.ts +23 -0
- package/dist/cli/commands/admin/secrets.js +256 -0
- package/dist/cli/commands/admin/secrets.js.map +1 -0
- package/dist/cli/commands/admin/settings.d.ts +28 -0
- package/dist/cli/commands/admin/settings.js +284 -0
- package/dist/cli/commands/admin/settings.js.map +1 -0
- package/dist/cli/commands/admin/token.d.ts +42 -0
- package/dist/cli/commands/admin/token.js +126 -0
- package/dist/cli/commands/admin/token.js.map +1 -0
- package/dist/cli/commands/admin/transfer-ownership.d.ts +15 -0
- package/dist/cli/commands/admin/transfer-ownership.js +106 -0
- package/dist/cli/commands/admin/transfer-ownership.js.map +1 -0
- package/dist/cli/commands/admin/user.d.ts +11 -0
- package/dist/cli/commands/admin/user.js +187 -0
- package/dist/cli/commands/admin/user.js.map +1 -0
- package/dist/cli/commands/clone.d.ts +25 -3
- package/dist/cli/commands/clone.js +142 -36
- package/dist/cli/commands/clone.js.map +1 -1
- package/dist/cli/commands/config.d.ts +23 -107
- package/dist/cli/commands/config.js +52 -260
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/connector.d.ts +10 -13
- package/dist/cli/commands/connector.js +16 -58
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.js +215 -68
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/index.js +5 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +10 -30
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.js +54 -6
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/r2.d.ts +3 -0
- package/dist/cli/commands/r2.js +223 -204
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.js +65 -12
- package/dist/cli/commands/redeploy.js.map +1 -1
- package/dist/cli/commands/reset.d.ts +22 -6
- package/dist/cli/commands/reset.js +132 -34
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/serve.js +231 -26
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +237 -227
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/crypto-bundle.d.ts +39 -0
- package/dist/cli/crypto-bundle.js +94 -0
- package/dist/cli/crypto-bundle.js.map +1 -0
- package/dist/cli/index.js +24 -26
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/railway-pin.d.ts +68 -0
- package/dist/cli/railway-pin.js +96 -0
- package/dist/cli/railway-pin.js.map +1 -0
- package/dist/cli/railway-provisioning.d.ts +53 -0
- package/dist/cli/railway-provisioning.js +85 -0
- package/dist/cli/railway-provisioning.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +30 -49
- package/dist/cli/setup-wizard.js +39 -40
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/core/accent-palette.d.ts +22 -0
- package/dist/core/accent-palette.js +47 -0
- package/dist/core/accent-palette.js.map +1 -0
- package/dist/core/artifact-asset-urls.d.ts +51 -0
- package/dist/core/artifact-asset-urls.js +79 -0
- package/dist/core/artifact-asset-urls.js.map +1 -0
- package/dist/core/artifact-bundle.d.ts +69 -0
- package/dist/core/artifact-bundle.js +305 -0
- package/dist/core/artifact-bundle.js.map +1 -0
- package/dist/core/artifact-escape.d.ts +5 -0
- package/dist/core/artifact-escape.js +26 -0
- package/dist/core/artifact-escape.js.map +1 -0
- package/dist/core/artifact-export.d.ts +17 -0
- package/dist/core/artifact-export.js +529 -0
- package/dist/core/artifact-export.js.map +1 -0
- package/dist/core/cell-anchor.d.ts +29 -0
- package/dist/core/cell-anchor.js +53 -0
- package/dist/core/cell-anchor.js.map +1 -0
- package/dist/core/comment-anchor.d.ts +41 -0
- package/dist/core/comment-anchor.js +147 -0
- package/dist/core/comment-anchor.js.map +1 -0
- package/dist/core/commit-messages.d.ts +57 -0
- package/dist/core/commit-messages.js +85 -0
- package/dist/core/commit-messages.js.map +1 -0
- package/dist/core/embeds.d.ts +96 -0
- package/dist/core/embeds.js +196 -0
- package/dist/core/embeds.js.map +1 -0
- package/dist/core/entity-body-templates.d.ts +21 -0
- package/dist/core/entity-body-templates.js +67 -0
- package/dist/core/entity-body-templates.js.map +1 -0
- package/dist/core/entity-types-catalog.d.ts +65 -0
- package/dist/core/entity-types-catalog.js +142 -0
- package/dist/core/entity-types-catalog.js.map +1 -0
- package/dist/core/field-library.d.ts +62 -0
- package/dist/core/field-library.js +129 -0
- package/dist/core/field-library.js.map +1 -0
- package/dist/core/folder-paths.d.ts +41 -0
- package/dist/core/folder-paths.js +95 -0
- package/dist/core/folder-paths.js.map +1 -0
- package/dist/core/folder-sidecar.d.ts +36 -0
- package/dist/core/folder-sidecar.js +91 -0
- package/dist/core/folder-sidecar.js.map +1 -0
- package/dist/core/format-registry.d.ts +170 -0
- package/dist/core/format-registry.js +412 -0
- package/dist/core/format-registry.js.map +1 -0
- package/dist/core/graph.d.ts +773 -14
- package/dist/core/graph.js +2269 -308
- package/dist/core/graph.js.map +1 -1
- package/dist/core/history-diff.d.ts +35 -0
- package/dist/core/history-diff.js +114 -0
- package/dist/core/history-diff.js.map +1 -0
- package/dist/core/refs.d.ts +41 -0
- package/dist/core/refs.js +80 -0
- package/dist/core/refs.js.map +1 -0
- package/dist/core/schema-registry.d.ts +66 -0
- package/dist/core/schema-registry.js +198 -37
- package/dist/core/schema-registry.js.map +1 -1
- package/dist/core/schemas/connector.d.ts +67 -0
- package/dist/core/schemas/connector.js +100 -0
- package/dist/core/schemas/connector.js.map +1 -0
- package/dist/core/schemas/workspace.d.ts +122 -0
- package/dist/core/schemas/workspace.js +211 -0
- package/dist/core/schemas/workspace.js.map +1 -0
- package/dist/core/secrets/SecretStore.d.ts +77 -0
- package/dist/core/secrets/SecretStore.js +13 -0
- package/dist/core/secrets/SecretStore.js.map +1 -0
- package/dist/core/secrets/SettingsResolver.d.ts +54 -0
- package/dist/core/secrets/SettingsResolver.js +80 -0
- package/dist/core/secrets/SettingsResolver.js.map +1 -0
- package/dist/core/secrets/SettingsStore.d.ts +30 -0
- package/dist/core/secrets/SettingsStore.js +9 -0
- package/dist/core/secrets/SettingsStore.js.map +1 -0
- package/dist/core/secrets/SqliteEncryptedStore.d.ts +90 -0
- package/dist/core/secrets/SqliteEncryptedStore.js +598 -0
- package/dist/core/secrets/SqliteEncryptedStore.js.map +1 -0
- package/dist/core/secrets/audit.d.ts +36 -0
- package/dist/core/secrets/audit.js +60 -0
- package/dist/core/secrets/audit.js.map +1 -0
- package/dist/core/secrets/auth-db-migration.d.ts +129 -0
- package/dist/core/secrets/auth-db-migration.js +653 -0
- package/dist/core/secrets/auth-db-migration.js.map +1 -0
- package/dist/core/secrets/bundle.d.ts +141 -0
- package/dist/core/secrets/bundle.js +435 -0
- package/dist/core/secrets/bundle.js.map +1 -0
- package/dist/core/secrets/dual-write.d.ts +81 -0
- package/dist/core/secrets/dual-write.js +247 -0
- package/dist/core/secrets/dual-write.js.map +1 -0
- package/dist/core/secrets/encryption.d.ts +44 -0
- package/dist/core/secrets/encryption.js +97 -0
- package/dist/core/secrets/encryption.js.map +1 -0
- package/dist/core/secrets/index.d.ts +49 -0
- package/dist/core/secrets/index.js +74 -0
- package/dist/core/secrets/index.js.map +1 -0
- package/dist/core/secrets/master-key.d.ts +38 -0
- package/dist/core/secrets/master-key.js +122 -0
- package/dist/core/secrets/master-key.js.map +1 -0
- package/dist/core/secrets/probes/anthropic.d.ts +98 -0
- package/dist/core/secrets/probes/anthropic.js +300 -0
- package/dist/core/secrets/probes/anthropic.js.map +1 -0
- package/dist/core/secrets/probes/brave.d.ts +9 -0
- package/dist/core/secrets/probes/brave.js +15 -0
- package/dist/core/secrets/probes/brave.js.map +1 -0
- package/dist/core/secrets/probes/r2.d.ts +15 -0
- package/dist/core/secrets/probes/r2.js +14 -0
- package/dist/core/secrets/probes/r2.js.map +1 -0
- package/dist/core/secrets/probes/tavily.d.ts +18 -0
- package/dist/core/secrets/probes/tavily.js +58 -0
- package/dist/core/secrets/probes/tavily.js.map +1 -0
- package/dist/core/secrets/probes/voyage.d.ts +13 -0
- package/dist/core/secrets/probes/voyage.js +52 -0
- package/dist/core/secrets/probes/voyage.js.map +1 -0
- package/dist/core/secrets/r2-structural-migration.d.ts +39 -0
- package/dist/core/secrets/r2-structural-migration.js +109 -0
- package/dist/core/secrets/r2-structural-migration.js.map +1 -0
- package/dist/core/secrets/read-flip.d.ts +59 -0
- package/dist/core/secrets/read-flip.js +87 -0
- package/dist/core/secrets/read-flip.js.map +1 -0
- package/dist/core/secrets/registry.d.ts +188 -0
- package/dist/core/secrets/registry.js +616 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/types.d.ts +77 -483
- package/dist/core/types.js +25 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +75 -12
- package/dist/core/user-config.js +155 -14
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +786 -1373
- package/dist/core/validation.js +458 -147
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +87 -14
- package/dist/core/workspace-manager.js +222 -94
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +19 -5
- package/dist/core/workspace.js +67 -39
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/comment-virtual-entity.d.ts +36 -0
- package/dist/mcp/comment-virtual-entity.js +71 -0
- package/dist/mcp/comment-virtual-entity.js.map +1 -0
- package/dist/mcp/connector-manager.d.ts +72 -2
- package/dist/mcp/connector-manager.js +211 -32
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/oauth-provider.d.ts +0 -5
- package/dist/mcp/oauth-provider.js +10 -22
- package/dist/mcp/oauth-provider.js.map +1 -1
- package/dist/mcp/oauth-registry.d.ts +46 -8
- package/dist/mcp/oauth-registry.js +52 -13
- package/dist/mcp/oauth-registry.js.map +1 -1
- package/dist/mcp/server-discovery.d.ts +73 -0
- package/dist/mcp/server-discovery.js +164 -0
- package/dist/mcp/server-discovery.js.map +1 -0
- package/dist/mcp/server.d.ts +24 -3
- package/dist/mcp/server.js +53 -10
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/state-signer.d.ts +62 -0
- package/dist/mcp/state-signer.js +205 -0
- package/dist/mcp/state-signer.js.map +1 -0
- package/dist/mcp/stdio-proxy.d.ts +67 -0
- package/dist/mcp/stdio-proxy.js +149 -0
- package/dist/mcp/stdio-proxy.js.map +1 -0
- package/dist/mcp/tools.d.ts +65 -2
- package/dist/mcp/tools.js +1772 -124
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/__tests__/helpers/graph-api.d.ts +16 -0
- package/dist/server/__tests__/helpers/graph-api.js +16 -0
- package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
- package/dist/server/artifact-asset-mint.d.ts +41 -0
- package/dist/server/artifact-asset-mint.js +59 -0
- package/dist/server/artifact-asset-mint.js.map +1 -0
- package/dist/server/asset-index-queue.d.ts +98 -0
- package/dist/server/asset-index-queue.js +193 -0
- package/dist/server/asset-index-queue.js.map +1 -0
- package/dist/server/body-write-coordinator.d.ts +161 -0
- package/dist/server/body-write-coordinator.js +182 -0
- package/dist/server/body-write-coordinator.js.map +1 -0
- package/dist/server/cloud-billing-flow.d.ts +32 -0
- package/dist/server/cloud-billing-flow.js +75 -0
- package/dist/server/cloud-billing-flow.js.map +1 -0
- package/dist/server/commit-audit.d.ts +26 -0
- package/dist/server/commit-audit.js +30 -0
- package/dist/server/commit-audit.js.map +1 -0
- package/dist/server/index.d.ts +29 -3
- package/dist/server/index.js +657 -269
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/sanitize.d.ts +46 -0
- package/dist/server/middleware/sanitize.js +182 -0
- package/dist/server/middleware/sanitize.js.map +1 -0
- package/dist/server/routes/artifact-export-api.d.ts +11 -0
- package/dist/server/routes/artifact-export-api.js +159 -0
- package/dist/server/routes/artifact-export-api.js.map +1 -0
- package/dist/server/routes/asset-api.d.ts +76 -1
- package/dist/server/routes/asset-api.js +761 -61
- package/dist/server/routes/asset-api.js.map +1 -1
- package/dist/server/routes/audit-api.d.ts +24 -0
- package/dist/server/routes/audit-api.js +117 -0
- package/dist/server/routes/audit-api.js.map +1 -0
- package/dist/server/routes/auth-api.js +532 -63
- package/dist/server/routes/auth-api.js.map +1 -1
- package/dist/server/routes/capture-api.d.ts +10 -3
- package/dist/server/routes/capture-api.js +213 -25
- package/dist/server/routes/capture-api.js.map +1 -1
- package/dist/server/routes/chat-sessions-api.d.ts +13 -0
- package/dist/server/routes/chat-sessions-api.js +455 -0
- package/dist/server/routes/chat-sessions-api.js.map +1 -0
- package/dist/server/routes/chat.d.ts +35 -1
- package/dist/server/routes/chat.js +699 -54
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/comments-api.d.ts +15 -0
- package/dist/server/routes/comments-api.js +444 -0
- package/dist/server/routes/comments-api.js.map +1 -0
- package/dist/server/routes/config-api.d.ts +3 -2
- package/dist/server/routes/config-api.js +179 -49
- package/dist/server/routes/config-api.js.map +1 -1
- package/dist/server/routes/connectors-api.js +177 -42
- package/dist/server/routes/connectors-api.js.map +1 -1
- package/dist/server/routes/event-ingest-api.d.ts +15 -0
- package/dist/server/routes/{meeting-ingest-api.js → event-ingest-api.js} +35 -20
- package/dist/server/routes/event-ingest-api.js.map +1 -0
- package/dist/server/routes/field-library-api.d.ts +28 -0
- package/dist/server/routes/field-library-api.js +126 -0
- package/dist/server/routes/field-library-api.js.map +1 -0
- package/dist/server/routes/git-http.d.ts +2 -2
- package/dist/server/routes/git-http.js +86 -39
- package/dist/server/routes/git-http.js.map +1 -1
- package/dist/server/routes/graph-api-access.d.ts +57 -0
- package/dist/server/routes/graph-api-access.js +112 -0
- package/dist/server/routes/graph-api-access.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +1 -1
- package/dist/server/routes/graph-api.js +1455 -325
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/health.d.ts +18 -0
- package/dist/server/routes/health.js +74 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/import-batch.d.ts +24 -0
- package/dist/server/routes/import-batch.js +33 -0
- package/dist/server/routes/import-batch.js.map +1 -0
- package/dist/server/routes/insights-api.d.ts +9 -2
- package/dist/server/routes/insights-api.js +355 -61
- package/dist/server/routes/insights-api.js.map +1 -1
- package/dist/server/routes/mcp.d.ts +7 -3
- package/dist/server/routes/mcp.js +24 -8
- package/dist/server/routes/mcp.js.map +1 -1
- package/dist/server/routes/oauth-api.d.ts +67 -0
- package/dist/server/routes/oauth-api.js +421 -0
- package/dist/server/routes/oauth-api.js.map +1 -0
- package/dist/server/routes/permissions-api.d.ts +9 -2
- package/dist/server/routes/permissions-api.js +87 -31
- package/dist/server/routes/permissions-api.js.map +1 -1
- package/dist/server/routes/r2-api.d.ts +25 -0
- package/dist/server/routes/r2-api.js +276 -0
- package/dist/server/routes/r2-api.js.map +1 -0
- package/dist/server/routes/secrets-api.d.ts +36 -0
- package/dist/server/routes/secrets-api.js +308 -0
- package/dist/server/routes/secrets-api.js.map +1 -0
- package/dist/server/routes/settings-api.d.ts +29 -0
- package/dist/server/routes/settings-api.js +180 -0
- package/dist/server/routes/settings-api.js.map +1 -0
- package/dist/server/routes/share-api.d.ts +32 -0
- package/dist/server/routes/share-api.js +234 -0
- package/dist/server/routes/share-api.js.map +1 -0
- package/dist/server/routes/views-api.js +51 -0
- package/dist/server/routes/views-api.js.map +1 -1
- package/dist/server/routes/workspace-api.d.ts +2 -1
- package/dist/server/routes/workspace-api.js +142 -23
- package/dist/server/routes/workspace-api.js.map +1 -1
- package/dist/server/routes/ws.d.ts +3 -2
- package/dist/server/routes/ws.js +68 -17
- package/dist/server/routes/ws.js.map +1 -1
- package/dist/server/session-manager.d.ts +48 -5
- package/dist/server/session-manager.js +182 -14
- package/dist/server/session-manager.js.map +1 -1
- package/dist/server/ws-hub.d.ts +124 -37
- package/dist/server/ws-hub.js +0 -0
- package/dist/server/ws-hub.js.map +1 -1
- package/dist/server/yjs-manager.d.ts +278 -7
- package/dist/server/yjs-manager.js +830 -38
- package/dist/server/yjs-manager.js.map +1 -1
- package/dist/server/yjs-persistence.d.ts +165 -0
- package/dist/server/yjs-persistence.js +557 -0
- package/dist/server/yjs-persistence.js.map +1 -0
- package/dist/server/yjs-text-diff.d.ts +32 -0
- package/dist/server/yjs-text-diff.js +61 -0
- package/dist/server/yjs-text-diff.js.map +1 -0
- package/dist/services/access-control.d.ts +73 -0
- package/dist/services/access-control.js +165 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/artifact-asset-token.d.ts +69 -0
- package/dist/services/artifact-asset-token.js +94 -0
- package/dist/services/artifact-asset-token.js.map +1 -0
- package/dist/services/artifact-library-sources.d.ts +3 -0
- package/dist/services/artifact-library-sources.js +44 -0
- package/dist/services/artifact-library-sources.js.map +1 -0
- package/dist/services/artifact-render-export.d.ts +97 -0
- package/dist/services/artifact-render-export.js +467 -0
- package/dist/services/artifact-render-export.js.map +1 -0
- package/dist/services/asset-caption-service.d.ts +103 -0
- package/dist/services/asset-caption-service.js +186 -0
- package/dist/services/asset-caption-service.js.map +1 -0
- package/dist/services/asset-delete-authz.d.ts +31 -0
- package/dist/services/asset-delete-authz.js +61 -0
- package/dist/services/asset-delete-authz.js.map +1 -0
- package/dist/services/asset-finalize-service.d.ts +58 -0
- package/dist/services/asset-finalize-service.js +216 -0
- package/dist/services/asset-finalize-service.js.map +1 -0
- package/dist/services/asset-import-service.d.ts +111 -0
- package/dist/services/asset-import-service.js +394 -0
- package/dist/services/asset-import-service.js.map +1 -0
- package/dist/services/asset-index-sweep.d.ts +95 -0
- package/dist/services/asset-index-sweep.js +249 -0
- package/dist/services/asset-index-sweep.js.map +1 -0
- package/dist/services/asset-lifecycle-check.d.ts +22 -0
- package/dist/services/asset-lifecycle-check.js +80 -0
- package/dist/services/asset-lifecycle-check.js.map +1 -0
- package/dist/services/asset-listing.d.ts +72 -0
- package/dist/services/asset-listing.js +321 -0
- package/dist/services/asset-listing.js.map +1 -0
- package/dist/services/asset-presign-service.d.ts +68 -0
- package/dist/services/asset-presign-service.js +124 -0
- package/dist/services/asset-presign-service.js.map +1 -0
- package/dist/services/asset-sidecar-service.d.ts +28 -0
- package/dist/services/asset-sidecar-service.js +79 -0
- package/dist/services/asset-sidecar-service.js.map +1 -0
- package/dist/services/asset-upload-errors.d.ts +41 -0
- package/dist/services/asset-upload-errors.js +45 -0
- package/dist/services/asset-upload-errors.js.map +1 -0
- package/dist/services/asset-upload-service.d.ts +56 -0
- package/dist/services/asset-upload-service.js +200 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/asset-upload-token.d.ts +58 -0
- package/dist/services/asset-upload-token.js +75 -0
- package/dist/services/asset-upload-token.js.map +1 -0
- package/dist/services/assets/asset-index-service.d.ts +127 -0
- package/dist/services/assets/asset-index-service.js +227 -0
- package/dist/services/assets/asset-index-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +128 -2
- package/dist/services/assets/base.js +98 -1
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +114 -1
- package/dist/services/assets/index.js +221 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +16 -1
- package/dist/services/assets/local.js +110 -1
- package/dist/services/assets/local.js.map +1 -1
- package/dist/services/assets/r2-sync.d.ts +88 -0
- package/dist/services/assets/r2-sync.js +412 -0
- package/dist/services/assets/r2-sync.js.map +1 -0
- package/dist/services/assets/r2.d.ts +87 -1
- package/dist/services/assets/r2.js +203 -1
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +312 -45
- package/dist/services/auth-service.js +1011 -195
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/chat-session-service.d.ts +188 -0
- package/dist/services/chat-session-service.js +512 -0
- package/dist/services/chat-session-service.js.map +1 -0
- package/dist/services/cloud-inference-billing.d.ts +64 -0
- package/dist/services/cloud-inference-billing.js +313 -0
- package/dist/services/cloud-inference-billing.js.map +1 -0
- package/dist/services/comment-service.d.ts +97 -0
- package/dist/services/comment-service.js +341 -0
- package/dist/services/comment-service.js.map +1 -0
- package/dist/services/comment-virtual-entity.d.ts +36 -0
- package/dist/services/comment-virtual-entity.js +71 -0
- package/dist/services/comment-virtual-entity.js.map +1 -0
- package/dist/services/convert-service.d.ts +64 -0
- package/dist/services/convert-service.js +68 -0
- package/dist/services/convert-service.js.map +1 -0
- package/dist/services/csv-service.d.ts +22 -17
- package/dist/services/csv-service.js +55 -92
- package/dist/services/csv-service.js.map +1 -1
- package/dist/services/entity-mutations.d.ts +213 -0
- package/dist/services/entity-mutations.js +380 -0
- package/dist/services/entity-mutations.js.map +1 -0
- package/dist/services/{meeting-processor.d.ts → event-processor.d.ts} +15 -8
- package/dist/services/{meeting-processor.js → event-processor.js} +124 -65
- package/dist/services/event-processor.js.map +1 -0
- package/dist/services/extract/docx.d.ts +1 -0
- package/dist/services/extract/docx.js +233 -0
- package/dist/services/extract/docx.js.map +1 -0
- package/dist/services/extract/index.d.ts +9 -0
- package/dist/services/extract/index.js +10 -0
- package/dist/services/extract/index.js.map +1 -0
- package/dist/services/extract/pdf.d.ts +13 -0
- package/dist/services/extract/pdf.js +69 -0
- package/dist/services/extract/pdf.js.map +1 -0
- package/dist/services/folder-creation.d.ts +33 -0
- package/dist/services/folder-creation.js +103 -0
- package/dist/services/folder-creation.js.map +1 -0
- package/dist/services/git.d.ts +58 -0
- package/dist/services/git.js +194 -55
- package/dist/services/git.js.map +1 -1
- package/dist/services/graph-maintenance.js +4 -4
- package/dist/services/graph-maintenance.js.map +1 -1
- package/dist/services/import-service.d.ts +51 -2
- package/dist/services/import-service.js +254 -107
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/lint-service.js +10 -17
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.d.ts +12 -1
- package/dist/services/markdown.js +77 -9
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/mention-detector.d.ts +23 -0
- package/dist/services/mention-detector.js +47 -0
- package/dist/services/mention-detector.js.map +1 -0
- package/dist/services/model-capabilities.d.ts +41 -0
- package/dist/services/model-capabilities.js +107 -0
- package/dist/services/model-capabilities.js.map +1 -0
- package/dist/services/notification-broadcast.d.ts +32 -0
- package/dist/services/notification-broadcast.js +38 -0
- package/dist/services/notification-broadcast.js.map +1 -0
- package/dist/services/notification-service.d.ts +41 -0
- package/dist/services/notification-service.js +100 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/oauth-server-store.d.ts +147 -0
- package/dist/services/oauth-server-store.js +319 -0
- package/dist/services/oauth-server-store.js.map +1 -0
- package/dist/services/orphan-service.js +2 -2
- package/dist/services/orphan-service.js.map +1 -1
- package/dist/services/personal-folder.d.ts +40 -0
- package/dist/services/personal-folder.js +101 -0
- package/dist/services/personal-folder.js.map +1 -0
- package/dist/services/scratch-asset-promote.d.ts +57 -0
- package/dist/services/scratch-asset-promote.js +95 -0
- package/dist/services/scratch-asset-promote.js.map +1 -0
- package/dist/services/scratch-attachment-service.d.ts +196 -0
- package/dist/services/scratch-attachment-service.js +347 -0
- package/dist/services/scratch-attachment-service.js.map +1 -0
- package/dist/services/share-link-service.d.ts +57 -0
- package/dist/services/share-link-service.js +142 -0
- package/dist/services/share-link-service.js.map +1 -0
- package/dist/services/user-person-bridge.d.ts +136 -0
- package/dist/services/user-person-bridge.js +340 -0
- package/dist/services/user-person-bridge.js.map +1 -0
- package/dist/services/vector-service.d.ts +282 -5
- package/dist/services/vector-service.js +585 -29
- package/dist/services/vector-service.js.map +1 -1
- package/dist/services/workspace-access.d.ts +108 -0
- package/dist/services/workspace-access.js +149 -0
- package/dist/services/workspace-access.js.map +1 -0
- package/dist/services/workspace-assets-folder.d.ts +46 -0
- package/dist/services/workspace-assets-folder.js +75 -0
- package/dist/services/workspace-assets-folder.js.map +1 -0
- package/dist/utils/git.d.ts +17 -2
- package/dist/utils/git.js +23 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/log.d.ts +42 -0
- package/dist/utils/log.js +137 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/preflight.js +2 -2
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/version-checker.d.ts +12 -19
- package/dist/utils/version-checker.js +14 -104
- package/dist/utils/version-checker.js.map +1 -1
- package/dist/web/_app/immutable/assets/0.Bs_z3Z86.css +2 -0
- package/dist/web/_app/immutable/assets/12.DlIf1mKh.css +1 -0
- package/dist/web/_app/immutable/assets/14.7d-Q37wc.css +1 -0
- package/dist/web/_app/immutable/assets/15.BwBFdc1D.css +1 -0
- package/dist/web/_app/immutable/assets/16.CmLrbzZp.css +1 -0
- package/dist/web/_app/immutable/assets/17.DcuK5ZVm.css +1 -0
- package/dist/web/_app/immutable/assets/2.DATnR31c.css +1 -0
- package/dist/web/_app/immutable/assets/3.Cz4H8n_O.css +1 -0
- package/dist/web/_app/immutable/assets/4.aDHteTDy.css +1 -0
- package/dist/web/_app/immutable/assets/6.CF1i5Bon.css +1 -0
- package/dist/web/_app/immutable/assets/ArtifactEntityView.C4ooklFD.css +1 -0
- package/dist/web/_app/immutable/assets/AssetLibraryPicker.BOFW0MvF.css +1 -0
- package/dist/web/_app/immutable/assets/BulkActionsBar.cmKvHzRK.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.lBCvS3X5.css +1 -0
- package/dist/web/_app/immutable/assets/CodeMirrorEditor.D6hf2pNJ.css +1 -0
- package/dist/web/_app/immutable/assets/CopyField.DVGZtw4U.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMembersPanel.kiYnDFHu.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMutationDialogs.BMRF6Z3z.css +1 -0
- package/dist/web/_app/immutable/assets/FolderPicker.Cp46GHe2.css +1 -0
- package/dist/web/_app/immutable/assets/GalleryView.WBGxxUQc.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.BOaI5KFL.css +1 -0
- package/dist/web/_app/immutable/assets/Link.vV0ne105.css +1 -0
- package/dist/web/_app/immutable/assets/Markdown.BZnsSOSf.css +1 -0
- package/dist/web/_app/immutable/assets/Rail.ilusFgD4.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.D7-BO6S_.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/StopFilledAlt.fNlDN65D.css +1 -0
- package/dist/web/_app/immutable/assets/TimelineView.xAZBJhHw.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.C8ErUJAY.css +1 -0
- package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
- package/dist/web/_app/immutable/assets/history-summary.LpmHXasl.css +1 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CZTNEAuW.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CsGl1sm0.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.BNK2_mGO.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.DpEwFAQM.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2 +0 -0
- package/dist/web/_app/immutable/assets/inline-list.cqga56xT.css +1 -0
- package/dist/web/_app/immutable/assets/list-columns.BgnafZ4K.css +1 -0
- package/dist/web/_app/immutable/assets/realtime.DDCWxn3B.css +1 -0
- package/dist/web/_app/immutable/assets/select.B90KUqR4.css +1 -0
- package/dist/web/_app/immutable/assets/sheet.RF9RBmml.css +1 -0
- package/dist/web/_app/immutable/chunks/22qYtvr82.js +1 -0
- package/dist/web/_app/immutable/chunks/2f1VclTm.js +1 -0
- package/dist/web/_app/immutable/chunks/4xgUPoGj2.js +2 -0
- package/dist/web/_app/immutable/chunks/5CYQk4xR.js +1 -0
- package/dist/web/_app/immutable/chunks/6S9WOky52.js +1 -0
- package/dist/web/_app/immutable/chunks/9K8VREGP.js +1 -0
- package/dist/web/_app/immutable/chunks/B-n5q6ku.js +1 -0
- package/dist/web/_app/immutable/chunks/B0p2fSEV2.js +1 -0
- package/dist/web/_app/immutable/chunks/B2oi87jG.js +2 -0
- package/dist/web/_app/immutable/chunks/B5Rb52QU.js +1 -0
- package/dist/web/_app/immutable/chunks/B6Lt-qaJ.js +1 -0
- package/dist/web/_app/immutable/chunks/B6O-q2CN.js +1 -0
- package/dist/web/_app/immutable/chunks/B6qeIQZz.js +2 -0
- package/dist/web/_app/immutable/chunks/B9KfEsQw2.js +1 -0
- package/dist/web/_app/immutable/chunks/BB-RSeXQ.js +1 -0
- package/dist/web/_app/immutable/chunks/BCQQzpbj.js +1 -0
- package/dist/web/_app/immutable/chunks/BGdzd-Tc.js +1 -0
- package/dist/web/_app/immutable/chunks/BLs1h0Rh2.js +1 -0
- package/dist/web/_app/immutable/chunks/BPzV_xOS2.js +1 -0
- package/dist/web/_app/immutable/chunks/BT2C6q8n.js +1 -0
- package/dist/web/_app/immutable/chunks/BUesbLq2.js +1 -0
- package/dist/web/_app/immutable/chunks/BUrnwOw4.js +2 -0
- package/dist/web/_app/immutable/chunks/BV-iCKqa.js +1 -0
- package/dist/web/_app/immutable/chunks/BVCJtXyc.js +1 -0
- package/dist/web/_app/immutable/chunks/BY9a3GSt.js +6 -0
- package/dist/web/_app/immutable/chunks/BZi3uKF4.js +1 -0
- package/dist/web/_app/immutable/chunks/BbfHGU9n2.js +1 -0
- package/dist/web/_app/immutable/chunks/Bbqu2-5G2.js +1 -0
- package/dist/web/_app/immutable/chunks/BbsX1Slr.js +3 -0
- package/dist/web/_app/immutable/chunks/BcwjqHaZ2.js +1 -0
- package/dist/web/_app/immutable/chunks/BizeEpTx.js +2 -0
- package/dist/web/_app/immutable/chunks/BlgjVmFM2.js +14 -0
- package/dist/web/_app/immutable/chunks/BocSRgv12.js +1 -0
- package/dist/web/_app/immutable/chunks/BojBYqc3.js +1 -0
- package/dist/web/_app/immutable/chunks/BpCG9m962.js +1 -0
- package/dist/web/_app/immutable/chunks/BqvnBg_y.js +1 -0
- package/dist/web/_app/immutable/chunks/BsT0J1QD.js +1 -0
- package/dist/web/_app/immutable/chunks/BsW72fyR2.js +1 -0
- package/dist/web/_app/immutable/chunks/Bti_XKwx.js +2692 -0
- package/dist/web/_app/immutable/chunks/Bua97Had2.js +2 -0
- package/dist/web/_app/immutable/chunks/BuhW5Fr0.js +689 -0
- package/dist/web/_app/immutable/chunks/Bx74EEyn2.js +1 -0
- package/dist/web/_app/immutable/chunks/BxPN0T61.js +1 -0
- package/dist/web/_app/immutable/chunks/Bz9lrgGs.js +1 -0
- package/dist/web/_app/immutable/chunks/BzaxZ6j12.js +1 -0
- package/dist/web/_app/immutable/chunks/C1B4xDs0.js +1 -0
- package/dist/web/_app/immutable/chunks/C1trcC8M.js +7 -0
- package/dist/web/_app/immutable/chunks/C9tvkk7Y2.js +22 -0
- package/dist/web/_app/immutable/chunks/CBQjdDZf.js +1 -0
- package/dist/web/_app/immutable/chunks/CDeazMFW2.js +2 -0
- package/dist/web/_app/immutable/chunks/CEahbtnP.js +1 -0
- package/dist/web/_app/immutable/chunks/CGjVCd0e.js +8 -0
- package/dist/web/_app/immutable/chunks/CICK9maP.js +1 -0
- package/dist/web/_app/immutable/chunks/CIoNEHQ82.js +184 -0
- package/dist/web/_app/immutable/chunks/CP8_U450.js +1 -0
- package/dist/web/_app/immutable/chunks/CQ1eQ93t2.js +6 -0
- package/dist/web/_app/immutable/chunks/CUFQMEBn2.js +1 -0
- package/dist/web/_app/immutable/chunks/CYEYDNwO2.js +1 -0
- package/dist/web/_app/immutable/chunks/CYyIP7kP2.js +66 -0
- package/dist/web/_app/immutable/chunks/CZgFaimi2.js +83 -0
- package/dist/web/_app/immutable/chunks/CZqvCTCv.js +1 -0
- package/dist/web/_app/immutable/chunks/CcI9jYBV.js +1 -0
- package/dist/web/_app/immutable/chunks/CcWaWbrI2.js +1 -0
- package/dist/web/_app/immutable/chunks/CdtzRVZK.js +1 -0
- package/dist/web/_app/immutable/chunks/CfYG72Hc.js +1 -0
- package/dist/web/_app/immutable/chunks/Ch1kmm3J2.js +1 -0
- package/dist/web/_app/immutable/chunks/CmSSN61R2.js +1 -0
- package/dist/web/_app/immutable/chunks/Cqm5wAin.js +1 -0
- package/dist/web/_app/immutable/chunks/CuYPXpWU.js +1 -0
- package/dist/web/_app/immutable/chunks/CvSEodTA.js +1 -0
- package/dist/web/_app/immutable/chunks/CvqqrTrj.js +1 -0
- package/dist/web/_app/immutable/chunks/CwAmWt6h.js +1 -0
- package/dist/web/_app/immutable/chunks/CwP3Oa7F.js +1 -0
- package/dist/web/_app/immutable/chunks/CyTluew1.js +2 -0
- package/dist/web/_app/immutable/chunks/CzXdOgVl2.js +7 -0
- package/dist/web/_app/immutable/chunks/D0IAituJ.js +1 -0
- package/dist/web/_app/immutable/chunks/D0W7c6Sg.js +185 -0
- package/dist/web/_app/immutable/chunks/D0rBhnqB2.js +1 -0
- package/dist/web/_app/immutable/chunks/D1-GZSN1.js +1 -0
- package/dist/web/_app/immutable/chunks/D1yvtriI.js +1 -0
- package/dist/web/_app/immutable/chunks/D25NMRpl.js +1 -0
- package/dist/web/_app/immutable/chunks/D8wZ2xul.js +4 -0
- package/dist/web/_app/immutable/chunks/DA3HEX3X.js +1 -0
- package/dist/web/_app/immutable/chunks/DD9wj4ca2.js +1 -0
- package/dist/web/_app/immutable/chunks/DJ1YeiJL2.js +1 -0
- package/dist/web/_app/immutable/chunks/DKFZnpVC.js +5 -0
- package/dist/web/_app/immutable/chunks/DKJl40hl.js +1 -0
- package/dist/web/_app/immutable/chunks/DPUVu0T0.js +1 -0
- package/dist/web/_app/immutable/chunks/DQMWa2t7.js +1 -0
- package/dist/web/_app/immutable/chunks/DXsFrDer2.js +1 -0
- package/dist/web/_app/immutable/chunks/DYc5KW3F.js +1 -0
- package/dist/web/_app/immutable/chunks/DZcTwXBW.js +1 -0
- package/dist/web/_app/immutable/chunks/DcPrzUMJ.js +1 -0
- package/dist/web/_app/immutable/chunks/DdPO8kRu2.js +2 -0
- package/dist/web/_app/immutable/chunks/DeOXyJZw2.js +1 -0
- package/dist/web/_app/immutable/chunks/DfufUFR1.js +2 -0
- package/dist/web/_app/immutable/chunks/DiQg3ing.js +1 -0
- package/dist/web/_app/immutable/chunks/DjIqa1_y.js +2 -0
- package/dist/web/_app/immutable/chunks/DkJ1dkxV2.js +1 -0
- package/dist/web/_app/immutable/chunks/Dl63IUnH2.js +224 -0
- package/dist/web/_app/immutable/chunks/DmFdD6zT.js +1 -0
- package/dist/web/_app/immutable/chunks/Dn3R8S-U.js +1 -0
- package/dist/web/_app/immutable/chunks/DpNr1GQ2.js +1 -0
- package/dist/web/_app/immutable/chunks/DpVNDHXz.js +2 -0
- package/dist/web/_app/immutable/chunks/DuxziNnw.js +1 -0
- package/dist/web/_app/immutable/chunks/Dv3A3Wcj.js +1 -0
- package/dist/web/_app/immutable/chunks/FuiJnZG0.js +1 -0
- package/dist/web/_app/immutable/chunks/Izkulod7.js +1 -0
- package/dist/web/_app/immutable/chunks/KZY6ongq2.js +2 -0
- package/dist/web/_app/immutable/chunks/LYL8znYR2.js +23 -0
- package/dist/web/_app/immutable/chunks/PhN6tXuJ2.js +1 -0
- package/dist/web/_app/immutable/chunks/PyLyCpuL.js +1 -0
- package/dist/web/_app/immutable/chunks/RK4gCWN0.js +2 -0
- package/dist/web/_app/immutable/chunks/VsBngTf4.js +2 -0
- package/dist/web/_app/immutable/chunks/XcWejFm_.js +5 -0
- package/dist/web/_app/immutable/chunks/al_nidE9.js +1 -0
- package/dist/web/_app/immutable/chunks/e50-izZO2.js +1 -0
- package/dist/web/_app/immutable/chunks/hG-QCarB.js +1 -0
- package/dist/web/_app/immutable/chunks/hStvCHkX.js +1 -0
- package/dist/web/_app/immutable/chunks/iJVY9p0y.js +3 -0
- package/dist/web/_app/immutable/chunks/kNaey6uv.js +1 -0
- package/dist/web/_app/immutable/chunks/pIXNe0C1.js +1 -0
- package/dist/web/_app/immutable/chunks/pNSRq_1B.js +2 -0
- package/dist/web/_app/immutable/chunks/qwr5boV8.js +1 -0
- package/dist/web/_app/immutable/chunks/rjjyuGhb.js +1 -0
- package/dist/web/_app/immutable/chunks/sg-T-FoN.js +1 -0
- package/dist/web/_app/immutable/chunks/uBgoVlsx.js +3 -0
- package/dist/web/_app/immutable/chunks/ulshNz6x.js +2 -0
- package/dist/web/_app/immutable/chunks/xY0c-UfG.js +3 -0
- package/dist/web/_app/immutable/chunks/xeNvx4Bl2.js +1 -0
- package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/dist/web/_app/immutable/entry/app.pNUW-q4U.js +2 -0
- package/dist/web/_app/immutable/entry/start.DxGtIGG_.js +1 -0
- package/dist/web/_app/immutable/nodes/0.D6ZCY_R6.js +2 -0
- package/dist/web/_app/immutable/nodes/1.BryH3TNr.js +1 -0
- package/dist/web/_app/immutable/nodes/10.CMZMvR17.js +1 -0
- package/dist/web/_app/immutable/nodes/11.QHx_JShx.js +1 -0
- package/dist/web/_app/immutable/nodes/12.CiRWbb4X.js +1 -0
- package/dist/web/_app/immutable/nodes/13.CYrHXCA8.js +1 -0
- package/dist/web/_app/immutable/nodes/14.K18eIE5Z.js +1 -0
- package/dist/web/_app/immutable/nodes/15.DxgnZ61h.js +1 -0
- package/dist/web/_app/immutable/nodes/16.Dn6iuWIo.js +1 -0
- package/dist/web/_app/immutable/nodes/17.viwS7vTR.js +77 -0
- package/dist/web/_app/immutable/nodes/2.BQkQ_uUM.js +122 -0
- package/dist/web/_app/immutable/nodes/3.B4pqXsqq.js +6 -0
- package/dist/web/_app/immutable/nodes/4.CKXEgIAP.js +11 -0
- package/dist/web/_app/immutable/nodes/5.A2TASl4Q.js +1 -0
- package/dist/web/_app/immutable/nodes/6.DaIRO3SI.js +6 -0
- package/dist/web/_app/immutable/nodes/7.ga2UvFm-.js +1 -0
- package/dist/web/_app/immutable/nodes/8.BTEWT81u.js +1 -0
- package/dist/web/_app/immutable/nodes/9.BVxo0E0c.js +1 -0
- package/dist/web/_app/version.json +1 -1
- package/dist/web/favicon-16.png +0 -0
- package/dist/web/favicon-180.png +0 -0
- package/dist/web/favicon-32.png +0 -0
- package/dist/web/favicon-48.png +0 -0
- package/dist/web/favicon-512.png +0 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/favicon.svg +8 -0
- package/dist/web/index.html +56 -21
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +35 -14
- package/dist/agent/skills/enrich-entities.md +0 -136
- package/dist/agent/skills/sync-configuration.md +0 -119
- package/dist/agent/skills/sync-setup.md +0 -82
- package/dist/agent/tools/message-tools.d.ts +0 -42
- package/dist/agent/tools/message-tools.js +0 -106
- package/dist/agent/tools/message-tools.js.map +0 -1
- package/dist/cli/commands/app.d.ts +0 -7
- package/dist/cli/commands/app.js +0 -268
- package/dist/cli/commands/app.js.map +0 -1
- package/dist/cli/commands/clear.d.ts +0 -5
- package/dist/cli/commands/clear.js +0 -36
- package/dist/cli/commands/clear.js.map +0 -1
- package/dist/cli/commands/collection.d.ts +0 -10
- package/dist/cli/commands/collection.js.map +0 -1
- package/dist/cli/commands/join.d.ts +0 -9
- package/dist/cli/commands/join.js +0 -255
- package/dist/cli/commands/join.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -7
- package/dist/cli/commands/start.js +0 -584
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -8
- package/dist/cli/commands/update.js +0 -155
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/user.d.ts +0 -7
- package/dist/cli/commands/user.js +0 -175
- package/dist/cli/commands/user.js.map +0 -1
- package/dist/cli/scaffolding.d.ts +0 -12
- package/dist/cli/scaffolding.js +0 -397
- package/dist/cli/scaffolding.js.map +0 -1
- package/dist/integrations/registry.d.ts +0 -8
- package/dist/integrations/registry.js +0 -7
- package/dist/integrations/registry.js.map +0 -1
- package/dist/integrations/types.d.ts +0 -43
- package/dist/integrations/types.js +0 -5
- package/dist/integrations/types.js.map +0 -1
- package/dist/lib/lib/utils.d.ts +0 -2
- package/dist/lib/lib/utils.js +0 -6
- package/dist/lib/lib/utils.js.map +0 -1
- package/dist/server/chrome/chrome.css +0 -691
- package/dist/server/chrome/chrome.js +0 -374
- package/dist/server/commit-scheduler.d.ts +0 -39
- package/dist/server/commit-scheduler.js +0 -113
- package/dist/server/commit-scheduler.js.map +0 -1
- package/dist/server/plugin-loader.d.ts +0 -53
- package/dist/server/plugin-loader.js +0 -155
- package/dist/server/plugin-loader.js.map +0 -1
- package/dist/server/routes/meeting-ingest-api.d.ts +0 -14
- package/dist/server/routes/meeting-ingest-api.js.map +0 -1
- package/dist/server/routes/messages-api.d.ts +0 -15
- package/dist/server/routes/messages-api.js +0 -385
- package/dist/server/routes/messages-api.js.map +0 -1
- package/dist/services/batch-processor.d.ts +0 -49
- package/dist/services/batch-processor.js +0 -166
- package/dist/services/batch-processor.js.map +0 -1
- package/dist/services/briefing.d.ts +0 -26
- package/dist/services/briefing.js +0 -230
- package/dist/services/briefing.js.map +0 -1
- package/dist/services/heartbeat.d.ts +0 -28
- package/dist/services/heartbeat.js +0 -183
- package/dist/services/heartbeat.js.map +0 -1
- package/dist/services/image-import-service.d.ts +0 -24
- package/dist/services/image-import-service.js +0 -108
- package/dist/services/image-import-service.js.map +0 -1
- package/dist/services/insights.d.ts +0 -38
- package/dist/services/insights.js +0 -269
- package/dist/services/insights.js.map +0 -1
- package/dist/services/meeting-processor.js.map +0 -1
- package/dist/services/message-service.d.ts +0 -68
- package/dist/services/message-service.js +0 -220
- package/dist/services/message-service.js.map +0 -1
- package/dist/utils/workspace-config.d.ts +0 -8
- package/dist/utils/workspace-config.js +0 -22
- package/dist/utils/workspace-config.js.map +0 -1
- package/dist/web/_app/immutable/assets/0.uPSqtsC5.css +0 -1
- package/dist/web/_app/immutable/assets/11.2jzI3cZY.css +0 -1
- package/dist/web/_app/immutable/assets/12.CT4xL4K3.css +0 -1
- package/dist/web/_app/immutable/assets/13.BUrHkYry.css +0 -1
- package/dist/web/_app/immutable/assets/2.DpQWr6q6.css +0 -1
- package/dist/web/_app/immutable/assets/3.BxdqT7zi.css +0 -1
- package/dist/web/_app/immutable/assets/4.DdNqjd0T.css +0 -1
- package/dist/web/_app/immutable/assets/5.DFeGxLYf.css +0 -1
- package/dist/web/_app/immutable/assets/6.DXZr_rI_.css +0 -1
- package/dist/web/_app/immutable/assets/GraphView.D9ePpZez.css +0 -1
- package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
- package/dist/web/_app/immutable/assets/ViewToolbar.BWE03S64.css +0 -1
- package/dist/web/_app/immutable/assets/WorkspaceView.CgGDi_Zb.css +0 -1
- package/dist/web/_app/immutable/assets/wikilinks.CzMBkUMB.css +0 -1
- package/dist/web/_app/immutable/chunks/-jG4Obyh.js +0 -4
- package/dist/web/_app/immutable/chunks/2nrc8f_O.js +0 -1
- package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
- package/dist/web/_app/immutable/chunks/8Q3ZJIYu.js +0 -1
- package/dist/web/_app/immutable/chunks/B8ydT5xX.js +0 -2
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
- package/dist/web/_app/immutable/chunks/BEn6N5c2.js +0 -1
- package/dist/web/_app/immutable/chunks/BFNNbCAM.js +0 -1
- package/dist/web/_app/immutable/chunks/BFZZEUd5.js +0 -1
- package/dist/web/_app/immutable/chunks/BGk8kfOE.js +0 -2
- package/dist/web/_app/immutable/chunks/BIBCr278.js +0 -1
- package/dist/web/_app/immutable/chunks/BPCkkwqe.js +0 -1
- package/dist/web/_app/immutable/chunks/BhlvzGQx.js +0 -1
- package/dist/web/_app/immutable/chunks/BlMknQeF.js +0 -1
- package/dist/web/_app/immutable/chunks/BpjqrlCg.js +0 -1
- package/dist/web/_app/immutable/chunks/BrebtJNG.js +0 -18
- package/dist/web/_app/immutable/chunks/ByBZ7JIT.js +0 -1
- package/dist/web/_app/immutable/chunks/Bz0ZjVQE.js +0 -2
- package/dist/web/_app/immutable/chunks/BzJTZOK2.js +0 -1
- package/dist/web/_app/immutable/chunks/C0LVZhvn.js +0 -1
- package/dist/web/_app/immutable/chunks/C3uBrOS5.js +0 -1
- package/dist/web/_app/immutable/chunks/C8R1sDpW.js +0 -1
- package/dist/web/_app/immutable/chunks/CDRHrs0g.js +0 -1
- package/dist/web/_app/immutable/chunks/CN5_py1I.js +0 -1
- package/dist/web/_app/immutable/chunks/CPne482a.js +0 -1
- package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
- package/dist/web/_app/immutable/chunks/CWyU-seV.js +0 -1
- package/dist/web/_app/immutable/chunks/CX_61fY8.js +0 -5
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +0 -1
- package/dist/web/_app/immutable/chunks/ChsiIm-E.js +0 -1
- package/dist/web/_app/immutable/chunks/CojKppbh.js +0 -1
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
- package/dist/web/_app/immutable/chunks/CtYLtD7K.js +0 -1
- package/dist/web/_app/immutable/chunks/D-HDy5qS.js +0 -1
- package/dist/web/_app/immutable/chunks/D5aIYSkd.js +0 -1
- package/dist/web/_app/immutable/chunks/DBBXARVf.js +0 -1
- package/dist/web/_app/immutable/chunks/DFYOFE3o.js +0 -1
- package/dist/web/_app/immutable/chunks/DKaafS50.js +0 -1
- package/dist/web/_app/immutable/chunks/DUMOo1Pn.js +0 -1
- package/dist/web/_app/immutable/chunks/DWX9f6AF.js +0 -1
- package/dist/web/_app/immutable/chunks/DY8-EONP.js +0 -1
- package/dist/web/_app/immutable/chunks/DkoHPElM.js +0 -1
- package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
- package/dist/web/_app/immutable/chunks/DsnmJJEf.js +0 -1
- package/dist/web/_app/immutable/chunks/DujahU3W.js +0 -1
- package/dist/web/_app/immutable/chunks/FBn-ES5k.js +0 -1
- package/dist/web/_app/immutable/chunks/HQpwSOb3.js +0 -1
- package/dist/web/_app/immutable/chunks/KyjzlWRN.js +0 -2
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
- package/dist/web/_app/immutable/chunks/UwYfmrPx.js +0 -2
- package/dist/web/_app/immutable/chunks/W25ZVI8L.js +0 -2
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
- package/dist/web/_app/immutable/chunks/XjsuEnNE.js +0 -5
- package/dist/web/_app/immutable/chunks/ZD6ARAtb.js +0 -1
- package/dist/web/_app/immutable/chunks/pBTf4stg.js +0 -2
- package/dist/web/_app/immutable/chunks/rGIarcnp.js +0 -1
- package/dist/web/_app/immutable/chunks/vxEtkL8z.js +0 -1
- package/dist/web/_app/immutable/chunks/wDIGUaoU.js +0 -3
- package/dist/web/_app/immutable/entry/app.ZHiTM8WS.js +0 -2
- package/dist/web/_app/immutable/entry/start.C9-FfAVc.js +0 -1
- package/dist/web/_app/immutable/nodes/0.D92Orz8k.js +0 -2
- package/dist/web/_app/immutable/nodes/1.BMdyglM_.js +0 -1
- package/dist/web/_app/immutable/nodes/10.BilVDHSL.js +0 -1
- package/dist/web/_app/immutable/nodes/11.CS9E0Hic.js +0 -1
- package/dist/web/_app/immutable/nodes/12.D3BOxYzG.js +0 -1
- package/dist/web/_app/immutable/nodes/13.CClMKYtN.js +0 -1
- package/dist/web/_app/immutable/nodes/2.C8KKElPL.js +0 -267
- package/dist/web/_app/immutable/nodes/3.C5n5uiWU.js +0 -5
- package/dist/web/_app/immutable/nodes/4.DcGVvgiL.js +0 -11
- package/dist/web/_app/immutable/nodes/5.DxIjnFQO.js +0 -4
- package/dist/web/_app/immutable/nodes/6.lkh6kKLj.js +0 -1
- package/dist/web/_app/immutable/nodes/7.Bg7SbfhA.js +0 -1
- package/dist/web/_app/immutable/nodes/8.DcXWCNBE.js +0 -1
- package/dist/web/_app/immutable/nodes/9.Cefi8Jfm.js +0 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed Error classes for the MCP pre-signed asset upload flow.
|
|
3
|
+
*
|
|
4
|
+
* The presign and finalize services throw these; `errorToMcpResult()` in
|
|
5
|
+
* `mcp/tools.ts` maps each to a `fail()` envelope with a `code` discriminator
|
|
6
|
+
* the agent can branch on. Generic `Error` thrown from the same call sites
|
|
7
|
+
* fall through to the default "unknown" code. See ~/.claude/plans/
|
|
8
|
+
* mcp-presigned-asset-upload.md decision R4.
|
|
9
|
+
*
|
|
10
|
+
* The `code` field is read by clients; the message is human-facing. Keep
|
|
11
|
+
* codes stable across releases — agent prompts and downstream MCP-host UIs
|
|
12
|
+
* key off them.
|
|
13
|
+
*/
|
|
14
|
+
export declare class AssetUploadError extends Error {
|
|
15
|
+
/** Stable machine-readable identifier. Set by each subclass; the base
|
|
16
|
+
* class declares it so a generic catch can read `err.code` without a
|
|
17
|
+
* narrowing dance. */
|
|
18
|
+
readonly code: string;
|
|
19
|
+
constructor(message: string);
|
|
20
|
+
}
|
|
21
|
+
export declare class InvalidMimeTypeError extends AssetUploadError {
|
|
22
|
+
readonly code = "invalid_mime";
|
|
23
|
+
}
|
|
24
|
+
export declare class InvalidFilenameError extends AssetUploadError {
|
|
25
|
+
readonly code = "invalid_filename";
|
|
26
|
+
}
|
|
27
|
+
export declare class ForbiddenError extends AssetUploadError {
|
|
28
|
+
readonly code = "forbidden";
|
|
29
|
+
}
|
|
30
|
+
export declare class LocalBackendNotSupportedError extends AssetUploadError {
|
|
31
|
+
readonly code = "local_backend";
|
|
32
|
+
}
|
|
33
|
+
export declare class TokenInvalidError extends AssetUploadError {
|
|
34
|
+
readonly code = "token_invalid";
|
|
35
|
+
}
|
|
36
|
+
export declare class UploadNotReceivedError extends AssetUploadError {
|
|
37
|
+
readonly code = "upload_not_received";
|
|
38
|
+
}
|
|
39
|
+
export declare class UploadValidationError extends AssetUploadError {
|
|
40
|
+
readonly code = "upload_validation";
|
|
41
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed Error classes for the MCP pre-signed asset upload flow.
|
|
3
|
+
*
|
|
4
|
+
* The presign and finalize services throw these; `errorToMcpResult()` in
|
|
5
|
+
* `mcp/tools.ts` maps each to a `fail()` envelope with a `code` discriminator
|
|
6
|
+
* the agent can branch on. Generic `Error` thrown from the same call sites
|
|
7
|
+
* fall through to the default "unknown" code. See ~/.claude/plans/
|
|
8
|
+
* mcp-presigned-asset-upload.md decision R4.
|
|
9
|
+
*
|
|
10
|
+
* The `code` field is read by clients; the message is human-facing. Keep
|
|
11
|
+
* codes stable across releases — agent prompts and downstream MCP-host UIs
|
|
12
|
+
* key off them.
|
|
13
|
+
*/
|
|
14
|
+
export class AssetUploadError extends Error {
|
|
15
|
+
/** Stable machine-readable identifier. Set by each subclass; the base
|
|
16
|
+
* class declares it so a generic catch can read `err.code` without a
|
|
17
|
+
* narrowing dance. */
|
|
18
|
+
code = 'asset_upload_error';
|
|
19
|
+
constructor(message) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = this.constructor.name;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export class InvalidMimeTypeError extends AssetUploadError {
|
|
25
|
+
code = 'invalid_mime';
|
|
26
|
+
}
|
|
27
|
+
export class InvalidFilenameError extends AssetUploadError {
|
|
28
|
+
code = 'invalid_filename';
|
|
29
|
+
}
|
|
30
|
+
export class ForbiddenError extends AssetUploadError {
|
|
31
|
+
code = 'forbidden';
|
|
32
|
+
}
|
|
33
|
+
export class LocalBackendNotSupportedError extends AssetUploadError {
|
|
34
|
+
code = 'local_backend';
|
|
35
|
+
}
|
|
36
|
+
export class TokenInvalidError extends AssetUploadError {
|
|
37
|
+
code = 'token_invalid';
|
|
38
|
+
}
|
|
39
|
+
export class UploadNotReceivedError extends AssetUploadError {
|
|
40
|
+
code = 'upload_not_received';
|
|
41
|
+
}
|
|
42
|
+
export class UploadValidationError extends AssetUploadError {
|
|
43
|
+
code = 'upload_validation';
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=asset-upload-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-upload-errors.js","sourceRoot":"","sources":["../../src/services/asset-upload-errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC;;2BAEuB;IACd,IAAI,GAAW,oBAAoB,CAAC;IAE7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,gBAAgB;IAC/C,IAAI,GAAG,cAAc,CAAC;CAChC;AAED,MAAM,OAAO,oBAAqB,SAAQ,gBAAgB;IAC/C,IAAI,GAAG,kBAAkB,CAAC;CACpC;AAED,MAAM,OAAO,cAAe,SAAQ,gBAAgB;IACzC,IAAI,GAAG,WAAW,CAAC;CAC7B;AAED,MAAM,OAAO,6BAA8B,SAAQ,gBAAgB;IACxD,IAAI,GAAG,eAAe,CAAC;CACjC;AAED,MAAM,OAAO,iBAAkB,SAAQ,gBAAgB;IAC5C,IAAI,GAAG,eAAe,CAAC;CACjC;AAED,MAAM,OAAO,sBAAuB,SAAQ,gBAAgB;IACjD,IAAI,GAAG,qBAAqB,CAAC;CACvC;AAED,MAAM,OAAO,qBAAsB,SAAQ,gBAAgB;IAChD,IAAI,GAAG,mBAAmB,CAAC;CACrC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset Upload Service
|
|
3
|
+
*
|
|
4
|
+
* Single primitive for "store a binary, create a wrapper entity that
|
|
5
|
+
* points at it." Used by both the standalone `POST /api/repos/:repo/assets`
|
|
6
|
+
* route and the multi-file import dispatcher when it sees a binary
|
|
7
|
+
* extension.
|
|
8
|
+
*
|
|
9
|
+
* Flow per file:
|
|
10
|
+
* 1. Validate extension against `ASSET_UPLOAD_EXTENSIONS`.
|
|
11
|
+
* 2. Create the `asset` entity with stub frontmatter (collision-retry
|
|
12
|
+
* on entity_id, same `foo`→`foo-2` semantics as import-service).
|
|
13
|
+
* 3. Upload the binary via `graph.uploadAsset` — picks R2 or local
|
|
14
|
+
* filesystem from the workspace's asset config.
|
|
15
|
+
* 4. PDFs: extract text + page count via `pdf-parse`, write the text
|
|
16
|
+
* to a sidecar at `<workspace>/.studiograph/assets-text/asset/{id}.txt`
|
|
17
|
+
* so the vector indexer can RAG it without bloating the markdown body.
|
|
18
|
+
* 5. Update the entity with the resolved `asset_url` and per-kind
|
|
19
|
+
* metadata (`pages`, future `width`/`height`).
|
|
20
|
+
*/
|
|
21
|
+
import type { BaseGraphManager } from '../core/graph.js';
|
|
22
|
+
import type { AssetKind } from '../core/validation.js';
|
|
23
|
+
import type { GitUser } from './git.js';
|
|
24
|
+
export interface UploadAssetOptions {
|
|
25
|
+
graph: BaseGraphManager;
|
|
26
|
+
/** Original filename from the client. May contain path segments — only the basename is used. */
|
|
27
|
+
filename: string;
|
|
28
|
+
buffer: Buffer;
|
|
29
|
+
/** Repo-relative folder for the new entity's .md file. Empty/undefined = repo root. */
|
|
30
|
+
folderPath?: string;
|
|
31
|
+
/** Override entity name; defaults to title-cased slug of the filename stem. */
|
|
32
|
+
name?: string;
|
|
33
|
+
user?: GitUser;
|
|
34
|
+
/** Defer git commit so the caller can batch (e.g. multi-file imports). Default false. */
|
|
35
|
+
skipCommit?: boolean;
|
|
36
|
+
/** Workspace root used to anchor the PDF text sidecar at
|
|
37
|
+
* `<workspacePath>/.studiograph/assets-text/asset/{id}.txt`. When
|
|
38
|
+
* undefined, sidecars are not written (the asset still uploads). */
|
|
39
|
+
workspacePath?: string;
|
|
40
|
+
/** Auth user id of the uploader (web). Recorded in the asset index for the
|
|
41
|
+
* uploader+owner delete rule. Omit for CLI/import — stored as null. */
|
|
42
|
+
uploaderUserId?: string | null;
|
|
43
|
+
}
|
|
44
|
+
export interface UploadAssetResult {
|
|
45
|
+
entityId: string;
|
|
46
|
+
entityType: 'asset';
|
|
47
|
+
/** Absolute path of the created `.md` entity file. */
|
|
48
|
+
filePath: string;
|
|
49
|
+
asset_url: string;
|
|
50
|
+
asset_kind: AssetKind;
|
|
51
|
+
asset_size: number;
|
|
52
|
+
pages?: number;
|
|
53
|
+
/** Sidecar path when one was written (PDF only). Caller can include in batched commit's extraPaths. */
|
|
54
|
+
sidecarPath?: string;
|
|
55
|
+
}
|
|
56
|
+
export declare function uploadAsset(opts: UploadAssetOptions): Promise<UploadAssetResult>;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset Upload Service
|
|
3
|
+
*
|
|
4
|
+
* Single primitive for "store a binary, create a wrapper entity that
|
|
5
|
+
* points at it." Used by both the standalone `POST /api/repos/:repo/assets`
|
|
6
|
+
* route and the multi-file import dispatcher when it sees a binary
|
|
7
|
+
* extension.
|
|
8
|
+
*
|
|
9
|
+
* Flow per file:
|
|
10
|
+
* 1. Validate extension against `ASSET_UPLOAD_EXTENSIONS`.
|
|
11
|
+
* 2. Create the `asset` entity with stub frontmatter (collision-retry
|
|
12
|
+
* on entity_id, same `foo`→`foo-2` semantics as import-service).
|
|
13
|
+
* 3. Upload the binary via `graph.uploadAsset` — picks R2 or local
|
|
14
|
+
* filesystem from the workspace's asset config.
|
|
15
|
+
* 4. PDFs: extract text + page count via `pdf-parse`, write the text
|
|
16
|
+
* to a sidecar at `<workspace>/.studiograph/assets-text/asset/{id}.txt`
|
|
17
|
+
* so the vector indexer can RAG it without bloating the markdown body.
|
|
18
|
+
* 5. Update the entity with the resolved `asset_url` and per-kind
|
|
19
|
+
* metadata (`pages`, future `width`/`height`).
|
|
20
|
+
*/
|
|
21
|
+
import { extname, basename, join } from 'path';
|
|
22
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
23
|
+
import { log } from '../utils/log.js';
|
|
24
|
+
import { detectAssetKind, detectContentType, isAssetUploadExtension, safeFilename, } from './assets/base.js';
|
|
25
|
+
const slugify = (str) => str.toLowerCase().trim().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
26
|
+
const formatName = (slug) => slug.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
|
|
27
|
+
export async function uploadAsset(opts) {
|
|
28
|
+
const { graph, buffer, folderPath, user, skipCommit = false, workspacePath } = opts;
|
|
29
|
+
const onlyName = basename(opts.filename);
|
|
30
|
+
const ext = extname(onlyName).toLowerCase();
|
|
31
|
+
if (!isAssetUploadExtension(onlyName)) {
|
|
32
|
+
throw new Error(`Unsupported asset extension: ${ext || '(none)'}`);
|
|
33
|
+
}
|
|
34
|
+
if (!buffer || buffer.length === 0) {
|
|
35
|
+
throw new Error('Asset upload received an empty buffer');
|
|
36
|
+
}
|
|
37
|
+
const assetKind = detectAssetKind(onlyName);
|
|
38
|
+
const mime = detectContentType(onlyName);
|
|
39
|
+
// Probe asset configuration before mutating the graph. listAssets() is
|
|
40
|
+
// cheap and surfaces a helpful error when R2/local storage isn't
|
|
41
|
+
// wired up — better to fail before creating a stub entity that has
|
|
42
|
+
// nowhere to point at.
|
|
43
|
+
try {
|
|
44
|
+
await graph.listAssets('asset', '__check__');
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
if (err.message?.includes('not configured')) {
|
|
48
|
+
throw new Error('Asset storage is not configured for this workspace.');
|
|
49
|
+
}
|
|
50
|
+
// Other errors (e.g. entity-not-found) just mean the service IS configured.
|
|
51
|
+
}
|
|
52
|
+
const stem = onlyName.replace(/\.[^.]+$/, '');
|
|
53
|
+
const baseId = (slugify(stem).slice(0, 80).replace(/-$/, '')) || `asset-${Date.now()}`;
|
|
54
|
+
const name = opts.name ?? formatName(baseId);
|
|
55
|
+
const now = new Date().toISOString();
|
|
56
|
+
const userHandle = user?.email?.split('@')[0] ?? user?.name ?? 'upload';
|
|
57
|
+
const stubData = {
|
|
58
|
+
entity_type: 'asset',
|
|
59
|
+
entity_id: baseId,
|
|
60
|
+
name,
|
|
61
|
+
// Stub URL — populated post-upload. Required by the schema; '__pending__'
|
|
62
|
+
// is replaced before the second commit lands.
|
|
63
|
+
asset_url: '__pending__',
|
|
64
|
+
asset_kind: assetKind,
|
|
65
|
+
asset_extension: ext,
|
|
66
|
+
asset_size: buffer.length,
|
|
67
|
+
asset_mime: mime,
|
|
68
|
+
created_at: now,
|
|
69
|
+
updated_at: now,
|
|
70
|
+
created_by: userHandle,
|
|
71
|
+
updated_by: userHandle,
|
|
72
|
+
};
|
|
73
|
+
// Collision retry on (asset, entity_id). Mirrors the suffix scheme in
|
|
74
|
+
// import-service.createWithCollisionRetry — keeps re-uploads from
|
|
75
|
+
// silently dropping files.
|
|
76
|
+
let entityId = baseId;
|
|
77
|
+
let createdPath;
|
|
78
|
+
let suffix = 0;
|
|
79
|
+
while (true) {
|
|
80
|
+
entityId = suffix === 0 ? baseId : `${baseId}-${suffix + 1}`;
|
|
81
|
+
try {
|
|
82
|
+
const created = await graph.create({
|
|
83
|
+
entityType: 'asset',
|
|
84
|
+
entityId,
|
|
85
|
+
data: { ...stubData, entity_id: entityId },
|
|
86
|
+
content: '',
|
|
87
|
+
folderPath,
|
|
88
|
+
skipCommit: true,
|
|
89
|
+
user,
|
|
90
|
+
});
|
|
91
|
+
createdPath = created.path;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
96
|
+
if (!msg.includes('already exists') || suffix >= 50)
|
|
97
|
+
throw err;
|
|
98
|
+
suffix++;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Everything past this point operates on a real on-disk stub entity
|
|
102
|
+
// with `asset_url: '__pending__'`. If any step throws, the stub must be
|
|
103
|
+
// rolled back — otherwise the entity persists with a placeholder URL
|
|
104
|
+
// that surfaces as a broken asset in list/gallery/search/RAG. Rollback
|
|
105
|
+
// commits a delete (graph.delete is auto-commit-only by design); on the
|
|
106
|
+
// batch import path that's one extra commit per failure, which is
|
|
107
|
+
// acceptable on a failure path.
|
|
108
|
+
let pages;
|
|
109
|
+
let sidecarPath;
|
|
110
|
+
let asset_url;
|
|
111
|
+
try {
|
|
112
|
+
// Storage filename gets a Date.now() prefix to dodge same-name re-uploads.
|
|
113
|
+
const storedFilename = `${Date.now()}-${safeFilename(onlyName)}`;
|
|
114
|
+
const asset = await graph.uploadAsset('asset', entityId, storedFilename, buffer, undefined, { uploaderUserId: opts.uploaderUserId ?? null });
|
|
115
|
+
// PDF metadata extraction. pdf-parse is CPU-bound and runs on the
|
|
116
|
+
// request thread — gate by size so a 100MB PDF doesn't stall the
|
|
117
|
+
// event loop for every other in-flight Fastify request. Asset still
|
|
118
|
+
// uploads; it just won't be RAG-searchable until a future re-extract.
|
|
119
|
+
if (assetKind === 'pdf') {
|
|
120
|
+
const PDF_TEXT_BYTES_CAP = 20 * 1024 * 1024;
|
|
121
|
+
if (buffer.length > PDF_TEXT_BYTES_CAP) {
|
|
122
|
+
log.warn(`[asset-upload] PDF text extraction skipped for ${entityId}: ${buffer.length} bytes > ${PDF_TEXT_BYTES_CAP} cap`);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
let extractedText = '';
|
|
126
|
+
try {
|
|
127
|
+
const { PDFParse } = await import('pdf-parse');
|
|
128
|
+
const parser = new PDFParse({ data: buffer });
|
|
129
|
+
const result = await parser.getText();
|
|
130
|
+
await parser.destroy();
|
|
131
|
+
if (result.total && result.total > 0)
|
|
132
|
+
pages = result.total;
|
|
133
|
+
extractedText = result.text?.trim() ?? '';
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
// Non-fatal — extraction can fail on encrypted/scanned PDFs.
|
|
137
|
+
// Don't conflate with sidecar write failures (infra problem,
|
|
138
|
+
// not content problem) — those get their own warn below.
|
|
139
|
+
log.warn(`[asset-upload] PDF text extraction failed for ${entityId}: ${err instanceof Error ? err.message : err}`);
|
|
140
|
+
}
|
|
141
|
+
if (extractedText && workspacePath) {
|
|
142
|
+
try {
|
|
143
|
+
const sidecarDir = join(workspacePath, '.studiograph', 'assets-text', 'asset');
|
|
144
|
+
if (!existsSync(sidecarDir))
|
|
145
|
+
mkdirSync(sidecarDir, { recursive: true });
|
|
146
|
+
sidecarPath = join(sidecarDir, `${entityId}.txt`);
|
|
147
|
+
writeFileSync(sidecarPath, extractedText, 'utf-8');
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
// Sidecar write failures (disk full, permissions) leave the
|
|
151
|
+
// asset un-RAG-able but otherwise usable. Re-indexing later
|
|
152
|
+
// picks it back up if the sidecar appears.
|
|
153
|
+
sidecarPath = undefined;
|
|
154
|
+
log.warn(`[asset-upload] PDF sidecar write failed for ${entityId}: ${err instanceof Error ? err.message : err}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Canonical URL from uploadAsset (immutable-key scheme when wired, else
|
|
160
|
+
// legacy). Don't re-derive — the assetId isn't recoverable from (type,id).
|
|
161
|
+
asset_url = asset.publicUrl;
|
|
162
|
+
const updateData = { asset_url };
|
|
163
|
+
if (pages !== undefined)
|
|
164
|
+
updateData.pages = pages;
|
|
165
|
+
await graph.update({
|
|
166
|
+
entityType: 'asset',
|
|
167
|
+
entityId,
|
|
168
|
+
data: updateData,
|
|
169
|
+
skipCommit: true,
|
|
170
|
+
user,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
try {
|
|
175
|
+
await graph.delete('asset', entityId, `Rollback failed asset upload: ${entityId}`, user);
|
|
176
|
+
}
|
|
177
|
+
catch (cleanupErr) {
|
|
178
|
+
log.warn(`[asset-upload] rollback delete failed for ${entityId}: ${cleanupErr instanceof Error ? cleanupErr.message : cleanupErr}`);
|
|
179
|
+
}
|
|
180
|
+
throw err;
|
|
181
|
+
}
|
|
182
|
+
if (!skipCommit) {
|
|
183
|
+
const git = graph.getGitService();
|
|
184
|
+
if (git) {
|
|
185
|
+
const commitUser = user ?? { id: 'upload', name: 'Upload', email: 'upload@studiograph' };
|
|
186
|
+
git.commitAll(`Upload asset: ${entityId}`, commitUser);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
entityId,
|
|
191
|
+
entityType: 'asset',
|
|
192
|
+
filePath: createdPath,
|
|
193
|
+
asset_url,
|
|
194
|
+
asset_kind: assetKind,
|
|
195
|
+
asset_size: buffer.length,
|
|
196
|
+
pages,
|
|
197
|
+
sidecarPath,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=asset-upload-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-upload-service.js","sourceRoot":"","sources":["../../src/services/asset-upload-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HMAC-signed token bound to a pending pre-signed asset upload.
|
|
3
|
+
*
|
|
4
|
+
* Flow: presign mints a token + signed PUT URL; the agent uploads bytes to
|
|
5
|
+
* R2 directly, then calls `finalize_asset_upload({ token })`. The token
|
|
6
|
+
* carries enough state for finalize to find the pending blob, re-check the
|
|
7
|
+
* caller's authz, and register the asset — without trusting any arg from the
|
|
8
|
+
* agent. See ~/.claude/plans/mcp-presigned-asset-upload.md.
|
|
9
|
+
*
|
|
10
|
+
* Signed with `STUDIOGRAPH_JWT_SECRET` via `authService.getJwtSecret()`.
|
|
11
|
+
* Reusing the workspace's JWT secret is deliberate: one rotation lever, one
|
|
12
|
+
* audit boundary, and Phase 4 already env-requires it in production.
|
|
13
|
+
*
|
|
14
|
+
* The token is a bearer credential — anything that holds it can finalize as
|
|
15
|
+
* the original presigner. R1 in the plan closes the leak-and-replay vector
|
|
16
|
+
* by binding `payload.uploaderUserId` to the calling user at finalize.
|
|
17
|
+
*/
|
|
18
|
+
export interface AssetUploadTokenPayload {
|
|
19
|
+
/** UUIDv4 generated at presign. Doubles as the entity_id when the asset
|
|
20
|
+
* is self-owned (entity == undefined at presign). */
|
|
21
|
+
assetId: string;
|
|
22
|
+
/** Resolved repo name. Default = workspace assets folder; otherwise the
|
|
23
|
+
* explicit repo the agent passed. Finalize re-checks `canWriteRepo` on
|
|
24
|
+
* this. */
|
|
25
|
+
repo: string;
|
|
26
|
+
/** Owning entity type. 'asset' when self-owned (no entity attachment),
|
|
27
|
+
* else an entity type the agent passed at presign. */
|
|
28
|
+
ownerType: string;
|
|
29
|
+
/** Owning entity id. assetId when self-owned, else the entity id. */
|
|
30
|
+
ownerId: string;
|
|
31
|
+
/** Auth user id (as string — AuthUser.id is number but the index column
|
|
32
|
+
* is TEXT) of the user who presigned. Bound to the finalize caller via
|
|
33
|
+
* R1: leaked tokens can't be replayed by another folder-writer. */
|
|
34
|
+
uploaderUserId: string;
|
|
35
|
+
/** Pinned mime type. Restricted to the registry's presign-safe set
|
|
36
|
+
* (`presignMimeAllowlist()` — png/jpeg/gif/webp/avif/heic; SVG excluded).
|
|
37
|
+
* Pinned into the PUT signature so finalize can assert the stored
|
|
38
|
+
* Content-Type matches. */
|
|
39
|
+
mime: string;
|
|
40
|
+
/** Sanitized filename (post-safeFilename). Used to build the pending key
|
|
41
|
+
* and the canonical key — finalize doesn't accept a separate filename
|
|
42
|
+
* arg so the agent can't rename mid-flow. */
|
|
43
|
+
filename: string;
|
|
44
|
+
}
|
|
45
|
+
export declare function signAssetUploadToken(payload: AssetUploadTokenPayload, secret: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Verify a token and return the payload. Throws `TokenInvalidError` on:
|
|
48
|
+
* - tamper (any field mutated, including assetId)
|
|
49
|
+
* - wrong secret (rotation mid-flight)
|
|
50
|
+
* - expired (>15min since presign)
|
|
51
|
+
* - malformed (not a JWT, wrong shape)
|
|
52
|
+
*
|
|
53
|
+
* Caller (finalize) is responsible for the post-verify checks:
|
|
54
|
+
* - R1 identity bind: assert `String(user.id) === payload.uploaderUserId`
|
|
55
|
+
* - re-check `canWriteRepo(user, payload.repo, ...)`
|
|
56
|
+
* - HEAD the pending blob and validate ct + size
|
|
57
|
+
*/
|
|
58
|
+
export declare function verifyAssetUploadToken(token: string, secret: string): AssetUploadTokenPayload;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HMAC-signed token bound to a pending pre-signed asset upload.
|
|
3
|
+
*
|
|
4
|
+
* Flow: presign mints a token + signed PUT URL; the agent uploads bytes to
|
|
5
|
+
* R2 directly, then calls `finalize_asset_upload({ token })`. The token
|
|
6
|
+
* carries enough state for finalize to find the pending blob, re-check the
|
|
7
|
+
* caller's authz, and register the asset — without trusting any arg from the
|
|
8
|
+
* agent. See ~/.claude/plans/mcp-presigned-asset-upload.md.
|
|
9
|
+
*
|
|
10
|
+
* Signed with `STUDIOGRAPH_JWT_SECRET` via `authService.getJwtSecret()`.
|
|
11
|
+
* Reusing the workspace's JWT secret is deliberate: one rotation lever, one
|
|
12
|
+
* audit boundary, and Phase 4 already env-requires it in production.
|
|
13
|
+
*
|
|
14
|
+
* The token is a bearer credential — anything that holds it can finalize as
|
|
15
|
+
* the original presigner. R1 in the plan closes the leak-and-replay vector
|
|
16
|
+
* by binding `payload.uploaderUserId` to the calling user at finalize.
|
|
17
|
+
*/
|
|
18
|
+
import jwt from 'jsonwebtoken';
|
|
19
|
+
import { TokenInvalidError } from './asset-upload-errors.js';
|
|
20
|
+
import { presignMimeAllowlist } from '../core/format-registry.js';
|
|
21
|
+
const TOKEN_TTL_SECONDS = 15 * 60;
|
|
22
|
+
export function signAssetUploadToken(payload, secret) {
|
|
23
|
+
return jwt.sign(payload, secret, {
|
|
24
|
+
algorithm: 'HS256',
|
|
25
|
+
expiresIn: TOKEN_TTL_SECONDS,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Verify a token and return the payload. Throws `TokenInvalidError` on:
|
|
30
|
+
* - tamper (any field mutated, including assetId)
|
|
31
|
+
* - wrong secret (rotation mid-flight)
|
|
32
|
+
* - expired (>15min since presign)
|
|
33
|
+
* - malformed (not a JWT, wrong shape)
|
|
34
|
+
*
|
|
35
|
+
* Caller (finalize) is responsible for the post-verify checks:
|
|
36
|
+
* - R1 identity bind: assert `String(user.id) === payload.uploaderUserId`
|
|
37
|
+
* - re-check `canWriteRepo(user, payload.repo, ...)`
|
|
38
|
+
* - HEAD the pending blob and validate ct + size
|
|
39
|
+
*/
|
|
40
|
+
export function verifyAssetUploadToken(token, secret) {
|
|
41
|
+
let decoded;
|
|
42
|
+
try {
|
|
43
|
+
decoded = jwt.verify(token, secret, { algorithms: ['HS256'] });
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
throw new TokenInvalidError(err instanceof Error ? err.message : 'token verification failed');
|
|
47
|
+
}
|
|
48
|
+
if (!isPayload(decoded)) {
|
|
49
|
+
throw new TokenInvalidError('token payload has unexpected shape');
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
assetId: decoded.assetId,
|
|
53
|
+
repo: decoded.repo,
|
|
54
|
+
ownerType: decoded.ownerType,
|
|
55
|
+
ownerId: decoded.ownerId,
|
|
56
|
+
uploaderUserId: decoded.uploaderUserId,
|
|
57
|
+
mime: decoded.mime,
|
|
58
|
+
filename: decoded.filename,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function isPayload(value) {
|
|
62
|
+
if (!value || typeof value !== 'object')
|
|
63
|
+
return false;
|
|
64
|
+
const v = value;
|
|
65
|
+
return (typeof v.assetId === 'string' &&
|
|
66
|
+
typeof v.repo === 'string' &&
|
|
67
|
+
typeof v.ownerType === 'string' &&
|
|
68
|
+
typeof v.ownerId === 'string' &&
|
|
69
|
+
typeof v.uploaderUserId === 'string' &&
|
|
70
|
+
// Registry-derived presign-safe set (P4-V1). A tampered token carrying a
|
|
71
|
+
// non-presign-safe mime (svg, pdf, …) still fails validation here.
|
|
72
|
+
typeof v.mime === 'string' && presignMimeAllowlist().includes(v.mime) &&
|
|
73
|
+
typeof v.filename === 'string');
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=asset-upload-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-upload-token.js","sourceRoot":"","sources":["../../src/services/asset-upload-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AA8BlE,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,CAAC;AAElC,MAAM,UAAU,oBAAoB,CAClC,OAAgC,EAChC,MAAc;IAEd,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;QAC/B,SAAS,EAAE,OAAO;QAClB,SAAS,EAAE,iBAAiB;KAC7B,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,MAAc;IAEd,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,iBAAiB,CACzB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CACjE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,iBAAiB,CAAC,oCAAoC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CACL,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;QAC7B,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAC1B,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAC/B,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;QAC7B,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ;QACpC,yEAAyE;QACzE,mEAAmE;QACnE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,oBAAoB,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authoritative ownership index for immutable-keyed assets.
|
|
3
|
+
*
|
|
4
|
+
* Assets are stored under an immutable key `{assetId}/{filename}` (assetId =
|
|
5
|
+
* UUIDv4), so the storage location no longer encodes the owning entity's
|
|
6
|
+
* mutable `(type, id)`. This table is the single source of truth for:
|
|
7
|
+
* - per-repo authorization on the serving route (`repo`), and
|
|
8
|
+
* - "which assets does entity E own?" for delete/transfer (`owner_type`,
|
|
9
|
+
* `owner_id`).
|
|
10
|
+
*
|
|
11
|
+
* It is written authoritatively at upload and updated by every mutation path
|
|
12
|
+
* (rename/changeType/move/transfer/delete). It is NOT rebuilt from entity
|
|
13
|
+
* bodies: deriving ownership from user-editable `/api/assets/{id}` embeds would
|
|
14
|
+
* let a user in repo A claim an asset owned by repo B by pasting its URL —
|
|
15
|
+
* a privilege-escalation vector. Treat this db as durable critical state
|
|
16
|
+
* (it lives on the same persistent workspace volume as auth.db / secrets.db),
|
|
17
|
+
* not a regenerable cache.
|
|
18
|
+
*
|
|
19
|
+
* `migration_ledger` is a transient table used only by the one-time
|
|
20
|
+
* old→new key migration to stay idempotent; it is dropped after cutover.
|
|
21
|
+
*/
|
|
22
|
+
export interface AssetIndexRow {
|
|
23
|
+
assetId: string;
|
|
24
|
+
repo: string;
|
|
25
|
+
ownerType: string;
|
|
26
|
+
ownerId: string;
|
|
27
|
+
filename: string;
|
|
28
|
+
contentType: string;
|
|
29
|
+
mediaType: string;
|
|
30
|
+
name: string | null;
|
|
31
|
+
/** Auth user id (as string) of whoever uploaded the asset, or null for
|
|
32
|
+
* rows predating this column / system / agent uploads. Drives the
|
|
33
|
+
* "delete restricted to uploader + workspace owner" rule on the workspace
|
|
34
|
+
* asset store. NOT an ownership field (that's owner_type/owner_id) — purely
|
|
35
|
+
* provenance for delete authz. */
|
|
36
|
+
uploaderUserId: string | null;
|
|
37
|
+
/** Caption for the asset (alt-text / OCR / vision description). DB-only and
|
|
38
|
+
* durable next to the bytes, so it survives deletion of any entity that
|
|
39
|
+
* merely embeds the asset (asset-as-embed model). Populated by the async
|
|
40
|
+
* caption pass, not synchronously at upload — null until then. */
|
|
41
|
+
caption: string | null;
|
|
42
|
+
/** Byte size of the stored blob. Recorded at upload so the asset manager's
|
|
43
|
+
* ownerless listing can show size without resolving an entity (the legacy
|
|
44
|
+
* `asset` entity carried `asset_size` in frontmatter; free-standing assets
|
|
45
|
+
* carry it here). Null for rows predating this column. */
|
|
46
|
+
size: number | null;
|
|
47
|
+
createdAt: string;
|
|
48
|
+
}
|
|
49
|
+
export type AssetIndexInput = Omit<AssetIndexRow, 'createdAt' | 'uploaderUserId' | 'caption' | 'size'> & {
|
|
50
|
+
createdAt?: string;
|
|
51
|
+
/** Optional — omit/null when the uploader isn't an identified web user
|
|
52
|
+
* (CLI/import/agent). Existing put() callers stay source-compatible. */
|
|
53
|
+
uploaderUserId?: string | null;
|
|
54
|
+
/** Optional — set at upload when known (buffer length). Existing callers
|
|
55
|
+
* that omit it record null. */
|
|
56
|
+
size?: number | null;
|
|
57
|
+
};
|
|
58
|
+
/** Owner-reassignment changes for a mutation. Any subset may be supplied. */
|
|
59
|
+
export interface OwnerReassignment {
|
|
60
|
+
ownerType?: string;
|
|
61
|
+
ownerId?: string;
|
|
62
|
+
repo?: string;
|
|
63
|
+
}
|
|
64
|
+
export declare class AssetIndexService {
|
|
65
|
+
private db;
|
|
66
|
+
constructor(workspacePath: string);
|
|
67
|
+
/** Keep assets.db (+ WAL/SHM) out of the workspace config repo — it's
|
|
68
|
+
* local, durable on the workspace volume, and not safely rebuildable from
|
|
69
|
+
* bodies, so it's never committed. Mirrors auth.db / secrets.db. */
|
|
70
|
+
private ensureGitignore;
|
|
71
|
+
/** Insert or replace the row for an assetId (idempotent on re-run).
|
|
72
|
+
* `caption` is intentionally NOT in the ON CONFLICT update set: it's
|
|
73
|
+
* written later by the async caption pass via `setCaption`, and a re-put
|
|
74
|
+
* (e.g. migration) must not clobber an existing caption back to null. */
|
|
75
|
+
put(input: AssetIndexInput): void;
|
|
76
|
+
/** Set (or clear) the caption for an asset. Written by the async caption
|
|
77
|
+
* pass; isolated from `put` so it never touches ownership/size columns. */
|
|
78
|
+
setCaption(assetId: string, caption: string | null): void;
|
|
79
|
+
/** True if `user` may delete the given asset: the original uploader, or a
|
|
80
|
+
* workspace owner. Unknown-uploader rows (null) are owner-only. This is the
|
|
81
|
+
* D2 rule for the workspace asset store; folder-scoped assets continue to
|
|
82
|
+
* use folder write access. `isWorkspaceOwner` is passed in to keep this
|
|
83
|
+
* service free of an auth-service dependency. */
|
|
84
|
+
canDelete(assetId: string, userId: number | undefined, isWorkspaceOwner: boolean): boolean;
|
|
85
|
+
get(assetId: string): AssetIndexRow | null;
|
|
86
|
+
/**
|
|
87
|
+
* Assets owned by `(repo, ownerType, ownerId)`. The `repo` scope is
|
|
88
|
+
* mandatory: entity ids are unique only within (repo, type), NOT across the
|
|
89
|
+
* workspace — `note/foo` can exist in two repos. Matching on owner alone
|
|
90
|
+
* would let a delete/rename in repo A touch repo B's identically-named
|
|
91
|
+
* entity's assets (cross-repo data loss).
|
|
92
|
+
*/
|
|
93
|
+
listByOwner(repo: string, ownerType: string, ownerId: string): AssetIndexRow[];
|
|
94
|
+
listByRepo(repo: string): AssetIndexRow[];
|
|
95
|
+
/**
|
|
96
|
+
* Reassign every asset owned by `(repo, fromType, fromId)`. Used by mutations:
|
|
97
|
+
* - rename: reassignOwner(repo, type, oldId, { ownerId: newId })
|
|
98
|
+
* - changeType: reassignOwner(repo, oldType, id, { ownerType: newType })
|
|
99
|
+
* - cross-repo move/transfer: reassignOwner(sourceRepo, type, id, { repo: target })
|
|
100
|
+
* `repo` scopes the match (see listByOwner) — without it a rename in one repo
|
|
101
|
+
* would reassign a same-named entity's assets in another. Returns rows updated.
|
|
102
|
+
* No blob movement — keys are immutable.
|
|
103
|
+
*/
|
|
104
|
+
reassignOwner(repo: string, fromType: string, fromId: string, changes: OwnerReassignment): number;
|
|
105
|
+
/**
|
|
106
|
+
* Relocate a single free-standing asset to another folder, addressed by its
|
|
107
|
+
* immutable assetId (the asset manager's move). No blob movement — the key is
|
|
108
|
+
* `{assetId}/{filename}`, independent of repo; only the index row's scope
|
|
109
|
+
* changes. The relocated asset is normalized to folder-owned by its new repo
|
|
110
|
+
* (ownerType='folder', ownerId=targetRepo) — a free-standing asset's owner IS
|
|
111
|
+
* its folder, so this keeps the row coherent rather than stranding a stale
|
|
112
|
+
* owner_type/owner_id in the destination. Returns true if a row was updated.
|
|
113
|
+
* The caller gates this to free-standing assets.
|
|
114
|
+
*/
|
|
115
|
+
moveByAssetId(assetId: string, targetRepo: string): boolean;
|
|
116
|
+
delete(assetId: string): void;
|
|
117
|
+
ledgerGet(repo: string, oldKey: string): string | null;
|
|
118
|
+
ledgerPut(repo: string, oldKey: string, assetId: string): void;
|
|
119
|
+
ledgerEntries(): Array<{
|
|
120
|
+
repo: string;
|
|
121
|
+
oldKey: string;
|
|
122
|
+
assetId: string;
|
|
123
|
+
}>;
|
|
124
|
+
dropLedger(): void;
|
|
125
|
+
close(): void;
|
|
126
|
+
private toRow;
|
|
127
|
+
}
|