studiograph 1.3.48-next.21 → 1.3.48-next.210
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -16
- package/dist/agent/agent-pool.d.ts +87 -3
- package/dist/agent/agent-pool.js +188 -15
- package/dist/agent/agent-pool.js.map +1 -1
- package/dist/agent/followups.d.ts +34 -0
- package/dist/agent/followups.js +52 -0
- package/dist/agent/followups.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +101 -4
- package/dist/agent/orchestrator.js +464 -66
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +34 -0
- package/dist/agent/prompts/entity-types-section.js +76 -0
- package/dist/agent/prompts/entity-types-section.js.map +1 -0
- package/dist/agent/prompts/system.md +112 -54
- package/dist/agent/skill-loader.d.ts +30 -17
- package/dist/agent/skill-loader.js +63 -30
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/skills/artifact-canvas/skill.md +152 -0
- package/dist/agent/skills/entity-schema.md +75 -431
- package/dist/agent/skills/interview/entity-templates.md +38 -37
- package/dist/agent/skills/interview/question-domains.md +54 -49
- package/dist/agent/skills/interview/skill.md +84 -16
- package/dist/agent/skills/schema-rules.md +28 -28
- package/dist/agent/tools/artifact-tools.d.ts +124 -0
- package/dist/agent/tools/artifact-tools.js +207 -0
- package/dist/agent/tools/artifact-tools.js.map +1 -0
- package/dist/agent/tools/capture-tools.d.ts +31 -0
- package/dist/agent/tools/capture-tools.js +40 -0
- package/dist/agent/tools/capture-tools.js.map +1 -0
- package/dist/agent/tools/folder-tools.d.ts +47 -0
- package/dist/agent/tools/folder-tools.js +249 -0
- package/dist/agent/tools/folder-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +6 -5
- package/dist/agent/tools/fs-tools.js +5 -5
- package/dist/agent/tools/fs-tools.js.map +1 -1
- package/dist/agent/tools/graph-tools.d.ts +48 -72
- package/dist/agent/tools/graph-tools.js +852 -329
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/history-tools.d.ts +95 -0
- package/dist/agent/tools/history-tools.js +461 -0
- package/dist/agent/tools/history-tools.js.map +1 -0
- package/dist/agent/tools/load-skill.d.ts +6 -5
- package/dist/agent/tools/load-skill.js +3 -3
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +5 -4
- package/dist/agent/tools/ops-tools.js +130 -236
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +87 -17
- package/dist/agent/tools/permission-tools.js +233 -43
- package/dist/agent/tools/permission-tools.js.map +1 -1
- package/dist/agent/tools/tool-loader.js +5 -4
- package/dist/agent/tools/tool-loader.js.map +1 -1
- package/dist/agent/tools/web-tools.js +58 -9
- package/dist/agent/tools/web-tools.js.map +1 -1
- package/dist/cli/commands/about.d.ts +1 -0
- package/dist/cli/commands/about.js +55 -3
- package/dist/cli/commands/about.js.map +1 -1
- package/dist/cli/commands/admin/audit-workspace.d.ts +23 -0
- package/dist/cli/commands/admin/audit-workspace.js +133 -0
- package/dist/cli/commands/admin/audit-workspace.js.map +1 -0
- package/dist/cli/commands/admin/audit.d.ts +21 -0
- package/dist/cli/commands/admin/audit.js +174 -0
- package/dist/cli/commands/admin/audit.js.map +1 -0
- package/dist/cli/commands/admin/backup.d.ts +54 -0
- package/dist/cli/commands/admin/backup.js +207 -0
- package/dist/cli/commands/admin/backup.js.map +1 -0
- package/dist/cli/commands/admin/folder.d.ts +11 -0
- package/dist/cli/commands/{collection.js → admin/folder.js} +33 -32
- package/dist/cli/commands/admin/folder.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +16 -0
- package/dist/cli/commands/admin/index.js +46 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate-assets.d.ts +53 -0
- package/dist/cli/commands/admin/migrate-assets.js +184 -0
- package/dist/cli/commands/admin/migrate-assets.js.map +1 -0
- package/dist/cli/commands/admin/migrate.d.ts +56 -0
- package/dist/cli/commands/admin/migrate.js +263 -0
- package/dist/cli/commands/admin/migrate.js.map +1 -0
- package/dist/cli/commands/admin/restore.d.ts +24 -0
- package/dist/cli/commands/admin/restore.js +228 -0
- package/dist/cli/commands/admin/restore.js.map +1 -0
- package/dist/cli/commands/admin/secrets.d.ts +23 -0
- package/dist/cli/commands/admin/secrets.js +256 -0
- package/dist/cli/commands/admin/secrets.js.map +1 -0
- package/dist/cli/commands/admin/settings.d.ts +28 -0
- package/dist/cli/commands/admin/settings.js +284 -0
- package/dist/cli/commands/admin/settings.js.map +1 -0
- package/dist/cli/commands/admin/token.d.ts +42 -0
- package/dist/cli/commands/admin/token.js +126 -0
- package/dist/cli/commands/admin/token.js.map +1 -0
- package/dist/cli/commands/admin/transfer-ownership.d.ts +15 -0
- package/dist/cli/commands/admin/transfer-ownership.js +106 -0
- package/dist/cli/commands/admin/transfer-ownership.js.map +1 -0
- package/dist/cli/commands/admin/user.d.ts +11 -0
- package/dist/cli/commands/admin/user.js +187 -0
- package/dist/cli/commands/admin/user.js.map +1 -0
- package/dist/cli/commands/clone.d.ts +25 -3
- package/dist/cli/commands/clone.js +142 -36
- package/dist/cli/commands/clone.js.map +1 -1
- package/dist/cli/commands/config.d.ts +23 -107
- package/dist/cli/commands/config.js +52 -260
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/connector.d.ts +10 -13
- package/dist/cli/commands/connector.js +16 -58
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.js +215 -68
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/index.js +5 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +10 -30
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.js +54 -6
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/r2.d.ts +3 -0
- package/dist/cli/commands/r2.js +223 -204
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.js +65 -12
- package/dist/cli/commands/redeploy.js.map +1 -1
- package/dist/cli/commands/reset.d.ts +22 -6
- package/dist/cli/commands/reset.js +132 -34
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/serve.js +231 -26
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +237 -227
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/crypto-bundle.d.ts +39 -0
- package/dist/cli/crypto-bundle.js +94 -0
- package/dist/cli/crypto-bundle.js.map +1 -0
- package/dist/cli/index.js +24 -26
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/railway-pin.d.ts +68 -0
- package/dist/cli/railway-pin.js +96 -0
- package/dist/cli/railway-pin.js.map +1 -0
- package/dist/cli/railway-provisioning.d.ts +53 -0
- package/dist/cli/railway-provisioning.js +85 -0
- package/dist/cli/railway-provisioning.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +30 -49
- package/dist/cli/setup-wizard.js +39 -40
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/core/accent-palette.d.ts +22 -0
- package/dist/core/accent-palette.js +47 -0
- package/dist/core/accent-palette.js.map +1 -0
- package/dist/core/artifact-asset-urls.d.ts +51 -0
- package/dist/core/artifact-asset-urls.js +79 -0
- package/dist/core/artifact-asset-urls.js.map +1 -0
- package/dist/core/artifact-bundle.d.ts +69 -0
- package/dist/core/artifact-bundle.js +305 -0
- package/dist/core/artifact-bundle.js.map +1 -0
- package/dist/core/artifact-escape.d.ts +5 -0
- package/dist/core/artifact-escape.js +26 -0
- package/dist/core/artifact-escape.js.map +1 -0
- package/dist/core/artifact-export.d.ts +17 -0
- package/dist/core/artifact-export.js +529 -0
- package/dist/core/artifact-export.js.map +1 -0
- package/dist/core/cell-anchor.d.ts +29 -0
- package/dist/core/cell-anchor.js +53 -0
- package/dist/core/cell-anchor.js.map +1 -0
- package/dist/core/comment-anchor.d.ts +41 -0
- package/dist/core/comment-anchor.js +147 -0
- package/dist/core/comment-anchor.js.map +1 -0
- package/dist/core/commit-messages.d.ts +57 -0
- package/dist/core/commit-messages.js +85 -0
- package/dist/core/commit-messages.js.map +1 -0
- package/dist/core/embeds.d.ts +96 -0
- package/dist/core/embeds.js +187 -0
- package/dist/core/embeds.js.map +1 -0
- package/dist/core/entity-body-templates.d.ts +21 -0
- package/dist/core/entity-body-templates.js +67 -0
- package/dist/core/entity-body-templates.js.map +1 -0
- package/dist/core/entity-types-catalog.d.ts +65 -0
- package/dist/core/entity-types-catalog.js +142 -0
- package/dist/core/entity-types-catalog.js.map +1 -0
- package/dist/core/field-library.d.ts +62 -0
- package/dist/core/field-library.js +129 -0
- package/dist/core/field-library.js.map +1 -0
- package/dist/core/folder-paths.d.ts +41 -0
- package/dist/core/folder-paths.js +95 -0
- package/dist/core/folder-paths.js.map +1 -0
- package/dist/core/folder-sidecar.d.ts +36 -0
- package/dist/core/folder-sidecar.js +91 -0
- package/dist/core/folder-sidecar.js.map +1 -0
- package/dist/core/format-registry.d.ts +170 -0
- package/dist/core/format-registry.js +412 -0
- package/dist/core/format-registry.js.map +1 -0
- package/dist/core/graph.d.ts +773 -14
- package/dist/core/graph.js +2269 -308
- package/dist/core/graph.js.map +1 -1
- package/dist/core/history-diff.d.ts +35 -0
- package/dist/core/history-diff.js +114 -0
- package/dist/core/history-diff.js.map +1 -0
- package/dist/core/refs.d.ts +41 -0
- package/dist/core/refs.js +80 -0
- package/dist/core/refs.js.map +1 -0
- package/dist/core/schema-registry.d.ts +66 -0
- package/dist/core/schema-registry.js +198 -37
- package/dist/core/schema-registry.js.map +1 -1
- package/dist/core/schemas/connector.d.ts +67 -0
- package/dist/core/schemas/connector.js +100 -0
- package/dist/core/schemas/connector.js.map +1 -0
- package/dist/core/schemas/workspace.d.ts +122 -0
- package/dist/core/schemas/workspace.js +211 -0
- package/dist/core/schemas/workspace.js.map +1 -0
- package/dist/core/secrets/SecretStore.d.ts +77 -0
- package/dist/core/secrets/SecretStore.js +13 -0
- package/dist/core/secrets/SecretStore.js.map +1 -0
- package/dist/core/secrets/SettingsResolver.d.ts +54 -0
- package/dist/core/secrets/SettingsResolver.js +80 -0
- package/dist/core/secrets/SettingsResolver.js.map +1 -0
- package/dist/core/secrets/SettingsStore.d.ts +30 -0
- package/dist/core/secrets/SettingsStore.js +9 -0
- package/dist/core/secrets/SettingsStore.js.map +1 -0
- package/dist/core/secrets/SqliteEncryptedStore.d.ts +90 -0
- package/dist/core/secrets/SqliteEncryptedStore.js +598 -0
- package/dist/core/secrets/SqliteEncryptedStore.js.map +1 -0
- package/dist/core/secrets/audit.d.ts +36 -0
- package/dist/core/secrets/audit.js +60 -0
- package/dist/core/secrets/audit.js.map +1 -0
- package/dist/core/secrets/auth-db-migration.d.ts +129 -0
- package/dist/core/secrets/auth-db-migration.js +653 -0
- package/dist/core/secrets/auth-db-migration.js.map +1 -0
- package/dist/core/secrets/bundle.d.ts +141 -0
- package/dist/core/secrets/bundle.js +435 -0
- package/dist/core/secrets/bundle.js.map +1 -0
- package/dist/core/secrets/dual-write.d.ts +81 -0
- package/dist/core/secrets/dual-write.js +247 -0
- package/dist/core/secrets/dual-write.js.map +1 -0
- package/dist/core/secrets/encryption.d.ts +44 -0
- package/dist/core/secrets/encryption.js +97 -0
- package/dist/core/secrets/encryption.js.map +1 -0
- package/dist/core/secrets/index.d.ts +49 -0
- package/dist/core/secrets/index.js +74 -0
- package/dist/core/secrets/index.js.map +1 -0
- package/dist/core/secrets/master-key.d.ts +38 -0
- package/dist/core/secrets/master-key.js +122 -0
- package/dist/core/secrets/master-key.js.map +1 -0
- package/dist/core/secrets/probes/anthropic.d.ts +98 -0
- package/dist/core/secrets/probes/anthropic.js +300 -0
- package/dist/core/secrets/probes/anthropic.js.map +1 -0
- package/dist/core/secrets/probes/brave.d.ts +9 -0
- package/dist/core/secrets/probes/brave.js +15 -0
- package/dist/core/secrets/probes/brave.js.map +1 -0
- package/dist/core/secrets/probes/r2.d.ts +15 -0
- package/dist/core/secrets/probes/r2.js +14 -0
- package/dist/core/secrets/probes/r2.js.map +1 -0
- package/dist/core/secrets/probes/tavily.d.ts +18 -0
- package/dist/core/secrets/probes/tavily.js +58 -0
- package/dist/core/secrets/probes/tavily.js.map +1 -0
- package/dist/core/secrets/probes/voyage.d.ts +13 -0
- package/dist/core/secrets/probes/voyage.js +52 -0
- package/dist/core/secrets/probes/voyage.js.map +1 -0
- package/dist/core/secrets/r2-structural-migration.d.ts +39 -0
- package/dist/core/secrets/r2-structural-migration.js +109 -0
- package/dist/core/secrets/r2-structural-migration.js.map +1 -0
- package/dist/core/secrets/read-flip.d.ts +59 -0
- package/dist/core/secrets/read-flip.js +87 -0
- package/dist/core/secrets/read-flip.js.map +1 -0
- package/dist/core/secrets/registry.d.ts +188 -0
- package/dist/core/secrets/registry.js +616 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/types.d.ts +77 -483
- package/dist/core/types.js +25 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +75 -12
- package/dist/core/user-config.js +155 -14
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +786 -1373
- package/dist/core/validation.js +458 -147
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +87 -14
- package/dist/core/workspace-manager.js +222 -94
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +19 -5
- package/dist/core/workspace.js +67 -39
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/comment-virtual-entity.d.ts +36 -0
- package/dist/mcp/comment-virtual-entity.js +71 -0
- package/dist/mcp/comment-virtual-entity.js.map +1 -0
- package/dist/mcp/connector-manager.d.ts +72 -2
- package/dist/mcp/connector-manager.js +211 -32
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/oauth-provider.d.ts +0 -5
- package/dist/mcp/oauth-provider.js +10 -22
- package/dist/mcp/oauth-provider.js.map +1 -1
- package/dist/mcp/oauth-registry.d.ts +46 -8
- package/dist/mcp/oauth-registry.js +52 -13
- package/dist/mcp/oauth-registry.js.map +1 -1
- package/dist/mcp/server-discovery.d.ts +73 -0
- package/dist/mcp/server-discovery.js +164 -0
- package/dist/mcp/server-discovery.js.map +1 -0
- package/dist/mcp/server.d.ts +24 -3
- package/dist/mcp/server.js +53 -10
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/state-signer.d.ts +62 -0
- package/dist/mcp/state-signer.js +205 -0
- package/dist/mcp/state-signer.js.map +1 -0
- package/dist/mcp/stdio-proxy.d.ts +67 -0
- package/dist/mcp/stdio-proxy.js +149 -0
- package/dist/mcp/stdio-proxy.js.map +1 -0
- package/dist/mcp/tools.d.ts +65 -2
- package/dist/mcp/tools.js +1772 -124
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/__tests__/helpers/graph-api.d.ts +16 -0
- package/dist/server/__tests__/helpers/graph-api.js +16 -0
- package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
- package/dist/server/artifact-asset-mint.d.ts +41 -0
- package/dist/server/artifact-asset-mint.js +59 -0
- package/dist/server/artifact-asset-mint.js.map +1 -0
- package/dist/server/asset-index-queue.d.ts +98 -0
- package/dist/server/asset-index-queue.js +193 -0
- package/dist/server/asset-index-queue.js.map +1 -0
- package/dist/server/body-write-coordinator.d.ts +161 -0
- package/dist/server/body-write-coordinator.js +182 -0
- package/dist/server/body-write-coordinator.js.map +1 -0
- package/dist/server/cloud-billing-flow.d.ts +32 -0
- package/dist/server/cloud-billing-flow.js +75 -0
- package/dist/server/cloud-billing-flow.js.map +1 -0
- package/dist/server/commit-audit.d.ts +26 -0
- package/dist/server/commit-audit.js +30 -0
- package/dist/server/commit-audit.js.map +1 -0
- package/dist/server/index.d.ts +29 -3
- package/dist/server/index.js +657 -269
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/sanitize.d.ts +46 -0
- package/dist/server/middleware/sanitize.js +182 -0
- package/dist/server/middleware/sanitize.js.map +1 -0
- package/dist/server/routes/artifact-export-api.d.ts +11 -0
- package/dist/server/routes/artifact-export-api.js +159 -0
- package/dist/server/routes/artifact-export-api.js.map +1 -0
- package/dist/server/routes/asset-api.d.ts +76 -1
- package/dist/server/routes/asset-api.js +761 -61
- package/dist/server/routes/asset-api.js.map +1 -1
- package/dist/server/routes/audit-api.d.ts +24 -0
- package/dist/server/routes/audit-api.js +117 -0
- package/dist/server/routes/audit-api.js.map +1 -0
- package/dist/server/routes/auth-api.js +532 -63
- package/dist/server/routes/auth-api.js.map +1 -1
- package/dist/server/routes/capture-api.d.ts +10 -3
- package/dist/server/routes/capture-api.js +213 -25
- package/dist/server/routes/capture-api.js.map +1 -1
- package/dist/server/routes/chat-sessions-api.d.ts +13 -0
- package/dist/server/routes/chat-sessions-api.js +455 -0
- package/dist/server/routes/chat-sessions-api.js.map +1 -0
- package/dist/server/routes/chat.d.ts +35 -1
- package/dist/server/routes/chat.js +699 -54
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/comments-api.d.ts +15 -0
- package/dist/server/routes/comments-api.js +444 -0
- package/dist/server/routes/comments-api.js.map +1 -0
- package/dist/server/routes/config-api.d.ts +3 -2
- package/dist/server/routes/config-api.js +179 -49
- package/dist/server/routes/config-api.js.map +1 -1
- package/dist/server/routes/connectors-api.js +177 -42
- package/dist/server/routes/connectors-api.js.map +1 -1
- package/dist/server/routes/event-ingest-api.d.ts +15 -0
- package/dist/server/routes/{meeting-ingest-api.js → event-ingest-api.js} +35 -20
- package/dist/server/routes/event-ingest-api.js.map +1 -0
- package/dist/server/routes/field-library-api.d.ts +28 -0
- package/dist/server/routes/field-library-api.js +126 -0
- package/dist/server/routes/field-library-api.js.map +1 -0
- package/dist/server/routes/git-http.d.ts +2 -2
- package/dist/server/routes/git-http.js +86 -39
- package/dist/server/routes/git-http.js.map +1 -1
- package/dist/server/routes/graph-api-access.d.ts +57 -0
- package/dist/server/routes/graph-api-access.js +112 -0
- package/dist/server/routes/graph-api-access.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +1 -1
- package/dist/server/routes/graph-api.js +1455 -325
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/health.d.ts +18 -0
- package/dist/server/routes/health.js +74 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/import-batch.d.ts +24 -0
- package/dist/server/routes/import-batch.js +33 -0
- package/dist/server/routes/import-batch.js.map +1 -0
- package/dist/server/routes/insights-api.d.ts +9 -2
- package/dist/server/routes/insights-api.js +355 -61
- package/dist/server/routes/insights-api.js.map +1 -1
- package/dist/server/routes/mcp.d.ts +7 -3
- package/dist/server/routes/mcp.js +24 -8
- package/dist/server/routes/mcp.js.map +1 -1
- package/dist/server/routes/oauth-api.d.ts +67 -0
- package/dist/server/routes/oauth-api.js +421 -0
- package/dist/server/routes/oauth-api.js.map +1 -0
- package/dist/server/routes/permissions-api.d.ts +9 -2
- package/dist/server/routes/permissions-api.js +87 -31
- package/dist/server/routes/permissions-api.js.map +1 -1
- package/dist/server/routes/r2-api.d.ts +25 -0
- package/dist/server/routes/r2-api.js +276 -0
- package/dist/server/routes/r2-api.js.map +1 -0
- package/dist/server/routes/secrets-api.d.ts +36 -0
- package/dist/server/routes/secrets-api.js +308 -0
- package/dist/server/routes/secrets-api.js.map +1 -0
- package/dist/server/routes/settings-api.d.ts +29 -0
- package/dist/server/routes/settings-api.js +180 -0
- package/dist/server/routes/settings-api.js.map +1 -0
- package/dist/server/routes/share-api.d.ts +32 -0
- package/dist/server/routes/share-api.js +234 -0
- package/dist/server/routes/share-api.js.map +1 -0
- package/dist/server/routes/views-api.js +51 -0
- package/dist/server/routes/views-api.js.map +1 -1
- package/dist/server/routes/workspace-api.d.ts +2 -1
- package/dist/server/routes/workspace-api.js +142 -23
- package/dist/server/routes/workspace-api.js.map +1 -1
- package/dist/server/routes/ws.d.ts +3 -2
- package/dist/server/routes/ws.js +68 -17
- package/dist/server/routes/ws.js.map +1 -1
- package/dist/server/session-manager.d.ts +48 -5
- package/dist/server/session-manager.js +182 -14
- package/dist/server/session-manager.js.map +1 -1
- package/dist/server/ws-hub.d.ts +124 -37
- package/dist/server/ws-hub.js +0 -0
- package/dist/server/ws-hub.js.map +1 -1
- package/dist/server/yjs-manager.d.ts +278 -7
- package/dist/server/yjs-manager.js +830 -38
- package/dist/server/yjs-manager.js.map +1 -1
- package/dist/server/yjs-persistence.d.ts +165 -0
- package/dist/server/yjs-persistence.js +557 -0
- package/dist/server/yjs-persistence.js.map +1 -0
- package/dist/server/yjs-text-diff.d.ts +32 -0
- package/dist/server/yjs-text-diff.js +61 -0
- package/dist/server/yjs-text-diff.js.map +1 -0
- package/dist/services/access-control.d.ts +73 -0
- package/dist/services/access-control.js +165 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/artifact-asset-token.d.ts +69 -0
- package/dist/services/artifact-asset-token.js +94 -0
- package/dist/services/artifact-asset-token.js.map +1 -0
- package/dist/services/artifact-library-sources.d.ts +3 -0
- package/dist/services/artifact-library-sources.js +44 -0
- package/dist/services/artifact-library-sources.js.map +1 -0
- package/dist/services/artifact-render-export.d.ts +97 -0
- package/dist/services/artifact-render-export.js +467 -0
- package/dist/services/artifact-render-export.js.map +1 -0
- package/dist/services/asset-caption-service.d.ts +103 -0
- package/dist/services/asset-caption-service.js +186 -0
- package/dist/services/asset-caption-service.js.map +1 -0
- package/dist/services/asset-delete-authz.d.ts +31 -0
- package/dist/services/asset-delete-authz.js +61 -0
- package/dist/services/asset-delete-authz.js.map +1 -0
- package/dist/services/asset-finalize-service.d.ts +58 -0
- package/dist/services/asset-finalize-service.js +216 -0
- package/dist/services/asset-finalize-service.js.map +1 -0
- package/dist/services/asset-import-service.d.ts +111 -0
- package/dist/services/asset-import-service.js +394 -0
- package/dist/services/asset-import-service.js.map +1 -0
- package/dist/services/asset-index-sweep.d.ts +95 -0
- package/dist/services/asset-index-sweep.js +249 -0
- package/dist/services/asset-index-sweep.js.map +1 -0
- package/dist/services/asset-lifecycle-check.d.ts +22 -0
- package/dist/services/asset-lifecycle-check.js +80 -0
- package/dist/services/asset-lifecycle-check.js.map +1 -0
- package/dist/services/asset-listing.d.ts +72 -0
- package/dist/services/asset-listing.js +321 -0
- package/dist/services/asset-listing.js.map +1 -0
- package/dist/services/asset-presign-service.d.ts +68 -0
- package/dist/services/asset-presign-service.js +124 -0
- package/dist/services/asset-presign-service.js.map +1 -0
- package/dist/services/asset-sidecar-service.d.ts +28 -0
- package/dist/services/asset-sidecar-service.js +79 -0
- package/dist/services/asset-sidecar-service.js.map +1 -0
- package/dist/services/asset-upload-errors.d.ts +41 -0
- package/dist/services/asset-upload-errors.js +45 -0
- package/dist/services/asset-upload-errors.js.map +1 -0
- package/dist/services/asset-upload-service.d.ts +56 -0
- package/dist/services/asset-upload-service.js +200 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/asset-upload-token.d.ts +58 -0
- package/dist/services/asset-upload-token.js +75 -0
- package/dist/services/asset-upload-token.js.map +1 -0
- package/dist/services/assets/asset-index-service.d.ts +127 -0
- package/dist/services/assets/asset-index-service.js +227 -0
- package/dist/services/assets/asset-index-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +128 -2
- package/dist/services/assets/base.js +98 -1
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +114 -1
- package/dist/services/assets/index.js +221 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +16 -1
- package/dist/services/assets/local.js +110 -1
- package/dist/services/assets/local.js.map +1 -1
- package/dist/services/assets/r2-sync.d.ts +88 -0
- package/dist/services/assets/r2-sync.js +412 -0
- package/dist/services/assets/r2-sync.js.map +1 -0
- package/dist/services/assets/r2.d.ts +87 -1
- package/dist/services/assets/r2.js +203 -1
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +312 -45
- package/dist/services/auth-service.js +1011 -195
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/chat-session-service.d.ts +188 -0
- package/dist/services/chat-session-service.js +512 -0
- package/dist/services/chat-session-service.js.map +1 -0
- package/dist/services/cloud-inference-billing.d.ts +64 -0
- package/dist/services/cloud-inference-billing.js +313 -0
- package/dist/services/cloud-inference-billing.js.map +1 -0
- package/dist/services/comment-service.d.ts +97 -0
- package/dist/services/comment-service.js +341 -0
- package/dist/services/comment-service.js.map +1 -0
- package/dist/services/comment-virtual-entity.d.ts +36 -0
- package/dist/services/comment-virtual-entity.js +71 -0
- package/dist/services/comment-virtual-entity.js.map +1 -0
- package/dist/services/convert-service.d.ts +64 -0
- package/dist/services/convert-service.js +68 -0
- package/dist/services/convert-service.js.map +1 -0
- package/dist/services/csv-service.d.ts +22 -17
- package/dist/services/csv-service.js +55 -92
- package/dist/services/csv-service.js.map +1 -1
- package/dist/services/entity-mutations.d.ts +213 -0
- package/dist/services/entity-mutations.js +380 -0
- package/dist/services/entity-mutations.js.map +1 -0
- package/dist/services/{meeting-processor.d.ts → event-processor.d.ts} +15 -8
- package/dist/services/{meeting-processor.js → event-processor.js} +124 -65
- package/dist/services/event-processor.js.map +1 -0
- package/dist/services/extract/docx.d.ts +1 -0
- package/dist/services/extract/docx.js +233 -0
- package/dist/services/extract/docx.js.map +1 -0
- package/dist/services/extract/index.d.ts +9 -0
- package/dist/services/extract/index.js +10 -0
- package/dist/services/extract/index.js.map +1 -0
- package/dist/services/extract/pdf.d.ts +13 -0
- package/dist/services/extract/pdf.js +69 -0
- package/dist/services/extract/pdf.js.map +1 -0
- package/dist/services/folder-creation.d.ts +33 -0
- package/dist/services/folder-creation.js +103 -0
- package/dist/services/folder-creation.js.map +1 -0
- package/dist/services/git.d.ts +58 -0
- package/dist/services/git.js +194 -55
- package/dist/services/git.js.map +1 -1
- package/dist/services/graph-maintenance.js +4 -4
- package/dist/services/graph-maintenance.js.map +1 -1
- package/dist/services/import-service.d.ts +51 -2
- package/dist/services/import-service.js +254 -107
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/lint-service.js +10 -17
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.d.ts +12 -1
- package/dist/services/markdown.js +77 -9
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/mention-detector.d.ts +23 -0
- package/dist/services/mention-detector.js +47 -0
- package/dist/services/mention-detector.js.map +1 -0
- package/dist/services/model-capabilities.d.ts +41 -0
- package/dist/services/model-capabilities.js +107 -0
- package/dist/services/model-capabilities.js.map +1 -0
- package/dist/services/notification-broadcast.d.ts +32 -0
- package/dist/services/notification-broadcast.js +38 -0
- package/dist/services/notification-broadcast.js.map +1 -0
- package/dist/services/notification-service.d.ts +41 -0
- package/dist/services/notification-service.js +100 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/oauth-server-store.d.ts +147 -0
- package/dist/services/oauth-server-store.js +319 -0
- package/dist/services/oauth-server-store.js.map +1 -0
- package/dist/services/orphan-service.js +2 -2
- package/dist/services/orphan-service.js.map +1 -1
- package/dist/services/personal-folder.d.ts +40 -0
- package/dist/services/personal-folder.js +101 -0
- package/dist/services/personal-folder.js.map +1 -0
- package/dist/services/scratch-asset-promote.d.ts +57 -0
- package/dist/services/scratch-asset-promote.js +95 -0
- package/dist/services/scratch-asset-promote.js.map +1 -0
- package/dist/services/scratch-attachment-service.d.ts +196 -0
- package/dist/services/scratch-attachment-service.js +347 -0
- package/dist/services/scratch-attachment-service.js.map +1 -0
- package/dist/services/share-link-service.d.ts +57 -0
- package/dist/services/share-link-service.js +142 -0
- package/dist/services/share-link-service.js.map +1 -0
- package/dist/services/user-person-bridge.d.ts +136 -0
- package/dist/services/user-person-bridge.js +340 -0
- package/dist/services/user-person-bridge.js.map +1 -0
- package/dist/services/vector-service.d.ts +282 -5
- package/dist/services/vector-service.js +585 -29
- package/dist/services/vector-service.js.map +1 -1
- package/dist/services/workspace-access.d.ts +108 -0
- package/dist/services/workspace-access.js +149 -0
- package/dist/services/workspace-access.js.map +1 -0
- package/dist/services/workspace-assets-folder.d.ts +46 -0
- package/dist/services/workspace-assets-folder.js +75 -0
- package/dist/services/workspace-assets-folder.js.map +1 -0
- package/dist/utils/git.d.ts +17 -2
- package/dist/utils/git.js +23 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/log.d.ts +42 -0
- package/dist/utils/log.js +137 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/preflight.js +2 -2
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/version-checker.d.ts +12 -19
- package/dist/utils/version-checker.js +14 -104
- package/dist/utils/version-checker.js.map +1 -1
- package/dist/web/_app/immutable/assets/0.Bs_z3Z86.css +2 -0
- package/dist/web/_app/immutable/assets/12.DlIf1mKh.css +1 -0
- package/dist/web/_app/immutable/assets/14.7d-Q37wc.css +1 -0
- package/dist/web/_app/immutable/assets/15.BwBFdc1D.css +1 -0
- package/dist/web/_app/immutable/assets/16.CmLrbzZp.css +1 -0
- package/dist/web/_app/immutable/assets/17.DcuK5ZVm.css +1 -0
- package/dist/web/_app/immutable/assets/2.DATnR31c.css +1 -0
- package/dist/web/_app/immutable/assets/3.Cz4H8n_O.css +1 -0
- package/dist/web/_app/immutable/assets/4.aDHteTDy.css +1 -0
- package/dist/web/_app/immutable/assets/6.CF1i5Bon.css +1 -0
- package/dist/web/_app/immutable/assets/ArtifactEntityView.C4ooklFD.css +1 -0
- package/dist/web/_app/immutable/assets/AssetLibraryPicker.BOFW0MvF.css +1 -0
- package/dist/web/_app/immutable/assets/BulkActionsBar.cmKvHzRK.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.lBCvS3X5.css +1 -0
- package/dist/web/_app/immutable/assets/CodeMirrorEditor.D6hf2pNJ.css +1 -0
- package/dist/web/_app/immutable/assets/CopyField.DVGZtw4U.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMembersPanel.kiYnDFHu.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMutationDialogs.BMRF6Z3z.css +1 -0
- package/dist/web/_app/immutable/assets/FolderPicker.Cp46GHe2.css +1 -0
- package/dist/web/_app/immutable/assets/GalleryView.WBGxxUQc.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.BOaI5KFL.css +1 -0
- package/dist/web/_app/immutable/assets/Link.vV0ne105.css +1 -0
- package/dist/web/_app/immutable/assets/Markdown.BZnsSOSf.css +1 -0
- package/dist/web/_app/immutable/assets/Rail.ilusFgD4.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.D7-BO6S_.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/StopFilledAlt.fNlDN65D.css +1 -0
- package/dist/web/_app/immutable/assets/TimelineView.xAZBJhHw.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.C8ErUJAY.css +1 -0
- package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
- package/dist/web/_app/immutable/assets/history-summary.LpmHXasl.css +1 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CZTNEAuW.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CsGl1sm0.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.BNK2_mGO.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.DpEwFAQM.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2 +0 -0
- package/dist/web/_app/immutable/assets/inline-list.cqga56xT.css +1 -0
- package/dist/web/_app/immutable/assets/list-columns.BgnafZ4K.css +1 -0
- package/dist/web/_app/immutable/assets/realtime.DDCWxn3B.css +1 -0
- package/dist/web/_app/immutable/assets/select.B90KUqR4.css +1 -0
- package/dist/web/_app/immutable/assets/sheet.RF9RBmml.css +1 -0
- package/dist/web/_app/immutable/chunks/22qYtvr82.js +1 -0
- package/dist/web/_app/immutable/chunks/3anKjXOb.js +1 -0
- package/dist/web/_app/immutable/chunks/6S9WOky52.js +1 -0
- package/dist/web/_app/immutable/chunks/7xJ91z7d.js +2 -0
- package/dist/web/_app/immutable/chunks/9K8VREGP.js +1 -0
- package/dist/web/_app/immutable/chunks/B-TGZnCt2.js +1 -0
- package/dist/web/_app/immutable/chunks/B-n5q6ku.js +1 -0
- package/dist/web/_app/immutable/chunks/B0p2fSEV2.js +1 -0
- package/dist/web/_app/immutable/chunks/B2oi87jG.js +2 -0
- package/dist/web/_app/immutable/chunks/B4DG5QOL.js +1 -0
- package/dist/web/_app/immutable/chunks/B6Lt-qaJ.js +1 -0
- package/dist/web/_app/immutable/chunks/B6qeIQZz.js +2 -0
- package/dist/web/_app/immutable/chunks/B9KfEsQw2.js +1 -0
- package/dist/web/_app/immutable/chunks/B9VRF5aH2.js +1 -0
- package/dist/web/_app/immutable/chunks/BCQQzpbj.js +1 -0
- package/dist/web/_app/immutable/chunks/BF0vIqH9.js +1 -0
- package/dist/web/_app/immutable/chunks/BFp1K70l.js +8 -0
- package/dist/web/_app/immutable/chunks/BFr7Funh.js +1 -0
- package/dist/web/_app/immutable/chunks/BFx32D20.js +2 -0
- package/dist/web/_app/immutable/chunks/BLs1h0Rh2.js +1 -0
- package/dist/web/_app/immutable/chunks/BPzV_xOS2.js +1 -0
- package/dist/web/_app/immutable/chunks/BRvMjAzW.js +2 -0
- package/dist/web/_app/immutable/chunks/BV-iCKqa.js +1 -0
- package/dist/web/_app/immutable/chunks/BZi3uKF4.js +1 -0
- package/dist/web/_app/immutable/chunks/B_PyL87x.js +2 -0
- package/dist/web/_app/immutable/chunks/BbfHGU9n2.js +1 -0
- package/dist/web/_app/immutable/chunks/Bbqu2-5G2.js +1 -0
- package/dist/web/_app/immutable/chunks/BdWZJpmv.js +2 -0
- package/dist/web/_app/immutable/chunks/BfnFtsiY.js +1 -0
- package/dist/web/_app/immutable/chunks/BlgjVmFM2.js +14 -0
- package/dist/web/_app/immutable/chunks/BmgXvmIG.js +5 -0
- package/dist/web/_app/immutable/chunks/BpCG9m962.js +1 -0
- package/dist/web/_app/immutable/chunks/BrveeylZ.js +1 -0
- package/dist/web/_app/immutable/chunks/BsW72fyR2.js +1 -0
- package/dist/web/_app/immutable/chunks/Bti_XKwx.js +2692 -0
- package/dist/web/_app/immutable/chunks/BuhW5Fr0.js +689 -0
- package/dist/web/_app/immutable/chunks/Bx74EEyn2.js +1 -0
- package/dist/web/_app/immutable/chunks/BxPN0T61.js +1 -0
- package/dist/web/_app/immutable/chunks/Bxk27YWG.js +1 -0
- package/dist/web/_app/immutable/chunks/Bz9lrgGs.js +1 -0
- package/dist/web/_app/immutable/chunks/BzaxZ6j12.js +1 -0
- package/dist/web/_app/immutable/chunks/C1B4xDs0.js +1 -0
- package/dist/web/_app/immutable/chunks/C1trcC8M.js +7 -0
- package/dist/web/_app/immutable/chunks/C3F_NMTk.js +3 -0
- package/dist/web/_app/immutable/chunks/C4PZmGUQ.js +2 -0
- package/dist/web/_app/immutable/chunks/C6wYiSz8.js +1 -0
- package/dist/web/_app/immutable/chunks/C70saxIl.js +1 -0
- package/dist/web/_app/immutable/chunks/C9tvkk7Y2.js +22 -0
- package/dist/web/_app/immutable/chunks/CE1XZ5DE.js +1 -0
- package/dist/web/_app/immutable/chunks/CEahbtnP.js +1 -0
- package/dist/web/_app/immutable/chunks/CGkd0a-c2.js +2 -0
- package/dist/web/_app/immutable/chunks/CIoNEHQ82.js +184 -0
- package/dist/web/_app/immutable/chunks/CK4z74w5.js +1 -0
- package/dist/web/_app/immutable/chunks/COo3HgCZ.js +1 -0
- package/dist/web/_app/immutable/chunks/CP8_U450.js +1 -0
- package/dist/web/_app/immutable/chunks/CQ1eQ93t2.js +6 -0
- package/dist/web/_app/immutable/chunks/CQyBDccA.js +1 -0
- package/dist/web/_app/immutable/chunks/CUFQMEBn2.js +1 -0
- package/dist/web/_app/immutable/chunks/CV5OSCJc.js +1 -0
- package/dist/web/_app/immutable/chunks/CYEYDNwO2.js +1 -0
- package/dist/web/_app/immutable/chunks/CZgFaimi2.js +83 -0
- package/dist/web/_app/immutable/chunks/CZqvCTCv.js +1 -0
- package/dist/web/_app/immutable/chunks/CcWaWbrI2.js +1 -0
- package/dist/web/_app/immutable/chunks/CdtzRVZK.js +1 -0
- package/dist/web/_app/immutable/chunks/CfYG72Hc.js +1 -0
- package/dist/web/_app/immutable/chunks/Cg-ND0cl.js +1 -0
- package/dist/web/_app/immutable/chunks/Ch1kmm3J2.js +1 -0
- package/dist/web/_app/immutable/chunks/CjiMLTwX2.js +1 -0
- package/dist/web/_app/immutable/chunks/CkoeSJ8K.js +6 -0
- package/dist/web/_app/immutable/chunks/Cp87MaaW.js +1 -0
- package/dist/web/_app/immutable/chunks/Cqm5wAin.js +1 -0
- package/dist/web/_app/immutable/chunks/Ct1uesdW.js +2 -0
- package/dist/web/_app/immutable/chunks/CuYPXpWU.js +1 -0
- package/dist/web/_app/immutable/chunks/Cuq8J2Td.js +1 -0
- package/dist/web/_app/immutable/chunks/CvSEodTA.js +1 -0
- package/dist/web/_app/immutable/chunks/CvqqrTrj.js +1 -0
- package/dist/web/_app/immutable/chunks/CzXdOgVl2.js +7 -0
- package/dist/web/_app/immutable/chunks/D0W7c6Sg.js +185 -0
- package/dist/web/_app/immutable/chunks/D0rBhnqB2.js +1 -0
- package/dist/web/_app/immutable/chunks/D1-GZSN1.js +1 -0
- package/dist/web/_app/immutable/chunks/D1BLcNJ7.js +1 -0
- package/dist/web/_app/immutable/chunks/D1yvtriI.js +1 -0
- package/dist/web/_app/immutable/chunks/D25NMRpl.js +1 -0
- package/dist/web/_app/immutable/chunks/D3F675fu2.js +2 -0
- package/dist/web/_app/immutable/chunks/D4UrtGC1.js +1 -0
- package/dist/web/_app/immutable/chunks/D8wZ2xul.js +4 -0
- package/dist/web/_app/immutable/chunks/DA3HEX3X.js +1 -0
- package/dist/web/_app/immutable/chunks/DE2TCESD2.js +1 -0
- package/dist/web/_app/immutable/chunks/DN-gIRdd2.js +1 -0
- package/dist/web/_app/immutable/chunks/DPUVu0T0.js +1 -0
- package/dist/web/_app/immutable/chunks/DPcejqKZ.js +1 -0
- package/dist/web/_app/immutable/chunks/DQMWa2t7.js +1 -0
- package/dist/web/_app/immutable/chunks/DRPMJ-3M.js +2 -0
- package/dist/web/_app/immutable/chunks/DRPnwQAm.js +1 -0
- package/dist/web/_app/immutable/chunks/DXmfl4Hq2.js +1 -0
- package/dist/web/_app/immutable/chunks/DXsFrDer2.js +1 -0
- package/dist/web/_app/immutable/chunks/DYc5KW3F.js +1 -0
- package/dist/web/_app/immutable/chunks/DcPrzUMJ.js +1 -0
- package/dist/web/_app/immutable/chunks/DdQVGKgM.js +1 -0
- package/dist/web/_app/immutable/chunks/DiFfW--R2.js +2 -0
- package/dist/web/_app/immutable/chunks/DjIqa1_y.js +2 -0
- package/dist/web/_app/immutable/chunks/Dl63IUnH2.js +224 -0
- package/dist/web/_app/immutable/chunks/DmFdD6zT.js +1 -0
- package/dist/web/_app/immutable/chunks/Dn3R8S-U.js +1 -0
- package/dist/web/_app/immutable/chunks/DpNr1GQ2.js +1 -0
- package/dist/web/_app/immutable/chunks/DsFEd8vL2.js +1 -0
- package/dist/web/_app/immutable/chunks/DuxziNnw.js +1 -0
- package/dist/web/_app/immutable/chunks/FuiJnZG0.js +1 -0
- package/dist/web/_app/immutable/chunks/Izkulod7.js +1 -0
- package/dist/web/_app/immutable/chunks/LYL8znYR2.js +23 -0
- package/dist/web/_app/immutable/chunks/ON7Gta0d.js +1 -0
- package/dist/web/_app/immutable/chunks/PhN6tXuJ2.js +1 -0
- package/dist/web/_app/immutable/chunks/PyLyCpuL.js +1 -0
- package/dist/web/_app/immutable/chunks/RG7IUVLn2.js +2 -0
- package/dist/web/_app/immutable/chunks/RK4gCWN0.js +2 -0
- package/dist/web/_app/immutable/chunks/SnzlL4ZV.js +1 -0
- package/dist/web/_app/immutable/chunks/XcWejFm_.js +5 -0
- package/dist/web/_app/immutable/chunks/Xkp5hSA1.js +1 -0
- package/dist/web/_app/immutable/chunks/al_nidE9.js +1 -0
- package/dist/web/_app/immutable/chunks/e50-izZO2.js +1 -0
- package/dist/web/_app/immutable/chunks/golz20La2.js +2 -0
- package/dist/web/_app/immutable/chunks/hG-QCarB.js +1 -0
- package/dist/web/_app/immutable/chunks/kNaey6uv.js +1 -0
- package/dist/web/_app/immutable/chunks/nXReuy-5.js +3 -0
- package/dist/web/_app/immutable/chunks/o61aZZFZ2.js +66 -0
- package/dist/web/_app/immutable/chunks/qwr5boV8.js +1 -0
- package/dist/web/_app/immutable/chunks/rjjyuGhb.js +1 -0
- package/dist/web/_app/immutable/chunks/uBgoVlsx.js +3 -0
- package/dist/web/_app/immutable/chunks/xY0c-UfG.js +3 -0
- package/dist/web/_app/immutable/chunks/xeNvx4Bl2.js +1 -0
- package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/dist/web/_app/immutable/entry/app.dqA31fjy.js +2 -0
- package/dist/web/_app/immutable/entry/start.BB1XrAea.js +1 -0
- package/dist/web/_app/immutable/nodes/0.dALEQAnu.js +2 -0
- package/dist/web/_app/immutable/nodes/1.aFU32Ukj.js +1 -0
- package/dist/web/_app/immutable/nodes/10.C2wB-OnW.js +1 -0
- package/dist/web/_app/immutable/nodes/11.CI3a8Rj5.js +1 -0
- package/dist/web/_app/immutable/nodes/12.CsTvsKzB.js +1 -0
- package/dist/web/_app/immutable/nodes/13.CYrHXCA8.js +1 -0
- package/dist/web/_app/immutable/nodes/14.B31HrQ26.js +1 -0
- package/dist/web/_app/immutable/nodes/15.DxgnZ61h.js +1 -0
- package/dist/web/_app/immutable/nodes/16.DAP8cwVb.js +1 -0
- package/dist/web/_app/immutable/nodes/17.CmwXtCDY.js +77 -0
- package/dist/web/_app/immutable/nodes/2.BuGXEIlN.js +122 -0
- package/dist/web/_app/immutable/nodes/3.CmhZJWHE.js +6 -0
- package/dist/web/_app/immutable/nodes/4.BRfoPTm-.js +11 -0
- package/dist/web/_app/immutable/nodes/5.C7gPuZM_.js +1 -0
- package/dist/web/_app/immutable/nodes/6.qKODVbya.js +6 -0
- package/dist/web/_app/immutable/nodes/7.BZO37zAJ.js +1 -0
- package/dist/web/_app/immutable/nodes/8.xF_Dd1BO.js +1 -0
- package/dist/web/_app/immutable/nodes/9.Bow4UyKV.js +1 -0
- package/dist/web/_app/version.json +1 -1
- package/dist/web/favicon-16.png +0 -0
- package/dist/web/favicon-180.png +0 -0
- package/dist/web/favicon-32.png +0 -0
- package/dist/web/favicon-48.png +0 -0
- package/dist/web/favicon-512.png +0 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/favicon.svg +8 -0
- package/dist/web/index.html +56 -21
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +35 -14
- package/dist/agent/skills/enrich-entities.md +0 -136
- package/dist/agent/skills/sync-configuration.md +0 -119
- package/dist/agent/skills/sync-setup.md +0 -82
- package/dist/agent/tools/message-tools.d.ts +0 -42
- package/dist/agent/tools/message-tools.js +0 -106
- package/dist/agent/tools/message-tools.js.map +0 -1
- package/dist/cli/commands/app.d.ts +0 -7
- package/dist/cli/commands/app.js +0 -268
- package/dist/cli/commands/app.js.map +0 -1
- package/dist/cli/commands/clear.d.ts +0 -5
- package/dist/cli/commands/clear.js +0 -36
- package/dist/cli/commands/clear.js.map +0 -1
- package/dist/cli/commands/collection.d.ts +0 -10
- package/dist/cli/commands/collection.js.map +0 -1
- package/dist/cli/commands/join.d.ts +0 -9
- package/dist/cli/commands/join.js +0 -255
- package/dist/cli/commands/join.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -7
- package/dist/cli/commands/start.js +0 -584
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -8
- package/dist/cli/commands/update.js +0 -155
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/user.d.ts +0 -7
- package/dist/cli/commands/user.js +0 -175
- package/dist/cli/commands/user.js.map +0 -1
- package/dist/cli/scaffolding.d.ts +0 -12
- package/dist/cli/scaffolding.js +0 -397
- package/dist/cli/scaffolding.js.map +0 -1
- package/dist/integrations/registry.d.ts +0 -8
- package/dist/integrations/registry.js +0 -7
- package/dist/integrations/registry.js.map +0 -1
- package/dist/integrations/types.d.ts +0 -43
- package/dist/integrations/types.js +0 -5
- package/dist/integrations/types.js.map +0 -1
- package/dist/lib/lib/utils.d.ts +0 -2
- package/dist/lib/lib/utils.js +0 -6
- package/dist/lib/lib/utils.js.map +0 -1
- package/dist/server/chrome/chrome.css +0 -691
- package/dist/server/chrome/chrome.js +0 -374
- package/dist/server/commit-scheduler.d.ts +0 -39
- package/dist/server/commit-scheduler.js +0 -113
- package/dist/server/commit-scheduler.js.map +0 -1
- package/dist/server/plugin-loader.d.ts +0 -53
- package/dist/server/plugin-loader.js +0 -155
- package/dist/server/plugin-loader.js.map +0 -1
- package/dist/server/routes/meeting-ingest-api.d.ts +0 -14
- package/dist/server/routes/meeting-ingest-api.js.map +0 -1
- package/dist/server/routes/messages-api.d.ts +0 -15
- package/dist/server/routes/messages-api.js +0 -385
- package/dist/server/routes/messages-api.js.map +0 -1
- package/dist/services/batch-processor.d.ts +0 -49
- package/dist/services/batch-processor.js +0 -166
- package/dist/services/batch-processor.js.map +0 -1
- package/dist/services/briefing.d.ts +0 -26
- package/dist/services/briefing.js +0 -230
- package/dist/services/briefing.js.map +0 -1
- package/dist/services/heartbeat.d.ts +0 -28
- package/dist/services/heartbeat.js +0 -183
- package/dist/services/heartbeat.js.map +0 -1
- package/dist/services/image-import-service.d.ts +0 -24
- package/dist/services/image-import-service.js +0 -108
- package/dist/services/image-import-service.js.map +0 -1
- package/dist/services/insights.d.ts +0 -38
- package/dist/services/insights.js +0 -269
- package/dist/services/insights.js.map +0 -1
- package/dist/services/meeting-processor.js.map +0 -1
- package/dist/services/message-service.d.ts +0 -68
- package/dist/services/message-service.js +0 -220
- package/dist/services/message-service.js.map +0 -1
- package/dist/utils/workspace-config.d.ts +0 -8
- package/dist/utils/workspace-config.js +0 -22
- package/dist/utils/workspace-config.js.map +0 -1
- package/dist/web/_app/immutable/assets/0.uPSqtsC5.css +0 -1
- package/dist/web/_app/immutable/assets/11.2jzI3cZY.css +0 -1
- package/dist/web/_app/immutable/assets/12.CT4xL4K3.css +0 -1
- package/dist/web/_app/immutable/assets/13.BUrHkYry.css +0 -1
- package/dist/web/_app/immutable/assets/2.DpQWr6q6.css +0 -1
- package/dist/web/_app/immutable/assets/3.BxdqT7zi.css +0 -1
- package/dist/web/_app/immutable/assets/4.DdNqjd0T.css +0 -1
- package/dist/web/_app/immutable/assets/5.DFeGxLYf.css +0 -1
- package/dist/web/_app/immutable/assets/6.DXZr_rI_.css +0 -1
- package/dist/web/_app/immutable/assets/GraphView.D9ePpZez.css +0 -1
- package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
- package/dist/web/_app/immutable/assets/ViewToolbar.BWE03S64.css +0 -1
- package/dist/web/_app/immutable/assets/WorkspaceView.CgGDi_Zb.css +0 -1
- package/dist/web/_app/immutable/assets/wikilinks.CzMBkUMB.css +0 -1
- package/dist/web/_app/immutable/chunks/-jG4Obyh.js +0 -4
- package/dist/web/_app/immutable/chunks/2nrc8f_O.js +0 -1
- package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
- package/dist/web/_app/immutable/chunks/8Q3ZJIYu.js +0 -1
- package/dist/web/_app/immutable/chunks/B8ydT5xX.js +0 -2
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
- package/dist/web/_app/immutable/chunks/BEn6N5c2.js +0 -1
- package/dist/web/_app/immutable/chunks/BFNNbCAM.js +0 -1
- package/dist/web/_app/immutable/chunks/BFZZEUd5.js +0 -1
- package/dist/web/_app/immutable/chunks/BGk8kfOE.js +0 -2
- package/dist/web/_app/immutable/chunks/BIBCr278.js +0 -1
- package/dist/web/_app/immutable/chunks/BPCkkwqe.js +0 -1
- package/dist/web/_app/immutable/chunks/BhlvzGQx.js +0 -1
- package/dist/web/_app/immutable/chunks/BlMknQeF.js +0 -1
- package/dist/web/_app/immutable/chunks/BpjqrlCg.js +0 -1
- package/dist/web/_app/immutable/chunks/BrebtJNG.js +0 -18
- package/dist/web/_app/immutable/chunks/ByBZ7JIT.js +0 -1
- package/dist/web/_app/immutable/chunks/Bz0ZjVQE.js +0 -2
- package/dist/web/_app/immutable/chunks/BzJTZOK2.js +0 -1
- package/dist/web/_app/immutable/chunks/C0LVZhvn.js +0 -1
- package/dist/web/_app/immutable/chunks/C3uBrOS5.js +0 -1
- package/dist/web/_app/immutable/chunks/C8R1sDpW.js +0 -1
- package/dist/web/_app/immutable/chunks/CDRHrs0g.js +0 -1
- package/dist/web/_app/immutable/chunks/CN5_py1I.js +0 -1
- package/dist/web/_app/immutable/chunks/CPne482a.js +0 -1
- package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
- package/dist/web/_app/immutable/chunks/CWyU-seV.js +0 -1
- package/dist/web/_app/immutable/chunks/CX_61fY8.js +0 -5
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +0 -1
- package/dist/web/_app/immutable/chunks/ChsiIm-E.js +0 -1
- package/dist/web/_app/immutable/chunks/CojKppbh.js +0 -1
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
- package/dist/web/_app/immutable/chunks/CtYLtD7K.js +0 -1
- package/dist/web/_app/immutable/chunks/D-HDy5qS.js +0 -1
- package/dist/web/_app/immutable/chunks/D5aIYSkd.js +0 -1
- package/dist/web/_app/immutable/chunks/DBBXARVf.js +0 -1
- package/dist/web/_app/immutable/chunks/DFYOFE3o.js +0 -1
- package/dist/web/_app/immutable/chunks/DKaafS50.js +0 -1
- package/dist/web/_app/immutable/chunks/DUMOo1Pn.js +0 -1
- package/dist/web/_app/immutable/chunks/DWX9f6AF.js +0 -1
- package/dist/web/_app/immutable/chunks/DY8-EONP.js +0 -1
- package/dist/web/_app/immutable/chunks/DkoHPElM.js +0 -1
- package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
- package/dist/web/_app/immutable/chunks/DsnmJJEf.js +0 -1
- package/dist/web/_app/immutable/chunks/DujahU3W.js +0 -1
- package/dist/web/_app/immutable/chunks/FBn-ES5k.js +0 -1
- package/dist/web/_app/immutable/chunks/HQpwSOb3.js +0 -1
- package/dist/web/_app/immutable/chunks/KyjzlWRN.js +0 -2
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
- package/dist/web/_app/immutable/chunks/UwYfmrPx.js +0 -2
- package/dist/web/_app/immutable/chunks/W25ZVI8L.js +0 -2
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
- package/dist/web/_app/immutable/chunks/XjsuEnNE.js +0 -5
- package/dist/web/_app/immutable/chunks/ZD6ARAtb.js +0 -1
- package/dist/web/_app/immutable/chunks/pBTf4stg.js +0 -2
- package/dist/web/_app/immutable/chunks/rGIarcnp.js +0 -1
- package/dist/web/_app/immutable/chunks/vxEtkL8z.js +0 -1
- package/dist/web/_app/immutable/chunks/wDIGUaoU.js +0 -3
- package/dist/web/_app/immutable/entry/app.ZHiTM8WS.js +0 -2
- package/dist/web/_app/immutable/entry/start.C9-FfAVc.js +0 -1
- package/dist/web/_app/immutable/nodes/0.D92Orz8k.js +0 -2
- package/dist/web/_app/immutable/nodes/1.BMdyglM_.js +0 -1
- package/dist/web/_app/immutable/nodes/10.BilVDHSL.js +0 -1
- package/dist/web/_app/immutable/nodes/11.CS9E0Hic.js +0 -1
- package/dist/web/_app/immutable/nodes/12.D3BOxYzG.js +0 -1
- package/dist/web/_app/immutable/nodes/13.CClMKYtN.js +0 -1
- package/dist/web/_app/immutable/nodes/2.C8KKElPL.js +0 -267
- package/dist/web/_app/immutable/nodes/3.C5n5uiWU.js +0 -5
- package/dist/web/_app/immutable/nodes/4.DcGVvgiL.js +0 -11
- package/dist/web/_app/immutable/nodes/5.DxIjnFQO.js +0 -4
- package/dist/web/_app/immutable/nodes/6.lkh6kKLj.js +0 -1
- package/dist/web/_app/immutable/nodes/7.Bg7SbfhA.js +0 -1
- package/dist/web/_app/immutable/nodes/8.DcXWCNBE.js +0 -1
- package/dist/web/_app/immutable/nodes/9.Cefi8Jfm.js +0 -1
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared repo-asset listing.
|
|
3
|
+
*
|
|
4
|
+
* Builds the list of assets owned by entries in a single repo, merging the two
|
|
5
|
+
* storage schemes (legacy `{type}/{id}/{filename}` blobs surfaced by the
|
|
6
|
+
* backend's listAll, and immutable-keyed assets tracked only in the ownership
|
|
7
|
+
* index). Extracted from the asset-api route so the HTTP endpoints and the MCP
|
|
8
|
+
* `list_assets` tool return an identical shape — including a render-safe
|
|
9
|
+
* `embed` string callers can paste straight into an entry body.
|
|
10
|
+
*/
|
|
11
|
+
import { publicUrlFor, publicUrlForAssetId } from './assets/index.js';
|
|
12
|
+
import { assetEmbed } from '../core/embeds.js';
|
|
13
|
+
import { readFileSync } from 'fs';
|
|
14
|
+
/** Owner kinds that mean "free-standing" — the asset is owned by a folder or
|
|
15
|
+
* the workspace, not by an entity, so it has no owning markdown file and is
|
|
16
|
+
* deleted/managed by its assetId rather than an entity coordinate. */
|
|
17
|
+
export const FREE_STANDING_OWNER_TYPES = new Set(['folder', 'workspace']);
|
|
18
|
+
export function isFreeStandingOwner(ownerType) {
|
|
19
|
+
return FREE_STANDING_OWNER_TYPES.has(ownerType);
|
|
20
|
+
}
|
|
21
|
+
/** Map an immutable-index row → RepoAsset, shared by the per-repo and
|
|
22
|
+
* workspace-wide listings (both merge index rows the same way). `meta` is the
|
|
23
|
+
* owning entity's resolved name/createdAt (null for free-standing rows, which
|
|
24
|
+
* have no owning entity). Free-standing rows label by the asset's own name. */
|
|
25
|
+
function indexRowToRepoAsset(row, meta) {
|
|
26
|
+
const freeStanding = isFreeStandingOwner(row.ownerType);
|
|
27
|
+
const url = publicUrlForAssetId(row.assetId, row.filename);
|
|
28
|
+
return {
|
|
29
|
+
filename: row.filename,
|
|
30
|
+
// Real byte size lives in the index (`size` column, recorded at upload);
|
|
31
|
+
// fall back to 0 for legacy rows written before the column existed.
|
|
32
|
+
size: row.size ?? 0,
|
|
33
|
+
contentType: row.contentType,
|
|
34
|
+
url,
|
|
35
|
+
embed: assetEmbed(row.filename, url),
|
|
36
|
+
assetId: row.assetId,
|
|
37
|
+
ownerType: row.ownerType,
|
|
38
|
+
entityType: row.ownerType,
|
|
39
|
+
entityId: row.ownerId,
|
|
40
|
+
// Free-standing: the asset's own name (or filename). Entity-owned: the
|
|
41
|
+
// owning entity's name, falling back to its id.
|
|
42
|
+
entityName: freeStanding ? (row.name ?? row.filename) : (meta.name ?? row.ownerId),
|
|
43
|
+
mediaType: row.mediaType,
|
|
44
|
+
// Prefer the entity's created_at for a meaningful "created" date; fall back
|
|
45
|
+
// to the index row's own timestamp when the entity has none.
|
|
46
|
+
createdAt: meta.createdAt ?? row.createdAt ?? null,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Read the owning entity's `name:` and `created_at:` from a markdown file's
|
|
51
|
+
* YAML frontmatter without a full YAML parse. Lets the asset list label assets
|
|
52
|
+
* by entity name and sort by creation date without a markdownService.parseFile()
|
|
53
|
+
* per entity. Either field may be null if absent.
|
|
54
|
+
*/
|
|
55
|
+
function matchScalar(block, field) {
|
|
56
|
+
const m = block.match(new RegExp(`^${field}:\\s*(?:'([^']*)'|"([^"]*)"|(.+?))\\s*$`, 'm'));
|
|
57
|
+
if (!m)
|
|
58
|
+
return null;
|
|
59
|
+
return (m[1] ?? m[2] ?? m[3]).trim() || null;
|
|
60
|
+
}
|
|
61
|
+
function extractEntityMeta(mdPath) {
|
|
62
|
+
try {
|
|
63
|
+
const raw = readFileSync(mdPath, 'utf-8');
|
|
64
|
+
// Frontmatter is always at the top; don't read past ~2KB.
|
|
65
|
+
const head = raw.slice(0, 2048);
|
|
66
|
+
if (!head.startsWith('---'))
|
|
67
|
+
return { name: null, createdAt: null };
|
|
68
|
+
const end = head.indexOf('\n---', 3);
|
|
69
|
+
const block = end === -1 ? head : head.slice(0, end);
|
|
70
|
+
return { name: matchScalar(block, 'name'), createdAt: matchScalar(block, 'created_at') };
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return { name: null, createdAt: null };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Build the asset list for a single repo. Returns [] if the repo's graph can't
|
|
78
|
+
* be loaded (right for the bulk endpoint; single-repo callers should check
|
|
79
|
+
* repo existence themselves first if they want a 404).
|
|
80
|
+
*
|
|
81
|
+
* Algorithm (works for both local and R2 backends):
|
|
82
|
+
* 1. One listAllAssets() call — single filesystem walk or one paginated S3
|
|
83
|
+
* ListObjectsV2 request. No HEAD round-trips, no markdown parsing.
|
|
84
|
+
* 2. Resolve each asset's entity markdown path via the graph's file index
|
|
85
|
+
* (not a `{plural}/{id}.md` guess, which misses root/nested entries).
|
|
86
|
+
* 3. Merge in immutable-keyed assets from the ownership index — these live
|
|
87
|
+
* under an `{assetId}/` prefix the backend's listAll can't see.
|
|
88
|
+
*/
|
|
89
|
+
export async function listRepoAssets(repo, workspaceManager) {
|
|
90
|
+
let graph;
|
|
91
|
+
try {
|
|
92
|
+
graph = workspaceManager.getGraph(repo);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
let allAssets;
|
|
98
|
+
try {
|
|
99
|
+
allAssets = await graph.listAllAssets();
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
const metaCache = new Map();
|
|
105
|
+
const result = [];
|
|
106
|
+
for (const asset of allAssets) {
|
|
107
|
+
const mdPath = graph.getEntityFilePath(asset.entityType, asset.entityId);
|
|
108
|
+
if (!mdPath)
|
|
109
|
+
continue;
|
|
110
|
+
const key = `${asset.entityType}/${asset.entityId}`;
|
|
111
|
+
let meta = metaCache.get(key);
|
|
112
|
+
if (meta === undefined) {
|
|
113
|
+
meta = extractEntityMeta(mdPath);
|
|
114
|
+
metaCache.set(key, meta);
|
|
115
|
+
}
|
|
116
|
+
const url = publicUrlFor(asset, asset.entityType, asset.entityId);
|
|
117
|
+
result.push({
|
|
118
|
+
filename: asset.filename,
|
|
119
|
+
size: asset.size,
|
|
120
|
+
contentType: asset.contentType,
|
|
121
|
+
url,
|
|
122
|
+
embed: assetEmbed(asset.filename, url),
|
|
123
|
+
assetId: null,
|
|
124
|
+
ownerType: asset.entityType,
|
|
125
|
+
entityType: asset.entityType,
|
|
126
|
+
entityId: asset.entityId,
|
|
127
|
+
entityName: meta.name ?? asset.entityId,
|
|
128
|
+
mediaType: asset.mediaType,
|
|
129
|
+
createdAt: meta.createdAt,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// Immutable-keyed assets live in the ownership index, not under a
|
|
133
|
+
// {type}/{id} key prefix, so backend.listAll() can't see them. Merge them in
|
|
134
|
+
// from assets.db. (During the migration cutover — after migrate, before
|
|
135
|
+
// old-blob cleanup — an asset can appear via both paths; that transient
|
|
136
|
+
// duplicate clears when the legacy blobs are deleted.)
|
|
137
|
+
const index = workspaceManager.getAssetIndex?.();
|
|
138
|
+
if (index) {
|
|
139
|
+
for (const row of index.listByRepo(repo)) {
|
|
140
|
+
// Free-standing assets (owned by a folder/workspace, not an entity) have
|
|
141
|
+
// no owning markdown file: don't resolve one, and label them by the
|
|
142
|
+
// asset's own name rather than a non-existent owning entity.
|
|
143
|
+
const freeStanding = isFreeStandingOwner(row.ownerType);
|
|
144
|
+
const mdPath = freeStanding
|
|
145
|
+
? null
|
|
146
|
+
: graph.getEntityFilePath(row.ownerType, row.ownerId);
|
|
147
|
+
const key = `${row.ownerType}/${row.ownerId}`;
|
|
148
|
+
let meta = metaCache.get(key);
|
|
149
|
+
if (meta === undefined) {
|
|
150
|
+
meta = mdPath ? extractEntityMeta(mdPath) : { name: null, createdAt: null };
|
|
151
|
+
metaCache.set(key, meta);
|
|
152
|
+
}
|
|
153
|
+
result.push(indexRowToRepoAsset(row, meta));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Process-lifetime cache of the one slow R2/bucket walk.
|
|
160
|
+
*
|
|
161
|
+
* Transitional bridge, NOT permanent infrastructure. The asset backend is
|
|
162
|
+
* workspace-global and `listAllAssets()` enumerates the WHOLE bucket via
|
|
163
|
+
* sequential paginated `ListObjectsV2` — on a large bucket that's several
|
|
164
|
+
* network round-trips (measured ~7-8s here), and it's the entire reason the
|
|
165
|
+
* asset-manager cold load was slow. The manager is now driven from the LOCAL
|
|
166
|
+
* ownership index (`assets.db`, ~14ms); this walk exists only to also surface
|
|
167
|
+
* un-migrated *legacy* blobs (`{type}/{id}/{filename}`) that predate the
|
|
168
|
+
* immutable-key scheme and so have no index row.
|
|
169
|
+
*
|
|
170
|
+
* New uploads are always immutable-keyed (they get an index row), so the set of
|
|
171
|
+
* legacy blobs can only SHRINK — it never grows. That makes a once-per-process
|
|
172
|
+
* cache correct: re-walking gains nothing. When the separate legacy-blob
|
|
173
|
+
* cleanup finishes, the walk returns no stragglers and this code path becomes
|
|
174
|
+
* an inert no-op that can be deleted outright. `clearLegacyBucketCache()` exists
|
|
175
|
+
* for tests and for an explicit refresh after a bulk cleanup.
|
|
176
|
+
*/
|
|
177
|
+
// Keyed by workspace path so a multi-workspace process never crosses snapshots.
|
|
178
|
+
// Only SUCCESSFUL walks are cached — a transient backend/list failure must retry
|
|
179
|
+
// on the next call, not hide every legacy asset until restart (codex P2).
|
|
180
|
+
const legacyBucketCache = new Map();
|
|
181
|
+
/** Drop the cached legacy-bucket walk(s) (tests; post-delete/cleanup refresh). */
|
|
182
|
+
export function clearLegacyBucketCache() {
|
|
183
|
+
legacyBucketCache.clear();
|
|
184
|
+
}
|
|
185
|
+
async function getLegacyBucketSnapshot(workspaceKey, graph) {
|
|
186
|
+
const cached = legacyBucketCache.get(workspaceKey);
|
|
187
|
+
if (cached)
|
|
188
|
+
return cached;
|
|
189
|
+
let assets;
|
|
190
|
+
try {
|
|
191
|
+
assets = await graph.listAllAssets();
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return [];
|
|
195
|
+
} // transient/no-backend — return empty WITHOUT caching so the next call retries
|
|
196
|
+
legacyBucketCache.set(workspaceKey, assets); // cache only on success (an empty bucket is a valid success)
|
|
197
|
+
return assets;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* List assets across MANY repos for the workspace-wide manager — index-first.
|
|
201
|
+
*
|
|
202
|
+
* The fast path is the local ownership index (`assets.db`): one cheap scan per
|
|
203
|
+
* repo yields every immutable-keyed asset with no network I/O. On top of that we
|
|
204
|
+
* fold in any surviving *legacy* blobs via the cached bucket walk above (see
|
|
205
|
+
* `getLegacyBucketSnapshot`) so un-migrated assets still appear. Dedup prefers
|
|
206
|
+
* the immutable entry, so a legacy blob that has already been migrated collapses
|
|
207
|
+
* into its index row rather than double-listing.
|
|
208
|
+
*
|
|
209
|
+
* A legacy blob whose owning entity exists in K accessible repos surfaces under
|
|
210
|
+
* each of those K (entity ids can — rarely — collide across folders), matching
|
|
211
|
+
* the old per-repo behaviour.
|
|
212
|
+
*/
|
|
213
|
+
export async function listWorkspaceAssets(repos, workspaceManager) {
|
|
214
|
+
// Resolve each repo's graph once; skip repos whose graph can't be loaded
|
|
215
|
+
// (matches listRepoAssets' fail-soft posture for the bulk path).
|
|
216
|
+
const graphs = new Map();
|
|
217
|
+
for (const repo of repos) {
|
|
218
|
+
try {
|
|
219
|
+
graphs.set(repo, workspaceManager.getGraph(repo));
|
|
220
|
+
}
|
|
221
|
+
catch { /* unreadable repo — omit */ }
|
|
222
|
+
}
|
|
223
|
+
if (graphs.size === 0)
|
|
224
|
+
return [];
|
|
225
|
+
// Frontmatter (name + created_at) read at most once per (repo,type,id).
|
|
226
|
+
const metaCache = new Map();
|
|
227
|
+
const metaFor = (repo, graph, type, id) => {
|
|
228
|
+
const key = `${repo}/${type}/${id}`;
|
|
229
|
+
let meta = metaCache.get(key);
|
|
230
|
+
if (meta === undefined) {
|
|
231
|
+
const mdPath = graph.getEntityFilePath(type, id);
|
|
232
|
+
meta = mdPath ? extractEntityMeta(mdPath) : { name: null, createdAt: null };
|
|
233
|
+
metaCache.set(key, meta);
|
|
234
|
+
}
|
|
235
|
+
return meta;
|
|
236
|
+
};
|
|
237
|
+
// Dedup per repo, preferring the immutable-index entry.
|
|
238
|
+
const byKey = new Map();
|
|
239
|
+
const add = (repo, asset) => {
|
|
240
|
+
const key = `${repo}/${asset.entityType}/${asset.entityId}/${asset.filename}`;
|
|
241
|
+
const existing = byKey.get(key);
|
|
242
|
+
if (!existing || (existing.assetId == null && asset.assetId != null))
|
|
243
|
+
byKey.set(key, asset);
|
|
244
|
+
};
|
|
245
|
+
// ── Pass 1 (fast path): immutable-keyed assets from the local ownership
|
|
246
|
+
// index, per repo. No network I/O. Added first so dedup prefers them. ──
|
|
247
|
+
const index = workspaceManager.getAssetIndex?.();
|
|
248
|
+
if (index) {
|
|
249
|
+
for (const [repo, graph] of graphs) {
|
|
250
|
+
for (const row of index.listByRepo(repo)) {
|
|
251
|
+
// Free-standing assets (folder/workspace-owned) have no owning entity —
|
|
252
|
+
// skip entity-meta resolution; the shared mapper labels them by name.
|
|
253
|
+
const meta = isFreeStandingOwner(row.ownerType)
|
|
254
|
+
? { name: null, createdAt: null }
|
|
255
|
+
: metaFor(repo, graph, row.ownerType, row.ownerId);
|
|
256
|
+
add(repo, { ...indexRowToRepoAsset(row, meta), repo });
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// ── Pass 2 (transitional): surviving legacy {type}/{id}/{filename} blobs ──
|
|
261
|
+
// from the cached bucket snapshot. Already-migrated blobs collapse into the
|
|
262
|
+
// Pass-1 index entry; only un-migrated stragglers survive `add()`.
|
|
263
|
+
const anyGraph = graphs.values().next().value;
|
|
264
|
+
const bucket = await getLegacyBucketSnapshot(workspaceManager.getWorkspacePath(), anyGraph);
|
|
265
|
+
if (bucket.length > 0) {
|
|
266
|
+
// FAIL CLOSED on ambiguous legacy blobs (codex P1). A legacy key is
|
|
267
|
+
// {type}/{id}/{filename} with NO repo identity, so a blob whose (type/id)
|
|
268
|
+
// exists in more than one repo can't be safely attributed — surfacing it
|
|
269
|
+
// under an accessible repo would leak an inaccessible folder's blob when a
|
|
270
|
+
// slug collides (e.g. a private folder's `note/foo` vs an accessible
|
|
271
|
+
// `note/foo`). Build ownership across ALL repos (incl. inaccessible) and
|
|
272
|
+
// only surface a blob when EXACTLY ONE repo owns its (type/id) AND that
|
|
273
|
+
// repo is accessible. Immutable assets (Pass 1) are unaffected — they carry
|
|
274
|
+
// their owning repo in the index.
|
|
275
|
+
const accessibleSet = new Set(graphs.keys());
|
|
276
|
+
const allOwners = new Map();
|
|
277
|
+
for (const cfg of workspaceManager.getAllRepoConfigs()) {
|
|
278
|
+
let g;
|
|
279
|
+
try {
|
|
280
|
+
g = workspaceManager.getGraph(cfg.name);
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
for (const { entityType, id } of g.listEntityIds()) {
|
|
286
|
+
const k = `${entityType}/${id}`;
|
|
287
|
+
let set = allOwners.get(k);
|
|
288
|
+
if (!set)
|
|
289
|
+
allOwners.set(k, (set = new Set()));
|
|
290
|
+
set.add(cfg.name);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
for (const asset of bucket) {
|
|
294
|
+
const owners = allOwners.get(`${asset.entityType}/${asset.entityId}`);
|
|
295
|
+
if (!owners || owners.size !== 1)
|
|
296
|
+
continue; // unknown or ambiguous → fail closed
|
|
297
|
+
const repo = owners.values().next().value;
|
|
298
|
+
if (!accessibleSet.has(repo))
|
|
299
|
+
continue; // sole owner is an inaccessible folder
|
|
300
|
+
const meta = metaFor(repo, graphs.get(repo), asset.entityType, asset.entityId);
|
|
301
|
+
const url = publicUrlFor(asset, asset.entityType, asset.entityId);
|
|
302
|
+
add(repo, {
|
|
303
|
+
filename: asset.filename,
|
|
304
|
+
size: asset.size,
|
|
305
|
+
contentType: asset.contentType,
|
|
306
|
+
url,
|
|
307
|
+
embed: assetEmbed(asset.filename, url),
|
|
308
|
+
assetId: null,
|
|
309
|
+
ownerType: asset.entityType,
|
|
310
|
+
entityType: asset.entityType,
|
|
311
|
+
entityId: asset.entityId,
|
|
312
|
+
entityName: meta.name ?? asset.entityId,
|
|
313
|
+
mediaType: asset.mediaType,
|
|
314
|
+
createdAt: meta.createdAt,
|
|
315
|
+
repo,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return [...byKey.values()];
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=asset-listing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-listing.js","sourceRoot":"","sources":["../../src/services/asset-listing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP pre-signed asset upload — STEP 1 of 3.
|
|
3
|
+
*
|
|
4
|
+
* Validates the request, resolves the target folder, signs a PUT URL the
|
|
5
|
+
* agent uploads to directly, and mints an HMAC token the agent later passes
|
|
6
|
+
* back to `finalizeAssetUpload`. Bytes never traverse the model context.
|
|
7
|
+
*
|
|
8
|
+
* Authz: `canWriteRepo` on the resolved repo. For the default-home case
|
|
9
|
+
* (`input.repo` omitted) this lands on the workspace_wide Assets store,
|
|
10
|
+
* which grants write to any authed user. Finalize re-checks `canWriteRepo`
|
|
11
|
+
* because a 15-min token outlives a folder-access revoke.
|
|
12
|
+
*
|
|
13
|
+
* Mime + filename are pinned at presign:
|
|
14
|
+
* - mime: only registry presign-safe raw assets pass (raster images and
|
|
15
|
+
* font files — `presignMimeAllowlist()`). SVG is excluded because it carries
|
|
16
|
+
* `sanitize: 'svg'` and the app never holds the bytes on this path, so it
|
|
17
|
+
* can't sanitize (V2 — SVG goes through the inline-bytes tool). The chosen
|
|
18
|
+
* mime is pinned into the PUT signature so the agent must send a matching
|
|
19
|
+
* Content-Type header or R2 rejects with SignatureDoesNotMatch — the
|
|
20
|
+
* wire-level guarantee behind "no SVG polyglots."
|
|
21
|
+
* - filename: validateFilename() (path-traversal / hidden / forbidden /
|
|
22
|
+
* length cap) → safeFilename() (key-segment safety). Both shared with
|
|
23
|
+
* the in-process upload path via services/assets/base.ts.
|
|
24
|
+
*
|
|
25
|
+
* See ~/.claude/plans/mcp-presigned-asset-upload.md.
|
|
26
|
+
*/
|
|
27
|
+
import type { WorkspaceManager } from '../core/workspace-manager.js';
|
|
28
|
+
import type { AuthService, AuthUser } from './auth-service.js';
|
|
29
|
+
/**
|
|
30
|
+
* MIME types accepted by the presign path. Historically `'image/png' |
|
|
31
|
+
* 'image/jpeg'`; now whatever the format registry declares presign-safe
|
|
32
|
+
* (`presignMimeAllowlist()`). Kept as `string` at the type level because the
|
|
33
|
+
* authoritative gate is the runtime allowlist check below — the registry is the
|
|
34
|
+
* single source of truth, not a hand-maintained union that would drift from it.
|
|
35
|
+
*/
|
|
36
|
+
export type AssetPresignMime = string;
|
|
37
|
+
export interface PresignAssetInput {
|
|
38
|
+
workspaceManager: WorkspaceManager;
|
|
39
|
+
authService: AuthService;
|
|
40
|
+
user: AuthUser;
|
|
41
|
+
/** Target repo. Omit → default to the workspace_wide Assets store
|
|
42
|
+
* (resolved lazily, created on first use). */
|
|
43
|
+
repo?: string;
|
|
44
|
+
/** Owning entity. Omit → asset is self-owned: ownerType='asset',
|
|
45
|
+
* ownerId=assetId. */
|
|
46
|
+
entity?: {
|
|
47
|
+
type: string;
|
|
48
|
+
id: string;
|
|
49
|
+
};
|
|
50
|
+
filename: string;
|
|
51
|
+
mimeType: AssetPresignMime;
|
|
52
|
+
}
|
|
53
|
+
export interface PresignAssetOutput {
|
|
54
|
+
assetId: string;
|
|
55
|
+
/** Pre-signed PUT URL. Bytes go directly here; the app server never sees
|
|
56
|
+
* them. Expires in 15 min. */
|
|
57
|
+
uploadUrl: string;
|
|
58
|
+
/** Headers the agent must set verbatim on the PUT (notably Content-Type
|
|
59
|
+
* which is pinned into the signature). */
|
|
60
|
+
headers: Record<string, string>;
|
|
61
|
+
/** HMAC token the agent passes to finalize_asset_upload. */
|
|
62
|
+
token: string;
|
|
63
|
+
/** ISO timestamp the upload URL + token expire at. */
|
|
64
|
+
expiresAt: string;
|
|
65
|
+
/** Resolved target repo (useful for the MCP tool description / debugging). */
|
|
66
|
+
repo: string;
|
|
67
|
+
}
|
|
68
|
+
export declare function presignAssetUpload(input: PresignAssetInput): Promise<PresignAssetOutput>;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP pre-signed asset upload — STEP 1 of 3.
|
|
3
|
+
*
|
|
4
|
+
* Validates the request, resolves the target folder, signs a PUT URL the
|
|
5
|
+
* agent uploads to directly, and mints an HMAC token the agent later passes
|
|
6
|
+
* back to `finalizeAssetUpload`. Bytes never traverse the model context.
|
|
7
|
+
*
|
|
8
|
+
* Authz: `canWriteRepo` on the resolved repo. For the default-home case
|
|
9
|
+
* (`input.repo` omitted) this lands on the workspace_wide Assets store,
|
|
10
|
+
* which grants write to any authed user. Finalize re-checks `canWriteRepo`
|
|
11
|
+
* because a 15-min token outlives a folder-access revoke.
|
|
12
|
+
*
|
|
13
|
+
* Mime + filename are pinned at presign:
|
|
14
|
+
* - mime: only registry presign-safe raw assets pass (raster images and
|
|
15
|
+
* font files — `presignMimeAllowlist()`). SVG is excluded because it carries
|
|
16
|
+
* `sanitize: 'svg'` and the app never holds the bytes on this path, so it
|
|
17
|
+
* can't sanitize (V2 — SVG goes through the inline-bytes tool). The chosen
|
|
18
|
+
* mime is pinned into the PUT signature so the agent must send a matching
|
|
19
|
+
* Content-Type header or R2 rejects with SignatureDoesNotMatch — the
|
|
20
|
+
* wire-level guarantee behind "no SVG polyglots."
|
|
21
|
+
* - filename: validateFilename() (path-traversal / hidden / forbidden /
|
|
22
|
+
* length cap) → safeFilename() (key-segment safety). Both shared with
|
|
23
|
+
* the in-process upload path via services/assets/base.ts.
|
|
24
|
+
*
|
|
25
|
+
* See ~/.claude/plans/mcp-presigned-asset-upload.md.
|
|
26
|
+
*/
|
|
27
|
+
import { randomUUID } from 'node:crypto';
|
|
28
|
+
import { Workspace } from '../core/workspace.js';
|
|
29
|
+
import { canWriteRepo } from './access-control.js';
|
|
30
|
+
import { resolveWorkspaceAssetsRepo } from './workspace-assets-folder.js';
|
|
31
|
+
import { validateFilename, safeFilename } from './assets/base.js';
|
|
32
|
+
import { presignMimeAllowlist, resolveFormat } from '../core/format-registry.js';
|
|
33
|
+
import { signAssetUploadToken } from './asset-upload-token.js';
|
|
34
|
+
import { ForbiddenError, InvalidFilenameError, InvalidMimeTypeError, LocalBackendNotSupportedError, } from './asset-upload-errors.js';
|
|
35
|
+
import { log } from '../utils/log.js';
|
|
36
|
+
/** Registry-derived presign MIME allowlist (P4-V1). Computed once at module
|
|
37
|
+
* load from `presignMimeAllowlist()` — the format registry is the single
|
|
38
|
+
* source of truth, so this can't drift from the multipart/inline gates. SVG is
|
|
39
|
+
* excluded by construction (it carries `sanitize: 'svg'`, so `isPresignSafe`
|
|
40
|
+
* rejects it — V2). */
|
|
41
|
+
const ALLOWED_MIME = new Set(presignMimeAllowlist());
|
|
42
|
+
const URL_TTL_SECONDS = 15 * 60;
|
|
43
|
+
export async function presignAssetUpload(input) {
|
|
44
|
+
// 1. Mime gate (registry-derived — see ALLOWED_MIME)
|
|
45
|
+
if (!ALLOWED_MIME.has(input.mimeType)) {
|
|
46
|
+
throw new InvalidMimeTypeError(`Unsupported mime type "${input.mimeType}". The presign flow accepts: ${[...ALLOWED_MIME].sort().join(', ')}. ` +
|
|
47
|
+
`Other formats (incl. SVG and documents) must use the inline-bytes upload tool, which sanitizes server-side.`);
|
|
48
|
+
}
|
|
49
|
+
// 2. Filename gate (shared validator → typed error). Runs before the
|
|
50
|
+
// mime/filename coupling so a malformed/empty filename fails as
|
|
51
|
+
// InvalidFilenameError, not a confusing mime mismatch.
|
|
52
|
+
try {
|
|
53
|
+
validateFilename(input.filename);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
throw new InvalidFilenameError(err instanceof Error ? err.message : 'Invalid filename');
|
|
57
|
+
}
|
|
58
|
+
// 2b. Mime/filename coupling. The mime is pinned into the PUT signature AND
|
|
59
|
+
// the asset entity derives asset_kind/asset_mime from the FILENAME at
|
|
60
|
+
// finalize. If the two disagree (e.g. mime=image/heic, filename=a.png),
|
|
61
|
+
// the stored entity would claim image/png while the bytes are heic, and
|
|
62
|
+
// the caption path would ship the wrong mime. Require the declared mime
|
|
63
|
+
// to be one the filename's registry format actually carries.
|
|
64
|
+
if (!resolveFormat(input.filename).mimeTypes.includes(input.mimeType)) {
|
|
65
|
+
throw new InvalidMimeTypeError(`Mime type "${input.mimeType}" does not match the extension of "${input.filename}". ` +
|
|
66
|
+
`Pass a filename whose extension matches the content type.`);
|
|
67
|
+
}
|
|
68
|
+
// 3. Resolve target repo. resolveWorkspaceAssetsRepo (not the lower-level
|
|
69
|
+
// ensureWorkspaceAssetsFolder) so workspaceManager.reloadConfig() runs
|
|
70
|
+
// after first-write provisioning — otherwise wm.getGraph(repo) would
|
|
71
|
+
// miss the freshly-created folder later.
|
|
72
|
+
const workspace = new Workspace(input.workspaceManager.getWorkspacePath());
|
|
73
|
+
const repo = input.repo
|
|
74
|
+
?? (await resolveWorkspaceAssetsRepo(workspace, input.workspaceManager));
|
|
75
|
+
// 4. Authz on the resolved repo
|
|
76
|
+
if (!canWriteRepo(input.user, repo, input.workspaceManager, input.authService)) {
|
|
77
|
+
throw new ForbiddenError(`No write access to folder "${repo}"`);
|
|
78
|
+
}
|
|
79
|
+
// 5. Backend must support the full presign lifecycle (PUT + HEAD + copy)
|
|
80
|
+
let graph;
|
|
81
|
+
try {
|
|
82
|
+
graph = input.workspaceManager.getGraph(repo);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
throw new ForbiddenError(`Folder "${repo}" not found`);
|
|
86
|
+
}
|
|
87
|
+
const assetService = graph.getAssetService();
|
|
88
|
+
if (!assetService || !assetService.supportsPresignedUploads()) {
|
|
89
|
+
throw new LocalBackendNotSupportedError('Pre-signed uploads require an R2-backed asset store. This workspace is using local filesystem storage; upload via the multipart endpoint (POST /api/repos/:repo/assets) instead.');
|
|
90
|
+
}
|
|
91
|
+
// 6. Mint identifiers
|
|
92
|
+
const assetId = randomUUID();
|
|
93
|
+
const filename = safeFilename(input.filename);
|
|
94
|
+
// 7. Sign PUT URL — ContentType is pinned in the signature
|
|
95
|
+
const { uploadUrl, headers } = await assetService.signPendingPutUrl(assetId, filename, input.mimeType, URL_TTL_SECONDS);
|
|
96
|
+
// 8. Owner shape
|
|
97
|
+
const ownerType = input.entity?.type ?? 'asset';
|
|
98
|
+
const ownerId = input.entity?.id ?? assetId;
|
|
99
|
+
// 9. Sign token (15-min TTL matches the URL — see asset-upload-token.ts)
|
|
100
|
+
const token = signAssetUploadToken({
|
|
101
|
+
assetId,
|
|
102
|
+
repo,
|
|
103
|
+
ownerType,
|
|
104
|
+
ownerId,
|
|
105
|
+
uploaderUserId: String(input.user.id),
|
|
106
|
+
mime: input.mimeType,
|
|
107
|
+
filename,
|
|
108
|
+
}, input.authService.getJwtSecret());
|
|
109
|
+
// 10. Audit log (R3) — single line, key=value-ish so a grep can reconstruct
|
|
110
|
+
// the flow.
|
|
111
|
+
log.info('[asset-presign]', {
|
|
112
|
+
event: 'asset-presign',
|
|
113
|
+
userId: String(input.user.id),
|
|
114
|
+
repo,
|
|
115
|
+
ownerType,
|
|
116
|
+
ownerId,
|
|
117
|
+
assetId,
|
|
118
|
+
mime: input.mimeType,
|
|
119
|
+
filename,
|
|
120
|
+
});
|
|
121
|
+
const expiresAt = new Date(Date.now() + URL_TTL_SECONDS * 1000).toISOString();
|
|
122
|
+
return { assetId, uploadUrl, headers, token, expiresAt, repo };
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=asset-presign-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-presign-service.js","sourceRoot":"","sources":["../../src/services/asset-presign-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset document text extraction.
|
|
3
|
+
*
|
|
4
|
+
* A pure helper that turns a document asset's bytes into searchable text. Under
|
|
5
|
+
* asset-as-embed the extracted text is seeded straight into the imported
|
|
6
|
+
* entry's BODY (in-memory), so there is no on-disk sidecar to persist — the
|
|
7
|
+
* import path (`asset-import-service.ts`) is the only caller. (Image captions
|
|
8
|
+
* are a separate async pass — `asset-index-sweep.ts` — and land in
|
|
9
|
+
* `assets.db.caption`, not here.)
|
|
10
|
+
*
|
|
11
|
+
* The `writeAssetSidecar` persistence helper + the `.studiograph/assets-text/`
|
|
12
|
+
* tree were removed with the entity-keyed caption pipeline; the `Sidecar` in
|
|
13
|
+
* the name is historical.
|
|
14
|
+
*/
|
|
15
|
+
import { type FormatExtractor } from '../core/format-registry.js';
|
|
16
|
+
/**
|
|
17
|
+
* Extract searchable text from a document asset for its index sidecar (P3 —
|
|
18
|
+
* generalized from PDF-only). Driven by the format registry's `extractor`:
|
|
19
|
+
* pdf → pdf-parse (also yields page count), docx → mammoth raw text, xlsx →
|
|
20
|
+
* every non-empty sheet as CSV. `image-caption` and `null` produce no sidecar
|
|
21
|
+
* here — image captioning is the async P3b pass, opaque assets stay
|
|
22
|
+
* filename-only. Best-effort: extraction errors return empty text (the asset
|
|
23
|
+
* is still stored + indexed by frontmatter).
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractSidecarText(buffer: Buffer, extractor: FormatExtractor, entityId: string): Promise<{
|
|
26
|
+
text: string;
|
|
27
|
+
pages?: number;
|
|
28
|
+
}>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset document text extraction.
|
|
3
|
+
*
|
|
4
|
+
* A pure helper that turns a document asset's bytes into searchable text. Under
|
|
5
|
+
* asset-as-embed the extracted text is seeded straight into the imported
|
|
6
|
+
* entry's BODY (in-memory), so there is no on-disk sidecar to persist — the
|
|
7
|
+
* import path (`asset-import-service.ts`) is the only caller. (Image captions
|
|
8
|
+
* are a separate async pass — `asset-index-sweep.ts` — and land in
|
|
9
|
+
* `assets.db.caption`, not here.)
|
|
10
|
+
*
|
|
11
|
+
* The `writeAssetSidecar` persistence helper + the `.studiograph/assets-text/`
|
|
12
|
+
* tree were removed with the entity-keyed caption pipeline; the `Sidecar` in
|
|
13
|
+
* the name is historical.
|
|
14
|
+
*/
|
|
15
|
+
import { log } from '../utils/log.js';
|
|
16
|
+
/** Bytes above which we skip request-thread text extraction. The parsers
|
|
17
|
+
* (pdf-parse / mammoth / SheetJS) are CPU-bound and synchronous; a huge file
|
|
18
|
+
* would stall the event loop for every other in-flight request. The asset
|
|
19
|
+
* still uploads — it just isn't sidecar-searchable until a later re-extract. */
|
|
20
|
+
const SIDECAR_EXTRACT_BYTES_CAP = 25 * 1024 * 1024;
|
|
21
|
+
/**
|
|
22
|
+
* Extract searchable text from a document asset for its index sidecar (P3 —
|
|
23
|
+
* generalized from PDF-only). Driven by the format registry's `extractor`:
|
|
24
|
+
* pdf → pdf-parse (also yields page count), docx → mammoth raw text, xlsx →
|
|
25
|
+
* every non-empty sheet as CSV. `image-caption` and `null` produce no sidecar
|
|
26
|
+
* here — image captioning is the async P3b pass, opaque assets stay
|
|
27
|
+
* filename-only. Best-effort: extraction errors return empty text (the asset
|
|
28
|
+
* is still stored + indexed by frontmatter).
|
|
29
|
+
*/
|
|
30
|
+
export async function extractSidecarText(buffer, extractor, entityId) {
|
|
31
|
+
if (!extractor || extractor === 'image-caption')
|
|
32
|
+
return { text: '' };
|
|
33
|
+
if (buffer.length > SIDECAR_EXTRACT_BYTES_CAP) {
|
|
34
|
+
log.warn(`[asset-upload] sidecar extraction skipped for ${entityId}: ${buffer.length} bytes > ${SIDECAR_EXTRACT_BYTES_CAP} cap`);
|
|
35
|
+
return { text: '' };
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
if (extractor === 'pdf') {
|
|
39
|
+
const { PDFParse } = await import('pdf-parse');
|
|
40
|
+
const parser = new PDFParse({ data: buffer });
|
|
41
|
+
try {
|
|
42
|
+
// pageJoiner: '' suppresses pdf-parse's default `-- N of M --` page
|
|
43
|
+
// markers, which otherwise litter both the search sidecar AND the
|
|
44
|
+
// seeded document body (asset-import-service reuses this text).
|
|
45
|
+
const result = await parser.getText({ pageJoiner: '' });
|
|
46
|
+
return { text: result.text?.trim() ?? '', pages: result.total && result.total > 0 ? result.total : undefined };
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
// Always release the parser — on an encrypted/malformed PDF getText()
|
|
50
|
+
// throws, and without finally the handle/buffers would leak.
|
|
51
|
+
await parser.destroy();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (extractor === 'docx') {
|
|
55
|
+
const mammoth = await import('mammoth');
|
|
56
|
+
const result = await mammoth.extractRawText({ buffer });
|
|
57
|
+
return { text: result.value?.trim() ?? '' };
|
|
58
|
+
}
|
|
59
|
+
if (extractor === 'xlsx') {
|
|
60
|
+
const XLSX = await import('xlsx');
|
|
61
|
+
const wb = XLSX.read(buffer, { type: 'buffer' });
|
|
62
|
+
const parts = [];
|
|
63
|
+
for (const name of wb.SheetNames) {
|
|
64
|
+
const sheet = wb.Sheets[name];
|
|
65
|
+
if (!sheet || !sheet['!ref'])
|
|
66
|
+
continue;
|
|
67
|
+
const csv = XLSX.utils.sheet_to_csv(sheet, { blankrows: false }).trim();
|
|
68
|
+
if (csv)
|
|
69
|
+
parts.push(`# ${name}\n${csv}`);
|
|
70
|
+
}
|
|
71
|
+
return { text: parts.join('\n\n').trim() };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
log.warn(`[asset-extract] text extraction failed for ${entityId} (${extractor}): ${err instanceof Error ? err.message : err}`);
|
|
76
|
+
}
|
|
77
|
+
return { text: '' };
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=asset-sidecar-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-sidecar-service.js","sourceRoot":"","sources":["../../src/services/asset-sidecar-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAGtC;;;iFAGiF;AACjF,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,SAA0B,EAC1B,QAAgB;IAEhB,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,eAAe;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,GAAG,yBAAyB,EAAE,CAAC;QAC9C,GAAG,CAAC,IAAI,CAAC,iDAAiD,QAAQ,KAAK,MAAM,CAAC,MAAM,YAAY,yBAAyB,MAAM,CAAC,CAAC;QACjI,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACtB,CAAC;IACD,IAAI,CAAC;QACH,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC;gBACH,oEAAoE;gBACpE,kEAAkE;gBAClE,gEAAgE;gBAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;gBACxD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACjH,CAAC;oBAAS,CAAC;gBACT,sEAAsE;gBACtE,6DAA6D;gBAC7D,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QACD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACxD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QAC9C,CAAC;QACD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjD,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;oBAAE,SAAS;gBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxE,IAAI,GAAG;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,8CAA8C,QAAQ,KAAK,SAAS,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACjI,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC"}
|