studiograph 1.3.48-next.21 → 1.3.48-next.211
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -16
- package/dist/agent/agent-pool.d.ts +87 -3
- package/dist/agent/agent-pool.js +188 -15
- package/dist/agent/agent-pool.js.map +1 -1
- package/dist/agent/followups.d.ts +34 -0
- package/dist/agent/followups.js +52 -0
- package/dist/agent/followups.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +101 -4
- package/dist/agent/orchestrator.js +464 -66
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +34 -0
- package/dist/agent/prompts/entity-types-section.js +76 -0
- package/dist/agent/prompts/entity-types-section.js.map +1 -0
- package/dist/agent/prompts/system.md +112 -54
- package/dist/agent/skill-loader.d.ts +30 -17
- package/dist/agent/skill-loader.js +63 -30
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/skills/artifact-canvas/skill.md +152 -0
- package/dist/agent/skills/entity-schema.md +75 -431
- package/dist/agent/skills/interview/entity-templates.md +38 -37
- package/dist/agent/skills/interview/question-domains.md +54 -49
- package/dist/agent/skills/interview/skill.md +84 -16
- package/dist/agent/skills/schema-rules.md +28 -28
- package/dist/agent/tools/artifact-tools.d.ts +124 -0
- package/dist/agent/tools/artifact-tools.js +207 -0
- package/dist/agent/tools/artifact-tools.js.map +1 -0
- package/dist/agent/tools/capture-tools.d.ts +31 -0
- package/dist/agent/tools/capture-tools.js +40 -0
- package/dist/agent/tools/capture-tools.js.map +1 -0
- package/dist/agent/tools/folder-tools.d.ts +47 -0
- package/dist/agent/tools/folder-tools.js +249 -0
- package/dist/agent/tools/folder-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +6 -5
- package/dist/agent/tools/fs-tools.js +5 -5
- package/dist/agent/tools/fs-tools.js.map +1 -1
- package/dist/agent/tools/graph-tools.d.ts +48 -72
- package/dist/agent/tools/graph-tools.js +852 -329
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/history-tools.d.ts +95 -0
- package/dist/agent/tools/history-tools.js +461 -0
- package/dist/agent/tools/history-tools.js.map +1 -0
- package/dist/agent/tools/load-skill.d.ts +6 -5
- package/dist/agent/tools/load-skill.js +3 -3
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +5 -4
- package/dist/agent/tools/ops-tools.js +130 -236
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +87 -17
- package/dist/agent/tools/permission-tools.js +233 -43
- package/dist/agent/tools/permission-tools.js.map +1 -1
- package/dist/agent/tools/tool-loader.js +5 -4
- package/dist/agent/tools/tool-loader.js.map +1 -1
- package/dist/agent/tools/web-tools.js +58 -9
- package/dist/agent/tools/web-tools.js.map +1 -1
- package/dist/cli/commands/about.d.ts +1 -0
- package/dist/cli/commands/about.js +55 -3
- package/dist/cli/commands/about.js.map +1 -1
- package/dist/cli/commands/admin/audit-workspace.d.ts +23 -0
- package/dist/cli/commands/admin/audit-workspace.js +133 -0
- package/dist/cli/commands/admin/audit-workspace.js.map +1 -0
- package/dist/cli/commands/admin/audit.d.ts +21 -0
- package/dist/cli/commands/admin/audit.js +174 -0
- package/dist/cli/commands/admin/audit.js.map +1 -0
- package/dist/cli/commands/admin/backup.d.ts +54 -0
- package/dist/cli/commands/admin/backup.js +207 -0
- package/dist/cli/commands/admin/backup.js.map +1 -0
- package/dist/cli/commands/admin/folder.d.ts +11 -0
- package/dist/cli/commands/{collection.js → admin/folder.js} +33 -32
- package/dist/cli/commands/admin/folder.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +16 -0
- package/dist/cli/commands/admin/index.js +46 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate-assets.d.ts +53 -0
- package/dist/cli/commands/admin/migrate-assets.js +184 -0
- package/dist/cli/commands/admin/migrate-assets.js.map +1 -0
- package/dist/cli/commands/admin/migrate.d.ts +56 -0
- package/dist/cli/commands/admin/migrate.js +263 -0
- package/dist/cli/commands/admin/migrate.js.map +1 -0
- package/dist/cli/commands/admin/restore.d.ts +24 -0
- package/dist/cli/commands/admin/restore.js +228 -0
- package/dist/cli/commands/admin/restore.js.map +1 -0
- package/dist/cli/commands/admin/secrets.d.ts +23 -0
- package/dist/cli/commands/admin/secrets.js +256 -0
- package/dist/cli/commands/admin/secrets.js.map +1 -0
- package/dist/cli/commands/admin/settings.d.ts +28 -0
- package/dist/cli/commands/admin/settings.js +284 -0
- package/dist/cli/commands/admin/settings.js.map +1 -0
- package/dist/cli/commands/admin/token.d.ts +42 -0
- package/dist/cli/commands/admin/token.js +126 -0
- package/dist/cli/commands/admin/token.js.map +1 -0
- package/dist/cli/commands/admin/transfer-ownership.d.ts +15 -0
- package/dist/cli/commands/admin/transfer-ownership.js +106 -0
- package/dist/cli/commands/admin/transfer-ownership.js.map +1 -0
- package/dist/cli/commands/admin/user.d.ts +11 -0
- package/dist/cli/commands/admin/user.js +187 -0
- package/dist/cli/commands/admin/user.js.map +1 -0
- package/dist/cli/commands/clone.d.ts +25 -3
- package/dist/cli/commands/clone.js +142 -36
- package/dist/cli/commands/clone.js.map +1 -1
- package/dist/cli/commands/config.d.ts +23 -107
- package/dist/cli/commands/config.js +52 -260
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/connector.d.ts +10 -13
- package/dist/cli/commands/connector.js +16 -58
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.js +215 -68
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/index.js +5 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +10 -30
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.js +54 -6
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/r2.d.ts +3 -0
- package/dist/cli/commands/r2.js +223 -204
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.js +65 -12
- package/dist/cli/commands/redeploy.js.map +1 -1
- package/dist/cli/commands/reset.d.ts +22 -6
- package/dist/cli/commands/reset.js +132 -34
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/serve.js +231 -26
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +237 -227
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/crypto-bundle.d.ts +39 -0
- package/dist/cli/crypto-bundle.js +94 -0
- package/dist/cli/crypto-bundle.js.map +1 -0
- package/dist/cli/index.js +24 -26
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/railway-pin.d.ts +68 -0
- package/dist/cli/railway-pin.js +96 -0
- package/dist/cli/railway-pin.js.map +1 -0
- package/dist/cli/railway-provisioning.d.ts +53 -0
- package/dist/cli/railway-provisioning.js +85 -0
- package/dist/cli/railway-provisioning.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +30 -49
- package/dist/cli/setup-wizard.js +39 -40
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/core/accent-palette.d.ts +22 -0
- package/dist/core/accent-palette.js +47 -0
- package/dist/core/accent-palette.js.map +1 -0
- package/dist/core/artifact-asset-urls.d.ts +51 -0
- package/dist/core/artifact-asset-urls.js +79 -0
- package/dist/core/artifact-asset-urls.js.map +1 -0
- package/dist/core/artifact-bundle.d.ts +69 -0
- package/dist/core/artifact-bundle.js +305 -0
- package/dist/core/artifact-bundle.js.map +1 -0
- package/dist/core/artifact-escape.d.ts +5 -0
- package/dist/core/artifact-escape.js +26 -0
- package/dist/core/artifact-escape.js.map +1 -0
- package/dist/core/artifact-export.d.ts +17 -0
- package/dist/core/artifact-export.js +529 -0
- package/dist/core/artifact-export.js.map +1 -0
- package/dist/core/cell-anchor.d.ts +29 -0
- package/dist/core/cell-anchor.js +53 -0
- package/dist/core/cell-anchor.js.map +1 -0
- package/dist/core/comment-anchor.d.ts +41 -0
- package/dist/core/comment-anchor.js +147 -0
- package/dist/core/comment-anchor.js.map +1 -0
- package/dist/core/commit-messages.d.ts +57 -0
- package/dist/core/commit-messages.js +85 -0
- package/dist/core/commit-messages.js.map +1 -0
- package/dist/core/embeds.d.ts +96 -0
- package/dist/core/embeds.js +196 -0
- package/dist/core/embeds.js.map +1 -0
- package/dist/core/entity-body-templates.d.ts +21 -0
- package/dist/core/entity-body-templates.js +67 -0
- package/dist/core/entity-body-templates.js.map +1 -0
- package/dist/core/entity-types-catalog.d.ts +65 -0
- package/dist/core/entity-types-catalog.js +142 -0
- package/dist/core/entity-types-catalog.js.map +1 -0
- package/dist/core/field-library.d.ts +62 -0
- package/dist/core/field-library.js +129 -0
- package/dist/core/field-library.js.map +1 -0
- package/dist/core/folder-paths.d.ts +41 -0
- package/dist/core/folder-paths.js +95 -0
- package/dist/core/folder-paths.js.map +1 -0
- package/dist/core/folder-sidecar.d.ts +36 -0
- package/dist/core/folder-sidecar.js +91 -0
- package/dist/core/folder-sidecar.js.map +1 -0
- package/dist/core/format-registry.d.ts +170 -0
- package/dist/core/format-registry.js +412 -0
- package/dist/core/format-registry.js.map +1 -0
- package/dist/core/graph.d.ts +773 -14
- package/dist/core/graph.js +2269 -308
- package/dist/core/graph.js.map +1 -1
- package/dist/core/history-diff.d.ts +35 -0
- package/dist/core/history-diff.js +114 -0
- package/dist/core/history-diff.js.map +1 -0
- package/dist/core/refs.d.ts +41 -0
- package/dist/core/refs.js +80 -0
- package/dist/core/refs.js.map +1 -0
- package/dist/core/schema-registry.d.ts +66 -0
- package/dist/core/schema-registry.js +198 -37
- package/dist/core/schema-registry.js.map +1 -1
- package/dist/core/schemas/connector.d.ts +67 -0
- package/dist/core/schemas/connector.js +100 -0
- package/dist/core/schemas/connector.js.map +1 -0
- package/dist/core/schemas/workspace.d.ts +122 -0
- package/dist/core/schemas/workspace.js +211 -0
- package/dist/core/schemas/workspace.js.map +1 -0
- package/dist/core/secrets/SecretStore.d.ts +77 -0
- package/dist/core/secrets/SecretStore.js +13 -0
- package/dist/core/secrets/SecretStore.js.map +1 -0
- package/dist/core/secrets/SettingsResolver.d.ts +54 -0
- package/dist/core/secrets/SettingsResolver.js +80 -0
- package/dist/core/secrets/SettingsResolver.js.map +1 -0
- package/dist/core/secrets/SettingsStore.d.ts +30 -0
- package/dist/core/secrets/SettingsStore.js +9 -0
- package/dist/core/secrets/SettingsStore.js.map +1 -0
- package/dist/core/secrets/SqliteEncryptedStore.d.ts +90 -0
- package/dist/core/secrets/SqliteEncryptedStore.js +598 -0
- package/dist/core/secrets/SqliteEncryptedStore.js.map +1 -0
- package/dist/core/secrets/audit.d.ts +36 -0
- package/dist/core/secrets/audit.js +60 -0
- package/dist/core/secrets/audit.js.map +1 -0
- package/dist/core/secrets/auth-db-migration.d.ts +129 -0
- package/dist/core/secrets/auth-db-migration.js +653 -0
- package/dist/core/secrets/auth-db-migration.js.map +1 -0
- package/dist/core/secrets/bundle.d.ts +141 -0
- package/dist/core/secrets/bundle.js +435 -0
- package/dist/core/secrets/bundle.js.map +1 -0
- package/dist/core/secrets/dual-write.d.ts +81 -0
- package/dist/core/secrets/dual-write.js +247 -0
- package/dist/core/secrets/dual-write.js.map +1 -0
- package/dist/core/secrets/encryption.d.ts +44 -0
- package/dist/core/secrets/encryption.js +97 -0
- package/dist/core/secrets/encryption.js.map +1 -0
- package/dist/core/secrets/index.d.ts +49 -0
- package/dist/core/secrets/index.js +74 -0
- package/dist/core/secrets/index.js.map +1 -0
- package/dist/core/secrets/master-key.d.ts +38 -0
- package/dist/core/secrets/master-key.js +122 -0
- package/dist/core/secrets/master-key.js.map +1 -0
- package/dist/core/secrets/probes/anthropic.d.ts +98 -0
- package/dist/core/secrets/probes/anthropic.js +300 -0
- package/dist/core/secrets/probes/anthropic.js.map +1 -0
- package/dist/core/secrets/probes/brave.d.ts +9 -0
- package/dist/core/secrets/probes/brave.js +15 -0
- package/dist/core/secrets/probes/brave.js.map +1 -0
- package/dist/core/secrets/probes/r2.d.ts +15 -0
- package/dist/core/secrets/probes/r2.js +14 -0
- package/dist/core/secrets/probes/r2.js.map +1 -0
- package/dist/core/secrets/probes/tavily.d.ts +18 -0
- package/dist/core/secrets/probes/tavily.js +58 -0
- package/dist/core/secrets/probes/tavily.js.map +1 -0
- package/dist/core/secrets/probes/voyage.d.ts +13 -0
- package/dist/core/secrets/probes/voyage.js +52 -0
- package/dist/core/secrets/probes/voyage.js.map +1 -0
- package/dist/core/secrets/r2-structural-migration.d.ts +39 -0
- package/dist/core/secrets/r2-structural-migration.js +109 -0
- package/dist/core/secrets/r2-structural-migration.js.map +1 -0
- package/dist/core/secrets/read-flip.d.ts +59 -0
- package/dist/core/secrets/read-flip.js +87 -0
- package/dist/core/secrets/read-flip.js.map +1 -0
- package/dist/core/secrets/registry.d.ts +188 -0
- package/dist/core/secrets/registry.js +616 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/types.d.ts +77 -483
- package/dist/core/types.js +25 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +75 -12
- package/dist/core/user-config.js +155 -14
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +786 -1373
- package/dist/core/validation.js +458 -147
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +87 -14
- package/dist/core/workspace-manager.js +222 -94
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +19 -5
- package/dist/core/workspace.js +67 -39
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/comment-virtual-entity.d.ts +36 -0
- package/dist/mcp/comment-virtual-entity.js +71 -0
- package/dist/mcp/comment-virtual-entity.js.map +1 -0
- package/dist/mcp/connector-manager.d.ts +72 -2
- package/dist/mcp/connector-manager.js +211 -32
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/oauth-provider.d.ts +0 -5
- package/dist/mcp/oauth-provider.js +10 -22
- package/dist/mcp/oauth-provider.js.map +1 -1
- package/dist/mcp/oauth-registry.d.ts +46 -8
- package/dist/mcp/oauth-registry.js +52 -13
- package/dist/mcp/oauth-registry.js.map +1 -1
- package/dist/mcp/server-discovery.d.ts +73 -0
- package/dist/mcp/server-discovery.js +164 -0
- package/dist/mcp/server-discovery.js.map +1 -0
- package/dist/mcp/server.d.ts +24 -3
- package/dist/mcp/server.js +53 -10
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/state-signer.d.ts +62 -0
- package/dist/mcp/state-signer.js +205 -0
- package/dist/mcp/state-signer.js.map +1 -0
- package/dist/mcp/stdio-proxy.d.ts +67 -0
- package/dist/mcp/stdio-proxy.js +149 -0
- package/dist/mcp/stdio-proxy.js.map +1 -0
- package/dist/mcp/tools.d.ts +65 -2
- package/dist/mcp/tools.js +1772 -124
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/__tests__/helpers/graph-api.d.ts +16 -0
- package/dist/server/__tests__/helpers/graph-api.js +16 -0
- package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
- package/dist/server/artifact-asset-mint.d.ts +41 -0
- package/dist/server/artifact-asset-mint.js +59 -0
- package/dist/server/artifact-asset-mint.js.map +1 -0
- package/dist/server/asset-index-queue.d.ts +98 -0
- package/dist/server/asset-index-queue.js +193 -0
- package/dist/server/asset-index-queue.js.map +1 -0
- package/dist/server/body-write-coordinator.d.ts +161 -0
- package/dist/server/body-write-coordinator.js +182 -0
- package/dist/server/body-write-coordinator.js.map +1 -0
- package/dist/server/cloud-billing-flow.d.ts +32 -0
- package/dist/server/cloud-billing-flow.js +75 -0
- package/dist/server/cloud-billing-flow.js.map +1 -0
- package/dist/server/commit-audit.d.ts +26 -0
- package/dist/server/commit-audit.js +30 -0
- package/dist/server/commit-audit.js.map +1 -0
- package/dist/server/index.d.ts +29 -3
- package/dist/server/index.js +657 -269
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/sanitize.d.ts +46 -0
- package/dist/server/middleware/sanitize.js +182 -0
- package/dist/server/middleware/sanitize.js.map +1 -0
- package/dist/server/routes/artifact-export-api.d.ts +11 -0
- package/dist/server/routes/artifact-export-api.js +159 -0
- package/dist/server/routes/artifact-export-api.js.map +1 -0
- package/dist/server/routes/asset-api.d.ts +76 -1
- package/dist/server/routes/asset-api.js +761 -61
- package/dist/server/routes/asset-api.js.map +1 -1
- package/dist/server/routes/audit-api.d.ts +24 -0
- package/dist/server/routes/audit-api.js +117 -0
- package/dist/server/routes/audit-api.js.map +1 -0
- package/dist/server/routes/auth-api.js +532 -63
- package/dist/server/routes/auth-api.js.map +1 -1
- package/dist/server/routes/capture-api.d.ts +10 -3
- package/dist/server/routes/capture-api.js +213 -25
- package/dist/server/routes/capture-api.js.map +1 -1
- package/dist/server/routes/chat-sessions-api.d.ts +13 -0
- package/dist/server/routes/chat-sessions-api.js +455 -0
- package/dist/server/routes/chat-sessions-api.js.map +1 -0
- package/dist/server/routes/chat.d.ts +35 -1
- package/dist/server/routes/chat.js +699 -54
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/comments-api.d.ts +15 -0
- package/dist/server/routes/comments-api.js +444 -0
- package/dist/server/routes/comments-api.js.map +1 -0
- package/dist/server/routes/config-api.d.ts +3 -2
- package/dist/server/routes/config-api.js +179 -49
- package/dist/server/routes/config-api.js.map +1 -1
- package/dist/server/routes/connectors-api.js +177 -42
- package/dist/server/routes/connectors-api.js.map +1 -1
- package/dist/server/routes/event-ingest-api.d.ts +15 -0
- package/dist/server/routes/{meeting-ingest-api.js → event-ingest-api.js} +35 -20
- package/dist/server/routes/event-ingest-api.js.map +1 -0
- package/dist/server/routes/field-library-api.d.ts +28 -0
- package/dist/server/routes/field-library-api.js +126 -0
- package/dist/server/routes/field-library-api.js.map +1 -0
- package/dist/server/routes/git-http.d.ts +2 -2
- package/dist/server/routes/git-http.js +86 -39
- package/dist/server/routes/git-http.js.map +1 -1
- package/dist/server/routes/graph-api-access.d.ts +57 -0
- package/dist/server/routes/graph-api-access.js +112 -0
- package/dist/server/routes/graph-api-access.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +1 -1
- package/dist/server/routes/graph-api.js +1455 -325
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/health.d.ts +18 -0
- package/dist/server/routes/health.js +74 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/import-batch.d.ts +24 -0
- package/dist/server/routes/import-batch.js +33 -0
- package/dist/server/routes/import-batch.js.map +1 -0
- package/dist/server/routes/insights-api.d.ts +9 -2
- package/dist/server/routes/insights-api.js +355 -61
- package/dist/server/routes/insights-api.js.map +1 -1
- package/dist/server/routes/mcp.d.ts +7 -3
- package/dist/server/routes/mcp.js +24 -8
- package/dist/server/routes/mcp.js.map +1 -1
- package/dist/server/routes/oauth-api.d.ts +67 -0
- package/dist/server/routes/oauth-api.js +421 -0
- package/dist/server/routes/oauth-api.js.map +1 -0
- package/dist/server/routes/permissions-api.d.ts +9 -2
- package/dist/server/routes/permissions-api.js +87 -31
- package/dist/server/routes/permissions-api.js.map +1 -1
- package/dist/server/routes/r2-api.d.ts +25 -0
- package/dist/server/routes/r2-api.js +276 -0
- package/dist/server/routes/r2-api.js.map +1 -0
- package/dist/server/routes/secrets-api.d.ts +36 -0
- package/dist/server/routes/secrets-api.js +308 -0
- package/dist/server/routes/secrets-api.js.map +1 -0
- package/dist/server/routes/settings-api.d.ts +29 -0
- package/dist/server/routes/settings-api.js +180 -0
- package/dist/server/routes/settings-api.js.map +1 -0
- package/dist/server/routes/share-api.d.ts +32 -0
- package/dist/server/routes/share-api.js +234 -0
- package/dist/server/routes/share-api.js.map +1 -0
- package/dist/server/routes/views-api.js +51 -0
- package/dist/server/routes/views-api.js.map +1 -1
- package/dist/server/routes/workspace-api.d.ts +2 -1
- package/dist/server/routes/workspace-api.js +142 -23
- package/dist/server/routes/workspace-api.js.map +1 -1
- package/dist/server/routes/ws.d.ts +3 -2
- package/dist/server/routes/ws.js +68 -17
- package/dist/server/routes/ws.js.map +1 -1
- package/dist/server/session-manager.d.ts +48 -5
- package/dist/server/session-manager.js +182 -14
- package/dist/server/session-manager.js.map +1 -1
- package/dist/server/ws-hub.d.ts +124 -37
- package/dist/server/ws-hub.js +0 -0
- package/dist/server/ws-hub.js.map +1 -1
- package/dist/server/yjs-manager.d.ts +278 -7
- package/dist/server/yjs-manager.js +830 -38
- package/dist/server/yjs-manager.js.map +1 -1
- package/dist/server/yjs-persistence.d.ts +165 -0
- package/dist/server/yjs-persistence.js +557 -0
- package/dist/server/yjs-persistence.js.map +1 -0
- package/dist/server/yjs-text-diff.d.ts +32 -0
- package/dist/server/yjs-text-diff.js +61 -0
- package/dist/server/yjs-text-diff.js.map +1 -0
- package/dist/services/access-control.d.ts +73 -0
- package/dist/services/access-control.js +165 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/artifact-asset-token.d.ts +69 -0
- package/dist/services/artifact-asset-token.js +94 -0
- package/dist/services/artifact-asset-token.js.map +1 -0
- package/dist/services/artifact-library-sources.d.ts +3 -0
- package/dist/services/artifact-library-sources.js +44 -0
- package/dist/services/artifact-library-sources.js.map +1 -0
- package/dist/services/artifact-render-export.d.ts +97 -0
- package/dist/services/artifact-render-export.js +467 -0
- package/dist/services/artifact-render-export.js.map +1 -0
- package/dist/services/asset-caption-service.d.ts +103 -0
- package/dist/services/asset-caption-service.js +186 -0
- package/dist/services/asset-caption-service.js.map +1 -0
- package/dist/services/asset-delete-authz.d.ts +31 -0
- package/dist/services/asset-delete-authz.js +61 -0
- package/dist/services/asset-delete-authz.js.map +1 -0
- package/dist/services/asset-finalize-service.d.ts +58 -0
- package/dist/services/asset-finalize-service.js +216 -0
- package/dist/services/asset-finalize-service.js.map +1 -0
- package/dist/services/asset-import-service.d.ts +111 -0
- package/dist/services/asset-import-service.js +394 -0
- package/dist/services/asset-import-service.js.map +1 -0
- package/dist/services/asset-index-sweep.d.ts +95 -0
- package/dist/services/asset-index-sweep.js +249 -0
- package/dist/services/asset-index-sweep.js.map +1 -0
- package/dist/services/asset-lifecycle-check.d.ts +22 -0
- package/dist/services/asset-lifecycle-check.js +80 -0
- package/dist/services/asset-lifecycle-check.js.map +1 -0
- package/dist/services/asset-listing.d.ts +72 -0
- package/dist/services/asset-listing.js +321 -0
- package/dist/services/asset-listing.js.map +1 -0
- package/dist/services/asset-presign-service.d.ts +68 -0
- package/dist/services/asset-presign-service.js +124 -0
- package/dist/services/asset-presign-service.js.map +1 -0
- package/dist/services/asset-sidecar-service.d.ts +28 -0
- package/dist/services/asset-sidecar-service.js +79 -0
- package/dist/services/asset-sidecar-service.js.map +1 -0
- package/dist/services/asset-upload-errors.d.ts +41 -0
- package/dist/services/asset-upload-errors.js +45 -0
- package/dist/services/asset-upload-errors.js.map +1 -0
- package/dist/services/asset-upload-service.d.ts +56 -0
- package/dist/services/asset-upload-service.js +200 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/asset-upload-token.d.ts +58 -0
- package/dist/services/asset-upload-token.js +75 -0
- package/dist/services/asset-upload-token.js.map +1 -0
- package/dist/services/assets/asset-index-service.d.ts +127 -0
- package/dist/services/assets/asset-index-service.js +227 -0
- package/dist/services/assets/asset-index-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +128 -2
- package/dist/services/assets/base.js +98 -1
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +114 -1
- package/dist/services/assets/index.js +221 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +16 -1
- package/dist/services/assets/local.js +110 -1
- package/dist/services/assets/local.js.map +1 -1
- package/dist/services/assets/r2-sync.d.ts +88 -0
- package/dist/services/assets/r2-sync.js +412 -0
- package/dist/services/assets/r2-sync.js.map +1 -0
- package/dist/services/assets/r2.d.ts +87 -1
- package/dist/services/assets/r2.js +203 -1
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +312 -45
- package/dist/services/auth-service.js +1011 -195
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/chat-session-service.d.ts +188 -0
- package/dist/services/chat-session-service.js +512 -0
- package/dist/services/chat-session-service.js.map +1 -0
- package/dist/services/cloud-inference-billing.d.ts +64 -0
- package/dist/services/cloud-inference-billing.js +313 -0
- package/dist/services/cloud-inference-billing.js.map +1 -0
- package/dist/services/comment-service.d.ts +97 -0
- package/dist/services/comment-service.js +341 -0
- package/dist/services/comment-service.js.map +1 -0
- package/dist/services/comment-virtual-entity.d.ts +36 -0
- package/dist/services/comment-virtual-entity.js +71 -0
- package/dist/services/comment-virtual-entity.js.map +1 -0
- package/dist/services/convert-service.d.ts +64 -0
- package/dist/services/convert-service.js +68 -0
- package/dist/services/convert-service.js.map +1 -0
- package/dist/services/csv-service.d.ts +22 -17
- package/dist/services/csv-service.js +55 -92
- package/dist/services/csv-service.js.map +1 -1
- package/dist/services/entity-mutations.d.ts +213 -0
- package/dist/services/entity-mutations.js +380 -0
- package/dist/services/entity-mutations.js.map +1 -0
- package/dist/services/{meeting-processor.d.ts → event-processor.d.ts} +15 -8
- package/dist/services/{meeting-processor.js → event-processor.js} +124 -65
- package/dist/services/event-processor.js.map +1 -0
- package/dist/services/extract/docx.d.ts +1 -0
- package/dist/services/extract/docx.js +233 -0
- package/dist/services/extract/docx.js.map +1 -0
- package/dist/services/extract/index.d.ts +9 -0
- package/dist/services/extract/index.js +10 -0
- package/dist/services/extract/index.js.map +1 -0
- package/dist/services/extract/pdf.d.ts +13 -0
- package/dist/services/extract/pdf.js +69 -0
- package/dist/services/extract/pdf.js.map +1 -0
- package/dist/services/folder-creation.d.ts +33 -0
- package/dist/services/folder-creation.js +103 -0
- package/dist/services/folder-creation.js.map +1 -0
- package/dist/services/git.d.ts +58 -0
- package/dist/services/git.js +194 -55
- package/dist/services/git.js.map +1 -1
- package/dist/services/graph-maintenance.js +4 -4
- package/dist/services/graph-maintenance.js.map +1 -1
- package/dist/services/import-service.d.ts +51 -2
- package/dist/services/import-service.js +254 -107
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/lint-service.js +10 -17
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.d.ts +12 -1
- package/dist/services/markdown.js +77 -9
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/mention-detector.d.ts +23 -0
- package/dist/services/mention-detector.js +47 -0
- package/dist/services/mention-detector.js.map +1 -0
- package/dist/services/model-capabilities.d.ts +41 -0
- package/dist/services/model-capabilities.js +107 -0
- package/dist/services/model-capabilities.js.map +1 -0
- package/dist/services/notification-broadcast.d.ts +32 -0
- package/dist/services/notification-broadcast.js +38 -0
- package/dist/services/notification-broadcast.js.map +1 -0
- package/dist/services/notification-service.d.ts +41 -0
- package/dist/services/notification-service.js +100 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/oauth-server-store.d.ts +147 -0
- package/dist/services/oauth-server-store.js +319 -0
- package/dist/services/oauth-server-store.js.map +1 -0
- package/dist/services/orphan-service.js +2 -2
- package/dist/services/orphan-service.js.map +1 -1
- package/dist/services/personal-folder.d.ts +40 -0
- package/dist/services/personal-folder.js +101 -0
- package/dist/services/personal-folder.js.map +1 -0
- package/dist/services/scratch-asset-promote.d.ts +57 -0
- package/dist/services/scratch-asset-promote.js +95 -0
- package/dist/services/scratch-asset-promote.js.map +1 -0
- package/dist/services/scratch-attachment-service.d.ts +196 -0
- package/dist/services/scratch-attachment-service.js +347 -0
- package/dist/services/scratch-attachment-service.js.map +1 -0
- package/dist/services/share-link-service.d.ts +57 -0
- package/dist/services/share-link-service.js +142 -0
- package/dist/services/share-link-service.js.map +1 -0
- package/dist/services/user-person-bridge.d.ts +136 -0
- package/dist/services/user-person-bridge.js +340 -0
- package/dist/services/user-person-bridge.js.map +1 -0
- package/dist/services/vector-service.d.ts +282 -5
- package/dist/services/vector-service.js +585 -29
- package/dist/services/vector-service.js.map +1 -1
- package/dist/services/workspace-access.d.ts +108 -0
- package/dist/services/workspace-access.js +149 -0
- package/dist/services/workspace-access.js.map +1 -0
- package/dist/services/workspace-assets-folder.d.ts +46 -0
- package/dist/services/workspace-assets-folder.js +75 -0
- package/dist/services/workspace-assets-folder.js.map +1 -0
- package/dist/utils/git.d.ts +17 -2
- package/dist/utils/git.js +23 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/log.d.ts +42 -0
- package/dist/utils/log.js +137 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/preflight.js +2 -2
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/version-checker.d.ts +12 -19
- package/dist/utils/version-checker.js +14 -104
- package/dist/utils/version-checker.js.map +1 -1
- package/dist/web/_app/immutable/assets/0.Bs_z3Z86.css +2 -0
- package/dist/web/_app/immutable/assets/12.DlIf1mKh.css +1 -0
- package/dist/web/_app/immutable/assets/14.7d-Q37wc.css +1 -0
- package/dist/web/_app/immutable/assets/15.BwBFdc1D.css +1 -0
- package/dist/web/_app/immutable/assets/16.CmLrbzZp.css +1 -0
- package/dist/web/_app/immutable/assets/17.DcuK5ZVm.css +1 -0
- package/dist/web/_app/immutable/assets/2.DATnR31c.css +1 -0
- package/dist/web/_app/immutable/assets/3.Cz4H8n_O.css +1 -0
- package/dist/web/_app/immutable/assets/4.aDHteTDy.css +1 -0
- package/dist/web/_app/immutable/assets/6.CF1i5Bon.css +1 -0
- package/dist/web/_app/immutable/assets/ArtifactEntityView.C4ooklFD.css +1 -0
- package/dist/web/_app/immutable/assets/AssetLibraryPicker.BOFW0MvF.css +1 -0
- package/dist/web/_app/immutable/assets/BulkActionsBar.cmKvHzRK.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.lBCvS3X5.css +1 -0
- package/dist/web/_app/immutable/assets/CodeMirrorEditor.D6hf2pNJ.css +1 -0
- package/dist/web/_app/immutable/assets/CopyField.DVGZtw4U.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMembersPanel.kiYnDFHu.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMutationDialogs.BMRF6Z3z.css +1 -0
- package/dist/web/_app/immutable/assets/FolderPicker.Cp46GHe2.css +1 -0
- package/dist/web/_app/immutable/assets/GalleryView.WBGxxUQc.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.BOaI5KFL.css +1 -0
- package/dist/web/_app/immutable/assets/Link.vV0ne105.css +1 -0
- package/dist/web/_app/immutable/assets/Markdown.BZnsSOSf.css +1 -0
- package/dist/web/_app/immutable/assets/Rail.ilusFgD4.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.D7-BO6S_.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/StopFilledAlt.fNlDN65D.css +1 -0
- package/dist/web/_app/immutable/assets/TimelineView.xAZBJhHw.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.C8ErUJAY.css +1 -0
- package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
- package/dist/web/_app/immutable/assets/history-summary.LpmHXasl.css +1 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CZTNEAuW.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CsGl1sm0.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.BNK2_mGO.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.DpEwFAQM.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2 +0 -0
- package/dist/web/_app/immutable/assets/inline-list.cqga56xT.css +1 -0
- package/dist/web/_app/immutable/assets/list-columns.BgnafZ4K.css +1 -0
- package/dist/web/_app/immutable/assets/realtime.DDCWxn3B.css +1 -0
- package/dist/web/_app/immutable/assets/select.B90KUqR4.css +1 -0
- package/dist/web/_app/immutable/assets/sheet.RF9RBmml.css +1 -0
- package/dist/web/_app/immutable/chunks/22qYtvr82.js +1 -0
- package/dist/web/_app/immutable/chunks/2f1VclTm.js +1 -0
- package/dist/web/_app/immutable/chunks/4xgUPoGj2.js +2 -0
- package/dist/web/_app/immutable/chunks/5CYQk4xR.js +1 -0
- package/dist/web/_app/immutable/chunks/6S9WOky52.js +1 -0
- package/dist/web/_app/immutable/chunks/9K8VREGP.js +1 -0
- package/dist/web/_app/immutable/chunks/B-n5q6ku.js +1 -0
- package/dist/web/_app/immutable/chunks/B0p2fSEV2.js +1 -0
- package/dist/web/_app/immutable/chunks/B2oi87jG.js +2 -0
- package/dist/web/_app/immutable/chunks/B5Rb52QU.js +1 -0
- package/dist/web/_app/immutable/chunks/B6Lt-qaJ.js +1 -0
- package/dist/web/_app/immutable/chunks/B6O-q2CN.js +1 -0
- package/dist/web/_app/immutable/chunks/B6qeIQZz.js +2 -0
- package/dist/web/_app/immutable/chunks/B9KfEsQw2.js +1 -0
- package/dist/web/_app/immutable/chunks/BB-RSeXQ.js +1 -0
- package/dist/web/_app/immutable/chunks/BCQQzpbj.js +1 -0
- package/dist/web/_app/immutable/chunks/BGdzd-Tc.js +1 -0
- package/dist/web/_app/immutable/chunks/BLs1h0Rh2.js +1 -0
- package/dist/web/_app/immutable/chunks/BPzV_xOS2.js +1 -0
- package/dist/web/_app/immutable/chunks/BT2C6q8n.js +1 -0
- package/dist/web/_app/immutable/chunks/BUesbLq2.js +1 -0
- package/dist/web/_app/immutable/chunks/BUrnwOw4.js +2 -0
- package/dist/web/_app/immutable/chunks/BV-iCKqa.js +1 -0
- package/dist/web/_app/immutable/chunks/BVCJtXyc.js +1 -0
- package/dist/web/_app/immutable/chunks/BY9a3GSt.js +6 -0
- package/dist/web/_app/immutable/chunks/BZi3uKF4.js +1 -0
- package/dist/web/_app/immutable/chunks/BbfHGU9n2.js +1 -0
- package/dist/web/_app/immutable/chunks/Bbqu2-5G2.js +1 -0
- package/dist/web/_app/immutable/chunks/BbsX1Slr.js +3 -0
- package/dist/web/_app/immutable/chunks/BcwjqHaZ2.js +1 -0
- package/dist/web/_app/immutable/chunks/BizeEpTx.js +2 -0
- package/dist/web/_app/immutable/chunks/BlgjVmFM2.js +14 -0
- package/dist/web/_app/immutable/chunks/BocSRgv12.js +1 -0
- package/dist/web/_app/immutable/chunks/BojBYqc3.js +1 -0
- package/dist/web/_app/immutable/chunks/BpCG9m962.js +1 -0
- package/dist/web/_app/immutable/chunks/BqvnBg_y.js +1 -0
- package/dist/web/_app/immutable/chunks/BsT0J1QD.js +1 -0
- package/dist/web/_app/immutable/chunks/BsW72fyR2.js +1 -0
- package/dist/web/_app/immutable/chunks/Bti_XKwx.js +2692 -0
- package/dist/web/_app/immutable/chunks/Bua97Had2.js +2 -0
- package/dist/web/_app/immutable/chunks/BuhW5Fr0.js +689 -0
- package/dist/web/_app/immutable/chunks/Bx74EEyn2.js +1 -0
- package/dist/web/_app/immutable/chunks/BxPN0T61.js +1 -0
- package/dist/web/_app/immutable/chunks/Bz9lrgGs.js +1 -0
- package/dist/web/_app/immutable/chunks/BzaxZ6j12.js +1 -0
- package/dist/web/_app/immutable/chunks/C1B4xDs0.js +1 -0
- package/dist/web/_app/immutable/chunks/C1trcC8M.js +7 -0
- package/dist/web/_app/immutable/chunks/C9tvkk7Y2.js +22 -0
- package/dist/web/_app/immutable/chunks/CBQjdDZf.js +1 -0
- package/dist/web/_app/immutable/chunks/CDeazMFW2.js +2 -0
- package/dist/web/_app/immutable/chunks/CEahbtnP.js +1 -0
- package/dist/web/_app/immutable/chunks/CGjVCd0e.js +8 -0
- package/dist/web/_app/immutable/chunks/CICK9maP.js +1 -0
- package/dist/web/_app/immutable/chunks/CIoNEHQ82.js +184 -0
- package/dist/web/_app/immutable/chunks/CP8_U450.js +1 -0
- package/dist/web/_app/immutable/chunks/CQ1eQ93t2.js +6 -0
- package/dist/web/_app/immutable/chunks/CUFQMEBn2.js +1 -0
- package/dist/web/_app/immutable/chunks/CYEYDNwO2.js +1 -0
- package/dist/web/_app/immutable/chunks/CYyIP7kP2.js +66 -0
- package/dist/web/_app/immutable/chunks/CZgFaimi2.js +83 -0
- package/dist/web/_app/immutable/chunks/CZqvCTCv.js +1 -0
- package/dist/web/_app/immutable/chunks/CcI9jYBV.js +1 -0
- package/dist/web/_app/immutable/chunks/CcWaWbrI2.js +1 -0
- package/dist/web/_app/immutable/chunks/CdtzRVZK.js +1 -0
- package/dist/web/_app/immutable/chunks/CfYG72Hc.js +1 -0
- package/dist/web/_app/immutable/chunks/Ch1kmm3J2.js +1 -0
- package/dist/web/_app/immutable/chunks/CmSSN61R2.js +1 -0
- package/dist/web/_app/immutable/chunks/Cqm5wAin.js +1 -0
- package/dist/web/_app/immutable/chunks/CuYPXpWU.js +1 -0
- package/dist/web/_app/immutable/chunks/CvSEodTA.js +1 -0
- package/dist/web/_app/immutable/chunks/CvqqrTrj.js +1 -0
- package/dist/web/_app/immutable/chunks/CwAmWt6h.js +1 -0
- package/dist/web/_app/immutable/chunks/CwP3Oa7F.js +1 -0
- package/dist/web/_app/immutable/chunks/CyTluew1.js +2 -0
- package/dist/web/_app/immutable/chunks/CzXdOgVl2.js +7 -0
- package/dist/web/_app/immutable/chunks/D0IAituJ.js +1 -0
- package/dist/web/_app/immutable/chunks/D0W7c6Sg.js +185 -0
- package/dist/web/_app/immutable/chunks/D0rBhnqB2.js +1 -0
- package/dist/web/_app/immutable/chunks/D1-GZSN1.js +1 -0
- package/dist/web/_app/immutable/chunks/D1yvtriI.js +1 -0
- package/dist/web/_app/immutable/chunks/D25NMRpl.js +1 -0
- package/dist/web/_app/immutable/chunks/D8wZ2xul.js +4 -0
- package/dist/web/_app/immutable/chunks/DA3HEX3X.js +1 -0
- package/dist/web/_app/immutable/chunks/DD9wj4ca2.js +1 -0
- package/dist/web/_app/immutable/chunks/DJ1YeiJL2.js +1 -0
- package/dist/web/_app/immutable/chunks/DKFZnpVC.js +5 -0
- package/dist/web/_app/immutable/chunks/DKJl40hl.js +1 -0
- package/dist/web/_app/immutable/chunks/DPUVu0T0.js +1 -0
- package/dist/web/_app/immutable/chunks/DQMWa2t7.js +1 -0
- package/dist/web/_app/immutable/chunks/DXsFrDer2.js +1 -0
- package/dist/web/_app/immutable/chunks/DYc5KW3F.js +1 -0
- package/dist/web/_app/immutable/chunks/DZcTwXBW.js +1 -0
- package/dist/web/_app/immutable/chunks/DcPrzUMJ.js +1 -0
- package/dist/web/_app/immutable/chunks/DdPO8kRu2.js +2 -0
- package/dist/web/_app/immutable/chunks/DeOXyJZw2.js +1 -0
- package/dist/web/_app/immutable/chunks/DfufUFR1.js +2 -0
- package/dist/web/_app/immutable/chunks/DiQg3ing.js +1 -0
- package/dist/web/_app/immutable/chunks/DjIqa1_y.js +2 -0
- package/dist/web/_app/immutable/chunks/DkJ1dkxV2.js +1 -0
- package/dist/web/_app/immutable/chunks/Dl63IUnH2.js +224 -0
- package/dist/web/_app/immutable/chunks/DmFdD6zT.js +1 -0
- package/dist/web/_app/immutable/chunks/Dn3R8S-U.js +1 -0
- package/dist/web/_app/immutable/chunks/DpNr1GQ2.js +1 -0
- package/dist/web/_app/immutable/chunks/DpVNDHXz.js +2 -0
- package/dist/web/_app/immutable/chunks/DuxziNnw.js +1 -0
- package/dist/web/_app/immutable/chunks/Dv3A3Wcj.js +1 -0
- package/dist/web/_app/immutable/chunks/FuiJnZG0.js +1 -0
- package/dist/web/_app/immutable/chunks/Izkulod7.js +1 -0
- package/dist/web/_app/immutable/chunks/KZY6ongq2.js +2 -0
- package/dist/web/_app/immutable/chunks/LYL8znYR2.js +23 -0
- package/dist/web/_app/immutable/chunks/PhN6tXuJ2.js +1 -0
- package/dist/web/_app/immutable/chunks/PyLyCpuL.js +1 -0
- package/dist/web/_app/immutable/chunks/RK4gCWN0.js +2 -0
- package/dist/web/_app/immutable/chunks/VsBngTf4.js +2 -0
- package/dist/web/_app/immutable/chunks/XcWejFm_.js +5 -0
- package/dist/web/_app/immutable/chunks/al_nidE9.js +1 -0
- package/dist/web/_app/immutable/chunks/e50-izZO2.js +1 -0
- package/dist/web/_app/immutable/chunks/hG-QCarB.js +1 -0
- package/dist/web/_app/immutable/chunks/hStvCHkX.js +1 -0
- package/dist/web/_app/immutable/chunks/iJVY9p0y.js +3 -0
- package/dist/web/_app/immutable/chunks/kNaey6uv.js +1 -0
- package/dist/web/_app/immutable/chunks/pIXNe0C1.js +1 -0
- package/dist/web/_app/immutable/chunks/pNSRq_1B.js +2 -0
- package/dist/web/_app/immutable/chunks/qwr5boV8.js +1 -0
- package/dist/web/_app/immutable/chunks/rjjyuGhb.js +1 -0
- package/dist/web/_app/immutable/chunks/sg-T-FoN.js +1 -0
- package/dist/web/_app/immutable/chunks/uBgoVlsx.js +3 -0
- package/dist/web/_app/immutable/chunks/ulshNz6x.js +2 -0
- package/dist/web/_app/immutable/chunks/xY0c-UfG.js +3 -0
- package/dist/web/_app/immutable/chunks/xeNvx4Bl2.js +1 -0
- package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/dist/web/_app/immutable/entry/app.pNUW-q4U.js +2 -0
- package/dist/web/_app/immutable/entry/start.DxGtIGG_.js +1 -0
- package/dist/web/_app/immutable/nodes/0.D6ZCY_R6.js +2 -0
- package/dist/web/_app/immutable/nodes/1.BryH3TNr.js +1 -0
- package/dist/web/_app/immutable/nodes/10.CMZMvR17.js +1 -0
- package/dist/web/_app/immutable/nodes/11.QHx_JShx.js +1 -0
- package/dist/web/_app/immutable/nodes/12.CiRWbb4X.js +1 -0
- package/dist/web/_app/immutable/nodes/13.CYrHXCA8.js +1 -0
- package/dist/web/_app/immutable/nodes/14.K18eIE5Z.js +1 -0
- package/dist/web/_app/immutable/nodes/15.DxgnZ61h.js +1 -0
- package/dist/web/_app/immutable/nodes/16.Dn6iuWIo.js +1 -0
- package/dist/web/_app/immutable/nodes/17.viwS7vTR.js +77 -0
- package/dist/web/_app/immutable/nodes/2.BQkQ_uUM.js +122 -0
- package/dist/web/_app/immutable/nodes/3.B4pqXsqq.js +6 -0
- package/dist/web/_app/immutable/nodes/4.CKXEgIAP.js +11 -0
- package/dist/web/_app/immutable/nodes/5.A2TASl4Q.js +1 -0
- package/dist/web/_app/immutable/nodes/6.DaIRO3SI.js +6 -0
- package/dist/web/_app/immutable/nodes/7.ga2UvFm-.js +1 -0
- package/dist/web/_app/immutable/nodes/8.BTEWT81u.js +1 -0
- package/dist/web/_app/immutable/nodes/9.BVxo0E0c.js +1 -0
- package/dist/web/_app/version.json +1 -1
- package/dist/web/favicon-16.png +0 -0
- package/dist/web/favicon-180.png +0 -0
- package/dist/web/favicon-32.png +0 -0
- package/dist/web/favicon-48.png +0 -0
- package/dist/web/favicon-512.png +0 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/favicon.svg +8 -0
- package/dist/web/index.html +56 -21
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +35 -14
- package/dist/agent/skills/enrich-entities.md +0 -136
- package/dist/agent/skills/sync-configuration.md +0 -119
- package/dist/agent/skills/sync-setup.md +0 -82
- package/dist/agent/tools/message-tools.d.ts +0 -42
- package/dist/agent/tools/message-tools.js +0 -106
- package/dist/agent/tools/message-tools.js.map +0 -1
- package/dist/cli/commands/app.d.ts +0 -7
- package/dist/cli/commands/app.js +0 -268
- package/dist/cli/commands/app.js.map +0 -1
- package/dist/cli/commands/clear.d.ts +0 -5
- package/dist/cli/commands/clear.js +0 -36
- package/dist/cli/commands/clear.js.map +0 -1
- package/dist/cli/commands/collection.d.ts +0 -10
- package/dist/cli/commands/collection.js.map +0 -1
- package/dist/cli/commands/join.d.ts +0 -9
- package/dist/cli/commands/join.js +0 -255
- package/dist/cli/commands/join.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -7
- package/dist/cli/commands/start.js +0 -584
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -8
- package/dist/cli/commands/update.js +0 -155
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/user.d.ts +0 -7
- package/dist/cli/commands/user.js +0 -175
- package/dist/cli/commands/user.js.map +0 -1
- package/dist/cli/scaffolding.d.ts +0 -12
- package/dist/cli/scaffolding.js +0 -397
- package/dist/cli/scaffolding.js.map +0 -1
- package/dist/integrations/registry.d.ts +0 -8
- package/dist/integrations/registry.js +0 -7
- package/dist/integrations/registry.js.map +0 -1
- package/dist/integrations/types.d.ts +0 -43
- package/dist/integrations/types.js +0 -5
- package/dist/integrations/types.js.map +0 -1
- package/dist/lib/lib/utils.d.ts +0 -2
- package/dist/lib/lib/utils.js +0 -6
- package/dist/lib/lib/utils.js.map +0 -1
- package/dist/server/chrome/chrome.css +0 -691
- package/dist/server/chrome/chrome.js +0 -374
- package/dist/server/commit-scheduler.d.ts +0 -39
- package/dist/server/commit-scheduler.js +0 -113
- package/dist/server/commit-scheduler.js.map +0 -1
- package/dist/server/plugin-loader.d.ts +0 -53
- package/dist/server/plugin-loader.js +0 -155
- package/dist/server/plugin-loader.js.map +0 -1
- package/dist/server/routes/meeting-ingest-api.d.ts +0 -14
- package/dist/server/routes/meeting-ingest-api.js.map +0 -1
- package/dist/server/routes/messages-api.d.ts +0 -15
- package/dist/server/routes/messages-api.js +0 -385
- package/dist/server/routes/messages-api.js.map +0 -1
- package/dist/services/batch-processor.d.ts +0 -49
- package/dist/services/batch-processor.js +0 -166
- package/dist/services/batch-processor.js.map +0 -1
- package/dist/services/briefing.d.ts +0 -26
- package/dist/services/briefing.js +0 -230
- package/dist/services/briefing.js.map +0 -1
- package/dist/services/heartbeat.d.ts +0 -28
- package/dist/services/heartbeat.js +0 -183
- package/dist/services/heartbeat.js.map +0 -1
- package/dist/services/image-import-service.d.ts +0 -24
- package/dist/services/image-import-service.js +0 -108
- package/dist/services/image-import-service.js.map +0 -1
- package/dist/services/insights.d.ts +0 -38
- package/dist/services/insights.js +0 -269
- package/dist/services/insights.js.map +0 -1
- package/dist/services/meeting-processor.js.map +0 -1
- package/dist/services/message-service.d.ts +0 -68
- package/dist/services/message-service.js +0 -220
- package/dist/services/message-service.js.map +0 -1
- package/dist/utils/workspace-config.d.ts +0 -8
- package/dist/utils/workspace-config.js +0 -22
- package/dist/utils/workspace-config.js.map +0 -1
- package/dist/web/_app/immutable/assets/0.uPSqtsC5.css +0 -1
- package/dist/web/_app/immutable/assets/11.2jzI3cZY.css +0 -1
- package/dist/web/_app/immutable/assets/12.CT4xL4K3.css +0 -1
- package/dist/web/_app/immutable/assets/13.BUrHkYry.css +0 -1
- package/dist/web/_app/immutable/assets/2.DpQWr6q6.css +0 -1
- package/dist/web/_app/immutable/assets/3.BxdqT7zi.css +0 -1
- package/dist/web/_app/immutable/assets/4.DdNqjd0T.css +0 -1
- package/dist/web/_app/immutable/assets/5.DFeGxLYf.css +0 -1
- package/dist/web/_app/immutable/assets/6.DXZr_rI_.css +0 -1
- package/dist/web/_app/immutable/assets/GraphView.D9ePpZez.css +0 -1
- package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
- package/dist/web/_app/immutable/assets/ViewToolbar.BWE03S64.css +0 -1
- package/dist/web/_app/immutable/assets/WorkspaceView.CgGDi_Zb.css +0 -1
- package/dist/web/_app/immutable/assets/wikilinks.CzMBkUMB.css +0 -1
- package/dist/web/_app/immutable/chunks/-jG4Obyh.js +0 -4
- package/dist/web/_app/immutable/chunks/2nrc8f_O.js +0 -1
- package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
- package/dist/web/_app/immutable/chunks/8Q3ZJIYu.js +0 -1
- package/dist/web/_app/immutable/chunks/B8ydT5xX.js +0 -2
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
- package/dist/web/_app/immutable/chunks/BEn6N5c2.js +0 -1
- package/dist/web/_app/immutable/chunks/BFNNbCAM.js +0 -1
- package/dist/web/_app/immutable/chunks/BFZZEUd5.js +0 -1
- package/dist/web/_app/immutable/chunks/BGk8kfOE.js +0 -2
- package/dist/web/_app/immutable/chunks/BIBCr278.js +0 -1
- package/dist/web/_app/immutable/chunks/BPCkkwqe.js +0 -1
- package/dist/web/_app/immutable/chunks/BhlvzGQx.js +0 -1
- package/dist/web/_app/immutable/chunks/BlMknQeF.js +0 -1
- package/dist/web/_app/immutable/chunks/BpjqrlCg.js +0 -1
- package/dist/web/_app/immutable/chunks/BrebtJNG.js +0 -18
- package/dist/web/_app/immutable/chunks/ByBZ7JIT.js +0 -1
- package/dist/web/_app/immutable/chunks/Bz0ZjVQE.js +0 -2
- package/dist/web/_app/immutable/chunks/BzJTZOK2.js +0 -1
- package/dist/web/_app/immutable/chunks/C0LVZhvn.js +0 -1
- package/dist/web/_app/immutable/chunks/C3uBrOS5.js +0 -1
- package/dist/web/_app/immutable/chunks/C8R1sDpW.js +0 -1
- package/dist/web/_app/immutable/chunks/CDRHrs0g.js +0 -1
- package/dist/web/_app/immutable/chunks/CN5_py1I.js +0 -1
- package/dist/web/_app/immutable/chunks/CPne482a.js +0 -1
- package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
- package/dist/web/_app/immutable/chunks/CWyU-seV.js +0 -1
- package/dist/web/_app/immutable/chunks/CX_61fY8.js +0 -5
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +0 -1
- package/dist/web/_app/immutable/chunks/ChsiIm-E.js +0 -1
- package/dist/web/_app/immutable/chunks/CojKppbh.js +0 -1
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
- package/dist/web/_app/immutable/chunks/CtYLtD7K.js +0 -1
- package/dist/web/_app/immutable/chunks/D-HDy5qS.js +0 -1
- package/dist/web/_app/immutable/chunks/D5aIYSkd.js +0 -1
- package/dist/web/_app/immutable/chunks/DBBXARVf.js +0 -1
- package/dist/web/_app/immutable/chunks/DFYOFE3o.js +0 -1
- package/dist/web/_app/immutable/chunks/DKaafS50.js +0 -1
- package/dist/web/_app/immutable/chunks/DUMOo1Pn.js +0 -1
- package/dist/web/_app/immutable/chunks/DWX9f6AF.js +0 -1
- package/dist/web/_app/immutable/chunks/DY8-EONP.js +0 -1
- package/dist/web/_app/immutable/chunks/DkoHPElM.js +0 -1
- package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
- package/dist/web/_app/immutable/chunks/DsnmJJEf.js +0 -1
- package/dist/web/_app/immutable/chunks/DujahU3W.js +0 -1
- package/dist/web/_app/immutable/chunks/FBn-ES5k.js +0 -1
- package/dist/web/_app/immutable/chunks/HQpwSOb3.js +0 -1
- package/dist/web/_app/immutable/chunks/KyjzlWRN.js +0 -2
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
- package/dist/web/_app/immutable/chunks/UwYfmrPx.js +0 -2
- package/dist/web/_app/immutable/chunks/W25ZVI8L.js +0 -2
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
- package/dist/web/_app/immutable/chunks/XjsuEnNE.js +0 -5
- package/dist/web/_app/immutable/chunks/ZD6ARAtb.js +0 -1
- package/dist/web/_app/immutable/chunks/pBTf4stg.js +0 -2
- package/dist/web/_app/immutable/chunks/rGIarcnp.js +0 -1
- package/dist/web/_app/immutable/chunks/vxEtkL8z.js +0 -1
- package/dist/web/_app/immutable/chunks/wDIGUaoU.js +0 -3
- package/dist/web/_app/immutable/entry/app.ZHiTM8WS.js +0 -2
- package/dist/web/_app/immutable/entry/start.C9-FfAVc.js +0 -1
- package/dist/web/_app/immutable/nodes/0.D92Orz8k.js +0 -2
- package/dist/web/_app/immutable/nodes/1.BMdyglM_.js +0 -1
- package/dist/web/_app/immutable/nodes/10.BilVDHSL.js +0 -1
- package/dist/web/_app/immutable/nodes/11.CS9E0Hic.js +0 -1
- package/dist/web/_app/immutable/nodes/12.D3BOxYzG.js +0 -1
- package/dist/web/_app/immutable/nodes/13.CClMKYtN.js +0 -1
- package/dist/web/_app/immutable/nodes/2.C8KKElPL.js +0 -267
- package/dist/web/_app/immutable/nodes/3.C5n5uiWU.js +0 -5
- package/dist/web/_app/immutable/nodes/4.DcGVvgiL.js +0 -11
- package/dist/web/_app/immutable/nodes/5.DxIjnFQO.js +0 -4
- package/dist/web/_app/immutable/nodes/6.lkh6kKLj.js +0 -1
- package/dist/web/_app/immutable/nodes/7.Bg7SbfhA.js +0 -1
- package/dist/web/_app/immutable/nodes/8.DcXWCNBE.js +0 -1
- package/dist/web/_app/immutable/nodes/9.Cefi8Jfm.js +0 -1
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secrets API routes — Phase 7 of the secrets refactor.
|
|
3
|
+
*
|
|
4
|
+
* Write-only-from-the-outside contract for secret-classified registry
|
|
5
|
+
* keys. The value never leaves the server via these endpoints: GET
|
|
6
|
+
* returns metadata only (label, provider, last_tested_at, …), and the
|
|
7
|
+
* test-connection probe runs server-side without echoing the value.
|
|
8
|
+
*
|
|
9
|
+
* GET /api/secrets — list metadata
|
|
10
|
+
* PUT /api/secrets/:key — set or overwrite (audited)
|
|
11
|
+
* DELETE /api/secrets/:key — delete (audited)
|
|
12
|
+
* POST /api/secrets/:key/test — dispatch registry probe
|
|
13
|
+
*
|
|
14
|
+
* Owner-only. Bootstrap-classified keys (jwt.secret, master.key, …)
|
|
15
|
+
* reject with 400 — those live in env-vars only and are not store-
|
|
16
|
+
* settable. User-secret keys also reject — those live in auth.db per
|
|
17
|
+
* Phase 8.
|
|
18
|
+
*
|
|
19
|
+
* The test endpoint dispatches `def.testConnection(value)` from the
|
|
20
|
+
* registry. The returned shape is `{ ok: bool, message?: string }` —
|
|
21
|
+
* server-derived, no upstream error body echoed. Tests are audited
|
|
22
|
+
* (success + duration), no upstream message in the audit row either.
|
|
23
|
+
*
|
|
24
|
+
* After the scope-collapse refactor, requests carry no `scope` /
|
|
25
|
+
* `scope_id` — Studiograph is single-workspace-per-process. Any legacy
|
|
26
|
+
* `scope` query param or body field is silently ignored.
|
|
27
|
+
*/
|
|
28
|
+
import { isWorkspaceOwner } from '../../services/auth-service.js';
|
|
29
|
+
import { getKeyDef, getSecretStore, hasSecretStore, notifySecretMutation, } from '../../core/secrets/index.js';
|
|
30
|
+
/**
|
|
31
|
+
* Test-connection cache.
|
|
32
|
+
*
|
|
33
|
+
* Probes are expensive (real network roundtrip) and operators may click
|
|
34
|
+
* "Test" repeatedly while debugging. We cache the result by key for 60s
|
|
35
|
+
* and return the cached `{ ok, message, cached: true }` envelope. The
|
|
36
|
+
* UI surfaces this as a greyed-out "test again in Ns" button.
|
|
37
|
+
*
|
|
38
|
+
* Cache lives in-process — fine for v1; per-process Railway services
|
|
39
|
+
* each carry their own cache, which is the right trade-off (Test =
|
|
40
|
+
* audit event, so a separate-instance probe still produces an audit
|
|
41
|
+
* row).
|
|
42
|
+
*/
|
|
43
|
+
const TEST_CACHE_TTL_MS = 60_000;
|
|
44
|
+
const testCache = new Map();
|
|
45
|
+
/**
|
|
46
|
+
* Test-only hook: clear the process-wide cache. Vitest setups that swap
|
|
47
|
+
* the store between cases need to call this so a prior test's result
|
|
48
|
+
* doesn't leak into the next. Underscored to mark it as non-public.
|
|
49
|
+
*/
|
|
50
|
+
export function _resetSecretsTestCache() {
|
|
51
|
+
testCache.clear();
|
|
52
|
+
}
|
|
53
|
+
function requireOwner(req, authService) {
|
|
54
|
+
if (!authService.hasUsers())
|
|
55
|
+
return true;
|
|
56
|
+
const user = req.user;
|
|
57
|
+
if (!user)
|
|
58
|
+
return true; // API key — admin-equivalent (matches connectors-api / config-api)
|
|
59
|
+
return isWorkspaceOwner(user.role);
|
|
60
|
+
}
|
|
61
|
+
function actorFromReq(req) {
|
|
62
|
+
const user = req.user;
|
|
63
|
+
const ip = req.headers['x-forwarded-for']?.split(',')[0]?.trim()
|
|
64
|
+
|| req.ip;
|
|
65
|
+
const userAgent = req.headers['user-agent'];
|
|
66
|
+
if (user)
|
|
67
|
+
return { type: 'user', userId: String(user.id), ip, userAgent };
|
|
68
|
+
return { type: 'system', systemId: 'api-token', ip, userAgent };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Reject classifications that should never go through this API:
|
|
72
|
+
* - `bootstrap` — env-only by design
|
|
73
|
+
* - `user-*` — handled by auth.db routes (Phase 8)
|
|
74
|
+
* The remaining secret classification (workspace-secret) is the valid
|
|
75
|
+
* target.
|
|
76
|
+
*/
|
|
77
|
+
function rejectIfNonStoreSecret(classification) {
|
|
78
|
+
if (!classification)
|
|
79
|
+
return 'Unknown classification';
|
|
80
|
+
if (classification === 'bootstrap')
|
|
81
|
+
return 'Bootstrap-class keys are set via environment variables, not API';
|
|
82
|
+
if (classification.startsWith('user-'))
|
|
83
|
+
return 'User-scope secrets are managed via /api/preferences/settings';
|
|
84
|
+
if (!classification.endsWith('-secret'))
|
|
85
|
+
return 'Key is not classified as a secret — use /api/settings instead';
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
export async function registerSecretsApiRoutes(fastify, authService) {
|
|
89
|
+
// ── GET /api/secrets ─────────────────────────────────────────────────────
|
|
90
|
+
// List metadata. NEVER returns plaintext. The UI uses this to render
|
|
91
|
+
// the secret list with the actual values masked behind a "set |
|
|
92
|
+
// overwrite" widget.
|
|
93
|
+
fastify.get('/api/secrets', async (req, reply) => {
|
|
94
|
+
if (!requireOwner(req, authService)) {
|
|
95
|
+
return reply.status(403).send({ error: 'Workspace owner access required' });
|
|
96
|
+
}
|
|
97
|
+
if (!hasSecretStore()) {
|
|
98
|
+
return reply.status(503).send({ error: 'Secrets store not initialized' });
|
|
99
|
+
}
|
|
100
|
+
const store = getSecretStore();
|
|
101
|
+
const rows = store.listSecrets(actorFromReq(req));
|
|
102
|
+
return reply.send({
|
|
103
|
+
items: rows.map((r) => ({
|
|
104
|
+
key: r.key,
|
|
105
|
+
classification: r.classification,
|
|
106
|
+
label: r.label,
|
|
107
|
+
provider: r.provider,
|
|
108
|
+
last_tested_at: r.lastTestedAt,
|
|
109
|
+
last_test_result: r.lastTestResult,
|
|
110
|
+
updated_at: r.updatedAt,
|
|
111
|
+
updated_by: r.updatedBy,
|
|
112
|
+
key_version: r.keyVersion,
|
|
113
|
+
})),
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
// ── PUT /api/secrets/:key ────────────────────────────────────────────────
|
|
117
|
+
// Set or overwrite a secret. Audited. Value validated via registry zod.
|
|
118
|
+
fastify.put('/api/secrets/:key', async (req, reply) => {
|
|
119
|
+
if (!requireOwner(req, authService)) {
|
|
120
|
+
return reply.status(403).send({ error: 'Workspace owner access required' });
|
|
121
|
+
}
|
|
122
|
+
if (!hasSecretStore()) {
|
|
123
|
+
return reply.status(503).send({ error: 'Secrets store not initialized' });
|
|
124
|
+
}
|
|
125
|
+
const { key } = req.params;
|
|
126
|
+
const body = req.body ?? {};
|
|
127
|
+
const { value, label, provider } = body;
|
|
128
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
129
|
+
return reply.status(400).send({ error: 'body.value must be a non-empty string' });
|
|
130
|
+
}
|
|
131
|
+
const def = getKeyDef(key);
|
|
132
|
+
if (!def)
|
|
133
|
+
return reply.status(404).send({ error: `Unknown key "${key}"` });
|
|
134
|
+
const rejection = rejectIfNonStoreSecret(def.classification);
|
|
135
|
+
if (rejection)
|
|
136
|
+
return reply.status(400).send({ error: rejection });
|
|
137
|
+
const parsed = def.validate.safeParse(value);
|
|
138
|
+
if (!parsed.success) {
|
|
139
|
+
return reply.status(400).send({
|
|
140
|
+
error: 'Validation failed',
|
|
141
|
+
details: parsed.error.issues.map((i) => i.message),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
const store = getSecretStore();
|
|
145
|
+
const meta = await store.set({ key, value: String(parsed.data), label, provider }, actorFromReq(req));
|
|
146
|
+
// Invalidate any cached test-result for this key — a fresh value
|
|
147
|
+
// deserves a fresh probe on the next click.
|
|
148
|
+
testCache.delete(key);
|
|
149
|
+
// Notify subscribers (e.g., the agent pool) so cached agents that
|
|
150
|
+
// captured the prior value can evict and re-create on next chat.
|
|
151
|
+
notifySecretMutation(key);
|
|
152
|
+
// Don't echo the value back — we deliberately treat secrets as
|
|
153
|
+
// write-only-from-the-outside. The UI confirms the write via the
|
|
154
|
+
// metadata-only response.
|
|
155
|
+
return reply.send({
|
|
156
|
+
ok: true,
|
|
157
|
+
meta: {
|
|
158
|
+
key: meta.key,
|
|
159
|
+
classification: meta.classification,
|
|
160
|
+
label: meta.label,
|
|
161
|
+
provider: meta.provider,
|
|
162
|
+
last_tested_at: meta.lastTestedAt,
|
|
163
|
+
last_test_result: meta.lastTestResult,
|
|
164
|
+
updated_at: meta.updatedAt,
|
|
165
|
+
updated_by: meta.updatedBy,
|
|
166
|
+
key_version: meta.keyVersion,
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
// ── DELETE /api/secrets/:key ─────────────────────────────────────────────
|
|
171
|
+
fastify.delete('/api/secrets/:key', async (req, reply) => {
|
|
172
|
+
if (!requireOwner(req, authService)) {
|
|
173
|
+
return reply.status(403).send({ error: 'Workspace owner access required' });
|
|
174
|
+
}
|
|
175
|
+
if (!hasSecretStore()) {
|
|
176
|
+
return reply.status(503).send({ error: 'Secrets store not initialized' });
|
|
177
|
+
}
|
|
178
|
+
const { key } = req.params;
|
|
179
|
+
const store = getSecretStore();
|
|
180
|
+
const removed = await store.delete(key, actorFromReq(req));
|
|
181
|
+
testCache.delete(key);
|
|
182
|
+
if (removed)
|
|
183
|
+
notifySecretMutation(key);
|
|
184
|
+
return reply.send({ removed });
|
|
185
|
+
});
|
|
186
|
+
// ── POST /api/secrets/:key/test ──────────────────────────────────────────
|
|
187
|
+
// Dispatch the registry's testConnection probe. The probe reads the
|
|
188
|
+
// current value from the store (so the caller doesn't have to send
|
|
189
|
+
// the value again) and pings the upstream. Result is { ok, message }
|
|
190
|
+
// — no upstream body echoed. Audited via the store.audit logger so
|
|
191
|
+
// a failed probe is observable.
|
|
192
|
+
fastify.post('/api/secrets/:key/test', async (req, reply) => {
|
|
193
|
+
if (!requireOwner(req, authService)) {
|
|
194
|
+
return reply.status(403).send({ error: 'Workspace owner access required' });
|
|
195
|
+
}
|
|
196
|
+
if (!hasSecretStore()) {
|
|
197
|
+
return reply.status(503).send({ error: 'Secrets store not initialized' });
|
|
198
|
+
}
|
|
199
|
+
const { key } = req.params;
|
|
200
|
+
const def = getKeyDef(key);
|
|
201
|
+
if (!def)
|
|
202
|
+
return reply.status(404).send({ error: `Unknown key "${key}"` });
|
|
203
|
+
if (!def.testConnection) {
|
|
204
|
+
return reply.status(400).send({ error: `No test-connection probe registered for "${key}"` });
|
|
205
|
+
}
|
|
206
|
+
// Confirm a value exists BEFORE consulting the cache — a deleted /
|
|
207
|
+
// unset key must always 404, even if a prior test populated the
|
|
208
|
+
// cache. (Cache invalidation handles the common deletion path, but
|
|
209
|
+
// some test/CLI flows may bypass it.)
|
|
210
|
+
const store = getSecretStore();
|
|
211
|
+
const value = store.unsafeGetForResolver(key);
|
|
212
|
+
if (!value) {
|
|
213
|
+
// Defensive: drop any stale cache entry too.
|
|
214
|
+
testCache.delete(key);
|
|
215
|
+
return reply.status(404).send({ error: `No value set for "${key}"` });
|
|
216
|
+
}
|
|
217
|
+
// Cache hit (within TTL) — return the prior result without re-probing
|
|
218
|
+
// upstream. UI greys out the button until the cached entry expires.
|
|
219
|
+
// Cache is per key; setting a new value invalidates it (PUT clears
|
|
220
|
+
// the cache above via testCache.delete).
|
|
221
|
+
const cached = testCache.get(key);
|
|
222
|
+
if (cached && Date.now() - cached.cachedAt < TEST_CACHE_TTL_MS) {
|
|
223
|
+
return reply.send({
|
|
224
|
+
ok: cached.ok,
|
|
225
|
+
message: cached.message,
|
|
226
|
+
duration_ms: cached.duration_ms,
|
|
227
|
+
cached: true,
|
|
228
|
+
last_tested_at: cached.cachedAt,
|
|
229
|
+
ttl_ms: TEST_CACHE_TTL_MS - (Date.now() - cached.cachedAt),
|
|
230
|
+
stages: cached.stages,
|
|
231
|
+
advisory: cached.advisory,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
// Phase 10.5: hand the probe extra context. Today only the Anthropic
|
|
235
|
+
// probe consumes `model_id` (stage 4: model_in_list). Stub probes
|
|
236
|
+
// ignore the second arg — TypeScript-wise the registry calls
|
|
237
|
+
// `def.testConnection(value)` so we widen the call here via `any`.
|
|
238
|
+
// The probe signature is `(value, ctx?, fetch?) => TestResult`.
|
|
239
|
+
//
|
|
240
|
+
// Any model key (`model.<provider>.api_key`) opts into the model.id
|
|
241
|
+
// context so the probe can check whether the configured model is in
|
|
242
|
+
// the provider's catalog. Non-model keys (r2.*, search.*) get
|
|
243
|
+
// undefined context.
|
|
244
|
+
let contextModelId;
|
|
245
|
+
if (/^model\.[^.]+\.api_key$/.test(key)) {
|
|
246
|
+
try {
|
|
247
|
+
contextModelId = store.unsafeGetForResolver('model.id');
|
|
248
|
+
}
|
|
249
|
+
catch { /* no model.id set — probe skips stage 4 */ }
|
|
250
|
+
}
|
|
251
|
+
const startedAt = Date.now();
|
|
252
|
+
let ok = false;
|
|
253
|
+
let message;
|
|
254
|
+
let stages;
|
|
255
|
+
let advisory;
|
|
256
|
+
try {
|
|
257
|
+
const probeFn = def.testConnection;
|
|
258
|
+
const result = await probeFn(value, { model_id: contextModelId });
|
|
259
|
+
ok = !!result?.ok;
|
|
260
|
+
message = result?.message;
|
|
261
|
+
stages = result?.stages;
|
|
262
|
+
advisory = result?.advisory;
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
ok = false;
|
|
266
|
+
// Surface a generic message — never echo the upstream error text;
|
|
267
|
+
// the upstream may include the auth header in its body.
|
|
268
|
+
message = err instanceof Error ? err.message.slice(0, 200) : 'probe failed';
|
|
269
|
+
}
|
|
270
|
+
const duration = Date.now() - startedAt;
|
|
271
|
+
// Capture cachedAt once so the response and the cache entry agree —
|
|
272
|
+
// tests assert that a follow-up cached lookup returns the same
|
|
273
|
+
// last_tested_at value the first call reported.
|
|
274
|
+
const cachedAt = Date.now();
|
|
275
|
+
// Populate the cache before the audit/UPDATE side effects so a
|
|
276
|
+
// follow-up click within TTL hits the cache regardless of write-side
|
|
277
|
+
// failures.
|
|
278
|
+
testCache.set(key, { ok, message, duration_ms: duration, cachedAt, stages, advisory });
|
|
279
|
+
// Persist the last_test_result on the row so the UI's badge stays
|
|
280
|
+
// consistent across refreshes. Use a direct UPDATE rather than a
|
|
281
|
+
// setSecret() roundtrip — we don't want to re-encrypt the row.
|
|
282
|
+
try {
|
|
283
|
+
store.db
|
|
284
|
+
.prepare(`UPDATE secrets SET last_tested_at=?, last_test_result=?
|
|
285
|
+
WHERE key=?`)
|
|
286
|
+
.run(Date.now(), ok ? 'ok' : 'fail', key);
|
|
287
|
+
}
|
|
288
|
+
catch { /* non-fatal — audit captures the test event below */ }
|
|
289
|
+
store.audit.write({
|
|
290
|
+
action: 'test',
|
|
291
|
+
actor: actorFromReq(req),
|
|
292
|
+
key,
|
|
293
|
+
success: ok,
|
|
294
|
+
detail: { duration_ms: duration },
|
|
295
|
+
});
|
|
296
|
+
return reply.send({
|
|
297
|
+
ok,
|
|
298
|
+
message,
|
|
299
|
+
duration_ms: duration,
|
|
300
|
+
cached: false,
|
|
301
|
+
last_tested_at: cachedAt,
|
|
302
|
+
ttl_ms: TEST_CACHE_TTL_MS,
|
|
303
|
+
stages,
|
|
304
|
+
advisory,
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=secrets-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-api.js","sourceRoot":"","sources":["../../../src/server/routes/secrets-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings API routes — Phase 7 of the secrets refactor.
|
|
3
|
+
*
|
|
4
|
+
* Exposes the non-secret half of the encrypted store: registry-classified
|
|
5
|
+
* `*-setting` keys (model.id, model.provider, r2.bucket, search.google.cx,
|
|
6
|
+
* etc.). Secret keys are NOT served here — they live behind `/api/secrets`,
|
|
7
|
+
* which never returns plaintext values.
|
|
8
|
+
*
|
|
9
|
+
* Owner-only via the existing `isWorkspaceOwner()` helper. Matches the
|
|
10
|
+
* authorization matrix in plan §3: workspace settings are
|
|
11
|
+
* workspace-owner-only; members get 403.
|
|
12
|
+
*
|
|
13
|
+
* The routes register unconditionally now that Phase 6 has shipped.
|
|
14
|
+
* Historically they were gated on `STUDIOGRAPH_NEW_STORE === '1'`; that
|
|
15
|
+
* flag was removed once the encrypted store became the unconditional
|
|
16
|
+
* source of truth. Handlers still return 503 if the store singleton
|
|
17
|
+
* isn't initialized for some reason (test harness, early boot).
|
|
18
|
+
*
|
|
19
|
+
* Every mutation goes through the underlying SettingsStore, which audits
|
|
20
|
+
* `set`/`delete` automatically. Audit reads land via the `/api/audit`
|
|
21
|
+
* endpoint in audit-api.ts.
|
|
22
|
+
*
|
|
23
|
+
* After the scope-collapse refactor, requests carry no `scope` /
|
|
24
|
+
* `scope_id` — Studiograph is single-workspace-per-process. Any legacy
|
|
25
|
+
* `scope` query param or body field is silently ignored.
|
|
26
|
+
*/
|
|
27
|
+
import type { FastifyInstance } from 'fastify';
|
|
28
|
+
import { type AuthService } from '../../services/auth-service.js';
|
|
29
|
+
export declare function registerSettingsApiRoutes(fastify: FastifyInstance, authService: AuthService): Promise<void>;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings API routes — Phase 7 of the secrets refactor.
|
|
3
|
+
*
|
|
4
|
+
* Exposes the non-secret half of the encrypted store: registry-classified
|
|
5
|
+
* `*-setting` keys (model.id, model.provider, r2.bucket, search.google.cx,
|
|
6
|
+
* etc.). Secret keys are NOT served here — they live behind `/api/secrets`,
|
|
7
|
+
* which never returns plaintext values.
|
|
8
|
+
*
|
|
9
|
+
* Owner-only via the existing `isWorkspaceOwner()` helper. Matches the
|
|
10
|
+
* authorization matrix in plan §3: workspace settings are
|
|
11
|
+
* workspace-owner-only; members get 403.
|
|
12
|
+
*
|
|
13
|
+
* The routes register unconditionally now that Phase 6 has shipped.
|
|
14
|
+
* Historically they were gated on `STUDIOGRAPH_NEW_STORE === '1'`; that
|
|
15
|
+
* flag was removed once the encrypted store became the unconditional
|
|
16
|
+
* source of truth. Handlers still return 503 if the store singleton
|
|
17
|
+
* isn't initialized for some reason (test harness, early boot).
|
|
18
|
+
*
|
|
19
|
+
* Every mutation goes through the underlying SettingsStore, which audits
|
|
20
|
+
* `set`/`delete` automatically. Audit reads land via the `/api/audit`
|
|
21
|
+
* endpoint in audit-api.ts.
|
|
22
|
+
*
|
|
23
|
+
* After the scope-collapse refactor, requests carry no `scope` /
|
|
24
|
+
* `scope_id` — Studiograph is single-workspace-per-process. Any legacy
|
|
25
|
+
* `scope` query param or body field is silently ignored.
|
|
26
|
+
*/
|
|
27
|
+
import { isWorkspaceOwner } from '../../services/auth-service.js';
|
|
28
|
+
import { getAllConsoleUrls, getKeyDef, getSecretStore, hasSecretStore, listWorkspaceSettingsSchema, notifySecretMutation, } from '../../core/secrets/index.js';
|
|
29
|
+
/**
|
|
30
|
+
* Owner-only gate. Mirrors `requireAdmin()` in config-api.ts but is
|
|
31
|
+
* stricter: API-key callers without a `req.user` are accepted (matches
|
|
32
|
+
* existing pattern — Bearer token = admin-equivalent), so the only
|
|
33
|
+
* rejection path is "logged-in non-owner user".
|
|
34
|
+
*/
|
|
35
|
+
function requireOwner(req, authService) {
|
|
36
|
+
if (!authService.hasUsers())
|
|
37
|
+
return true;
|
|
38
|
+
const user = req.user;
|
|
39
|
+
if (!user)
|
|
40
|
+
return true; // API key — admin-equivalent
|
|
41
|
+
return isWorkspaceOwner(user.role);
|
|
42
|
+
}
|
|
43
|
+
function actorFromReq(req) {
|
|
44
|
+
const user = req.user;
|
|
45
|
+
const ip = req.headers['x-forwarded-for']?.split(',')[0]?.trim()
|
|
46
|
+
|| req.ip;
|
|
47
|
+
const userAgent = req.headers['user-agent'];
|
|
48
|
+
if (user) {
|
|
49
|
+
return {
|
|
50
|
+
type: 'user',
|
|
51
|
+
userId: String(user.id),
|
|
52
|
+
ip,
|
|
53
|
+
userAgent,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
type: 'system',
|
|
58
|
+
systemId: 'api-token',
|
|
59
|
+
ip,
|
|
60
|
+
userAgent,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export async function registerSettingsApiRoutes(fastify, authService) {
|
|
64
|
+
// ── GET /api/settings ────────────────────────────────────────────────────
|
|
65
|
+
// List current setting values. Returns the parsed value as JSON (plain
|
|
66
|
+
// text — settings are non-secret by classification).
|
|
67
|
+
fastify.get('/api/settings', async (req, reply) => {
|
|
68
|
+
if (!requireOwner(req, authService)) {
|
|
69
|
+
return reply.status(403).send({ error: 'Workspace owner access required' });
|
|
70
|
+
}
|
|
71
|
+
if (!hasSecretStore()) {
|
|
72
|
+
return reply.status(503).send({ error: 'Settings store not initialized' });
|
|
73
|
+
}
|
|
74
|
+
const store = getSecretStore();
|
|
75
|
+
const rows = store.list();
|
|
76
|
+
// Hydrate JSON values + decorate with registry metadata so the UI
|
|
77
|
+
// knows what redaction mode applies. Phase 12d (2026-05-12) removed
|
|
78
|
+
// the `source`/`env_alias` fields — env-shadow no longer exists for
|
|
79
|
+
// workspace-* keys (resolver is store-only), so they were dead weight.
|
|
80
|
+
const items = rows.map((r) => {
|
|
81
|
+
const def = getKeyDef(r.key);
|
|
82
|
+
let value;
|
|
83
|
+
try {
|
|
84
|
+
value = JSON.parse(r.valueJson);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
value = r.valueJson;
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
key: r.key,
|
|
91
|
+
value,
|
|
92
|
+
classification: def?.classification,
|
|
93
|
+
redact: def?.redact,
|
|
94
|
+
updated_at: r.updatedAt,
|
|
95
|
+
updated_by: r.updatedBy,
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
return reply.send({ items });
|
|
99
|
+
});
|
|
100
|
+
// ── GET /api/settings/schema ─────────────────────────────────────────────
|
|
101
|
+
// Static schema for every registered workspace-setting. Drives dropdowns
|
|
102
|
+
// and other constraint-aware inputs in the settings panels — single
|
|
103
|
+
// source of truth, so adding a provider to the registry's zod enum
|
|
104
|
+
// automatically updates the UI without a second edit.
|
|
105
|
+
//
|
|
106
|
+
// Separate from GET /api/settings (which returns *stored values*) because
|
|
107
|
+
// the schema is registry-shape, not store-shape: it lists every key the
|
|
108
|
+
// user CAN set, including ones with no row in the store yet.
|
|
109
|
+
fastify.get('/api/settings/schema', async (req, reply) => {
|
|
110
|
+
if (!requireOwner(req, authService)) {
|
|
111
|
+
return reply.status(403).send({ error: 'Workspace owner access required' });
|
|
112
|
+
}
|
|
113
|
+
return reply.send({
|
|
114
|
+
items: listWorkspaceSettingsSchema(),
|
|
115
|
+
consoleUrls: getAllConsoleUrls(),
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
// ── PUT /api/settings/:key ───────────────────────────────────────────────
|
|
119
|
+
// Write a setting. Registry-validated: the key must be registered AND
|
|
120
|
+
// classified as a workspace-setting. Secret keys reject with 400 —
|
|
121
|
+
// they must go through /api/secrets.
|
|
122
|
+
fastify.put('/api/settings/:key', async (req, reply) => {
|
|
123
|
+
if (!requireOwner(req, authService)) {
|
|
124
|
+
return reply.status(403).send({ error: 'Workspace owner access required' });
|
|
125
|
+
}
|
|
126
|
+
if (!hasSecretStore()) {
|
|
127
|
+
return reply.status(503).send({ error: 'Settings store not initialized' });
|
|
128
|
+
}
|
|
129
|
+
const { key } = req.params;
|
|
130
|
+
const { value } = req.body ?? {};
|
|
131
|
+
if (value === undefined) {
|
|
132
|
+
return reply.status(400).send({ error: 'body.value is required' });
|
|
133
|
+
}
|
|
134
|
+
const def = getKeyDef(key);
|
|
135
|
+
if (!def) {
|
|
136
|
+
return reply.status(404).send({ error: `Unknown key "${key}"` });
|
|
137
|
+
}
|
|
138
|
+
if (def.classification.endsWith('-secret')) {
|
|
139
|
+
return reply.status(400).send({
|
|
140
|
+
error: `Key "${key}" is classified as a secret — use PUT /api/secrets/${encodeURIComponent(key)}`,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
if (def.classification === 'bootstrap') {
|
|
144
|
+
return reply.status(400).send({
|
|
145
|
+
error: `Key "${key}" is bootstrap-class — set via environment variable, not API`,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
// Registry validator catches malformed shapes (e.g. invalid enum for
|
|
149
|
+
// model.provider). Surfaces a 400 with the zod message.
|
|
150
|
+
const parsed = def.validate.safeParse(value);
|
|
151
|
+
if (!parsed.success) {
|
|
152
|
+
return reply.status(400).send({
|
|
153
|
+
error: 'Validation failed',
|
|
154
|
+
details: parsed.error.issues.map((i) => i.message),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
const store = getSecretStore();
|
|
158
|
+
const meta = await store.set({ key, value: parsed.data }, actorFromReq(req));
|
|
159
|
+
notifySecretMutation(key);
|
|
160
|
+
return reply.send({ ok: true, meta });
|
|
161
|
+
});
|
|
162
|
+
// ── DELETE /api/settings/:key ────────────────────────────────────────────
|
|
163
|
+
// Remove a setting. Audit row written. Returns { removed: bool } so
|
|
164
|
+
// the UI can show "already absent" without an error path.
|
|
165
|
+
fastify.delete('/api/settings/:key', async (req, reply) => {
|
|
166
|
+
if (!requireOwner(req, authService)) {
|
|
167
|
+
return reply.status(403).send({ error: 'Workspace owner access required' });
|
|
168
|
+
}
|
|
169
|
+
if (!hasSecretStore()) {
|
|
170
|
+
return reply.status(503).send({ error: 'Settings store not initialized' });
|
|
171
|
+
}
|
|
172
|
+
const { key } = req.params;
|
|
173
|
+
const store = getSecretStore();
|
|
174
|
+
const removed = await store.delete(key, actorFromReq(req));
|
|
175
|
+
if (removed)
|
|
176
|
+
notifySecretMutation(key);
|
|
177
|
+
return reply.send({ removed });
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=settings-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-api.js","sourceRoot":"","sources":["../../../src/server/routes/settings-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public read-only share links.
|
|
3
|
+
*
|
|
4
|
+
* The app's first anonymous surface. Three routes:
|
|
5
|
+
*
|
|
6
|
+
* POST /api/repos/:repo/entities/:type/:id/share-link (AUTHED) — mint/reuse
|
|
7
|
+
* GET /api/share/:token (PUBLIC) — read body
|
|
8
|
+
* GET /api/share/:token/asset/:assetId/:filename (PUBLIC) — embedded asset
|
|
9
|
+
*
|
|
10
|
+
* Authorization model:
|
|
11
|
+
* - Mint is write-gated (mirrors revoke). Personal folders ARE publishable by
|
|
12
|
+
* their owner — the publish right is orthogonal to teammate visibility, and
|
|
13
|
+
* the single mint caller is already owner-gated. Today read ⟺ write for
|
|
14
|
+
* shared folders, so write-gating is a no-op now but keeps publish/unpublish
|
|
15
|
+
* coherent and pre-empts a future read-only role from minting a link it
|
|
16
|
+
* couldn't revoke.
|
|
17
|
+
* - The two PUBLIC routes are bypassed in the global auth hook; the opaque
|
|
18
|
+
* token (looked up in share_links, fail-closed on missing/revoked) IS the
|
|
19
|
+
* authorization. A revoked token stops resolving for BOTH the body and its
|
|
20
|
+
* assets immediately.
|
|
21
|
+
* - The public read returns ONLY { title, entityType, content } — frontmatter
|
|
22
|
+
* and metadata never cross the boundary (test-enforced). Asset URLs in the
|
|
23
|
+
* body are rewritten to token-scoped /api/share/:token/asset/... links.
|
|
24
|
+
* - A public asset must be EMBEDDED in the shared entry (and so belong to the
|
|
25
|
+
* same repo), so a crafted body can't republish another entry's, another
|
|
26
|
+
* repo's, or an un-embedded asset.
|
|
27
|
+
*/
|
|
28
|
+
import type { FastifyInstance } from 'fastify';
|
|
29
|
+
import type { WorkspaceManager } from '../../core/workspace-manager.js';
|
|
30
|
+
import { AuthService } from '../../services/auth-service.js';
|
|
31
|
+
import type { ShareLinkService } from '../../services/share-link-service.js';
|
|
32
|
+
export declare function registerShareApiRoutes(fastify: FastifyInstance, workspaceManager: WorkspaceManager, authService: AuthService, shareLinkService: ShareLinkService): Promise<void>;
|