studiograph 1.3.46 → 1.3.48-beta.0
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 +117 -0
- package/dist/agent/agent-pool.js +287 -0
- package/dist/agent/agent-pool.js.map +1 -0
- package/dist/agent/followups.d.ts +34 -0
- package/dist/agent/followups.js +52 -0
- package/dist/agent/followups.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +113 -22
- package/dist/agent/orchestrator.js +573 -181
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +36 -0
- package/dist/agent/prompts/entity-types-section.js +90 -0
- package/dist/agent/prompts/entity-types-section.js.map +1 -0
- package/dist/agent/prompts/system.md +148 -69
- 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/entity-schema.md +77 -433
- package/dist/agent/skills/interview/entity-templates.md +193 -0
- package/dist/agent/skills/interview/question-domains.md +391 -0
- package/dist/agent/skills/interview/skill.md +204 -0
- package/dist/agent/skills/schema-rules.md +54 -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 +7 -6
- package/dist/agent/tools/fs-tools.js +5 -4
- package/dist/agent/tools/fs-tools.js.map +1 -1
- package/dist/agent/tools/graph-tools.d.ts +21 -58
- package/dist/agent/tools/graph-tools.js +635 -332
- 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 -38
- 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.d.ts +18 -0
- package/dist/agent/tools/web-tools.js +283 -0
- package/dist/agent/tools/web-tools.js.map +1 -0
- package/dist/cli/commands/about.d.ts +1 -0
- package/dist/cli/commands/about.js +55 -3
- package/dist/cli/commands/about.js.map +1 -1
- package/dist/cli/commands/admin/audit-workspace.d.ts +23 -0
- package/dist/cli/commands/admin/audit-workspace.js +133 -0
- package/dist/cli/commands/admin/audit-workspace.js.map +1 -0
- package/dist/cli/commands/admin/audit.d.ts +21 -0
- package/dist/cli/commands/admin/audit.js +174 -0
- package/dist/cli/commands/admin/audit.js.map +1 -0
- package/dist/cli/commands/admin/backup.d.ts +54 -0
- package/dist/cli/commands/admin/backup.js +207 -0
- package/dist/cli/commands/admin/backup.js.map +1 -0
- package/dist/cli/commands/admin/folder.d.ts +11 -0
- package/dist/cli/commands/admin/folder.js +186 -0
- package/dist/cli/commands/admin/folder.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +16 -0
- package/dist/cli/commands/admin/index.js +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/commit.d.ts +1 -1
- package/dist/cli/commands/commit.js +24 -11
- package/dist/cli/commands/commit.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 +2 -2
- 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 +12 -4
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/orphans.js +14 -30
- package/dist/cli/commands/orphans.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 +142 -63
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/serve.js +209 -24
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +372 -202
- 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 -35
- 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 +33 -52
- package/dist/cli/setup-wizard.js +43 -68
- 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/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 +56 -0
- package/dist/core/embeds.js +103 -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 +53 -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 +140 -0
- package/dist/core/entity-types-catalog.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/graph.d.ts +675 -14
- package/dist/core/graph.js +2118 -314
- 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/schema-registry.d.ts +59 -0
- package/dist/core/schema-registry.js +198 -0
- 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/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 +598 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/types.d.ts +77 -455
- package/dist/core/types.js +17 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +75 -7
- package/dist/core/user-config.js +155 -7
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +717 -1791
- package/dist/core/validation.js +357 -228
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +79 -12
- package/dist/core/workspace-manager.js +213 -73
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +19 -5
- package/dist/core/workspace.js +69 -35
- 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 +94 -13
- package/dist/mcp/connector-manager.js +283 -62
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/oauth-provider.d.ts +27 -33
- package/dist/mcp/oauth-provider.js +65 -134
- package/dist/mcp/oauth-provider.js.map +1 -1
- package/dist/mcp/oauth-registry.d.ts +62 -0
- package/dist/mcp/oauth-registry.js +85 -0
- package/dist/mcp/oauth-registry.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -3
- package/dist/mcp/server.js +30 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/state-signer.d.ts +41 -0
- package/dist/mcp/state-signer.js +120 -0
- package/dist/mcp/state-signer.js.map +1 -0
- package/dist/mcp/tools.d.ts +35 -2
- package/dist/mcp/tools.js +1051 -117
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/__tests__/helpers/graph-api.d.ts +18 -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/body-write-coordinator.d.ts +151 -0
- package/dist/server/body-write-coordinator.js +161 -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 +14 -3
- package/dist/server/index.js +451 -193
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/sanitize.d.ts +46 -0
- package/dist/server/middleware/sanitize.js +171 -0
- package/dist/server/middleware/sanitize.js.map +1 -0
- package/dist/server/routes/asset-api.d.ts +10 -0
- package/dist/server/routes/asset-api.js +294 -0
- package/dist/server/routes/asset-api.js.map +1 -0
- 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.d.ts +3 -2
- package/dist/server/routes/auth-api.js +519 -38
- package/dist/server/routes/auth-api.js.map +1 -1
- package/dist/server/routes/capture-api.d.ts +18 -0
- package/dist/server/routes/capture-api.js +257 -0
- package/dist/server/routes/capture-api.js.map +1 -0
- package/dist/server/routes/chat.d.ts +4 -1
- package/dist/server/routes/chat.js +298 -88
- 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 +21 -0
- package/dist/server/routes/config-api.js +256 -0
- package/dist/server/routes/config-api.js.map +1 -0
- package/dist/server/routes/connectors-api.d.ts +17 -0
- package/dist/server/routes/connectors-api.js +410 -0
- package/dist/server/routes/connectors-api.js.map +1 -0
- package/dist/server/routes/event-ingest-api.d.ts +15 -0
- package/dist/server/routes/event-ingest-api.js +125 -0
- package/dist/server/routes/event-ingest-api.js.map +1 -0
- package/dist/server/routes/git-http.d.ts +3 -3
- package/dist/server/routes/git-http.js +86 -38
- package/dist/server/routes/git-http.js.map +1 -1
- package/dist/server/routes/graph-api-access.d.ts +35 -0
- package/dist/server/routes/graph-api-access.js +105 -0
- package/dist/server/routes/graph-api-access.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +3 -2
- package/dist/server/routes/graph-api.js +1321 -263
- 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/insights-api.d.ts +1 -2
- package/dist/server/routes/insights-api.js +149 -41
- 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 +22 -6
- package/dist/server/routes/mcp.js.map +1 -1
- package/dist/server/routes/permissions-api.d.ts +9 -2
- package/dist/server/routes/permissions-api.js +87 -30
- 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/url-api.d.ts +7 -0
- package/dist/server/routes/url-api.js +74 -0
- package/dist/server/routes/url-api.js.map +1 -0
- package/dist/server/routes/views-api.js +81 -7
- 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 +124 -35
- package/dist/server/routes/workspace-api.js.map +1 -1
- package/dist/server/routes/ws.d.ts +2 -1
- package/dist/server/routes/ws.js +64 -16
- 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 -15
- package/dist/server/session-manager.js.map +1 -1
- package/dist/server/ws-hub.d.ts +138 -14
- package/dist/server/ws-hub.js +0 -0
- package/dist/server/ws-hub.js.map +1 -1
- package/dist/server/yjs-manager.d.ts +285 -7
- package/dist/server/yjs-manager.js +907 -36
- 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 +146 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/asset-listing.d.ts +39 -0
- package/dist/services/asset-listing.js +125 -0
- package/dist/services/asset-listing.js.map +1 -0
- package/dist/services/asset-upload-service.d.ts +53 -0
- package/dist/services/asset-upload-service.js +201 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/assets/asset-index-service.d.ts +82 -0
- package/dist/services/assets/asset-index-service.js +167 -0
- package/dist/services/assets/asset-index-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +44 -0
- package/dist/services/assets/base.js +55 -0
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +69 -1
- package/dist/services/assets/index.js +125 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +12 -1
- package/dist/services/assets/local.js +100 -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 +34 -1
- package/dist/services/assets/r2.js +93 -1
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +314 -36
- package/dist/services/auth-service.js +1126 -139
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/bookmark-import-service.d.ts +49 -0
- package/dist/services/bookmark-import-service.js +250 -0
- package/dist/services/bookmark-import-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/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 +161 -0
- package/dist/services/entity-mutations.js +296 -0
- package/dist/services/entity-mutations.js.map +1 -0
- package/dist/services/event-processor.d.ts +104 -0
- package/dist/services/event-processor.js +441 -0
- package/dist/services/event-processor.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 +54 -0
- package/dist/services/git.js +188 -54
- package/dist/services/git.js.map +1 -1
- package/dist/services/graph-maintenance.d.ts +42 -0
- package/dist/services/graph-maintenance.js +143 -0
- package/dist/services/graph-maintenance.js.map +1 -0
- package/dist/services/import-service.d.ts +45 -2
- package/dist/services/import-service.js +304 -100
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/lint-service.js +9 -16
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.d.ts +12 -1
- package/dist/services/markdown.js +71 -6
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +22 -14
- package/dist/services/memory-service.js +53 -35
- package/dist/services/memory-service.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/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/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/user-person-bridge.d.ts +118 -0
- package/dist/services/user-person-bridge.js +306 -0
- package/dist/services/user-person-bridge.js.map +1 -0
- package/dist/services/vector-service.d.ts +146 -6
- package/dist/services/vector-service.js +276 -13
- package/dist/services/vector-service.js.map +1 -1
- package/dist/services/workspace-access.d.ts +106 -0
- package/dist/services/workspace-access.js +149 -0
- package/dist/services/workspace-access.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.DDqq11xY.css +2 -0
- package/dist/web/_app/immutable/assets/12.DlIf1mKh.css +1 -0
- package/dist/web/_app/immutable/assets/13.7d-Q37wc.css +1 -0
- package/dist/web/_app/immutable/assets/14.CmLrbzZp.css +1 -0
- package/dist/web/_app/immutable/assets/2.CGK2ky-K.css +1 -0
- package/dist/web/_app/immutable/assets/3.CV0abekd.css +1 -0
- package/dist/web/_app/immutable/assets/4.fGsEpo95.css +1 -0
- package/dist/web/_app/immutable/assets/AgentOverlay.DqzjAOm4.css +1 -0
- package/dist/web/_app/immutable/assets/AssetManagerModal.BKJfPAPk.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.bNewSxkH.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMembersPanel.DX1oBeF_.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMutationDialogs.BMRF6Z3z.css +1 -0
- package/dist/web/_app/immutable/assets/FolderPicker.B5KdvRYl.css +1 -0
- package/dist/web/_app/immutable/assets/GalleryView.DgvSjS0I.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.D0QbZFd6.css +1 -0
- package/dist/web/_app/immutable/assets/Markdown.B4lW7Llh.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.DYWYMFSO.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/StopFilledAlt.clodJdp5.css +1 -0
- package/dist/web/_app/immutable/assets/TimelineView.DA-H6dvv.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.BS1ildu7.css +1 -0
- package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
- package/dist/web/_app/immutable/assets/formatting.B912lpdG.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.DCMVmy_Q.css +1 -0
- package/dist/web/_app/immutable/assets/realtime.DDCWxn3B.css +1 -0
- package/dist/web/_app/immutable/assets/sheet.DJPuqnTg.css +1 -0
- package/dist/web/_app/immutable/assets/speech-dictation.C5CYFhS1.css +1 -0
- package/dist/web/_app/immutable/chunks/0iDDDyaZ.js +1 -0
- package/dist/web/_app/immutable/chunks/2LgrBrpS2.js +2 -0
- package/dist/web/_app/immutable/chunks/3EfPAYzi2.js +1 -0
- package/dist/web/_app/immutable/chunks/7Bu427my2.js +184 -0
- package/dist/web/_app/immutable/chunks/96h3ktuk.js +1 -0
- package/dist/web/_app/immutable/chunks/A6FJA1AF.js +1 -0
- package/dist/web/_app/immutable/chunks/B-FAwCqe2.js +1 -0
- package/dist/web/_app/immutable/chunks/B-V5eMSw2.js +1 -0
- package/dist/web/_app/immutable/chunks/B-i9_YVM.js +1 -0
- package/dist/web/_app/immutable/chunks/B15-kvCe2.js +1 -0
- package/dist/web/_app/immutable/chunks/B1KZ7zY32.js +2 -0
- package/dist/web/_app/immutable/chunks/B4gpzeQ2.js +1 -0
- package/dist/web/_app/immutable/chunks/B6Lt-qaJ2.js +1 -0
- package/dist/web/_app/immutable/chunks/B7tbGyiU2.js +1 -0
- package/dist/web/_app/immutable/chunks/BBxt8lpa.js +1 -0
- package/dist/web/_app/immutable/chunks/BCaRi2AF.js +1 -0
- package/dist/web/_app/immutable/chunks/BJ6Z7eAM.js +2 -0
- package/dist/web/_app/immutable/chunks/BM_vIwVC.js +83 -0
- package/dist/web/_app/immutable/chunks/BQULA6er.js +4 -0
- package/dist/web/_app/immutable/chunks/BQW-EDgP2.js +224 -0
- package/dist/web/_app/immutable/chunks/BR6jMpLB.js +1 -0
- package/dist/web/_app/immutable/chunks/BVnuLlVg.js +1 -0
- package/dist/web/_app/immutable/chunks/BddNmQ8j.js +1 -0
- package/dist/web/_app/immutable/chunks/BeuunHPO.js +1 -0
- package/dist/web/_app/immutable/chunks/BhTmSo4n2.js +1 -0
- package/dist/web/_app/immutable/chunks/BikW7mty2.js +1 -0
- package/dist/web/_app/immutable/chunks/BkyFvJvz.js +1 -0
- package/dist/web/_app/immutable/chunks/BlyFGPFV.js +22 -0
- package/dist/web/_app/immutable/chunks/Bo5dghSu.js +3 -0
- package/dist/web/_app/immutable/chunks/BpPyho8Y.js +3 -0
- package/dist/web/_app/immutable/chunks/BsuvyNDN2.js +2 -0
- package/dist/web/_app/immutable/chunks/BuKi0vpu2.js +7 -0
- package/dist/web/_app/immutable/chunks/BuuYnIjE.js +1 -0
- package/dist/web/_app/immutable/chunks/By4lVKNC.js +2 -0
- package/dist/web/_app/immutable/chunks/ByQGCIwO.js +5 -0
- package/dist/web/_app/immutable/chunks/ByidpUhu.js +1 -0
- package/dist/web/_app/immutable/chunks/C35TIzaB.js +1 -0
- package/dist/web/_app/immutable/chunks/C5dM5op-.js +1 -0
- package/dist/web/_app/immutable/chunks/C6Nx0jpM.js +1 -0
- package/dist/web/_app/immutable/chunks/C6pVyOEl2.js +1 -0
- package/dist/web/_app/immutable/chunks/C80GKPZ9.js +1 -0
- package/dist/web/_app/immutable/chunks/C94TJqPI.js +1 -0
- package/dist/web/_app/immutable/chunks/C9PETsiT.js +1 -0
- package/dist/web/_app/immutable/chunks/CAuAQ81a2.js +1 -0
- package/dist/web/_app/immutable/chunks/CBnzSITi2.js +1 -0
- package/dist/web/_app/immutable/chunks/CC9p2p6w.js +1 -0
- package/dist/web/_app/immutable/chunks/CCLR-AJL2.js +185 -0
- package/dist/web/_app/immutable/chunks/CD0X7XPW.js +6 -0
- package/dist/web/_app/immutable/chunks/CDTjuBSm.js +1 -0
- package/dist/web/_app/immutable/chunks/CH-KYFIm.js +64 -0
- package/dist/web/_app/immutable/chunks/CHj8fObQ2.js +9 -0
- package/dist/web/_app/immutable/chunks/CK-UnH-n2.js +1 -0
- package/dist/web/_app/immutable/chunks/CKH5BEAh.js +1 -0
- package/dist/web/_app/immutable/chunks/CPSupDJp2.js +2 -0
- package/dist/web/_app/immutable/chunks/CSUrYOis.js +1 -0
- package/dist/web/_app/immutable/chunks/CYTTTma0.js +3 -0
- package/dist/web/_app/immutable/chunks/Cbaut_us2.js +1 -0
- package/dist/web/_app/immutable/chunks/CiIpSx5n2.js +1 -0
- package/dist/web/_app/immutable/chunks/CkLfUXwy.js +1 -0
- package/dist/web/_app/immutable/chunks/CokE4L8B2.js +1 -0
- package/dist/web/_app/immutable/chunks/CpLdnbh3.js +1 -0
- package/dist/web/_app/immutable/chunks/CvDrXJk9.js +1 -0
- package/dist/web/_app/immutable/chunks/D00MFB9_2.js +1 -0
- package/dist/web/_app/immutable/chunks/D41CbXmM.js +1 -0
- package/dist/web/_app/immutable/chunks/D5Hj-MPO2.js +1 -0
- package/dist/web/_app/immutable/chunks/D6nLEmZy2.js +1 -0
- package/dist/web/_app/immutable/chunks/D71ZlQBM2.js +2 -0
- package/dist/web/_app/immutable/chunks/D9ql9vXU.js +1 -0
- package/dist/web/_app/immutable/chunks/DAXW5iLp.js +1 -0
- package/dist/web/_app/immutable/chunks/DBzQ8LyQ2.js +2 -0
- package/dist/web/_app/immutable/chunks/DIb5rAPU2.js +1 -0
- package/dist/web/_app/immutable/chunks/DOmH4G9o.js +14 -0
- package/dist/web/_app/immutable/chunks/DQMWa2t72.js +1 -0
- package/dist/web/_app/immutable/chunks/DRsswX8S.js +1 -0
- package/dist/web/_app/immutable/chunks/DTCHhxD5.js +1 -0
- package/dist/web/_app/immutable/chunks/DUwgGBxa.js +1 -0
- package/dist/web/_app/immutable/chunks/DVcy5Pp82.js +1 -0
- package/dist/web/_app/immutable/chunks/DWygwzcO.js +1 -0
- package/dist/web/_app/immutable/chunks/DYXDRmoo.js +1 -0
- package/dist/web/_app/immutable/chunks/DZ-YyRVM.js +1 -0
- package/dist/web/_app/immutable/chunks/D_HVOuHV.js +1 -0
- package/dist/web/_app/immutable/chunks/DaoOQFPb.js +1 -0
- package/dist/web/_app/immutable/chunks/DdLkNvPf.js +23 -0
- package/dist/web/_app/immutable/chunks/DiMQob8p.js +1 -0
- package/dist/web/_app/immutable/chunks/DiQJ9DLy.js +1 -0
- package/dist/web/_app/immutable/chunks/DlORZqfE.js +1 -0
- package/dist/web/_app/immutable/chunks/DmeYl7eL.js +2 -0
- package/dist/web/_app/immutable/chunks/Dng3OcRd2.js +1 -0
- package/dist/web/_app/immutable/chunks/DoKMFfJd.js +1 -0
- package/dist/web/_app/immutable/chunks/DpzG2mVI2.js +1 -0
- package/dist/web/_app/immutable/chunks/DvJSCDuZ2.js +1 -0
- package/dist/web/_app/immutable/chunks/DvPuaTCl2.js +5 -0
- package/dist/web/_app/immutable/chunks/ItgU4ei5.js +1 -0
- package/dist/web/_app/immutable/chunks/JJDMrjj62.js +1 -0
- package/dist/web/_app/immutable/chunks/OTTMDMTW.js +1 -0
- package/dist/web/_app/immutable/chunks/RmiWpCin2.js +1 -0
- package/dist/web/_app/immutable/chunks/ZTiqmKJy2.js +1 -0
- package/dist/web/_app/immutable/chunks/ahC5WoXX2.js +1 -0
- package/dist/web/_app/immutable/chunks/e3SY5t2O2.js +2692 -0
- package/dist/web/_app/immutable/chunks/g09ZrevW.js +1 -0
- package/dist/web/_app/immutable/chunks/go8N1nWD2.js +3 -0
- package/dist/web/_app/immutable/chunks/nTAmRNKw2.js +1 -0
- package/dist/web/_app/immutable/chunks/oBQOivfH2.js +1 -0
- package/dist/web/_app/immutable/chunks/oUTRxd0f.js +1 -0
- package/dist/web/_app/immutable/chunks/s_7BJJYy.js +2 -0
- package/dist/web/_app/immutable/chunks/uuFM-ygL.js +1 -0
- package/dist/web/_app/immutable/chunks/v7me-ydg.js +2 -0
- package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/dist/web/_app/immutable/chunks/zl16E4yc2.js +1 -0
- package/dist/web/_app/immutable/entry/app.CbuUtkoM.js +2 -0
- package/dist/web/_app/immutable/entry/start.DeZyKwOT.js +1 -0
- package/dist/web/_app/immutable/nodes/0.C4PMtdx9.js +2 -0
- package/dist/web/_app/immutable/nodes/1.BwVfPLMn.js +1 -0
- package/dist/web/_app/immutable/nodes/10.DPr_SYan.js +1 -0
- package/dist/web/_app/immutable/nodes/11.CJAmEchE.js +1 -0
- package/dist/web/_app/immutable/nodes/12.ChMWXPMk.js +1 -0
- package/dist/web/_app/immutable/nodes/13.8vOKq8ue.js +1 -0
- package/dist/web/_app/immutable/nodes/14.BOSNmj9h.js +1 -0
- package/dist/web/_app/immutable/nodes/2.7N4BLwhX.js +109 -0
- package/dist/web/_app/immutable/nodes/3.Cd-tx8Ej.js +2 -0
- package/dist/web/_app/immutable/nodes/4.DtuT-syy.js +14 -0
- package/dist/web/_app/immutable/nodes/5.YwNHOrkt.js +1 -0
- package/dist/web/_app/immutable/nodes/6.BSPlYQuq.js +1 -0
- package/dist/web/_app/immutable/nodes/7.DPXzwW0H.js +1 -0
- package/dist/web/_app/immutable/nodes/8.Dhpk7w3X.js +1 -0
- package/dist/web/_app/immutable/nodes/9.Dd4iAQN5.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 +54 -19
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +34 -14
- package/dist/agent/skills/enrich-entities.md +0 -136
- package/dist/agent/skills/obsidian-source-setup.md +0 -246
- package/dist/agent/skills/skill-loader.d.ts +0 -48
- package/dist/agent/skills/skill-loader.js +0 -166
- package/dist/agent/skills/skill-loader.js.map +0 -1
- package/dist/agent/skills/sync-configuration.md +0 -119
- package/dist/agent/skills/sync-setup.md +0 -82
- package/dist/agent/tools/sync-tools.d.ts +0 -35
- package/dist/agent/tools/sync-tools.js +0 -992
- package/dist/agent/tools/sync-tools.js.map +0 -1
- package/dist/auth/github.d.ts +0 -56
- package/dist/auth/github.js +0 -169
- package/dist/auth/github.js.map +0 -1
- package/dist/cli/commands/access.d.ts +0 -11
- package/dist/cli/commands/access.js +0 -156
- package/dist/cli/commands/access.js.map +0 -1
- package/dist/cli/commands/app.d.ts +0 -7
- package/dist/cli/commands/app.js +0 -268
- package/dist/cli/commands/app.js.map +0 -1
- package/dist/cli/commands/auth.d.ts +0 -10
- package/dist/cli/commands/auth.js +0 -79
- package/dist/cli/commands/auth.js.map +0 -1
- package/dist/cli/commands/clear.d.ts +0 -5
- package/dist/cli/commands/clear.js +0 -36
- package/dist/cli/commands/clear.js.map +0 -1
- package/dist/cli/commands/collection.d.ts +0 -10
- package/dist/cli/commands/collection.js +0 -187
- package/dist/cli/commands/collection.js.map +0 -1
- package/dist/cli/commands/enrich.d.ts +0 -11
- package/dist/cli/commands/enrich.js +0 -135
- package/dist/cli/commands/enrich.js.map +0 -1
- package/dist/cli/commands/graphrag.d.ts +0 -12
- package/dist/cli/commands/graphrag.js +0 -122
- package/dist/cli/commands/graphrag.js.map +0 -1
- package/dist/cli/commands/join.d.ts +0 -9
- package/dist/cli/commands/join.js +0 -255
- package/dist/cli/commands/join.js.map +0 -1
- package/dist/cli/commands/members.d.ts +0 -11
- package/dist/cli/commands/members.js +0 -230
- package/dist/cli/commands/members.js.map +0 -1
- package/dist/cli/commands/org.d.ts +0 -10
- package/dist/cli/commands/org.js +0 -132
- package/dist/cli/commands/org.js.map +0 -1
- package/dist/cli/commands/provision.d.ts +0 -8
- package/dist/cli/commands/provision.js +0 -116
- package/dist/cli/commands/provision.js.map +0 -1
- package/dist/cli/commands/resolve.d.ts +0 -8
- package/dist/cli/commands/resolve.js +0 -85
- package/dist/cli/commands/resolve.js.map +0 -1
- package/dist/cli/commands/review.d.ts +0 -19
- package/dist/cli/commands/review.js +0 -128
- package/dist/cli/commands/review.js.map +0 -1
- package/dist/cli/commands/source.d.ts +0 -16
- package/dist/cli/commands/source.js +0 -159
- package/dist/cli/commands/source.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -7
- package/dist/cli/commands/start.js +0 -589
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/sync-collection.d.ts +0 -14
- package/dist/cli/commands/sync-collection.js +0 -355
- package/dist/cli/commands/sync-collection.js.map +0 -1
- package/dist/cli/commands/sync-entities.d.ts +0 -13
- package/dist/cli/commands/sync-entities.js +0 -242
- package/dist/cli/commands/sync-entities.js.map +0 -1
- package/dist/cli/commands/team.d.ts +0 -12
- package/dist/cli/commands/team.js +0 -185
- package/dist/cli/commands/team.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -8
- package/dist/cli/commands/update.js +0 -155
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/user.d.ts +0 -7
- package/dist/cli/commands/user.js +0 -153
- package/dist/cli/commands/user.js.map +0 -1
- package/dist/cli/scaffolding.d.ts +0 -12
- package/dist/cli/scaffolding.js +0 -397
- package/dist/cli/scaffolding.js.map +0 -1
- package/dist/cli/sync-review-interactive.d.ts +0 -31
- package/dist/cli/sync-review-interactive.js +0 -393
- package/dist/cli/sync-review-interactive.js.map +0 -1
- package/dist/core/migration-runner.d.ts +0 -42
- package/dist/core/migration-runner.js +0 -232
- package/dist/core/migration-runner.js.map +0 -1
- package/dist/core/migration-types.d.ts +0 -101
- package/dist/core/migration-types.js +0 -21
- package/dist/core/migration-types.js.map +0 -1
- package/dist/core/migrations/20260219-formalize-memory-location.d.ts +0 -2
- package/dist/core/migrations/20260219-formalize-memory-location.js +0 -35
- package/dist/core/migrations/20260219-formalize-memory-location.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +0 -12
- package/dist/core/migrations/20260220-add-workspace-metadata.js +0 -65
- package/dist/core/migrations/20260220-add-workspace-metadata.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-readme.d.ts +0 -11
- package/dist/core/migrations/20260220-add-workspace-readme.js +0 -82
- package/dist/core/migrations/20260220-add-workspace-readme.js.map +0 -1
- package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +0 -9
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js +0 -64
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +0 -1
- package/dist/core/migrations/index.d.ts +0 -11
- package/dist/core/migrations/index.js +0 -23
- package/dist/core/migrations/index.js.map +0 -1
- package/dist/integrations/asana.d.ts +0 -26
- package/dist/integrations/asana.js +0 -78
- package/dist/integrations/asana.js.map +0 -1
- package/dist/integrations/figma-local.d.ts +0 -16
- package/dist/integrations/figma-local.js +0 -10
- package/dist/integrations/figma-local.js.map +0 -1
- package/dist/integrations/figma.d.ts +0 -17
- package/dist/integrations/figma.js +0 -17
- package/dist/integrations/figma.js.map +0 -1
- package/dist/integrations/granola.d.ts +0 -24
- package/dist/integrations/granola.js +0 -60
- package/dist/integrations/granola.js.map +0 -1
- package/dist/integrations/linear.d.ts +0 -14
- package/dist/integrations/linear.js +0 -80
- package/dist/integrations/linear.js.map +0 -1
- package/dist/integrations/paper-local.d.ts +0 -14
- package/dist/integrations/paper-local.js +0 -10
- package/dist/integrations/paper-local.js.map +0 -1
- package/dist/integrations/paper.d.ts +0 -2
- package/dist/integrations/paper.js +0 -10
- package/dist/integrations/paper.js.map +0 -1
- package/dist/integrations/pipedrive.d.ts +0 -26
- package/dist/integrations/pipedrive.js +0 -97
- package/dist/integrations/pipedrive.js.map +0 -1
- package/dist/integrations/registry.d.ts +0 -15
- package/dist/integrations/registry.js +0 -27
- package/dist/integrations/registry.js.map +0 -1
- package/dist/integrations/types.d.ts +0 -38
- package/dist/integrations/types.js +0 -9
- package/dist/integrations/types.js.map +0 -1
- package/dist/lib/lib/utils.d.ts +0 -2
- package/dist/lib/lib/utils.js +0 -6
- package/dist/lib/lib/utils.js.map +0 -1
- package/dist/mcp/connectors/asana.d.ts +0 -2
- package/dist/mcp/connectors/asana.js +0 -20
- package/dist/mcp/connectors/asana.js.map +0 -1
- package/dist/mcp/connectors/definitions.d.ts +0 -45
- package/dist/mcp/connectors/definitions.js +0 -32
- package/dist/mcp/connectors/definitions.js.map +0 -1
- package/dist/mcp/connectors/figma.d.ts +0 -5
- package/dist/mcp/connectors/figma.js +0 -21
- package/dist/mcp/connectors/figma.js.map +0 -1
- package/dist/mcp/connectors/gdrive.d.ts +0 -2
- package/dist/mcp/connectors/gdrive.js +0 -20
- package/dist/mcp/connectors/gdrive.js.map +0 -1
- package/dist/mcp/connectors/granola.d.ts +0 -2
- package/dist/mcp/connectors/granola.js +0 -12
- package/dist/mcp/connectors/granola.js.map +0 -1
- package/dist/mcp/connectors/linear.d.ts +0 -2
- package/dist/mcp/connectors/linear.js +0 -19
- package/dist/mcp/connectors/linear.js.map +0 -1
- package/dist/mcp/connectors/obsidian.d.ts +0 -2
- package/dist/mcp/connectors/obsidian.js +0 -19
- package/dist/mcp/connectors/obsidian.js.map +0 -1
- package/dist/mcp/connectors/pipedrive.d.ts +0 -2
- package/dist/mcp/connectors/pipedrive.js +0 -20
- package/dist/mcp/connectors/pipedrive.js.map +0 -1
- package/dist/mcp/connectors/slack.d.ts +0 -2
- package/dist/mcp/connectors/slack.js +0 -21
- package/dist/mcp/connectors/slack.js.map +0 -1
- package/dist/mcp/server-oauth-provider.d.ts +0 -56
- package/dist/mcp/server-oauth-provider.js +0 -142
- package/dist/mcp/server-oauth-provider.js.map +0 -1
- package/dist/server/chrome/chrome.css +0 -691
- package/dist/server/chrome/chrome.js +0 -374
- package/dist/server/collab-authority.d.ts +0 -70
- package/dist/server/collab-authority.js +0 -218
- package/dist/server/collab-authority.js.map +0 -1
- package/dist/server/collab.d.ts +0 -29
- package/dist/server/collab.js +0 -195
- package/dist/server/collab.js.map +0 -1
- package/dist/server/commit-scheduler.d.ts +0 -39
- package/dist/server/commit-scheduler.js +0 -113
- package/dist/server/commit-scheduler.js.map +0 -1
- package/dist/server/plugin-loader.d.ts +0 -53
- package/dist/server/plugin-loader.js +0 -155
- package/dist/server/plugin-loader.js.map +0 -1
- package/dist/server/routes/collab.d.ts +0 -6
- package/dist/server/routes/collab.js +0 -10
- package/dist/server/routes/collab.js.map +0 -1
- package/dist/server/routes/git-api.d.ts +0 -9
- package/dist/server/routes/git-api.js +0 -82
- package/dist/server/routes/git-api.js.map +0 -1
- package/dist/server/routes/meeting-ingest-api.d.ts +0 -15
- package/dist/server/routes/meeting-ingest-api.js +0 -321
- package/dist/server/routes/meeting-ingest-api.js.map +0 -1
- package/dist/server/routes/sync-api.d.ts +0 -26
- package/dist/server/routes/sync-api.js +0 -814
- package/dist/server/routes/sync-api.js.map +0 -1
- package/dist/server/routes/webhook.d.ts +0 -14
- package/dist/server/routes/webhook.js +0 -102
- package/dist/server/routes/webhook.js.map +0 -1
- package/dist/services/github-provisioner.d.ts +0 -36
- package/dist/services/github-provisioner.js +0 -126
- package/dist/services/github-provisioner.js.map +0 -1
- package/dist/services/github-service.d.ts +0 -99
- package/dist/services/github-service.js +0 -310
- package/dist/services/github-service.js.map +0 -1
- package/dist/services/insights.d.ts +0 -38
- package/dist/services/insights.js +0 -246
- package/dist/services/insights.js.map +0 -1
- package/dist/services/sync/collection-sync.d.ts +0 -60
- package/dist/services/sync/collection-sync.js +0 -509
- package/dist/services/sync/collection-sync.js.map +0 -1
- package/dist/services/sync/commit.d.ts +0 -60
- package/dist/services/sync/commit.js +0 -354
- package/dist/services/sync/commit.js.map +0 -1
- package/dist/services/sync/context-index.d.ts +0 -69
- package/dist/services/sync/context-index.js +0 -280
- package/dist/services/sync/context-index.js.map +0 -1
- package/dist/services/sync/data-fetcher.d.ts +0 -31
- package/dist/services/sync/data-fetcher.js +0 -12
- package/dist/services/sync/data-fetcher.js.map +0 -1
- package/dist/services/sync/derive.d.ts +0 -34
- package/dist/services/sync/derive.js +0 -164
- package/dist/services/sync/derive.js.map +0 -1
- package/dist/services/sync/enrichment-state.d.ts +0 -31
- package/dist/services/sync/enrichment-state.js +0 -63
- package/dist/services/sync/enrichment-state.js.map +0 -1
- package/dist/services/sync/enrichment.d.ts +0 -25
- package/dist/services/sync/enrichment.js +0 -121
- package/dist/services/sync/enrichment.js.map +0 -1
- package/dist/services/sync/entity-refresh.d.ts +0 -30
- package/dist/services/sync/entity-refresh.js +0 -275
- package/dist/services/sync/entity-refresh.js.map +0 -1
- package/dist/services/sync/frontmatter-extractor.d.ts +0 -40
- package/dist/services/sync/frontmatter-extractor.js +0 -279
- package/dist/services/sync/frontmatter-extractor.js.map +0 -1
- package/dist/services/sync/graph-match-state.d.ts +0 -33
- package/dist/services/sync/graph-match-state.js +0 -61
- package/dist/services/sync/graph-match-state.js.map +0 -1
- package/dist/services/sync/graph-match.d.ts +0 -53
- package/dist/services/sync/graph-match.js +0 -316
- package/dist/services/sync/graph-match.js.map +0 -1
- package/dist/services/sync/graphrag-client.d.ts +0 -43
- package/dist/services/sync/graphrag-client.js +0 -94
- package/dist/services/sync/graphrag-client.js.map +0 -1
- package/dist/services/sync/graphrag-config.d.ts +0 -16
- package/dist/services/sync/graphrag-config.js +0 -39
- package/dist/services/sync/graphrag-config.js.map +0 -1
- package/dist/services/sync/graphrag-context.d.ts +0 -14
- package/dist/services/sync/graphrag-context.js +0 -109
- package/dist/services/sync/graphrag-context.js.map +0 -1
- package/dist/services/sync/graphrag-indexer.d.ts +0 -30
- package/dist/services/sync/graphrag-indexer.js +0 -358
- package/dist/services/sync/graphrag-indexer.js.map +0 -1
- package/dist/services/sync/llm.d.ts +0 -32
- package/dist/services/sync/llm.js +0 -115
- package/dist/services/sync/llm.js.map +0 -1
- package/dist/services/sync/mcp-client.d.ts +0 -71
- package/dist/services/sync/mcp-client.js +0 -299
- package/dist/services/sync/mcp-client.js.map +0 -1
- package/dist/services/sync/model-factory.d.ts +0 -13
- package/dist/services/sync/model-factory.js +0 -38
- package/dist/services/sync/model-factory.js.map +0 -1
- package/dist/services/sync/name-quality.d.ts +0 -31
- package/dist/services/sync/name-quality.js +0 -60
- package/dist/services/sync/name-quality.js.map +0 -1
- package/dist/services/sync/output-schemas.d.ts +0 -92
- package/dist/services/sync/output-schemas.js +0 -43
- package/dist/services/sync/output-schemas.js.map +0 -1
- package/dist/services/sync/prompts.d.ts +0 -19
- package/dist/services/sync/prompts.js +0 -128
- package/dist/services/sync/prompts.js.map +0 -1
- package/dist/services/sync/reconciler.d.ts +0 -48
- package/dist/services/sync/reconciler.js +0 -294
- package/dist/services/sync/reconciler.js.map +0 -1
- package/dist/services/sync/rest-client.d.ts +0 -40
- package/dist/services/sync/rest-client.js +0 -100
- package/dist/services/sync/rest-client.js.map +0 -1
- package/dist/services/sync/source-config.d.ts +0 -67
- package/dist/services/sync/source-config.js +0 -304
- package/dist/services/sync/source-config.js.map +0 -1
- package/dist/services/sync/source-definitions/asana.d.ts +0 -14
- package/dist/services/sync/source-definitions/asana.js +0 -42
- package/dist/services/sync/source-definitions/asana.js.map +0 -1
- package/dist/services/sync/source-definitions/definitions.d.ts +0 -8
- package/dist/services/sync/source-definitions/definitions.js +0 -8
- package/dist/services/sync/source-definitions/definitions.js.map +0 -1
- package/dist/services/sync/source-definitions/gdrive.d.ts +0 -16
- package/dist/services/sync/source-definitions/gdrive.js +0 -68
- package/dist/services/sync/source-definitions/gdrive.js.map +0 -1
- package/dist/services/sync/source-definitions/granola.d.ts +0 -2
- package/dist/services/sync/source-definitions/granola.js +0 -21
- package/dist/services/sync/source-definitions/granola.js.map +0 -1
- package/dist/services/sync/source-definitions/linear.d.ts +0 -2
- package/dist/services/sync/source-definitions/linear.js +0 -62
- package/dist/services/sync/source-definitions/linear.js.map +0 -1
- package/dist/services/sync/source-definitions/obsidian.d.ts +0 -2
- package/dist/services/sync/source-definitions/obsidian.js +0 -55
- package/dist/services/sync/source-definitions/obsidian.js.map +0 -1
- package/dist/services/sync/source-definitions/pipedrive.d.ts +0 -2
- package/dist/services/sync/source-definitions/pipedrive.js +0 -43
- package/dist/services/sync/source-definitions/pipedrive.js.map +0 -1
- package/dist/services/sync/staging.d.ts +0 -53
- package/dist/services/sync/staging.js +0 -130
- package/dist/services/sync/staging.js.map +0 -1
- package/dist/services/sync/structured-extractor.d.ts +0 -57
- package/dist/services/sync/structured-extractor.js +0 -584
- package/dist/services/sync/structured-extractor.js.map +0 -1
- package/dist/services/sync/sync-runner.d.ts +0 -32
- package/dist/services/sync/sync-runner.js +0 -195
- package/dist/services/sync/sync-runner.js.map +0 -1
- package/dist/services/sync/sync-state.d.ts +0 -43
- package/dist/services/sync/sync-state.js +0 -154
- package/dist/services/sync/sync-state.js.map +0 -1
- package/dist/services/sync/types.d.ts +0 -381
- package/dist/services/sync/types.js +0 -8
- package/dist/services/sync/types.js.map +0 -1
- package/dist/services/sync/unstructured-extractor.d.ts +0 -27
- package/dist/services/sync/unstructured-extractor.js +0 -185
- package/dist/services/sync/unstructured-extractor.js.map +0 -1
- package/dist/utils/merge-resolver.d.ts +0 -59
- package/dist/utils/merge-resolver.js +0 -303
- package/dist/utils/merge-resolver.js.map +0 -1
- package/dist/utils/workspace-config.d.ts +0 -8
- package/dist/utils/workspace-config.js +0 -22
- package/dist/utils/workspace-config.js.map +0 -1
- package/dist/web/_app/immutable/assets/0.DdizXOKi.css +0 -1
- package/dist/web/_app/immutable/assets/10.BUrHkYry.css +0 -1
- package/dist/web/_app/immutable/assets/2.n7-yW_Fs.css +0 -1
- package/dist/web/_app/immutable/assets/3.BtaZagnv.css +0 -1
- package/dist/web/_app/immutable/assets/4.DSiqtN6T.css +0 -1
- package/dist/web/_app/immutable/assets/5.DFeGxLYf.css +0 -1
- package/dist/web/_app/immutable/assets/6.CquhUpOu.css +0 -1
- package/dist/web/_app/immutable/assets/7.CjbDRbuG.css +0 -1
- package/dist/web/_app/immutable/assets/8.S1QdUGNM.css +0 -1
- package/dist/web/_app/immutable/assets/9.CT4xL4K3.css +0 -1
- package/dist/web/_app/immutable/assets/Copy.FS8bdfxr.css +0 -1
- package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
- package/dist/web/_app/immutable/assets/ViewToolbar.D-QW2oKe.css +0 -1
- package/dist/web/_app/immutable/assets/index.D6tMDJWk.css +0 -1
- package/dist/web/_app/immutable/chunks/37NdyH6G.js +0 -32
- package/dist/web/_app/immutable/chunks/4Hhzb6pv.js +0 -1
- package/dist/web/_app/immutable/chunks/72bZS3G9.js +0 -1
- package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
- package/dist/web/_app/immutable/chunks/B340SUKR.js +0 -1
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
- package/dist/web/_app/immutable/chunks/BI8HVuKu.js +0 -1
- package/dist/web/_app/immutable/chunks/BO9dsUba.js +0 -1
- package/dist/web/_app/immutable/chunks/BS2rFAVq.js +0 -1
- package/dist/web/_app/immutable/chunks/BSsDC_p4.js +0 -1
- package/dist/web/_app/immutable/chunks/BTX2Jr8_.js +0 -1
- package/dist/web/_app/immutable/chunks/Bsacq2UX.js +0 -1
- package/dist/web/_app/immutable/chunks/ByunV8un.js +0 -1
- package/dist/web/_app/immutable/chunks/C7VoTosa.js +0 -2
- package/dist/web/_app/immutable/chunks/CDV5Q7RN.js +0 -1
- package/dist/web/_app/immutable/chunks/CJ8__CWt.js +0 -1
- package/dist/web/_app/immutable/chunks/CJUKmosC.js +0 -5
- package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
- package/dist/web/_app/immutable/chunks/CT6oIU-C.js +0 -1
- package/dist/web/_app/immutable/chunks/CTRxNfZk.js +0 -1
- package/dist/web/_app/immutable/chunks/CWQRQXxy.js +0 -1
- package/dist/web/_app/immutable/chunks/CXAIHzUX.js +0 -1
- package/dist/web/_app/immutable/chunks/CXH6iFbA.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/CaQ0MRCC.js +0 -1
- package/dist/web/_app/immutable/chunks/CdeYcEuU.js +0 -1
- package/dist/web/_app/immutable/chunks/CmCtpZ1Y.js +0 -1
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
- package/dist/web/_app/immutable/chunks/CrdV0ttd.js +0 -1
- package/dist/web/_app/immutable/chunks/CscoF-YL.js +0 -18
- package/dist/web/_app/immutable/chunks/Cx4YdFMk.js +0 -1
- package/dist/web/_app/immutable/chunks/D7ZqAKi9.js +0 -3
- package/dist/web/_app/immutable/chunks/DF6CqIgb.js +0 -1
- package/dist/web/_app/immutable/chunks/DGbA7IXh.js +0 -2
- package/dist/web/_app/immutable/chunks/DUScXtWD.js +0 -2
- package/dist/web/_app/immutable/chunks/DYsIuENi.js +0 -1
- package/dist/web/_app/immutable/chunks/DbbB6Up5.js +0 -1
- package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
- package/dist/web/_app/immutable/chunks/Dnnz2_is.js +0 -1
- package/dist/web/_app/immutable/chunks/DtM5cEDu.js +0 -1
- package/dist/web/_app/immutable/chunks/DviMV1EY.js +0 -4
- package/dist/web/_app/immutable/chunks/Eqahi7_S.js +0 -2
- package/dist/web/_app/immutable/chunks/FdYTYKiQ.js +0 -1
- package/dist/web/_app/immutable/chunks/O9Eb9k00.js +0 -1
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
- package/dist/web/_app/immutable/chunks/QF8MAmnc.js +0 -1
- package/dist/web/_app/immutable/chunks/UjzxCpxn.js +0 -1
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
- package/dist/web/_app/immutable/chunks/Y90OgS-9.js +0 -1
- package/dist/web/_app/immutable/chunks/cLyZlkXv.js +0 -1
- package/dist/web/_app/immutable/chunks/iDtAARVW.js +0 -2
- package/dist/web/_app/immutable/chunks/oC_W7W7p.js +0 -1
- package/dist/web/_app/immutable/chunks/rJdWIgh-.js +0 -1
- package/dist/web/_app/immutable/chunks/tvOsokaa.js +0 -1
- package/dist/web/_app/immutable/chunks/uLEXaPwE.js +0 -1
- package/dist/web/_app/immutable/chunks/vSaooFHB.js +0 -1
- package/dist/web/_app/immutable/entry/app.CaogB_bT.js +0 -2
- package/dist/web/_app/immutable/entry/start.wZ7yhkXM.js +0 -1
- package/dist/web/_app/immutable/nodes/0.Cq712UJU.js +0 -2
- package/dist/web/_app/immutable/nodes/1.Cf_Sxi8f.js +0 -1
- package/dist/web/_app/immutable/nodes/10.EhMTpB-W.js +0 -1
- package/dist/web/_app/immutable/nodes/2.pdWVc6Tw.js +0 -168
- package/dist/web/_app/immutable/nodes/3.DP7cSzLO.js +0 -1
- package/dist/web/_app/immutable/nodes/4.BASs7ojR.js +0 -12
- package/dist/web/_app/immutable/nodes/5.ZimC-3ag.js +0 -4
- package/dist/web/_app/immutable/nodes/6.CnZ2TeIl.js +0 -2
- package/dist/web/_app/immutable/nodes/7.hxwrWQeK.js +0 -2
- package/dist/web/_app/immutable/nodes/8.DEJ5W3rM.js +0 -1
- package/dist/web/_app/immutable/nodes/9.CIrEHtYu.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yjs-text-diff.js","sourceRoot":"","sources":["../../src/server/yjs-text-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC;AAEvB;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAAW,EAAE,KAAa,EAAE,MAAc,EAAE,MAAc;IACtF,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjC,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO;IAE/B,MAAM,GAAG,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7C,8EAA8E;IAC9E,0EAA0E;IAC1E,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAEhC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QACjB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YAC/B,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;gBACtB,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;YACrB,CAAC;iBAAM,IAAI,EAAE,KAAK,WAAW,EAAE,CAAC;gBAC9B,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC/B,uEAAuE;YACzE,CAAC;iBAAM,IAAI,EAAE,KAAK,WAAW,EAAE,CAAC;gBAC9B,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACxB,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC,EAAE,MAAM,CAAC,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-free per-folder access control helpers.
|
|
3
|
+
*
|
|
4
|
+
* These functions decide what a given user can see or write in the workspace.
|
|
5
|
+
* They take `AuthUser | undefined` directly (not a Fastify request) so they
|
|
6
|
+
* can be reused across transports — HTTP (/api/*), MCP HTTP (/mcp), and
|
|
7
|
+
* MCP stdio all share the same rules.
|
|
8
|
+
*
|
|
9
|
+
* Rule summary:
|
|
10
|
+
* - `user === undefined` means "no identified user". On the **web** this is
|
|
11
|
+
* API-key / open-mode (full access). On **MCP** the caller site rejects
|
|
12
|
+
* unidentified requests before reaching these helpers, so every MCP tool
|
|
13
|
+
* can assume a concrete user and `undefined` is never passed in.
|
|
14
|
+
* - A user can see a folder if they are an explicit member (folder_access row),
|
|
15
|
+
* or if they are the workspace owner AND the folder has more than one member
|
|
16
|
+
* (shared folders are visible to owners, solo folders stay private).
|
|
17
|
+
* - A user can write to a folder if they are a folder member (role = admin|editor),
|
|
18
|
+
* or if they are the workspace owner on a shared folder.
|
|
19
|
+
* - A folder with `personal: true` is only visible/writable to its owner,
|
|
20
|
+
* regardless of folder_access grants or workspace ownership. Stale grants
|
|
21
|
+
* (from an older sharing attempt or test setup) cannot leak a user's
|
|
22
|
+
* private notes to another account.
|
|
23
|
+
* - **Owner admin escalation**: workspace owners can lift the personal-
|
|
24
|
+
* folder restriction by passing `{ includePrivate: true }` to these
|
|
25
|
+
* helpers. The flag is enforced as owner-only inside the helpers — non-
|
|
26
|
+
* owners passing it get no extra access. The owner-only CLI (`clone` /
|
|
27
|
+
* `pull` / `push`) sends it unconditionally so the owner always sees every
|
|
28
|
+
* folder; web / API surfaces opt in via the `?include_private=1` query
|
|
29
|
+
* param on `/api/repos` or the `X-Studiograph-Include-Private: 1` header
|
|
30
|
+
* for git transport. Used for migrations, audits, and offboarding.
|
|
31
|
+
*/
|
|
32
|
+
import type { WorkspaceManager } from '../core/workspace-manager.js';
|
|
33
|
+
import type { RepoConfig } from '../core/types.js';
|
|
34
|
+
import { type AuthService, type AuthUser } from './auth-service.js';
|
|
35
|
+
/**
|
|
36
|
+
* Options accepted by the access helpers. `includePrivate` is an owner-
|
|
37
|
+
* gated admin escalation: workspace owners can opt into seeing every
|
|
38
|
+
* folder (including other users' personal ones) for migration / audit /
|
|
39
|
+
* offboarding work. Default operations stay scoped so the owner's daily
|
|
40
|
+
* workflow isn't cluttered with members' private content.
|
|
41
|
+
*/
|
|
42
|
+
export interface AccessOptions {
|
|
43
|
+
/** Owner-only override: when true AND caller is a workspace owner, the
|
|
44
|
+
* personal-folder restriction is lifted. No-op for non-owners. */
|
|
45
|
+
includePrivate?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Return the list of repos the user can access (content visibility).
|
|
49
|
+
* Unidentified caller (undefined) → full access, preserves legacy
|
|
50
|
+
* web / API-key behavior.
|
|
51
|
+
*/
|
|
52
|
+
export declare function getAccessibleRepos(user: AuthUser | undefined, workspaceManager: WorkspaceManager, authService: AuthService, opts?: AccessOptions): RepoConfig[];
|
|
53
|
+
/** True if the user may read the given folder's contents. */
|
|
54
|
+
export declare function hasRepoAccess(user: AuthUser | undefined, repoName: string, workspaceManager: WorkspaceManager, authService: AuthService, opts?: AccessOptions): boolean;
|
|
55
|
+
/** True if the user is a folder admin on the given repo, OR a workspace
|
|
56
|
+
* owner on a shared folder (>1 member). Solo/private folders require
|
|
57
|
+
* actual folder-admin membership — workspace ownership alone does not
|
|
58
|
+
* let owners rename, delete, or push members into a private folder. */
|
|
59
|
+
export declare function isFolderAdminOrOwner(user: AuthUser | undefined, repoName: string, workspaceManager: WorkspaceManager, authService: AuthService): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* True if the user may write (create/update/delete entities) in the given folder.
|
|
62
|
+
* Membership grants write access regardless of role (both 'admin' and 'editor'
|
|
63
|
+
* can edit), and workspace owners can write to shared folders.
|
|
64
|
+
*/
|
|
65
|
+
export declare function canWriteRepo(user: AuthUser | undefined, repoName: string, workspaceManager: WorkspaceManager, authService: AuthService): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Build a set of all entity IDs visible to the user across their accessible
|
|
68
|
+
* folders. Returns null when the caller is unidentified (no filtering needed —
|
|
69
|
+
* `filterWikilinks` treats null as "no-op").
|
|
70
|
+
*/
|
|
71
|
+
export declare function getAccessibleEntityIds(user: AuthUser | undefined, workspaceManager: WorkspaceManager, authService: AuthService): Set<string> | null;
|
|
72
|
+
/** Filter a wikilink list to only entities the caller can access. */
|
|
73
|
+
export declare function filterWikilinks(wikilinks: string[], accessibleIds: Set<string> | null): string[];
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-free per-folder access control helpers.
|
|
3
|
+
*
|
|
4
|
+
* These functions decide what a given user can see or write in the workspace.
|
|
5
|
+
* They take `AuthUser | undefined` directly (not a Fastify request) so they
|
|
6
|
+
* can be reused across transports — HTTP (/api/*), MCP HTTP (/mcp), and
|
|
7
|
+
* MCP stdio all share the same rules.
|
|
8
|
+
*
|
|
9
|
+
* Rule summary:
|
|
10
|
+
* - `user === undefined` means "no identified user". On the **web** this is
|
|
11
|
+
* API-key / open-mode (full access). On **MCP** the caller site rejects
|
|
12
|
+
* unidentified requests before reaching these helpers, so every MCP tool
|
|
13
|
+
* can assume a concrete user and `undefined` is never passed in.
|
|
14
|
+
* - A user can see a folder if they are an explicit member (folder_access row),
|
|
15
|
+
* or if they are the workspace owner AND the folder has more than one member
|
|
16
|
+
* (shared folders are visible to owners, solo folders stay private).
|
|
17
|
+
* - A user can write to a folder if they are a folder member (role = admin|editor),
|
|
18
|
+
* or if they are the workspace owner on a shared folder.
|
|
19
|
+
* - A folder with `personal: true` is only visible/writable to its owner,
|
|
20
|
+
* regardless of folder_access grants or workspace ownership. Stale grants
|
|
21
|
+
* (from an older sharing attempt or test setup) cannot leak a user's
|
|
22
|
+
* private notes to another account.
|
|
23
|
+
* - **Owner admin escalation**: workspace owners can lift the personal-
|
|
24
|
+
* folder restriction by passing `{ includePrivate: true }` to these
|
|
25
|
+
* helpers. The flag is enforced as owner-only inside the helpers — non-
|
|
26
|
+
* owners passing it get no extra access. The owner-only CLI (`clone` /
|
|
27
|
+
* `pull` / `push`) sends it unconditionally so the owner always sees every
|
|
28
|
+
* folder; web / API surfaces opt in via the `?include_private=1` query
|
|
29
|
+
* param on `/api/repos` or the `X-Studiograph-Include-Private: 1` header
|
|
30
|
+
* for git transport. Used for migrations, audits, and offboarding.
|
|
31
|
+
*/
|
|
32
|
+
import { isWorkspaceOwner } from './auth-service.js';
|
|
33
|
+
/** True if the folder is `personal: true` and the caller is not its owner.
|
|
34
|
+
* The personal flag is an owner-private invariant: it overrides folder_access
|
|
35
|
+
* rows and workspace ownership. Unidentified callers (open mode / API key)
|
|
36
|
+
* are never restricted — `undefined` user means full access. */
|
|
37
|
+
function isRestrictedPersonalFolder(user, repoName, workspaceManager) {
|
|
38
|
+
if (!user)
|
|
39
|
+
return false;
|
|
40
|
+
const repo = workspaceManager.getRepoConfig(repoName);
|
|
41
|
+
if (!repo?.personal)
|
|
42
|
+
return false;
|
|
43
|
+
// Missing owner_id on a personal folder would be a config bug; err on
|
|
44
|
+
// the side of deny to avoid leaking content.
|
|
45
|
+
return repo.owner_id === undefined || repo.owner_id !== user.id;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Return the list of repos the user can access (content visibility).
|
|
49
|
+
* Unidentified caller (undefined) → full access, preserves legacy
|
|
50
|
+
* web / API-key behavior.
|
|
51
|
+
*/
|
|
52
|
+
export function getAccessibleRepos(user, workspaceManager, authService, opts = {}) {
|
|
53
|
+
const allRepos = workspaceManager.getAllRepoConfigs();
|
|
54
|
+
if (!user)
|
|
55
|
+
return allRepos;
|
|
56
|
+
const allowed = new Set(authService.getUserFolders(user.id));
|
|
57
|
+
const isOwner = isWorkspaceOwner(user.role);
|
|
58
|
+
const ownerOverride = isOwner && opts.includePrivate === true;
|
|
59
|
+
return allRepos.filter(r => {
|
|
60
|
+
if (ownerOverride)
|
|
61
|
+
return true;
|
|
62
|
+
// Personal folders are owner-only, regardless of grants.
|
|
63
|
+
if (r.personal && r.owner_id !== user.id)
|
|
64
|
+
return false;
|
|
65
|
+
if (allowed.has(r.name))
|
|
66
|
+
return true;
|
|
67
|
+
if (isOwner && authService.getFolderMembers(r.name).length > 1)
|
|
68
|
+
return true;
|
|
69
|
+
return false;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/** True if the user may read the given folder's contents. */
|
|
73
|
+
export function hasRepoAccess(user, repoName, workspaceManager, authService, opts = {}) {
|
|
74
|
+
if (!user)
|
|
75
|
+
return true;
|
|
76
|
+
const isOwner = isWorkspaceOwner(user.role);
|
|
77
|
+
if (isOwner && opts.includePrivate === true)
|
|
78
|
+
return true;
|
|
79
|
+
if (isRestrictedPersonalFolder(user, repoName, workspaceManager))
|
|
80
|
+
return false;
|
|
81
|
+
if (authService.getUserFolders(user.id).includes(repoName))
|
|
82
|
+
return true;
|
|
83
|
+
if (isOwner && authService.getFolderMembers(repoName).length > 1)
|
|
84
|
+
return true;
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
/** True if the user is a folder admin on the given repo, OR a workspace
|
|
88
|
+
* owner on a shared folder (>1 member). Solo/private folders require
|
|
89
|
+
* actual folder-admin membership — workspace ownership alone does not
|
|
90
|
+
* let owners rename, delete, or push members into a private folder. */
|
|
91
|
+
export function isFolderAdminOrOwner(user, repoName, workspaceManager, authService) {
|
|
92
|
+
if (!user)
|
|
93
|
+
return true;
|
|
94
|
+
if (isRestrictedPersonalFolder(user, repoName, workspaceManager))
|
|
95
|
+
return false;
|
|
96
|
+
if (authService.isFolderAdmin(user.id, repoName))
|
|
97
|
+
return true;
|
|
98
|
+
if (isWorkspaceOwner(user.role) && authService.getFolderMembers(repoName).length > 1)
|
|
99
|
+
return true;
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* True if the user may write (create/update/delete entities) in the given folder.
|
|
104
|
+
* Membership grants write access regardless of role (both 'admin' and 'editor'
|
|
105
|
+
* can edit), and workspace owners can write to shared folders.
|
|
106
|
+
*/
|
|
107
|
+
export function canWriteRepo(user, repoName, workspaceManager, authService) {
|
|
108
|
+
if (!user)
|
|
109
|
+
return true;
|
|
110
|
+
if (isRestrictedPersonalFolder(user, repoName, workspaceManager))
|
|
111
|
+
return false;
|
|
112
|
+
const role = authService.getFolderRole(user.id, repoName);
|
|
113
|
+
if (role === 'admin' || role === 'editor')
|
|
114
|
+
return true;
|
|
115
|
+
if (isWorkspaceOwner(user.role) && authService.getFolderMembers(repoName).length > 1)
|
|
116
|
+
return true;
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Build a set of all entity IDs visible to the user across their accessible
|
|
121
|
+
* folders. Returns null when the caller is unidentified (no filtering needed —
|
|
122
|
+
* `filterWikilinks` treats null as "no-op").
|
|
123
|
+
*/
|
|
124
|
+
export function getAccessibleEntityIds(user, workspaceManager, authService) {
|
|
125
|
+
if (!user)
|
|
126
|
+
return null;
|
|
127
|
+
const repos = getAccessibleRepos(user, workspaceManager, authService);
|
|
128
|
+
const ids = new Set();
|
|
129
|
+
for (const repo of repos) {
|
|
130
|
+
try {
|
|
131
|
+
const graph = workspaceManager.getGraph(repo.name);
|
|
132
|
+
for (const e of graph.search({})) {
|
|
133
|
+
ids.add(e.id);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch { /* skip unmounted repos */ }
|
|
137
|
+
}
|
|
138
|
+
return ids;
|
|
139
|
+
}
|
|
140
|
+
/** Filter a wikilink list to only entities the caller can access. */
|
|
141
|
+
export function filterWikilinks(wikilinks, accessibleIds) {
|
|
142
|
+
if (!accessibleIds)
|
|
143
|
+
return wikilinks;
|
|
144
|
+
return wikilinks.filter(id => accessibleIds.has(id));
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=access-control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-control.js","sourceRoot":"","sources":["../../src/services/access-control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared repo-asset listing.
|
|
3
|
+
*
|
|
4
|
+
* Builds the list of assets owned by entries in a single repo, merging the two
|
|
5
|
+
* storage schemes (legacy `{type}/{id}/{filename}` blobs surfaced by the
|
|
6
|
+
* backend's listAll, and immutable-keyed assets tracked only in the ownership
|
|
7
|
+
* index). Extracted from the asset-api route so the HTTP endpoints and the MCP
|
|
8
|
+
* `list_assets` tool return an identical shape — including a render-safe
|
|
9
|
+
* `embed` string callers can paste straight into an entry body.
|
|
10
|
+
*/
|
|
11
|
+
import type { WorkspaceManager } from '../core/workspace-manager.js';
|
|
12
|
+
export interface RepoAsset {
|
|
13
|
+
filename: string;
|
|
14
|
+
size: number;
|
|
15
|
+
contentType: string;
|
|
16
|
+
url: string;
|
|
17
|
+
/** Render-safe markdown embed: ``. Paste verbatim. */
|
|
18
|
+
embed: string;
|
|
19
|
+
/** Immutable asset id when the asset is index-tracked; null for legacy blobs. */
|
|
20
|
+
assetId: string | null;
|
|
21
|
+
entityType: string;
|
|
22
|
+
entityId: string;
|
|
23
|
+
entityName: string;
|
|
24
|
+
mediaType: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Build the asset list for a single repo. Returns [] if the repo's graph can't
|
|
28
|
+
* be loaded (right for the bulk endpoint; single-repo callers should check
|
|
29
|
+
* repo existence themselves first if they want a 404).
|
|
30
|
+
*
|
|
31
|
+
* Algorithm (works for both local and R2 backends):
|
|
32
|
+
* 1. One listAllAssets() call — single filesystem walk or one paginated S3
|
|
33
|
+
* ListObjectsV2 request. No HEAD round-trips, no markdown parsing.
|
|
34
|
+
* 2. Resolve each asset's entity markdown path via the graph's file index
|
|
35
|
+
* (not a `{plural}/{id}.md` guess, which misses root/nested entries).
|
|
36
|
+
* 3. Merge in immutable-keyed assets from the ownership index — these live
|
|
37
|
+
* under an `{assetId}/` prefix the backend's listAll can't see.
|
|
38
|
+
*/
|
|
39
|
+
export declare function listRepoAssets(repo: string, workspaceManager: WorkspaceManager): Promise<RepoAsset[]>;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared repo-asset listing.
|
|
3
|
+
*
|
|
4
|
+
* Builds the list of assets owned by entries in a single repo, merging the two
|
|
5
|
+
* storage schemes (legacy `{type}/{id}/{filename}` blobs surfaced by the
|
|
6
|
+
* backend's listAll, and immutable-keyed assets tracked only in the ownership
|
|
7
|
+
* index). Extracted from the asset-api route so the HTTP endpoints and the MCP
|
|
8
|
+
* `list_assets` tool return an identical shape — including a render-safe
|
|
9
|
+
* `embed` string callers can paste straight into an entry body.
|
|
10
|
+
*/
|
|
11
|
+
import { publicUrlFor, publicUrlForAssetId } from './assets/index.js';
|
|
12
|
+
import { assetEmbed } from '../core/embeds.js';
|
|
13
|
+
import { readFileSync } from 'fs';
|
|
14
|
+
/**
|
|
15
|
+
* Read the `name:` field from a markdown file's YAML frontmatter without a
|
|
16
|
+
* full YAML parse. Returns null if the file can't be read or has no name.
|
|
17
|
+
* Lets the asset list label assets by entity name without paying the cost of
|
|
18
|
+
* a full markdownService.parseFile() per entity.
|
|
19
|
+
*/
|
|
20
|
+
function extractEntityName(mdPath) {
|
|
21
|
+
try {
|
|
22
|
+
const raw = readFileSync(mdPath, 'utf-8');
|
|
23
|
+
// Frontmatter is always at the top; don't read past ~2KB.
|
|
24
|
+
const head = raw.slice(0, 2048);
|
|
25
|
+
if (!head.startsWith('---'))
|
|
26
|
+
return null;
|
|
27
|
+
const end = head.indexOf('\n---', 3);
|
|
28
|
+
const block = end === -1 ? head : head.slice(0, end);
|
|
29
|
+
// Match `name: value` or `name: "value"` or `name: 'value'`.
|
|
30
|
+
const match = block.match(/^name:\s*(?:'([^']*)'|"([^"]*)"|(.+?))\s*$/m);
|
|
31
|
+
if (!match)
|
|
32
|
+
return null;
|
|
33
|
+
return (match[1] ?? match[2] ?? match[3]).trim() || null;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build the asset list for a single repo. Returns [] if the repo's graph can't
|
|
41
|
+
* be loaded (right for the bulk endpoint; single-repo callers should check
|
|
42
|
+
* repo existence themselves first if they want a 404).
|
|
43
|
+
*
|
|
44
|
+
* Algorithm (works for both local and R2 backends):
|
|
45
|
+
* 1. One listAllAssets() call — single filesystem walk or one paginated S3
|
|
46
|
+
* ListObjectsV2 request. No HEAD round-trips, no markdown parsing.
|
|
47
|
+
* 2. Resolve each asset's entity markdown path via the graph's file index
|
|
48
|
+
* (not a `{plural}/{id}.md` guess, which misses root/nested entries).
|
|
49
|
+
* 3. Merge in immutable-keyed assets from the ownership index — these live
|
|
50
|
+
* under an `{assetId}/` prefix the backend's listAll can't see.
|
|
51
|
+
*/
|
|
52
|
+
export async function listRepoAssets(repo, workspaceManager) {
|
|
53
|
+
let graph;
|
|
54
|
+
try {
|
|
55
|
+
graph = workspaceManager.getGraph(repo);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
let allAssets;
|
|
61
|
+
try {
|
|
62
|
+
allAssets = await graph.listAllAssets();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
const nameCache = new Map();
|
|
68
|
+
const result = [];
|
|
69
|
+
for (const asset of allAssets) {
|
|
70
|
+
const mdPath = graph.getEntityFilePath(asset.entityType, asset.entityId);
|
|
71
|
+
if (!mdPath)
|
|
72
|
+
continue;
|
|
73
|
+
const key = `${asset.entityType}/${asset.entityId}`;
|
|
74
|
+
let entityName = nameCache.get(key);
|
|
75
|
+
if (entityName === undefined) {
|
|
76
|
+
entityName = extractEntityName(mdPath) ?? asset.entityId;
|
|
77
|
+
nameCache.set(key, entityName);
|
|
78
|
+
}
|
|
79
|
+
const url = publicUrlFor(asset, asset.entityType, asset.entityId);
|
|
80
|
+
result.push({
|
|
81
|
+
filename: asset.filename,
|
|
82
|
+
size: asset.size,
|
|
83
|
+
contentType: asset.contentType,
|
|
84
|
+
url,
|
|
85
|
+
embed: assetEmbed(asset.filename, url),
|
|
86
|
+
assetId: null,
|
|
87
|
+
entityType: asset.entityType,
|
|
88
|
+
entityId: asset.entityId,
|
|
89
|
+
entityName,
|
|
90
|
+
mediaType: asset.mediaType,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// Immutable-keyed assets live in the ownership index, not under a
|
|
94
|
+
// {type}/{id} key prefix, so backend.listAll() can't see them. Merge them in
|
|
95
|
+
// from assets.db. (During the migration cutover — after migrate, before
|
|
96
|
+
// old-blob cleanup — an asset can appear via both paths; that transient
|
|
97
|
+
// duplicate clears when the legacy blobs are deleted.)
|
|
98
|
+
const index = workspaceManager.getAssetIndex?.();
|
|
99
|
+
if (index) {
|
|
100
|
+
for (const row of index.listByRepo(repo)) {
|
|
101
|
+
const mdPath = graph.getEntityFilePath(row.ownerType, row.ownerId);
|
|
102
|
+
const key = `${row.ownerType}/${row.ownerId}`;
|
|
103
|
+
let entityName = nameCache.get(key);
|
|
104
|
+
if (entityName === undefined) {
|
|
105
|
+
entityName = (mdPath ? extractEntityName(mdPath) : null) ?? row.ownerId;
|
|
106
|
+
nameCache.set(key, entityName);
|
|
107
|
+
}
|
|
108
|
+
const url = publicUrlForAssetId(row.assetId, row.filename);
|
|
109
|
+
result.push({
|
|
110
|
+
filename: row.filename,
|
|
111
|
+
size: 0, // size isn't tracked in the index; a backend HEAD would cost a round-trip
|
|
112
|
+
contentType: row.contentType,
|
|
113
|
+
url,
|
|
114
|
+
embed: assetEmbed(row.filename, url),
|
|
115
|
+
assetId: row.assetId,
|
|
116
|
+
entityType: row.ownerType,
|
|
117
|
+
entityId: row.ownerId,
|
|
118
|
+
entityName,
|
|
119
|
+
mediaType: row.mediaType,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=asset-listing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-listing.js","sourceRoot":"","sources":["../../src/services/asset-listing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset Upload Service
|
|
3
|
+
*
|
|
4
|
+
* Single primitive for "store a binary, create a wrapper entity that
|
|
5
|
+
* points at it." Used by both the standalone `POST /api/repos/:repo/assets`
|
|
6
|
+
* route and the multi-file import dispatcher when it sees a binary
|
|
7
|
+
* extension.
|
|
8
|
+
*
|
|
9
|
+
* Flow per file:
|
|
10
|
+
* 1. Validate extension against `ASSET_UPLOAD_EXTENSIONS`.
|
|
11
|
+
* 2. Create the `asset` entity with stub frontmatter (collision-retry
|
|
12
|
+
* on entity_id, same `foo`→`foo-2` semantics as import-service).
|
|
13
|
+
* 3. Upload the binary via `graph.uploadAsset` — picks R2 or local
|
|
14
|
+
* filesystem from the workspace's asset config.
|
|
15
|
+
* 4. PDFs: extract text + page count via `pdf-parse`, write the text
|
|
16
|
+
* to a sidecar at `<workspace>/.studiograph/assets-text/asset/{id}.txt`
|
|
17
|
+
* so the vector indexer can RAG it without bloating the markdown body.
|
|
18
|
+
* 5. Update the entity with the resolved `asset_url` and per-kind
|
|
19
|
+
* metadata (`pages`, future `width`/`height`).
|
|
20
|
+
*/
|
|
21
|
+
import type { BaseGraphManager } from '../core/graph.js';
|
|
22
|
+
import type { AssetKind } from '../core/validation.js';
|
|
23
|
+
import type { GitUser } from './git.js';
|
|
24
|
+
export interface UploadAssetOptions {
|
|
25
|
+
graph: BaseGraphManager;
|
|
26
|
+
/** Original filename from the client. May contain path segments — only the basename is used. */
|
|
27
|
+
filename: string;
|
|
28
|
+
buffer: Buffer;
|
|
29
|
+
/** Repo-relative folder for the new entity's .md file. Empty/undefined = repo root. */
|
|
30
|
+
folderPath?: string;
|
|
31
|
+
/** Override entity name; defaults to title-cased slug of the filename stem. */
|
|
32
|
+
name?: string;
|
|
33
|
+
user?: GitUser;
|
|
34
|
+
/** Defer git commit so the caller can batch (e.g. multi-file imports). Default false. */
|
|
35
|
+
skipCommit?: boolean;
|
|
36
|
+
/** Workspace root used to anchor the PDF text sidecar at
|
|
37
|
+
* `<workspacePath>/.studiograph/assets-text/asset/{id}.txt`. When
|
|
38
|
+
* undefined, sidecars are not written (the asset still uploads). */
|
|
39
|
+
workspacePath?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface UploadAssetResult {
|
|
42
|
+
entityId: string;
|
|
43
|
+
entityType: 'asset';
|
|
44
|
+
/** Absolute path of the created `.md` entity file. */
|
|
45
|
+
filePath: string;
|
|
46
|
+
asset_url: string;
|
|
47
|
+
asset_kind: AssetKind;
|
|
48
|
+
asset_size: number;
|
|
49
|
+
pages?: number;
|
|
50
|
+
/** Sidecar path when one was written (PDF only). Caller can include in batched commit's extraPaths. */
|
|
51
|
+
sidecarPath?: string;
|
|
52
|
+
}
|
|
53
|
+
export declare function uploadAsset(opts: UploadAssetOptions): Promise<UploadAssetResult>;
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset Upload Service
|
|
3
|
+
*
|
|
4
|
+
* Single primitive for "store a binary, create a wrapper entity that
|
|
5
|
+
* points at it." Used by both the standalone `POST /api/repos/:repo/assets`
|
|
6
|
+
* route and the multi-file import dispatcher when it sees a binary
|
|
7
|
+
* extension.
|
|
8
|
+
*
|
|
9
|
+
* Flow per file:
|
|
10
|
+
* 1. Validate extension against `ASSET_UPLOAD_EXTENSIONS`.
|
|
11
|
+
* 2. Create the `asset` entity with stub frontmatter (collision-retry
|
|
12
|
+
* on entity_id, same `foo`→`foo-2` semantics as import-service).
|
|
13
|
+
* 3. Upload the binary via `graph.uploadAsset` — picks R2 or local
|
|
14
|
+
* filesystem from the workspace's asset config.
|
|
15
|
+
* 4. PDFs: extract text + page count via `pdf-parse`, write the text
|
|
16
|
+
* to a sidecar at `<workspace>/.studiograph/assets-text/asset/{id}.txt`
|
|
17
|
+
* so the vector indexer can RAG it without bloating the markdown body.
|
|
18
|
+
* 5. Update the entity with the resolved `asset_url` and per-kind
|
|
19
|
+
* metadata (`pages`, future `width`/`height`).
|
|
20
|
+
*/
|
|
21
|
+
import { extname, basename, join } from 'path';
|
|
22
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
23
|
+
import { log } from '../utils/log.js';
|
|
24
|
+
import { detectAssetKind, detectContentType, isAssetUploadExtension, } from './assets/base.js';
|
|
25
|
+
const slugify = (str) => str.toLowerCase().trim().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
26
|
+
const formatName = (slug) => slug.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
|
|
27
|
+
const safeFilename = (name) => name.replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
28
|
+
export async function uploadAsset(opts) {
|
|
29
|
+
const { graph, buffer, folderPath, user, skipCommit = false, workspacePath } = opts;
|
|
30
|
+
const onlyName = basename(opts.filename);
|
|
31
|
+
const ext = extname(onlyName).toLowerCase();
|
|
32
|
+
if (!isAssetUploadExtension(onlyName)) {
|
|
33
|
+
throw new Error(`Unsupported asset extension: ${ext || '(none)'}`);
|
|
34
|
+
}
|
|
35
|
+
if (!buffer || buffer.length === 0) {
|
|
36
|
+
throw new Error('Asset upload received an empty buffer');
|
|
37
|
+
}
|
|
38
|
+
const assetKind = detectAssetKind(onlyName);
|
|
39
|
+
const mime = detectContentType(onlyName);
|
|
40
|
+
// Probe asset configuration before mutating the graph. listAssets() is
|
|
41
|
+
// cheap and surfaces a helpful error when R2/local storage isn't
|
|
42
|
+
// wired up — better to fail before creating a stub entity that has
|
|
43
|
+
// nowhere to point at.
|
|
44
|
+
try {
|
|
45
|
+
await graph.listAssets('asset', '__check__');
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
if (err.message?.includes('not configured')) {
|
|
49
|
+
throw new Error('Asset storage is not configured for this workspace.');
|
|
50
|
+
}
|
|
51
|
+
// Other errors (e.g. entity-not-found) just mean the service IS configured.
|
|
52
|
+
}
|
|
53
|
+
const stem = onlyName.replace(/\.[^.]+$/, '');
|
|
54
|
+
const baseId = (slugify(stem).slice(0, 80).replace(/-$/, '')) || `asset-${Date.now()}`;
|
|
55
|
+
const name = opts.name ?? formatName(baseId);
|
|
56
|
+
const now = new Date().toISOString();
|
|
57
|
+
const userHandle = user?.email?.split('@')[0] ?? user?.name ?? 'upload';
|
|
58
|
+
const stubData = {
|
|
59
|
+
entity_type: 'asset',
|
|
60
|
+
entity_id: baseId,
|
|
61
|
+
name,
|
|
62
|
+
// Stub URL — populated post-upload. Required by the schema; '__pending__'
|
|
63
|
+
// is replaced before the second commit lands.
|
|
64
|
+
asset_url: '__pending__',
|
|
65
|
+
asset_kind: assetKind,
|
|
66
|
+
asset_extension: ext,
|
|
67
|
+
asset_size: buffer.length,
|
|
68
|
+
asset_mime: mime,
|
|
69
|
+
created_at: now,
|
|
70
|
+
updated_at: now,
|
|
71
|
+
created_by: userHandle,
|
|
72
|
+
updated_by: userHandle,
|
|
73
|
+
};
|
|
74
|
+
// Collision retry on (asset, entity_id). Mirrors the suffix scheme in
|
|
75
|
+
// import-service.createWithCollisionRetry — keeps re-uploads from
|
|
76
|
+
// silently dropping files.
|
|
77
|
+
let entityId = baseId;
|
|
78
|
+
let createdPath;
|
|
79
|
+
let suffix = 0;
|
|
80
|
+
while (true) {
|
|
81
|
+
entityId = suffix === 0 ? baseId : `${baseId}-${suffix + 1}`;
|
|
82
|
+
try {
|
|
83
|
+
const created = await graph.create({
|
|
84
|
+
entityType: 'asset',
|
|
85
|
+
entityId,
|
|
86
|
+
data: { ...stubData, entity_id: entityId },
|
|
87
|
+
content: '',
|
|
88
|
+
folderPath,
|
|
89
|
+
skipCommit: true,
|
|
90
|
+
user,
|
|
91
|
+
});
|
|
92
|
+
createdPath = created.path;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
97
|
+
if (!msg.includes('already exists') || suffix >= 50)
|
|
98
|
+
throw err;
|
|
99
|
+
suffix++;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Everything past this point operates on a real on-disk stub entity
|
|
103
|
+
// with `asset_url: '__pending__'`. If any step throws, the stub must be
|
|
104
|
+
// rolled back — otherwise the entity persists with a placeholder URL
|
|
105
|
+
// that surfaces as a broken asset in list/gallery/search/RAG. Rollback
|
|
106
|
+
// commits a delete (graph.delete is auto-commit-only by design); on the
|
|
107
|
+
// batch import path that's one extra commit per failure, which is
|
|
108
|
+
// acceptable on a failure path.
|
|
109
|
+
let pages;
|
|
110
|
+
let sidecarPath;
|
|
111
|
+
let asset_url;
|
|
112
|
+
try {
|
|
113
|
+
// Storage filename gets a Date.now() prefix to dodge same-name re-uploads.
|
|
114
|
+
const storedFilename = `${Date.now()}-${safeFilename(onlyName)}`;
|
|
115
|
+
const asset = await graph.uploadAsset('asset', entityId, storedFilename, buffer);
|
|
116
|
+
// PDF metadata extraction. pdf-parse is CPU-bound and runs on the
|
|
117
|
+
// request thread — gate by size so a 100MB PDF doesn't stall the
|
|
118
|
+
// event loop for every other in-flight Fastify request. Asset still
|
|
119
|
+
// uploads; it just won't be RAG-searchable until a future re-extract.
|
|
120
|
+
if (assetKind === 'pdf') {
|
|
121
|
+
const PDF_TEXT_BYTES_CAP = 20 * 1024 * 1024;
|
|
122
|
+
if (buffer.length > PDF_TEXT_BYTES_CAP) {
|
|
123
|
+
log.warn(`[asset-upload] PDF text extraction skipped for ${entityId}: ${buffer.length} bytes > ${PDF_TEXT_BYTES_CAP} cap`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
let extractedText = '';
|
|
127
|
+
try {
|
|
128
|
+
const { PDFParse } = await import('pdf-parse');
|
|
129
|
+
const parser = new PDFParse({ data: buffer });
|
|
130
|
+
const result = await parser.getText();
|
|
131
|
+
await parser.destroy();
|
|
132
|
+
if (result.total && result.total > 0)
|
|
133
|
+
pages = result.total;
|
|
134
|
+
extractedText = result.text?.trim() ?? '';
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
// Non-fatal — extraction can fail on encrypted/scanned PDFs.
|
|
138
|
+
// Don't conflate with sidecar write failures (infra problem,
|
|
139
|
+
// not content problem) — those get their own warn below.
|
|
140
|
+
log.warn(`[asset-upload] PDF text extraction failed for ${entityId}: ${err instanceof Error ? err.message : err}`);
|
|
141
|
+
}
|
|
142
|
+
if (extractedText && workspacePath) {
|
|
143
|
+
try {
|
|
144
|
+
const sidecarDir = join(workspacePath, '.studiograph', 'assets-text', 'asset');
|
|
145
|
+
if (!existsSync(sidecarDir))
|
|
146
|
+
mkdirSync(sidecarDir, { recursive: true });
|
|
147
|
+
sidecarPath = join(sidecarDir, `${entityId}.txt`);
|
|
148
|
+
writeFileSync(sidecarPath, extractedText, 'utf-8');
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
// Sidecar write failures (disk full, permissions) leave the
|
|
152
|
+
// asset un-RAG-able but otherwise usable. Re-indexing later
|
|
153
|
+
// picks it back up if the sidecar appears.
|
|
154
|
+
sidecarPath = undefined;
|
|
155
|
+
log.warn(`[asset-upload] PDF sidecar write failed for ${entityId}: ${err instanceof Error ? err.message : err}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Canonical URL from uploadAsset (immutable-key scheme when wired, else
|
|
161
|
+
// legacy). Don't re-derive — the assetId isn't recoverable from (type,id).
|
|
162
|
+
asset_url = asset.publicUrl;
|
|
163
|
+
const updateData = { asset_url };
|
|
164
|
+
if (pages !== undefined)
|
|
165
|
+
updateData.pages = pages;
|
|
166
|
+
await graph.update({
|
|
167
|
+
entityType: 'asset',
|
|
168
|
+
entityId,
|
|
169
|
+
data: updateData,
|
|
170
|
+
skipCommit: true,
|
|
171
|
+
user,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
try {
|
|
176
|
+
await graph.delete('asset', entityId, `Rollback failed asset upload: ${entityId}`, user);
|
|
177
|
+
}
|
|
178
|
+
catch (cleanupErr) {
|
|
179
|
+
log.warn(`[asset-upload] rollback delete failed for ${entityId}: ${cleanupErr instanceof Error ? cleanupErr.message : cleanupErr}`);
|
|
180
|
+
}
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
if (!skipCommit) {
|
|
184
|
+
const git = graph.getGitService();
|
|
185
|
+
if (git) {
|
|
186
|
+
const commitUser = user ?? { id: 'upload', name: 'Upload', email: 'upload@studiograph' };
|
|
187
|
+
git.commitAll(`Upload asset: ${entityId}`, commitUser);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
entityId,
|
|
192
|
+
entityType: 'asset',
|
|
193
|
+
filePath: createdPath,
|
|
194
|
+
asset_url,
|
|
195
|
+
asset_kind: assetKind,
|
|
196
|
+
asset_size: buffer.length,
|
|
197
|
+
pages,
|
|
198
|
+
sidecarPath,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=asset-upload-service.js.map
|