studiograph 1.3.48-next.26 → 1.3.48-next.261
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 +27 -17
- package/dist/agent/agent-pool.d.ts +120 -4
- package/dist/agent/agent-pool.js +358 -18
- package/dist/agent/agent-pool.js.map +1 -1
- package/dist/agent/context-window.d.ts +113 -0
- package/dist/agent/context-window.js +459 -0
- package/dist/agent/context-window.js.map +1 -0
- 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 +110 -11
- package/dist/agent/orchestrator.js +547 -75
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +18 -9
- package/dist/agent/prompts/entity-types-section.js +42 -18
- package/dist/agent/prompts/entity-types-section.js.map +1 -1
- package/dist/agent/prompts/system.md +107 -19
- package/dist/agent/skill-loader.js +3 -9
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/skills/artifact-canvas/skill.md +257 -0
- package/dist/agent/skills/create-skill.md +39 -0
- package/dist/agent/skills/entity-schema.md +67 -150
- package/dist/agent/skills/interview/skill.md +44 -29
- package/dist/agent/skills/paged-documents/skill.md +147 -0
- package/dist/agent/skills/schema-rules.md +28 -28
- package/dist/agent/tools/artifact-tools.d.ts +237 -0
- package/dist/agent/tools/artifact-tools.js +407 -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 +50 -0
- package/dist/agent/tools/folder-tools.js +340 -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 +1 -1
- package/dist/agent/tools/fs-tools.js.map +1 -1
- package/dist/agent/tools/graph-tools.d.ts +45 -73
- package/dist/agent/tools/graph-tools.js +765 -239
- 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 +465 -0
- package/dist/agent/tools/history-tools.js.map +1 -0
- package/dist/agent/tools/load-skill.d.ts +4 -3
- package/dist/agent/tools/load-skill.js +1 -1
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +2 -1
- package/dist/agent/tools/ops-tools.js +125 -25
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +69 -21
- package/dist/agent/tools/permission-tools.js +183 -18
- 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/admin/folder.js +187 -0
- 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 +48 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate-asset-owners.d.ts +56 -0
- package/dist/cli/commands/admin/migrate-asset-owners.js +86 -0
- package/dist/cli/commands/admin/migrate-asset-owners.js.map +1 -0
- package/dist/cli/commands/admin/migrate-assets.d.ts +62 -0
- package/dist/cli/commands/admin/migrate-assets.js +237 -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 +23 -3
- package/dist/cli/commands/clone.js +140 -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 +7 -4
- 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 +242 -24
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +230 -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 -23
- 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/cli/theme.d.ts +1 -1
- package/dist/core/accent-palette.d.ts +7 -18
- package/dist/core/accent-palette.js +27 -38
- package/dist/core/accent-palette.js.map +1 -1
- package/dist/core/artifact-asset-resolution.d.ts +90 -0
- package/dist/core/artifact-asset-resolution.js +138 -0
- package/dist/core/artifact-asset-resolution.js.map +1 -0
- package/dist/core/artifact-asset-urls.d.ts +111 -0
- package/dist/core/artifact-asset-urls.js +174 -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 +83 -0
- package/dist/core/artifact-export.js +1567 -0
- package/dist/core/artifact-export.js.map +1 -0
- package/dist/core/artifact-frame-document.d.ts +105 -0
- package/dist/core/artifact-frame-document.js +1427 -0
- package/dist/core/artifact-frame-document.js.map +1 -0
- package/dist/core/artifact-frame-layout.d.ts +79 -0
- package/dist/core/artifact-frame-layout.js +94 -0
- package/dist/core/artifact-frame-layout.js.map +1 -0
- package/dist/core/artifact-frame-model.d.ts +198 -0
- package/dist/core/artifact-frame-model.js +603 -0
- package/dist/core/artifact-frame-model.js.map +1 -0
- package/dist/core/artifact-frame-selectors.d.ts +42 -0
- package/dist/core/artifact-frame-selectors.js +65 -0
- package/dist/core/artifact-frame-selectors.js.map +1 -0
- package/dist/core/artifact-libraries.d.ts +23 -0
- package/dist/core/artifact-libraries.js +229 -0
- package/dist/core/artifact-libraries.js.map +1 -0
- package/dist/core/artifact-manifest.d.ts +64 -0
- package/dist/core/artifact-manifest.js +88 -0
- package/dist/core/artifact-manifest.js.map +1 -0
- package/dist/core/artifact-paged-css.d.ts +64 -0
- package/dist/core/artifact-paged-css.js +253 -0
- package/dist/core/artifact-paged-css.js.map +1 -0
- package/dist/core/artifact-patch.d.ts +58 -0
- package/dist/core/artifact-patch.js +309 -0
- package/dist/core/artifact-patch.js.map +1 -0
- package/dist/core/artifact-warnings.d.ts +51 -0
- package/dist/core/artifact-warnings.js +165 -0
- package/dist/core/artifact-warnings.js.map +1 -0
- package/dist/core/breakpoints.d.ts +27 -0
- package/dist/core/breakpoints.js +28 -0
- package/dist/core/breakpoints.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 +108 -0
- package/dist/core/embeds.js +226 -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 +66 -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/font-family.d.ts +62 -0
- package/dist/core/font-family.js +84 -0
- package/dist/core/font-family.js.map +1 -0
- package/dist/core/format-registry.d.ts +187 -0
- package/dist/core/format-registry.js +411 -0
- package/dist/core/format-registry.js.map +1 -0
- package/dist/core/graph.d.ts +770 -30
- package/dist/core/graph.js +2282 -386
- 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/markdown-strip.d.ts +22 -0
- package/dist/core/markdown-strip.js +51 -0
- package/dist/core/markdown-strip.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 +237 -0
- package/dist/core/secrets/registry.js +710 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/seed-folder.d.ts +59 -0
- package/dist/core/seed-folder.js +76 -0
- package/dist/core/seed-folder.js.map +1 -0
- package/dist/core/types.d.ts +88 -480
- package/dist/core/types.js +53 -6
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +81 -14
- package/dist/core/user-config.js +147 -17
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +828 -1472
- package/dist/core/validation.js +475 -163
- package/dist/core/validation.js.map +1 -1
- package/dist/core/view-scope.d.ts +88 -0
- package/dist/core/view-scope.js +71 -0
- package/dist/core/view-scope.js.map +1 -0
- package/dist/core/workspace-manager.d.ts +156 -11
- package/dist/core/workspace-manager.js +364 -92
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +19 -5
- package/dist/core/workspace.js +72 -56
- 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 +31 -25
- 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 +73 -2
- package/dist/mcp/tools.js +2289 -115
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/__tests__/helpers/graph-api.d.ts +17 -0
- package/dist/server/__tests__/helpers/graph-api.js +17 -0
- package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
- package/dist/server/__tests__/helpers/multipart.d.ts +9 -0
- package/dist/server/__tests__/helpers/multipart.js +14 -0
- package/dist/server/__tests__/helpers/multipart.js.map +1 -0
- package/dist/server/artifact-asset-mint.d.ts +59 -0
- package/dist/server/artifact-asset-mint.js +127 -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 +50 -1
- package/dist/server/index.js +811 -229
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/sanitize.d.ts +46 -0
- package/dist/server/middleware/sanitize.js +195 -0
- package/dist/server/middleware/sanitize.js.map +1 -0
- package/dist/server/process-guards.d.ts +37 -0
- package/dist/server/process-guards.js +44 -0
- package/dist/server/process-guards.js.map +1 -0
- package/dist/server/routes/ai-usage-api.d.ts +24 -0
- package/dist/server/routes/ai-usage-api.js +68 -0
- package/dist/server/routes/ai-usage-api.js.map +1 -0
- package/dist/server/routes/artifact-export-api.d.ts +11 -0
- package/dist/server/routes/artifact-export-api.js +180 -0
- package/dist/server/routes/artifact-export-api.js.map +1 -0
- package/dist/server/routes/artifact-patch-api.d.ts +19 -0
- package/dist/server/routes/artifact-patch-api.js +114 -0
- package/dist/server/routes/artifact-patch-api.js.map +1 -0
- package/dist/server/routes/artifact-selection-api.d.ts +15 -0
- package/dist/server/routes/artifact-selection-api.js +90 -0
- package/dist/server/routes/artifact-selection-api.js.map +1 -0
- package/dist/server/routes/asset-api.d.ts +88 -2
- package/dist/server/routes/asset-api.js +858 -112
- 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 +113 -0
- package/dist/server/routes/audit-api.js.map +1 -0
- package/dist/server/routes/auth-api.js +536 -44
- package/dist/server/routes/auth-api.js.map +1 -1
- package/dist/server/routes/capture-api.js +81 -9
- 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 +462 -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 +858 -68
- 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 +183 -57
- package/dist/server/routes/config-api.js.map +1 -1
- package/dist/server/routes/connectors-api.js +178 -45
- 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/event-ingest-api.js +125 -0
- 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 +3 -3
- package/dist/server/routes/git-http.js +90 -30
- package/dist/server/routes/git-http.js.map +1 -1
- package/dist/server/routes/graph-api-access.d.ts +63 -0
- package/dist/server/routes/graph-api-access.js +115 -0
- package/dist/server/routes/graph-api-access.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +2 -3
- package/dist/server/routes/graph-api.js +1341 -423
- 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 +116 -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 +352 -66
- package/dist/server/routes/insights-api.js.map +1 -1
- package/dist/server/routes/mcp.d.ts +8 -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 +8 -3
- package/dist/server/routes/permissions-api.js +43 -12
- 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 +273 -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 +305 -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 +177 -0
- package/dist/server/routes/settings-api.js.map +1 -0
- package/dist/server/routes/share-api.d.ts +30 -6
- package/dist/server/routes/share-api.js +240 -31
- package/dist/server/routes/share-api.js.map +1 -1
- package/dist/server/routes/views-api.d.ts +11 -2
- package/dist/server/routes/views-api.js +123 -22
- 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 +150 -23
- package/dist/server/routes/workspace-api.js.map +1 -1
- package/dist/server/routes/ws.d.ts +2 -1
- package/dist/server/routes/ws.js +73 -20
- 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 +135 -56
- package/dist/server/ws-hub.js +0 -0
- package/dist/server/ws-hub.js.map +1 -1
- package/dist/server/yjs-manager.d.ts +275 -18
- package/dist/server/yjs-manager.js +819 -70
- 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 +121 -0
- package/dist/services/access-control.js +194 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/ai-usage-ledger.d.ts +75 -0
- package/dist/services/ai-usage-ledger.js +250 -0
- package/dist/services/ai-usage-ledger.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-inspect-metadata.d.ts +21 -0
- package/dist/services/artifact-inspect-metadata.js +66 -0
- package/dist/services/artifact-inspect-metadata.js.map +1 -0
- package/dist/services/artifact-library-sources.d.ts +33 -0
- package/dist/services/artifact-library-sources.js +91 -0
- package/dist/services/artifact-library-sources.js.map +1 -0
- package/dist/services/artifact-patch-runner.d.ts +52 -0
- package/dist/services/artifact-patch-runner.js +74 -0
- package/dist/services/artifact-patch-runner.js.map +1 -0
- package/dist/services/artifact-render-export.d.ts +230 -0
- package/dist/services/artifact-render-export.js +1003 -0
- package/dist/services/artifact-render-export.js.map +1 -0
- package/dist/services/artifact-selection-store.d.ts +68 -0
- package/dist/services/artifact-selection-store.js +90 -0
- package/dist/services/artifact-selection-store.js.map +1 -0
- package/dist/services/artifact-store.d.ts +118 -0
- package/dist/services/artifact-store.js +234 -0
- package/dist/services/artifact-store.js.map +1 -0
- package/dist/services/asset-caption-service.d.ts +103 -0
- package/dist/services/asset-caption-service.js +200 -0
- package/dist/services/asset-caption-service.js.map +1 -0
- package/dist/services/asset-delete-authz.d.ts +32 -0
- package/dist/services/asset-delete-authz.js +62 -0
- package/dist/services/asset-delete-authz.js.map +1 -0
- package/dist/services/asset-delete-impact.d.ts +63 -0
- package/dist/services/asset-delete-impact.js +96 -0
- package/dist/services/asset-delete-impact.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 +116 -0
- package/dist/services/asset-import-service.js +436 -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 +271 -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 +63 -0
- package/dist/services/asset-listing.js +124 -0
- package/dist/services/asset-listing.js.map +1 -0
- package/dist/services/asset-move-impact.d.ts +49 -0
- package/dist/services/asset-move-impact.js +62 -0
- package/dist/services/asset-move-impact.js.map +1 -0
- package/dist/services/asset-presign-service.d.ts +62 -0
- package/dist/services/asset-presign-service.js +126 -0
- package/dist/services/asset-presign-service.js.map +1 -0
- package/dist/services/asset-reference-index.d.ts +39 -0
- package/dist/services/asset-reference-index.js +33 -0
- package/dist/services/asset-reference-index.js.map +1 -0
- package/dist/services/asset-reference-scan.d.ts +57 -0
- package/dist/services/asset-reference-scan.js +150 -0
- package/dist/services/asset-reference-scan.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 +158 -0
- package/dist/services/assets/asset-index-service.js +293 -0
- package/dist/services/assets/asset-index-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +119 -4
- package/dist/services/assets/base.js +148 -3
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +90 -0
- package/dist/services/assets/index.js +202 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +9 -0
- package/dist/services/assets/local.js +30 -4
- 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 +80 -0
- package/dist/services/assets/r2.js +159 -4
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +278 -51
- package/dist/services/auth-service.js +995 -272
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/chat-session-service.d.ts +189 -0
- package/dist/services/chat-session-service.js +544 -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 +321 -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 +313 -0
- package/dist/services/entity-mutations.js +531 -0
- package/dist/services/entity-mutations.js.map +1 -0
- package/dist/services/event-processor.d.ts +104 -0
- package/dist/services/event-processor.js +451 -0
- 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/fonts/font-metadata.d.ts +42 -0
- package/dist/services/fonts/font-metadata.js +126 -0
- package/dist/services/fonts/font-metadata.js.map +1 -0
- package/dist/services/fonts/font-skill-service.d.ts +66 -0
- package/dist/services/fonts/font-skill-service.js +137 -0
- package/dist/services/fonts/font-skill-service.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 +49 -0
- package/dist/services/personal-folder.js +122 -0
- package/dist/services/personal-folder.js.map +1 -0
- package/dist/services/playwright-bootstrap.d.ts +78 -0
- package/dist/services/playwright-bootstrap.js +219 -0
- package/dist/services/playwright-bootstrap.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 +201 -0
- package/dist/services/scratch-attachment-service.js +354 -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 +341 -0
- package/dist/services/user-person-bridge.js.map +1 -0
- package/dist/services/utility-model-resolver.d.ts +37 -0
- package/dist/services/utility-model-resolver.js +67 -0
- package/dist/services/utility-model-resolver.js.map +1 -0
- package/dist/services/vector-service.d.ts +282 -5
- package/dist/services/vector-service.js +594 -39
- package/dist/services/vector-service.js.map +1 -1
- package/dist/services/workspace-access.d.ts +115 -0
- package/dist/services/workspace-access.js +154 -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.B8rPC4xg.css +2 -0
- package/dist/web/_app/immutable/assets/12.DlIf1mKh.css +1 -0
- package/dist/web/_app/immutable/assets/13.WUaKJbVc.css +1 -0
- package/dist/web/_app/immutable/assets/15.CItnu3nw.css +1 -0
- package/dist/web/_app/immutable/assets/16.C3czeWWx.css +1 -0
- package/dist/web/_app/immutable/assets/17.CHiwoAMO.css +1 -0
- package/dist/web/_app/immutable/assets/18.fUGuXQ0K.css +1 -0
- package/dist/web/_app/immutable/assets/19.DcuK5ZVm.css +1 -0
- package/dist/web/_app/immutable/assets/2.bJqlVFXX.css +1 -0
- package/dist/web/_app/immutable/assets/3.DDfEAhbB.css +1 -0
- package/dist/web/_app/immutable/assets/4.Dtodt1Fe.css +1 -0
- package/dist/web/_app/immutable/assets/6.JPVpkzLZ.css +1 -0
- package/dist/web/_app/immutable/assets/AssetLibraryPicker.BWH260L8.css +1 -0
- package/dist/web/_app/immutable/assets/BulkActionsBar.CXSM7tO7.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.Cch9MMQW.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.BvV1lBCg.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMutationDialogs.De2NQ55E.css +1 -0
- package/dist/web/_app/immutable/assets/FolderPicker.Cq1tMnu_.css +1 -0
- package/dist/web/_app/immutable/assets/FolderTreeField.DTSzn15s.css +1 -0
- package/dist/web/_app/immutable/assets/FrameCanvas.Clh5Xdr7.css +1 -0
- package/dist/web/_app/immutable/assets/GalleryView.Cqu3-wtr.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
- package/dist/web/_app/immutable/assets/GridCell.czY6eDb_.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.C5X8TbQk.css +1 -0
- package/dist/web/_app/immutable/assets/Link.vV0ne105.css +1 -0
- package/dist/web/_app/immutable/assets/Markdown.CSYKSAm0.css +1 -0
- package/dist/web/_app/immutable/assets/Rail.Dyxy_E0O.css +1 -0
- package/dist/web/_app/immutable/assets/RepoCheckList.BLeJ79Eg.css +1 -0
- package/dist/web/_app/immutable/assets/SaveViewDialog.Bb9E81xd.css +1 -0
- package/dist/web/_app/immutable/assets/SearchInput.DTB6W35f.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.CHzfQoo_.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/StopFilledAlt.CjuwgVxu.css +1 -0
- package/dist/web/_app/immutable/assets/TimelineView.u4YqiztR.css +1 -0
- package/dist/web/_app/immutable/assets/Version.BQq1Fihu.css +1 -0
- package/dist/web/_app/immutable/assets/ViewBanner.DWswnFdi.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.Cd6TS6oo.css +1 -0
- package/dist/web/_app/immutable/assets/button.DOg1smbV.css +1 -0
- package/dist/web/_app/immutable/assets/checkbox.CAcHq8G6.css +1 -0
- package/dist/web/_app/immutable/assets/download-with-progress.BZlFTn09.css +1 -0
- package/dist/web/_app/immutable/assets/filters.RgfXKVpA.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/list-columns.BgnafZ4K.css +1 -0
- package/dist/web/_app/immutable/chunks/-MYqXlc3.js +185 -0
- package/dist/web/_app/immutable/chunks/-Tbr-96c2.js +1 -0
- package/dist/web/_app/immutable/chunks/1QRy7-wo.js +1 -0
- package/dist/web/_app/immutable/chunks/1_BWKAKA2.js +23 -0
- package/dist/web/_app/immutable/chunks/2z2ekE6D2.js +2 -0
- package/dist/web/_app/immutable/chunks/6guf_P8c.js +1 -0
- package/dist/web/_app/immutable/chunks/7l950wkn.js +1 -0
- package/dist/web/_app/immutable/chunks/9Sn2PwSn2.js +1025 -0
- package/dist/web/_app/immutable/chunks/AFZSy-Vk.js +2 -0
- package/dist/web/_app/immutable/chunks/B06uE1qJ.js +1 -0
- package/dist/web/_app/immutable/chunks/B2cjR0rG.js +83 -0
- package/dist/web/_app/immutable/chunks/B3u4QMoU.js +1 -0
- package/dist/web/_app/immutable/chunks/B4PrlkmE.js +1 -0
- package/dist/web/_app/immutable/chunks/B5UH1FNe.js +3 -0
- package/dist/web/_app/immutable/chunks/B5sxjq1L2.js +1 -0
- package/dist/web/_app/immutable/chunks/B6Lt-qaJ.js +1 -0
- package/dist/web/_app/immutable/chunks/B6wo7Stk2.js +1 -0
- package/dist/web/_app/immutable/chunks/B9KfEsQw2.js +1 -0
- package/dist/web/_app/immutable/chunks/B9MY422N.js +1 -0
- package/dist/web/_app/immutable/chunks/B9VQbssY.js +3 -0
- package/dist/web/_app/immutable/chunks/BBrP9GiZ.js +1 -0
- package/dist/web/_app/immutable/chunks/BEGTD2EL2.js +1 -0
- package/dist/web/_app/immutable/chunks/BEyPhM3C.js +1 -0
- package/dist/web/_app/immutable/chunks/BIeOkmiV.js +1 -0
- package/dist/web/_app/immutable/chunks/BIwe25Lk.js +1 -0
- package/dist/web/_app/immutable/chunks/BO6-nRV9.js +1 -0
- package/dist/web/_app/immutable/chunks/BPILs-6H.js +1 -0
- package/dist/web/_app/immutable/chunks/BPRQzMGs.js +1 -0
- package/dist/web/_app/immutable/chunks/BQE7bWgF.js +1 -0
- package/dist/web/_app/immutable/chunks/BU5TCj7m.js +12 -0
- package/dist/web/_app/immutable/chunks/BZDKT2Qw2.js +2 -0
- package/dist/web/_app/immutable/chunks/B_y9A6Kg.js +4 -0
- package/dist/web/_app/immutable/chunks/BdR7t2GN.js +3 -0
- package/dist/web/_app/immutable/chunks/BnYohOts2.js +1 -0
- package/dist/web/_app/immutable/chunks/Bpmx7Umc.js +1 -0
- package/dist/web/_app/immutable/chunks/BqButnP4.js +1 -0
- package/dist/web/_app/immutable/chunks/BtDSRU36.js +1 -0
- package/dist/web/_app/immutable/chunks/Bvr6nSm92.js +1 -0
- package/dist/web/_app/immutable/chunks/BvyVm7-j.js +184 -0
- package/dist/web/_app/immutable/chunks/Bx6T8G5n2.js +1 -0
- package/dist/web/_app/immutable/chunks/BxeOdaUQ.js +1 -0
- package/dist/web/_app/immutable/chunks/C1B4xDs0.js +1 -0
- package/dist/web/_app/immutable/chunks/C2yz630b.js +2 -0
- package/dist/web/_app/immutable/chunks/C5YoDj-e.js +1 -0
- package/dist/web/_app/immutable/chunks/C6d9nn3k.js +1 -0
- package/dist/web/_app/immutable/chunks/C85NG5lS.js +1 -0
- package/dist/web/_app/immutable/chunks/C8ZiSqQm.js +1 -0
- package/dist/web/_app/immutable/chunks/CB-t1Bv-.js +1 -0
- package/dist/web/_app/immutable/chunks/CG8YKaqc.js +5 -0
- package/dist/web/_app/immutable/chunks/CJbr-v9X.js +1 -0
- package/dist/web/_app/immutable/chunks/CKGHeJzq.js +1 -0
- package/dist/web/_app/immutable/chunks/CKwV6HKc.js +1 -0
- package/dist/web/_app/immutable/chunks/CLninaDG2.js +2 -0
- package/dist/web/_app/immutable/chunks/CM400nLL.js +7 -0
- package/dist/web/_app/immutable/chunks/CPvxN2G62.js +1 -0
- package/dist/web/_app/immutable/chunks/CQW66fYJ.js +1 -0
- package/dist/web/_app/immutable/chunks/CQl_RUVN2.js +1 -0
- package/dist/web/_app/immutable/chunks/CR1JY_cb.js +6 -0
- package/dist/web/_app/immutable/chunks/CT35tdLp.js +1 -0
- package/dist/web/_app/immutable/chunks/CVKrGJ6C.js +1 -0
- package/dist/web/_app/immutable/chunks/CWIHttTH.js +1 -0
- package/dist/web/_app/immutable/chunks/CWZSexLW.js +1 -0
- package/dist/web/_app/immutable/chunks/CXPMb3zd.js +1 -0
- package/dist/web/_app/immutable/chunks/CZBW5wi82.js +1 -0
- package/dist/web/_app/immutable/chunks/CaimSvvF.js +5 -0
- package/dist/web/_app/immutable/chunks/CcWaWbrI2.js +1 -0
- package/dist/web/_app/immutable/chunks/CcgYvk_3.js +1 -0
- package/dist/web/_app/immutable/chunks/Cg7m1gqN.js +1 -0
- package/dist/web/_app/immutable/chunks/CgCz4Fj6.js +1 -0
- package/dist/web/_app/immutable/chunks/CgOgBK5j.js +1 -0
- package/dist/web/_app/immutable/chunks/ChS3kWO-.js +2 -0
- package/dist/web/_app/immutable/chunks/CkivrILi.js +1 -0
- package/dist/web/_app/immutable/chunks/CmWflMFc.js +1 -0
- package/dist/web/_app/immutable/chunks/Cm_yhEon2.js +1 -0
- package/dist/web/_app/immutable/chunks/CnoUnj6-2.js +1 -0
- package/dist/web/_app/immutable/chunks/CqyFdLMa.js +1 -0
- package/dist/web/_app/immutable/chunks/CsIWxmio2.js +22 -0
- package/dist/web/_app/immutable/chunks/CtgdtZ0G2.js +1 -0
- package/dist/web/_app/immutable/chunks/CuYL65Bn.js +2 -0
- package/dist/web/_app/immutable/chunks/CuatNdzp.js +2 -0
- package/dist/web/_app/immutable/chunks/Cx5IiiDO2.js +2 -0
- package/dist/web/_app/immutable/chunks/Cxdio_Al.js +2692 -0
- package/dist/web/_app/immutable/chunks/CyTgggiM2.js +1 -0
- package/dist/web/_app/immutable/chunks/D-vvXTU3.js +2 -0
- package/dist/web/_app/immutable/chunks/D0_Iu3Uj.js +2 -0
- package/dist/web/_app/immutable/chunks/D4vfNy_f.js +1 -0
- package/dist/web/_app/immutable/chunks/D6toh9Mr.js +1 -0
- package/dist/web/_app/immutable/chunks/DAsarOLg2.js +1 -0
- package/dist/web/_app/immutable/chunks/DBGaXAP8.js +1 -0
- package/dist/web/_app/immutable/chunks/DCgKWtld.js +1 -0
- package/dist/web/_app/immutable/chunks/DG7uGoZb2.js +58 -0
- package/dist/web/_app/immutable/chunks/DIsSxB_C.js +1 -0
- package/dist/web/_app/immutable/chunks/DJTvBXur.js +2 -0
- package/dist/web/_app/immutable/chunks/DLuIHCPq.js +1 -0
- package/dist/web/_app/immutable/chunks/DMFH9Cnt2.js +1 -0
- package/dist/web/_app/immutable/chunks/DNLoQniz.js +1 -0
- package/dist/web/_app/immutable/chunks/DPLkAijI2.js +1 -0
- package/dist/web/_app/immutable/chunks/DQMWa2t7.js +1 -0
- package/dist/web/_app/immutable/chunks/DTOO9nUj.js +1 -0
- package/dist/web/_app/immutable/chunks/DaB0hU8_.js +1 -0
- package/dist/web/_app/immutable/chunks/Dav8Lgyy2.js +5 -0
- package/dist/web/_app/immutable/chunks/Ddgu2Sjp.js +1 -0
- package/dist/web/_app/immutable/chunks/DfUXQOZ92.js +1 -0
- package/dist/web/_app/immutable/chunks/DgP0Pxes.js +224 -0
- package/dist/web/_app/immutable/chunks/DhD1HF7R.js +1 -0
- package/dist/web/_app/immutable/chunks/Dhmw5GUH.js +1 -0
- package/dist/web/_app/immutable/chunks/DiBVOY752.js +1 -0
- package/dist/web/_app/immutable/chunks/DiMsLIh3.js +1 -0
- package/dist/web/_app/immutable/chunks/DiiXREv7.js +1 -0
- package/dist/web/_app/immutable/chunks/DjXtgWTP.js +1 -0
- package/dist/web/_app/immutable/chunks/Dk2-JtmU2.js +1 -0
- package/dist/web/_app/immutable/chunks/Dl0bYyV_.js +1 -0
- package/dist/web/_app/immutable/chunks/DqKYbIld2.js +1 -0
- package/dist/web/_app/immutable/chunks/DtXJCaQc2.js +1 -0
- package/dist/web/_app/immutable/chunks/DwuBUEvU.js +1 -0
- package/dist/web/_app/immutable/chunks/F5xZdLlB.js +2 -0
- package/dist/web/_app/immutable/chunks/F92HmKX8.js +1 -0
- package/dist/web/_app/immutable/chunks/FISIvbqq.js +3 -0
- package/dist/web/_app/immutable/chunks/GC5Izn9E2.js +1 -0
- package/dist/web/_app/immutable/chunks/IMJutqSu2.js +1 -0
- package/dist/web/_app/immutable/chunks/K5YHt1WL2.js +1 -0
- package/dist/web/_app/immutable/chunks/MAYbL-xn2.js +6 -0
- package/dist/web/_app/immutable/chunks/MMtHlrry.js +1 -0
- package/dist/web/_app/immutable/chunks/MtN4vJa02.js +1 -0
- package/dist/web/_app/immutable/chunks/Oglnp7sm.js +14 -0
- package/dist/web/_app/immutable/chunks/PwUOTfSv.js +2 -0
- package/dist/web/_app/immutable/chunks/QsO256-z.js +1 -0
- package/dist/web/_app/immutable/chunks/RA-JwTzo.js +1 -0
- package/dist/web/_app/immutable/chunks/atFSAfcd2.js +2 -0
- package/dist/web/_app/immutable/chunks/j_uHTBnD.js +1 -0
- package/dist/web/_app/immutable/chunks/joKsoiFC.js +1 -0
- package/dist/web/_app/immutable/chunks/kNaey6uv.js +1 -0
- package/dist/web/_app/immutable/chunks/nqo2e2Yv.js +1 -0
- package/dist/web/_app/immutable/chunks/oIZupUnz.js +1 -0
- package/dist/web/_app/immutable/chunks/pPsy4008.js +1 -0
- package/dist/web/_app/immutable/chunks/qevfNcid.js +1 -0
- package/dist/web/_app/immutable/chunks/rjjyuGhb.js +1 -0
- package/dist/web/_app/immutable/chunks/sUAtda6y2.js +2 -0
- package/dist/web/_app/immutable/chunks/snCOoD78.js +1 -0
- package/dist/web/_app/immutable/chunks/uHaS74te.js +1 -0
- package/dist/web/_app/immutable/chunks/w5tsuIav.js +5 -0
- package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/dist/web/_app/immutable/entry/app.1tcNTKI-.js +2 -0
- package/dist/web/_app/immutable/entry/start.BJMsySI1.js +1 -0
- package/dist/web/_app/immutable/nodes/0.v0W5DL7W.js +2 -0
- package/dist/web/_app/immutable/nodes/1.81Rb3Ith.js +1 -0
- package/dist/web/_app/immutable/nodes/10.CAlZNFOq.js +1 -0
- package/dist/web/_app/immutable/nodes/11.CCfUginI.js +1 -0
- package/dist/web/_app/immutable/nodes/12.BJLboAyk.js +1 -0
- package/dist/web/_app/immutable/nodes/13.Cz4UTl2G.js +1 -0
- package/dist/web/_app/immutable/nodes/14.DJwakC0o.js +1 -0
- package/dist/web/_app/immutable/nodes/15.D2mNE6C-.js +1 -0
- package/dist/web/_app/immutable/nodes/16.BjohAUt9.js +1 -0
- package/dist/web/_app/immutable/nodes/17.BI2F37bS.js +1 -0
- package/dist/web/_app/immutable/nodes/18.DsOT0tDo.js +1 -0
- package/dist/web/_app/immutable/nodes/19.BiJWLOUT.js +77 -0
- package/dist/web/_app/immutable/nodes/2.Cd72nG2V.js +124 -0
- package/dist/web/_app/immutable/nodes/3.BIT9mm9r.js +6 -0
- package/dist/web/_app/immutable/nodes/4.Cn7r0Poe.js +16 -0
- package/dist/web/_app/immutable/nodes/5.CkJNdCZG.js +1 -0
- package/dist/web/_app/immutable/nodes/6.1rbIRQgQ.js +6 -0
- package/dist/web/_app/immutable/nodes/7.w17Zl36i.js +1 -0
- package/dist/web/_app/immutable/nodes/8.DqTsYuU-.js +1 -0
- package/dist/web/_app/immutable/nodes/9.BJhYZPfc.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 +59 -20
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +44 -15
- package/dist/agent/role-loader.d.ts +0 -24
- package/dist/agent/role-loader.js +0 -67
- package/dist/agent/role-loader.js.map +0 -1
- package/dist/agent/skills/create-deck/content-guide.md +0 -238
- package/dist/agent/skills/create-deck/deck-cadence.md +0 -105
- package/dist/agent/skills/create-deck/diagrams.md +0 -431
- package/dist/agent/skills/create-deck/skill.md +0 -89
- package/dist/agent/skills/create-deck/slide-selection.md +0 -115
- package/dist/agent/skills/create-deck/slide-types.md +0 -638
- package/dist/agent/skills/create-document/skill.md +0 -229
- package/dist/agent/skills/enrich-entities.md +0 -136
- package/dist/agent/skills/obsidian-source-setup.md +0 -246
- package/dist/agent/skills/skill-loader.d.ts +0 -48
- package/dist/agent/skills/skill-loader.js +0 -166
- package/dist/agent/skills/skill-loader.js.map +0 -1
- 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 -96
- package/dist/agent/tools/message-tools.js.map +0 -1
- package/dist/agent/tools/sync-tools.d.ts +0 -35
- package/dist/agent/tools/sync-tools.js +0 -992
- package/dist/agent/tools/sync-tools.js.map +0 -1
- package/dist/auth/github.d.ts +0 -56
- package/dist/auth/github.js +0 -169
- package/dist/auth/github.js.map +0 -1
- package/dist/cli/commands/access.d.ts +0 -11
- package/dist/cli/commands/access.js +0 -156
- package/dist/cli/commands/access.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/auth.d.ts +0 -10
- package/dist/cli/commands/auth.js +0 -79
- package/dist/cli/commands/auth.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 +0 -185
- package/dist/cli/commands/collection.js.map +0 -1
- package/dist/cli/commands/enrich.d.ts +0 -11
- package/dist/cli/commands/enrich.js +0 -135
- package/dist/cli/commands/enrich.js.map +0 -1
- package/dist/cli/commands/graphrag.d.ts +0 -12
- package/dist/cli/commands/graphrag.js +0 -122
- package/dist/cli/commands/graphrag.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/members.d.ts +0 -11
- package/dist/cli/commands/members.js +0 -230
- package/dist/cli/commands/members.js.map +0 -1
- package/dist/cli/commands/org.d.ts +0 -10
- package/dist/cli/commands/org.js +0 -132
- package/dist/cli/commands/org.js.map +0 -1
- package/dist/cli/commands/provision.d.ts +0 -8
- package/dist/cli/commands/provision.js +0 -116
- package/dist/cli/commands/provision.js.map +0 -1
- package/dist/cli/commands/resolve.d.ts +0 -8
- package/dist/cli/commands/resolve.js +0 -85
- package/dist/cli/commands/resolve.js.map +0 -1
- package/dist/cli/commands/review.d.ts +0 -19
- package/dist/cli/commands/review.js +0 -128
- package/dist/cli/commands/review.js.map +0 -1
- package/dist/cli/commands/source.d.ts +0 -16
- package/dist/cli/commands/source.js +0 -159
- package/dist/cli/commands/source.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -7
- package/dist/cli/commands/start.js +0 -576
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/sync-collection.d.ts +0 -14
- package/dist/cli/commands/sync-collection.js +0 -355
- package/dist/cli/commands/sync-collection.js.map +0 -1
- package/dist/cli/commands/sync-entities.d.ts +0 -13
- package/dist/cli/commands/sync-entities.js +0 -242
- package/dist/cli/commands/sync-entities.js.map +0 -1
- package/dist/cli/commands/team.d.ts +0 -12
- package/dist/cli/commands/team.js +0 -185
- package/dist/cli/commands/team.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 -169
- 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/cli/sync-review-interactive.d.ts +0 -31
- package/dist/cli/sync-review-interactive.js +0 -393
- package/dist/cli/sync-review-interactive.js.map +0 -1
- package/dist/core/feature-flags.d.ts +0 -17
- package/dist/core/feature-flags.js +0 -15
- package/dist/core/feature-flags.js.map +0 -1
- package/dist/core/features.d.ts +0 -16
- package/dist/core/features.js +0 -48
- package/dist/core/features.js.map +0 -1
- package/dist/core/launch-entity-types.d.ts +0 -23
- package/dist/core/launch-entity-types.js +0 -48
- package/dist/core/launch-entity-types.js.map +0 -1
- package/dist/core/migration-runner.d.ts +0 -42
- package/dist/core/migration-runner.js +0 -232
- package/dist/core/migration-runner.js.map +0 -1
- package/dist/core/migration-types.d.ts +0 -101
- package/dist/core/migration-types.js +0 -21
- package/dist/core/migration-types.js.map +0 -1
- package/dist/core/migrations/20260219-formalize-memory-location.d.ts +0 -2
- package/dist/core/migrations/20260219-formalize-memory-location.js +0 -35
- package/dist/core/migrations/20260219-formalize-memory-location.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +0 -12
- package/dist/core/migrations/20260220-add-workspace-metadata.js +0 -65
- package/dist/core/migrations/20260220-add-workspace-metadata.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-readme.d.ts +0 -11
- package/dist/core/migrations/20260220-add-workspace-readme.js +0 -82
- package/dist/core/migrations/20260220-add-workspace-readme.js.map +0 -1
- package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +0 -9
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js +0 -64
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +0 -1
- package/dist/core/migrations/index.d.ts +0 -11
- package/dist/core/migrations/index.js +0 -23
- package/dist/core/migrations/index.js.map +0 -1
- package/dist/integrations/asana.d.ts +0 -26
- package/dist/integrations/asana.js +0 -78
- package/dist/integrations/asana.js.map +0 -1
- package/dist/integrations/figma-local.d.ts +0 -16
- package/dist/integrations/figma-local.js +0 -10
- package/dist/integrations/figma-local.js.map +0 -1
- package/dist/integrations/figma.d.ts +0 -17
- package/dist/integrations/figma.js +0 -17
- package/dist/integrations/figma.js.map +0 -1
- package/dist/integrations/granola.d.ts +0 -24
- package/dist/integrations/granola.js +0 -60
- package/dist/integrations/granola.js.map +0 -1
- package/dist/integrations/linear.d.ts +0 -14
- package/dist/integrations/linear.js +0 -80
- package/dist/integrations/linear.js.map +0 -1
- package/dist/integrations/paper-local.d.ts +0 -14
- package/dist/integrations/paper-local.js +0 -10
- package/dist/integrations/paper-local.js.map +0 -1
- package/dist/integrations/paper.d.ts +0 -2
- package/dist/integrations/paper.js +0 -10
- package/dist/integrations/paper.js.map +0 -1
- package/dist/integrations/pipedrive.d.ts +0 -26
- package/dist/integrations/pipedrive.js +0 -97
- package/dist/integrations/pipedrive.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/mcp/connectors/asana.d.ts +0 -2
- package/dist/mcp/connectors/asana.js +0 -20
- package/dist/mcp/connectors/asana.js.map +0 -1
- package/dist/mcp/connectors/definitions.d.ts +0 -45
- package/dist/mcp/connectors/definitions.js +0 -32
- package/dist/mcp/connectors/definitions.js.map +0 -1
- package/dist/mcp/connectors/figma.d.ts +0 -5
- package/dist/mcp/connectors/figma.js +0 -21
- package/dist/mcp/connectors/figma.js.map +0 -1
- package/dist/mcp/connectors/gdrive.d.ts +0 -2
- package/dist/mcp/connectors/gdrive.js +0 -20
- package/dist/mcp/connectors/gdrive.js.map +0 -1
- package/dist/mcp/connectors/granola.d.ts +0 -2
- package/dist/mcp/connectors/granola.js +0 -12
- package/dist/mcp/connectors/granola.js.map +0 -1
- package/dist/mcp/connectors/linear.d.ts +0 -2
- package/dist/mcp/connectors/linear.js +0 -19
- package/dist/mcp/connectors/linear.js.map +0 -1
- package/dist/mcp/connectors/obsidian.d.ts +0 -2
- package/dist/mcp/connectors/obsidian.js +0 -19
- package/dist/mcp/connectors/obsidian.js.map +0 -1
- package/dist/mcp/connectors/pipedrive.d.ts +0 -2
- package/dist/mcp/connectors/pipedrive.js +0 -20
- package/dist/mcp/connectors/pipedrive.js.map +0 -1
- package/dist/mcp/connectors/slack.d.ts +0 -2
- package/dist/mcp/connectors/slack.js +0 -21
- package/dist/mcp/connectors/slack.js.map +0 -1
- package/dist/mcp/server-oauth-provider.d.ts +0 -56
- package/dist/mcp/server-oauth-provider.js +0 -142
- package/dist/mcp/server-oauth-provider.js.map +0 -1
- package/dist/renderers/documents/branding.d.ts +0 -2
- package/dist/renderers/documents/branding.js +0 -42
- package/dist/renderers/documents/branding.js.map +0 -1
- package/dist/renderers/documents/entity-types.json +0 -14
- package/dist/renderers/documents/parser/frontmatter.d.ts +0 -5
- package/dist/renderers/documents/parser/frontmatter.js +0 -90
- package/dist/renderers/documents/parser/frontmatter.js.map +0 -1
- package/dist/renderers/documents/parser/index.d.ts +0 -5
- package/dist/renderers/documents/parser/index.js +0 -142
- package/dist/renderers/documents/parser/index.js.map +0 -1
- package/dist/renderers/documents/parser/sections.d.ts +0 -18
- package/dist/renderers/documents/parser/sections.js +0 -131
- package/dist/renderers/documents/parser/sections.js.map +0 -1
- package/dist/renderers/documents/pdf/generator.d.ts +0 -13
- package/dist/renderers/documents/pdf/generator.js +0 -79
- package/dist/renderers/documents/pdf/generator.js.map +0 -1
- package/dist/renderers/documents/plugin.d.ts +0 -2
- package/dist/renderers/documents/plugin.js +0 -63
- package/dist/renderers/documents/plugin.js.map +0 -1
- package/dist/renderers/documents/public/branding/logo.svg +0 -3
- package/dist/renderers/documents/public/editor/chrome.css +0 -461
- package/dist/renderers/documents/public/editor/chrome.js +0 -524
- package/dist/renderers/documents/public/editor/editor.css +0 -751
- package/dist/renderers/documents/public/editor/editor.html +0 -140
- package/dist/renderers/documents/public/editor/editor.js +0 -953
- package/dist/renderers/documents/public/fonts/fonts.css +0 -145
- package/dist/renderers/documents/public/viewer/viewer.css +0 -1
- package/dist/renderers/documents/public/viewer/viewer.js +0 -4
- package/dist/renderers/documents/renderer/back.d.ts +0 -8
- package/dist/renderers/documents/renderer/back.js +0 -28
- package/dist/renderers/documents/renderer/back.js.map +0 -1
- package/dist/renderers/documents/renderer/content.d.ts +0 -7
- package/dist/renderers/documents/renderer/content.js +0 -25
- package/dist/renderers/documents/renderer/content.js.map +0 -1
- package/dist/renderers/documents/renderer/cover.d.ts +0 -15
- package/dist/renderers/documents/renderer/cover.js +0 -43
- package/dist/renderers/documents/renderer/cover.js.map +0 -1
- package/dist/renderers/documents/renderer/helpers.d.ts +0 -1
- package/dist/renderers/documents/renderer/helpers.js +0 -11
- package/dist/renderers/documents/renderer/helpers.js.map +0 -1
- package/dist/renderers/documents/renderer/index.d.ts +0 -32
- package/dist/renderers/documents/renderer/index.js +0 -80
- package/dist/renderers/documents/renderer/index.js.map +0 -1
- package/dist/renderers/documents/renderer/styles.d.ts +0 -16
- package/dist/renderers/documents/renderer/styles.js +0 -546
- package/dist/renderers/documents/renderer/styles.js.map +0 -1
- package/dist/renderers/documents/routes/api.d.ts +0 -2
- package/dist/renderers/documents/routes/api.js +0 -587
- package/dist/renderers/documents/routes/api.js.map +0 -1
- package/dist/renderers/documents/routes/editor.d.ts +0 -2
- package/dist/renderers/documents/routes/editor.js +0 -31
- package/dist/renderers/documents/routes/editor.js.map +0 -1
- package/dist/renderers/documents/routes/viewer.d.ts +0 -2
- package/dist/renderers/documents/routes/viewer.js +0 -67
- package/dist/renderers/documents/routes/viewer.js.map +0 -1
- package/dist/renderers/documents/types.d.ts +0 -61
- package/dist/renderers/documents/types.js +0 -2
- package/dist/renderers/documents/types.js.map +0 -1
- package/dist/renderers/index.d.ts +0 -24
- package/dist/renderers/index.js +0 -66
- package/dist/renderers/index.js.map +0 -1
- package/dist/renderers/slides/design-system/tokens.d.ts +0 -108
- package/dist/renderers/slides/design-system/tokens.js +0 -44
- package/dist/renderers/slides/design-system/tokens.js.map +0 -1
- package/dist/renderers/slides/entity-types.json +0 -14
- package/dist/renderers/slides/parser/comment-parser.d.ts +0 -10
- package/dist/renderers/slides/parser/comment-parser.js +0 -89
- package/dist/renderers/slides/parser/comment-parser.js.map +0 -1
- package/dist/renderers/slides/parser/frontmatter.d.ts +0 -10
- package/dist/renderers/slides/parser/frontmatter.js +0 -93
- package/dist/renderers/slides/parser/frontmatter.js.map +0 -1
- package/dist/renderers/slides/parser/index.d.ts +0 -7
- package/dist/renderers/slides/parser/index.js +0 -569
- package/dist/renderers/slides/parser/index.js.map +0 -1
- package/dist/renderers/slides/parser/slide-splitter.d.ts +0 -6
- package/dist/renderers/slides/parser/slide-splitter.js +0 -54
- package/dist/renderers/slides/parser/slide-splitter.js.map +0 -1
- package/dist/renderers/slides/parser/type-detector.d.ts +0 -6
- package/dist/renderers/slides/parser/type-detector.js +0 -70
- package/dist/renderers/slides/parser/type-detector.js.map +0 -1
- package/dist/renderers/slides/pdf/generator.d.ts +0 -11
- package/dist/renderers/slides/pdf/generator.js +0 -105
- package/dist/renderers/slides/pdf/generator.js.map +0 -1
- package/dist/renderers/slides/plugin.d.ts +0 -2
- package/dist/renderers/slides/plugin.js +0 -70
- package/dist/renderers/slides/plugin.js.map +0 -1
- package/dist/renderers/slides/public/editor/.gitkeep +0 -0
- package/dist/renderers/slides/public/editor/chrome.css +0 -461
- package/dist/renderers/slides/public/editor/chrome.js +0 -519
- package/dist/renderers/slides/public/editor/editor.css +0 -896
- package/dist/renderers/slides/public/editor/editor.html +0 -131
- package/dist/renderers/slides/public/editor/editor.js +0 -1038
- package/dist/renderers/slides/public/fonts/fonts.css +0 -145
- package/dist/renderers/slides/public/viewer/.gitkeep +0 -0
- package/dist/renderers/slides/public/viewer/chrome.css +0 -62
- package/dist/renderers/slides/public/viewer/transitions.css +0 -1
- package/dist/renderers/slides/public/viewer/viewer.css +0 -2145
- package/dist/renderers/slides/public/viewer/viewer.js +0 -303
- package/dist/renderers/slides/renderer/chrome/browser-frame.d.ts +0 -5
- package/dist/renderers/slides/renderer/chrome/browser-frame.js +0 -22
- package/dist/renderers/slides/renderer/chrome/browser-frame.js.map +0 -1
- package/dist/renderers/slides/renderer/chrome/mobile-frame.d.ts +0 -6
- package/dist/renderers/slides/renderer/chrome/mobile-frame.js +0 -18
- package/dist/renderers/slides/renderer/chrome/mobile-frame.js.map +0 -1
- package/dist/renderers/slides/renderer/helpers.d.ts +0 -13
- package/dist/renderers/slides/renderer/helpers.js +0 -33
- package/dist/renderers/slides/renderer/helpers.js.map +0 -1
- package/dist/renderers/slides/renderer/index.d.ts +0 -16
- package/dist/renderers/slides/renderer/index.js +0 -160
- package/dist/renderers/slides/renderer/index.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/agenda.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/agenda.js +0 -18
- package/dist/renderers/slides/renderer/layouts/agenda.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/blank.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/blank.js +0 -4
- package/dist/renderers/slides/renderer/layouts/blank.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/columns.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/columns.js +0 -32
- package/dist/renderers/slides/renderer/layouts/columns.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/cover.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/cover.js +0 -18
- package/dist/renderers/slides/renderer/layouts/cover.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/diagram-concentric.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/diagram-concentric.js +0 -120
- package/dist/renderers/slides/renderer/layouts/diagram-concentric.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/diagram-matrix.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/diagram-matrix.js +0 -158
- package/dist/renderers/slides/renderer/layouts/diagram-matrix.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/diagram-pyramid.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/diagram-pyramid.js +0 -86
- package/dist/renderers/slides/renderer/layouts/diagram-pyramid.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/diagram-sitemap.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/diagram-sitemap.js +0 -146
- package/dist/renderers/slides/renderer/layouts/diagram-sitemap.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/diagram-venn.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/diagram-venn.js +0 -100
- package/dist/renderers/slides/renderer/layouts/diagram-venn.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/diagram.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/diagram.js +0 -21
- package/dist/renderers/slides/renderer/layouts/diagram.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/divider.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/divider.js +0 -4
- package/dist/renderers/slides/renderer/layouts/divider.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/end.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/end.js +0 -8
- package/dist/renderers/slides/renderer/layouts/end.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/framework.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/framework.js +0 -47
- package/dist/renderers/slides/renderer/layouts/framework.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-browser-2up.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-browser-2up.js +0 -38
- package/dist/renderers/slides/renderer/layouts/image-browser-2up.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-browser-6up.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-browser-6up.js +0 -30
- package/dist/renderers/slides/renderer/layouts/image-browser-6up.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-browser.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-browser.js +0 -18
- package/dist/renderers/slides/renderer/layouts/image-browser.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-bullets.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-bullets.js +0 -26
- package/dist/renderers/slides/renderer/layouts/image-bullets.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-device-pair.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-device-pair.js +0 -34
- package/dist/renderers/slides/renderer/layouts/image-device-pair.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-full.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-full.js +0 -36
- package/dist/renderers/slides/renderer/layouts/image-full.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-grid-2x2.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-grid-2x2.js +0 -23
- package/dist/renderers/slides/renderer/layouts/image-grid-2x2.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-keywords.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-keywords.js +0 -31
- package/dist/renderers/slides/renderer/layouts/image-keywords.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-mobile-3up.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-mobile-3up.js +0 -22
- package/dist/renderers/slides/renderer/layouts/image-mobile-3up.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-mobile.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-mobile.js +0 -17
- package/dist/renderers/slides/renderer/layouts/image-mobile.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-split-right.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-split-right.js +0 -19
- package/dist/renderers/slides/renderer/layouts/image-split-right.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/image-split.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/image-split.js +0 -19
- package/dist/renderers/slides/renderer/layouts/image-split.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/introductions.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/introductions.js +0 -41
- package/dist/renderers/slides/renderer/layouts/introductions.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/moodboard.d.ts +0 -15
- package/dist/renderers/slides/renderer/layouts/moodboard.js +0 -63
- package/dist/renderers/slides/renderer/layouts/moodboard.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/next-steps.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/next-steps.js +0 -13
- package/dist/renderers/slides/renderer/layouts/next-steps.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/pullquote.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/pullquote.js +0 -17
- package/dist/renderers/slides/renderer/layouts/pullquote.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/schedule.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/schedule.js +0 -58
- package/dist/renderers/slides/renderer/layouts/schedule.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/section.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/section.js +0 -18
- package/dist/renderers/slides/renderer/layouts/section.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/statement.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/statement.js +0 -13
- package/dist/renderers/slides/renderer/layouts/statement.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/stats.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/stats.js +0 -26
- package/dist/renderers/slides/renderer/layouts/stats.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/table.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/table.js +0 -23
- package/dist/renderers/slides/renderer/layouts/table.js.map +0 -1
- package/dist/renderers/slides/renderer/layouts/text-body.d.ts +0 -2
- package/dist/renderers/slides/renderer/layouts/text-body.js +0 -14
- package/dist/renderers/slides/renderer/layouts/text-body.js.map +0 -1
- package/dist/renderers/slides/renderer/placeholder.d.ts +0 -5
- package/dist/renderers/slides/renderer/placeholder.js +0 -12
- package/dist/renderers/slides/renderer/placeholder.js.map +0 -1
- package/dist/renderers/slides/routes/api.d.ts +0 -2
- package/dist/renderers/slides/routes/api.js +0 -568
- package/dist/renderers/slides/routes/api.js.map +0 -1
- package/dist/renderers/slides/routes/editor.d.ts +0 -2
- package/dist/renderers/slides/routes/editor.js +0 -32
- package/dist/renderers/slides/routes/editor.js.map +0 -1
- package/dist/renderers/slides/routes/viewer.d.ts +0 -2
- package/dist/renderers/slides/routes/viewer.js +0 -67
- package/dist/renderers/slides/routes/viewer.js.map +0 -1
- package/dist/renderers/slides/types.d.ts +0 -111
- package/dist/renderers/slides/types.js +0 -2
- package/dist/renderers/slides/types.js.map +0 -1
- package/dist/server/agents/agent-loader.d.ts +0 -16
- package/dist/server/agents/agent-loader.js +0 -175
- package/dist/server/agents/agent-loader.js.map +0 -1
- package/dist/server/agents/agent-runner.d.ts +0 -33
- package/dist/server/agents/agent-runner.js +0 -187
- package/dist/server/agents/agent-runner.js.map +0 -1
- package/dist/server/agents/agent-runtime.d.ts +0 -39
- package/dist/server/agents/agent-runtime.js +0 -214
- package/dist/server/agents/agent-runtime.js.map +0 -1
- package/dist/server/agents/base-agent.d.ts +0 -30
- package/dist/server/agents/base-agent.js +0 -88
- package/dist/server/agents/base-agent.js.map +0 -1
- package/dist/server/agents/executive-digest.d.ts +0 -16
- package/dist/server/agents/executive-digest.js +0 -115
- package/dist/server/agents/executive-digest.js.map +0 -1
- package/dist/server/agents/graph-steward.d.ts +0 -16
- package/dist/server/agents/graph-steward.js +0 -59
- package/dist/server/agents/graph-steward.js.map +0 -1
- package/dist/server/agents/meeting-followup.d.ts +0 -16
- package/dist/server/agents/meeting-followup.js +0 -88
- package/dist/server/agents/meeting-followup.js.map +0 -1
- package/dist/server/agents/pipeline-monitor.d.ts +0 -15
- package/dist/server/agents/pipeline-monitor.js +0 -86
- package/dist/server/agents/pipeline-monitor.js.map +0 -1
- package/dist/server/agents/types.d.ts +0 -81
- package/dist/server/agents/types.js +0 -41
- package/dist/server/agents/types.js.map +0 -1
- package/dist/server/chrome/chrome.css +0 -701
- package/dist/server/chrome/chrome.js +0 -374
- package/dist/server/collab-authority.d.ts +0 -70
- package/dist/server/collab-authority.js +0 -218
- package/dist/server/collab-authority.js.map +0 -1
- package/dist/server/collab.d.ts +0 -29
- package/dist/server/collab.js +0 -195
- package/dist/server/collab.js.map +0 -1
- 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/agents-api.d.ts +0 -10
- package/dist/server/routes/agents-api.js +0 -25
- package/dist/server/routes/agents-api.js.map +0 -1
- package/dist/server/routes/collab.d.ts +0 -6
- package/dist/server/routes/collab.js +0 -10
- package/dist/server/routes/collab.js.map +0 -1
- package/dist/server/routes/features-api.d.ts +0 -10
- package/dist/server/routes/features-api.js +0 -15
- package/dist/server/routes/features-api.js.map +0 -1
- package/dist/server/routes/git-api.d.ts +0 -9
- package/dist/server/routes/git-api.js +0 -82
- package/dist/server/routes/git-api.js.map +0 -1
- package/dist/server/routes/meeting-ingest-api.d.ts +0 -14
- package/dist/server/routes/meeting-ingest-api.js +0 -117
- 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 -569
- package/dist/server/routes/messages-api.js.map +0 -1
- package/dist/server/routes/sync-api.d.ts +0 -26
- package/dist/server/routes/sync-api.js +0 -848
- package/dist/server/routes/sync-api.js.map +0 -1
- package/dist/server/routes/view-public.d.ts +0 -10
- package/dist/server/routes/view-public.js +0 -107
- package/dist/server/routes/view-public.js.map +0 -1
- package/dist/server/routes/webhook.d.ts +0 -14
- package/dist/server/routes/webhook.js +0 -102
- package/dist/server/routes/webhook.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 -206
- package/dist/services/briefing.js.map +0 -1
- package/dist/services/github-provisioner.d.ts +0 -36
- package/dist/services/github-provisioner.js +0 -126
- package/dist/services/github-provisioner.js.map +0 -1
- package/dist/services/github-service.d.ts +0 -99
- package/dist/services/github-service.js +0 -310
- package/dist/services/github-service.js.map +0 -1
- package/dist/services/heartbeat.d.ts +0 -35
- package/dist/services/heartbeat.js +0 -236
- 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.d.ts +0 -97
- package/dist/services/meeting-processor.js +0 -382
- package/dist/services/meeting-processor.js.map +0 -1
- package/dist/services/message-service.d.ts +0 -117
- package/dist/services/message-service.js +0 -414
- package/dist/services/message-service.js.map +0 -1
- package/dist/services/sync/collection-sync.d.ts +0 -60
- package/dist/services/sync/collection-sync.js +0 -509
- package/dist/services/sync/collection-sync.js.map +0 -1
- package/dist/services/sync/commit.d.ts +0 -60
- package/dist/services/sync/commit.js +0 -354
- package/dist/services/sync/commit.js.map +0 -1
- package/dist/services/sync/context-index.d.ts +0 -69
- package/dist/services/sync/context-index.js +0 -280
- package/dist/services/sync/context-index.js.map +0 -1
- package/dist/services/sync/data-fetcher.d.ts +0 -31
- package/dist/services/sync/data-fetcher.js +0 -12
- package/dist/services/sync/data-fetcher.js.map +0 -1
- package/dist/services/sync/derive.d.ts +0 -34
- package/dist/services/sync/derive.js +0 -164
- package/dist/services/sync/derive.js.map +0 -1
- package/dist/services/sync/enrichment-state.d.ts +0 -31
- package/dist/services/sync/enrichment-state.js +0 -63
- package/dist/services/sync/enrichment-state.js.map +0 -1
- package/dist/services/sync/enrichment.d.ts +0 -25
- package/dist/services/sync/enrichment.js +0 -121
- package/dist/services/sync/enrichment.js.map +0 -1
- package/dist/services/sync/entity-refresh.d.ts +0 -30
- package/dist/services/sync/entity-refresh.js +0 -275
- package/dist/services/sync/entity-refresh.js.map +0 -1
- package/dist/services/sync/frontmatter-extractor.d.ts +0 -40
- package/dist/services/sync/frontmatter-extractor.js +0 -279
- package/dist/services/sync/frontmatter-extractor.js.map +0 -1
- package/dist/services/sync/graph-match-state.d.ts +0 -33
- package/dist/services/sync/graph-match-state.js +0 -61
- package/dist/services/sync/graph-match-state.js.map +0 -1
- package/dist/services/sync/graph-match.d.ts +0 -53
- package/dist/services/sync/graph-match.js +0 -316
- package/dist/services/sync/graph-match.js.map +0 -1
- package/dist/services/sync/graphrag-client.d.ts +0 -43
- package/dist/services/sync/graphrag-client.js +0 -94
- package/dist/services/sync/graphrag-client.js.map +0 -1
- package/dist/services/sync/graphrag-config.d.ts +0 -16
- package/dist/services/sync/graphrag-config.js +0 -39
- package/dist/services/sync/graphrag-config.js.map +0 -1
- package/dist/services/sync/graphrag-context.d.ts +0 -14
- package/dist/services/sync/graphrag-context.js +0 -109
- package/dist/services/sync/graphrag-context.js.map +0 -1
- package/dist/services/sync/graphrag-indexer.d.ts +0 -30
- package/dist/services/sync/graphrag-indexer.js +0 -358
- package/dist/services/sync/graphrag-indexer.js.map +0 -1
- package/dist/services/sync/llm.d.ts +0 -32
- package/dist/services/sync/llm.js +0 -115
- package/dist/services/sync/llm.js.map +0 -1
- package/dist/services/sync/mcp-client.d.ts +0 -71
- package/dist/services/sync/mcp-client.js +0 -299
- package/dist/services/sync/mcp-client.js.map +0 -1
- package/dist/services/sync/model-factory.d.ts +0 -13
- package/dist/services/sync/model-factory.js +0 -38
- package/dist/services/sync/model-factory.js.map +0 -1
- package/dist/services/sync/name-quality.d.ts +0 -31
- package/dist/services/sync/name-quality.js +0 -60
- package/dist/services/sync/name-quality.js.map +0 -1
- package/dist/services/sync/output-schemas.d.ts +0 -92
- package/dist/services/sync/output-schemas.js +0 -43
- package/dist/services/sync/output-schemas.js.map +0 -1
- package/dist/services/sync/prompts.d.ts +0 -19
- package/dist/services/sync/prompts.js +0 -128
- package/dist/services/sync/prompts.js.map +0 -1
- package/dist/services/sync/reconciler.d.ts +0 -48
- package/dist/services/sync/reconciler.js +0 -294
- package/dist/services/sync/reconciler.js.map +0 -1
- package/dist/services/sync/rest-client.d.ts +0 -40
- package/dist/services/sync/rest-client.js +0 -100
- package/dist/services/sync/rest-client.js.map +0 -1
- package/dist/services/sync/source-config.d.ts +0 -67
- package/dist/services/sync/source-config.js +0 -304
- package/dist/services/sync/source-config.js.map +0 -1
- package/dist/services/sync/source-definitions/asana.d.ts +0 -14
- package/dist/services/sync/source-definitions/asana.js +0 -42
- package/dist/services/sync/source-definitions/asana.js.map +0 -1
- package/dist/services/sync/source-definitions/definitions.d.ts +0 -8
- package/dist/services/sync/source-definitions/definitions.js +0 -8
- package/dist/services/sync/source-definitions/definitions.js.map +0 -1
- package/dist/services/sync/source-definitions/gdrive.d.ts +0 -16
- package/dist/services/sync/source-definitions/gdrive.js +0 -68
- package/dist/services/sync/source-definitions/gdrive.js.map +0 -1
- package/dist/services/sync/source-definitions/granola.d.ts +0 -2
- package/dist/services/sync/source-definitions/granola.js +0 -21
- package/dist/services/sync/source-definitions/granola.js.map +0 -1
- package/dist/services/sync/source-definitions/linear.d.ts +0 -2
- package/dist/services/sync/source-definitions/linear.js +0 -62
- package/dist/services/sync/source-definitions/linear.js.map +0 -1
- package/dist/services/sync/source-definitions/obsidian.d.ts +0 -2
- package/dist/services/sync/source-definitions/obsidian.js +0 -55
- package/dist/services/sync/source-definitions/obsidian.js.map +0 -1
- package/dist/services/sync/source-definitions/pipedrive.d.ts +0 -2
- package/dist/services/sync/source-definitions/pipedrive.js +0 -43
- package/dist/services/sync/source-definitions/pipedrive.js.map +0 -1
- package/dist/services/sync/staging.d.ts +0 -53
- package/dist/services/sync/staging.js +0 -130
- package/dist/services/sync/staging.js.map +0 -1
- package/dist/services/sync/structured-extractor.d.ts +0 -57
- package/dist/services/sync/structured-extractor.js +0 -584
- package/dist/services/sync/structured-extractor.js.map +0 -1
- package/dist/services/sync/sync-runner.d.ts +0 -32
- package/dist/services/sync/sync-runner.js +0 -195
- package/dist/services/sync/sync-runner.js.map +0 -1
- package/dist/services/sync/sync-state.d.ts +0 -43
- package/dist/services/sync/sync-state.js +0 -154
- package/dist/services/sync/sync-state.js.map +0 -1
- package/dist/services/sync/types.d.ts +0 -381
- package/dist/services/sync/types.js +0 -8
- package/dist/services/sync/types.js.map +0 -1
- package/dist/services/sync/unstructured-extractor.d.ts +0 -27
- package/dist/services/sync/unstructured-extractor.js +0 -185
- package/dist/services/sync/unstructured-extractor.js.map +0 -1
- package/dist/utils/merge-resolver.d.ts +0 -59
- package/dist/utils/merge-resolver.js +0 -303
- package/dist/utils/merge-resolver.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.B3eM5J6m.css +0 -1
- package/dist/web/_app/immutable/assets/10.2jzI3cZY.css +0 -1
- package/dist/web/_app/immutable/assets/11.BbBNo8jg.css +0 -1
- package/dist/web/_app/immutable/assets/12.vV-8Nqud.css +0 -1
- package/dist/web/_app/immutable/assets/2.CDsrnCq3.css +0 -1
- package/dist/web/_app/immutable/assets/3.Ih7su2rl.css +0 -1
- package/dist/web/_app/immutable/assets/4.CwXIQz3p.css +0 -1
- package/dist/web/_app/immutable/assets/ChevronLeft.BwM9mwS4.css +0 -1
- package/dist/web/_app/immutable/assets/GraphView.CRV5cekT.css +0 -1
- package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
- package/dist/web/_app/immutable/assets/ViewToolbar.CsWTe0yn.css +0 -1
- package/dist/web/_app/immutable/assets/WorkspaceView.iWtzksrr.css +0 -1
- package/dist/web/_app/immutable/chunks/0kuZ2gtb.js +0 -1
- package/dist/web/_app/immutable/chunks/1Ea1UXwM.js +0 -2
- package/dist/web/_app/immutable/chunks/284Zhbif.js +0 -1
- package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
- package/dist/web/_app/immutable/chunks/7WZENMwt.js +0 -1
- package/dist/web/_app/immutable/chunks/B0qHb2ee.js +0 -1
- package/dist/web/_app/immutable/chunks/B45od9dM.js +0 -2
- package/dist/web/_app/immutable/chunks/B4hXkypI.js +0 -1
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
- package/dist/web/_app/immutable/chunks/BDvg8O5k.js +0 -5
- package/dist/web/_app/immutable/chunks/BGiCmAMQ.js +0 -4
- package/dist/web/_app/immutable/chunks/BHgT2Ede.js +0 -1
- package/dist/web/_app/immutable/chunks/BQ1nK9ru.js +0 -1
- package/dist/web/_app/immutable/chunks/BS0-13V2.js +0 -1
- package/dist/web/_app/immutable/chunks/BSiC7hSS.js +0 -1
- package/dist/web/_app/immutable/chunks/BkxW0BJZ.js +0 -1
- package/dist/web/_app/immutable/chunks/Bp7FKkGt.js +0 -1
- package/dist/web/_app/immutable/chunks/BrebtJNG.js +0 -18
- package/dist/web/_app/immutable/chunks/Bz0ZjVQE.js +0 -2
- package/dist/web/_app/immutable/chunks/C0LVZhvn.js +0 -1
- package/dist/web/_app/immutable/chunks/C0Zx4tMe.js +0 -1
- package/dist/web/_app/immutable/chunks/CHJcPZZK.js +0 -2
- package/dist/web/_app/immutable/chunks/CRpK3grw.js +0 -2
- package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
- 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/CdIKiXW6.js +0 -1
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
- package/dist/web/_app/immutable/chunks/D14M5KlG.js +0 -1
- package/dist/web/_app/immutable/chunks/D71c9o7J.js +0 -2
- package/dist/web/_app/immutable/chunks/DFYOFE3o.js +0 -1
- package/dist/web/_app/immutable/chunks/DHJAqtPb.js +0 -1
- package/dist/web/_app/immutable/chunks/DOqcDZIJ.js +0 -1
- package/dist/web/_app/immutable/chunks/DQNtFKv6.js +0 -1
- package/dist/web/_app/immutable/chunks/DZHWps9n.js +0 -1
- package/dist/web/_app/immutable/chunks/DjLrjK2H.js +0 -1
- package/dist/web/_app/immutable/chunks/DjvJRtva.js +0 -1
- package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
- package/dist/web/_app/immutable/chunks/Dqq8gyOz.js +0 -1
- package/dist/web/_app/immutable/chunks/DsnmJJEf.js +0 -1
- package/dist/web/_app/immutable/chunks/DtG1tx2A.js +0 -1
- package/dist/web/_app/immutable/chunks/Dxmmz-Kc.js +0 -1
- package/dist/web/_app/immutable/chunks/DzVOENkg.js +0 -1
- package/dist/web/_app/immutable/chunks/Ee5s0qSS.js +0 -5
- package/dist/web/_app/immutable/chunks/KlRV1tKP.js +0 -1
- package/dist/web/_app/immutable/chunks/L7dfS1-w.js +0 -1
- package/dist/web/_app/immutable/chunks/MaQouOBH.js +0 -2
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
- package/dist/web/_app/immutable/chunks/_7ZfIgbM.js +0 -1
- package/dist/web/_app/immutable/chunks/pNJmbo_B.js +0 -1
- package/dist/web/_app/immutable/chunks/q4I7EnCp.js +0 -1
- package/dist/web/_app/immutable/chunks/qE6Hm01v.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/chunks/wZWzupWT.js +0 -1
- package/dist/web/_app/immutable/entry/app.Dc6h105F.js +0 -2
- package/dist/web/_app/immutable/entry/start.D4codAU1.js +0 -1
- package/dist/web/_app/immutable/nodes/0.BM3j5xaK.js +0 -2
- package/dist/web/_app/immutable/nodes/1.CZ2dT63B.js +0 -1
- package/dist/web/_app/immutable/nodes/10.AJJtsnPU.js +0 -1
- package/dist/web/_app/immutable/nodes/11.B7SEgGLF.js +0 -1
- package/dist/web/_app/immutable/nodes/12.BcJKl4UQ.js +0 -1
- package/dist/web/_app/immutable/nodes/2.jp27tyTq.js +0 -269
- package/dist/web/_app/immutable/nodes/3.I7SH_06w.js +0 -5
- package/dist/web/_app/immutable/nodes/4.Bdphc-UJ.js +0 -11
- package/dist/web/_app/immutable/nodes/5.CXpOErnP.js +0 -1
- package/dist/web/_app/immutable/nodes/6.1wcSxmEA.js +0 -1
- package/dist/web/_app/immutable/nodes/7.D0b7WYTp.js +0 -1
- package/dist/web/_app/immutable/nodes/8.D0Gxvy3F.js +0 -1
- package/dist/web/_app/immutable/nodes/9.B5Nr92OR.js +0 -1
|
@@ -4,50 +4,320 @@
|
|
|
4
4
|
* POST /api/repos/:repo/entities/:type/:id/assets — multipart image upload
|
|
5
5
|
* GET /api/assets/* — serve local assets
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
7
|
+
import { reqGitUser } from './graph-api-access.js';
|
|
8
|
+
import * as access from '../../services/access-control.js';
|
|
9
|
+
import { listRepoAssets, listWorkspaceAssets } from '../../services/asset-listing.js';
|
|
10
|
+
import { createEntityFromAsset } from '../../services/asset-import-service.js';
|
|
11
|
+
import { computeAssetDeleteImpact } from '../../services/asset-delete-impact.js';
|
|
12
|
+
import { computeAssetMoveImpact } from '../../services/asset-move-impact.js';
|
|
13
|
+
import { computeAssetReferenceIndex } from '../../services/asset-reference-index.js';
|
|
14
|
+
import { assetDeleteDenialByAssetId } from '../../services/asset-delete-authz.js';
|
|
15
|
+
import { resolveWorkspaceAssetsRepo } from '../../services/workspace-assets-folder.js';
|
|
16
|
+
import { Workspace } from '../../core/workspace.js';
|
|
17
|
+
import { existsSync, createReadStream, statSync } from 'fs';
|
|
9
18
|
import { join, extname } from 'path';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
*
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
19
|
+
import { artifactAssetKey } from '../../services/artifact-asset-token.js';
|
|
20
|
+
import { mintArtifactAssetTokenForText } from '../artifact-asset-mint.js';
|
|
21
|
+
import { encodeAssetFilename } from '../../core/artifact-asset-urls.js';
|
|
22
|
+
/** Max bytes proxied same-origin through the artifact-asset token path.
|
|
23
|
+
* `downloadAssetById` buffers, so this guard (checked BEFORE download against
|
|
24
|
+
* the index size) bounds memory. Images well under this; refuse unknown size. */
|
|
25
|
+
const ARTIFACT_PROXY_MAX_BYTES = 25 * 1024 * 1024;
|
|
26
|
+
/** Extensions the artifact-asset token proxy will serve — images + fonts only.
|
|
27
|
+
* An artifact embeds these; a same-repo doc/dataset/binary referenced in text
|
|
28
|
+
* must NOT become a 12h bearer URL. */
|
|
29
|
+
const PROXYABLE_ASSET_EXTS = new Set([
|
|
30
|
+
'.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.ico', '.avif',
|
|
31
|
+
'.woff', '.woff2', '.ttf', '.otf',
|
|
32
|
+
]);
|
|
33
|
+
/** Whether the same-origin proxy transport serves this file type (images +
|
|
34
|
+
* fonts — the subresources a CSP-pinned sandboxed iframe loads). The share
|
|
35
|
+
* asset route uses this to pick proxy vs the default serve for other types
|
|
36
|
+
* (e.g. a PDF download link on a shared doc keeps the cached R2 302). */
|
|
37
|
+
export function isProxyableAssetFilename(filename) {
|
|
38
|
+
return PROXYABLE_ASSET_EXTS.has(extname(filename).toLowerCase());
|
|
34
39
|
}
|
|
35
40
|
const MIME_TYPES = {
|
|
36
41
|
'.png': 'image/png', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg',
|
|
37
42
|
'.gif': 'image/gif', '.webp': 'image/webp', '.svg': 'image/svg+xml',
|
|
38
43
|
'.ico': 'image/x-icon', '.avif': 'image/avif',
|
|
44
|
+
'.woff': 'font/woff', '.woff2': 'font/woff2',
|
|
45
|
+
'.ttf': 'font/ttf', '.otf': 'font/otf',
|
|
39
46
|
};
|
|
40
|
-
function
|
|
47
|
+
function isFontExtension(filename) {
|
|
48
|
+
return ['.woff', '.woff2', '.ttf', '.otf'].includes(extname(filename).toLowerCase());
|
|
49
|
+
}
|
|
50
|
+
function addFontResourceHeaders(reply, filename) {
|
|
51
|
+
if (!isFontExtension(filename))
|
|
52
|
+
return;
|
|
53
|
+
reply.header('Access-Control-Allow-Origin', '*');
|
|
54
|
+
reply.header('Cross-Origin-Resource-Policy', 'cross-origin');
|
|
55
|
+
}
|
|
56
|
+
function hasRepoAccess(req, repoName, workspaceManager, authService) {
|
|
41
57
|
const user = req.user;
|
|
42
|
-
|
|
43
|
-
return true; // API key / open mode
|
|
44
|
-
return authService.getUserFolders(user.id).includes(repoName);
|
|
58
|
+
return access.hasRepoAccess(user, repoName, workspaceManager, authService);
|
|
45
59
|
}
|
|
46
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Serve an immutable-key asset's bytes once authorization has already been
|
|
62
|
+
* decided by the caller. This is the shared serving entry behind BOTH the
|
|
63
|
+
* authed `/api/assets/:assetId/:filename` route (authz = hasRepoAccess) and the
|
|
64
|
+
* public `/api/share/:token/asset/...` route (authz = valid token + repo scope).
|
|
65
|
+
*
|
|
66
|
+
* It does serving ONLY — R2 302-redirect vs local stream, path-segment
|
|
67
|
+
* hardening, and cache headers. The index lookup, filename match, and the
|
|
68
|
+
* access decision stay in each route so neither surface can drift into serving
|
|
69
|
+
* a file the other wouldn't authorize.
|
|
70
|
+
*
|
|
71
|
+
* Mechanically this is a THIN WRAPPER over the generic `serveBackendObject`
|
|
72
|
+
* primitive (the same primitive that backs conversation-scratch images), so
|
|
73
|
+
* both surfaces share one serving codepath. Two asset-specific concerns stay
|
|
74
|
+
* here as pre-steps rather than leaking into the generic primitive:
|
|
75
|
+
* 1. The R2 FONT branch — fonts are proxied through the app origin (not 302'd)
|
|
76
|
+
* with cross-origin CORS headers, and HEAD is answered from the indexed
|
|
77
|
+
* size WITHOUT downloading the bytes. This is unique to the catalog.
|
|
78
|
+
* 2. The catalog's stricter local segment hardening (rejects a `.`-prefixed
|
|
79
|
+
* filename, `/` or `\` in either segment), preserved verbatim.
|
|
80
|
+
*
|
|
81
|
+
* The owning `repo` must be resolved by the caller (from the asset index) so the
|
|
82
|
+
* correct graph/backend is selected. Always fail-closed with 404 — never leak
|
|
83
|
+
* existence.
|
|
84
|
+
*/
|
|
85
|
+
export async function serveIndexedAsset(workspaceManager, reply, opts) {
|
|
86
|
+
const { assetId, filename, repo, isHead, size } = opts;
|
|
87
|
+
let graph;
|
|
88
|
+
try {
|
|
89
|
+
graph = workspaceManager.getGraph(repo);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
93
|
+
}
|
|
94
|
+
const storage = graph.getAssetStorage();
|
|
95
|
+
// Artifact-asset token path: uniform same-origin serve for BOTH backends,
|
|
96
|
+
// with private/no-cache + a strong (content-immutable) ETag so revocation is
|
|
97
|
+
// enforced on every revalidation while a 304 avoids re-download. Restricted
|
|
98
|
+
// to images + fonts (no Range/video this pass).
|
|
99
|
+
if (opts.proxyR2) {
|
|
100
|
+
const ext = extname(filename).toLowerCase();
|
|
101
|
+
// Token proxy is restricted to images + fonts (the only types an artifact
|
|
102
|
+
// legitimately embeds). Refuse anything else so a same-repo doc/dataset/etc.
|
|
103
|
+
// referenced in artifact text can't be turned into a bearer URL.
|
|
104
|
+
if (!PROXYABLE_ASSET_EXTS.has(ext)) {
|
|
105
|
+
reply.log?.warn?.({ assetId, filename, ext }, 'artifact-asset proxy refused (non-image/font)');
|
|
106
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
107
|
+
}
|
|
108
|
+
// ETag content must be ASCII-safe: the RAW stored filename can carry
|
|
109
|
+
// non-ASCII (e.g. `Söhne-Halbfett.woff2`), and an invalid char in a header
|
|
110
|
+
// value makes Node throw ERR_INVALID_CHAR at send time — which surfaced as
|
|
111
|
+
// an unhandledRejection that took the whole server down the first time a
|
|
112
|
+
// share-page iframe requested such a font. Use the percent-encoded segment
|
|
113
|
+
// (same encoder as asset URLs); the If-None-Match comparison below sees the
|
|
114
|
+
// client echo our own emitted string, so the round-trip is unaffected.
|
|
115
|
+
const etag = `"${assetId}/${encodeAssetFilename(filename)}"`;
|
|
116
|
+
reply.header('ETag', etag);
|
|
117
|
+
reply.header('Cache-Control', 'private, no-cache');
|
|
118
|
+
reply.header('X-Content-Type-Options', 'nosniff');
|
|
119
|
+
// Neutralize active content (legacy/migrated SVGs) served same-origin.
|
|
120
|
+
reply.header('Content-Security-Policy', "default-src 'none'; style-src 'unsafe-inline'; sandbox");
|
|
121
|
+
reply.header('Content-Type', MIME_TYPES[ext] || 'application/octet-stream');
|
|
122
|
+
addFontResourceHeaders(reply, filename);
|
|
123
|
+
if (opts.ifNoneMatch === etag)
|
|
124
|
+
return reply.status(304).send();
|
|
125
|
+
try {
|
|
126
|
+
if (graph.getAssetStorage() === 'r2') {
|
|
127
|
+
// The index `size` is advisory and often null (migrate-assets/sweep
|
|
128
|
+
// never set it), so DON'T fail-closed on unknown size — the normal
|
|
129
|
+
// serve path doesn't either. Pre-reject only a KNOWN-oversize asset;
|
|
130
|
+
// for HEAD with a known size, answer without downloading.
|
|
131
|
+
if (typeof size === 'number' && size > ARTIFACT_PROXY_MAX_BYTES) {
|
|
132
|
+
reply.log?.warn?.({ assetId, filename, size }, 'artifact-asset proxy refused (oversized)');
|
|
133
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
134
|
+
}
|
|
135
|
+
if (isHead) {
|
|
136
|
+
if (typeof size === 'number' && size > 0)
|
|
137
|
+
reply.header('Content-Length', size);
|
|
138
|
+
return reply.send();
|
|
139
|
+
}
|
|
140
|
+
const bytes = await graph.downloadAssetById(assetId, filename);
|
|
141
|
+
// Post-download cap bounds what we serve when size was unknown.
|
|
142
|
+
if (bytes.length > ARTIFACT_PROXY_MAX_BYTES) {
|
|
143
|
+
reply.log?.warn?.({ assetId, filename, len: bytes.length }, 'artifact-asset proxy refused (oversized after download)');
|
|
144
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
145
|
+
}
|
|
146
|
+
reply.header('Content-Length', bytes.length);
|
|
147
|
+
return reply.send(bytes);
|
|
148
|
+
}
|
|
149
|
+
// Local backend: stream from disk (same path-hardening as below).
|
|
150
|
+
if (filename.includes('..') || filename.includes('/') || filename.includes('\\') || filename.startsWith('.') ||
|
|
151
|
+
assetId.includes('..') || assetId.includes('/') || assetId.includes('\\')) {
|
|
152
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
153
|
+
}
|
|
154
|
+
const base = workspaceManager.workspacePath ?? process.cwd();
|
|
155
|
+
const fp = join(base, '.studiograph', 'assets', assetId, filename);
|
|
156
|
+
if (!existsSync(fp))
|
|
157
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
158
|
+
reply.header('Content-Length', statSync(fp).size);
|
|
159
|
+
if (isHead)
|
|
160
|
+
return reply.send();
|
|
161
|
+
return reply.send(createReadStream(fp));
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
reply.log?.warn?.({ err, assetId, filename }, 'artifact-asset proxy serve failed');
|
|
165
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// (1) R2 font pre-step — catalog-only CORS proxy + HEAD-from-size optimization.
|
|
169
|
+
if (storage === 'r2' && isFontExtension(filename)) {
|
|
170
|
+
try {
|
|
171
|
+
const ext = extname(filename).toLowerCase();
|
|
172
|
+
if (isHead && typeof size === 'number') {
|
|
173
|
+
reply.header('Content-Type', MIME_TYPES[ext] || 'application/octet-stream');
|
|
174
|
+
reply.header('Content-Length', size);
|
|
175
|
+
reply.header('Cache-Control', 'private, max-age=14400');
|
|
176
|
+
reply.header('X-Content-Type-Options', 'nosniff');
|
|
177
|
+
addFontResourceHeaders(reply, filename);
|
|
178
|
+
return reply.send();
|
|
179
|
+
}
|
|
180
|
+
const bytes = await graph.downloadAssetById(assetId, filename);
|
|
181
|
+
reply.header('Content-Type', MIME_TYPES[ext] || 'application/octet-stream');
|
|
182
|
+
reply.header('Content-Length', bytes.length);
|
|
183
|
+
reply.header('Cache-Control', 'private, max-age=14400');
|
|
184
|
+
reply.header('X-Content-Type-Options', 'nosniff');
|
|
185
|
+
addFontResourceHeaders(reply, filename);
|
|
186
|
+
if (isHead)
|
|
187
|
+
return reply.send();
|
|
188
|
+
return reply.send(bytes);
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
reply.log?.warn?.({ err, assetId, filename }, 'asset r2 signed-url generation failed');
|
|
192
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// (2) Local-backend catalog segment hardening (stricter than the generic
|
|
196
|
+
// primitive: also rejects a `.`-prefixed filename). Applied before delegation
|
|
197
|
+
// so observable behavior is identical to the pre-unification serve path.
|
|
198
|
+
if (storage !== 'r2') {
|
|
199
|
+
if (filename.includes('..') || filename.includes('/') || filename.includes('\\') || filename.startsWith('.') ||
|
|
200
|
+
assetId.includes('..') || assetId.includes('/') || assetId.includes('\\')) {
|
|
201
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Delegate to the shared primitive. The catalog key is `{assetId}/{filename}`.
|
|
205
|
+
// LOCAL serves with no-cache + a strong ETag: bytes never change at a key,
|
|
206
|
+
// so every revisit is a free 304 — but a DELETED asset 404s on the next
|
|
207
|
+
// render instead of ghosting from a year-long immutable cache (the founder
|
|
208
|
+
// QA case: delete in the Library, the embed must flip to the unavailable
|
|
209
|
+
// note everywhere). R2 keeps the 4h-cached 302 (the signed URL varies per
|
|
210
|
+
// mint, so revalidating the redirect would force full re-downloads —
|
|
211
|
+
// bounded staleness is the cheaper trade there).
|
|
212
|
+
return serveBackendObject(workspaceManager, reply, {
|
|
213
|
+
repo,
|
|
214
|
+
key: `${assetId}/${filename}`,
|
|
215
|
+
filename,
|
|
216
|
+
isHead,
|
|
217
|
+
cacheControl: { r2: 'private, max-age=14400', local: 'private, no-cache' },
|
|
218
|
+
fontHeaders: true,
|
|
219
|
+
notFoundError: 'Asset not found',
|
|
220
|
+
ifNoneMatch: opts.ifNoneMatch,
|
|
221
|
+
signR2Url: (method) => graph.getAssetSignedUrlByAssetId(assetId, filename, method),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Generic backend-object serving primitive (composer-vision-attach / E2a). Serves
|
|
226
|
+
* bytes for a RAW backend key once the caller has decided authorization: R2 → 302
|
|
227
|
+
* to a method-bound signed URL; local → stream from `.studiograph/assets/{key}`
|
|
228
|
+
* with a sandbox CSP + nosniff. The R2 signer is INJECTED so the caller controls
|
|
229
|
+
* which keyspace is signed (catalog asset vs conversation-scratch image), and the
|
|
230
|
+
* cache header may be a single value or a per-backend pair. Always fail-closed 404.
|
|
231
|
+
*
|
|
232
|
+
* This is the single serving codepath behind BOTH `serveIndexedAsset` (the
|
|
233
|
+
* catalog, which layers an R2 font pre-step + stricter segment hardening on top)
|
|
234
|
+
* and the conversation-scratch image route.
|
|
235
|
+
*/
|
|
236
|
+
export async function serveBackendObject(workspaceManager, reply, opts) {
|
|
237
|
+
const { repo, key, filename, contentType, isHead, cacheControl, fontHeaders, signR2Url } = opts;
|
|
238
|
+
const notFound = opts.notFoundError ?? 'Not found';
|
|
239
|
+
const r2Cache = typeof cacheControl === 'string' ? cacheControl : cacheControl.r2;
|
|
240
|
+
const localCache = typeof cacheControl === 'string' ? cacheControl : cacheControl.local;
|
|
241
|
+
let graph;
|
|
242
|
+
try {
|
|
243
|
+
graph = workspaceManager.getGraph(repo);
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
return reply.status(404).send({ error: notFound });
|
|
247
|
+
}
|
|
248
|
+
if (graph.getAssetStorage() === 'r2') {
|
|
249
|
+
try {
|
|
250
|
+
const signed = await signR2Url(isHead ? 'HEAD' : 'GET');
|
|
251
|
+
reply.header('Cache-Control', r2Cache);
|
|
252
|
+
return reply.redirect(signed, 302);
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
reply.log?.warn?.({ err, key }, 'backend object r2 signed-url generation failed');
|
|
256
|
+
return reply.status(404).send({ error: notFound });
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Local backend: stream from .studiograph/assets/{key}. Defense-in-depth
|
|
260
|
+
// segment validation (the key is stored server-side, but never trust it).
|
|
261
|
+
for (const seg of key.split('/')) {
|
|
262
|
+
if (seg === '' || seg === '.' || seg === '..' || seg.includes('\\')) {
|
|
263
|
+
return reply.status(404).send({ error: notFound });
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
const localBase = workspaceManager.workspacePath ?? process.cwd();
|
|
267
|
+
const filePath = join(localBase, '.studiograph', 'assets', key);
|
|
268
|
+
if (!existsSync(filePath)) {
|
|
269
|
+
return reply.status(404).send({ error: notFound });
|
|
270
|
+
}
|
|
271
|
+
// Strong ETag = the immutable key (percent-encoded: header values must be
|
|
272
|
+
// ASCII-safe — the raw filename can carry non-ASCII, and an invalid header
|
|
273
|
+
// char throws at send time; see the artifact-proxy incident). Bytes at a
|
|
274
|
+
// key never change, so a match is always a valid 304.
|
|
275
|
+
const etag = `"${encodeURIComponent(key)}"`;
|
|
276
|
+
reply.header('ETag', etag);
|
|
277
|
+
reply.header('Cache-Control', localCache);
|
|
278
|
+
if (opts.ifNoneMatch === etag) {
|
|
279
|
+
if (fontHeaders)
|
|
280
|
+
addFontResourceHeaders(reply, filename);
|
|
281
|
+
return reply.status(304).send();
|
|
282
|
+
}
|
|
283
|
+
const ext = extname(filename).toLowerCase();
|
|
284
|
+
reply.header('Content-Type', contentType || MIME_TYPES[ext] || 'application/octet-stream');
|
|
285
|
+
reply.header('Content-Length', statSync(filePath).size);
|
|
286
|
+
if (fontHeaders)
|
|
287
|
+
addFontResourceHeaders(reply, filename);
|
|
288
|
+
// Neutralize active content served from the app origin. SVG uploads are
|
|
289
|
+
// blocked, but legacy/migrated/indexed SVGs would otherwise run script when
|
|
290
|
+
// opened directly as image/svg+xml — now reachable anonymously via the share
|
|
291
|
+
// route. A sandbox CSP blocks script + plugins on direct navigation (img
|
|
292
|
+
// embeds still render, since <img> never executes SVG script), and nosniff
|
|
293
|
+
// stops a mislabeled asset from being re-interpreted as HTML.
|
|
294
|
+
reply.header('Content-Security-Policy', "default-src 'none'; style-src 'unsafe-inline'; sandbox");
|
|
295
|
+
reply.header('X-Content-Type-Options', 'nosniff');
|
|
296
|
+
if (isHead)
|
|
297
|
+
return reply.send();
|
|
298
|
+
return reply.send(createReadStream(filePath));
|
|
299
|
+
}
|
|
300
|
+
export async function registerAssetApiRoutes(fastify, workspaceManager, authService, wsHub) {
|
|
301
|
+
// Peers' Library views refresh on repo_sync (the same event uploads
|
|
302
|
+
// broadcast from graph-api) — every asset mutation here must emit it or a
|
|
303
|
+
// move/delete stays invisible to other connected members until reload.
|
|
304
|
+
// `summary` is the human verb-phrase the toast renders ("{actor} {summary}
|
|
305
|
+
// in {folder}"); omit it and the client falls back to a generic "updated".
|
|
306
|
+
const broadcastAssetChange = (repo, req, summary) => {
|
|
307
|
+
wsHub?.broadcast({
|
|
308
|
+
type: 'repo_sync',
|
|
309
|
+
repo,
|
|
310
|
+
actor: req?.user?.displayName ?? 'API',
|
|
311
|
+
source: 'api',
|
|
312
|
+
summary,
|
|
313
|
+
workspaceWide: access.isWorkspaceWide(repo, workspaceManager),
|
|
314
|
+
timestamp: new Date().toISOString(),
|
|
315
|
+
});
|
|
316
|
+
};
|
|
47
317
|
// POST /api/repos/:repo/entities/:type/:id/assets — upload an image
|
|
48
318
|
fastify.post('/api/repos/:repo/entities/:type/:id/assets', async (req, reply) => {
|
|
49
319
|
const { repo, type, id } = req.params;
|
|
50
|
-
if (!hasRepoAccess(req, repo, authService)) {
|
|
320
|
+
if (!hasRepoAccess(req, repo, workspaceManager, authService)) {
|
|
51
321
|
return reply.status(404).send({ error: `Folder "${repo}" not found` });
|
|
52
322
|
}
|
|
53
323
|
let graph;
|
|
@@ -63,15 +333,29 @@ export async function registerAssetApiRoutes(fastify, workspaceManager, authServ
|
|
|
63
333
|
if (!file.mimetype.startsWith('image/')) {
|
|
64
334
|
return reply.status(400).send({ error: 'Only image files are supported' });
|
|
65
335
|
}
|
|
336
|
+
// Block SVG: stored XSS — SVG can contain <script> and the GET route
|
|
337
|
+
// serves it inline as image/svg+xml, executing in the app origin.
|
|
338
|
+
if (file.mimetype === 'image/svg+xml' || file.filename?.toLowerCase().endsWith('.svg')) {
|
|
339
|
+
return reply.status(415).send({ error: 'SVG uploads are not supported (stored XSS risk).' });
|
|
340
|
+
}
|
|
66
341
|
const buffer = await file.toBuffer();
|
|
67
342
|
const filename = `${Date.now()}-${file.filename.replace(/[^a-zA-Z0-9._-]/g, '_')}`;
|
|
343
|
+
const uploader = req.user;
|
|
68
344
|
try {
|
|
69
|
-
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
345
|
+
// Assets-referenced-not-owned (P1, D2): an image pasted/uploaded into
|
|
346
|
+
// an entry is homed to the ENTRY'S OWN FOLDER (owner_type='folder',
|
|
347
|
+
// owner_id=repo), inheriting the folder's permission boundary — never
|
|
348
|
+
// owned by the entity. The entry merely references it via the returned
|
|
349
|
+
// immutable URL (the editor inserts the embed), so deleting or moving
|
|
350
|
+
// the entry never destroys or strands the image. (type, id) are kept
|
|
351
|
+
// for the route shape but ignored for ownership.
|
|
352
|
+
const asset = await graph.uploadAsset(type, id, filename, buffer, undefined, {
|
|
353
|
+
owner: { type: 'folder', id: repo },
|
|
354
|
+
uploaderUserId: uploader?.id != null ? String(uploader.id) : null,
|
|
355
|
+
});
|
|
356
|
+
// uploadAsset returns the canonical public URL (immutable-key scheme
|
|
357
|
+
// when the index is wired, legacy otherwise) — don't re-derive it.
|
|
358
|
+
return reply.send({ url: asset.publicUrl, filename: asset.filename, size: asset.size });
|
|
75
359
|
}
|
|
76
360
|
catch (err) {
|
|
77
361
|
if (err.message?.includes('not configured')) {
|
|
@@ -80,102 +364,445 @@ export async function registerAssetApiRoutes(fastify, workspaceManager, authServ
|
|
|
80
364
|
return reply.status(400).send({ error: err.message });
|
|
81
365
|
}
|
|
82
366
|
});
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
367
|
+
// POST /api/repos/:repo/entities/artifact/:id/asset-token — mint a short-lived
|
|
368
|
+
// (12h), ARTIFACT-SCOPED capability token so a sandboxed iframe (opaque origin,
|
|
369
|
+
// no cookie) can load the exact images this artifact embeds. Authz: a normal
|
|
370
|
+
// session with repo access. The allowlist is the set of indexed assets the
|
|
371
|
+
// bundle references that actually live in THIS repo — cross-repo / unknown /
|
|
372
|
+
// filename-mismatched refs are dropped (fail-closed).
|
|
373
|
+
fastify.post('/api/repos/:repo/entities/artifact/:id/asset-token', async (req, reply) => {
|
|
374
|
+
const { repo, id } = req.params;
|
|
375
|
+
const user = req.user;
|
|
376
|
+
if (!hasRepoAccess(req, repo, workspaceManager, authService)) {
|
|
377
|
+
return reply.status(404).send({ error: `Folder "${repo}" not found` });
|
|
90
378
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
379
|
+
let graph;
|
|
380
|
+
try {
|
|
381
|
+
graph = workspaceManager.getGraph(repo);
|
|
382
|
+
}
|
|
383
|
+
catch (err) {
|
|
384
|
+
return reply.status(404).send({ error: err.message });
|
|
385
|
+
}
|
|
386
|
+
// Allowlist source = the EXACT version being rendered. For a history
|
|
387
|
+
// preview the client passes the version's commit; we derive the allowlist
|
|
388
|
+
// from the artifact body AT THAT COMMIT (server-trusted, not client refs),
|
|
389
|
+
// so a preview token authorizes the previewed version's assets — not the
|
|
390
|
+
// current ones. Otherwise use the live body.
|
|
391
|
+
const commit = typeof req.query.commit === 'string' && /^[0-9a-f]{7,40}$/i.test(req.query.commit)
|
|
392
|
+
? req.query.commit : null;
|
|
393
|
+
let text;
|
|
394
|
+
if (commit) {
|
|
395
|
+
const atCommit = graph.getEntityAtCommit('artifact', id, commit);
|
|
396
|
+
if (!atCommit)
|
|
397
|
+
return reply.status(404).send({ error: 'Artifact version not found' });
|
|
398
|
+
text = atCommit.content;
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
let entity;
|
|
402
|
+
try {
|
|
403
|
+
entity = graph.get('artifact', id);
|
|
404
|
+
}
|
|
405
|
+
catch {
|
|
406
|
+
return reply.status(404).send({ error: 'Artifact not found' });
|
|
407
|
+
}
|
|
408
|
+
if (!entity)
|
|
409
|
+
return reply.status(404).send({ error: 'Artifact not found' });
|
|
410
|
+
text = entity.document?.content ?? '';
|
|
411
|
+
}
|
|
412
|
+
return reply.send(mintArtifactAssetTokenForText(workspaceManager, authService, repo, id, text, user ? String(user.id) : '0'));
|
|
98
413
|
});
|
|
99
|
-
// GET /api/
|
|
414
|
+
// GET / HEAD /api/assets/:assetId/:filename — IMMUTABLE-KEY serve route.
|
|
100
415
|
//
|
|
101
|
-
//
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
// 2. Build the set of (type, id) pairs that belong to *this* repo via
|
|
106
|
-
// a cheap directory scan — no frontmatter parse.
|
|
107
|
-
// 3. Filter the asset list by that set and look up display names by
|
|
108
|
-
// reading just the matching entities' frontmatter name line.
|
|
416
|
+
// New scheme: assets are keyed `{assetId}/{filename}` (assetId = UUIDv4) and
|
|
417
|
+
// ownership/authz lives in the AssetIndexService, not in the URL. Two path
|
|
418
|
+
// segments after /api/assets/ vs three for the legacy route below — Fastify
|
|
419
|
+
// disambiguates by arity, so both coexist during the migration cutover.
|
|
109
420
|
//
|
|
110
|
-
//
|
|
111
|
-
//
|
|
421
|
+
// Authz: index.get(assetId) → repo → hasRepoAccess. Fail-closed on a miss.
|
|
422
|
+
// The filename in the URL MUST match the indexed filename, otherwise a valid
|
|
423
|
+
// assetId would authorize arbitrary keys under that UUID directory.
|
|
424
|
+
fastify.route({
|
|
425
|
+
method: ['GET', 'HEAD'],
|
|
426
|
+
url: '/api/assets/:assetId/:filename',
|
|
427
|
+
handler: async (req, reply) => {
|
|
428
|
+
const { assetId, filename } = req.params;
|
|
429
|
+
const isHead = req.method === 'HEAD';
|
|
430
|
+
const ifNoneMatch = req.headers['if-none-match'];
|
|
431
|
+
const row = workspaceManager.getAssetIndex().get(assetId);
|
|
432
|
+
// Fail-closed: unknown id, or a filename that doesn't match the indexed
|
|
433
|
+
// one, both 404 (never leak existence; never authorize a sibling key).
|
|
434
|
+
if (!row || row.filename !== filename) {
|
|
435
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
436
|
+
}
|
|
437
|
+
// (No anonymous public-fonts exception here anymore: fonts resolve
|
|
438
|
+
// through the same contract as images — token allowlist below, the
|
|
439
|
+
// share-token route, or export bundling. Fail closed without one.)
|
|
440
|
+
const user = req.user;
|
|
441
|
+
if (!user && authService.hasUsers()) {
|
|
442
|
+
// No session cookie/Bearer (e.g. a sandboxed artifact iframe). Try the
|
|
443
|
+
// artifact-asset capability token before failing. The preHandler only
|
|
444
|
+
// verified the signature + 2-seg shape and stashed the payload as a
|
|
445
|
+
// CANDIDATE — the authoritative checks happen HERE against the resolved
|
|
446
|
+
// row: repo match + exact-asset allowlist + the token's user STILL has
|
|
447
|
+
// repo access (revocation enforced per-serve). Serve same-origin.
|
|
448
|
+
const tok = req.artifactAssetToken;
|
|
449
|
+
if (tok) {
|
|
450
|
+
const tokenUser = authService.findUserById(Number(tok.userId));
|
|
451
|
+
// Token is minted for ONE artifact (in tok.repo). It may load assets
|
|
452
|
+
// owned by that repo, OR assets in a workspace-wide shared store
|
|
453
|
+
// (workspace-assets) — those are cross-repo by design and readable by
|
|
454
|
+
// every member, so an artifact in repo A may embed a shared-store
|
|
455
|
+
// image. The exact-asset allowlist still scopes what THIS token unlocks,
|
|
456
|
+
// and hasRepoAccess re-checks the token user against the owning repo.
|
|
457
|
+
const repoMatch = tok.repo === row.repo || access.isWorkspaceWide(row.repo, workspaceManager);
|
|
458
|
+
if (repoMatch &&
|
|
459
|
+
tok.assets.includes(artifactAssetKey(assetId, filename)) &&
|
|
460
|
+
tokenUser &&
|
|
461
|
+
access.hasRepoAccess(tokenUser, row.repo, workspaceManager, authService)) {
|
|
462
|
+
return serveIndexedAsset(workspaceManager, reply, {
|
|
463
|
+
assetId, filename, repo: row.repo, isHead, size: row.size, proxyR2: true, ifNoneMatch,
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
468
|
+
}
|
|
469
|
+
if (!hasRepoAccess(req, row.repo, workspaceManager, authService)) {
|
|
470
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
471
|
+
}
|
|
472
|
+
// Authz decided above (folder access); shared helper does the serving.
|
|
473
|
+
//
|
|
474
|
+
// TRANSPORT exception: WebKit sends the session cookie from sandboxed
|
|
475
|
+
// (opaque-origin) artifact iframes — Chromium doesn't — so a Safari/iOS
|
|
476
|
+
// iframe image request lands HERE on session authz even though it also
|
|
477
|
+
// carries a verified `?at=` candidate. The session stays the authz
|
|
478
|
+
// authority (the token never overrides it), but the default R2 serve
|
|
479
|
+
// answers 302-to-bucket-origin, which the iframe's CSP rightly blocks
|
|
480
|
+
// ("Redirect was not allowed" — images broken in Safari, fine in
|
|
481
|
+
// Chrome). A verified token candidate is the fingerprint of that
|
|
482
|
+
// sandboxed caller, so serve it same-origin via the token proxy path
|
|
483
|
+
// (image/font-only + size caps + revalidate ETag) instead of redirecting.
|
|
484
|
+
// Grants nothing new: this session could fetch the same bytes through
|
|
485
|
+
// the redirect; only the transport changes. Scoped to the R2 backend —
|
|
486
|
+
// local storage streams directly (no redirect to block), and routing it
|
|
487
|
+
// through the proxy would impose the token path's image/font-only gate
|
|
488
|
+
// on session-authorized types it previously served (e.g. video).
|
|
489
|
+
let r2Backed = false;
|
|
490
|
+
if (req.artifactAssetToken) {
|
|
491
|
+
try {
|
|
492
|
+
r2Backed = workspaceManager.getGraph(row.repo).getAssetStorage() === 'r2';
|
|
493
|
+
}
|
|
494
|
+
catch { /* served 404 below */ }
|
|
495
|
+
}
|
|
496
|
+
return serveIndexedAsset(workspaceManager, reply, {
|
|
497
|
+
assetId, filename, repo: row.repo, isHead, size: row.size, ifNoneMatch,
|
|
498
|
+
...(r2Backed ? { proxyR2: true } : {}),
|
|
499
|
+
});
|
|
500
|
+
},
|
|
501
|
+
});
|
|
502
|
+
// The legacy 3-segment serve route (GET/HEAD /api/assets/:type/:id/:filename)
|
|
503
|
+
// was removed once every body referenced immutable /api/assets/{assetId}/...
|
|
504
|
+
// URLs (served by the by-assetId route above) and the legacy-hit logs drained
|
|
505
|
+
// to zero. Un-indexed legacy blobs no longer exist; nothing requests this.
|
|
506
|
+
// GET /api/repos/:repo/assets — list all assets in a folder. The listing
|
|
507
|
+
// logic (ownership-index scan) lives in listRepoAssets() so the MCP
|
|
508
|
+
// `list_assets` tool returns an identical shape.
|
|
112
509
|
fastify.get('/api/repos/:repo/assets', async (req, reply) => {
|
|
113
510
|
const { repo } = req.params;
|
|
114
|
-
if (!hasRepoAccess(req, repo, authService)) {
|
|
511
|
+
if (!hasRepoAccess(req, repo, workspaceManager, authService)) {
|
|
512
|
+
return reply.status(404).send({ error: `Folder "${repo}" not found` });
|
|
513
|
+
}
|
|
514
|
+
// Verify the repo exists before delegating; listRepoAssets swallows
|
|
515
|
+
// missing-graph errors as [], which is right for the bulk endpoint but
|
|
516
|
+
// wrong for the single-repo one (we want a 404).
|
|
517
|
+
try {
|
|
518
|
+
workspaceManager.getGraph(repo);
|
|
519
|
+
}
|
|
520
|
+
catch (err) {
|
|
521
|
+
return reply.status(404).send({ error: err.message });
|
|
522
|
+
}
|
|
523
|
+
return { assets: await listRepoAssets(repo, workspaceManager) };
|
|
524
|
+
});
|
|
525
|
+
// GET /api/workspace/assets — bulk asset lists for ALL accessible repos in
|
|
526
|
+
// one round-trip. Replaces 15+ parallel /api/repos/:repo/assets calls so
|
|
527
|
+
// GalleryView's thumbnail effect doesn't saturate the browser HTTP/1.1
|
|
528
|
+
// 6-slot queue and block other navigation fetches.
|
|
529
|
+
// Response shape: `{ [repoName]: RepoAsset[] }`.
|
|
530
|
+
fastify.get('/api/workspace/assets', async (req, reply) => {
|
|
531
|
+
const user = req.user;
|
|
532
|
+
// Use the shared access-control helper so personal-folder restrictions
|
|
533
|
+
// and workspace-owner-on-shared-folder semantics apply consistently.
|
|
534
|
+
const accessible = access.getAccessibleRepos(user, workspaceManager, authService).map(r => r.name);
|
|
535
|
+
// One bucket walk for the whole workspace (see listWorkspaceAssets) rather
|
|
536
|
+
// than a per-repo listAll fan-out. Seed every accessible repo so folders
|
|
537
|
+
// with no assets still appear as empty arrays (shape-stable for callers).
|
|
538
|
+
const result = {};
|
|
539
|
+
for (const repo of accessible)
|
|
540
|
+
result[repo] = [];
|
|
541
|
+
const flat = await listWorkspaceAssets(accessible, workspaceManager);
|
|
542
|
+
for (const { repo, ...asset } of flat)
|
|
543
|
+
(result[repo] ??= []).push(asset);
|
|
544
|
+
return reply.send(result);
|
|
545
|
+
});
|
|
546
|
+
// GET /api/workspace/assets/manager — the dedicated asset-manager view.
|
|
547
|
+
//
|
|
548
|
+
// Distinct from /api/workspace/assets (kept shape-stable for GalleryView's
|
|
549
|
+
// thumbnail effect). This composes the SAME primitives (getAccessibleRepos +
|
|
550
|
+
// listRepoAssets + assetDeleteDenialByAssetId) into the shape the /assets UI needs:
|
|
551
|
+
// - `folders`: every accessible folder's metadata (display name +
|
|
552
|
+
// workspace_wide + system flags) so the client can render the folder
|
|
553
|
+
// filter, group headers, the Workspace/folder-scoped visibility badge,
|
|
554
|
+
// and pin the shared store first — the system store is excluded from
|
|
555
|
+
// /api/repos so the client can't get this elsewhere.
|
|
556
|
+
// - `assets`: a FLAT list annotated with the owning `repo` and a per-asset
|
|
557
|
+
// `canDelete` decision (uploader/owner gate, via the same authz primitive
|
|
558
|
+
// the DELETE route enforces) so the UI can disable delete with a reason
|
|
559
|
+
// instead of letting the user hit a 403.
|
|
560
|
+
fastify.get('/api/workspace/assets/manager', async (req, reply) => {
|
|
561
|
+
const user = req.user;
|
|
562
|
+
workspaceManager.reloadConfig();
|
|
563
|
+
const accessible = access.getAccessibleRepos(user, workspaceManager, authService);
|
|
564
|
+
const index = workspaceManager.getAssetIndex?.();
|
|
565
|
+
const folders = accessible.map(r => ({
|
|
566
|
+
repo: r.name,
|
|
567
|
+
displayName: r.display_name ?? null,
|
|
568
|
+
workspaceWide: r.workspace_wide === true,
|
|
569
|
+
system: r.system === true,
|
|
570
|
+
}));
|
|
571
|
+
const configByRepo = new Map(accessible.map(r => [r.name, r]));
|
|
572
|
+
// listWorkspaceAssets reads the ownership index per accessible repo. Here we
|
|
573
|
+
// layer on the per-asset delete decision (gated on the immutable assetId
|
|
574
|
+
// every asset now carries) so the UI can disable delete with a reason
|
|
575
|
+
// instead of letting the user hit a 403.
|
|
576
|
+
const flat = await listWorkspaceAssets(accessible.map(r => r.name), workspaceManager);
|
|
577
|
+
const assets = flat.map((a) => {
|
|
578
|
+
const r = configByRepo.get(a.repo);
|
|
579
|
+
const denial = assetDeleteDenialByAssetId(index, r, user, a.assetId);
|
|
580
|
+
return { ...a, canDelete: denial === null, denialReason: denial };
|
|
581
|
+
});
|
|
582
|
+
return reply.send({ folders, assets });
|
|
583
|
+
});
|
|
584
|
+
// GET /api/workspace/assets/reference-index — the Library "loose /
|
|
585
|
+
// unreferenced" filter's data (assets-referenced-not-owned P3). One
|
|
586
|
+
// live-reconciled, budgeted workspace walk → { assetId: referencing-entry
|
|
587
|
+
// count }. The client fetches this LAZILY (only on the first loose-filter
|
|
588
|
+
// toggle) so the scan never taxes users who don't filter, and marks an asset
|
|
589
|
+
// loose only when its count is 0 AND the scan completed (partial=false).
|
|
590
|
+
//
|
|
591
|
+
// Counts are computed from a workspace-wide scan (an asset referenced only by
|
|
592
|
+
// an entry in a folder the caller can't read is still NOT loose), but the
|
|
593
|
+
// RESPONSE is scoped to the assets the caller can actually see — the same
|
|
594
|
+
// least-disclosure posture as /manager and /references, so it never reveals
|
|
595
|
+
// even a UUID→count for a folder the caller has no access to. The scoped ids
|
|
596
|
+
// are exactly the manager listing's keys; a referenced-but-unindexed asset is
|
|
597
|
+
// never shown there, so dropping it costs the client nothing.
|
|
598
|
+
fastify.get('/api/workspace/assets/reference-index', async (req, reply) => {
|
|
599
|
+
try {
|
|
600
|
+
const user = req.user;
|
|
601
|
+
const index = workspaceManager.getAssetIndex?.();
|
|
602
|
+
if (!index) {
|
|
603
|
+
// No index → can't scope without leaking, and looseness is unknowable.
|
|
604
|
+
// Fail safe (like a partial scan): the client marks nothing loose.
|
|
605
|
+
return reply.send({ index: {}, partial: true });
|
|
606
|
+
}
|
|
607
|
+
const visibleIds = new Set();
|
|
608
|
+
for (const r of access.getAccessibleRepos(user, workspaceManager, authService)) {
|
|
609
|
+
for (const row of index.listByRepo(r.name))
|
|
610
|
+
visibleIds.add(row.assetId);
|
|
611
|
+
}
|
|
612
|
+
const { index: counts, partial } = await computeAssetReferenceIndex({ workspaceManager });
|
|
613
|
+
const scoped = {};
|
|
614
|
+
for (const id of visibleIds) {
|
|
615
|
+
const c = counts[id];
|
|
616
|
+
if (c != null)
|
|
617
|
+
scoped[id] = c;
|
|
618
|
+
}
|
|
619
|
+
return reply.send({ index: scoped, partial });
|
|
620
|
+
}
|
|
621
|
+
catch (err) {
|
|
622
|
+
req.log?.error?.({ err }, '[reference-index] scan failed');
|
|
623
|
+
return reply.status(500).send({ error: 'Could not compute the reference index' });
|
|
624
|
+
}
|
|
625
|
+
});
|
|
626
|
+
// GET /api/workspace/assets/:assetId/references — entries whose markdown
|
|
627
|
+
// body (or frontmatter) references this asset's URL. Scans accessible
|
|
628
|
+
// repos via graph.search, which already includes body-content scanning,
|
|
629
|
+
// so no schema change is needed. Filters self-reference: a STANDALONE
|
|
630
|
+
// asset's own wrapper entity has the URL in its `asset_url` frontmatter
|
|
631
|
+
// and would self-match — drop it. Embedded assets keep their parent
|
|
632
|
+
// entity in results (the parent IS the only "use", and clicking it is
|
|
633
|
+
// the user's path to managing the image's context).
|
|
634
|
+
fastify.get('/api/workspace/assets/:assetId/references', async (req, reply) => {
|
|
635
|
+
const { assetId } = req.params;
|
|
636
|
+
const user = req.user;
|
|
637
|
+
const index = workspaceManager.getAssetIndex?.();
|
|
638
|
+
const owner = index?.get(assetId) ?? null;
|
|
639
|
+
const accessible = access.getAccessibleRepos(user, workspaceManager, authService);
|
|
640
|
+
// The immutable-asset URL pattern. assetId is a UUID so this string
|
|
641
|
+
// is unique enough that a substring match across markdown bodies is
|
|
642
|
+
// a reliable "this entry references the asset" signal.
|
|
643
|
+
const pattern = `/api/assets/${assetId}/`;
|
|
644
|
+
const references = [];
|
|
645
|
+
for (const repo of accessible) {
|
|
646
|
+
let graph;
|
|
647
|
+
try {
|
|
648
|
+
graph = workspaceManager.getGraph(repo.name);
|
|
649
|
+
}
|
|
650
|
+
catch {
|
|
651
|
+
continue;
|
|
652
|
+
}
|
|
653
|
+
const matches = graph.search({ query: pattern });
|
|
654
|
+
for (const e of matches) {
|
|
655
|
+
// Skip self: a standalone asset's own entity holds the URL in
|
|
656
|
+
// its `asset_url` frontmatter so it always matches its own
|
|
657
|
+
// search. Embedded assets fall through (their owner is the
|
|
658
|
+
// parent entry, which IS a legitimate reference to show).
|
|
659
|
+
if (owner &&
|
|
660
|
+
owner.ownerType === 'asset' &&
|
|
661
|
+
owner.repo === repo.name &&
|
|
662
|
+
e.id === owner.ownerId)
|
|
663
|
+
continue;
|
|
664
|
+
const data = e.data;
|
|
665
|
+
const title = typeof data.name === 'string' && data.name.trim() !== ''
|
|
666
|
+
? data.name
|
|
667
|
+
: e.id;
|
|
668
|
+
references.push({
|
|
669
|
+
repo: repo.name,
|
|
670
|
+
entityType: e.entityType,
|
|
671
|
+
entityId: e.id,
|
|
672
|
+
title,
|
|
673
|
+
});
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
return reply.send({ references });
|
|
677
|
+
});
|
|
678
|
+
// GET /api/repos/:repo/entities/:type/:id/delete-impact — the delete-time
|
|
679
|
+
// asset prompt's data (assets-referenced-not-owned P2). Read-only: which
|
|
680
|
+
// assets does this entry embed, which are referenced SOLELY by it
|
|
681
|
+
// (live-reconciled workspace scan), and which the caller may delete. The
|
|
682
|
+
// client offers exactly the solely-referenced + deletable ones; deletion
|
|
683
|
+
// itself runs through the existing by-id route per asset.
|
|
684
|
+
fastify.get('/api/repos/:repo/entities/:type/:id/delete-impact', async (req, reply) => {
|
|
685
|
+
const { repo, type, id } = req.params;
|
|
686
|
+
const user = req.user;
|
|
687
|
+
// Deleting requires write access to the entry's folder; the impact
|
|
688
|
+
// report shares that gate (no-leak 404, mirroring the delete route).
|
|
689
|
+
if (!access.canWriteRepo(user, repo, workspaceManager, authService)) {
|
|
115
690
|
return reply.status(404).send({ error: `Folder "${repo}" not found` });
|
|
116
691
|
}
|
|
117
692
|
let graph;
|
|
118
693
|
try {
|
|
119
694
|
graph = workspaceManager.getGraph(repo);
|
|
120
695
|
}
|
|
696
|
+
catch {
|
|
697
|
+
return reply.status(404).send({ error: 'Entry not found' });
|
|
698
|
+
}
|
|
699
|
+
try {
|
|
700
|
+
graph.get(type, id);
|
|
701
|
+
}
|
|
702
|
+
catch {
|
|
703
|
+
return reply.status(404).send({ error: 'Entry not found' });
|
|
704
|
+
}
|
|
705
|
+
try {
|
|
706
|
+
const impact = await computeAssetDeleteImpact({
|
|
707
|
+
workspaceManager, authService, user,
|
|
708
|
+
repo, entityType: type, entityId: id,
|
|
709
|
+
});
|
|
710
|
+
return reply.send(impact);
|
|
711
|
+
}
|
|
121
712
|
catch (err) {
|
|
122
|
-
|
|
713
|
+
// The entry exists — an exception here is a scan bug, not a miss.
|
|
714
|
+
// Log it (ops signal) and fail kept-everything on the client side.
|
|
715
|
+
req.log?.error?.({ err, repo, type, id }, '[delete-impact] scan failed');
|
|
716
|
+
return reply.status(500).send({ error: 'Could not compute the asset impact' });
|
|
123
717
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
718
|
+
});
|
|
719
|
+
// GET /api/repos/:repo/entities/:type/:id/move-impact?target=<repo> — the
|
|
720
|
+
// cross-folder move heads-up (assets-referenced-not-owned P4 Option A).
|
|
721
|
+
// Read-only: which images this entry embeds would NOT be visible to everyone in
|
|
722
|
+
// the destination repo after a cross-repo move (their home folder stays put).
|
|
723
|
+
// Cheap — scans only this entry's embeds. The move itself is never blocked; the
|
|
724
|
+
// client shows a non-blocking notice. Fail-soft: on any error return no at-risk
|
|
725
|
+
// assets (a heads-up failing should never break or block the move).
|
|
726
|
+
fastify.get('/api/repos/:repo/entities/:type/:id/move-impact', async (req, reply) => {
|
|
727
|
+
const { repo, type, id } = req.params;
|
|
728
|
+
const target = req.query.target?.trim();
|
|
729
|
+
const user = req.user;
|
|
730
|
+
// Same gate as the move/delete-impact routes: write access to the entry's
|
|
731
|
+
// folder, no-leak 404 otherwise.
|
|
732
|
+
if (!access.canWriteRepo(user, repo, workspaceManager, authService)) {
|
|
733
|
+
return reply.status(404).send({ error: `Folder "${repo}" not found` });
|
|
136
734
|
}
|
|
137
|
-
//
|
|
138
|
-
|
|
735
|
+
// Validate the entry exists first (consistent with delete-impact), then
|
|
736
|
+
// handle the no-destination-yet case as an empty heads-up.
|
|
737
|
+
let graph;
|
|
139
738
|
try {
|
|
140
|
-
|
|
739
|
+
graph = workspaceManager.getGraph(repo);
|
|
141
740
|
}
|
|
142
741
|
catch {
|
|
143
|
-
return {
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const url = asset.url.startsWith('file://') || !asset.url.startsWith('http')
|
|
158
|
-
? `/api/assets/${asset.entityType}/${asset.entityId}/${asset.filename}`
|
|
159
|
-
: asset.path;
|
|
160
|
-
result.push({
|
|
161
|
-
filename: asset.filename,
|
|
162
|
-
size: asset.size,
|
|
163
|
-
contentType: asset.contentType,
|
|
164
|
-
url,
|
|
165
|
-
entityType: asset.entityType,
|
|
166
|
-
entityId: asset.entityId,
|
|
167
|
-
entityName,
|
|
168
|
-
mediaType: asset.mediaType,
|
|
742
|
+
return reply.status(404).send({ error: 'Entry not found' });
|
|
743
|
+
}
|
|
744
|
+
try {
|
|
745
|
+
graph.get(type, id);
|
|
746
|
+
}
|
|
747
|
+
catch {
|
|
748
|
+
return reply.status(404).send({ error: 'Entry not found' });
|
|
749
|
+
}
|
|
750
|
+
if (!target)
|
|
751
|
+
return reply.send({ atRisk: [] });
|
|
752
|
+
try {
|
|
753
|
+
const impact = computeAssetMoveImpact({
|
|
754
|
+
workspaceManager, authService, user,
|
|
755
|
+
repo, entityType: type, entityId: id, targetRepo: target,
|
|
169
756
|
});
|
|
757
|
+
return reply.send(impact);
|
|
758
|
+
}
|
|
759
|
+
catch (err) {
|
|
760
|
+
// A heads-up must never break the move flow — log + return empty.
|
|
761
|
+
req.log?.error?.({ err, repo, type, id, target }, '[move-impact] failed');
|
|
762
|
+
return reply.send({ atRisk: [] });
|
|
170
763
|
}
|
|
171
|
-
return { assets: result };
|
|
172
764
|
});
|
|
173
|
-
//
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
765
|
+
// GET /api/workspace/assets/store — resolve (lazy-create) the reserved
|
|
766
|
+
// Workspace Assets store and return its repo name. The manager's upload
|
|
767
|
+
// affordance calls this, then POSTs the file to /api/repos/<repo>/assets.
|
|
768
|
+
// This is how an existing workspace backfills the store on first use (D3 /
|
|
769
|
+
// resolveWorkspaceAssetsRepo) — never a boot sweep. Authed users only; the
|
|
770
|
+
// store is workspace_wide so any member can upload once it exists.
|
|
771
|
+
fastify.get('/api/workspace/assets/store', async (_req, reply) => {
|
|
772
|
+
// Match the upload route's auth posture: open-mode (no user) is allowed.
|
|
773
|
+
const workspace = new Workspace(workspaceManager.getWorkspacePath());
|
|
774
|
+
const repo = await resolveWorkspaceAssetsRepo(workspace, workspaceManager);
|
|
775
|
+
return reply.send({ repo });
|
|
776
|
+
});
|
|
777
|
+
// The entity-coordinate DELETE route (DELETE
|
|
778
|
+
// /api/repos/:repo/entities/:type/:id/assets/:filename) was removed with the
|
|
779
|
+
// legacy 3-segment scheme — every asset is now deleted by its immutable id
|
|
780
|
+
// via the by-assetId route below.
|
|
781
|
+
// DELETE /api/repos/:repo/assets/:assetId/:filename — delete ANY indexed
|
|
782
|
+
// asset by its immutable id (the manager's delete; assets are library
|
|
783
|
+
// citizens, so this serves every owner shape including legacy entity-owned
|
|
784
|
+
// stragglers). Removes the blob + index row in one step.
|
|
785
|
+
fastify.delete('/api/repos/:repo/assets/:assetId/:filename', async (req, reply) => {
|
|
786
|
+
const { repo, assetId, filename } = req.params;
|
|
787
|
+
// WRITE gate — see the filename route above.
|
|
788
|
+
if (!access.canWriteRepo(req.user, repo, workspaceManager, authService)) {
|
|
177
789
|
return reply.status(404).send({ error: `Folder "${repo}" not found` });
|
|
178
790
|
}
|
|
791
|
+
// Confirm the asset exists and actually belongs to this folder — don't let
|
|
792
|
+
// access to one folder delete another folder's asset by id.
|
|
793
|
+
const index = workspaceManager.getAssetIndex?.();
|
|
794
|
+
const row = index?.get(assetId);
|
|
795
|
+
if (!row || row.repo !== repo) {
|
|
796
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
797
|
+
}
|
|
798
|
+
// Same uploader/owner gate as the filename route, keyed on the asset row.
|
|
799
|
+
const denial = assetDeleteDenialByAssetId(index, workspaceManager.getRepoConfig(repo), req.user, assetId);
|
|
800
|
+
if (denial)
|
|
801
|
+
return reply.status(403).send({ error: denial });
|
|
802
|
+
// Filename must match the stored row — the key is `{assetId}/{filename}`.
|
|
803
|
+
if (row.filename !== filename) {
|
|
804
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
805
|
+
}
|
|
179
806
|
let graph;
|
|
180
807
|
try {
|
|
181
808
|
graph = workspaceManager.getGraph(repo);
|
|
@@ -184,12 +811,131 @@ export async function registerAssetApiRoutes(fastify, workspaceManager, authServ
|
|
|
184
811
|
return reply.status(404).send({ error: err.message });
|
|
185
812
|
}
|
|
186
813
|
try {
|
|
187
|
-
await graph.
|
|
814
|
+
await graph.deleteAssetById(assetId, filename);
|
|
815
|
+
broadcastAssetChange(repo, req, 'deleted an asset');
|
|
188
816
|
return { success: true };
|
|
189
817
|
}
|
|
190
818
|
catch (err) {
|
|
191
819
|
return reply.status(404).send({ error: err.message });
|
|
192
820
|
}
|
|
193
821
|
});
|
|
822
|
+
// POST /api/repos/:repo/assets/:assetId/create-entry — the second import
|
|
823
|
+
// "door": create a typed entity (auto-derived type, re-extracted body) that
|
|
824
|
+
// embeds an EXISTING free-standing asset. Makes deletion reversible — a
|
|
825
|
+
// surviving asset can be re-embedded into a new entry.
|
|
826
|
+
//
|
|
827
|
+
// Destination rule (mirrors the UI's single-click vs picker split):
|
|
828
|
+
// - A FOLDER-OWNED asset's entry is FORCED into the asset's own folder, so
|
|
829
|
+
// the entry's audience matches the asset's auth scope and the embedded URL
|
|
830
|
+
// can never resolve for a reader who can't see the asset. Any `targetRepo`
|
|
831
|
+
// is ignored for these.
|
|
832
|
+
// - A WORKSPACE-WIDE asset is readable by every member and lives in a system
|
|
833
|
+
// store that can't hold entries, so the caller picks a real content folder
|
|
834
|
+
// via `targetRepo` (no cross-folder embed risk — it's globally readable).
|
|
835
|
+
fastify.post('/api/repos/:repo/assets/:assetId/create-entry', async (req, reply) => {
|
|
836
|
+
const { repo, assetId } = req.params;
|
|
837
|
+
const user = req.user;
|
|
838
|
+
// Resolve the destination folder. Only a globally-readable (workspace-wide)
|
|
839
|
+
// asset may target a folder other than its own — that's the one case with
|
|
840
|
+
// no broken-embed risk and no real "own folder" to fall back to. The
|
|
841
|
+
// subfolder is honored only on that same (picked) path. (isWorkspaceWide
|
|
842
|
+
// keys on the URL `repo`, not the asset row, so it's safe to resolve before
|
|
843
|
+
// the row lookup.)
|
|
844
|
+
const picked = req.body?.targetRepo?.trim();
|
|
845
|
+
const assetGlobal = access.isWorkspaceWide(repo, workspaceManager);
|
|
846
|
+
const destRepo = (picked && assetGlobal) ? picked : repo;
|
|
847
|
+
const destFolderPath = (picked && assetGlobal) ? (req.body?.targetFolderPath?.trim() || undefined) : undefined;
|
|
848
|
+
// Never create an entry inside a system store (it's excluded from every
|
|
849
|
+
// knowledge surface — sidebar, agent inventory, lint — so the entry would
|
|
850
|
+
// be orphaned). A workspace-wide asset MUST pick a real content folder.
|
|
851
|
+
// (System stores aren't secret, so a 400 here leaks nothing.)
|
|
852
|
+
if (workspaceManager.getRepoConfig(destRepo)?.system) {
|
|
853
|
+
return reply.status(400).send({ error: 'Choose a folder to create the entry in.' });
|
|
854
|
+
}
|
|
855
|
+
// Access gate FIRST — before any asset existence / owner-type response —
|
|
856
|
+
// so a non-member can't distinguish an existing private asset from a
|
|
857
|
+
// missing one (mirrors the move route's gate-before-lookup order). The
|
|
858
|
+
// asset's own folder uses the no-leak 404; an explicitly-chosen target
|
|
859
|
+
// folder uses 403 (the user picked it from a list they can already see).
|
|
860
|
+
if (destRepo === repo) {
|
|
861
|
+
if (!access.canWriteRepo(user, repo, workspaceManager, authService)) {
|
|
862
|
+
return reply.status(404).send({ error: `Folder "${repo}" not found` });
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
else if (!access.canWriteRepo(user, destRepo, workspaceManager, authService)) {
|
|
866
|
+
return reply.status(403).send({ error: `Editor access required to create an entry in "${destRepo}".` });
|
|
867
|
+
}
|
|
868
|
+
const index = workspaceManager.getAssetIndex?.();
|
|
869
|
+
const row = index?.get(assetId);
|
|
870
|
+
if (!row || row.repo !== repo) {
|
|
871
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
872
|
+
}
|
|
873
|
+
// Any indexed asset can become an entry — assets are library citizens
|
|
874
|
+
// and entry deletion never cascades, so re-embedding is always safe.
|
|
875
|
+
// (The old free-standing-only guard existed to dodge cleanupOwnedAssets,
|
|
876
|
+
// which is gone.) Legacy entity-owned rows simply work here.
|
|
877
|
+
let graph;
|
|
878
|
+
try {
|
|
879
|
+
graph = workspaceManager.getGraph(destRepo);
|
|
880
|
+
}
|
|
881
|
+
catch (err) {
|
|
882
|
+
return reply.status(404).send({ error: err.message });
|
|
883
|
+
}
|
|
884
|
+
try {
|
|
885
|
+
const result = await createEntityFromAsset({
|
|
886
|
+
graph,
|
|
887
|
+
assetId,
|
|
888
|
+
folderPath: destFolderPath,
|
|
889
|
+
name: req.body?.name,
|
|
890
|
+
user: reqGitUser(req),
|
|
891
|
+
});
|
|
892
|
+
broadcastAssetChange(destRepo, req, 'created an entry from an asset');
|
|
893
|
+
return { entities: result.entities, assetId: result.assetId, asset_url: result.asset_url, repo: destRepo };
|
|
894
|
+
}
|
|
895
|
+
catch (err) {
|
|
896
|
+
return reply.status(400).send({ error: err.message ?? 'Could not create entry from asset' });
|
|
897
|
+
}
|
|
898
|
+
});
|
|
899
|
+
// POST /api/repos/:repo/assets/:assetId/move — relocate an asset to another
|
|
900
|
+
// folder. Index-only (the blob key is repo-independent). Requires write
|
|
901
|
+
// access to BOTH the source and target folders. Any indexed row is movable;
|
|
902
|
+
// moveByAssetId normalizes the row to folder ownership of the target, so a
|
|
903
|
+
// legacy entity-owned straggler is repaired by the very move that touches it.
|
|
904
|
+
fastify.post('/api/repos/:repo/assets/:assetId/move', async (req, reply) => {
|
|
905
|
+
const { repo, assetId } = req.params;
|
|
906
|
+
const targetRepo = req.body?.targetRepo;
|
|
907
|
+
const user = req.user;
|
|
908
|
+
if (!targetRepo)
|
|
909
|
+
return reply.status(400).send({ error: 'targetRepo is required' });
|
|
910
|
+
if (!access.canWriteRepo(user, repo, workspaceManager, authService)) {
|
|
911
|
+
return reply.status(404).send({ error: `Folder "${repo}" not found` });
|
|
912
|
+
}
|
|
913
|
+
if (!access.canWriteRepo(user, targetRepo, workspaceManager, authService)) {
|
|
914
|
+
return reply.status(403).send({ error: `Editor access required to move into "${targetRepo}".` });
|
|
915
|
+
}
|
|
916
|
+
const index = workspaceManager.getAssetIndex?.();
|
|
917
|
+
const row = index?.get(assetId);
|
|
918
|
+
if (!index || !row || row.repo !== repo) {
|
|
919
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
920
|
+
}
|
|
921
|
+
// Moving OUT of a workspace_wide store reassigns the asset's repo, after
|
|
922
|
+
// which the tighter uploader/owner delete rule no longer applies — so the
|
|
923
|
+
// move itself must honor that rule (mirrors the entity-move guard in
|
|
924
|
+
// graph-api). A no-op for non-workspace_wide sources, so normal
|
|
925
|
+
// folder→folder moves are unaffected.
|
|
926
|
+
const denial = assetDeleteDenialByAssetId(index, workspaceManager.getRepoConfig(repo), user, assetId);
|
|
927
|
+
if (denial)
|
|
928
|
+
return reply.status(403).send({ error: denial });
|
|
929
|
+
if (targetRepo === repo)
|
|
930
|
+
return { success: true }; // no-op
|
|
931
|
+
// Honor the result — a concurrent delete/move could have removed the row
|
|
932
|
+
// between the get() above and here; reporting success then would make the
|
|
933
|
+
// asset appear moved when it wasn't.
|
|
934
|
+
if (!index.moveByAssetId(assetId, targetRepo)) {
|
|
935
|
+
return reply.status(404).send({ error: 'Asset not found' });
|
|
936
|
+
}
|
|
937
|
+
broadcastAssetChange(repo, req, 'moved an asset');
|
|
938
|
+
return { success: true };
|
|
939
|
+
});
|
|
194
940
|
}
|
|
195
941
|
//# sourceMappingURL=asset-api.js.map
|