studiograph 1.3.48-next.21 → 1.3.48-next.211
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -16
- package/dist/agent/agent-pool.d.ts +87 -3
- package/dist/agent/agent-pool.js +188 -15
- package/dist/agent/agent-pool.js.map +1 -1
- package/dist/agent/followups.d.ts +34 -0
- package/dist/agent/followups.js +52 -0
- package/dist/agent/followups.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +101 -4
- package/dist/agent/orchestrator.js +464 -66
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +34 -0
- package/dist/agent/prompts/entity-types-section.js +76 -0
- package/dist/agent/prompts/entity-types-section.js.map +1 -0
- package/dist/agent/prompts/system.md +112 -54
- package/dist/agent/skill-loader.d.ts +30 -17
- package/dist/agent/skill-loader.js +63 -30
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/skills/artifact-canvas/skill.md +152 -0
- package/dist/agent/skills/entity-schema.md +75 -431
- package/dist/agent/skills/interview/entity-templates.md +38 -37
- package/dist/agent/skills/interview/question-domains.md +54 -49
- package/dist/agent/skills/interview/skill.md +84 -16
- package/dist/agent/skills/schema-rules.md +28 -28
- package/dist/agent/tools/artifact-tools.d.ts +124 -0
- package/dist/agent/tools/artifact-tools.js +207 -0
- package/dist/agent/tools/artifact-tools.js.map +1 -0
- package/dist/agent/tools/capture-tools.d.ts +31 -0
- package/dist/agent/tools/capture-tools.js +40 -0
- package/dist/agent/tools/capture-tools.js.map +1 -0
- package/dist/agent/tools/folder-tools.d.ts +47 -0
- package/dist/agent/tools/folder-tools.js +249 -0
- package/dist/agent/tools/folder-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +6 -5
- package/dist/agent/tools/fs-tools.js +5 -5
- package/dist/agent/tools/fs-tools.js.map +1 -1
- package/dist/agent/tools/graph-tools.d.ts +48 -72
- package/dist/agent/tools/graph-tools.js +852 -329
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/history-tools.d.ts +95 -0
- package/dist/agent/tools/history-tools.js +461 -0
- package/dist/agent/tools/history-tools.js.map +1 -0
- package/dist/agent/tools/load-skill.d.ts +6 -5
- package/dist/agent/tools/load-skill.js +3 -3
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +5 -4
- package/dist/agent/tools/ops-tools.js +130 -236
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +87 -17
- package/dist/agent/tools/permission-tools.js +233 -43
- package/dist/agent/tools/permission-tools.js.map +1 -1
- package/dist/agent/tools/tool-loader.js +5 -4
- package/dist/agent/tools/tool-loader.js.map +1 -1
- package/dist/agent/tools/web-tools.js +58 -9
- package/dist/agent/tools/web-tools.js.map +1 -1
- package/dist/cli/commands/about.d.ts +1 -0
- package/dist/cli/commands/about.js +55 -3
- package/dist/cli/commands/about.js.map +1 -1
- package/dist/cli/commands/admin/audit-workspace.d.ts +23 -0
- package/dist/cli/commands/admin/audit-workspace.js +133 -0
- package/dist/cli/commands/admin/audit-workspace.js.map +1 -0
- package/dist/cli/commands/admin/audit.d.ts +21 -0
- package/dist/cli/commands/admin/audit.js +174 -0
- package/dist/cli/commands/admin/audit.js.map +1 -0
- package/dist/cli/commands/admin/backup.d.ts +54 -0
- package/dist/cli/commands/admin/backup.js +207 -0
- package/dist/cli/commands/admin/backup.js.map +1 -0
- package/dist/cli/commands/admin/folder.d.ts +11 -0
- package/dist/cli/commands/{collection.js → admin/folder.js} +33 -32
- package/dist/cli/commands/admin/folder.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +16 -0
- package/dist/cli/commands/admin/index.js +46 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate-assets.d.ts +53 -0
- package/dist/cli/commands/admin/migrate-assets.js +184 -0
- package/dist/cli/commands/admin/migrate-assets.js.map +1 -0
- package/dist/cli/commands/admin/migrate.d.ts +56 -0
- package/dist/cli/commands/admin/migrate.js +263 -0
- package/dist/cli/commands/admin/migrate.js.map +1 -0
- package/dist/cli/commands/admin/restore.d.ts +24 -0
- package/dist/cli/commands/admin/restore.js +228 -0
- package/dist/cli/commands/admin/restore.js.map +1 -0
- package/dist/cli/commands/admin/secrets.d.ts +23 -0
- package/dist/cli/commands/admin/secrets.js +256 -0
- package/dist/cli/commands/admin/secrets.js.map +1 -0
- package/dist/cli/commands/admin/settings.d.ts +28 -0
- package/dist/cli/commands/admin/settings.js +284 -0
- package/dist/cli/commands/admin/settings.js.map +1 -0
- package/dist/cli/commands/admin/token.d.ts +42 -0
- package/dist/cli/commands/admin/token.js +126 -0
- package/dist/cli/commands/admin/token.js.map +1 -0
- package/dist/cli/commands/admin/transfer-ownership.d.ts +15 -0
- package/dist/cli/commands/admin/transfer-ownership.js +106 -0
- package/dist/cli/commands/admin/transfer-ownership.js.map +1 -0
- package/dist/cli/commands/admin/user.d.ts +11 -0
- package/dist/cli/commands/admin/user.js +187 -0
- package/dist/cli/commands/admin/user.js.map +1 -0
- package/dist/cli/commands/clone.d.ts +25 -3
- package/dist/cli/commands/clone.js +142 -36
- package/dist/cli/commands/clone.js.map +1 -1
- package/dist/cli/commands/config.d.ts +23 -107
- package/dist/cli/commands/config.js +52 -260
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/connector.d.ts +10 -13
- package/dist/cli/commands/connector.js +16 -58
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.js +215 -68
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/index.js +5 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +10 -30
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.js +54 -6
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/r2.d.ts +3 -0
- package/dist/cli/commands/r2.js +223 -204
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.js +65 -12
- package/dist/cli/commands/redeploy.js.map +1 -1
- package/dist/cli/commands/reset.d.ts +22 -6
- package/dist/cli/commands/reset.js +132 -34
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/serve.js +231 -26
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +237 -227
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/crypto-bundle.d.ts +39 -0
- package/dist/cli/crypto-bundle.js +94 -0
- package/dist/cli/crypto-bundle.js.map +1 -0
- package/dist/cli/index.js +24 -26
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/railway-pin.d.ts +68 -0
- package/dist/cli/railway-pin.js +96 -0
- package/dist/cli/railway-pin.js.map +1 -0
- package/dist/cli/railway-provisioning.d.ts +53 -0
- package/dist/cli/railway-provisioning.js +85 -0
- package/dist/cli/railway-provisioning.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +30 -49
- package/dist/cli/setup-wizard.js +39 -40
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/core/accent-palette.d.ts +22 -0
- package/dist/core/accent-palette.js +47 -0
- package/dist/core/accent-palette.js.map +1 -0
- package/dist/core/artifact-asset-urls.d.ts +51 -0
- package/dist/core/artifact-asset-urls.js +79 -0
- package/dist/core/artifact-asset-urls.js.map +1 -0
- package/dist/core/artifact-bundle.d.ts +69 -0
- package/dist/core/artifact-bundle.js +305 -0
- package/dist/core/artifact-bundle.js.map +1 -0
- package/dist/core/artifact-escape.d.ts +5 -0
- package/dist/core/artifact-escape.js +26 -0
- package/dist/core/artifact-escape.js.map +1 -0
- package/dist/core/artifact-export.d.ts +17 -0
- package/dist/core/artifact-export.js +529 -0
- package/dist/core/artifact-export.js.map +1 -0
- package/dist/core/cell-anchor.d.ts +29 -0
- package/dist/core/cell-anchor.js +53 -0
- package/dist/core/cell-anchor.js.map +1 -0
- package/dist/core/comment-anchor.d.ts +41 -0
- package/dist/core/comment-anchor.js +147 -0
- package/dist/core/comment-anchor.js.map +1 -0
- package/dist/core/commit-messages.d.ts +57 -0
- package/dist/core/commit-messages.js +85 -0
- package/dist/core/commit-messages.js.map +1 -0
- package/dist/core/embeds.d.ts +96 -0
- package/dist/core/embeds.js +196 -0
- package/dist/core/embeds.js.map +1 -0
- package/dist/core/entity-body-templates.d.ts +21 -0
- package/dist/core/entity-body-templates.js +67 -0
- package/dist/core/entity-body-templates.js.map +1 -0
- package/dist/core/entity-types-catalog.d.ts +65 -0
- package/dist/core/entity-types-catalog.js +142 -0
- package/dist/core/entity-types-catalog.js.map +1 -0
- package/dist/core/field-library.d.ts +62 -0
- package/dist/core/field-library.js +129 -0
- package/dist/core/field-library.js.map +1 -0
- package/dist/core/folder-paths.d.ts +41 -0
- package/dist/core/folder-paths.js +95 -0
- package/dist/core/folder-paths.js.map +1 -0
- package/dist/core/folder-sidecar.d.ts +36 -0
- package/dist/core/folder-sidecar.js +91 -0
- package/dist/core/folder-sidecar.js.map +1 -0
- package/dist/core/format-registry.d.ts +170 -0
- package/dist/core/format-registry.js +412 -0
- package/dist/core/format-registry.js.map +1 -0
- package/dist/core/graph.d.ts +773 -14
- package/dist/core/graph.js +2269 -308
- package/dist/core/graph.js.map +1 -1
- package/dist/core/history-diff.d.ts +35 -0
- package/dist/core/history-diff.js +114 -0
- package/dist/core/history-diff.js.map +1 -0
- package/dist/core/refs.d.ts +41 -0
- package/dist/core/refs.js +80 -0
- package/dist/core/refs.js.map +1 -0
- package/dist/core/schema-registry.d.ts +66 -0
- package/dist/core/schema-registry.js +198 -37
- package/dist/core/schema-registry.js.map +1 -1
- package/dist/core/schemas/connector.d.ts +67 -0
- package/dist/core/schemas/connector.js +100 -0
- package/dist/core/schemas/connector.js.map +1 -0
- package/dist/core/schemas/workspace.d.ts +122 -0
- package/dist/core/schemas/workspace.js +211 -0
- package/dist/core/schemas/workspace.js.map +1 -0
- package/dist/core/secrets/SecretStore.d.ts +77 -0
- package/dist/core/secrets/SecretStore.js +13 -0
- package/dist/core/secrets/SecretStore.js.map +1 -0
- package/dist/core/secrets/SettingsResolver.d.ts +54 -0
- package/dist/core/secrets/SettingsResolver.js +80 -0
- package/dist/core/secrets/SettingsResolver.js.map +1 -0
- package/dist/core/secrets/SettingsStore.d.ts +30 -0
- package/dist/core/secrets/SettingsStore.js +9 -0
- package/dist/core/secrets/SettingsStore.js.map +1 -0
- package/dist/core/secrets/SqliteEncryptedStore.d.ts +90 -0
- package/dist/core/secrets/SqliteEncryptedStore.js +598 -0
- package/dist/core/secrets/SqliteEncryptedStore.js.map +1 -0
- package/dist/core/secrets/audit.d.ts +36 -0
- package/dist/core/secrets/audit.js +60 -0
- package/dist/core/secrets/audit.js.map +1 -0
- package/dist/core/secrets/auth-db-migration.d.ts +129 -0
- package/dist/core/secrets/auth-db-migration.js +653 -0
- package/dist/core/secrets/auth-db-migration.js.map +1 -0
- package/dist/core/secrets/bundle.d.ts +141 -0
- package/dist/core/secrets/bundle.js +435 -0
- package/dist/core/secrets/bundle.js.map +1 -0
- package/dist/core/secrets/dual-write.d.ts +81 -0
- package/dist/core/secrets/dual-write.js +247 -0
- package/dist/core/secrets/dual-write.js.map +1 -0
- package/dist/core/secrets/encryption.d.ts +44 -0
- package/dist/core/secrets/encryption.js +97 -0
- package/dist/core/secrets/encryption.js.map +1 -0
- package/dist/core/secrets/index.d.ts +49 -0
- package/dist/core/secrets/index.js +74 -0
- package/dist/core/secrets/index.js.map +1 -0
- package/dist/core/secrets/master-key.d.ts +38 -0
- package/dist/core/secrets/master-key.js +122 -0
- package/dist/core/secrets/master-key.js.map +1 -0
- package/dist/core/secrets/probes/anthropic.d.ts +98 -0
- package/dist/core/secrets/probes/anthropic.js +300 -0
- package/dist/core/secrets/probes/anthropic.js.map +1 -0
- package/dist/core/secrets/probes/brave.d.ts +9 -0
- package/dist/core/secrets/probes/brave.js +15 -0
- package/dist/core/secrets/probes/brave.js.map +1 -0
- package/dist/core/secrets/probes/r2.d.ts +15 -0
- package/dist/core/secrets/probes/r2.js +14 -0
- package/dist/core/secrets/probes/r2.js.map +1 -0
- package/dist/core/secrets/probes/tavily.d.ts +18 -0
- package/dist/core/secrets/probes/tavily.js +58 -0
- package/dist/core/secrets/probes/tavily.js.map +1 -0
- package/dist/core/secrets/probes/voyage.d.ts +13 -0
- package/dist/core/secrets/probes/voyage.js +52 -0
- package/dist/core/secrets/probes/voyage.js.map +1 -0
- package/dist/core/secrets/r2-structural-migration.d.ts +39 -0
- package/dist/core/secrets/r2-structural-migration.js +109 -0
- package/dist/core/secrets/r2-structural-migration.js.map +1 -0
- package/dist/core/secrets/read-flip.d.ts +59 -0
- package/dist/core/secrets/read-flip.js +87 -0
- package/dist/core/secrets/read-flip.js.map +1 -0
- package/dist/core/secrets/registry.d.ts +188 -0
- package/dist/core/secrets/registry.js +616 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/types.d.ts +77 -483
- package/dist/core/types.js +25 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +75 -12
- package/dist/core/user-config.js +155 -14
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +786 -1373
- package/dist/core/validation.js +458 -147
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +87 -14
- package/dist/core/workspace-manager.js +222 -94
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +19 -5
- package/dist/core/workspace.js +67 -39
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/comment-virtual-entity.d.ts +36 -0
- package/dist/mcp/comment-virtual-entity.js +71 -0
- package/dist/mcp/comment-virtual-entity.js.map +1 -0
- package/dist/mcp/connector-manager.d.ts +72 -2
- package/dist/mcp/connector-manager.js +211 -32
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/oauth-provider.d.ts +0 -5
- package/dist/mcp/oauth-provider.js +10 -22
- package/dist/mcp/oauth-provider.js.map +1 -1
- package/dist/mcp/oauth-registry.d.ts +46 -8
- package/dist/mcp/oauth-registry.js +52 -13
- package/dist/mcp/oauth-registry.js.map +1 -1
- package/dist/mcp/server-discovery.d.ts +73 -0
- package/dist/mcp/server-discovery.js +164 -0
- package/dist/mcp/server-discovery.js.map +1 -0
- package/dist/mcp/server.d.ts +24 -3
- package/dist/mcp/server.js +53 -10
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/state-signer.d.ts +62 -0
- package/dist/mcp/state-signer.js +205 -0
- package/dist/mcp/state-signer.js.map +1 -0
- package/dist/mcp/stdio-proxy.d.ts +67 -0
- package/dist/mcp/stdio-proxy.js +149 -0
- package/dist/mcp/stdio-proxy.js.map +1 -0
- package/dist/mcp/tools.d.ts +65 -2
- package/dist/mcp/tools.js +1772 -124
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/__tests__/helpers/graph-api.d.ts +16 -0
- package/dist/server/__tests__/helpers/graph-api.js +16 -0
- package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
- package/dist/server/artifact-asset-mint.d.ts +41 -0
- package/dist/server/artifact-asset-mint.js +59 -0
- package/dist/server/artifact-asset-mint.js.map +1 -0
- package/dist/server/asset-index-queue.d.ts +98 -0
- package/dist/server/asset-index-queue.js +193 -0
- package/dist/server/asset-index-queue.js.map +1 -0
- package/dist/server/body-write-coordinator.d.ts +161 -0
- package/dist/server/body-write-coordinator.js +182 -0
- package/dist/server/body-write-coordinator.js.map +1 -0
- package/dist/server/cloud-billing-flow.d.ts +32 -0
- package/dist/server/cloud-billing-flow.js +75 -0
- package/dist/server/cloud-billing-flow.js.map +1 -0
- package/dist/server/commit-audit.d.ts +26 -0
- package/dist/server/commit-audit.js +30 -0
- package/dist/server/commit-audit.js.map +1 -0
- package/dist/server/index.d.ts +29 -3
- package/dist/server/index.js +657 -269
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/sanitize.d.ts +46 -0
- package/dist/server/middleware/sanitize.js +182 -0
- package/dist/server/middleware/sanitize.js.map +1 -0
- package/dist/server/routes/artifact-export-api.d.ts +11 -0
- package/dist/server/routes/artifact-export-api.js +159 -0
- package/dist/server/routes/artifact-export-api.js.map +1 -0
- package/dist/server/routes/asset-api.d.ts +76 -1
- package/dist/server/routes/asset-api.js +761 -61
- package/dist/server/routes/asset-api.js.map +1 -1
- package/dist/server/routes/audit-api.d.ts +24 -0
- package/dist/server/routes/audit-api.js +117 -0
- package/dist/server/routes/audit-api.js.map +1 -0
- package/dist/server/routes/auth-api.js +532 -63
- package/dist/server/routes/auth-api.js.map +1 -1
- package/dist/server/routes/capture-api.d.ts +10 -3
- package/dist/server/routes/capture-api.js +213 -25
- package/dist/server/routes/capture-api.js.map +1 -1
- package/dist/server/routes/chat-sessions-api.d.ts +13 -0
- package/dist/server/routes/chat-sessions-api.js +455 -0
- package/dist/server/routes/chat-sessions-api.js.map +1 -0
- package/dist/server/routes/chat.d.ts +35 -1
- package/dist/server/routes/chat.js +699 -54
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/comments-api.d.ts +15 -0
- package/dist/server/routes/comments-api.js +444 -0
- package/dist/server/routes/comments-api.js.map +1 -0
- package/dist/server/routes/config-api.d.ts +3 -2
- package/dist/server/routes/config-api.js +179 -49
- package/dist/server/routes/config-api.js.map +1 -1
- package/dist/server/routes/connectors-api.js +177 -42
- package/dist/server/routes/connectors-api.js.map +1 -1
- package/dist/server/routes/event-ingest-api.d.ts +15 -0
- package/dist/server/routes/{meeting-ingest-api.js → event-ingest-api.js} +35 -20
- package/dist/server/routes/event-ingest-api.js.map +1 -0
- package/dist/server/routes/field-library-api.d.ts +28 -0
- package/dist/server/routes/field-library-api.js +126 -0
- package/dist/server/routes/field-library-api.js.map +1 -0
- package/dist/server/routes/git-http.d.ts +2 -2
- package/dist/server/routes/git-http.js +86 -39
- package/dist/server/routes/git-http.js.map +1 -1
- package/dist/server/routes/graph-api-access.d.ts +57 -0
- package/dist/server/routes/graph-api-access.js +112 -0
- package/dist/server/routes/graph-api-access.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +1 -1
- package/dist/server/routes/graph-api.js +1455 -325
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/health.d.ts +18 -0
- package/dist/server/routes/health.js +74 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/import-batch.d.ts +24 -0
- package/dist/server/routes/import-batch.js +33 -0
- package/dist/server/routes/import-batch.js.map +1 -0
- package/dist/server/routes/insights-api.d.ts +9 -2
- package/dist/server/routes/insights-api.js +355 -61
- package/dist/server/routes/insights-api.js.map +1 -1
- package/dist/server/routes/mcp.d.ts +7 -3
- package/dist/server/routes/mcp.js +24 -8
- package/dist/server/routes/mcp.js.map +1 -1
- package/dist/server/routes/oauth-api.d.ts +67 -0
- package/dist/server/routes/oauth-api.js +421 -0
- package/dist/server/routes/oauth-api.js.map +1 -0
- package/dist/server/routes/permissions-api.d.ts +9 -2
- package/dist/server/routes/permissions-api.js +87 -31
- package/dist/server/routes/permissions-api.js.map +1 -1
- package/dist/server/routes/r2-api.d.ts +25 -0
- package/dist/server/routes/r2-api.js +276 -0
- package/dist/server/routes/r2-api.js.map +1 -0
- package/dist/server/routes/secrets-api.d.ts +36 -0
- package/dist/server/routes/secrets-api.js +308 -0
- package/dist/server/routes/secrets-api.js.map +1 -0
- package/dist/server/routes/settings-api.d.ts +29 -0
- package/dist/server/routes/settings-api.js +180 -0
- package/dist/server/routes/settings-api.js.map +1 -0
- package/dist/server/routes/share-api.d.ts +32 -0
- package/dist/server/routes/share-api.js +234 -0
- package/dist/server/routes/share-api.js.map +1 -0
- package/dist/server/routes/views-api.js +51 -0
- package/dist/server/routes/views-api.js.map +1 -1
- package/dist/server/routes/workspace-api.d.ts +2 -1
- package/dist/server/routes/workspace-api.js +142 -23
- package/dist/server/routes/workspace-api.js.map +1 -1
- package/dist/server/routes/ws.d.ts +3 -2
- package/dist/server/routes/ws.js +68 -17
- package/dist/server/routes/ws.js.map +1 -1
- package/dist/server/session-manager.d.ts +48 -5
- package/dist/server/session-manager.js +182 -14
- package/dist/server/session-manager.js.map +1 -1
- package/dist/server/ws-hub.d.ts +124 -37
- package/dist/server/ws-hub.js +0 -0
- package/dist/server/ws-hub.js.map +1 -1
- package/dist/server/yjs-manager.d.ts +278 -7
- package/dist/server/yjs-manager.js +830 -38
- package/dist/server/yjs-manager.js.map +1 -1
- package/dist/server/yjs-persistence.d.ts +165 -0
- package/dist/server/yjs-persistence.js +557 -0
- package/dist/server/yjs-persistence.js.map +1 -0
- package/dist/server/yjs-text-diff.d.ts +32 -0
- package/dist/server/yjs-text-diff.js +61 -0
- package/dist/server/yjs-text-diff.js.map +1 -0
- package/dist/services/access-control.d.ts +73 -0
- package/dist/services/access-control.js +165 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/artifact-asset-token.d.ts +69 -0
- package/dist/services/artifact-asset-token.js +94 -0
- package/dist/services/artifact-asset-token.js.map +1 -0
- package/dist/services/artifact-library-sources.d.ts +3 -0
- package/dist/services/artifact-library-sources.js +44 -0
- package/dist/services/artifact-library-sources.js.map +1 -0
- package/dist/services/artifact-render-export.d.ts +97 -0
- package/dist/services/artifact-render-export.js +467 -0
- package/dist/services/artifact-render-export.js.map +1 -0
- package/dist/services/asset-caption-service.d.ts +103 -0
- package/dist/services/asset-caption-service.js +186 -0
- package/dist/services/asset-caption-service.js.map +1 -0
- package/dist/services/asset-delete-authz.d.ts +31 -0
- package/dist/services/asset-delete-authz.js +61 -0
- package/dist/services/asset-delete-authz.js.map +1 -0
- package/dist/services/asset-finalize-service.d.ts +58 -0
- package/dist/services/asset-finalize-service.js +216 -0
- package/dist/services/asset-finalize-service.js.map +1 -0
- package/dist/services/asset-import-service.d.ts +111 -0
- package/dist/services/asset-import-service.js +394 -0
- package/dist/services/asset-import-service.js.map +1 -0
- package/dist/services/asset-index-sweep.d.ts +95 -0
- package/dist/services/asset-index-sweep.js +249 -0
- package/dist/services/asset-index-sweep.js.map +1 -0
- package/dist/services/asset-lifecycle-check.d.ts +22 -0
- package/dist/services/asset-lifecycle-check.js +80 -0
- package/dist/services/asset-lifecycle-check.js.map +1 -0
- package/dist/services/asset-listing.d.ts +72 -0
- package/dist/services/asset-listing.js +321 -0
- package/dist/services/asset-listing.js.map +1 -0
- package/dist/services/asset-presign-service.d.ts +68 -0
- package/dist/services/asset-presign-service.js +124 -0
- package/dist/services/asset-presign-service.js.map +1 -0
- package/dist/services/asset-sidecar-service.d.ts +28 -0
- package/dist/services/asset-sidecar-service.js +79 -0
- package/dist/services/asset-sidecar-service.js.map +1 -0
- package/dist/services/asset-upload-errors.d.ts +41 -0
- package/dist/services/asset-upload-errors.js +45 -0
- package/dist/services/asset-upload-errors.js.map +1 -0
- package/dist/services/asset-upload-service.d.ts +56 -0
- package/dist/services/asset-upload-service.js +200 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/asset-upload-token.d.ts +58 -0
- package/dist/services/asset-upload-token.js +75 -0
- package/dist/services/asset-upload-token.js.map +1 -0
- package/dist/services/assets/asset-index-service.d.ts +127 -0
- package/dist/services/assets/asset-index-service.js +227 -0
- package/dist/services/assets/asset-index-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +128 -2
- package/dist/services/assets/base.js +98 -1
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +114 -1
- package/dist/services/assets/index.js +221 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +16 -1
- package/dist/services/assets/local.js +110 -1
- package/dist/services/assets/local.js.map +1 -1
- package/dist/services/assets/r2-sync.d.ts +88 -0
- package/dist/services/assets/r2-sync.js +412 -0
- package/dist/services/assets/r2-sync.js.map +1 -0
- package/dist/services/assets/r2.d.ts +87 -1
- package/dist/services/assets/r2.js +203 -1
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +312 -45
- package/dist/services/auth-service.js +1011 -195
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/chat-session-service.d.ts +188 -0
- package/dist/services/chat-session-service.js +512 -0
- package/dist/services/chat-session-service.js.map +1 -0
- package/dist/services/cloud-inference-billing.d.ts +64 -0
- package/dist/services/cloud-inference-billing.js +313 -0
- package/dist/services/cloud-inference-billing.js.map +1 -0
- package/dist/services/comment-service.d.ts +97 -0
- package/dist/services/comment-service.js +341 -0
- package/dist/services/comment-service.js.map +1 -0
- package/dist/services/comment-virtual-entity.d.ts +36 -0
- package/dist/services/comment-virtual-entity.js +71 -0
- package/dist/services/comment-virtual-entity.js.map +1 -0
- package/dist/services/convert-service.d.ts +64 -0
- package/dist/services/convert-service.js +68 -0
- package/dist/services/convert-service.js.map +1 -0
- package/dist/services/csv-service.d.ts +22 -17
- package/dist/services/csv-service.js +55 -92
- package/dist/services/csv-service.js.map +1 -1
- package/dist/services/entity-mutations.d.ts +213 -0
- package/dist/services/entity-mutations.js +380 -0
- package/dist/services/entity-mutations.js.map +1 -0
- package/dist/services/{meeting-processor.d.ts → event-processor.d.ts} +15 -8
- package/dist/services/{meeting-processor.js → event-processor.js} +124 -65
- package/dist/services/event-processor.js.map +1 -0
- package/dist/services/extract/docx.d.ts +1 -0
- package/dist/services/extract/docx.js +233 -0
- package/dist/services/extract/docx.js.map +1 -0
- package/dist/services/extract/index.d.ts +9 -0
- package/dist/services/extract/index.js +10 -0
- package/dist/services/extract/index.js.map +1 -0
- package/dist/services/extract/pdf.d.ts +13 -0
- package/dist/services/extract/pdf.js +69 -0
- package/dist/services/extract/pdf.js.map +1 -0
- package/dist/services/folder-creation.d.ts +33 -0
- package/dist/services/folder-creation.js +103 -0
- package/dist/services/folder-creation.js.map +1 -0
- package/dist/services/git.d.ts +58 -0
- package/dist/services/git.js +194 -55
- package/dist/services/git.js.map +1 -1
- package/dist/services/graph-maintenance.js +4 -4
- package/dist/services/graph-maintenance.js.map +1 -1
- package/dist/services/import-service.d.ts +51 -2
- package/dist/services/import-service.js +254 -107
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/lint-service.js +10 -17
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.d.ts +12 -1
- package/dist/services/markdown.js +77 -9
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/mention-detector.d.ts +23 -0
- package/dist/services/mention-detector.js +47 -0
- package/dist/services/mention-detector.js.map +1 -0
- package/dist/services/model-capabilities.d.ts +41 -0
- package/dist/services/model-capabilities.js +107 -0
- package/dist/services/model-capabilities.js.map +1 -0
- package/dist/services/notification-broadcast.d.ts +32 -0
- package/dist/services/notification-broadcast.js +38 -0
- package/dist/services/notification-broadcast.js.map +1 -0
- package/dist/services/notification-service.d.ts +41 -0
- package/dist/services/notification-service.js +100 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/oauth-server-store.d.ts +147 -0
- package/dist/services/oauth-server-store.js +319 -0
- package/dist/services/oauth-server-store.js.map +1 -0
- package/dist/services/orphan-service.js +2 -2
- package/dist/services/orphan-service.js.map +1 -1
- package/dist/services/personal-folder.d.ts +40 -0
- package/dist/services/personal-folder.js +101 -0
- package/dist/services/personal-folder.js.map +1 -0
- package/dist/services/scratch-asset-promote.d.ts +57 -0
- package/dist/services/scratch-asset-promote.js +95 -0
- package/dist/services/scratch-asset-promote.js.map +1 -0
- package/dist/services/scratch-attachment-service.d.ts +196 -0
- package/dist/services/scratch-attachment-service.js +347 -0
- package/dist/services/scratch-attachment-service.js.map +1 -0
- package/dist/services/share-link-service.d.ts +57 -0
- package/dist/services/share-link-service.js +142 -0
- package/dist/services/share-link-service.js.map +1 -0
- package/dist/services/user-person-bridge.d.ts +136 -0
- package/dist/services/user-person-bridge.js +340 -0
- package/dist/services/user-person-bridge.js.map +1 -0
- package/dist/services/vector-service.d.ts +282 -5
- package/dist/services/vector-service.js +585 -29
- package/dist/services/vector-service.js.map +1 -1
- package/dist/services/workspace-access.d.ts +108 -0
- package/dist/services/workspace-access.js +149 -0
- package/dist/services/workspace-access.js.map +1 -0
- package/dist/services/workspace-assets-folder.d.ts +46 -0
- package/dist/services/workspace-assets-folder.js +75 -0
- package/dist/services/workspace-assets-folder.js.map +1 -0
- package/dist/utils/git.d.ts +17 -2
- package/dist/utils/git.js +23 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/log.d.ts +42 -0
- package/dist/utils/log.js +137 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/preflight.js +2 -2
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/version-checker.d.ts +12 -19
- package/dist/utils/version-checker.js +14 -104
- package/dist/utils/version-checker.js.map +1 -1
- package/dist/web/_app/immutable/assets/0.Bs_z3Z86.css +2 -0
- package/dist/web/_app/immutable/assets/12.DlIf1mKh.css +1 -0
- package/dist/web/_app/immutable/assets/14.7d-Q37wc.css +1 -0
- package/dist/web/_app/immutable/assets/15.BwBFdc1D.css +1 -0
- package/dist/web/_app/immutable/assets/16.CmLrbzZp.css +1 -0
- package/dist/web/_app/immutable/assets/17.DcuK5ZVm.css +1 -0
- package/dist/web/_app/immutable/assets/2.DATnR31c.css +1 -0
- package/dist/web/_app/immutable/assets/3.Cz4H8n_O.css +1 -0
- package/dist/web/_app/immutable/assets/4.aDHteTDy.css +1 -0
- package/dist/web/_app/immutable/assets/6.CF1i5Bon.css +1 -0
- package/dist/web/_app/immutable/assets/ArtifactEntityView.C4ooklFD.css +1 -0
- package/dist/web/_app/immutable/assets/AssetLibraryPicker.BOFW0MvF.css +1 -0
- package/dist/web/_app/immutable/assets/BulkActionsBar.cmKvHzRK.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.lBCvS3X5.css +1 -0
- package/dist/web/_app/immutable/assets/CodeMirrorEditor.D6hf2pNJ.css +1 -0
- package/dist/web/_app/immutable/assets/CopyField.DVGZtw4U.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMembersPanel.kiYnDFHu.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMutationDialogs.BMRF6Z3z.css +1 -0
- package/dist/web/_app/immutable/assets/FolderPicker.Cp46GHe2.css +1 -0
- package/dist/web/_app/immutable/assets/GalleryView.WBGxxUQc.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.BOaI5KFL.css +1 -0
- package/dist/web/_app/immutable/assets/Link.vV0ne105.css +1 -0
- package/dist/web/_app/immutable/assets/Markdown.BZnsSOSf.css +1 -0
- package/dist/web/_app/immutable/assets/Rail.ilusFgD4.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.D7-BO6S_.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/StopFilledAlt.fNlDN65D.css +1 -0
- package/dist/web/_app/immutable/assets/TimelineView.xAZBJhHw.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.C8ErUJAY.css +1 -0
- package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
- package/dist/web/_app/immutable/assets/history-summary.LpmHXasl.css +1 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CZTNEAuW.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CsGl1sm0.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.BNK2_mGO.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.DpEwFAQM.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2 +0 -0
- package/dist/web/_app/immutable/assets/inline-list.cqga56xT.css +1 -0
- package/dist/web/_app/immutable/assets/list-columns.BgnafZ4K.css +1 -0
- package/dist/web/_app/immutable/assets/realtime.DDCWxn3B.css +1 -0
- package/dist/web/_app/immutable/assets/select.B90KUqR4.css +1 -0
- package/dist/web/_app/immutable/assets/sheet.RF9RBmml.css +1 -0
- package/dist/web/_app/immutable/chunks/22qYtvr82.js +1 -0
- package/dist/web/_app/immutable/chunks/2f1VclTm.js +1 -0
- package/dist/web/_app/immutable/chunks/4xgUPoGj2.js +2 -0
- package/dist/web/_app/immutable/chunks/5CYQk4xR.js +1 -0
- package/dist/web/_app/immutable/chunks/6S9WOky52.js +1 -0
- package/dist/web/_app/immutable/chunks/9K8VREGP.js +1 -0
- package/dist/web/_app/immutable/chunks/B-n5q6ku.js +1 -0
- package/dist/web/_app/immutable/chunks/B0p2fSEV2.js +1 -0
- package/dist/web/_app/immutable/chunks/B2oi87jG.js +2 -0
- package/dist/web/_app/immutable/chunks/B5Rb52QU.js +1 -0
- package/dist/web/_app/immutable/chunks/B6Lt-qaJ.js +1 -0
- package/dist/web/_app/immutable/chunks/B6O-q2CN.js +1 -0
- package/dist/web/_app/immutable/chunks/B6qeIQZz.js +2 -0
- package/dist/web/_app/immutable/chunks/B9KfEsQw2.js +1 -0
- package/dist/web/_app/immutable/chunks/BB-RSeXQ.js +1 -0
- package/dist/web/_app/immutable/chunks/BCQQzpbj.js +1 -0
- package/dist/web/_app/immutable/chunks/BGdzd-Tc.js +1 -0
- package/dist/web/_app/immutable/chunks/BLs1h0Rh2.js +1 -0
- package/dist/web/_app/immutable/chunks/BPzV_xOS2.js +1 -0
- package/dist/web/_app/immutable/chunks/BT2C6q8n.js +1 -0
- package/dist/web/_app/immutable/chunks/BUesbLq2.js +1 -0
- package/dist/web/_app/immutable/chunks/BUrnwOw4.js +2 -0
- package/dist/web/_app/immutable/chunks/BV-iCKqa.js +1 -0
- package/dist/web/_app/immutable/chunks/BVCJtXyc.js +1 -0
- package/dist/web/_app/immutable/chunks/BY9a3GSt.js +6 -0
- package/dist/web/_app/immutable/chunks/BZi3uKF4.js +1 -0
- package/dist/web/_app/immutable/chunks/BbfHGU9n2.js +1 -0
- package/dist/web/_app/immutable/chunks/Bbqu2-5G2.js +1 -0
- package/dist/web/_app/immutable/chunks/BbsX1Slr.js +3 -0
- package/dist/web/_app/immutable/chunks/BcwjqHaZ2.js +1 -0
- package/dist/web/_app/immutable/chunks/BizeEpTx.js +2 -0
- package/dist/web/_app/immutable/chunks/BlgjVmFM2.js +14 -0
- package/dist/web/_app/immutable/chunks/BocSRgv12.js +1 -0
- package/dist/web/_app/immutable/chunks/BojBYqc3.js +1 -0
- package/dist/web/_app/immutable/chunks/BpCG9m962.js +1 -0
- package/dist/web/_app/immutable/chunks/BqvnBg_y.js +1 -0
- package/dist/web/_app/immutable/chunks/BsT0J1QD.js +1 -0
- package/dist/web/_app/immutable/chunks/BsW72fyR2.js +1 -0
- package/dist/web/_app/immutable/chunks/Bti_XKwx.js +2692 -0
- package/dist/web/_app/immutable/chunks/Bua97Had2.js +2 -0
- package/dist/web/_app/immutable/chunks/BuhW5Fr0.js +689 -0
- package/dist/web/_app/immutable/chunks/Bx74EEyn2.js +1 -0
- package/dist/web/_app/immutable/chunks/BxPN0T61.js +1 -0
- package/dist/web/_app/immutable/chunks/Bz9lrgGs.js +1 -0
- package/dist/web/_app/immutable/chunks/BzaxZ6j12.js +1 -0
- package/dist/web/_app/immutable/chunks/C1B4xDs0.js +1 -0
- package/dist/web/_app/immutable/chunks/C1trcC8M.js +7 -0
- package/dist/web/_app/immutable/chunks/C9tvkk7Y2.js +22 -0
- package/dist/web/_app/immutable/chunks/CBQjdDZf.js +1 -0
- package/dist/web/_app/immutable/chunks/CDeazMFW2.js +2 -0
- package/dist/web/_app/immutable/chunks/CEahbtnP.js +1 -0
- package/dist/web/_app/immutable/chunks/CGjVCd0e.js +8 -0
- package/dist/web/_app/immutable/chunks/CICK9maP.js +1 -0
- package/dist/web/_app/immutable/chunks/CIoNEHQ82.js +184 -0
- package/dist/web/_app/immutable/chunks/CP8_U450.js +1 -0
- package/dist/web/_app/immutable/chunks/CQ1eQ93t2.js +6 -0
- package/dist/web/_app/immutable/chunks/CUFQMEBn2.js +1 -0
- package/dist/web/_app/immutable/chunks/CYEYDNwO2.js +1 -0
- package/dist/web/_app/immutable/chunks/CYyIP7kP2.js +66 -0
- package/dist/web/_app/immutable/chunks/CZgFaimi2.js +83 -0
- package/dist/web/_app/immutable/chunks/CZqvCTCv.js +1 -0
- package/dist/web/_app/immutable/chunks/CcI9jYBV.js +1 -0
- package/dist/web/_app/immutable/chunks/CcWaWbrI2.js +1 -0
- package/dist/web/_app/immutable/chunks/CdtzRVZK.js +1 -0
- package/dist/web/_app/immutable/chunks/CfYG72Hc.js +1 -0
- package/dist/web/_app/immutable/chunks/Ch1kmm3J2.js +1 -0
- package/dist/web/_app/immutable/chunks/CmSSN61R2.js +1 -0
- package/dist/web/_app/immutable/chunks/Cqm5wAin.js +1 -0
- package/dist/web/_app/immutable/chunks/CuYPXpWU.js +1 -0
- package/dist/web/_app/immutable/chunks/CvSEodTA.js +1 -0
- package/dist/web/_app/immutable/chunks/CvqqrTrj.js +1 -0
- package/dist/web/_app/immutable/chunks/CwAmWt6h.js +1 -0
- package/dist/web/_app/immutable/chunks/CwP3Oa7F.js +1 -0
- package/dist/web/_app/immutable/chunks/CyTluew1.js +2 -0
- package/dist/web/_app/immutable/chunks/CzXdOgVl2.js +7 -0
- package/dist/web/_app/immutable/chunks/D0IAituJ.js +1 -0
- package/dist/web/_app/immutable/chunks/D0W7c6Sg.js +185 -0
- package/dist/web/_app/immutable/chunks/D0rBhnqB2.js +1 -0
- package/dist/web/_app/immutable/chunks/D1-GZSN1.js +1 -0
- package/dist/web/_app/immutable/chunks/D1yvtriI.js +1 -0
- package/dist/web/_app/immutable/chunks/D25NMRpl.js +1 -0
- package/dist/web/_app/immutable/chunks/D8wZ2xul.js +4 -0
- package/dist/web/_app/immutable/chunks/DA3HEX3X.js +1 -0
- package/dist/web/_app/immutable/chunks/DD9wj4ca2.js +1 -0
- package/dist/web/_app/immutable/chunks/DJ1YeiJL2.js +1 -0
- package/dist/web/_app/immutable/chunks/DKFZnpVC.js +5 -0
- package/dist/web/_app/immutable/chunks/DKJl40hl.js +1 -0
- package/dist/web/_app/immutable/chunks/DPUVu0T0.js +1 -0
- package/dist/web/_app/immutable/chunks/DQMWa2t7.js +1 -0
- package/dist/web/_app/immutable/chunks/DXsFrDer2.js +1 -0
- package/dist/web/_app/immutable/chunks/DYc5KW3F.js +1 -0
- package/dist/web/_app/immutable/chunks/DZcTwXBW.js +1 -0
- package/dist/web/_app/immutable/chunks/DcPrzUMJ.js +1 -0
- package/dist/web/_app/immutable/chunks/DdPO8kRu2.js +2 -0
- package/dist/web/_app/immutable/chunks/DeOXyJZw2.js +1 -0
- package/dist/web/_app/immutable/chunks/DfufUFR1.js +2 -0
- package/dist/web/_app/immutable/chunks/DiQg3ing.js +1 -0
- package/dist/web/_app/immutable/chunks/DjIqa1_y.js +2 -0
- package/dist/web/_app/immutable/chunks/DkJ1dkxV2.js +1 -0
- package/dist/web/_app/immutable/chunks/Dl63IUnH2.js +224 -0
- package/dist/web/_app/immutable/chunks/DmFdD6zT.js +1 -0
- package/dist/web/_app/immutable/chunks/Dn3R8S-U.js +1 -0
- package/dist/web/_app/immutable/chunks/DpNr1GQ2.js +1 -0
- package/dist/web/_app/immutable/chunks/DpVNDHXz.js +2 -0
- package/dist/web/_app/immutable/chunks/DuxziNnw.js +1 -0
- package/dist/web/_app/immutable/chunks/Dv3A3Wcj.js +1 -0
- package/dist/web/_app/immutable/chunks/FuiJnZG0.js +1 -0
- package/dist/web/_app/immutable/chunks/Izkulod7.js +1 -0
- package/dist/web/_app/immutable/chunks/KZY6ongq2.js +2 -0
- package/dist/web/_app/immutable/chunks/LYL8znYR2.js +23 -0
- package/dist/web/_app/immutable/chunks/PhN6tXuJ2.js +1 -0
- package/dist/web/_app/immutable/chunks/PyLyCpuL.js +1 -0
- package/dist/web/_app/immutable/chunks/RK4gCWN0.js +2 -0
- package/dist/web/_app/immutable/chunks/VsBngTf4.js +2 -0
- package/dist/web/_app/immutable/chunks/XcWejFm_.js +5 -0
- package/dist/web/_app/immutable/chunks/al_nidE9.js +1 -0
- package/dist/web/_app/immutable/chunks/e50-izZO2.js +1 -0
- package/dist/web/_app/immutable/chunks/hG-QCarB.js +1 -0
- package/dist/web/_app/immutable/chunks/hStvCHkX.js +1 -0
- package/dist/web/_app/immutable/chunks/iJVY9p0y.js +3 -0
- package/dist/web/_app/immutable/chunks/kNaey6uv.js +1 -0
- package/dist/web/_app/immutable/chunks/pIXNe0C1.js +1 -0
- package/dist/web/_app/immutable/chunks/pNSRq_1B.js +2 -0
- package/dist/web/_app/immutable/chunks/qwr5boV8.js +1 -0
- package/dist/web/_app/immutable/chunks/rjjyuGhb.js +1 -0
- package/dist/web/_app/immutable/chunks/sg-T-FoN.js +1 -0
- package/dist/web/_app/immutable/chunks/uBgoVlsx.js +3 -0
- package/dist/web/_app/immutable/chunks/ulshNz6x.js +2 -0
- package/dist/web/_app/immutable/chunks/xY0c-UfG.js +3 -0
- package/dist/web/_app/immutable/chunks/xeNvx4Bl2.js +1 -0
- package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/dist/web/_app/immutable/entry/app.pNUW-q4U.js +2 -0
- package/dist/web/_app/immutable/entry/start.DxGtIGG_.js +1 -0
- package/dist/web/_app/immutable/nodes/0.D6ZCY_R6.js +2 -0
- package/dist/web/_app/immutable/nodes/1.BryH3TNr.js +1 -0
- package/dist/web/_app/immutable/nodes/10.CMZMvR17.js +1 -0
- package/dist/web/_app/immutable/nodes/11.QHx_JShx.js +1 -0
- package/dist/web/_app/immutable/nodes/12.CiRWbb4X.js +1 -0
- package/dist/web/_app/immutable/nodes/13.CYrHXCA8.js +1 -0
- package/dist/web/_app/immutable/nodes/14.K18eIE5Z.js +1 -0
- package/dist/web/_app/immutable/nodes/15.DxgnZ61h.js +1 -0
- package/dist/web/_app/immutable/nodes/16.Dn6iuWIo.js +1 -0
- package/dist/web/_app/immutable/nodes/17.viwS7vTR.js +77 -0
- package/dist/web/_app/immutable/nodes/2.BQkQ_uUM.js +122 -0
- package/dist/web/_app/immutable/nodes/3.B4pqXsqq.js +6 -0
- package/dist/web/_app/immutable/nodes/4.CKXEgIAP.js +11 -0
- package/dist/web/_app/immutable/nodes/5.A2TASl4Q.js +1 -0
- package/dist/web/_app/immutable/nodes/6.DaIRO3SI.js +6 -0
- package/dist/web/_app/immutable/nodes/7.ga2UvFm-.js +1 -0
- package/dist/web/_app/immutable/nodes/8.BTEWT81u.js +1 -0
- package/dist/web/_app/immutable/nodes/9.BVxo0E0c.js +1 -0
- package/dist/web/_app/version.json +1 -1
- package/dist/web/favicon-16.png +0 -0
- package/dist/web/favicon-180.png +0 -0
- package/dist/web/favicon-32.png +0 -0
- package/dist/web/favicon-48.png +0 -0
- package/dist/web/favicon-512.png +0 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/favicon.svg +8 -0
- package/dist/web/index.html +56 -21
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +35 -14
- package/dist/agent/skills/enrich-entities.md +0 -136
- package/dist/agent/skills/sync-configuration.md +0 -119
- package/dist/agent/skills/sync-setup.md +0 -82
- package/dist/agent/tools/message-tools.d.ts +0 -42
- package/dist/agent/tools/message-tools.js +0 -106
- package/dist/agent/tools/message-tools.js.map +0 -1
- package/dist/cli/commands/app.d.ts +0 -7
- package/dist/cli/commands/app.js +0 -268
- package/dist/cli/commands/app.js.map +0 -1
- package/dist/cli/commands/clear.d.ts +0 -5
- package/dist/cli/commands/clear.js +0 -36
- package/dist/cli/commands/clear.js.map +0 -1
- package/dist/cli/commands/collection.d.ts +0 -10
- package/dist/cli/commands/collection.js.map +0 -1
- package/dist/cli/commands/join.d.ts +0 -9
- package/dist/cli/commands/join.js +0 -255
- package/dist/cli/commands/join.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -7
- package/dist/cli/commands/start.js +0 -584
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -8
- package/dist/cli/commands/update.js +0 -155
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/user.d.ts +0 -7
- package/dist/cli/commands/user.js +0 -175
- package/dist/cli/commands/user.js.map +0 -1
- package/dist/cli/scaffolding.d.ts +0 -12
- package/dist/cli/scaffolding.js +0 -397
- package/dist/cli/scaffolding.js.map +0 -1
- package/dist/integrations/registry.d.ts +0 -8
- package/dist/integrations/registry.js +0 -7
- package/dist/integrations/registry.js.map +0 -1
- package/dist/integrations/types.d.ts +0 -43
- package/dist/integrations/types.js +0 -5
- package/dist/integrations/types.js.map +0 -1
- package/dist/lib/lib/utils.d.ts +0 -2
- package/dist/lib/lib/utils.js +0 -6
- package/dist/lib/lib/utils.js.map +0 -1
- package/dist/server/chrome/chrome.css +0 -691
- package/dist/server/chrome/chrome.js +0 -374
- package/dist/server/commit-scheduler.d.ts +0 -39
- package/dist/server/commit-scheduler.js +0 -113
- package/dist/server/commit-scheduler.js.map +0 -1
- package/dist/server/plugin-loader.d.ts +0 -53
- package/dist/server/plugin-loader.js +0 -155
- package/dist/server/plugin-loader.js.map +0 -1
- package/dist/server/routes/meeting-ingest-api.d.ts +0 -14
- package/dist/server/routes/meeting-ingest-api.js.map +0 -1
- package/dist/server/routes/messages-api.d.ts +0 -15
- package/dist/server/routes/messages-api.js +0 -385
- package/dist/server/routes/messages-api.js.map +0 -1
- package/dist/services/batch-processor.d.ts +0 -49
- package/dist/services/batch-processor.js +0 -166
- package/dist/services/batch-processor.js.map +0 -1
- package/dist/services/briefing.d.ts +0 -26
- package/dist/services/briefing.js +0 -230
- package/dist/services/briefing.js.map +0 -1
- package/dist/services/heartbeat.d.ts +0 -28
- package/dist/services/heartbeat.js +0 -183
- package/dist/services/heartbeat.js.map +0 -1
- package/dist/services/image-import-service.d.ts +0 -24
- package/dist/services/image-import-service.js +0 -108
- package/dist/services/image-import-service.js.map +0 -1
- package/dist/services/insights.d.ts +0 -38
- package/dist/services/insights.js +0 -269
- package/dist/services/insights.js.map +0 -1
- package/dist/services/meeting-processor.js.map +0 -1
- package/dist/services/message-service.d.ts +0 -68
- package/dist/services/message-service.js +0 -220
- package/dist/services/message-service.js.map +0 -1
- package/dist/utils/workspace-config.d.ts +0 -8
- package/dist/utils/workspace-config.js +0 -22
- package/dist/utils/workspace-config.js.map +0 -1
- package/dist/web/_app/immutable/assets/0.uPSqtsC5.css +0 -1
- package/dist/web/_app/immutable/assets/11.2jzI3cZY.css +0 -1
- package/dist/web/_app/immutable/assets/12.CT4xL4K3.css +0 -1
- package/dist/web/_app/immutable/assets/13.BUrHkYry.css +0 -1
- package/dist/web/_app/immutable/assets/2.DpQWr6q6.css +0 -1
- package/dist/web/_app/immutable/assets/3.BxdqT7zi.css +0 -1
- package/dist/web/_app/immutable/assets/4.DdNqjd0T.css +0 -1
- package/dist/web/_app/immutable/assets/5.DFeGxLYf.css +0 -1
- package/dist/web/_app/immutable/assets/6.DXZr_rI_.css +0 -1
- package/dist/web/_app/immutable/assets/GraphView.D9ePpZez.css +0 -1
- package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
- package/dist/web/_app/immutable/assets/ViewToolbar.BWE03S64.css +0 -1
- package/dist/web/_app/immutable/assets/WorkspaceView.CgGDi_Zb.css +0 -1
- package/dist/web/_app/immutable/assets/wikilinks.CzMBkUMB.css +0 -1
- package/dist/web/_app/immutable/chunks/-jG4Obyh.js +0 -4
- package/dist/web/_app/immutable/chunks/2nrc8f_O.js +0 -1
- package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
- package/dist/web/_app/immutable/chunks/8Q3ZJIYu.js +0 -1
- package/dist/web/_app/immutable/chunks/B8ydT5xX.js +0 -2
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
- package/dist/web/_app/immutable/chunks/BEn6N5c2.js +0 -1
- package/dist/web/_app/immutable/chunks/BFNNbCAM.js +0 -1
- package/dist/web/_app/immutable/chunks/BFZZEUd5.js +0 -1
- package/dist/web/_app/immutable/chunks/BGk8kfOE.js +0 -2
- package/dist/web/_app/immutable/chunks/BIBCr278.js +0 -1
- package/dist/web/_app/immutable/chunks/BPCkkwqe.js +0 -1
- package/dist/web/_app/immutable/chunks/BhlvzGQx.js +0 -1
- package/dist/web/_app/immutable/chunks/BlMknQeF.js +0 -1
- package/dist/web/_app/immutable/chunks/BpjqrlCg.js +0 -1
- package/dist/web/_app/immutable/chunks/BrebtJNG.js +0 -18
- package/dist/web/_app/immutable/chunks/ByBZ7JIT.js +0 -1
- package/dist/web/_app/immutable/chunks/Bz0ZjVQE.js +0 -2
- package/dist/web/_app/immutable/chunks/BzJTZOK2.js +0 -1
- package/dist/web/_app/immutable/chunks/C0LVZhvn.js +0 -1
- package/dist/web/_app/immutable/chunks/C3uBrOS5.js +0 -1
- package/dist/web/_app/immutable/chunks/C8R1sDpW.js +0 -1
- package/dist/web/_app/immutable/chunks/CDRHrs0g.js +0 -1
- package/dist/web/_app/immutable/chunks/CN5_py1I.js +0 -1
- package/dist/web/_app/immutable/chunks/CPne482a.js +0 -1
- package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
- package/dist/web/_app/immutable/chunks/CWyU-seV.js +0 -1
- package/dist/web/_app/immutable/chunks/CX_61fY8.js +0 -5
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +0 -1
- package/dist/web/_app/immutable/chunks/ChsiIm-E.js +0 -1
- package/dist/web/_app/immutable/chunks/CojKppbh.js +0 -1
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
- package/dist/web/_app/immutable/chunks/CtYLtD7K.js +0 -1
- package/dist/web/_app/immutable/chunks/D-HDy5qS.js +0 -1
- package/dist/web/_app/immutable/chunks/D5aIYSkd.js +0 -1
- package/dist/web/_app/immutable/chunks/DBBXARVf.js +0 -1
- package/dist/web/_app/immutable/chunks/DFYOFE3o.js +0 -1
- package/dist/web/_app/immutable/chunks/DKaafS50.js +0 -1
- package/dist/web/_app/immutable/chunks/DUMOo1Pn.js +0 -1
- package/dist/web/_app/immutable/chunks/DWX9f6AF.js +0 -1
- package/dist/web/_app/immutable/chunks/DY8-EONP.js +0 -1
- package/dist/web/_app/immutable/chunks/DkoHPElM.js +0 -1
- package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
- package/dist/web/_app/immutable/chunks/DsnmJJEf.js +0 -1
- package/dist/web/_app/immutable/chunks/DujahU3W.js +0 -1
- package/dist/web/_app/immutable/chunks/FBn-ES5k.js +0 -1
- package/dist/web/_app/immutable/chunks/HQpwSOb3.js +0 -1
- package/dist/web/_app/immutable/chunks/KyjzlWRN.js +0 -2
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
- package/dist/web/_app/immutable/chunks/UwYfmrPx.js +0 -2
- package/dist/web/_app/immutable/chunks/W25ZVI8L.js +0 -2
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
- package/dist/web/_app/immutable/chunks/XjsuEnNE.js +0 -5
- package/dist/web/_app/immutable/chunks/ZD6ARAtb.js +0 -1
- package/dist/web/_app/immutable/chunks/pBTf4stg.js +0 -2
- package/dist/web/_app/immutable/chunks/rGIarcnp.js +0 -1
- package/dist/web/_app/immutable/chunks/vxEtkL8z.js +0 -1
- package/dist/web/_app/immutable/chunks/wDIGUaoU.js +0 -3
- package/dist/web/_app/immutable/entry/app.ZHiTM8WS.js +0 -2
- package/dist/web/_app/immutable/entry/start.C9-FfAVc.js +0 -1
- package/dist/web/_app/immutable/nodes/0.D92Orz8k.js +0 -2
- package/dist/web/_app/immutable/nodes/1.BMdyglM_.js +0 -1
- package/dist/web/_app/immutable/nodes/10.BilVDHSL.js +0 -1
- package/dist/web/_app/immutable/nodes/11.CS9E0Hic.js +0 -1
- package/dist/web/_app/immutable/nodes/12.D3BOxYzG.js +0 -1
- package/dist/web/_app/immutable/nodes/13.CClMKYtN.js +0 -1
- package/dist/web/_app/immutable/nodes/2.C8KKElPL.js +0 -267
- package/dist/web/_app/immutable/nodes/3.C5n5uiWU.js +0 -5
- package/dist/web/_app/immutable/nodes/4.DcGVvgiL.js +0 -11
- package/dist/web/_app/immutable/nodes/5.DxIjnFQO.js +0 -4
- package/dist/web/_app/immutable/nodes/6.lkh6kKLj.js +0 -1
- package/dist/web/_app/immutable/nodes/7.Bg7SbfhA.js +0 -1
- package/dist/web/_app/immutable/nodes/8.DcXWCNBE.js +0 -1
- package/dist/web/_app/immutable/nodes/9.Cefi8Jfm.js +0 -1
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset caption + OCR service (P3b — indexing pillar).
|
|
3
|
+
*
|
|
4
|
+
* Turns an image asset's bytes into searchable text: a concise factual
|
|
5
|
+
* description plus an OCR transcription of any legible text. The sweep
|
|
6
|
+
* (asset-index-sweep.ts) stores that text in `assets.db.caption`, keyed by the
|
|
7
|
+
* immutable assetId (asset-as-embed, decision D1 — DB column, no sidecar), and
|
|
8
|
+
* folds it into the search text of every entry that embeds the image, so a
|
|
9
|
+
* captioned image becomes findable by its content, not just its filename.
|
|
10
|
+
*
|
|
11
|
+
* This module owns ONLY the model call + the bounded fan-out. It does NOT touch
|
|
12
|
+
* disk, git, or LanceDB — the sweep wires those so the service stays a pure,
|
|
13
|
+
* unit-testable transform over `(bytes) → text`.
|
|
14
|
+
*
|
|
15
|
+
* Guardrails (decision A3 + Codex):
|
|
16
|
+
* - **Bounded concurrency** (default 2): vision is not a free background
|
|
17
|
+
* service; a bulk import / first-boot migration must not fan out unbounded.
|
|
18
|
+
* - **Per-call timeout**: a hung provider call can't wedge the pool.
|
|
19
|
+
* - **Retry cap → permanent `failed`**: transient errors retry up to a cap,
|
|
20
|
+
* then the asset is honestly marked filename-only.
|
|
21
|
+
* - **Failure isolation**: one image's failure never aborts the batch.
|
|
22
|
+
* - **Gateway degrade (option a)**: `completeSimple()` cannot reach the
|
|
23
|
+
* Studiograph Credits gateway (it routes through its own client), so in
|
|
24
|
+
* gateway mode captioning is skipped and the image stays honestly
|
|
25
|
+
* filename-only — NOT routed through the gateway here.
|
|
26
|
+
*/
|
|
27
|
+
import { getModel, completeSimple } from '@mariozechner/pi-ai';
|
|
28
|
+
import { isStudiographCreditsMode } from './cloud-inference-billing.js';
|
|
29
|
+
import { supportsVision } from './model-capabilities.js';
|
|
30
|
+
import { bufferToImageContent } from './scratch-attachment-service.js';
|
|
31
|
+
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
32
|
+
const DEFAULT_MAX_ATTEMPTS = 2;
|
|
33
|
+
const DEFAULT_MAX_TOKENS = 1024;
|
|
34
|
+
/**
|
|
35
|
+
* Bytes above which we skip captioning. Base64-encoding inflates the buffer
|
|
36
|
+
* ~33% into the request body, and most vision providers reject large payloads
|
|
37
|
+
* (413) or time out — both of which would otherwise burn the retry cap and
|
|
38
|
+
* mark a perfectly valid image permanently `failed`. The doc extractor has the
|
|
39
|
+
* analogous `SIDECAR_EXTRACT_BYTES_CAP` guard; this is its image-path peer.
|
|
40
|
+
* An oversized image stays honestly filename-only.
|
|
41
|
+
*/
|
|
42
|
+
const DEFAULT_CAPTION_MAX_BYTES = 8 * 1024 * 1024;
|
|
43
|
+
/**
|
|
44
|
+
* Image MIME types vision models actually accept. The presign allowlist was
|
|
45
|
+
* widened (P4) to png/jpeg/gif/webp/avif/heic, but Anthropic + most providers
|
|
46
|
+
* only decode png/jpeg/gif/webp; shipping image/avif or image/heic returns a
|
|
47
|
+
* 400 that would burn the retry cap and land terminal `failed` for a
|
|
48
|
+
* perfectly real image. Skip those up-front so they read honestly as
|
|
49
|
+
* filename-only (reason `unsupported-mime`) instead of a wasted vision call.
|
|
50
|
+
* Note `application/octet-stream` is intentionally absent — an asset whose
|
|
51
|
+
* mime wasn't classified shouldn't be guessed as captionable.
|
|
52
|
+
*/
|
|
53
|
+
const CAPTIONABLE_MIME = new Set(['image/png', 'image/jpeg', 'image/gif', 'image/webp']);
|
|
54
|
+
/** Bounded caption fan-out — vision is metered, keep it small (A3). */
|
|
55
|
+
export const DEFAULT_CAPTION_CONCURRENCY = 2;
|
|
56
|
+
const CAPTION_SYSTEM_PROMPT = 'You index images for full-text search. Given one image, output plain text ' +
|
|
57
|
+
'with two parts and nothing else:\n' +
|
|
58
|
+
'1. A concise, factual description (subjects, setting, document/diagram/chart ' +
|
|
59
|
+
'type, notable colors). One short paragraph.\n' +
|
|
60
|
+
'2. On a new line starting with "OCR:", transcribe ALL legible text in the ' +
|
|
61
|
+
'image verbatim. If there is no text, write "OCR: (none)".\n' +
|
|
62
|
+
'No preamble, no markdown, no commentary. Keep it under ~250 words.';
|
|
63
|
+
const CAPTION_USER_PROMPT = 'Describe this image and transcribe any text it contains, following the ' +
|
|
64
|
+
'system instructions exactly.';
|
|
65
|
+
/**
|
|
66
|
+
* Is captioning reachable for this model config right now? Separate from
|
|
67
|
+
* `supportsVision` because the gateway IS vision-capable yet unreachable via
|
|
68
|
+
* `completeSimple` (decision A6 + the gateway-degrade note).
|
|
69
|
+
*/
|
|
70
|
+
export function canCaption(config) {
|
|
71
|
+
if (isStudiographCreditsMode())
|
|
72
|
+
return { ok: false, reason: 'gateway' };
|
|
73
|
+
if (!config.apiKey)
|
|
74
|
+
return { ok: false, reason: 'no-api-key' };
|
|
75
|
+
if (!supportsVision(config.provider, config.modelId))
|
|
76
|
+
return { ok: false, reason: 'no-vision' };
|
|
77
|
+
return { ok: true };
|
|
78
|
+
}
|
|
79
|
+
/** Reject a promise that outruns `ms`. */
|
|
80
|
+
function withTimeout(p, ms) {
|
|
81
|
+
return new Promise((resolve, reject) => {
|
|
82
|
+
const timer = setTimeout(() => reject(new Error(`caption call timed out after ${ms}ms`)), ms);
|
|
83
|
+
p.then((v) => { clearTimeout(timer); resolve(v); }, (e) => { clearTimeout(timer); reject(e); });
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Caption + OCR a single image. Gated by `canCaption`; never throws — a
|
|
88
|
+
* permanent failure resolves to `{ status: 'failed', reason }` so the caller
|
|
89
|
+
* can record honest index state.
|
|
90
|
+
*/
|
|
91
|
+
export async function captionImage(buffer, mimeType, config, opts = {}) {
|
|
92
|
+
const gate = canCaption(config);
|
|
93
|
+
if (!gate.ok)
|
|
94
|
+
return { status: 'failed', reason: gate.reason };
|
|
95
|
+
// The model can only decode a subset of the (widened) presign image set.
|
|
96
|
+
// Skip avif/heic/etc. before spending a vision call that would 400.
|
|
97
|
+
if (!CAPTIONABLE_MIME.has(mimeType.toLowerCase())) {
|
|
98
|
+
return { status: 'failed', reason: 'unsupported-mime' };
|
|
99
|
+
}
|
|
100
|
+
const maxBytes = opts.maxBytes ?? DEFAULT_CAPTION_MAX_BYTES;
|
|
101
|
+
if (buffer.length > maxBytes) {
|
|
102
|
+
// Too large to ship to the vision model — skip rather than 413/timeout into
|
|
103
|
+
// a permanent failure. `oversize` reads honestly as filename-only.
|
|
104
|
+
return { status: 'failed', reason: 'oversize' };
|
|
105
|
+
}
|
|
106
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
107
|
+
const maxAttempts = Math.max(1, opts.maxAttempts ?? DEFAULT_MAX_ATTEMPTS);
|
|
108
|
+
const maxTokens = opts.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
109
|
+
const complete = opts.completeFn ?? completeSimple;
|
|
110
|
+
// Resolve a pi-ai model. Unknown-to-pi-ai models still pass canCaption via
|
|
111
|
+
// the capability map; completeSimple would then reject them, which surfaces
|
|
112
|
+
// as a (correct) failure below. A best-effort placeholder keeps the call
|
|
113
|
+
// shape intact and lets an injected completeFn ignore it.
|
|
114
|
+
let model;
|
|
115
|
+
try {
|
|
116
|
+
model = getModel(config.provider, config.modelId);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
model = { provider: config.provider, id: config.modelId };
|
|
120
|
+
}
|
|
121
|
+
const context = {
|
|
122
|
+
systemPrompt: CAPTION_SYSTEM_PROMPT,
|
|
123
|
+
messages: [
|
|
124
|
+
{
|
|
125
|
+
role: 'user',
|
|
126
|
+
content: [
|
|
127
|
+
bufferToImageContent(buffer, mimeType),
|
|
128
|
+
{ type: 'text', text: CAPTION_USER_PROMPT },
|
|
129
|
+
],
|
|
130
|
+
timestamp: Date.now(),
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
};
|
|
134
|
+
let lastReason = 'error';
|
|
135
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
136
|
+
try {
|
|
137
|
+
const result = await withTimeout(complete(model, context, { apiKey: config.apiKey, maxTokens }), timeoutMs);
|
|
138
|
+
if (result.stopReason === 'error') {
|
|
139
|
+
lastReason = 'error';
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const text = (result.content ?? [])
|
|
143
|
+
.filter((c) => c.type === 'text')
|
|
144
|
+
.map((c) => c.text ?? '')
|
|
145
|
+
.join('')
|
|
146
|
+
.trim();
|
|
147
|
+
if (text)
|
|
148
|
+
return { status: 'full', text };
|
|
149
|
+
lastReason = 'empty';
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
lastReason = err instanceof Error && /timed out/.test(err.message) ? 'timeout' : 'error';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return { status: 'failed', reason: lastReason };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Caption a batch of images with bounded concurrency and full failure
|
|
159
|
+
* isolation — a single image throwing or timing out never sinks the batch.
|
|
160
|
+
* Results come back in input order, each tagged with its job key.
|
|
161
|
+
*/
|
|
162
|
+
export async function captionImages(jobs, config, opts = {}) {
|
|
163
|
+
const concurrency = Math.max(1, opts.concurrency ?? DEFAULT_CAPTION_CONCURRENCY);
|
|
164
|
+
const results = new Array(jobs.length);
|
|
165
|
+
let next = 0;
|
|
166
|
+
async function worker() {
|
|
167
|
+
while (true) {
|
|
168
|
+
const i = next++;
|
|
169
|
+
if (i >= jobs.length)
|
|
170
|
+
return;
|
|
171
|
+
const job = jobs[i];
|
|
172
|
+
try {
|
|
173
|
+
const r = await captionImage(job.buffer, job.mimeType, config, opts);
|
|
174
|
+
results[i] = { key: job.key, ...r };
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// captionImage is designed not to throw, but isolate regardless.
|
|
178
|
+
results[i] = { key: job.key, status: 'failed', reason: 'error' };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const workers = Array.from({ length: Math.min(concurrency, jobs.length) }, () => worker());
|
|
183
|
+
await Promise.all(workers);
|
|
184
|
+
return results;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=asset-caption-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-caption-service.js","sourceRoot":"","sources":["../../src/services/asset-caption-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { RepoConfig } from '../core/types.js';
|
|
2
|
+
import type { AssetIndexService } from './assets/asset-index-service.js';
|
|
3
|
+
import { type AuthUser } from './auth-service.js';
|
|
4
|
+
/**
|
|
5
|
+
* Delete authorization for the workspace-wide Assets store (codex-review P1 / D2).
|
|
6
|
+
*
|
|
7
|
+
* `workspace_wide` grants every member write (upload) access, so deletion needs
|
|
8
|
+
* a tighter rule than folder-write: only the asset's uploader (recorded
|
|
9
|
+
* `uploader_user_id`) or a workspace owner may delete it. Returns a denial
|
|
10
|
+
* message, or `null` when the delete is allowed.
|
|
11
|
+
*
|
|
12
|
+
* Pass `filename` for single-file deletes (the filename route): the gate then
|
|
13
|
+
* keys on the row for THAT file, and a legacy file with no index row is
|
|
14
|
+
* owner-only — so a member can't delete a co-located legacy blob just by owning
|
|
15
|
+
* a different indexed asset under the same entity (codex P1). Omit `filename`
|
|
16
|
+
* for whole-entity deletes (gate on every indexed row).
|
|
17
|
+
*
|
|
18
|
+
* Scope: only gates `workspace_wide` folders. Non-workspace_wide folders return
|
|
19
|
+
* `null` here (normal folder-write semantics already applied upstream).
|
|
20
|
+
* Open-mode / API-key callers (`user` undefined) are unrestricted. An entity
|
|
21
|
+
* with no indexed assets in the shared store is unexpected → owner-only.
|
|
22
|
+
*/
|
|
23
|
+
export declare function assetDeleteDenial(index: AssetIndexService | undefined, repoConfig: RepoConfig | undefined, user: AuthUser | undefined, repo: string, entityType: string, entityId: string, filename?: string): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Delete authorization for a free-standing asset addressed by its immutable
|
|
26
|
+
* `assetId` (the asset-manager delete-by-id route). Same uploader/owner gate as
|
|
27
|
+
* {@link assetDeleteDenial}, but keyed directly on the asset row rather than an
|
|
28
|
+
* entity coordinate. Only gates `workspace_wide` folders; open-mode callers are
|
|
29
|
+
* unrestricted. A missing row resolves owner-only via `index.canDelete`.
|
|
30
|
+
*/
|
|
31
|
+
export declare function assetDeleteDenialByAssetId(index: AssetIndexService | undefined, repoConfig: RepoConfig | undefined, user: AuthUser | undefined, assetId: string): string | null;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { isWorkspaceOwner } from './auth-service.js';
|
|
2
|
+
const DENIAL = 'Only the uploader or a workspace owner can delete assets in the shared Assets folder.';
|
|
3
|
+
/**
|
|
4
|
+
* Delete authorization for the workspace-wide Assets store (codex-review P1 / D2).
|
|
5
|
+
*
|
|
6
|
+
* `workspace_wide` grants every member write (upload) access, so deletion needs
|
|
7
|
+
* a tighter rule than folder-write: only the asset's uploader (recorded
|
|
8
|
+
* `uploader_user_id`) or a workspace owner may delete it. Returns a denial
|
|
9
|
+
* message, or `null` when the delete is allowed.
|
|
10
|
+
*
|
|
11
|
+
* Pass `filename` for single-file deletes (the filename route): the gate then
|
|
12
|
+
* keys on the row for THAT file, and a legacy file with no index row is
|
|
13
|
+
* owner-only — so a member can't delete a co-located legacy blob just by owning
|
|
14
|
+
* a different indexed asset under the same entity (codex P1). Omit `filename`
|
|
15
|
+
* for whole-entity deletes (gate on every indexed row).
|
|
16
|
+
*
|
|
17
|
+
* Scope: only gates `workspace_wide` folders. Non-workspace_wide folders return
|
|
18
|
+
* `null` here (normal folder-write semantics already applied upstream).
|
|
19
|
+
* Open-mode / API-key callers (`user` undefined) are unrestricted. An entity
|
|
20
|
+
* with no indexed assets in the shared store is unexpected → owner-only.
|
|
21
|
+
*/
|
|
22
|
+
export function assetDeleteDenial(index, repoConfig, user, repo, entityType, entityId, filename) {
|
|
23
|
+
if (!repoConfig?.workspace_wide)
|
|
24
|
+
return null;
|
|
25
|
+
if (!user)
|
|
26
|
+
return null;
|
|
27
|
+
const owner = isWorkspaceOwner(user.role);
|
|
28
|
+
if (!index)
|
|
29
|
+
return owner ? null : DENIAL;
|
|
30
|
+
let rows = index.listByOwner(repo, entityType, entityId);
|
|
31
|
+
if (filename !== undefined) {
|
|
32
|
+
// Single-file delete: only the row for this exact file is relevant. No
|
|
33
|
+
// matching row = a legacy/un-indexed blob → owner-only (can't be claimed
|
|
34
|
+
// by owning a sibling asset under the same entity).
|
|
35
|
+
rows = rows.filter(r => r.filename === filename);
|
|
36
|
+
if (rows.length === 0)
|
|
37
|
+
return owner ? null : DENIAL;
|
|
38
|
+
}
|
|
39
|
+
else if (rows.length === 0) {
|
|
40
|
+
return owner ? null : DENIAL;
|
|
41
|
+
}
|
|
42
|
+
return rows.every(r => index.canDelete(r.assetId, user.id, owner)) ? null : DENIAL;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Delete authorization for a free-standing asset addressed by its immutable
|
|
46
|
+
* `assetId` (the asset-manager delete-by-id route). Same uploader/owner gate as
|
|
47
|
+
* {@link assetDeleteDenial}, but keyed directly on the asset row rather than an
|
|
48
|
+
* entity coordinate. Only gates `workspace_wide` folders; open-mode callers are
|
|
49
|
+
* unrestricted. A missing row resolves owner-only via `index.canDelete`.
|
|
50
|
+
*/
|
|
51
|
+
export function assetDeleteDenialByAssetId(index, repoConfig, user, assetId) {
|
|
52
|
+
if (!repoConfig?.workspace_wide)
|
|
53
|
+
return null;
|
|
54
|
+
if (!user)
|
|
55
|
+
return null;
|
|
56
|
+
const owner = isWorkspaceOwner(user.role);
|
|
57
|
+
if (!index)
|
|
58
|
+
return owner ? null : DENIAL;
|
|
59
|
+
return index.canDelete(assetId, user.id, owner) ? null : DENIAL;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=asset-delete-authz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-delete-authz.js","sourceRoot":"","sources":["../../src/services/asset-delete-authz.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAiB,MAAM,mBAAmB,CAAC;AAEpE,MAAM,MAAM,GAAG,uFAAuF,CAAC;AAEvG;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAoC,EACpC,UAAkC,EAClC,IAA0B,EAC1B,IAAY,EACZ,UAAkB,EAClB,QAAgB,EAChB,QAAiB;IAEjB,IAAI,CAAC,UAAU,EAAE,cAAc;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACzD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,uEAAuE;QACvE,yEAAyE;QACzE,oDAAoD;QACpD,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACtD,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACrF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAoC,EACpC,UAAkC,EAClC,IAA0B,EAC1B,OAAe;IAEf,IAAI,CAAC,UAAU,EAAE,cAAc;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACzC,OAAO,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP pre-signed asset upload — STEP 3 of 3.
|
|
3
|
+
*
|
|
4
|
+
* The agent has PUT bytes to the pre-signed URL minted by presign; this
|
|
5
|
+
* verifies the upload landed, validates content-type + size at the wire,
|
|
6
|
+
* promotes the blob from `pending/` to canonical keyspace, creates the
|
|
7
|
+
* asset entity, and writes the ownership index row.
|
|
8
|
+
*
|
|
9
|
+
* Layered guarantees (every one mapped to a plan decision):
|
|
10
|
+
* - Tamper-proof (T2): verifyAssetUploadToken throws TokenInvalidError on
|
|
11
|
+
* tamper / wrong-secret / expiry.
|
|
12
|
+
* - Identity-pin (R1): String(user.id) === payload.uploaderUserId.
|
|
13
|
+
* Leaked token cannot be replayed by another
|
|
14
|
+
* folder-writer (and workspace owner is NOT exempt).
|
|
15
|
+
* - Idempotent (plan): assetIndex.get(assetId) → existing row's URL.
|
|
16
|
+
* Safe retries on transient network errors at the
|
|
17
|
+
* agent's end.
|
|
18
|
+
* - Authz freshness: Re-check canWriteRepo. 15-min token outlives a
|
|
19
|
+
* folder-access revoke.
|
|
20
|
+
* - Wire-level validation: HEAD pending and assert stored Content-Type
|
|
21
|
+
* matches the token's `mime`, and Content-Length
|
|
22
|
+
* ≤ 20MB. On mismatch, delete pending immediately
|
|
23
|
+
* so the user doesn't get charged for it.
|
|
24
|
+
* - Atomic-ish promote: r2.copy (pending → canonical) is server-side.
|
|
25
|
+
* - Compensating delete (R5): if entity-create OR index.put throws AFTER
|
|
26
|
+
* the canonical copy succeeded, delete the
|
|
27
|
+
* canonical blob so we don't leave a body-less
|
|
28
|
+
* asset entity OR an entity-less blob. If THAT
|
|
29
|
+
* also fails, log CRITICAL with the orphaned key.
|
|
30
|
+
* - Audit log (R3): single structured line at every outcome (success
|
|
31
|
+
* and each reject reason). Forensics + post-
|
|
32
|
+
* incident reconstruction.
|
|
33
|
+
*
|
|
34
|
+
* See ~/.claude/plans/mcp-presigned-asset-upload.md.
|
|
35
|
+
*/
|
|
36
|
+
import type { WorkspaceManager } from '../core/workspace-manager.js';
|
|
37
|
+
import type { AuthService, AuthUser } from './auth-service.js';
|
|
38
|
+
export interface FinalizeAssetInput {
|
|
39
|
+
workspaceManager: WorkspaceManager;
|
|
40
|
+
authService: AuthService;
|
|
41
|
+
user: AuthUser;
|
|
42
|
+
/** HMAC token minted by `presignAssetUpload`. */
|
|
43
|
+
token: string;
|
|
44
|
+
/** Optional display name for the asset entity. Defaults to a title-cased
|
|
45
|
+
* version of the filename stem. */
|
|
46
|
+
name?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface FinalizeAssetOutput {
|
|
49
|
+
assetId: string;
|
|
50
|
+
/** `/api/assets/{assetId}/{filename}` — the proxied URL that resolves
|
|
51
|
+
* per-request to a short-lived signed R2 URL via the asset-api route. */
|
|
52
|
+
url: string;
|
|
53
|
+
ownerType: string;
|
|
54
|
+
ownerId: string;
|
|
55
|
+
/** Resolved repo (echoed from the token for the MCP tool to surface). */
|
|
56
|
+
repo: string;
|
|
57
|
+
}
|
|
58
|
+
export declare function finalizeAssetUpload(input: FinalizeAssetInput): Promise<FinalizeAssetOutput>;
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP pre-signed asset upload — STEP 3 of 3.
|
|
3
|
+
*
|
|
4
|
+
* The agent has PUT bytes to the pre-signed URL minted by presign; this
|
|
5
|
+
* verifies the upload landed, validates content-type + size at the wire,
|
|
6
|
+
* promotes the blob from `pending/` to canonical keyspace, creates the
|
|
7
|
+
* asset entity, and writes the ownership index row.
|
|
8
|
+
*
|
|
9
|
+
* Layered guarantees (every one mapped to a plan decision):
|
|
10
|
+
* - Tamper-proof (T2): verifyAssetUploadToken throws TokenInvalidError on
|
|
11
|
+
* tamper / wrong-secret / expiry.
|
|
12
|
+
* - Identity-pin (R1): String(user.id) === payload.uploaderUserId.
|
|
13
|
+
* Leaked token cannot be replayed by another
|
|
14
|
+
* folder-writer (and workspace owner is NOT exempt).
|
|
15
|
+
* - Idempotent (plan): assetIndex.get(assetId) → existing row's URL.
|
|
16
|
+
* Safe retries on transient network errors at the
|
|
17
|
+
* agent's end.
|
|
18
|
+
* - Authz freshness: Re-check canWriteRepo. 15-min token outlives a
|
|
19
|
+
* folder-access revoke.
|
|
20
|
+
* - Wire-level validation: HEAD pending and assert stored Content-Type
|
|
21
|
+
* matches the token's `mime`, and Content-Length
|
|
22
|
+
* ≤ 20MB. On mismatch, delete pending immediately
|
|
23
|
+
* so the user doesn't get charged for it.
|
|
24
|
+
* - Atomic-ish promote: r2.copy (pending → canonical) is server-side.
|
|
25
|
+
* - Compensating delete (R5): if entity-create OR index.put throws AFTER
|
|
26
|
+
* the canonical copy succeeded, delete the
|
|
27
|
+
* canonical blob so we don't leave a body-less
|
|
28
|
+
* asset entity OR an entity-less blob. If THAT
|
|
29
|
+
* also fails, log CRITICAL with the orphaned key.
|
|
30
|
+
* - Audit log (R3): single structured line at every outcome (success
|
|
31
|
+
* and each reject reason). Forensics + post-
|
|
32
|
+
* incident reconstruction.
|
|
33
|
+
*
|
|
34
|
+
* See ~/.claude/plans/mcp-presigned-asset-upload.md.
|
|
35
|
+
*/
|
|
36
|
+
import { canWriteRepo } from './access-control.js';
|
|
37
|
+
import { verifyAssetUploadToken } from './asset-upload-token.js';
|
|
38
|
+
import { publicUrlForAssetId } from './assets/index.js';
|
|
39
|
+
import { deriveAssetDisplayName } from '../core/embeds.js';
|
|
40
|
+
import { getMediaType } from './assets/base.js';
|
|
41
|
+
import { ForbiddenError, LocalBackendNotSupportedError, UploadNotReceivedError, UploadValidationError, } from './asset-upload-errors.js';
|
|
42
|
+
import { log } from '../utils/log.js';
|
|
43
|
+
const MAX_BYTES = 20 * 1024 * 1024;
|
|
44
|
+
export async function finalizeAssetUpload(input) {
|
|
45
|
+
// 1. Token verify (throws TokenInvalidError on any failure).
|
|
46
|
+
const payload = verifyAssetUploadToken(input.token, input.authService.getJwtSecret());
|
|
47
|
+
// Common audit-log scaffold so every outcome carries the same fields.
|
|
48
|
+
const auditBase = {
|
|
49
|
+
event: 'asset-finalize',
|
|
50
|
+
userId: String(input.user.id),
|
|
51
|
+
repo: payload.repo,
|
|
52
|
+
ownerType: payload.ownerType,
|
|
53
|
+
ownerId: payload.ownerId,
|
|
54
|
+
assetId: payload.assetId,
|
|
55
|
+
};
|
|
56
|
+
const reject = (reason, error) => {
|
|
57
|
+
log.info('[asset-finalize]', { ...auditBase, outcome: 'rejected', reason });
|
|
58
|
+
throw error;
|
|
59
|
+
};
|
|
60
|
+
// 2. R1 identity bind: token leak isn't replayable by another user.
|
|
61
|
+
// Workspace owner is NOT exempt — the uploaderUserId rule applies to
|
|
62
|
+
// everyone, mirroring the canDelete rule on the workspace assets store.
|
|
63
|
+
if (String(input.user.id) !== payload.uploaderUserId) {
|
|
64
|
+
reject('identity_mismatch', new ForbiddenError('finalize_asset_upload may only be called by the user who created the upload token'));
|
|
65
|
+
}
|
|
66
|
+
const assetIndex = input.workspaceManager.getAssetIndex();
|
|
67
|
+
// 3. Idempotency. A repeat finalize with the same token returns the
|
|
68
|
+
// existing asset row — covers agent retries on network hiccup between
|
|
69
|
+
// "201 from R2" and "response from finalize".
|
|
70
|
+
const existing = assetIndex.get(payload.assetId);
|
|
71
|
+
if (existing) {
|
|
72
|
+
log.info('[asset-finalize]', { ...auditBase, outcome: 'idempotent' });
|
|
73
|
+
return {
|
|
74
|
+
assetId: existing.assetId,
|
|
75
|
+
url: publicUrlForAssetId(existing.assetId, existing.filename),
|
|
76
|
+
ownerType: existing.ownerType,
|
|
77
|
+
ownerId: existing.ownerId,
|
|
78
|
+
repo: existing.repo,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// 4. Re-check folder authz. 15-min token may outlive a folder-access
|
|
82
|
+
// revoke; closes the "demoted-mid-flow" gap.
|
|
83
|
+
if (!canWriteRepo(input.user, payload.repo, input.workspaceManager, input.authService)) {
|
|
84
|
+
reject('forbidden_repo', new ForbiddenError(`No write access to folder "${payload.repo}"`));
|
|
85
|
+
}
|
|
86
|
+
// 5. Resolve the graph + asset service for the target repo.
|
|
87
|
+
let graph;
|
|
88
|
+
try {
|
|
89
|
+
graph = input.workspaceManager.getGraph(payload.repo);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
reject('repo_not_found', new ForbiddenError(`Folder "${payload.repo}" not found`));
|
|
93
|
+
}
|
|
94
|
+
const assetService = graph.getAssetService();
|
|
95
|
+
if (!assetService || !assetService.supportsPresignedUploads()) {
|
|
96
|
+
reject('local_backend', new LocalBackendNotSupportedError('Pre-signed uploads require an R2-backed asset store'));
|
|
97
|
+
}
|
|
98
|
+
// 6. HEAD pending — covers "agent never PUT", wrong CT, oversize. On
|
|
99
|
+
// mismatch, delete pending immediately so a misbehaving agent's bytes
|
|
100
|
+
// don't sit on the lifecycle clock at our cost.
|
|
101
|
+
const head = await assetService.headPending(payload.assetId, payload.filename);
|
|
102
|
+
if (!head) {
|
|
103
|
+
log.info('[asset-finalize]', { ...auditBase, outcome: 'rejected', reason: 'upload_not_received' });
|
|
104
|
+
throw new UploadNotReceivedError(`No upload received at pending/${payload.assetId}/${payload.filename}. PUT may have failed or the 15-min window expired.`);
|
|
105
|
+
}
|
|
106
|
+
if (head.contentType !== payload.mime) {
|
|
107
|
+
await safeDeletePending(assetService, payload.assetId, payload.filename);
|
|
108
|
+
log.info('[asset-finalize]', {
|
|
109
|
+
...auditBase, outcome: 'rejected', reason: 'content_type_mismatch',
|
|
110
|
+
expected: payload.mime, actual: head.contentType,
|
|
111
|
+
});
|
|
112
|
+
throw new UploadValidationError(`Stored Content-Type "${head.contentType}" does not match presign mime "${payload.mime}".`);
|
|
113
|
+
}
|
|
114
|
+
if (head.size > MAX_BYTES) {
|
|
115
|
+
await safeDeletePending(assetService, payload.assetId, payload.filename);
|
|
116
|
+
log.info('[asset-finalize]', {
|
|
117
|
+
...auditBase, outcome: 'rejected', reason: 'oversize', size: head.size, max: MAX_BYTES,
|
|
118
|
+
});
|
|
119
|
+
throw new UploadValidationError(`Upload size ${head.size} bytes exceeds ${MAX_BYTES} byte limit.`);
|
|
120
|
+
}
|
|
121
|
+
if (head.size === 0) {
|
|
122
|
+
await safeDeletePending(assetService, payload.assetId, payload.filename);
|
|
123
|
+
log.info('[asset-finalize]', { ...auditBase, outcome: 'rejected', reason: 'empty' });
|
|
124
|
+
throw new UploadValidationError('Upload is empty (0 bytes).');
|
|
125
|
+
}
|
|
126
|
+
// 7. Server-side promote pending → canonical. CopyObject is atomic at
|
|
127
|
+
// R2; on failure, leave pending for the lifecycle rule.
|
|
128
|
+
await assetService.copyPendingToCanonical(payload.assetId, payload.filename);
|
|
129
|
+
// 8. From here on, the canonical blob EXISTS. Any failure below must
|
|
130
|
+
// delete it (R5) so we don't leave an orphan with no entity owner.
|
|
131
|
+
const url = publicUrlForAssetId(payload.assetId, payload.filename);
|
|
132
|
+
const name = input.name?.trim() || deriveAssetDisplayName(payload.filename) || payload.assetId;
|
|
133
|
+
const mediaType = getMediaType(payload.mime);
|
|
134
|
+
// Asset-as-embed (B2): presign produces a FREE-STANDING, folder-owned asset —
|
|
135
|
+
// NO `asset` entity. The agent embeds it into an entry via
|
|
136
|
+
// attach_asset_to_entity, or a user re-embeds it via the manager / "create
|
|
137
|
+
// entry from asset". The folder-owned index row is the asset's record of
|
|
138
|
+
// existence. Image caption/OCR indexing IS derived for it: the trigger below
|
|
139
|
+
// seeds an assetId-keyed index-state row + notifies the live caption drain
|
|
140
|
+
// (see ensureInitialAssetIndexState); the caption folds into any entry that
|
|
141
|
+
// embeds the asset.
|
|
142
|
+
try {
|
|
143
|
+
assetIndex.put({
|
|
144
|
+
assetId: payload.assetId,
|
|
145
|
+
repo: payload.repo,
|
|
146
|
+
ownerType: 'folder',
|
|
147
|
+
ownerId: payload.repo,
|
|
148
|
+
filename: payload.filename,
|
|
149
|
+
contentType: payload.mime,
|
|
150
|
+
mediaType,
|
|
151
|
+
name,
|
|
152
|
+
uploaderUserId: String(input.user.id),
|
|
153
|
+
size: head.size,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
// R5: index.put failed after the canonical blob was copied — delete the
|
|
158
|
+
// blob so no orphan remains; the original error propagates. (No entity to
|
|
159
|
+
// roll back under the asset-as-embed model.)
|
|
160
|
+
try {
|
|
161
|
+
await assetService.deleteByAssetId(payload.assetId, payload.filename);
|
|
162
|
+
}
|
|
163
|
+
catch (cleanupErr) {
|
|
164
|
+
log.warn('[asset-finalize] CRITICAL: compensating delete failed, canonical blob orphaned', {
|
|
165
|
+
assetId: payload.assetId,
|
|
166
|
+
canonicalKey: `${payload.assetId}/${payload.filename}`,
|
|
167
|
+
cleanupErr: cleanupErr instanceof Error ? cleanupErr.message : String(cleanupErr),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
log.info('[asset-finalize]', { ...auditBase, outcome: 'rejected', reason: 'app_layer_failure' });
|
|
171
|
+
throw err;
|
|
172
|
+
}
|
|
173
|
+
// Caption/OCR trigger: the vector service ignores non-captionable media
|
|
174
|
+
// types, so presigned fonts remain filename-only while raster images become
|
|
175
|
+
// content-searchable. Fire-and-forget — never block finalize on best-effort
|
|
176
|
+
// search enrichment.
|
|
177
|
+
void input.workspaceManager.vectorService?.ensureInitialAssetIndexState(payload.assetId, {
|
|
178
|
+
mediaType,
|
|
179
|
+
filename: payload.filename,
|
|
180
|
+
repo: payload.repo,
|
|
181
|
+
});
|
|
182
|
+
// 9. Pending cleanup — non-fatal. Canonical exists; lifecycle catches
|
|
183
|
+
// a missed delete.
|
|
184
|
+
try {
|
|
185
|
+
await assetService.deletePending(payload.assetId, payload.filename);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
log.warn('[asset-finalize] pending delete failed (canonical exists; lifecycle backstop will reap)', {
|
|
189
|
+
assetId: payload.assetId,
|
|
190
|
+
err: err instanceof Error ? err.message : String(err),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
// 10. Success audit log.
|
|
194
|
+
log.info('[asset-finalize]', { ...auditBase, outcome: 'success', size: head.size, mime: payload.mime });
|
|
195
|
+
return {
|
|
196
|
+
assetId: payload.assetId,
|
|
197
|
+
url,
|
|
198
|
+
ownerType: 'folder',
|
|
199
|
+
ownerId: payload.repo,
|
|
200
|
+
repo: payload.repo,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/** Best-effort pending delete on validation rejects. Errors here are
|
|
204
|
+
* swallowed — the lifecycle rule is the backstop and we don't want a
|
|
205
|
+
* cleanup failure to mask the user-facing validation error. */
|
|
206
|
+
async function safeDeletePending(assetService, assetId, filename) {
|
|
207
|
+
try {
|
|
208
|
+
await assetService.deletePending(assetId, filename);
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
log.warn('[asset-finalize] best-effort pending delete failed', {
|
|
212
|
+
assetId, filename, err: err instanceof Error ? err.message : String(err),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=asset-finalize-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-finalize-service.js","sourceRoot":"","sources":["../../src/services/asset-finalize-service.ts"],"names":[],"mappings":"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"}
|