studiograph 1.3.48-next.13 → 1.3.48-next.131
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 +7 -7
- package/dist/agent/agent-pool.d.ts +27 -1
- package/dist/agent/agent-pool.js +55 -12
- 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 +29 -2
- package/dist/agent/orchestrator.js +251 -38
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +30 -0
- package/dist/agent/prompts/entity-types-section.js +83 -0
- package/dist/agent/prompts/entity-types-section.js.map +1 -0
- package/dist/agent/prompts/system.md +106 -47
- 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 +79 -343
- 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 +89 -14
- 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 +25 -72
- package/dist/agent/tools/graph-tools.js +362 -366
- 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/message-tools.d.ts +13 -11
- package/dist/agent/tools/message-tools.js +31 -39
- package/dist/agent/tools/message-tools.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +5 -4
- package/dist/agent/tools/ops-tools.js +99 -212
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +39 -16
- package/dist/agent/tools/permission-tools.js +66 -41
- 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/audit.d.ts +21 -0
- package/dist/cli/commands/audit.js +174 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/clear.d.ts +5 -0
- package/dist/cli/commands/clear.js +144 -1
- package/dist/cli/commands/clear.js.map +1 -1
- package/dist/cli/commands/clone.d.ts +1 -1
- package/dist/cli/commands/clone.js +82 -23
- package/dist/cli/commands/clone.js.map +1 -1
- package/dist/cli/commands/deploy.js +79 -18
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/folder.d.ts +11 -0
- package/dist/cli/commands/folder.js +186 -0
- package/dist/cli/commands/folder.js.map +1 -0
- package/dist/cli/commands/index.js +2 -2
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +16 -14
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/join.d.ts +1 -1
- package/dist/cli/commands/join.js +26 -14
- package/dist/cli/commands/join.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/r2.d.ts +3 -0
- package/dist/cli/commands/r2.js +196 -1
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.js +41 -1
- package/dist/cli/commands/redeploy.js.map +1 -1
- package/dist/cli/commands/secrets.d.ts +23 -0
- package/dist/cli/commands/secrets.js +256 -0
- package/dist/cli/commands/secrets.js.map +1 -0
- package/dist/cli/commands/serve.js +143 -24
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/start.js +140 -71
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +509 -163
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/user.js +8 -24
- package/dist/cli/commands/user.js.map +1 -1
- package/dist/cli/index.js +8 -7
- package/dist/cli/index.js.map +1 -1
- 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/scaffolding.d.ts +4 -2
- package/dist/cli/scaffolding.js +42 -47
- package/dist/cli/scaffolding.js.map +1 -1
- package/dist/cli/setup-wizard.d.ts +30 -49
- package/dist/cli/setup-wizard.js +35 -38
- 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/entity-body-templates.d.ts +21 -0
- package/dist/core/entity-body-templates.js +48 -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 +136 -0
- package/dist/core/entity-types-catalog.js.map +1 -0
- package/dist/core/feature-flags.d.ts +22 -0
- package/dist/core/feature-flags.js +15 -0
- package/dist/core/feature-flags.js.map +1 -0
- package/dist/core/features.d.ts +16 -0
- package/dist/core/features.js +48 -0
- package/dist/core/features.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 +16 -0
- package/dist/core/folder-sidecar.js +45 -0
- package/dist/core/folder-sidecar.js.map +1 -0
- package/dist/core/graph.d.ts +471 -19
- package/dist/core/graph.js +1411 -284
- package/dist/core/graph.js.map +1 -1
- package/dist/core/schema-registry.js +1 -19
- 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 +78 -0
- package/dist/core/secrets/SqliteEncryptedStore.js +581 -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 +76 -0
- package/dist/core/secrets/dual-write.js +236 -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/importer.d.ts +94 -0
- package/dist/core/secrets/importer.js +319 -0
- package/dist/core/secrets/importer.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/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 +531 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/types.d.ts +70 -483
- package/dist/core/types.js +6 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +52 -12
- package/dist/core/user-config.js +119 -14
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +603 -1409
- package/dist/core/validation.js +248 -146
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +35 -14
- package/dist/core/workspace-manager.js +105 -56
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +19 -5
- package/dist/core/workspace.js +66 -39
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/connector-manager.d.ts +16 -1
- package/dist/mcp/connector-manager.js +44 -5
- package/dist/mcp/connector-manager.js.map +1 -1
- 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/tools.d.ts +27 -2
- package/dist/mcp/tools.js +544 -113
- 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/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 +385 -177
- 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.js +217 -65
- 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 +220 -44
- 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 +180 -24
- package/dist/server/routes/capture-api.js.map +1 -1
- package/dist/server/routes/chat.d.ts +4 -1
- package/dist/server/routes/chat.js +178 -46
- package/dist/server/routes/chat.js.map +1 -1
- 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.js +24 -18
- 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/event-ingest-api.js +125 -0
- package/dist/server/routes/event-ingest-api.js.map +1 -0
- package/dist/server/routes/features-api.d.ts +19 -0
- package/dist/server/routes/features-api.js +28 -0
- package/dist/server/routes/features-api.js.map +1 -0
- package/dist/server/routes/git-http.d.ts +2 -2
- package/dist/server/routes/git-http.js +69 -34
- 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 +93 -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 +1014 -315
- 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.js +156 -33
- package/dist/server/routes/insights-api.js.map +1 -1
- package/dist/server/routes/mcp.d.ts +6 -3
- package/dist/server/routes/mcp.js +22 -6
- package/dist/server/routes/mcp.js.map +1 -1
- package/dist/server/routes/messages-api.d.ts +3 -3
- package/dist/server/routes/messages-api.js +308 -120
- package/dist/server/routes/messages-api.js.map +1 -1
- 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/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/workspace-api.d.ts +2 -1
- package/dist/server/routes/workspace-api.js +131 -20
- 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 -18
- package/dist/server/routes/ws.js.map +1 -1
- package/dist/server/session-manager.d.ts +48 -5
- package/dist/server/session-manager.js +175 -11
- package/dist/server/session-manager.js.map +1 -1
- package/dist/server/ws-hub.d.ts +134 -22
- package/dist/server/ws-hub.js +0 -0
- package/dist/server/ws-hub.js.map +1 -1
- package/dist/server/yjs-manager.d.ts +107 -7
- package/dist/server/yjs-manager.js +444 -38
- package/dist/server/yjs-manager.js.map +1 -1
- package/dist/server/yjs-persistence.d.ts +143 -0
- package/dist/server/yjs-persistence.js +543 -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 +53 -0
- package/dist/services/access-control.js +132 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/asset-upload-service.d.ts +53 -0
- package/dist/services/asset-upload-service.js +200 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +38 -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 +41 -1
- package/dist/services/assets/index.js +65 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +7 -1
- package/dist/services/assets/local.js +83 -0
- package/dist/services/assets/local.js.map +1 -1
- package/dist/services/assets/r2.d.ts +28 -1
- package/dist/services/assets/r2.js +75 -1
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +184 -36
- package/dist/services/auth-service.js +763 -138
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/briefing.d.ts +1 -1
- package/dist/services/briefing.js +12 -35
- package/dist/services/briefing.js.map +1 -1
- package/dist/services/event-processor.d.ts +104 -0
- package/dist/services/event-processor.js +443 -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 +44 -0
- package/dist/services/git.js +162 -55
- package/dist/services/git.js.map +1 -1
- package/dist/services/heartbeat.d.ts +19 -12
- package/dist/services/heartbeat.js +162 -107
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/import-service.d.ts +37 -2
- package/dist/services/import-service.js +222 -123
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/lint-service.js +7 -14
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.js +6 -2
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/message-service.d.ts +62 -21
- package/dist/services/message-service.js +160 -43
- package/dist/services/message-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/vector-service.d.ts +73 -3
- package/dist/services/vector-service.js +106 -7
- 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.js +3 -3
- 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 +4 -1
- package/dist/utils/version-checker.js +8 -8
- package/dist/utils/version-checker.js.map +1 -1
- package/dist/web/_app/immutable/assets/0.Bp6xXZUi.css +2 -0
- package/dist/web/_app/immutable/assets/11.DlIf1mKh.css +1 -0
- package/dist/web/_app/immutable/assets/12.Dmlt28l2.css +1 -0
- package/dist/web/_app/immutable/assets/13.CmLrbzZp.css +1 -0
- package/dist/web/_app/immutable/assets/2.oo1ac0x_.css +1 -0
- package/dist/web/_app/immutable/assets/3.DJJsQzDb.css +1 -0
- package/dist/web/_app/immutable/assets/4.CZ-fNJ91.css +1 -0
- package/dist/web/_app/immutable/assets/AgentOverlay.BfWESlQU.css +1 -0
- package/dist/web/_app/immutable/assets/AssetManagerModal.ZfasE2L3.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.CeNagvyK.css +1 -0
- package/dist/web/_app/immutable/assets/ChatPanel.po0gYtVH.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMembersPanel.Bepw-r0F.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.Dy-qQjEc.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BHnGIltS.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.G3NZ0uHb.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.tBn8y9DD.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/TagFilter.DNipjifq.css +1 -0
- package/dist/web/_app/immutable/assets/TagPickerSheet.DJPuqnTg.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.B9zA92UB.css +1 -0
- package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
- package/dist/web/_app/immutable/assets/dialog.BxVal_19.css +1 -0
- package/dist/web/_app/immutable/assets/dist.B5hGjnfj.css +1 -0
- package/dist/web/_app/immutable/assets/dist.DDCWxn3B.css +1 -0
- package/dist/web/_app/immutable/assets/dropdown-menu.BSsUUQ3o.css +1 -0
- package/dist/web/_app/immutable/assets/entity-row.Bl5FyNCt.css +1 -0
- package/dist/web/_app/immutable/assets/greeting.Bm7lTneV.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.DORLo4xF.css +1 -0
- package/dist/web/_app/immutable/assets/notifications.clodJdp5.css +1 -0
- package/dist/web/_app/immutable/assets/radio-group.GJJRVPUJ.css +1 -0
- package/dist/web/_app/immutable/assets/select.D_AV992j.css +1 -0
- package/dist/web/_app/immutable/chunks/-KAQXGuI2.js +1 -0
- package/dist/web/_app/immutable/chunks/-wzwcH00.js +1 -0
- package/dist/web/_app/immutable/chunks/07l_1Zpm2.js +1 -0
- package/dist/web/_app/immutable/chunks/38oWKNzM2.js +6 -0
- package/dist/web/_app/immutable/chunks/54VmiJfH.js +1 -0
- package/dist/web/_app/immutable/chunks/6LRpFvjo.js +185 -0
- package/dist/web/_app/immutable/chunks/7R0Rp3Mz.js +1 -0
- package/dist/web/_app/immutable/chunks/9bCTHkeS.js +1 -0
- package/dist/web/_app/immutable/chunks/B-822WnD2.js +22 -0
- package/dist/web/_app/immutable/chunks/B0HUvliX2.js +2 -0
- package/dist/web/_app/immutable/chunks/B12eXGpE.js +1 -0
- package/dist/web/_app/immutable/chunks/B5af0X0p2.js +1 -0
- package/dist/web/_app/immutable/chunks/B6iYNwo72.js +1 -0
- package/dist/web/_app/immutable/chunks/B7EMtoAB.js +1 -0
- package/dist/web/_app/immutable/chunks/B7L4gmPR.js +2 -0
- package/dist/web/_app/immutable/chunks/B9qBGxh62.js +3 -0
- package/dist/web/_app/immutable/chunks/BDJYj9yi.js +2 -0
- package/dist/web/_app/immutable/chunks/BEpMEjHO.js +1 -0
- package/dist/web/_app/immutable/chunks/BErNpj-S2.js +1 -0
- package/dist/web/_app/immutable/chunks/BHBk4zfV.js +1 -0
- package/dist/web/_app/immutable/chunks/BHH-JGNF.js +1 -0
- package/dist/web/_app/immutable/chunks/BKe5wPiN.js +1 -0
- package/dist/web/_app/immutable/chunks/BNTlsKDJ.js +1 -0
- package/dist/web/_app/immutable/chunks/BOgcXgis2.js +1 -0
- package/dist/web/_app/immutable/chunks/BOyyDrjn2.js +1 -0
- package/dist/web/_app/immutable/chunks/BPR_ufQ0.js +41 -0
- package/dist/web/_app/immutable/chunks/BRcFsc6v.js +5 -0
- package/dist/web/_app/immutable/chunks/BT3KAag_.js +3 -0
- package/dist/web/_app/immutable/chunks/BX2T6xiZ.js +224 -0
- package/dist/web/_app/immutable/chunks/BZnJ8tbJ.js +1 -0
- package/dist/web/_app/immutable/chunks/Ba1Yzb7u.js +1 -0
- package/dist/web/_app/immutable/chunks/BcsvgA3B2.js +1 -0
- package/dist/web/_app/immutable/chunks/BfbS7rGT.js +1 -0
- package/dist/web/_app/immutable/chunks/BgagL41Z.js +1 -0
- package/dist/web/_app/immutable/chunks/BiUh0Sik.js +1 -0
- package/dist/web/_app/immutable/chunks/Biajc_oU.js +1 -0
- package/dist/web/_app/immutable/chunks/Bl9Pzopy.js +1 -0
- package/dist/web/_app/immutable/chunks/BmcU05mO.js +1 -0
- package/dist/web/_app/immutable/chunks/Bmgp0jlT.js +1 -0
- package/dist/web/_app/immutable/chunks/BmgyOoEp.js +1 -0
- package/dist/web/_app/immutable/chunks/Bq0-jBGC2.js +1 -0
- package/dist/web/_app/immutable/chunks/BqGj0_GS.js +1 -0
- package/dist/web/_app/immutable/chunks/Bsc9K3Pz.js +1 -0
- package/dist/web/_app/immutable/chunks/Bssb691Q.js +1 -0
- package/dist/web/_app/immutable/chunks/BuzQceOn.js +1 -0
- package/dist/web/_app/immutable/chunks/BzeVNab0.js +1 -0
- package/dist/web/_app/immutable/chunks/C-OaypFN.js +1 -0
- package/dist/web/_app/immutable/chunks/C0fjDjvE2.js +1 -0
- package/dist/web/_app/immutable/chunks/C0pTXwEX.js +2 -0
- package/dist/web/_app/immutable/chunks/C3Enww9L2.js +1 -0
- package/dist/web/_app/immutable/chunks/C3oa0Cks.js +1 -0
- package/dist/web/_app/immutable/chunks/CC-YWp-f.js +1 -0
- package/dist/web/_app/immutable/chunks/CGdKvXV92.js +1 -0
- package/dist/web/_app/immutable/chunks/CH0siYFL.js +1 -0
- package/dist/web/_app/immutable/chunks/CIchr8Tk2.js +1 -0
- package/dist/web/_app/immutable/chunks/CK_yXDQI.js +1 -0
- package/dist/web/_app/immutable/chunks/CLPtMig0.js +1 -0
- package/dist/web/_app/immutable/chunks/CLSxJmTj.js +2 -0
- package/dist/web/_app/immutable/chunks/CPQNcHIB.js +3 -0
- package/dist/web/_app/immutable/chunks/CPt2D5aU.js +1 -0
- package/dist/web/_app/immutable/chunks/CQ-2yccd.js +7 -0
- package/dist/web/_app/immutable/chunks/CS6VEwn7.js +1 -0
- package/dist/web/_app/immutable/chunks/CSGIGrrK.js +1 -0
- package/dist/web/_app/immutable/chunks/CSsDOIrk.js +1 -0
- package/dist/web/_app/immutable/chunks/CVXvEWhv2.js +1 -0
- package/dist/web/_app/immutable/chunks/CaChtuYU2.js +1 -0
- package/dist/web/_app/immutable/chunks/CbiwvM3R2.js +1 -0
- package/dist/web/_app/immutable/chunks/CdCuBMLm.js +156 -0
- package/dist/web/_app/immutable/chunks/CfqjDDMu.js +1 -0
- package/dist/web/_app/immutable/chunks/CjGzUnEF2.js +1 -0
- package/dist/web/_app/immutable/chunks/Cjgbiel7.js +1 -0
- package/dist/web/_app/immutable/chunks/ClNEskRf.js +1 -0
- package/dist/web/_app/immutable/chunks/CnqSKqA62.js +1 -0
- package/dist/web/_app/immutable/chunks/CqyqKPuh2.js +1 -0
- package/dist/web/_app/immutable/chunks/CrnX-oFV.js +1 -0
- package/dist/web/_app/immutable/chunks/CsGahE3a.js +1 -0
- package/dist/web/_app/immutable/chunks/CsXIliss.js +1 -0
- package/dist/web/_app/immutable/chunks/Ct3quP0F.js +1 -0
- package/dist/web/_app/immutable/chunks/CvZaxjRC.js +1 -0
- package/dist/web/_app/immutable/chunks/CwD4G56R.js +5 -0
- package/dist/web/_app/immutable/chunks/CxalqrMB.js +1 -0
- package/dist/web/_app/immutable/chunks/D1Ap3evT2.js +1 -0
- package/dist/web/_app/immutable/chunks/D7qgUfnr.js +2487 -0
- package/dist/web/_app/immutable/chunks/D9-_Euza2.js +1 -0
- package/dist/web/_app/immutable/chunks/DCCaoKt42.js +1 -0
- package/dist/web/_app/immutable/chunks/DDKweOZr2.js +23 -0
- package/dist/web/_app/immutable/chunks/DHeU-hHI2.js +2 -0
- package/dist/web/_app/immutable/chunks/DHepUItL.js +1 -0
- package/dist/web/_app/immutable/chunks/DL_KbCKq.js +8 -0
- package/dist/web/_app/immutable/chunks/DNtqqgv32.js +1 -0
- package/dist/web/_app/immutable/chunks/DRl7vwNC2.js +184 -0
- package/dist/web/_app/immutable/chunks/DTc5W_V6.js +1 -0
- package/dist/web/_app/immutable/chunks/DZetJu9k2.js +1 -0
- package/dist/web/_app/immutable/chunks/DaiJs3St.js +1 -0
- package/dist/web/_app/immutable/chunks/DhuJRrEX2.js +1 -0
- package/dist/web/_app/immutable/chunks/DiP2EplP.js +3 -0
- package/dist/web/_app/immutable/chunks/Dm25ot5x2.js +1 -0
- package/dist/web/_app/immutable/chunks/DqOcb9RX2.js +83 -0
- package/dist/web/_app/immutable/chunks/DrbUJCAE.js +1 -0
- package/dist/web/_app/immutable/chunks/Dt4HY2cT2.js +2 -0
- package/dist/web/_app/immutable/chunks/DtGUCMv8.js +6 -0
- package/dist/web/_app/immutable/chunks/Du2-B3c8.js +1 -0
- package/dist/web/_app/immutable/chunks/DwdkE4UD2.js +1 -0
- package/dist/web/_app/immutable/chunks/DxWesPbn.js +1 -0
- package/dist/web/_app/immutable/chunks/DyYZqUV72.js +1 -0
- package/dist/web/_app/immutable/chunks/HfUnhvrv2.js +1 -0
- package/dist/web/_app/immutable/chunks/Je8-BtCk2.js +1 -0
- package/dist/web/_app/immutable/chunks/LAN53VbP2.js +5 -0
- package/dist/web/_app/immutable/chunks/MSB7eA4_.js +1 -0
- package/dist/web/_app/immutable/chunks/NPe9WyW1.js +1 -0
- package/dist/web/_app/immutable/chunks/O6IzcxXJ.js +2 -0
- package/dist/web/_app/immutable/chunks/SXhc9rJW.js +1 -0
- package/dist/web/_app/immutable/chunks/TuBvdkhV2.js +1 -0
- package/dist/web/_app/immutable/chunks/U40J2SnU.js +1 -0
- package/dist/web/_app/immutable/chunks/VS3l21Gu.js +1 -0
- package/dist/web/_app/immutable/chunks/YEPEvlbU2.js +1 -0
- package/dist/web/_app/immutable/chunks/Z7TNRcgK.js +11 -0
- package/dist/web/_app/immutable/chunks/ZCekGjo6.js +5 -0
- package/dist/web/_app/immutable/chunks/_rnxQ655.js +4 -0
- package/dist/web/_app/immutable/chunks/dTXrX5Bw.js +2 -0
- package/dist/web/_app/immutable/chunks/gNXLhsdy.js +1 -0
- package/dist/web/_app/immutable/chunks/hKSTEN36.js +1 -0
- package/dist/web/_app/immutable/chunks/jZZTbzL5.js +1 -0
- package/dist/web/_app/immutable/chunks/l4FIBKss.js +1 -0
- package/dist/web/_app/immutable/chunks/l_4snZnh2.js +1 -0
- package/dist/web/_app/immutable/chunks/q6R6T-lK.js +1 -0
- package/dist/web/_app/immutable/chunks/qgprkMcL.js +1 -0
- package/dist/web/_app/immutable/chunks/rOisBLC62.js +14 -0
- package/dist/web/_app/immutable/chunks/t08TznXc2.js +1 -0
- package/dist/web/_app/immutable/chunks/t62M88qj.js +1 -0
- package/dist/web/_app/immutable/chunks/uCohGWC42.js +1 -0
- package/dist/web/_app/immutable/chunks/uqxmB78b.js +1 -0
- package/dist/web/_app/immutable/chunks/vwTMEIJQ.js +1 -0
- package/dist/web/_app/immutable/chunks/w1FCELam.js +64 -0
- package/dist/web/_app/immutable/chunks/zmjgin7A.js +1 -0
- package/dist/web/_app/immutable/chunks/zumDjcgJ.js +1 -0
- package/dist/web/_app/immutable/entry/app.B3JEO5sy.js +2 -0
- package/dist/web/_app/immutable/entry/start.Dk84vnrL.js +1 -0
- package/dist/web/_app/immutable/nodes/0.BKLFgYTV.js +2 -0
- package/dist/web/_app/immutable/nodes/1.Djf_1kN1.js +1 -0
- package/dist/web/_app/immutable/nodes/10.De6eGWLx.js +1 -0
- package/dist/web/_app/immutable/nodes/11.CDsfSRTw.js +1 -0
- package/dist/web/_app/immutable/nodes/12.BeKkKpkY.js +1 -0
- package/dist/web/_app/immutable/nodes/13.BcI8xwSy.js +1 -0
- package/dist/web/_app/immutable/nodes/2.ZMZ-QAZ7.js +106 -0
- package/dist/web/_app/immutable/nodes/3.C1ZiAfle.js +2 -0
- package/dist/web/_app/immutable/nodes/4.Chmqy9KF.js +2 -0
- package/dist/web/_app/immutable/nodes/5.Bpvr_Vcq.js +1 -0
- package/dist/web/_app/immutable/nodes/6.BHa_gOs3.js +1 -0
- package/dist/web/_app/immutable/nodes/7.D0hg4Eap.js +1 -0
- package/dist/web/_app/immutable/nodes/8.3ZUUxJqR.js +1 -0
- package/dist/web/_app/immutable/nodes/9.Ducy-oqR.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 +64 -21
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +28 -14
- package/dist/agent/role-loader.d.ts +0 -24
- package/dist/agent/role-loader.js +0 -67
- package/dist/agent/role-loader.js.map +0 -1
- 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/collection.d.ts +0 -10
- package/dist/cli/commands/collection.js +0 -185
- 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/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/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/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 -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/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/agents/agent-loader.d.ts +0 -16
- package/dist/server/agents/agent-loader.js +0 -175
- package/dist/server/agents/agent-loader.js.map +0 -1
- package/dist/server/agents/agent-runner.d.ts +0 -33
- package/dist/server/agents/agent-runner.js +0 -187
- package/dist/server/agents/agent-runner.js.map +0 -1
- package/dist/server/agents/agent-runtime.d.ts +0 -39
- package/dist/server/agents/agent-runtime.js +0 -214
- package/dist/server/agents/agent-runtime.js.map +0 -1
- package/dist/server/agents/base-agent.d.ts +0 -30
- package/dist/server/agents/base-agent.js +0 -88
- package/dist/server/agents/base-agent.js.map +0 -1
- package/dist/server/agents/executive-digest.d.ts +0 -16
- package/dist/server/agents/executive-digest.js +0 -115
- package/dist/server/agents/executive-digest.js.map +0 -1
- package/dist/server/agents/graph-steward.d.ts +0 -16
- package/dist/server/agents/graph-steward.js +0 -59
- package/dist/server/agents/graph-steward.js.map +0 -1
- package/dist/server/agents/meeting-followup.d.ts +0 -16
- package/dist/server/agents/meeting-followup.js +0 -88
- package/dist/server/agents/meeting-followup.js.map +0 -1
- package/dist/server/agents/pipeline-monitor.d.ts +0 -15
- package/dist/server/agents/pipeline-monitor.js +0 -86
- package/dist/server/agents/pipeline-monitor.js.map +0 -1
- package/dist/server/agents/types.d.ts +0 -81
- package/dist/server/agents/types.js +0 -41
- package/dist/server/agents/types.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/agents-api.d.ts +0 -10
- package/dist/server/routes/agents-api.js +0 -25
- package/dist/server/routes/agents-api.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 -14
- package/dist/server/routes/meeting-ingest-api.js +0 -98
- 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 -848
- 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/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/csv-service.d.ts +0 -36
- package/dist/services/csv-service.js +0 -143
- package/dist/services/csv-service.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/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.d.ts +0 -91
- package/dist/services/meeting-processor.js +0 -331
- package/dist/services/meeting-processor.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.QUqBcyuu.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.5jNm7Pm1.css +0 -1
- package/dist/web/_app/immutable/assets/3.BxdqT7zi.css +0 -1
- package/dist/web/_app/immutable/assets/4.BjPwtpNd.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.CZjsdjy4.css +0 -1
- package/dist/web/_app/immutable/assets/WorkspaceView.B-1DbivC.css +0 -1
- package/dist/web/_app/immutable/assets/wikilinks.CtSydmQl.css +0 -1
- package/dist/web/_app/immutable/chunks/3--t-YNA.js +0 -1
- package/dist/web/_app/immutable/chunks/5OU-4caN.js +0 -1
- package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
- package/dist/web/_app/immutable/chunks/B6FUcAv5.js +0 -1
- package/dist/web/_app/immutable/chunks/B9gDgSlp.js +0 -1
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
- package/dist/web/_app/immutable/chunks/BFtIWl5z.js +0 -1
- package/dist/web/_app/immutable/chunks/BHKpz6_7.js +0 -1
- package/dist/web/_app/immutable/chunks/BNfrhBeA.js +0 -1
- package/dist/web/_app/immutable/chunks/BgO5HlCg.js +0 -2
- package/dist/web/_app/immutable/chunks/BqnODQDb.js +0 -1
- package/dist/web/_app/immutable/chunks/BrebtJNG.js +0 -18
- package/dist/web/_app/immutable/chunks/BvIFhEn7.js +0 -2
- package/dist/web/_app/immutable/chunks/BvfdTHv8.js +0 -1
- package/dist/web/_app/immutable/chunks/BxGm65PH.js +0 -1
- package/dist/web/_app/immutable/chunks/BxyxnEKw.js +0 -1
- package/dist/web/_app/immutable/chunks/BygFIGq4.js +0 -1
- package/dist/web/_app/immutable/chunks/Bz0ZjVQE.js +0 -2
- package/dist/web/_app/immutable/chunks/C0LVZhvn.js +0 -1
- package/dist/web/_app/immutable/chunks/CIb_hHMy.js +0 -1
- package/dist/web/_app/immutable/chunks/CNKK6nZb.js +0 -1
- package/dist/web/_app/immutable/chunks/CQ5FjHZK.js +0 -1
- package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
- 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/CaEaeeKb.js +0 -1
- package/dist/web/_app/immutable/chunks/Ch6e_wpP.js +0 -1
- package/dist/web/_app/immutable/chunks/Ci4zzCVB.js +0 -2
- package/dist/web/_app/immutable/chunks/CknqBVQE.js +0 -1
- package/dist/web/_app/immutable/chunks/Cmfiirqp.js +0 -4
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
- package/dist/web/_app/immutable/chunks/CrFpCC6p.js +0 -1
- package/dist/web/_app/immutable/chunks/CxX8hcT6.js +0 -1
- package/dist/web/_app/immutable/chunks/D0T1ps1G.js +0 -1
- package/dist/web/_app/immutable/chunks/D2ZEj9xD.js +0 -1
- package/dist/web/_app/immutable/chunks/D3sy0IkA.js +0 -2
- package/dist/web/_app/immutable/chunks/DFYOFE3o.js +0 -1
- package/dist/web/_app/immutable/chunks/DHWoAC4y.js +0 -1
- package/dist/web/_app/immutable/chunks/DYYBfXU3.js +0 -1
- package/dist/web/_app/immutable/chunks/DiNPRA8T.js +0 -1
- package/dist/web/_app/immutable/chunks/DkjsqHkM.js +0 -1
- package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
- package/dist/web/_app/immutable/chunks/DpMCynC3.js +0 -1
- package/dist/web/_app/immutable/chunks/DqrybUuA.js +0 -1
- package/dist/web/_app/immutable/chunks/DsnmJJEf.js +0 -1
- package/dist/web/_app/immutable/chunks/KyjzlWRN.js +0 -2
- package/dist/web/_app/immutable/chunks/O9MAeAgV.js +0 -5
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
- package/dist/web/_app/immutable/chunks/SKSQ4m85.js +0 -2
- package/dist/web/_app/immutable/chunks/WEBTyD-H.js +0 -1
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
- package/dist/web/_app/immutable/chunks/bBXT5iJP.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/chunks/xkNhbnff.js +0 -1
- package/dist/web/_app/immutable/chunks/zoVX1Zab.js +0 -1
- package/dist/web/_app/immutable/entry/app.GfE4z2GO.js +0 -2
- package/dist/web/_app/immutable/entry/start.H-LFJK9u.js +0 -1
- package/dist/web/_app/immutable/nodes/0.Bwi7tTNC.js +0 -2
- package/dist/web/_app/immutable/nodes/1.DgNJPEWk.js +0 -1
- package/dist/web/_app/immutable/nodes/10.BW_XCD2O.js +0 -1
- package/dist/web/_app/immutable/nodes/11.DM7RX3Ms.js +0 -1
- package/dist/web/_app/immutable/nodes/12.DKgssZo8.js +0 -1
- package/dist/web/_app/immutable/nodes/13.DCdmTre-.js +0 -1
- package/dist/web/_app/immutable/nodes/2.DOA5QBVG.js +0 -266
- package/dist/web/_app/immutable/nodes/3.bpoHQwAI.js +0 -5
- package/dist/web/_app/immutable/nodes/4.ye0Vy7A1.js +0 -11
- package/dist/web/_app/immutable/nodes/5.rxpnYrx_.js +0 -4
- package/dist/web/_app/immutable/nodes/6.DP8HSxtc.js +0 -1
- package/dist/web/_app/immutable/nodes/7.C1h4Bf-E.js +0 -1
- package/dist/web/_app/immutable/nodes/8.BzmQ7S7Y.js +0 -1
- package/dist/web/_app/immutable/nodes/9.CEakpXpF.js +0 -1
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Message Service
|
|
3
3
|
*
|
|
4
|
-
* SQLite-backed persistence for
|
|
5
|
-
* Database lives at .studiograph/messages.db inside the workspace.
|
|
4
|
+
* SQLite-backed persistence for both folder-scoped and workspace-scoped
|
|
5
|
+
* messaging. Database lives at .studiograph/messages.db inside the workspace.
|
|
6
6
|
* Follows the AuthService pattern (WAL mode, table creation on init).
|
|
7
|
+
*
|
|
8
|
+
* Scope model:
|
|
9
|
+
* - messages.folder = '<name>' → folder-scoped (team chat within a folder)
|
|
10
|
+
* - messages.folder = NULL → workspace-scoped (shared home chat)
|
|
11
|
+
*
|
|
12
|
+
* Read receipts are split across two tables (folder vs. workspace) because
|
|
13
|
+
* the folder read_receipts PK is (user_id, folder); allowing NULL there
|
|
14
|
+
* would break uniqueness semantics.
|
|
7
15
|
*/
|
|
8
|
-
export interface
|
|
16
|
+
export interface FolderMessage {
|
|
9
17
|
id: number;
|
|
10
|
-
|
|
18
|
+
/** Folder name, or null for workspace-scoped messages (shared home chat). */
|
|
19
|
+
folder: string | null;
|
|
11
20
|
userId: number;
|
|
12
21
|
userDisplayName: string;
|
|
13
22
|
role: 'user' | 'agent';
|
|
@@ -18,42 +27,70 @@ export interface CollectionMessage {
|
|
|
18
27
|
export interface MsgNotification {
|
|
19
28
|
id: number;
|
|
20
29
|
userId: number;
|
|
21
|
-
|
|
30
|
+
/** Folder name, or null for workspace-scoped mentions. */
|
|
31
|
+
folder: string | null;
|
|
22
32
|
messageId: number;
|
|
23
33
|
mentionerName: string;
|
|
24
34
|
messagePreview: string;
|
|
25
35
|
read: boolean;
|
|
26
36
|
createdAt: string;
|
|
27
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Format a list of messages as a readable transcript for an LLM prompt.
|
|
40
|
+
* Messages are sorted oldest-first for natural conversation flow.
|
|
41
|
+
*
|
|
42
|
+
* @param messages Messages to format.
|
|
43
|
+
* @param showScope If true, annotate each line with the folder/workspace scope.
|
|
44
|
+
* Use when the transcript may mix scopes (e.g. cross-folder search).
|
|
45
|
+
* Default false — heartbeat and per-scope callers should leave this off.
|
|
46
|
+
*/
|
|
47
|
+
export declare function formatTranscript(messages: FolderMessage[], showScope?: boolean): string;
|
|
28
48
|
export declare class MessageService {
|
|
29
49
|
private db;
|
|
30
50
|
constructor(workspacePath: string);
|
|
31
|
-
/** Post a new message to a
|
|
32
|
-
postMessage(
|
|
33
|
-
/** Get messages for a
|
|
34
|
-
getMessages(
|
|
51
|
+
/** Post a new message to a folder thread. */
|
|
52
|
+
postMessage(folder: string, userId: number, displayName: string, role: 'user' | 'agent', content: string, replyToId?: number): FolderMessage;
|
|
53
|
+
/** Get messages for a folder with cursor-based pagination (newest first). */
|
|
54
|
+
getMessages(folder: string, opts?: {
|
|
35
55
|
before?: number;
|
|
36
56
|
limit?: number;
|
|
37
|
-
}):
|
|
38
|
-
/** Search messages by keyword, optionally scoped to a
|
|
57
|
+
}): FolderMessage[];
|
|
58
|
+
/** Search messages by keyword, optionally scoped to a folder. */
|
|
39
59
|
searchMessages(query: string, opts?: {
|
|
40
|
-
|
|
41
|
-
|
|
60
|
+
folder?: string;
|
|
61
|
+
folders?: string[];
|
|
42
62
|
limit?: number;
|
|
43
|
-
}):
|
|
63
|
+
}): FolderMessage[];
|
|
44
64
|
/** Mark messages as read up to a given message ID (UPSERT). */
|
|
45
|
-
markRead(userId: number,
|
|
46
|
-
/** Get unread message counts for a user across multiple
|
|
47
|
-
getUnreadCounts(userId: number,
|
|
65
|
+
markRead(userId: number, folder: string, messageId: number): void;
|
|
66
|
+
/** Get unread message counts for a user across multiple folders. */
|
|
67
|
+
getUnreadCounts(userId: number, folders: string[]): Record<string, number>;
|
|
48
68
|
/** Update a message's content (used to mark capture items as done). */
|
|
49
69
|
updateMessageContent(id: number, content: string): void;
|
|
50
70
|
/** Get a single message by ID. */
|
|
51
|
-
getMessageById(id: number):
|
|
52
|
-
/** Get the latest message ID for a
|
|
53
|
-
getLatestMessageId(
|
|
71
|
+
getMessageById(id: number): FolderMessage | null;
|
|
72
|
+
/** Get the latest message ID for a folder (for markRead on load). */
|
|
73
|
+
getLatestMessageId(folder: string): number | null;
|
|
54
74
|
/** Update the mentions JSON array on a message (called after mention detection). */
|
|
55
75
|
setMentions(messageId: number, userIds: number[]): void;
|
|
56
|
-
|
|
76
|
+
/** Post a new message to the workspace-wide chat. */
|
|
77
|
+
postWorkspaceMessage(userId: number, displayName: string, role: 'user' | 'agent', content: string, replyToId?: number): FolderMessage;
|
|
78
|
+
/** Get workspace-wide messages with cursor-based pagination (newest first). */
|
|
79
|
+
getWorkspaceMessages(opts?: {
|
|
80
|
+
before?: number;
|
|
81
|
+
limit?: number;
|
|
82
|
+
}): FolderMessage[];
|
|
83
|
+
/** Mark workspace messages as read up to a given message ID (UPSERT). */
|
|
84
|
+
markWorkspaceRead(userId: number, messageId: number): void;
|
|
85
|
+
/** Count unread workspace messages for a user. */
|
|
86
|
+
getWorkspaceUnreadCount(userId: number): number;
|
|
87
|
+
/** Latest workspace message ID (for mark-read on load). */
|
|
88
|
+
getLatestWorkspaceMessageId(): number | null;
|
|
89
|
+
/**
|
|
90
|
+
* Create a mention notification.
|
|
91
|
+
* @param folder folder name, or `null` for workspace-wide mentions.
|
|
92
|
+
*/
|
|
93
|
+
createNotification(userId: number, folder: string | null, messageId: number, mentionerName: string, messagePreview: string): number;
|
|
57
94
|
getNotifications(userId: number, opts?: {
|
|
58
95
|
unreadOnly?: boolean;
|
|
59
96
|
limit?: number;
|
|
@@ -61,6 +98,10 @@ export declare class MessageService {
|
|
|
61
98
|
getUnreadNotificationCount(userId: number): number;
|
|
62
99
|
markNotificationRead(notificationId: number, userId: number): void;
|
|
63
100
|
markAllNotificationsRead(userId: number): void;
|
|
101
|
+
/** Get the last-analyzed message ID for a scope, or 0 if never analyzed. */
|
|
102
|
+
getAnalysisMarker(scopeKey: string): number;
|
|
103
|
+
/** Set the last-analyzed message ID for a scope (UPSERT, monotonic). */
|
|
104
|
+
setAnalysisMarker(scopeKey: string, messageId: number): void;
|
|
64
105
|
close(): void;
|
|
65
106
|
private ensureGitignore;
|
|
66
107
|
private toNotification;
|
|
@@ -1,13 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Message Service
|
|
3
3
|
*
|
|
4
|
-
* SQLite-backed persistence for
|
|
5
|
-
* Database lives at .studiograph/messages.db inside the workspace.
|
|
4
|
+
* SQLite-backed persistence for both folder-scoped and workspace-scoped
|
|
5
|
+
* messaging. Database lives at .studiograph/messages.db inside the workspace.
|
|
6
6
|
* Follows the AuthService pattern (WAL mode, table creation on init).
|
|
7
|
+
*
|
|
8
|
+
* Scope model:
|
|
9
|
+
* - messages.folder = '<name>' → folder-scoped (team chat within a folder)
|
|
10
|
+
* - messages.folder = NULL → workspace-scoped (shared home chat)
|
|
11
|
+
*
|
|
12
|
+
* Read receipts are split across two tables (folder vs. workspace) because
|
|
13
|
+
* the folder read_receipts PK is (user_id, folder); allowing NULL there
|
|
14
|
+
* would break uniqueness semantics.
|
|
7
15
|
*/
|
|
8
16
|
import Database from 'better-sqlite3';
|
|
9
17
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
10
18
|
import { join } from 'path';
|
|
19
|
+
/**
|
|
20
|
+
* Format a list of messages as a readable transcript for an LLM prompt.
|
|
21
|
+
* Messages are sorted oldest-first for natural conversation flow.
|
|
22
|
+
*
|
|
23
|
+
* @param messages Messages to format.
|
|
24
|
+
* @param showScope If true, annotate each line with the folder/workspace scope.
|
|
25
|
+
* Use when the transcript may mix scopes (e.g. cross-folder search).
|
|
26
|
+
* Default false — heartbeat and per-scope callers should leave this off.
|
|
27
|
+
*/
|
|
28
|
+
export function formatTranscript(messages, showScope = false) {
|
|
29
|
+
if (messages.length === 0)
|
|
30
|
+
return 'No messages found.';
|
|
31
|
+
const sorted = [...messages].sort((a, b) => a.id - b.id);
|
|
32
|
+
return sorted.map(m => {
|
|
33
|
+
const role = m.role === 'agent' ? 'Agent' : m.userDisplayName;
|
|
34
|
+
const prefix = showScope ? `${role} (${m.folder ?? 'workspace'})` : role;
|
|
35
|
+
return `[${m.createdAt}] ${prefix}: ${m.content}`;
|
|
36
|
+
}).join('\n\n');
|
|
37
|
+
}
|
|
11
38
|
export class MessageService {
|
|
12
39
|
db;
|
|
13
40
|
constructor(workspacePath) {
|
|
@@ -18,10 +45,11 @@ export class MessageService {
|
|
|
18
45
|
const dbPath = join(sgDir, 'messages.db');
|
|
19
46
|
this.db = new Database(dbPath);
|
|
20
47
|
this.db.pragma('journal_mode = WAL');
|
|
48
|
+
// messages.folder is nullable: NULL = workspace-scoped, string = folder-scoped.
|
|
21
49
|
this.db.exec(`
|
|
22
50
|
CREATE TABLE IF NOT EXISTS messages (
|
|
23
51
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
24
|
-
|
|
52
|
+
folder TEXT,
|
|
25
53
|
user_id INTEGER NOT NULL,
|
|
26
54
|
user_display_name TEXT NOT NULL,
|
|
27
55
|
role TEXT NOT NULL DEFAULT 'user' CHECK(role IN ('user', 'agent')),
|
|
@@ -30,19 +58,29 @@ export class MessageService {
|
|
|
30
58
|
)
|
|
31
59
|
`);
|
|
32
60
|
this.db.exec(`
|
|
33
|
-
CREATE INDEX IF NOT EXISTS
|
|
34
|
-
ON messages(
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_messages_folder_id
|
|
62
|
+
ON messages(folder, id)
|
|
35
63
|
`);
|
|
64
|
+
// Folder read receipts — keyed by (user_id, folder). For workspace
|
|
65
|
+
// read state we use a separate table (workspace_read_receipts) because
|
|
66
|
+
// SQLite does not enforce uniqueness over NULL in a composite PK.
|
|
36
67
|
this.db.exec(`
|
|
37
68
|
CREATE TABLE IF NOT EXISTS read_receipts (
|
|
38
69
|
user_id INTEGER NOT NULL,
|
|
39
|
-
|
|
70
|
+
folder TEXT NOT NULL,
|
|
40
71
|
last_read_message_id INTEGER NOT NULL DEFAULT 0,
|
|
41
72
|
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
42
|
-
PRIMARY KEY (user_id,
|
|
73
|
+
PRIMARY KEY (user_id, folder)
|
|
74
|
+
)
|
|
75
|
+
`);
|
|
76
|
+
this.db.exec(`
|
|
77
|
+
CREATE TABLE IF NOT EXISTS workspace_read_receipts (
|
|
78
|
+
user_id INTEGER PRIMARY KEY,
|
|
79
|
+
last_read_message_id INTEGER NOT NULL DEFAULT 0,
|
|
80
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
43
81
|
)
|
|
44
82
|
`);
|
|
45
|
-
//
|
|
83
|
+
// Legacy column additions (messages pre-dating reply_to_id/mentions)
|
|
46
84
|
try {
|
|
47
85
|
this.db.exec('ALTER TABLE messages ADD COLUMN reply_to_id INTEGER');
|
|
48
86
|
}
|
|
@@ -51,12 +89,22 @@ export class MessageService {
|
|
|
51
89
|
this.db.exec('ALTER TABLE messages ADD COLUMN mentions TEXT');
|
|
52
90
|
}
|
|
53
91
|
catch { }
|
|
54
|
-
//
|
|
92
|
+
// Analysis markers — tracks the last message the proactive heartbeat
|
|
93
|
+
// analyzed for each scope. Keys: 'folder:<name>' or 'workspace'.
|
|
94
|
+
// Persisted so restarts don't drop the analysis window.
|
|
95
|
+
this.db.exec(`
|
|
96
|
+
CREATE TABLE IF NOT EXISTS analysis_markers (
|
|
97
|
+
scope_key TEXT PRIMARY KEY,
|
|
98
|
+
last_analyzed_message_id INTEGER NOT NULL DEFAULT 0,
|
|
99
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
100
|
+
)
|
|
101
|
+
`);
|
|
102
|
+
// Notifications: folder nullable for workspace-wide mentions.
|
|
55
103
|
this.db.exec(`
|
|
56
104
|
CREATE TABLE IF NOT EXISTS notifications (
|
|
57
105
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
58
106
|
user_id INTEGER NOT NULL,
|
|
59
|
-
|
|
107
|
+
folder TEXT,
|
|
60
108
|
message_id INTEGER NOT NULL,
|
|
61
109
|
mentioner_name TEXT NOT NULL,
|
|
62
110
|
message_preview TEXT NOT NULL,
|
|
@@ -71,67 +119,67 @@ export class MessageService {
|
|
|
71
119
|
// Ensure messages.db is gitignored
|
|
72
120
|
this.ensureGitignore(sgDir);
|
|
73
121
|
}
|
|
74
|
-
/** Post a new message to a
|
|
75
|
-
postMessage(
|
|
76
|
-
const stmt = this.db.prepare('INSERT INTO messages (
|
|
77
|
-
const result = stmt.run(
|
|
122
|
+
/** Post a new message to a folder thread. */
|
|
123
|
+
postMessage(folder, userId, displayName, role, content, replyToId) {
|
|
124
|
+
const stmt = this.db.prepare('INSERT INTO messages (folder, user_id, user_display_name, role, content, reply_to_id) VALUES (?, ?, ?, ?, ?, ?)');
|
|
125
|
+
const result = stmt.run(folder, userId, displayName, role, content, replyToId ?? null);
|
|
78
126
|
const row = this.db.prepare('SELECT * FROM messages WHERE id = ?').get(result.lastInsertRowid);
|
|
79
127
|
return this.toMessage(row);
|
|
80
128
|
}
|
|
81
|
-
/** Get messages for a
|
|
82
|
-
getMessages(
|
|
129
|
+
/** Get messages for a folder with cursor-based pagination (newest first). */
|
|
130
|
+
getMessages(folder, opts = {}) {
|
|
83
131
|
const limit = Math.min(opts.limit ?? 50, 200);
|
|
84
132
|
let rows;
|
|
85
133
|
if (opts.before) {
|
|
86
|
-
rows = this.db.prepare('SELECT * FROM messages WHERE
|
|
134
|
+
rows = this.db.prepare('SELECT * FROM messages WHERE folder = ? AND id < ? ORDER BY id DESC LIMIT ?').all(folder, opts.before, limit);
|
|
87
135
|
}
|
|
88
136
|
else {
|
|
89
|
-
rows = this.db.prepare('SELECT * FROM messages WHERE
|
|
137
|
+
rows = this.db.prepare('SELECT * FROM messages WHERE folder = ? ORDER BY id DESC LIMIT ?').all(folder, limit);
|
|
90
138
|
}
|
|
91
139
|
return rows.map(r => this.toMessage(r));
|
|
92
140
|
}
|
|
93
|
-
/** Search messages by keyword, optionally scoped to a
|
|
141
|
+
/** Search messages by keyword, optionally scoped to a folder. */
|
|
94
142
|
searchMessages(query, opts = {}) {
|
|
95
143
|
const limit = Math.min(opts.limit ?? 20, 100);
|
|
96
|
-
if (opts.
|
|
97
|
-
const rows = this.db.prepare(`SELECT * FROM messages WHERE
|
|
144
|
+
if (opts.folder) {
|
|
145
|
+
const rows = this.db.prepare(`SELECT * FROM messages WHERE folder = ? AND content LIKE '%' || ? || '%' ORDER BY id DESC LIMIT ?`).all(opts.folder, query, limit);
|
|
98
146
|
return rows.map(r => this.toMessage(r));
|
|
99
147
|
}
|
|
100
|
-
if (opts.
|
|
101
|
-
const placeholders = opts.
|
|
102
|
-
const rows = this.db.prepare(`SELECT * FROM messages WHERE
|
|
148
|
+
if (opts.folders && opts.folders.length > 0) {
|
|
149
|
+
const placeholders = opts.folders.map(() => '?').join(', ');
|
|
150
|
+
const rows = this.db.prepare(`SELECT * FROM messages WHERE folder IN (${placeholders}) AND content LIKE '%' || ? || '%' ORDER BY id DESC LIMIT ?`).all(...opts.folders, query, limit);
|
|
103
151
|
return rows.map(r => this.toMessage(r));
|
|
104
152
|
}
|
|
105
153
|
const rows = this.db.prepare(`SELECT * FROM messages WHERE content LIKE '%' || ? || '%' ORDER BY id DESC LIMIT ?`).all(query, limit);
|
|
106
154
|
return rows.map(r => this.toMessage(r));
|
|
107
155
|
}
|
|
108
156
|
/** Mark messages as read up to a given message ID (UPSERT). */
|
|
109
|
-
markRead(userId,
|
|
157
|
+
markRead(userId, folder, messageId) {
|
|
110
158
|
this.db.prepare(`
|
|
111
|
-
INSERT INTO read_receipts (user_id,
|
|
159
|
+
INSERT INTO read_receipts (user_id, folder, last_read_message_id, updated_at)
|
|
112
160
|
VALUES (?, ?, ?, datetime('now'))
|
|
113
|
-
ON CONFLICT (user_id,
|
|
161
|
+
ON CONFLICT (user_id, folder)
|
|
114
162
|
DO UPDATE SET
|
|
115
163
|
last_read_message_id = MAX(excluded.last_read_message_id, read_receipts.last_read_message_id),
|
|
116
164
|
updated_at = excluded.updated_at
|
|
117
|
-
`).run(userId,
|
|
165
|
+
`).run(userId, folder, messageId);
|
|
118
166
|
}
|
|
119
|
-
/** Get unread message counts for a user across multiple
|
|
120
|
-
getUnreadCounts(userId,
|
|
121
|
-
if (
|
|
167
|
+
/** Get unread message counts for a user across multiple folders. */
|
|
168
|
+
getUnreadCounts(userId, folders) {
|
|
169
|
+
if (folders.length === 0)
|
|
122
170
|
return {};
|
|
123
171
|
const counts = {};
|
|
124
172
|
const stmt = this.db.prepare(`
|
|
125
173
|
SELECT COUNT(*) as count FROM messages
|
|
126
|
-
WHERE
|
|
127
|
-
(SELECT last_read_message_id FROM read_receipts WHERE user_id = ? AND
|
|
174
|
+
WHERE folder = ? AND id > COALESCE(
|
|
175
|
+
(SELECT last_read_message_id FROM read_receipts WHERE user_id = ? AND folder = ?),
|
|
128
176
|
0
|
|
129
177
|
)
|
|
130
178
|
`);
|
|
131
|
-
for (const
|
|
132
|
-
const row = stmt.get(
|
|
179
|
+
for (const f of folders) {
|
|
180
|
+
const row = stmt.get(f, userId, f);
|
|
133
181
|
if (row.count > 0) {
|
|
134
|
-
counts[
|
|
182
|
+
counts[f] = row.count;
|
|
135
183
|
}
|
|
136
184
|
}
|
|
137
185
|
return counts;
|
|
@@ -145,18 +193,70 @@ export class MessageService {
|
|
|
145
193
|
const row = this.db.prepare('SELECT * FROM messages WHERE id = ?').get(id);
|
|
146
194
|
return row ? this.toMessage(row) : null;
|
|
147
195
|
}
|
|
148
|
-
/** Get the latest message ID for a
|
|
149
|
-
getLatestMessageId(
|
|
150
|
-
const row = this.db.prepare('SELECT MAX(id) as max_id FROM messages WHERE
|
|
196
|
+
/** Get the latest message ID for a folder (for markRead on load). */
|
|
197
|
+
getLatestMessageId(folder) {
|
|
198
|
+
const row = this.db.prepare('SELECT MAX(id) as max_id FROM messages WHERE folder = ?').get(folder);
|
|
151
199
|
return row.max_id;
|
|
152
200
|
}
|
|
153
201
|
/** Update the mentions JSON array on a message (called after mention detection). */
|
|
154
202
|
setMentions(messageId, userIds) {
|
|
155
203
|
this.db.prepare('UPDATE messages SET mentions = ? WHERE id = ?').run(JSON.stringify(userIds), messageId);
|
|
156
204
|
}
|
|
205
|
+
// ── Workspace-scoped messaging (folder IS NULL) ──
|
|
206
|
+
/** Post a new message to the workspace-wide chat. */
|
|
207
|
+
postWorkspaceMessage(userId, displayName, role, content, replyToId) {
|
|
208
|
+
const stmt = this.db.prepare('INSERT INTO messages (folder, user_id, user_display_name, role, content, reply_to_id) VALUES (NULL, ?, ?, ?, ?, ?)');
|
|
209
|
+
const result = stmt.run(userId, displayName, role, content, replyToId ?? null);
|
|
210
|
+
const row = this.db.prepare('SELECT * FROM messages WHERE id = ?').get(result.lastInsertRowid);
|
|
211
|
+
return this.toMessage(row);
|
|
212
|
+
}
|
|
213
|
+
/** Get workspace-wide messages with cursor-based pagination (newest first). */
|
|
214
|
+
getWorkspaceMessages(opts = {}) {
|
|
215
|
+
const limit = Math.min(opts.limit ?? 50, 200);
|
|
216
|
+
let rows;
|
|
217
|
+
if (opts.before) {
|
|
218
|
+
rows = this.db.prepare('SELECT * FROM messages WHERE folder IS NULL AND id < ? ORDER BY id DESC LIMIT ?').all(opts.before, limit);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
rows = this.db.prepare('SELECT * FROM messages WHERE folder IS NULL ORDER BY id DESC LIMIT ?').all(limit);
|
|
222
|
+
}
|
|
223
|
+
return rows.map(r => this.toMessage(r));
|
|
224
|
+
}
|
|
225
|
+
/** Mark workspace messages as read up to a given message ID (UPSERT). */
|
|
226
|
+
markWorkspaceRead(userId, messageId) {
|
|
227
|
+
this.db.prepare(`
|
|
228
|
+
INSERT INTO workspace_read_receipts (user_id, last_read_message_id, updated_at)
|
|
229
|
+
VALUES (?, ?, datetime('now'))
|
|
230
|
+
ON CONFLICT (user_id)
|
|
231
|
+
DO UPDATE SET
|
|
232
|
+
last_read_message_id = MAX(excluded.last_read_message_id, workspace_read_receipts.last_read_message_id),
|
|
233
|
+
updated_at = excluded.updated_at
|
|
234
|
+
`).run(userId, messageId);
|
|
235
|
+
}
|
|
236
|
+
/** Count unread workspace messages for a user. */
|
|
237
|
+
getWorkspaceUnreadCount(userId) {
|
|
238
|
+
const row = this.db.prepare(`
|
|
239
|
+
SELECT COUNT(*) as count FROM messages
|
|
240
|
+
WHERE folder IS NULL AND id > COALESCE(
|
|
241
|
+
(SELECT last_read_message_id FROM workspace_read_receipts WHERE user_id = ?),
|
|
242
|
+
0
|
|
243
|
+
)
|
|
244
|
+
`).get(userId);
|
|
245
|
+
return row.count;
|
|
246
|
+
}
|
|
247
|
+
/** Latest workspace message ID (for mark-read on load). */
|
|
248
|
+
getLatestWorkspaceMessageId() {
|
|
249
|
+
const row = this.db.prepare('SELECT MAX(id) as max_id FROM messages WHERE folder IS NULL').get();
|
|
250
|
+
return row.max_id;
|
|
251
|
+
}
|
|
157
252
|
// ── Notifications ──
|
|
158
|
-
|
|
159
|
-
|
|
253
|
+
/**
|
|
254
|
+
* Create a mention notification.
|
|
255
|
+
* @param folder folder name, or `null` for workspace-wide mentions.
|
|
256
|
+
*/
|
|
257
|
+
createNotification(userId, folder, messageId, mentionerName, messagePreview) {
|
|
258
|
+
const info = this.db.prepare('INSERT INTO notifications (user_id, folder, message_id, mentioner_name, message_preview) VALUES (?, ?, ?, ?, ?)').run(userId, folder, messageId, mentionerName, messagePreview.slice(0, 200));
|
|
259
|
+
return Number(info.lastInsertRowid);
|
|
160
260
|
}
|
|
161
261
|
getNotifications(userId, opts = {}) {
|
|
162
262
|
const limit = opts.limit ?? 50;
|
|
@@ -174,6 +274,23 @@ export class MessageService {
|
|
|
174
274
|
markAllNotificationsRead(userId) {
|
|
175
275
|
this.db.prepare('UPDATE notifications SET read = 1 WHERE user_id = ? AND read = 0').run(userId);
|
|
176
276
|
}
|
|
277
|
+
// ── Analysis markers (proactive heartbeat state) ──
|
|
278
|
+
/** Get the last-analyzed message ID for a scope, or 0 if never analyzed. */
|
|
279
|
+
getAnalysisMarker(scopeKey) {
|
|
280
|
+
const row = this.db.prepare('SELECT last_analyzed_message_id FROM analysis_markers WHERE scope_key = ?').get(scopeKey);
|
|
281
|
+
return row?.last_analyzed_message_id ?? 0;
|
|
282
|
+
}
|
|
283
|
+
/** Set the last-analyzed message ID for a scope (UPSERT, monotonic). */
|
|
284
|
+
setAnalysisMarker(scopeKey, messageId) {
|
|
285
|
+
this.db.prepare(`
|
|
286
|
+
INSERT INTO analysis_markers (scope_key, last_analyzed_message_id, updated_at)
|
|
287
|
+
VALUES (?, ?, datetime('now'))
|
|
288
|
+
ON CONFLICT (scope_key)
|
|
289
|
+
DO UPDATE SET
|
|
290
|
+
last_analyzed_message_id = MAX(excluded.last_analyzed_message_id, analysis_markers.last_analyzed_message_id),
|
|
291
|
+
updated_at = excluded.updated_at
|
|
292
|
+
`).run(scopeKey, messageId);
|
|
293
|
+
}
|
|
177
294
|
close() {
|
|
178
295
|
this.db.close();
|
|
179
296
|
}
|
|
@@ -196,7 +313,7 @@ export class MessageService {
|
|
|
196
313
|
return {
|
|
197
314
|
id: row.id,
|
|
198
315
|
userId: row.user_id,
|
|
199
|
-
|
|
316
|
+
folder: row.folder,
|
|
200
317
|
messageId: row.message_id,
|
|
201
318
|
mentionerName: row.mentioner_name,
|
|
202
319
|
messagePreview: row.message_preview,
|
|
@@ -207,7 +324,7 @@ export class MessageService {
|
|
|
207
324
|
toMessage(row) {
|
|
208
325
|
return {
|
|
209
326
|
id: row.id,
|
|
210
|
-
|
|
327
|
+
folder: row.folder,
|
|
211
328
|
userId: row.user_id,
|
|
212
329
|
userDisplayName: row.user_display_name,
|
|
213
330
|
role: row.role,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-service.js","sourceRoot":"","sources":["../../src/services/message-service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"message-service.js","sourceRoot":"","sources":["../../src/services/message-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Workspace } from '../core/workspace.js';
|
|
2
|
+
import type { AuthService, AuthUser } from './auth-service.js';
|
|
3
|
+
/**
|
|
4
|
+
* Register the user's personal "My Entries" folder and grant them admin
|
|
5
|
+
* folder_access. Idempotent — safe to call repeatedly and on existing
|
|
6
|
+
* workspaces where the folder was provisioned before this helper existed
|
|
7
|
+
* (repairs the missing folder_access row).
|
|
8
|
+
*
|
|
9
|
+
* Consolidated from four earlier call sites that each did half the work:
|
|
10
|
+
* setup endpoint, /api/auth/users POST, server startup sweep, and
|
|
11
|
+
* `studiograph user add` CLI. Skipping the grant left the user's own
|
|
12
|
+
* personal folder invisible in the sidebar because `getAccessibleRepos()`
|
|
13
|
+
* filters by folder_access.
|
|
14
|
+
*/
|
|
15
|
+
export declare function ensurePersonalFolder(workspace: Workspace, authService: AuthService, user: AuthUser): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Convert a departed user's personal folder into a normal (non-personal)
|
|
18
|
+
* archive folder owned by the actor who deleted them. Matches Google
|
|
19
|
+
* Drive's inherit-on-delete model: the content survives, the owner is
|
|
20
|
+
* reassigned, and the "personal" semantics fall away so the folder
|
|
21
|
+
* doesn't clash with the one-personal-folder-per-user invariant.
|
|
22
|
+
*
|
|
23
|
+
* Mutations applied (in order, best-effort non-atomic):
|
|
24
|
+
* 1. Pick a collision-free new name: `archive-{slug}-{YYYY-MM-DD}`,
|
|
25
|
+
* escalating to `-2`, `-3`, … if needed.
|
|
26
|
+
* 2. Rename the folder directory on disk.
|
|
27
|
+
* 3. Update workspace.json: new name/path, display_name, clear the
|
|
28
|
+
* personal/owner_id flags, and write the new `.studiograph` marker.
|
|
29
|
+
* 4. Update folder_access rows to the new name so the actor's inherited
|
|
30
|
+
* admin row keeps working.
|
|
31
|
+
* 5. Push the updated workspace.json to the config remote (non-fatal).
|
|
32
|
+
*
|
|
33
|
+
* Returns the new folder name and display name so the caller can report
|
|
34
|
+
* them to the UI. The caller should `workspaceManager.reloadConfig()`
|
|
35
|
+
* after this completes to surface the change to in-memory graph state.
|
|
36
|
+
*/
|
|
37
|
+
export declare function archivePersonalFolder(workspace: Workspace, oldName: string, targetDisplayName: string, authService: AuthService): Promise<{
|
|
38
|
+
newName: string;
|
|
39
|
+
newDisplayName: string;
|
|
40
|
+
}>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { existsSync, renameSync, writeFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Register the user's personal "My Entries" folder and grant them admin
|
|
5
|
+
* folder_access. Idempotent — safe to call repeatedly and on existing
|
|
6
|
+
* workspaces where the folder was provisioned before this helper existed
|
|
7
|
+
* (repairs the missing folder_access row).
|
|
8
|
+
*
|
|
9
|
+
* Consolidated from four earlier call sites that each did half the work:
|
|
10
|
+
* setup endpoint, /api/auth/users POST, server startup sweep, and
|
|
11
|
+
* `studiograph user add` CLI. Skipping the grant left the user's own
|
|
12
|
+
* personal folder invisible in the sidebar because `getAccessibleRepos()`
|
|
13
|
+
* filters by folder_access.
|
|
14
|
+
*/
|
|
15
|
+
export async function ensurePersonalFolder(workspace, authService, user) {
|
|
16
|
+
const folderName = `entries-${user.id}`;
|
|
17
|
+
const config = await workspace.loadConfig();
|
|
18
|
+
const alreadyRegistered = config.repos.some(r => r.name === folderName);
|
|
19
|
+
if (!alreadyRegistered) {
|
|
20
|
+
await workspace.registerRepo({
|
|
21
|
+
name: folderName,
|
|
22
|
+
display_name: 'My Entries',
|
|
23
|
+
description: `Personal entries for ${user.displayName}`,
|
|
24
|
+
personal: true,
|
|
25
|
+
owner_id: user.id,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const hasAccess = authService.getUserFolders(user.id).includes(folderName);
|
|
29
|
+
if (!hasAccess) {
|
|
30
|
+
authService.grantFolderAccess(user.id, folderName, 'admin');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Convert a departed user's personal folder into a normal (non-personal)
|
|
35
|
+
* archive folder owned by the actor who deleted them. Matches Google
|
|
36
|
+
* Drive's inherit-on-delete model: the content survives, the owner is
|
|
37
|
+
* reassigned, and the "personal" semantics fall away so the folder
|
|
38
|
+
* doesn't clash with the one-personal-folder-per-user invariant.
|
|
39
|
+
*
|
|
40
|
+
* Mutations applied (in order, best-effort non-atomic):
|
|
41
|
+
* 1. Pick a collision-free new name: `archive-{slug}-{YYYY-MM-DD}`,
|
|
42
|
+
* escalating to `-2`, `-3`, … if needed.
|
|
43
|
+
* 2. Rename the folder directory on disk.
|
|
44
|
+
* 3. Update workspace.json: new name/path, display_name, clear the
|
|
45
|
+
* personal/owner_id flags, and write the new `.studiograph` marker.
|
|
46
|
+
* 4. Update folder_access rows to the new name so the actor's inherited
|
|
47
|
+
* admin row keeps working.
|
|
48
|
+
* 5. Push the updated workspace.json to the config remote (non-fatal).
|
|
49
|
+
*
|
|
50
|
+
* Returns the new folder name and display name so the caller can report
|
|
51
|
+
* them to the UI. The caller should `workspaceManager.reloadConfig()`
|
|
52
|
+
* after this completes to surface the change to in-memory graph state.
|
|
53
|
+
*/
|
|
54
|
+
export async function archivePersonalFolder(workspace, oldName, targetDisplayName, authService) {
|
|
55
|
+
const config = await workspace.loadConfig();
|
|
56
|
+
const repo = config.repos.find(r => r.name === oldName);
|
|
57
|
+
if (!repo) {
|
|
58
|
+
throw new Error(`Cannot archive '${oldName}' — folder not found in workspace config`);
|
|
59
|
+
}
|
|
60
|
+
if (!repo.personal) {
|
|
61
|
+
throw new Error(`Cannot archive '${oldName}' — not a personal folder`);
|
|
62
|
+
}
|
|
63
|
+
const slug = slugify(targetDisplayName);
|
|
64
|
+
const date = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
|
65
|
+
const baseName = `archive-${slug}-${date}`;
|
|
66
|
+
let newName = baseName;
|
|
67
|
+
let suffix = 2;
|
|
68
|
+
while (config.repos.some(r => r.name === newName)) {
|
|
69
|
+
newName = `${baseName}-${suffix}`;
|
|
70
|
+
suffix += 1;
|
|
71
|
+
}
|
|
72
|
+
const wsPath = workspace.workspacePath;
|
|
73
|
+
const oldPath = join(wsPath, repo.path);
|
|
74
|
+
const newPath = join(wsPath, newName);
|
|
75
|
+
if (existsSync(oldPath)) {
|
|
76
|
+
renameSync(oldPath, newPath);
|
|
77
|
+
}
|
|
78
|
+
repo.name = newName;
|
|
79
|
+
repo.path = newName;
|
|
80
|
+
repo.display_name = `Archive: ${targetDisplayName} (${date})`;
|
|
81
|
+
delete repo.personal;
|
|
82
|
+
delete repo.owner_id;
|
|
83
|
+
const markerPath = join(newPath, '.studiograph');
|
|
84
|
+
if (existsSync(markerPath)) {
|
|
85
|
+
writeFileSync(markerPath, JSON.stringify({ repo_name: newName }, null, 2), 'utf-8');
|
|
86
|
+
}
|
|
87
|
+
workspace.writeConfig(config);
|
|
88
|
+
authService.renameFolder(oldName, newName);
|
|
89
|
+
workspace.pushWorkspaceConfig(`Archive personal folder on user delete: ${oldName} → ${newName}`);
|
|
90
|
+
return { newName, newDisplayName: repo.display_name };
|
|
91
|
+
}
|
|
92
|
+
function slugify(name) {
|
|
93
|
+
const cleaned = name
|
|
94
|
+
.normalize('NFKD')
|
|
95
|
+
.replace(/[̀-ͯ]/g, '') // strip combining diacritics
|
|
96
|
+
.toLowerCase()
|
|
97
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
98
|
+
.replace(/^-+|-+$/g, '');
|
|
99
|
+
return cleaned || 'user';
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=personal-folder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personal-folder.js","sourceRoot":"","sources":["../../src/services/personal-folder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAoB,EACpB,WAAwB,EACxB,IAAc;IAEd,MAAM,UAAU,GAAG,WAAW,IAAI,CAAC,EAAE,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;IAC5C,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAExE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,SAAS,CAAC,YAAY,CAAC;YAC3B,IAAI,EAAE,UAAU;YAChB,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,wBAAwB,IAAI,CAAC,WAAW,EAAE;YACvD,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI,CAAC,EAAE;SAClB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAAoB,EACpB,OAAe,EACf,iBAAyB,EACzB,WAAwB;IAExB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,0CAA0C,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,2BAA2B,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa;IACjE,MAAM,QAAQ,GAAG,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC;IAE3C,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;QAClD,OAAO,GAAG,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAI,SAAiB,CAAC,aAAuB,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEtC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;IACpB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;IACpB,IAAI,CAAC,YAAY,GAAG,YAAY,iBAAiB,KAAK,IAAI,GAAG,CAAC;IAC9D,OAAQ,IAAY,CAAC,QAAQ,CAAC;IAC9B,OAAQ,IAAY,CAAC,QAAQ,CAAC;IAE9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACtF,CAAC;IAED,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,SAAS,CAAC,mBAAmB,CAAC,2CAA2C,OAAO,MAAM,OAAO,EAAE,CAAC,CAAC;IAEjG,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,YAAa,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,OAAO,GAAG,IAAI;SACjB,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,6BAA6B;SACnD,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,OAAO,IAAI,MAAM,CAAC;AAC3B,CAAC"}
|