studiograph 1.3.48-next.13 → 1.3.48-next.130
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 +14 -1
- package/dist/agent/agent-pool.js +37 -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 +239 -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 +47 -12
- 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 +35 -0
- package/dist/core/secrets/index.js +59 -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 +539 -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 +388 -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 +303 -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 +177 -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/1i1V0Z172.js +2 -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/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/B2-Cx5XA.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/B9qBGxh62.js +3 -0
- package/dist/web/_app/immutable/chunks/B9rVXblv.js +1 -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/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/Bk-AcswV.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/BpDONXUo.js +8 -0
- package/dist/web/_app/immutable/chunks/BpTXLx8I2.js +5 -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/C7GIvT8T.js +2 -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/CIc2MMme2.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/CLSxJmTj.js +2 -0
- package/dist/web/_app/immutable/chunks/CMhHc1Bq2.js +2 -0
- package/dist/web/_app/immutable/chunks/CNGba6T4.js +1 -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/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/CiyqPsJo.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/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/Ct3quP0F.js +1 -0
- package/dist/web/_app/immutable/chunks/CtlAYPxw.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/CwROuREs.js +1 -0
- package/dist/web/_app/immutable/chunks/CxalqrMB.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/DC69SASj.js +2 -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/DEY60osH.js +1 -0
- package/dist/web/_app/immutable/chunks/DG3QZPgI.js +1 -0
- package/dist/web/_app/immutable/chunks/DHepUItL.js +1 -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/DaiJs3St.js +1 -0
- package/dist/web/_app/immutable/chunks/DfITyMKh2.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/DjlDV2JG.js +1 -0
- package/dist/web/_app/immutable/chunks/Dm25ot5x2.js +1 -0
- package/dist/web/_app/immutable/chunks/DpuSt-SO.js +2 -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/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/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/SbWhkPMt.js +6 -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/aALpjBW2.js +1 -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/mz-cgRgP.js +3 -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/vJkT0IPN.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/xEzUlKaR2.js +1 -0
- package/dist/web/_app/immutable/chunks/zumDjcgJ.js +1 -0
- package/dist/web/_app/immutable/entry/app.DtdPIxaY.js +2 -0
- package/dist/web/_app/immutable/entry/start.Cqf8YmDj.js +1 -0
- package/dist/web/_app/immutable/nodes/0.CktqlAe7.js +2 -0
- package/dist/web/_app/immutable/nodes/1.Bs7cz_ba.js +1 -0
- package/dist/web/_app/immutable/nodes/10.CAQtOBqO.js +1 -0
- package/dist/web/_app/immutable/nodes/11.l9TQGnJm.js +1 -0
- package/dist/web/_app/immutable/nodes/12.CttDoIpY.js +1 -0
- package/dist/web/_app/immutable/nodes/13.E5fh69kS.js +1 -0
- package/dist/web/_app/immutable/nodes/2.DnLSJfx-.js +106 -0
- package/dist/web/_app/immutable/nodes/3.Bw8R0Jw5.js +2 -0
- package/dist/web/_app/immutable/nodes/4.Cl0HgeTG.js +2 -0
- package/dist/web/_app/immutable/nodes/5.BpIWwWi9.js +1 -0
- package/dist/web/_app/immutable/nodes/6.jpx6ZgOI.js +1 -0
- package/dist/web/_app/immutable/nodes/7.YTFykZQe.js +1 -0
- package/dist/web/_app/immutable/nodes/8.Chy0HNU1.js +1 -0
- package/dist/web/_app/immutable/nodes/9.D10JpFt2.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
package/dist/mcp/tools.js
CHANGED
|
@@ -5,11 +5,21 @@
|
|
|
5
5
|
* methods — no new business logic. Results are returned as JSON text so the
|
|
6
6
|
* MCP client (Claude Desktop) can process structured data.
|
|
7
7
|
*
|
|
8
|
+
* Every tool enforces per-user access control via `services/access-control.ts`.
|
|
9
|
+
* Callers (the HTTP /mcp route, the stdio MCP server) must resolve a user
|
|
10
|
+
* identity before registering tools — `registerTools` requires a user in its
|
|
11
|
+
* `McpAccessContext` argument so there is no anonymous MCP path.
|
|
12
|
+
*
|
|
8
13
|
* Note: `inputSchema` is cast to `any` at each call site because the MCP SDK's
|
|
9
14
|
* ZodRawShapeCompat type does not accept ZodObject in TypeScript's strict mode.
|
|
10
15
|
* Runtime schema validation is handled correctly by the SDK regardless.
|
|
11
16
|
*/
|
|
12
17
|
import { z } from 'zod';
|
|
18
|
+
import { ENTITY_SCHEMAS } from '../core/validation.js';
|
|
19
|
+
import { getAccessibleRepos, hasRepoAccess, canWriteRepo, getAccessibleEntityIds, filterWikilinks, } from '../services/access-control.js';
|
|
20
|
+
import { createSharedFolder, FolderCreationError } from '../services/folder-creation.js';
|
|
21
|
+
import { isCuratedEntityType } from '../core/entity-types-catalog.js';
|
|
22
|
+
import { getAgentAllowedEntityTypes } from '../agent/prompts/entity-types-section.js';
|
|
13
23
|
// ── helpers ───────────────────────────────────────────────────────────────────
|
|
14
24
|
function ok(data) {
|
|
15
25
|
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
@@ -18,30 +28,137 @@ function fail(err) {
|
|
|
18
28
|
const msg = err instanceof Error ? err.message : String(err);
|
|
19
29
|
return { content: [{ type: 'text', text: msg }], isError: true };
|
|
20
30
|
}
|
|
31
|
+
/** Deny-without-leaking helper — same wording as a missing repo/entity. */
|
|
32
|
+
function notFound(repo) {
|
|
33
|
+
return fail(new Error(`Folder "${repo}" not found`));
|
|
34
|
+
}
|
|
21
35
|
// Strip frontmatter fields that duplicate the top-level id/type keys
|
|
22
36
|
function shape(id, entityType, data, extra) {
|
|
23
37
|
const { id: _id, entity_type: _et, ...rest } = data;
|
|
24
38
|
return { id, type: entityType, ...rest, ...extra };
|
|
25
39
|
}
|
|
26
40
|
// ── tool registration ─────────────────────────────────────────────────────────
|
|
27
|
-
export function registerTools(server, wm, authService) {
|
|
41
|
+
export function registerTools(server, wm, authService, ctx) {
|
|
42
|
+
const { user, wsHub, apiTokenName } = ctx;
|
|
43
|
+
// External-agent identity: "<owner>'s <token name>", or "<owner>'s agent"
|
|
44
|
+
// as a fallback when the token has no name (older tokens or contexts that
|
|
45
|
+
// didn't thread the token through). `userId` lets the client paint the chip
|
|
46
|
+
// with the same accent as the owning user's avatar.
|
|
47
|
+
const agentLabel = apiTokenName
|
|
48
|
+
? `${user.displayName}'s ${apiTokenName}`
|
|
49
|
+
: `${user.displayName}'s agent`;
|
|
50
|
+
const agentIdentity = {
|
|
51
|
+
kind: 'external',
|
|
52
|
+
label: agentLabel,
|
|
53
|
+
userId: String(user.id),
|
|
54
|
+
};
|
|
55
|
+
// Match the broadcast shape used by src/server/routes/graph-api.ts so the
|
|
56
|
+
// realtime listener in web/src/lib/stores/realtime.svelte.ts treats MCP
|
|
57
|
+
// mutations identically to web-UI mutations. The `agent` tag lets clients
|
|
58
|
+
// distinguish agent-driven mutations from human-driven ones.
|
|
59
|
+
function emitEntityChange(action, repo, entityType, entityId) {
|
|
60
|
+
wsHub?.broadcast({
|
|
61
|
+
type: 'entity_change',
|
|
62
|
+
action,
|
|
63
|
+
repo,
|
|
64
|
+
entityType,
|
|
65
|
+
entityId,
|
|
66
|
+
actor: user.displayName,
|
|
67
|
+
source: 'api',
|
|
68
|
+
agent: agentIdentity,
|
|
69
|
+
timestamp: new Date().toISOString(),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Wrap a mutation tool call so the sidebar can show a live "X's agent is
|
|
74
|
+
* acting" chip in the affected folder. `enter` fires before the work,
|
|
75
|
+
* `leave` after — wsHub TTL-cleans on crash. `verb` shapes the chip copy.
|
|
76
|
+
*/
|
|
77
|
+
async function withAgentActivity(repo, verb, fn) {
|
|
78
|
+
wsHub?.handleAgentActivity('enter', repo, agentIdentity, verb);
|
|
79
|
+
try {
|
|
80
|
+
return await fn();
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
wsHub?.handleAgentActivity('leave', repo, agentIdentity, verb);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Entity types the MCP surface may create. Matches the agent's allowlist so
|
|
87
|
+
// a workspace looks identical across the main app and MCP clients: the full
|
|
88
|
+
// canonical catalog plus workspace custom types. See
|
|
89
|
+
// src/core/entity-types-catalog.ts.
|
|
90
|
+
const builtinTypeKeys = new Set(Object.keys(ENTITY_SCHEMAS));
|
|
91
|
+
const customWorkspaceTypes = wm.getSchemaRegistry().getAllTypes()
|
|
92
|
+
.filter(t => !builtinTypeKeys.has(t));
|
|
93
|
+
const mcpAllowedCreateTypes = getAgentAllowedEntityTypes(customWorkspaceTypes);
|
|
94
|
+
const mcpAllowedSet = new Set(mcpAllowedCreateTypes);
|
|
28
95
|
// ── list_repos ────────────────────────────────────────────────────────────
|
|
29
|
-
server.registerTool('list_repos', { description: 'List
|
|
96
|
+
server.registerTool('list_repos', { description: 'List folders in the Studiograph workspace that you have access to' }, async () => ok(getAccessibleRepos(user, wm, authService)));
|
|
97
|
+
// ── create_repo ───────────────────────────────────────────────────────────
|
|
98
|
+
//
|
|
99
|
+
// Creates a new shared folder in the workspace and grants the
|
|
100
|
+
// caller folder-admin access. Shares its implementation with the web route
|
|
101
|
+
// POST /api/repos via services/folder-creation.ts so both surfaces behave
|
|
102
|
+
// identically. After creation, use create_entity with the new folder name
|
|
103
|
+
// to add entries. Folder names are immutable slugs; the display name is
|
|
104
|
+
// editable later via the web UI.
|
|
105
|
+
const createRepoSchema = z.object({
|
|
106
|
+
name: z.string().describe('Folder slug — lowercase kebab-case (letters, digits, hyphens; must start with a letter or digit). ' +
|
|
107
|
+
'This becomes the folder id and directory name; it cannot be changed without a rename.'),
|
|
108
|
+
display_name: z.string().optional().describe('Human-readable name shown in the UI (e.g. "Client Projects"). Defaults to the slug.'),
|
|
109
|
+
description: z.string().optional().describe('Short description of what this folder is for.'),
|
|
110
|
+
});
|
|
111
|
+
server.registerTool('create_repo', {
|
|
112
|
+
description: 'Create a new shared folder in the workspace. Use this when an agent or ' +
|
|
113
|
+
'user needs a fresh container for a new project, client area, or topic and no existing ' +
|
|
114
|
+
'folder fits. The caller is automatically granted folder-admin access. ' +
|
|
115
|
+
'Follow up with create_entity (passing the new folder name as `repo`) to seed entries. ' +
|
|
116
|
+
'Folder names must be kebab-case and unique; the private per-user "entries-<id>" ' +
|
|
117
|
+
'namespace is reserved and will be rejected.',
|
|
118
|
+
inputSchema: createRepoSchema,
|
|
119
|
+
}, async (args) => {
|
|
120
|
+
const { name, display_name, description } = createRepoSchema.parse(args);
|
|
121
|
+
try {
|
|
122
|
+
const repo = await createSharedFolder(wm, authService, { name, display_name, description }, user, wsHub);
|
|
123
|
+
return ok({ success: true, ...repo });
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
if (err instanceof FolderCreationError) {
|
|
127
|
+
return fail(new Error(err.message));
|
|
128
|
+
}
|
|
129
|
+
return fail(err);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
30
132
|
// ── list_entities ─────────────────────────────────────────────────────────
|
|
31
133
|
const listEntitiesSchema = z.object({
|
|
32
|
-
repo: z.string().optional().describe('
|
|
33
|
-
entity_type: z.string().optional().describe('Entity type filter (project, client, person,
|
|
134
|
+
repo: z.string().optional().describe('Folder name — omit to list across all folders'),
|
|
135
|
+
entity_type: z.string().optional().describe('Entity type filter (project, client, person, event…)'),
|
|
34
136
|
limit: z.number().int().positive().optional().describe('Maximum number of results'),
|
|
35
137
|
});
|
|
36
|
-
server.registerTool('list_entities', { description: 'List entities in a
|
|
138
|
+
server.registerTool('list_entities', { description: 'List entities in a folder (or all folders). Optionally filter by entity type.', inputSchema: listEntitiesSchema }, async (args) => {
|
|
37
139
|
const { repo, entity_type, limit } = listEntitiesSchema.parse(args);
|
|
38
140
|
try {
|
|
39
141
|
if (repo) {
|
|
142
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
143
|
+
return notFound(repo);
|
|
40
144
|
const entities = wm.getGraph(repo).list(entity_type, limit);
|
|
41
145
|
return ok(entities.map(e => shape(e.id, e.entityType, e.data)));
|
|
42
146
|
}
|
|
43
|
-
|
|
44
|
-
|
|
147
|
+
// No repo specified → iterate only over the user's accessible folders.
|
|
148
|
+
const accessible = getAccessibleRepos(user, wm, authService);
|
|
149
|
+
const results = [];
|
|
150
|
+
for (const r of accessible) {
|
|
151
|
+
try {
|
|
152
|
+
const list = wm.getGraph(r.name).list(entity_type);
|
|
153
|
+
for (const e of list) {
|
|
154
|
+
results.push(shape(e.id, e.entityType, e.data, { repo: r.name }));
|
|
155
|
+
if (limit && results.length >= limit)
|
|
156
|
+
return ok(results);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch { /* skip unmounted repos */ }
|
|
160
|
+
}
|
|
161
|
+
return ok(results);
|
|
45
162
|
}
|
|
46
163
|
catch (err) {
|
|
47
164
|
return fail(err);
|
|
@@ -49,12 +166,14 @@ export function registerTools(server, wm, authService) {
|
|
|
49
166
|
});
|
|
50
167
|
// ── get_entity ────────────────────────────────────────────────────────────
|
|
51
168
|
const getEntitySchema = z.object({
|
|
52
|
-
repo: z.string().describe('
|
|
169
|
+
repo: z.string().describe('Folder name'),
|
|
53
170
|
entity_type: z.string().describe('Entity type (project, client, person…)'),
|
|
54
171
|
entity_id: z.string().describe('Entity ID (kebab-case slug)'),
|
|
55
172
|
});
|
|
56
173
|
server.registerTool('get_entity', { description: 'Get a specific entity — includes full markdown content and frontmatter', inputSchema: getEntitySchema }, async (args) => {
|
|
57
174
|
const { repo, entity_type, entity_id } = getEntitySchema.parse(args);
|
|
175
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
176
|
+
return notFound(repo);
|
|
58
177
|
try {
|
|
59
178
|
const entity = wm.getGraph(repo).get(entity_type, entity_id);
|
|
60
179
|
return ok({ id: entity.id, type: entity.entityType, data: entity.data, content: entity.document.content });
|
|
@@ -67,13 +186,19 @@ export function registerTools(server, wm, authService) {
|
|
|
67
186
|
const searchSchema = z.object({
|
|
68
187
|
query: z.string().optional().describe('Text search query'),
|
|
69
188
|
entity_type: z.string().optional().describe('Filter by entity type'),
|
|
70
|
-
repos: z.array(z.string()).optional().describe('Limit to specific
|
|
189
|
+
repos: z.array(z.string()).optional().describe('Limit to specific folder names'),
|
|
71
190
|
limit: z.number().int().positive().optional().describe('Maximum number of results'),
|
|
72
191
|
});
|
|
73
|
-
server.registerTool('search_entities', { description: 'Full-text search for entities across
|
|
192
|
+
server.registerTool('search_entities', { description: 'Full-text search for entities across folders you can access', inputSchema: searchSchema }, async (args) => {
|
|
74
193
|
const { query, entity_type, repos, limit } = searchSchema.parse(args);
|
|
75
194
|
try {
|
|
76
|
-
const
|
|
195
|
+
const accessibleNames = new Set(getAccessibleRepos(user, wm, authService).map(r => r.name));
|
|
196
|
+
const scoped = repos
|
|
197
|
+
? repos.filter(r => accessibleNames.has(r))
|
|
198
|
+
: [...accessibleNames];
|
|
199
|
+
if (scoped.length === 0)
|
|
200
|
+
return ok([]);
|
|
201
|
+
const results = await wm.search({ query, entityType: entity_type, repoNames: scoped, limit });
|
|
77
202
|
return ok(results.map(e => shape(e.id, e.entityType, e.data, { repo: e.repoName })));
|
|
78
203
|
}
|
|
79
204
|
catch (err) {
|
|
@@ -81,62 +206,104 @@ export function registerTools(server, wm, authService) {
|
|
|
81
206
|
}
|
|
82
207
|
});
|
|
83
208
|
// ── create_entity ─────────────────────────────────────────────────────────
|
|
209
|
+
// Constrain `entity_type` to the allowlist so MCP clients (e.g. Claude Desktop)
|
|
210
|
+
// see the same type surface as the main agent. Existing canonical-type entities
|
|
211
|
+
// remain readable/updatable via other tools.
|
|
212
|
+
const createEntityTypeSchema = mcpAllowedCreateTypes.length > 0
|
|
213
|
+
? z.enum(mcpAllowedCreateTypes)
|
|
214
|
+
: z.string();
|
|
84
215
|
const createSchema = z.object({
|
|
85
|
-
repo: z.string().describe('
|
|
86
|
-
entity_type:
|
|
216
|
+
repo: z.string().describe('Folder name'),
|
|
217
|
+
entity_type: createEntityTypeSchema.describe(`Entity type. Allowed: ${mcpAllowedCreateTypes.join(', ')}.`),
|
|
87
218
|
entity_id: z.string().describe('Entity ID (kebab-case slug)'),
|
|
88
|
-
data: z.record(z.unknown()).describe('Frontmatter fields as a JSON object'),
|
|
219
|
+
data: z.record(z.string(), z.unknown()).describe('Frontmatter fields as a JSON object'),
|
|
89
220
|
content: z.string().optional().describe('Markdown body content'),
|
|
90
221
|
});
|
|
91
|
-
server.registerTool('create_entity', { description: 'Create a new entity in a
|
|
222
|
+
server.registerTool('create_entity', { description: 'Create a new entity in a folder. Commits to git automatically.', inputSchema: createSchema }, async (args) => {
|
|
92
223
|
const { repo, entity_type, entity_id, data, content } = createSchema.parse(args);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
data: data,
|
|
98
|
-
content,
|
|
99
|
-
});
|
|
100
|
-
return ok({ success: true, id: entity.id, type: entity.entityType });
|
|
224
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
225
|
+
return notFound(repo);
|
|
226
|
+
if (!canWriteRepo(user, repo, wm, authService)) {
|
|
227
|
+
return fail(new Error(`You do not have write access to folder "${repo}"`));
|
|
101
228
|
}
|
|
102
|
-
|
|
103
|
-
|
|
229
|
+
// Defense in depth: MCP SDK may not enforce zod enum strictly on all clients.
|
|
230
|
+
if (!mcpAllowedSet.has(entity_type)) {
|
|
231
|
+
if (entity_type === 'asset') {
|
|
232
|
+
// The enum already excludes `asset` (see getAgentAllowedEntityTypes).
|
|
233
|
+
// This handles MCP clients that bypass the enum schema.
|
|
234
|
+
return fail(new Error('Asset entities cannot be created via create_entity — they require a binary blob plus a sidecar text file. Use the workspace upload UI or POST /api/repos/:repo/assets directly.'));
|
|
235
|
+
}
|
|
236
|
+
const hint = isCuratedEntityType(entity_type)
|
|
237
|
+
? '' // shouldn't happen for any other curated type — they're all allowed
|
|
238
|
+
: ` Allowed: ${mcpAllowedCreateTypes.join(', ')}.`;
|
|
239
|
+
return fail(new Error(`Entity type "${entity_type}" is not a known canonical or workspace custom type.${hint}`));
|
|
104
240
|
}
|
|
241
|
+
return withAgentActivity(repo, 'creating', async () => {
|
|
242
|
+
try {
|
|
243
|
+
const entity = await wm.getGraph(repo).create({
|
|
244
|
+
entityType: entity_type,
|
|
245
|
+
entityId: entity_id,
|
|
246
|
+
data: data,
|
|
247
|
+
content,
|
|
248
|
+
});
|
|
249
|
+
emitEntityChange('created', repo, entity.entityType, entity.id);
|
|
250
|
+
return ok({ success: true, id: entity.id, type: entity.entityType });
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
return fail(err);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
105
256
|
});
|
|
106
257
|
// ── update_entity ─────────────────────────────────────────────────────────
|
|
107
258
|
const updateSchema = z.object({
|
|
108
|
-
repo: z.string().describe('
|
|
259
|
+
repo: z.string().describe('Folder name'),
|
|
109
260
|
entity_type: z.string().describe('Entity type'),
|
|
110
261
|
entity_id: z.string().describe('Entity ID'),
|
|
111
|
-
data: z.record(z.unknown()).optional().describe('Frontmatter fields to update (merged with existing)'),
|
|
262
|
+
data: z.record(z.string(), z.unknown()).optional().describe('Frontmatter fields to update (merged with existing)'),
|
|
112
263
|
content: z.string().optional().describe('New markdown body content'),
|
|
113
264
|
});
|
|
114
265
|
server.registerTool('update_entity', { description: 'Update an existing entity. Data fields are merged with existing frontmatter.', inputSchema: updateSchema }, async (args) => {
|
|
115
266
|
const { repo, entity_type, entity_id, data, content } = updateSchema.parse(args);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
data: data,
|
|
121
|
-
content,
|
|
122
|
-
});
|
|
123
|
-
return ok({ success: true, id: entity.id, type: entity.entityType });
|
|
124
|
-
}
|
|
125
|
-
catch (err) {
|
|
126
|
-
return fail(err);
|
|
267
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
268
|
+
return notFound(repo);
|
|
269
|
+
if (!canWriteRepo(user, repo, wm, authService)) {
|
|
270
|
+
return fail(new Error(`You do not have write access to folder "${repo}"`));
|
|
127
271
|
}
|
|
272
|
+
return withAgentActivity(repo, 'editing', async () => {
|
|
273
|
+
try {
|
|
274
|
+
const entity = await wm.getGraph(repo).update({
|
|
275
|
+
entityType: entity_type,
|
|
276
|
+
entityId: entity_id,
|
|
277
|
+
data: data,
|
|
278
|
+
content,
|
|
279
|
+
});
|
|
280
|
+
emitEntityChange('updated', repo, entity.entityType, entity.id);
|
|
281
|
+
return ok({ success: true, id: entity.id, type: entity.entityType });
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
return fail(err);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
128
287
|
});
|
|
129
288
|
// ── validate_wikilinks ────────────────────────────────────────────────────
|
|
130
289
|
const validateWikilinksSchema = z.object({
|
|
131
|
-
repo: z.string().describe('
|
|
290
|
+
repo: z.string().describe('Folder name'),
|
|
132
291
|
entity_type: z.string().describe('Entity type'),
|
|
133
292
|
entity_id: z.string().describe('Entity ID'),
|
|
134
293
|
});
|
|
135
294
|
server.registerTool('validate_wikilinks', { description: 'Check which wikilinks in an entity resolve to real entities and which are broken', inputSchema: validateWikilinksSchema }, async (args) => {
|
|
136
295
|
const { repo, entity_type, entity_id } = validateWikilinksSchema.parse(args);
|
|
296
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
297
|
+
return notFound(repo);
|
|
137
298
|
try {
|
|
138
299
|
const result = wm.getGraph(repo).validateWikilinks(entity_type, entity_id);
|
|
139
|
-
|
|
300
|
+
const accessibleIds = getAccessibleEntityIds(user, wm, authService);
|
|
301
|
+
const valid = filterWikilinks(result.valid, accessibleIds);
|
|
302
|
+
// Anything the user can't see is reported as broken rather than valid —
|
|
303
|
+
// it shouldn't leak the target's existence.
|
|
304
|
+
const hiddenFromValid = result.valid.filter(id => !valid.includes(id));
|
|
305
|
+
const broken = [...result.broken, ...hiddenFromValid];
|
|
306
|
+
return ok({ entity_id, valid, broken, total: valid.length + broken.length });
|
|
140
307
|
}
|
|
141
308
|
catch (err) {
|
|
142
309
|
return fail(err);
|
|
@@ -144,7 +311,7 @@ export function registerTools(server, wm, authService) {
|
|
|
144
311
|
});
|
|
145
312
|
// ── find_related ──────────────────────────────────────────────────────────
|
|
146
313
|
const relatedSchema = z.object({
|
|
147
|
-
repo: z.string().describe('
|
|
314
|
+
repo: z.string().describe('Folder name'),
|
|
148
315
|
entity_type: z.string().describe('Entity type'),
|
|
149
316
|
entity_id: z.string().describe('Entity ID'),
|
|
150
317
|
direction: z.enum(['outgoing', 'incoming', 'both']).default('both')
|
|
@@ -152,15 +319,26 @@ export function registerTools(server, wm, authService) {
|
|
|
152
319
|
});
|
|
153
320
|
server.registerTool('find_related', { description: 'Find entities related via wikilinks (outgoing) or backlinks (incoming)', inputSchema: relatedSchema }, async (args) => {
|
|
154
321
|
const { repo, entity_type, entity_id, direction } = relatedSchema.parse(args);
|
|
322
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
323
|
+
return notFound(repo);
|
|
155
324
|
try {
|
|
325
|
+
const accessibleIds = getAccessibleEntityIds(user, wm, authService);
|
|
156
326
|
const results = [];
|
|
157
327
|
if (direction === 'outgoing' || direction === 'both') {
|
|
158
328
|
const related = wm.getGraph(repo).getRelated(entity_type, entity_id);
|
|
159
|
-
|
|
329
|
+
for (const e of related) {
|
|
330
|
+
if (accessibleIds && !accessibleIds.has(e.id))
|
|
331
|
+
continue;
|
|
332
|
+
results.push(shape(e.id, e.entityType, e.data, { direction: 'outgoing' }));
|
|
333
|
+
}
|
|
160
334
|
}
|
|
161
335
|
if (direction === 'incoming' || direction === 'both') {
|
|
162
336
|
const backlinks = wm.getBacklinks(repo, entity_type, entity_id);
|
|
163
|
-
|
|
337
|
+
for (const e of backlinks) {
|
|
338
|
+
if (!hasRepoAccess(user, e.repoName, wm, authService))
|
|
339
|
+
continue;
|
|
340
|
+
results.push(shape(e.id, e.entityType, e.data, { direction: 'incoming', repo: e.repoName }));
|
|
341
|
+
}
|
|
164
342
|
}
|
|
165
343
|
return ok(results);
|
|
166
344
|
}
|
|
@@ -168,84 +346,337 @@ export function registerTools(server, wm, authService) {
|
|
|
168
346
|
return fail(err);
|
|
169
347
|
}
|
|
170
348
|
});
|
|
171
|
-
// ──
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
349
|
+
// ── list_skills ──────────────────────────────────────────────────────────
|
|
350
|
+
//
|
|
351
|
+
// Surfaces user-authored `skill` entities to external MCP clients so
|
|
352
|
+
// connected agents (Claude Desktop, Cursor, etc.) can discover and run
|
|
353
|
+
// the workspace's codified workflows. Only graph skills (entities) are
|
|
354
|
+
// exposed; bundled filesystem skills (onboarding/interview/enrichment
|
|
355
|
+
// prompts) stay internal to Studiograph's own agent.
|
|
356
|
+
const listSkillsSchema = z.object({
|
|
357
|
+
repo: z.string().optional().describe('Folder name — omit to list across all folders you have access to'),
|
|
358
|
+
});
|
|
359
|
+
function projectSkill(entity, repo) {
|
|
360
|
+
const data = entity.data;
|
|
361
|
+
return {
|
|
362
|
+
id: entity.id,
|
|
363
|
+
name: data.name || entity.id,
|
|
364
|
+
description: data.description ?? '',
|
|
365
|
+
repo,
|
|
366
|
+
loading: data.loading === 'eager' ? 'eager' : 'on-demand',
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
// `graph.list('skill')` is lenient — root-level .md files without a
|
|
370
|
+
// declared `entity_type` (READMEs, CHANGELOGs) get tagged as whatever the
|
|
371
|
+
// caller asks for. For MCP we want only real skills, so require the
|
|
372
|
+
// frontmatter to explicitly say `entity_type: skill`.
|
|
373
|
+
function isRealSkill(entity) {
|
|
374
|
+
return entity.data.entity_type === 'skill';
|
|
375
|
+
}
|
|
376
|
+
server.registerTool('list_skills', {
|
|
377
|
+
description: 'List skills (reusable agent instructions) available in the Studiograph workspace. ' +
|
|
378
|
+
'Skills are user-authored markdown — call get_skill to read the full body and follow ' +
|
|
379
|
+
'its instructions. Optionally filter by folder.',
|
|
380
|
+
inputSchema: listSkillsSchema,
|
|
381
|
+
}, async (args) => {
|
|
382
|
+
const { repo } = listSkillsSchema.parse(args);
|
|
383
|
+
try {
|
|
384
|
+
if (repo) {
|
|
385
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
386
|
+
return notFound(repo);
|
|
387
|
+
const skills = wm.getGraph(repo).list('skill');
|
|
388
|
+
return ok(skills.filter(isRealSkill).map(e => projectSkill(e, repo)));
|
|
179
389
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
groupBy: group_by ?? null,
|
|
192
|
-
sortKey: 'name',
|
|
193
|
-
sortAsc: true,
|
|
194
|
-
filters: { text: {}, enum: {}, date: {} },
|
|
195
|
-
};
|
|
196
|
-
const view = authService.createUserView(0, name, 'list', config);
|
|
197
|
-
return ok({ success: true, view: { id: view.id, name: view.name, config: view.config } });
|
|
390
|
+
const accessible = getAccessibleRepos(user, wm, authService);
|
|
391
|
+
const results = [];
|
|
392
|
+
for (const r of accessible) {
|
|
393
|
+
try {
|
|
394
|
+
const skills = wm.getGraph(r.name).list('skill');
|
|
395
|
+
for (const e of skills) {
|
|
396
|
+
if (isRealSkill(e))
|
|
397
|
+
results.push(projectSkill(e, r.name));
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
catch { /* skip unmounted repos */ }
|
|
198
401
|
}
|
|
199
|
-
|
|
200
|
-
|
|
402
|
+
return ok(results);
|
|
403
|
+
}
|
|
404
|
+
catch (err) {
|
|
405
|
+
return fail(err);
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
// ── get_skill ────────────────────────────────────────────────────────────
|
|
409
|
+
//
|
|
410
|
+
// Returns the full markdown body of a skill alongside its metadata. The
|
|
411
|
+
// body is instructions to follow — the MCP client is the runtime. No
|
|
412
|
+
// server-side agent loop, no parameter substitution in v1.
|
|
413
|
+
const getSkillSchema = z.object({
|
|
414
|
+
name: z.string().describe('Skill id (the entity_id of the skill entity)'),
|
|
415
|
+
repo: z.string().optional().describe('Folder to look in. Omit to search across all accessible folders.'),
|
|
416
|
+
});
|
|
417
|
+
server.registerTool('get_skill', {
|
|
418
|
+
description: 'Fetch the full content of a skill. Returns the skill\'s markdown body along with its ' +
|
|
419
|
+
'metadata. The body contains instructions to follow — read it and apply it to the current task.',
|
|
420
|
+
inputSchema: getSkillSchema,
|
|
421
|
+
}, async (args) => {
|
|
422
|
+
const { name, repo } = getSkillSchema.parse(args);
|
|
423
|
+
try {
|
|
424
|
+
if (repo) {
|
|
425
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
426
|
+
return notFound(repo);
|
|
427
|
+
try {
|
|
428
|
+
const entity = wm.getGraph(repo).get('skill', name);
|
|
429
|
+
if (!isRealSkill({ data: entity.data })) {
|
|
430
|
+
return fail(new Error(`Skill "${name}" not found`));
|
|
431
|
+
}
|
|
432
|
+
return ok({
|
|
433
|
+
...projectSkill({ id: entity.id, data: entity.data }, repo),
|
|
434
|
+
content: entity.document.content,
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
catch {
|
|
438
|
+
return fail(new Error(`Skill "${name}" not found`));
|
|
439
|
+
}
|
|
201
440
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
try {
|
|
212
|
-
const existing = authService.getUserView(id, 0);
|
|
213
|
-
if (!existing)
|
|
214
|
-
return fail(`View ${id} not found`);
|
|
215
|
-
const fields = {};
|
|
216
|
-
if (name)
|
|
217
|
-
fields.name = name;
|
|
218
|
-
if (selected_type !== undefined || group_by !== undefined) {
|
|
219
|
-
const config = { ...existing.config };
|
|
220
|
-
if (selected_type !== undefined)
|
|
221
|
-
config.selectedType = selected_type === 'all' ? null : selected_type;
|
|
222
|
-
if (group_by !== undefined)
|
|
223
|
-
config.groupBy = group_by === 'none' ? null : group_by;
|
|
224
|
-
fields.config = config;
|
|
441
|
+
// No repo — search accessible folders for the skill by id.
|
|
442
|
+
const accessible = getAccessibleRepos(user, wm, authService);
|
|
443
|
+
const matches = [];
|
|
444
|
+
for (const r of accessible) {
|
|
445
|
+
try {
|
|
446
|
+
const entity = wm.getGraph(r.name).get('skill', name);
|
|
447
|
+
if (!isRealSkill({ data: entity.data }))
|
|
448
|
+
continue;
|
|
449
|
+
matches.push({ repo: r.name, entity });
|
|
225
450
|
}
|
|
226
|
-
|
|
227
|
-
return ok({ success: true });
|
|
451
|
+
catch { /* not in this repo */ }
|
|
228
452
|
}
|
|
229
|
-
|
|
230
|
-
return fail(
|
|
453
|
+
if (matches.length === 0)
|
|
454
|
+
return fail(new Error(`Skill "${name}" not found`));
|
|
455
|
+
if (matches.length > 1) {
|
|
456
|
+
const folders = matches.map(m => m.repo).join(', ');
|
|
457
|
+
return fail(new Error(`Skill "${name}" exists in multiple folders (${folders}). Specify repo.`));
|
|
231
458
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
459
|
+
const { repo: matchRepo, entity } = matches[0];
|
|
460
|
+
return ok({
|
|
461
|
+
...projectSkill({ id: entity.id, data: entity.data }, matchRepo),
|
|
462
|
+
content: entity.document.content,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
catch (err) {
|
|
466
|
+
return fail(err);
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
// ── Git history tools ──────────────────────────────────────────────────────
|
|
470
|
+
//
|
|
471
|
+
// Mirrors the agent's history-tools.ts surface so external MCP clients get
|
|
472
|
+
// the same primitives. Reads gated on hasRepoAccess; restore_file gated on
|
|
473
|
+
// canWriteRepo. Single-entity scope only — multi-entity rollback is
|
|
474
|
+
// intentionally absent (deferred to a future revert_commit).
|
|
475
|
+
const listFileHistorySchema = z.object({
|
|
476
|
+
repo: z.string().describe('Folder name'),
|
|
477
|
+
entity_type: z.string().describe('Entity type'),
|
|
478
|
+
entity_id: z.string().describe('Entry ID'),
|
|
479
|
+
limit: z.number().optional().describe('Max commits (default 20, max 100)'),
|
|
480
|
+
});
|
|
481
|
+
server.registerTool('list_file_history', { description: 'List commits that touched a single entry, newest first.', inputSchema: listFileHistorySchema }, async (args) => {
|
|
482
|
+
const { repo, entity_type, entity_id, limit } = listFileHistorySchema.parse(args);
|
|
483
|
+
try {
|
|
484
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
485
|
+
return fail(`Folder "${repo}" not found`);
|
|
486
|
+
const graph = wm.getGraph(repo);
|
|
487
|
+
const gitService = graph.getGitService();
|
|
488
|
+
if (!gitService)
|
|
489
|
+
return fail('Folder is not git-backed');
|
|
490
|
+
let entityPath;
|
|
238
491
|
try {
|
|
239
|
-
const
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
authService.deleteUserView(id, 0);
|
|
243
|
-
return ok({ success: true, message: `Deleted view "${existing.name}"` });
|
|
492
|
+
const entity = graph.get(entity_type, entity_id);
|
|
493
|
+
const { relative: relativePath } = await import('path');
|
|
494
|
+
entityPath = relativePath(graph.getRepoPath(), entity.path);
|
|
244
495
|
}
|
|
245
|
-
catch
|
|
246
|
-
|
|
496
|
+
catch {
|
|
497
|
+
const idLower = `${entity_id}.md`.toLowerCase();
|
|
498
|
+
const match = gitService.listRecentDeletions(30).find((d) => d.filePath.toLowerCase().endsWith(idLower));
|
|
499
|
+
if (!match)
|
|
500
|
+
return fail(`Entry ${entity_type}/${entity_id} not found in "${repo}".`);
|
|
501
|
+
entityPath = match.filePath;
|
|
247
502
|
}
|
|
248
|
-
|
|
249
|
-
|
|
503
|
+
const cap = Math.min(100, Math.max(1, limit ?? 20));
|
|
504
|
+
const commits = gitService.getFileHistory(entityPath, cap).map((c) => ({
|
|
505
|
+
hash: c.hash.slice(0, 8),
|
|
506
|
+
fullHash: c.hash,
|
|
507
|
+
author: c.author,
|
|
508
|
+
timestamp: c.timestamp,
|
|
509
|
+
message: c.message,
|
|
510
|
+
}));
|
|
511
|
+
return ok({ repo, entityType: entity_type, entityId: entity_id, commits });
|
|
512
|
+
}
|
|
513
|
+
catch (err) {
|
|
514
|
+
return fail(err);
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
const listFolderHistorySchema = z.object({
|
|
518
|
+
repo: z.string().describe('Folder name'),
|
|
519
|
+
limit: z.number().optional().describe('Max commits (default 30, max 200)'),
|
|
520
|
+
});
|
|
521
|
+
server.registerTool('list_folder_history', { description: 'List recent commits across an entire folder.', inputSchema: listFolderHistorySchema }, async (args) => {
|
|
522
|
+
const { repo, limit } = listFolderHistorySchema.parse(args);
|
|
523
|
+
try {
|
|
524
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
525
|
+
return fail(`Folder "${repo}" not found`);
|
|
526
|
+
const gitService = wm.getGraph(repo).getGitService();
|
|
527
|
+
if (!gitService)
|
|
528
|
+
return fail('Folder is not git-backed');
|
|
529
|
+
const cap = Math.min(200, Math.max(1, limit ?? 30));
|
|
530
|
+
const commits = gitService.getHistory(cap).map((c) => ({
|
|
531
|
+
hash: c.hash.slice(0, 8),
|
|
532
|
+
fullHash: c.hash,
|
|
533
|
+
author: c.author,
|
|
534
|
+
timestamp: c.timestamp,
|
|
535
|
+
message: c.message,
|
|
536
|
+
}));
|
|
537
|
+
return ok({ repo, commits });
|
|
538
|
+
}
|
|
539
|
+
catch (err) {
|
|
540
|
+
return fail(err);
|
|
541
|
+
}
|
|
542
|
+
});
|
|
543
|
+
const listRecentDeletionsSchema = z.object({
|
|
544
|
+
repo: z.string().describe('Folder name'),
|
|
545
|
+
within_days: z.number().optional().describe('Lookback window (default 7, max 90)'),
|
|
546
|
+
});
|
|
547
|
+
server.registerTool('list_recent_deletions', { description: 'List entries deleted within the last N days. Use before restore_file to find a target.', inputSchema: listRecentDeletionsSchema }, async (args) => {
|
|
548
|
+
const { repo, within_days } = listRecentDeletionsSchema.parse(args);
|
|
549
|
+
try {
|
|
550
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
551
|
+
return fail(`Folder "${repo}" not found`);
|
|
552
|
+
const gitService = wm.getGraph(repo).getGitService();
|
|
553
|
+
if (!gitService)
|
|
554
|
+
return fail('Folder is not git-backed');
|
|
555
|
+
const days = Math.min(90, Math.max(1, within_days ?? 7));
|
|
556
|
+
const raw = gitService.listRecentDeletions(days);
|
|
557
|
+
// Naive coords: use filename basename for entity_id; entity_type
|
|
558
|
+
// sniffed from frontmatter at lastVersionCommit.
|
|
559
|
+
const deletions = raw.map((d) => {
|
|
560
|
+
const idMatch = d.filePath.match(/([^/]+)\.md$/i);
|
|
561
|
+
const entityId = idMatch ? idMatch[1] : null;
|
|
562
|
+
const content = entityId ? gitService.getFileAtCommit(d.filePath, d.lastVersionCommit) : null;
|
|
563
|
+
let entityType = null;
|
|
564
|
+
if (content) {
|
|
565
|
+
const fm = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
566
|
+
const tm = fm?.[1].match(/^entity_type:\s*['"]?([\w-]+)['"]?\s*$/m);
|
|
567
|
+
if (tm)
|
|
568
|
+
entityType = tm[1];
|
|
569
|
+
}
|
|
570
|
+
if (!entityId || !entityType)
|
|
571
|
+
return null;
|
|
572
|
+
return {
|
|
573
|
+
entityType,
|
|
574
|
+
entityId,
|
|
575
|
+
deletedAt: d.deletedAt,
|
|
576
|
+
deletedBy: d.deletedBy.name,
|
|
577
|
+
deletedInCommit: d.deletedAtCommit.slice(0, 8),
|
|
578
|
+
lastVersionCommit: d.lastVersionCommit,
|
|
579
|
+
commitMessage: d.commitMessage,
|
|
580
|
+
path: d.filePath,
|
|
581
|
+
};
|
|
582
|
+
}).filter((x) => x !== null);
|
|
583
|
+
return ok({ repo, withinDays: days, deletions });
|
|
584
|
+
}
|
|
585
|
+
catch (err) {
|
|
586
|
+
return fail(err);
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
const readFileAtCommitSchema = z.object({
|
|
590
|
+
repo: z.string().describe('Folder name'),
|
|
591
|
+
entity_type: z.string().describe('Entity type'),
|
|
592
|
+
entity_id: z.string().describe('Entry ID'),
|
|
593
|
+
commit_hash: z.string().describe('Commit hash (short or full)'),
|
|
594
|
+
});
|
|
595
|
+
server.registerTool('read_file_at_commit', { description: 'Read an entry\'s full content at a specific commit.', inputSchema: readFileAtCommitSchema }, async (args) => {
|
|
596
|
+
const { repo, entity_type, entity_id, commit_hash } = readFileAtCommitSchema.parse(args);
|
|
597
|
+
try {
|
|
598
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
599
|
+
return fail(`Folder "${repo}" not found`);
|
|
600
|
+
const graph = wm.getGraph(repo);
|
|
601
|
+
const found = graph.getEntityAtCommit(entity_type, entity_id, commit_hash);
|
|
602
|
+
if (!found)
|
|
603
|
+
return fail(`Entry ${entity_type}/${entity_id} not found at commit ${commit_hash}`);
|
|
604
|
+
return ok({ repo, entityType: entity_type, entityId: entity_id, commitHash: commit_hash, path: found.path, content: found.content });
|
|
605
|
+
}
|
|
606
|
+
catch (err) {
|
|
607
|
+
return fail(err);
|
|
608
|
+
}
|
|
609
|
+
});
|
|
610
|
+
const restoreFileSchema = z.object({
|
|
611
|
+
repo: z.string().describe('Folder name'),
|
|
612
|
+
entity_type: z.string().describe('Entity type'),
|
|
613
|
+
entity_id: z.string().describe('Entry ID'),
|
|
614
|
+
commit_hash: z.string().describe('Commit hash to restore from'),
|
|
615
|
+
confirm: z.boolean().optional().describe('Set to true ONLY after the user has approved the preview. Defaults to false.'),
|
|
616
|
+
});
|
|
617
|
+
server.registerTool('restore_file', { description: 'Restore an entry to its content at a specific commit. Preview-then-confirm: first call returns the preview payload, re-invoke with confirm: true to execute.', inputSchema: restoreFileSchema }, async (args) => {
|
|
618
|
+
const { repo, entity_type, entity_id, commit_hash, confirm } = restoreFileSchema.parse(args);
|
|
619
|
+
try {
|
|
620
|
+
if (!hasRepoAccess(user, repo, wm, authService))
|
|
621
|
+
return fail(`Folder "${repo}" not found`);
|
|
622
|
+
if (!canWriteRepo(user, repo, wm, authService))
|
|
623
|
+
return fail(`You don't have permission to write to "${repo}". Editor or admin role required.`);
|
|
624
|
+
const graph = wm.getGraph(repo);
|
|
625
|
+
if (confirm !== true) {
|
|
626
|
+
const found = graph.getEntityAtCommit(entity_type, entity_id, commit_hash);
|
|
627
|
+
if (!found)
|
|
628
|
+
return fail(`Entry ${entity_type}/${entity_id} not found at commit ${commit_hash}`);
|
|
629
|
+
let action = 'recreate';
|
|
630
|
+
try {
|
|
631
|
+
graph.get(entity_type, entity_id);
|
|
632
|
+
action = 'overwrite';
|
|
633
|
+
}
|
|
634
|
+
catch { }
|
|
635
|
+
const sizeBytes = Buffer.byteLength(found.content, 'utf-8');
|
|
636
|
+
const shortHash = commit_hash.length > 8 ? commit_hash.slice(0, 8) : commit_hash;
|
|
637
|
+
return ok({
|
|
638
|
+
success: false,
|
|
639
|
+
code: 'PREVIEW_REQUIRED',
|
|
640
|
+
preview: { action, targetPath: found.path, sizeBytes, commitHash: shortHash },
|
|
641
|
+
message: `Will ${action} ${entity_type}/${entity_id} from ${shortHash} (${sizeBytes} bytes). Re-invoke with confirm: true after approval.`,
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
const result = await withAgentActivity(repo, 'editing', async () => {
|
|
645
|
+
const { PathConflictError } = await import('../core/graph.js');
|
|
646
|
+
try {
|
|
647
|
+
return await graph.restoreFile(entity_type, entity_id, commit_hash);
|
|
648
|
+
}
|
|
649
|
+
catch (err) {
|
|
650
|
+
if (err instanceof PathConflictError) {
|
|
651
|
+
return { conflict: { path: err.path, occupiedBy: err.occupiedBy } };
|
|
652
|
+
}
|
|
653
|
+
throw err;
|
|
654
|
+
}
|
|
655
|
+
});
|
|
656
|
+
if ('conflict' in result) {
|
|
657
|
+
return ok({
|
|
658
|
+
success: false,
|
|
659
|
+
code: 'PATH_CONFLICT',
|
|
660
|
+
conflict: result.conflict,
|
|
661
|
+
message: `Cannot restore — ${result.conflict.path} is occupied by ${result.conflict.occupiedBy.entityType}/${result.conflict.occupiedBy.entityId}.`,
|
|
662
|
+
});
|
|
663
|
+
}
|
|
664
|
+
emitEntityChange(result.action === 'recreate' ? 'created' : 'updated', repo, entity_type, entity_id);
|
|
665
|
+
const shortHash = commit_hash.length > 8 ? commit_hash.slice(0, 8) : commit_hash;
|
|
666
|
+
return ok({
|
|
667
|
+
success: true,
|
|
668
|
+
repo,
|
|
669
|
+
entityType: entity_type,
|
|
670
|
+
entityId: entity_id,
|
|
671
|
+
action: result.action,
|
|
672
|
+
path: result.path,
|
|
673
|
+
commitHash: shortHash,
|
|
674
|
+
message: `Restored ${entity_type}/${entity_id} from ${shortHash} (${result.action}).`,
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
catch (err) {
|
|
678
|
+
return fail(err);
|
|
679
|
+
}
|
|
680
|
+
});
|
|
250
681
|
}
|
|
251
682
|
//# sourceMappingURL=tools.js.map
|