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,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 Authorization Server store
|
|
3
|
+
*
|
|
4
|
+
* Studiograph's `/mcp` server is an OAuth resource server AND authorization
|
|
5
|
+
* server: Claude Desktop's Chat/Cowork connector pipeline is OAuth-only, so a
|
|
6
|
+
* client registers (DCR), runs an authorization-code + PKCE flow, and exchanges
|
|
7
|
+
* the code for a short-lived access token (a JWT accepted on `/mcp`) plus a
|
|
8
|
+
* revocable refresh token.
|
|
9
|
+
*
|
|
10
|
+
* This class owns the three authorization-server tables in `auth.db` and all
|
|
11
|
+
* code/token minting. It is deliberately separate from AuthService so the
|
|
12
|
+
* internet-facing AS surface can be audited and unit-tested on its own. It does
|
|
13
|
+
* NOT resolve users or enforce access control itself — it reuses the shared
|
|
14
|
+
* identity primitives via the injected `resolveUser` callback and never
|
|
15
|
+
* declares a local access helper (a past leak came from a route duplicating the
|
|
16
|
+
* shared access check).
|
|
17
|
+
*
|
|
18
|
+
* register ──▶ oauth_clients ──┐
|
|
19
|
+
* authorize ─▶ oauth_auth_codes │ (single-use, ≤60s)
|
|
20
|
+
* token ─────▶ consume code, mint access JWT (aud=/mcp) + refresh token
|
|
21
|
+
* refresh ───▶ rotate (atomic consume-old + insert-new)
|
|
22
|
+
* gc ────────▶ drop expired codes/refresh + orphan clients
|
|
23
|
+
*
|
|
24
|
+
* Token format:
|
|
25
|
+
* - access: JWT signed with the workspace jwtSecret, ~1h, claims
|
|
26
|
+
* { userId, email, role, oauth:true, cid:<client_id>, aud:<resource> }.
|
|
27
|
+
* Accepted by the existing verifyToken path; the auth hook scopes
|
|
28
|
+
* it to `/mcp` + `/oauth/*` via the `oauth`/`aud` claims.
|
|
29
|
+
* - refresh: opaque `sgr_…`, only its sha256 hash is stored, revocable,
|
|
30
|
+
* with an absolute `expires_at`.
|
|
31
|
+
*/
|
|
32
|
+
import type Database from 'better-sqlite3';
|
|
33
|
+
import type { AuthUser } from './auth-service.js';
|
|
34
|
+
export interface OAuthClient {
|
|
35
|
+
client_id: string;
|
|
36
|
+
client_name: string;
|
|
37
|
+
redirect_uris: string[];
|
|
38
|
+
created_at: string;
|
|
39
|
+
}
|
|
40
|
+
export interface AuthCodeInput {
|
|
41
|
+
client_id: string;
|
|
42
|
+
user_id: number;
|
|
43
|
+
redirect_uri: string;
|
|
44
|
+
code_challenge: string;
|
|
45
|
+
scope: string;
|
|
46
|
+
resource: string;
|
|
47
|
+
}
|
|
48
|
+
export interface ConsumedCode {
|
|
49
|
+
client_id: string;
|
|
50
|
+
user_id: number;
|
|
51
|
+
redirect_uri: string;
|
|
52
|
+
code_challenge: string;
|
|
53
|
+
scope: string;
|
|
54
|
+
resource: string;
|
|
55
|
+
}
|
|
56
|
+
export interface IssuedTokens {
|
|
57
|
+
access_token: string;
|
|
58
|
+
refresh_token: string;
|
|
59
|
+
token_type: 'Bearer';
|
|
60
|
+
expires_in: number;
|
|
61
|
+
scope: string;
|
|
62
|
+
}
|
|
63
|
+
export interface OAuthGrant {
|
|
64
|
+
client_id: string;
|
|
65
|
+
client_name: string;
|
|
66
|
+
scope: string;
|
|
67
|
+
created_at: string;
|
|
68
|
+
last_used_at: string | null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Validate a redirect URI presented at registration. Public OAuth clients are
|
|
72
|
+
* the riskiest open-redirect surface, so we reject anything that isn't a clean,
|
|
73
|
+
* absolute, fragment-free URL: HTTPS only, except http loopback for local dev.
|
|
74
|
+
*/
|
|
75
|
+
export declare function isValidRedirectUri(uri: string, opts?: {
|
|
76
|
+
allowLoopback?: boolean;
|
|
77
|
+
}): boolean;
|
|
78
|
+
export declare class OAuthServerStore {
|
|
79
|
+
private db;
|
|
80
|
+
private jwtSecret;
|
|
81
|
+
private resolveUser;
|
|
82
|
+
private consentSigner;
|
|
83
|
+
constructor(opts: {
|
|
84
|
+
db: Database.Database;
|
|
85
|
+
jwtSecret: string;
|
|
86
|
+
resolveUser: (userId: number) => AuthUser | null;
|
|
87
|
+
});
|
|
88
|
+
private initSchema;
|
|
89
|
+
signConsent(payload: Record<string, unknown>): string;
|
|
90
|
+
verifyConsent(token: string): Record<string, unknown> | null;
|
|
91
|
+
registerClient(input: {
|
|
92
|
+
client_name: string;
|
|
93
|
+
redirect_uris: string[];
|
|
94
|
+
}, opts?: {
|
|
95
|
+
allowLoopback?: boolean;
|
|
96
|
+
}): OAuthClient;
|
|
97
|
+
getClient(clientId: string): OAuthClient | null;
|
|
98
|
+
/** Exact-match redirect_uri against the client's registered set (RFC 8252). */
|
|
99
|
+
clientAllowsRedirect(clientId: string, redirectUri: string): boolean;
|
|
100
|
+
saveCode(input: AuthCodeInput): string;
|
|
101
|
+
/**
|
|
102
|
+
* Single-use exchange: atomically read the row and delete it. Returns null if
|
|
103
|
+
* the code is unknown, already consumed, or expired. The delete-inside-the-
|
|
104
|
+
* transaction is what makes a replayed/parallel exchange fail.
|
|
105
|
+
*/
|
|
106
|
+
consumeCode(rawCode: string): ConsumedCode | null;
|
|
107
|
+
static verifyPkce(codeChallenge: string, codeVerifier: string): boolean;
|
|
108
|
+
private insertRefresh;
|
|
109
|
+
createRefreshToken(userId: number, clientId: string, scope: string): string;
|
|
110
|
+
/** Resolve a raw refresh token to its grant, bumping last_used_at. */
|
|
111
|
+
verifyRefreshToken(rawToken: string): {
|
|
112
|
+
user: AuthUser;
|
|
113
|
+
clientId: string;
|
|
114
|
+
scope: string;
|
|
115
|
+
} | null;
|
|
116
|
+
/**
|
|
117
|
+
* Rotate: atomically consume the presented refresh token and issue a new one.
|
|
118
|
+
* Returns the new raw refresh token + grant, or null if the presented token
|
|
119
|
+
* is unknown/expired (replay of an already-rotated token therefore fails).
|
|
120
|
+
*
|
|
121
|
+
* `expectedClientId` is validated INSIDE the transaction, BEFORE the row is
|
|
122
|
+
* deleted: a token presented with the wrong client_id is rejected without
|
|
123
|
+
* consuming the victim's still-valid grant (no griefing-by-invalidation).
|
|
124
|
+
*/
|
|
125
|
+
rotateRefreshToken(rawToken: string, expectedClientId?: string): {
|
|
126
|
+
refreshToken: string;
|
|
127
|
+
user: AuthUser;
|
|
128
|
+
clientId: string;
|
|
129
|
+
scope: string;
|
|
130
|
+
} | null;
|
|
131
|
+
revokeRefreshToken(rawToken: string): boolean;
|
|
132
|
+
/** Grants for a user — backs the deferred Settings "connected apps" view. */
|
|
133
|
+
listGrantsForUser(userId: number): OAuthGrant[];
|
|
134
|
+
/**
|
|
135
|
+
* Mint a ~1h access JWT. `cid` is the stable client_id (not the mutable
|
|
136
|
+
* display name); `aud` binds the token to the canonical `/mcp` resource so
|
|
137
|
+
* the auth hook can refuse it on non-MCP routes.
|
|
138
|
+
*/
|
|
139
|
+
createAccessToken(user: AuthUser, clientId: string, resource: string): string;
|
|
140
|
+
/** Issue the full token set after a successful code exchange. */
|
|
141
|
+
issueTokens(user: AuthUser, clientId: string, scope: string, resource: string): IssuedTokens;
|
|
142
|
+
gcStale(): void;
|
|
143
|
+
}
|
|
144
|
+
export declare class OAuthRegistrationError extends Error {
|
|
145
|
+
code: string;
|
|
146
|
+
constructor(code: string, message: string);
|
|
147
|
+
}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 Authorization Server store
|
|
3
|
+
*
|
|
4
|
+
* Studiograph's `/mcp` server is an OAuth resource server AND authorization
|
|
5
|
+
* server: Claude Desktop's Chat/Cowork connector pipeline is OAuth-only, so a
|
|
6
|
+
* client registers (DCR), runs an authorization-code + PKCE flow, and exchanges
|
|
7
|
+
* the code for a short-lived access token (a JWT accepted on `/mcp`) plus a
|
|
8
|
+
* revocable refresh token.
|
|
9
|
+
*
|
|
10
|
+
* This class owns the three authorization-server tables in `auth.db` and all
|
|
11
|
+
* code/token minting. It is deliberately separate from AuthService so the
|
|
12
|
+
* internet-facing AS surface can be audited and unit-tested on its own. It does
|
|
13
|
+
* NOT resolve users or enforce access control itself — it reuses the shared
|
|
14
|
+
* identity primitives via the injected `resolveUser` callback and never
|
|
15
|
+
* declares a local access helper (a past leak came from a route duplicating the
|
|
16
|
+
* shared access check).
|
|
17
|
+
*
|
|
18
|
+
* register ──▶ oauth_clients ──┐
|
|
19
|
+
* authorize ─▶ oauth_auth_codes │ (single-use, ≤60s)
|
|
20
|
+
* token ─────▶ consume code, mint access JWT (aud=/mcp) + refresh token
|
|
21
|
+
* refresh ───▶ rotate (atomic consume-old + insert-new)
|
|
22
|
+
* gc ────────▶ drop expired codes/refresh + orphan clients
|
|
23
|
+
*
|
|
24
|
+
* Token format:
|
|
25
|
+
* - access: JWT signed with the workspace jwtSecret, ~1h, claims
|
|
26
|
+
* { userId, email, role, oauth:true, cid:<client_id>, aud:<resource> }.
|
|
27
|
+
* Accepted by the existing verifyToken path; the auth hook scopes
|
|
28
|
+
* it to `/mcp` + `/oauth/*` via the `oauth`/`aud` claims.
|
|
29
|
+
* - refresh: opaque `sgr_…`, only its sha256 hash is stored, revocable,
|
|
30
|
+
* with an absolute `expires_at`.
|
|
31
|
+
*/
|
|
32
|
+
import { randomBytes, createHash, timingSafeEqual } from 'crypto';
|
|
33
|
+
import jwt from 'jsonwebtoken';
|
|
34
|
+
import { deriveConsentSigningKey, createConsentSigner } from '../mcp/state-signer.js';
|
|
35
|
+
const ACCESS_TOKEN_TTL = '1h';
|
|
36
|
+
const CODE_TTL_MS = 60_000; // authorization codes: ≤60s
|
|
37
|
+
const REFRESH_TTL_MS = 30 * 24 * 60 * 60 * 1000; // refresh tokens: 30d absolute
|
|
38
|
+
const CLIENT_GC_AGE_MS = 24 * 60 * 60 * 1000; // unused registered clients: 24h
|
|
39
|
+
const MAX_REDIRECT_URIS = 5;
|
|
40
|
+
const MAX_FIELD_LEN = 2048;
|
|
41
|
+
function sha256(s) {
|
|
42
|
+
return createHash('sha256').update(s).digest('hex');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Validate a redirect URI presented at registration. Public OAuth clients are
|
|
46
|
+
* the riskiest open-redirect surface, so we reject anything that isn't a clean,
|
|
47
|
+
* absolute, fragment-free URL: HTTPS only, except http loopback for local dev.
|
|
48
|
+
*/
|
|
49
|
+
export function isValidRedirectUri(uri, opts) {
|
|
50
|
+
if (typeof uri !== 'string' || uri.length === 0 || uri.length > MAX_FIELD_LEN)
|
|
51
|
+
return false;
|
|
52
|
+
let url;
|
|
53
|
+
try {
|
|
54
|
+
url = new URL(uri);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (url.hash)
|
|
60
|
+
return false; // no fragments (RFC 6749 §3.1.2)
|
|
61
|
+
if (url.username || url.password)
|
|
62
|
+
return false;
|
|
63
|
+
if (url.href.includes('*'))
|
|
64
|
+
return false; // no wildcards
|
|
65
|
+
if (url.protocol === 'https:')
|
|
66
|
+
return true;
|
|
67
|
+
if (url.protocol === 'http:' && opts?.allowLoopback) {
|
|
68
|
+
return url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '[::1]';
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
export class OAuthServerStore {
|
|
73
|
+
db;
|
|
74
|
+
jwtSecret;
|
|
75
|
+
resolveUser;
|
|
76
|
+
consentSigner;
|
|
77
|
+
constructor(opts) {
|
|
78
|
+
this.db = opts.db;
|
|
79
|
+
this.jwtSecret = opts.jwtSecret;
|
|
80
|
+
this.resolveUser = opts.resolveUser;
|
|
81
|
+
this.consentSigner = createConsentSigner(deriveConsentSigningKey(opts.jwtSecret));
|
|
82
|
+
this.initSchema();
|
|
83
|
+
}
|
|
84
|
+
initSchema() {
|
|
85
|
+
this.db.exec(`
|
|
86
|
+
CREATE TABLE IF NOT EXISTS oauth_clients (
|
|
87
|
+
client_id TEXT PRIMARY KEY,
|
|
88
|
+
client_name TEXT NOT NULL,
|
|
89
|
+
redirect_uris TEXT NOT NULL,
|
|
90
|
+
client_secret_hash TEXT,
|
|
91
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
92
|
+
last_token_at TEXT
|
|
93
|
+
);
|
|
94
|
+
CREATE TABLE IF NOT EXISTS oauth_auth_codes (
|
|
95
|
+
code_hash TEXT PRIMARY KEY,
|
|
96
|
+
client_id TEXT NOT NULL,
|
|
97
|
+
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
98
|
+
redirect_uri TEXT NOT NULL,
|
|
99
|
+
code_challenge TEXT NOT NULL,
|
|
100
|
+
scope TEXT NOT NULL,
|
|
101
|
+
resource TEXT NOT NULL,
|
|
102
|
+
expires_at INTEGER NOT NULL,
|
|
103
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
104
|
+
);
|
|
105
|
+
CREATE TABLE IF NOT EXISTS oauth_refresh_tokens (
|
|
106
|
+
token_hash TEXT PRIMARY KEY,
|
|
107
|
+
client_id TEXT NOT NULL,
|
|
108
|
+
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
109
|
+
scope TEXT NOT NULL,
|
|
110
|
+
expires_at INTEGER NOT NULL,
|
|
111
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
112
|
+
last_used_at TEXT
|
|
113
|
+
);
|
|
114
|
+
CREATE INDEX IF NOT EXISTS idx_oauth_refresh_user ON oauth_refresh_tokens(user_id);
|
|
115
|
+
`);
|
|
116
|
+
}
|
|
117
|
+
// ── Consent binding (signed blob carried through the consent screen) ──
|
|
118
|
+
signConsent(payload) {
|
|
119
|
+
return this.consentSigner.sign(payload);
|
|
120
|
+
}
|
|
121
|
+
verifyConsent(token) {
|
|
122
|
+
return this.consentSigner.verify(token);
|
|
123
|
+
}
|
|
124
|
+
// ── Dynamic client registration ──
|
|
125
|
+
registerClient(input, opts) {
|
|
126
|
+
const name = (input.client_name || '').trim();
|
|
127
|
+
if (!name || name.length > MAX_FIELD_LEN) {
|
|
128
|
+
throw new OAuthRegistrationError('invalid_client_metadata', 'client_name is required');
|
|
129
|
+
}
|
|
130
|
+
const uris = Array.isArray(input.redirect_uris) ? input.redirect_uris : [];
|
|
131
|
+
if (uris.length === 0 || uris.length > MAX_REDIRECT_URIS) {
|
|
132
|
+
throw new OAuthRegistrationError('invalid_redirect_uri', `redirect_uris must be 1..${MAX_REDIRECT_URIS} entries`);
|
|
133
|
+
}
|
|
134
|
+
for (const uri of uris) {
|
|
135
|
+
if (!isValidRedirectUri(uri, opts)) {
|
|
136
|
+
throw new OAuthRegistrationError('invalid_redirect_uri', `invalid redirect_uri: ${uri}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const client_id = `oc_${randomBytes(16).toString('hex')}`;
|
|
140
|
+
this.db.prepare('INSERT INTO oauth_clients (client_id, client_name, redirect_uris) VALUES (?, ?, ?)').run(client_id, name, JSON.stringify(uris));
|
|
141
|
+
return { client_id, client_name: name, redirect_uris: uris, created_at: new Date().toISOString() };
|
|
142
|
+
}
|
|
143
|
+
getClient(clientId) {
|
|
144
|
+
if (!clientId)
|
|
145
|
+
return null;
|
|
146
|
+
const row = this.db.prepare('SELECT client_id, client_name, redirect_uris, created_at FROM oauth_clients WHERE client_id = ?').get(clientId);
|
|
147
|
+
if (!row)
|
|
148
|
+
return null;
|
|
149
|
+
let uris = [];
|
|
150
|
+
try {
|
|
151
|
+
uris = JSON.parse(row.redirect_uris);
|
|
152
|
+
}
|
|
153
|
+
catch { /* corrupt row → empty */ }
|
|
154
|
+
return { client_id: row.client_id, client_name: row.client_name, redirect_uris: uris, created_at: row.created_at };
|
|
155
|
+
}
|
|
156
|
+
/** Exact-match redirect_uri against the client's registered set (RFC 8252). */
|
|
157
|
+
clientAllowsRedirect(clientId, redirectUri) {
|
|
158
|
+
const client = this.getClient(clientId);
|
|
159
|
+
if (!client)
|
|
160
|
+
return false;
|
|
161
|
+
return client.redirect_uris.includes(redirectUri);
|
|
162
|
+
}
|
|
163
|
+
// ── Authorization codes ──
|
|
164
|
+
saveCode(input) {
|
|
165
|
+
const code = `oac_${randomBytes(32).toString('hex')}`;
|
|
166
|
+
this.db.prepare(`INSERT INTO oauth_auth_codes
|
|
167
|
+
(code_hash, client_id, user_id, redirect_uri, code_challenge, scope, resource, expires_at)
|
|
168
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(sha256(code), input.client_id, input.user_id, input.redirect_uri, input.code_challenge, input.scope, input.resource, Date.now() + CODE_TTL_MS);
|
|
169
|
+
return code;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Single-use exchange: atomically read the row and delete it. Returns null if
|
|
173
|
+
* the code is unknown, already consumed, or expired. The delete-inside-the-
|
|
174
|
+
* transaction is what makes a replayed/parallel exchange fail.
|
|
175
|
+
*/
|
|
176
|
+
consumeCode(rawCode) {
|
|
177
|
+
if (!rawCode)
|
|
178
|
+
return null;
|
|
179
|
+
const hash = sha256(rawCode);
|
|
180
|
+
const tx = this.db.transaction((h) => {
|
|
181
|
+
const row = this.db.prepare(`SELECT client_id, user_id, redirect_uri, code_challenge, scope, resource, expires_at
|
|
182
|
+
FROM oauth_auth_codes WHERE code_hash = ?`).get(h);
|
|
183
|
+
if (!row)
|
|
184
|
+
return null;
|
|
185
|
+
this.db.prepare('DELETE FROM oauth_auth_codes WHERE code_hash = ?').run(h);
|
|
186
|
+
if (row.expires_at < Date.now())
|
|
187
|
+
return null;
|
|
188
|
+
return {
|
|
189
|
+
client_id: row.client_id, user_id: row.user_id, redirect_uri: row.redirect_uri,
|
|
190
|
+
code_challenge: row.code_challenge, scope: row.scope, resource: row.resource,
|
|
191
|
+
};
|
|
192
|
+
});
|
|
193
|
+
return tx(hash);
|
|
194
|
+
}
|
|
195
|
+
// ── PKCE (S256 only) ──
|
|
196
|
+
static verifyPkce(codeChallenge, codeVerifier) {
|
|
197
|
+
if (!codeChallenge || !codeVerifier)
|
|
198
|
+
return false;
|
|
199
|
+
const computed = createHash('sha256').update(codeVerifier).digest('base64url');
|
|
200
|
+
const a = Buffer.from(computed);
|
|
201
|
+
const b = Buffer.from(codeChallenge);
|
|
202
|
+
if (a.length !== b.length)
|
|
203
|
+
return false;
|
|
204
|
+
return timingSafeEqual(a, b);
|
|
205
|
+
}
|
|
206
|
+
// ── Refresh tokens ──
|
|
207
|
+
insertRefresh(userId, clientId, scope) {
|
|
208
|
+
const token = `sgr_${randomBytes(32).toString('hex')}`;
|
|
209
|
+
this.db.prepare(`INSERT INTO oauth_refresh_tokens (token_hash, client_id, user_id, scope, expires_at)
|
|
210
|
+
VALUES (?, ?, ?, ?, ?)`).run(sha256(token), clientId, userId, scope, Date.now() + REFRESH_TTL_MS);
|
|
211
|
+
return token;
|
|
212
|
+
}
|
|
213
|
+
createRefreshToken(userId, clientId, scope) {
|
|
214
|
+
return this.insertRefresh(userId, clientId, scope);
|
|
215
|
+
}
|
|
216
|
+
/** Resolve a raw refresh token to its grant, bumping last_used_at. */
|
|
217
|
+
verifyRefreshToken(rawToken) {
|
|
218
|
+
if (!rawToken)
|
|
219
|
+
return null;
|
|
220
|
+
const hash = sha256(rawToken);
|
|
221
|
+
const row = this.db.prepare('SELECT client_id, user_id, scope, expires_at FROM oauth_refresh_tokens WHERE token_hash = ?').get(hash);
|
|
222
|
+
if (!row)
|
|
223
|
+
return null;
|
|
224
|
+
if (row.expires_at < Date.now())
|
|
225
|
+
return null;
|
|
226
|
+
const user = this.resolveUser(row.user_id);
|
|
227
|
+
if (!user)
|
|
228
|
+
return null;
|
|
229
|
+
this.db.prepare("UPDATE oauth_refresh_tokens SET last_used_at = datetime('now') WHERE token_hash = ?").run(hash);
|
|
230
|
+
return { user, clientId: row.client_id, scope: row.scope };
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Rotate: atomically consume the presented refresh token and issue a new one.
|
|
234
|
+
* Returns the new raw refresh token + grant, or null if the presented token
|
|
235
|
+
* is unknown/expired (replay of an already-rotated token therefore fails).
|
|
236
|
+
*
|
|
237
|
+
* `expectedClientId` is validated INSIDE the transaction, BEFORE the row is
|
|
238
|
+
* deleted: a token presented with the wrong client_id is rejected without
|
|
239
|
+
* consuming the victim's still-valid grant (no griefing-by-invalidation).
|
|
240
|
+
*/
|
|
241
|
+
rotateRefreshToken(rawToken, expectedClientId) {
|
|
242
|
+
if (!rawToken)
|
|
243
|
+
return null;
|
|
244
|
+
const hash = sha256(rawToken);
|
|
245
|
+
const tx = this.db.transaction((h) => {
|
|
246
|
+
const row = this.db.prepare('SELECT client_id, user_id, scope, expires_at FROM oauth_refresh_tokens WHERE token_hash = ?').get(h);
|
|
247
|
+
if (!row)
|
|
248
|
+
return null;
|
|
249
|
+
// Validate client binding before deleting — a mismatch must NOT consume
|
|
250
|
+
// the token (it may belong to a victim and still be valid for them).
|
|
251
|
+
if (expectedClientId !== undefined && row.client_id !== expectedClientId)
|
|
252
|
+
return null;
|
|
253
|
+
this.db.prepare('DELETE FROM oauth_refresh_tokens WHERE token_hash = ?').run(h);
|
|
254
|
+
if (row.expires_at < Date.now())
|
|
255
|
+
return null;
|
|
256
|
+
const user = this.resolveUser(row.user_id);
|
|
257
|
+
if (!user)
|
|
258
|
+
return null;
|
|
259
|
+
const refreshToken = this.insertRefresh(row.user_id, row.client_id, row.scope);
|
|
260
|
+
return { refreshToken, user, clientId: row.client_id, scope: row.scope };
|
|
261
|
+
});
|
|
262
|
+
return tx(hash);
|
|
263
|
+
}
|
|
264
|
+
revokeRefreshToken(rawToken) {
|
|
265
|
+
if (!rawToken)
|
|
266
|
+
return false;
|
|
267
|
+
const res = this.db.prepare('DELETE FROM oauth_refresh_tokens WHERE token_hash = ?').run(sha256(rawToken));
|
|
268
|
+
return res.changes > 0;
|
|
269
|
+
}
|
|
270
|
+
/** Grants for a user — backs the deferred Settings "connected apps" view. */
|
|
271
|
+
listGrantsForUser(userId) {
|
|
272
|
+
return this.db.prepare(`SELECT r.client_id AS client_id, c.client_name AS client_name, r.scope AS scope,
|
|
273
|
+
r.created_at AS created_at, r.last_used_at AS last_used_at
|
|
274
|
+
FROM oauth_refresh_tokens r
|
|
275
|
+
LEFT JOIN oauth_clients c ON c.client_id = r.client_id
|
|
276
|
+
WHERE r.user_id = ? AND r.expires_at >= ?
|
|
277
|
+
ORDER BY r.created_at DESC`).all(userId, Date.now());
|
|
278
|
+
}
|
|
279
|
+
// ── Access token (JWT) ──
|
|
280
|
+
/**
|
|
281
|
+
* Mint a ~1h access JWT. `cid` is the stable client_id (not the mutable
|
|
282
|
+
* display name); `aud` binds the token to the canonical `/mcp` resource so
|
|
283
|
+
* the auth hook can refuse it on non-MCP routes.
|
|
284
|
+
*/
|
|
285
|
+
createAccessToken(user, clientId, resource) {
|
|
286
|
+
return jwt.sign({ userId: user.id, email: user.email, role: user.role, oauth: true, cid: clientId, aud: resource }, this.jwtSecret, { expiresIn: ACCESS_TOKEN_TTL });
|
|
287
|
+
}
|
|
288
|
+
/** Issue the full token set after a successful code exchange. */
|
|
289
|
+
issueTokens(user, clientId, scope, resource) {
|
|
290
|
+
const access_token = this.createAccessToken(user, clientId, resource);
|
|
291
|
+
const refresh_token = this.createRefreshToken(user.id, clientId, scope);
|
|
292
|
+
this.db.prepare("UPDATE oauth_clients SET last_token_at = datetime('now') WHERE client_id = ?").run(clientId);
|
|
293
|
+
return { access_token, refresh_token, token_type: 'Bearer', expires_in: 3600, scope };
|
|
294
|
+
}
|
|
295
|
+
// ── Garbage collection (called opportunistically from /oauth/token) ──
|
|
296
|
+
gcStale() {
|
|
297
|
+
const now = Date.now();
|
|
298
|
+
try {
|
|
299
|
+
this.db.prepare('DELETE FROM oauth_auth_codes WHERE expires_at < ?').run(now);
|
|
300
|
+
this.db.prepare('DELETE FROM oauth_refresh_tokens WHERE expires_at < ?').run(now);
|
|
301
|
+
// Orphan clients: registered >24h ago and never used to mint a token.
|
|
302
|
+
this.db.prepare(`DELETE FROM oauth_clients
|
|
303
|
+
WHERE last_token_at IS NULL
|
|
304
|
+
AND created_at < datetime('now', ?)`).run(`-${Math.floor(CLIENT_GC_AGE_MS / 1000)} seconds`);
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
// GC must never block token issuance.
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
export class OAuthRegistrationError extends Error {
|
|
312
|
+
code;
|
|
313
|
+
constructor(code, message) {
|
|
314
|
+
super(message);
|
|
315
|
+
this.code = code;
|
|
316
|
+
this.name = 'OAuthRegistrationError';
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=oauth-server-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-server-store.js","sourceRoot":"","sources":["../../src/services/oauth-server-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAc,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC9E,OAAO,GAAG,MAAM,cAAc,CAAC;AAE/B,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAsB,MAAM,wBAAwB,CAAC;AAE1G,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,CAAoB,4BAA4B;AAC3E,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,+BAA+B;AAChF,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAE,iCAAiC;AAChF,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,aAAa,GAAG,IAAI,CAAC;AA2C3B,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,IAAkC;IAChF,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,aAAa;QAAE,OAAO,KAAK,CAAC;IAC5F,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,GAAG,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC,CAAkB,iCAAiC;IAC9E,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,CAAI,eAAe;IAC5D,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,EAAE,aAAa,EAAE,CAAC;QACpD,OAAO,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC;IAClG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,OAAO,gBAAgB;IACnB,EAAE,CAAoB;IACtB,SAAS,CAAS;IAClB,WAAW,CAAsC;IACjD,aAAa,CAAgB;IAErC,YAAY,IAIX;QACC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8BZ,CAAC,CAAC;IACL,CAAC;IAED,yEAAyE;IAEzE,WAAW,CAAC,OAAgC;QAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,oCAAoC;IAEpC,cAAc,CAAC,KAAuD,EAAE,IAAkC;QACxG,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;YACzC,MAAM,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;YACzD,MAAM,IAAI,sBAAsB,CAAC,sBAAsB,EAAE,4BAA4B,iBAAiB,UAAU,CAAC,CAAC;QACpH,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,sBAAsB,CAAC,sBAAsB,EAAE,yBAAyB,GAAG,EAAE,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,OAAO,CACb,oFAAoF,CACrF,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IACrG,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,iGAAiG,CAClG,CAAC,GAAG,CAAC,QAAQ,CAAsG,CAAC;QACrH,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,IAAI,GAAa,EAAE,CAAC;QACxB,IAAI,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;QACjF,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;IACrH,CAAC;IAED,+EAA+E;IAC/E,oBAAoB,CAAC,QAAgB,EAAE,WAAmB;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC;IAED,4BAA4B;IAE5B,QAAQ,CAAC,KAAoB;QAC3B,MAAM,IAAI,GAAG,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,EAAE,CAAC,OAAO,CACb;;uCAEiC,CAClC,CAAC,GAAG,CACH,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,EAChE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAC5E,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,OAAe;QACzB,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAS,EAAuB,EAAE;YAChE,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB;qDAC6C,CAC9C,CAAC,GAAG,CAAC,CAAC,CAEM,CAAC;YACd,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3E,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE;gBAAE,OAAO,IAAI,CAAC;YAC7C,OAAO;gBACL,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9E,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ;aAC7E,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,yBAAyB;IAEzB,MAAM,CAAC,UAAU,CAAC,aAAqB,EAAE,YAAoB;QAC3D,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QAClD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACxC,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,uBAAuB;IAEf,aAAa,CAAC,MAAc,EAAE,QAAgB,EAAE,KAAa;QACnE,MAAM,KAAK,GAAG,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,EAAE,CAAC,OAAO,CACb;8BACwB,CACzB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB,CAAC,MAAc,EAAE,QAAgB,EAAE,KAAa;QAChE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,sEAAsE;IACtE,kBAAkB,CAAC,QAAgB;QACjC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,6FAA6F,CAC9F,CAAC,GAAG,CAAC,IAAI,CAA0F,CAAC;QACrG,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE;YAAE,OAAO,IAAI,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qFAAqF,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IAC7D,CAAC;IAED;;;;;;;;OAQG;IACH,kBAAkB,CAAC,QAAgB,EAAE,gBAAyB;QAC5D,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAS,EAAE,EAAE;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,6FAA6F,CAC9F,CAAC,GAAG,CAAC,CAAC,CAA0F,CAAC;YAClG,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,wEAAwE;YACxE,qEAAqE;YACrE,IAAI,gBAAgB,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,KAAK,gBAAgB;gBAAE,OAAO,IAAI,CAAC;YACtF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChF,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE;gBAAE,OAAO,IAAI,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/E,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAC3E,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,kBAAkB,CAAC,QAAgB;QACjC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3G,OAAO,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,6EAA6E;IAC7E,iBAAiB,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CACpB;;;;;mCAK6B,CAC9B,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAiB,CAAC;IAC5C,CAAC;IAED,2BAA2B;IAE3B;;;;OAIG;IACH,iBAAiB,CAAC,IAAc,EAAE,QAAgB,EAAE,QAAgB;QAClE,OAAO,GAAG,CAAC,IAAI,CACb,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,EAClG,IAAI,CAAC,SAAS,EACd,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAChC,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,WAAW,CAAC,IAAc,EAAE,QAAgB,EAAE,KAAa,EAAE,QAAgB;QAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtE,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9G,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACxF,CAAC;IAED,wEAAwE;IAExE,OAAO;QACL,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9E,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClF,sEAAsE;YACtE,IAAI,CAAC,EAAE,CAAC,OAAO,CACb;;gDAEwC,CACzC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC5B;IAAnB,YAAmB,IAAY,EAAE,OAAe;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,SAAI,GAAJ,IAAI,CAAQ;QAE7B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -14,7 +14,7 @@ import { MarkdownService, slugifyWikilink } from './markdown.js';
|
|
|
14
14
|
*/
|
|
15
15
|
function buildReferencedSet(manager, markdown) {
|
|
16
16
|
const referenced = new Set();
|
|
17
|
-
const allRepos = manager.
|
|
17
|
+
const allRepos = manager.getContentRepoConfigs();
|
|
18
18
|
for (const repoConfig of allRepos) {
|
|
19
19
|
let graph;
|
|
20
20
|
try {
|
|
@@ -42,7 +42,7 @@ function buildReferencedSet(manager, markdown) {
|
|
|
42
42
|
export function findOrphans(manager, filters) {
|
|
43
43
|
const markdown = new MarkdownService();
|
|
44
44
|
const referenced = buildReferencedSet(manager, markdown);
|
|
45
|
-
const allRepos = manager.
|
|
45
|
+
const allRepos = manager.getContentRepoConfigs();
|
|
46
46
|
const repos = filters?.repos
|
|
47
47
|
? allRepos.filter(r => filters.repos.includes(r.name))
|
|
48
48
|
: allRepos;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orphan-service.js","sourceRoot":"","sources":["../../src/services/orphan-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAwBjE;;;GAGG;AACH,SAAS,kBAAkB,CACzB,OAAyB,EACzB,QAAyB;IAEzB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"orphan-service.js","sourceRoot":"","sources":["../../src/services/orphan-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Workspace } from '../core/workspace.js';
|
|
2
|
+
import type { AuthService, AuthUser } from './auth-service.js';
|
|
3
|
+
/**
|
|
4
|
+
* Register the user's personal "My Folder" folder and grant them admin
|
|
5
|
+
* folder_access. Idempotent — safe to call repeatedly and on existing
|
|
6
|
+
* workspaces where the folder was provisioned before this helper existed
|
|
7
|
+
* (repairs the missing folder_access row).
|
|
8
|
+
*
|
|
9
|
+
* Consolidated from four earlier call sites that each did half the work:
|
|
10
|
+
* setup endpoint, /api/auth/users POST, server startup sweep, and
|
|
11
|
+
* `studiograph user add` CLI. Skipping the grant left the user's own
|
|
12
|
+
* personal folder invisible in the sidebar because `getAccessibleRepos()`
|
|
13
|
+
* filters by folder_access.
|
|
14
|
+
*/
|
|
15
|
+
export declare function ensurePersonalFolder(workspace: Workspace, authService: AuthService, user: AuthUser): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Convert a departed user's personal folder into a normal (non-personal)
|
|
18
|
+
* archive folder owned by the actor who deleted them. Matches Google
|
|
19
|
+
* Drive's inherit-on-delete model: the content survives, the owner is
|
|
20
|
+
* reassigned, and the "personal" semantics fall away so the folder
|
|
21
|
+
* doesn't clash with the one-personal-folder-per-user invariant.
|
|
22
|
+
*
|
|
23
|
+
* Mutations applied (in order, best-effort non-atomic):
|
|
24
|
+
* 1. Pick a collision-free new name: `archive-{slug}-{YYYY-MM-DD}`,
|
|
25
|
+
* escalating to `-2`, `-3`, … if needed.
|
|
26
|
+
* 2. Rename the folder directory on disk.
|
|
27
|
+
* 3. Update workspace.json: new name/path, display_name, clear the
|
|
28
|
+
* personal/owner_id flags, and write the new `.studiograph` marker.
|
|
29
|
+
* 4. Update folder_access rows to the new name so the actor's inherited
|
|
30
|
+
* admin row keeps working.
|
|
31
|
+
* 5. Push the updated workspace.json to the config remote (non-fatal).
|
|
32
|
+
*
|
|
33
|
+
* Returns the new folder name and display name so the caller can report
|
|
34
|
+
* them to the UI. The caller should `workspaceManager.reloadConfig()`
|
|
35
|
+
* after this completes to surface the change to in-memory graph state.
|
|
36
|
+
*/
|
|
37
|
+
export declare function archivePersonalFolder(workspace: Workspace, oldName: string, targetDisplayName: string, authService: AuthService): Promise<{
|
|
38
|
+
newName: string;
|
|
39
|
+
newDisplayName: string;
|
|
40
|
+
}>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { existsSync, renameSync, writeFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Register the user's personal "My Folder" folder and grant them admin
|
|
5
|
+
* folder_access. Idempotent — safe to call repeatedly and on existing
|
|
6
|
+
* workspaces where the folder was provisioned before this helper existed
|
|
7
|
+
* (repairs the missing folder_access row).
|
|
8
|
+
*
|
|
9
|
+
* Consolidated from four earlier call sites that each did half the work:
|
|
10
|
+
* setup endpoint, /api/auth/users POST, server startup sweep, and
|
|
11
|
+
* `studiograph user add` CLI. Skipping the grant left the user's own
|
|
12
|
+
* personal folder invisible in the sidebar because `getAccessibleRepos()`
|
|
13
|
+
* filters by folder_access.
|
|
14
|
+
*/
|
|
15
|
+
export async function ensurePersonalFolder(workspace, authService, user) {
|
|
16
|
+
const folderName = `entries-${user.id}`;
|
|
17
|
+
const config = await workspace.loadConfig();
|
|
18
|
+
const alreadyRegistered = config.repos.some(r => r.name === folderName);
|
|
19
|
+
if (!alreadyRegistered) {
|
|
20
|
+
await workspace.registerRepo({
|
|
21
|
+
name: folderName,
|
|
22
|
+
display_name: 'My Folder',
|
|
23
|
+
description: `Personal entries for ${user.displayName}`,
|
|
24
|
+
personal: true,
|
|
25
|
+
owner_id: user.id,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const hasAccess = authService.getUserFolders(user.id).includes(folderName);
|
|
29
|
+
if (!hasAccess) {
|
|
30
|
+
authService.grantFolderAccess(user.id, folderName, 'admin');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Convert a departed user's personal folder into a normal (non-personal)
|
|
35
|
+
* archive folder owned by the actor who deleted them. Matches Google
|
|
36
|
+
* Drive's inherit-on-delete model: the content survives, the owner is
|
|
37
|
+
* reassigned, and the "personal" semantics fall away so the folder
|
|
38
|
+
* doesn't clash with the one-personal-folder-per-user invariant.
|
|
39
|
+
*
|
|
40
|
+
* Mutations applied (in order, best-effort non-atomic):
|
|
41
|
+
* 1. Pick a collision-free new name: `archive-{slug}-{YYYY-MM-DD}`,
|
|
42
|
+
* escalating to `-2`, `-3`, … if needed.
|
|
43
|
+
* 2. Rename the folder directory on disk.
|
|
44
|
+
* 3. Update workspace.json: new name/path, display_name, clear the
|
|
45
|
+
* personal/owner_id flags, and write the new `.studiograph` marker.
|
|
46
|
+
* 4. Update folder_access rows to the new name so the actor's inherited
|
|
47
|
+
* admin row keeps working.
|
|
48
|
+
* 5. Push the updated workspace.json to the config remote (non-fatal).
|
|
49
|
+
*
|
|
50
|
+
* Returns the new folder name and display name so the caller can report
|
|
51
|
+
* them to the UI. The caller should `workspaceManager.reloadConfig()`
|
|
52
|
+
* after this completes to surface the change to in-memory graph state.
|
|
53
|
+
*/
|
|
54
|
+
export async function archivePersonalFolder(workspace, oldName, targetDisplayName, authService) {
|
|
55
|
+
const config = await workspace.loadConfig();
|
|
56
|
+
const repo = config.repos.find(r => r.name === oldName);
|
|
57
|
+
if (!repo) {
|
|
58
|
+
throw new Error(`Cannot archive '${oldName}' — folder not found in workspace config`);
|
|
59
|
+
}
|
|
60
|
+
if (!repo.personal) {
|
|
61
|
+
throw new Error(`Cannot archive '${oldName}' — not a personal folder`);
|
|
62
|
+
}
|
|
63
|
+
const slug = slugify(targetDisplayName);
|
|
64
|
+
const date = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
|
65
|
+
const baseName = `archive-${slug}-${date}`;
|
|
66
|
+
let newName = baseName;
|
|
67
|
+
let suffix = 2;
|
|
68
|
+
while (config.repos.some(r => r.name === newName)) {
|
|
69
|
+
newName = `${baseName}-${suffix}`;
|
|
70
|
+
suffix += 1;
|
|
71
|
+
}
|
|
72
|
+
const wsPath = workspace.workspacePath;
|
|
73
|
+
const oldPath = join(wsPath, repo.path);
|
|
74
|
+
const newPath = join(wsPath, newName);
|
|
75
|
+
if (existsSync(oldPath)) {
|
|
76
|
+
renameSync(oldPath, newPath);
|
|
77
|
+
}
|
|
78
|
+
repo.name = newName;
|
|
79
|
+
repo.path = newName;
|
|
80
|
+
repo.display_name = `Archive: ${targetDisplayName} (${date})`;
|
|
81
|
+
delete repo.personal;
|
|
82
|
+
delete repo.owner_id;
|
|
83
|
+
const markerPath = join(newPath, '.studiograph');
|
|
84
|
+
if (existsSync(markerPath)) {
|
|
85
|
+
writeFileSync(markerPath, JSON.stringify({ repo_name: newName }, null, 2), 'utf-8');
|
|
86
|
+
}
|
|
87
|
+
workspace.writeConfig(config);
|
|
88
|
+
authService.renameFolder(oldName, newName);
|
|
89
|
+
workspace.pushWorkspaceConfig(`Archive personal folder on user delete: ${oldName} → ${newName}`);
|
|
90
|
+
return { newName, newDisplayName: repo.display_name };
|
|
91
|
+
}
|
|
92
|
+
function slugify(name) {
|
|
93
|
+
const cleaned = name
|
|
94
|
+
.normalize('NFKD')
|
|
95
|
+
.replace(/[̀-ͯ]/g, '') // strip combining diacritics
|
|
96
|
+
.toLowerCase()
|
|
97
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
98
|
+
.replace(/^-+|-+$/g, '');
|
|
99
|
+
return cleaned || 'user';
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=personal-folder.js.map
|