studiograph 1.3.47 → 1.3.48-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -16
- package/dist/agent/agent-pool.d.ts +117 -0
- package/dist/agent/agent-pool.js +287 -0
- package/dist/agent/agent-pool.js.map +1 -0
- package/dist/agent/followups.d.ts +34 -0
- package/dist/agent/followups.js +52 -0
- package/dist/agent/followups.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +113 -22
- package/dist/agent/orchestrator.js +573 -181
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +36 -0
- package/dist/agent/prompts/entity-types-section.js +90 -0
- package/dist/agent/prompts/entity-types-section.js.map +1 -0
- package/dist/agent/prompts/system.md +148 -69
- package/dist/agent/skill-loader.d.ts +30 -17
- package/dist/agent/skill-loader.js +63 -30
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/skills/entity-schema.md +77 -433
- package/dist/agent/skills/interview/entity-templates.md +193 -0
- package/dist/agent/skills/interview/question-domains.md +391 -0
- package/dist/agent/skills/interview/skill.md +204 -0
- package/dist/agent/skills/schema-rules.md +54 -0
- package/dist/agent/tools/capture-tools.d.ts +31 -0
- package/dist/agent/tools/capture-tools.js +40 -0
- package/dist/agent/tools/capture-tools.js.map +1 -0
- package/dist/agent/tools/folder-tools.d.ts +47 -0
- package/dist/agent/tools/folder-tools.js +249 -0
- package/dist/agent/tools/folder-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +7 -6
- package/dist/agent/tools/fs-tools.js +5 -4
- package/dist/agent/tools/fs-tools.js.map +1 -1
- package/dist/agent/tools/graph-tools.d.ts +21 -58
- package/dist/agent/tools/graph-tools.js +635 -332
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/history-tools.d.ts +95 -0
- package/dist/agent/tools/history-tools.js +461 -0
- package/dist/agent/tools/history-tools.js.map +1 -0
- package/dist/agent/tools/load-skill.d.ts +6 -5
- package/dist/agent/tools/load-skill.js +3 -3
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +5 -4
- package/dist/agent/tools/ops-tools.js +130 -236
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +87 -17
- package/dist/agent/tools/permission-tools.js +233 -38
- package/dist/agent/tools/permission-tools.js.map +1 -1
- package/dist/agent/tools/tool-loader.js +5 -4
- package/dist/agent/tools/tool-loader.js.map +1 -1
- package/dist/agent/tools/web-tools.d.ts +18 -0
- package/dist/agent/tools/web-tools.js +283 -0
- package/dist/agent/tools/web-tools.js.map +1 -0
- package/dist/cli/commands/about.d.ts +1 -0
- package/dist/cli/commands/about.js +55 -3
- package/dist/cli/commands/about.js.map +1 -1
- package/dist/cli/commands/admin/audit-workspace.d.ts +23 -0
- package/dist/cli/commands/admin/audit-workspace.js +133 -0
- package/dist/cli/commands/admin/audit-workspace.js.map +1 -0
- package/dist/cli/commands/admin/audit.d.ts +21 -0
- package/dist/cli/commands/admin/audit.js +174 -0
- package/dist/cli/commands/admin/audit.js.map +1 -0
- package/dist/cli/commands/admin/backup.d.ts +54 -0
- package/dist/cli/commands/admin/backup.js +207 -0
- package/dist/cli/commands/admin/backup.js.map +1 -0
- package/dist/cli/commands/admin/folder.d.ts +11 -0
- package/dist/cli/commands/admin/folder.js +186 -0
- package/dist/cli/commands/admin/folder.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +16 -0
- package/dist/cli/commands/admin/index.js +46 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate-assets.d.ts +53 -0
- package/dist/cli/commands/admin/migrate-assets.js +184 -0
- package/dist/cli/commands/admin/migrate-assets.js.map +1 -0
- package/dist/cli/commands/admin/migrate.d.ts +56 -0
- package/dist/cli/commands/admin/migrate.js +263 -0
- package/dist/cli/commands/admin/migrate.js.map +1 -0
- package/dist/cli/commands/admin/restore.d.ts +24 -0
- package/dist/cli/commands/admin/restore.js +228 -0
- package/dist/cli/commands/admin/restore.js.map +1 -0
- package/dist/cli/commands/admin/secrets.d.ts +23 -0
- package/dist/cli/commands/admin/secrets.js +256 -0
- package/dist/cli/commands/admin/secrets.js.map +1 -0
- package/dist/cli/commands/admin/settings.d.ts +28 -0
- package/dist/cli/commands/admin/settings.js +284 -0
- package/dist/cli/commands/admin/settings.js.map +1 -0
- package/dist/cli/commands/admin/token.d.ts +42 -0
- package/dist/cli/commands/admin/token.js +126 -0
- package/dist/cli/commands/admin/token.js.map +1 -0
- package/dist/cli/commands/admin/transfer-ownership.d.ts +15 -0
- package/dist/cli/commands/admin/transfer-ownership.js +106 -0
- package/dist/cli/commands/admin/transfer-ownership.js.map +1 -0
- package/dist/cli/commands/admin/user.d.ts +11 -0
- package/dist/cli/commands/admin/user.js +187 -0
- package/dist/cli/commands/admin/user.js.map +1 -0
- package/dist/cli/commands/clone.d.ts +25 -3
- package/dist/cli/commands/clone.js +142 -36
- package/dist/cli/commands/clone.js.map +1 -1
- package/dist/cli/commands/commit.d.ts +1 -1
- package/dist/cli/commands/commit.js +24 -11
- package/dist/cli/commands/commit.js.map +1 -1
- package/dist/cli/commands/config.d.ts +23 -107
- package/dist/cli/commands/config.js +52 -260
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/connector.d.ts +10 -13
- package/dist/cli/commands/connector.js +16 -58
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.js +215 -68
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/index.js +2 -2
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +10 -30
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.js +12 -4
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/orphans.js +14 -30
- package/dist/cli/commands/orphans.js.map +1 -1
- package/dist/cli/commands/r2.d.ts +3 -0
- package/dist/cli/commands/r2.js +223 -204
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.js +65 -12
- package/dist/cli/commands/redeploy.js.map +1 -1
- package/dist/cli/commands/reset.d.ts +22 -6
- package/dist/cli/commands/reset.js +142 -63
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/serve.js +209 -24
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +372 -202
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/crypto-bundle.d.ts +39 -0
- package/dist/cli/crypto-bundle.js +94 -0
- package/dist/cli/crypto-bundle.js.map +1 -0
- package/dist/cli/index.js +24 -35
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/railway-pin.d.ts +68 -0
- package/dist/cli/railway-pin.js +96 -0
- package/dist/cli/railway-pin.js.map +1 -0
- package/dist/cli/railway-provisioning.d.ts +53 -0
- package/dist/cli/railway-provisioning.js +85 -0
- package/dist/cli/railway-provisioning.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +33 -52
- package/dist/cli/setup-wizard.js +43 -68
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/core/accent-palette.d.ts +22 -0
- package/dist/core/accent-palette.js +47 -0
- package/dist/core/accent-palette.js.map +1 -0
- package/dist/core/cell-anchor.d.ts +29 -0
- package/dist/core/cell-anchor.js +53 -0
- package/dist/core/cell-anchor.js.map +1 -0
- package/dist/core/comment-anchor.d.ts +41 -0
- package/dist/core/comment-anchor.js +147 -0
- package/dist/core/comment-anchor.js.map +1 -0
- package/dist/core/commit-messages.d.ts +57 -0
- package/dist/core/commit-messages.js +85 -0
- package/dist/core/commit-messages.js.map +1 -0
- package/dist/core/embeds.d.ts +56 -0
- package/dist/core/embeds.js +103 -0
- package/dist/core/embeds.js.map +1 -0
- package/dist/core/entity-body-templates.d.ts +21 -0
- package/dist/core/entity-body-templates.js +53 -0
- package/dist/core/entity-body-templates.js.map +1 -0
- package/dist/core/entity-types-catalog.d.ts +65 -0
- package/dist/core/entity-types-catalog.js +140 -0
- package/dist/core/entity-types-catalog.js.map +1 -0
- package/dist/core/folder-paths.d.ts +41 -0
- package/dist/core/folder-paths.js +95 -0
- package/dist/core/folder-paths.js.map +1 -0
- package/dist/core/folder-sidecar.d.ts +36 -0
- package/dist/core/folder-sidecar.js +91 -0
- package/dist/core/folder-sidecar.js.map +1 -0
- package/dist/core/graph.d.ts +675 -14
- package/dist/core/graph.js +2118 -314
- package/dist/core/graph.js.map +1 -1
- package/dist/core/history-diff.d.ts +35 -0
- package/dist/core/history-diff.js +114 -0
- package/dist/core/history-diff.js.map +1 -0
- package/dist/core/schema-registry.d.ts +59 -0
- package/dist/core/schema-registry.js +198 -0
- package/dist/core/schema-registry.js.map +1 -1
- package/dist/core/schemas/connector.d.ts +67 -0
- package/dist/core/schemas/connector.js +100 -0
- package/dist/core/schemas/connector.js.map +1 -0
- package/dist/core/schemas/workspace.d.ts +122 -0
- package/dist/core/schemas/workspace.js +211 -0
- package/dist/core/schemas/workspace.js.map +1 -0
- package/dist/core/secrets/SecretStore.d.ts +77 -0
- package/dist/core/secrets/SecretStore.js +13 -0
- package/dist/core/secrets/SecretStore.js.map +1 -0
- package/dist/core/secrets/SettingsResolver.d.ts +54 -0
- package/dist/core/secrets/SettingsResolver.js +80 -0
- package/dist/core/secrets/SettingsResolver.js.map +1 -0
- package/dist/core/secrets/SettingsStore.d.ts +30 -0
- package/dist/core/secrets/SettingsStore.js +9 -0
- package/dist/core/secrets/SettingsStore.js.map +1 -0
- package/dist/core/secrets/SqliteEncryptedStore.d.ts +90 -0
- package/dist/core/secrets/SqliteEncryptedStore.js +598 -0
- package/dist/core/secrets/SqliteEncryptedStore.js.map +1 -0
- package/dist/core/secrets/audit.d.ts +36 -0
- package/dist/core/secrets/audit.js +60 -0
- package/dist/core/secrets/audit.js.map +1 -0
- package/dist/core/secrets/auth-db-migration.d.ts +129 -0
- package/dist/core/secrets/auth-db-migration.js +653 -0
- package/dist/core/secrets/auth-db-migration.js.map +1 -0
- package/dist/core/secrets/bundle.d.ts +141 -0
- package/dist/core/secrets/bundle.js +435 -0
- package/dist/core/secrets/bundle.js.map +1 -0
- package/dist/core/secrets/dual-write.d.ts +81 -0
- package/dist/core/secrets/dual-write.js +247 -0
- package/dist/core/secrets/dual-write.js.map +1 -0
- package/dist/core/secrets/encryption.d.ts +44 -0
- package/dist/core/secrets/encryption.js +97 -0
- package/dist/core/secrets/encryption.js.map +1 -0
- package/dist/core/secrets/index.d.ts +49 -0
- package/dist/core/secrets/index.js +74 -0
- package/dist/core/secrets/index.js.map +1 -0
- package/dist/core/secrets/master-key.d.ts +38 -0
- package/dist/core/secrets/master-key.js +122 -0
- package/dist/core/secrets/master-key.js.map +1 -0
- package/dist/core/secrets/probes/anthropic.d.ts +98 -0
- package/dist/core/secrets/probes/anthropic.js +300 -0
- package/dist/core/secrets/probes/anthropic.js.map +1 -0
- package/dist/core/secrets/probes/brave.d.ts +9 -0
- package/dist/core/secrets/probes/brave.js +15 -0
- package/dist/core/secrets/probes/brave.js.map +1 -0
- package/dist/core/secrets/probes/r2.d.ts +15 -0
- package/dist/core/secrets/probes/r2.js +14 -0
- package/dist/core/secrets/probes/r2.js.map +1 -0
- package/dist/core/secrets/probes/voyage.d.ts +13 -0
- package/dist/core/secrets/probes/voyage.js +52 -0
- package/dist/core/secrets/probes/voyage.js.map +1 -0
- package/dist/core/secrets/r2-structural-migration.d.ts +39 -0
- package/dist/core/secrets/r2-structural-migration.js +109 -0
- package/dist/core/secrets/r2-structural-migration.js.map +1 -0
- package/dist/core/secrets/read-flip.d.ts +59 -0
- package/dist/core/secrets/read-flip.js +87 -0
- package/dist/core/secrets/read-flip.js.map +1 -0
- package/dist/core/secrets/registry.d.ts +188 -0
- package/dist/core/secrets/registry.js +598 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/types.d.ts +77 -455
- package/dist/core/types.js +17 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +75 -7
- package/dist/core/user-config.js +155 -7
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +717 -1791
- package/dist/core/validation.js +357 -228
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +79 -12
- package/dist/core/workspace-manager.js +213 -73
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +19 -5
- package/dist/core/workspace.js +69 -35
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/comment-virtual-entity.d.ts +36 -0
- package/dist/mcp/comment-virtual-entity.js +71 -0
- package/dist/mcp/comment-virtual-entity.js.map +1 -0
- package/dist/mcp/connector-manager.d.ts +94 -13
- package/dist/mcp/connector-manager.js +283 -62
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/oauth-provider.d.ts +27 -33
- package/dist/mcp/oauth-provider.js +65 -134
- package/dist/mcp/oauth-provider.js.map +1 -1
- package/dist/mcp/oauth-registry.d.ts +62 -0
- package/dist/mcp/oauth-registry.js +85 -0
- package/dist/mcp/oauth-registry.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -3
- package/dist/mcp/server.js +30 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/state-signer.d.ts +41 -0
- package/dist/mcp/state-signer.js +120 -0
- package/dist/mcp/state-signer.js.map +1 -0
- package/dist/mcp/tools.d.ts +35 -2
- package/dist/mcp/tools.js +1051 -117
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/__tests__/helpers/graph-api.d.ts +18 -0
- package/dist/server/__tests__/helpers/graph-api.js +16 -0
- package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
- package/dist/server/body-write-coordinator.d.ts +151 -0
- package/dist/server/body-write-coordinator.js +161 -0
- package/dist/server/body-write-coordinator.js.map +1 -0
- package/dist/server/cloud-billing-flow.d.ts +32 -0
- package/dist/server/cloud-billing-flow.js +75 -0
- package/dist/server/cloud-billing-flow.js.map +1 -0
- package/dist/server/commit-audit.d.ts +26 -0
- package/dist/server/commit-audit.js +30 -0
- package/dist/server/commit-audit.js.map +1 -0
- package/dist/server/index.d.ts +14 -3
- package/dist/server/index.js +451 -193
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/sanitize.d.ts +46 -0
- package/dist/server/middleware/sanitize.js +171 -0
- package/dist/server/middleware/sanitize.js.map +1 -0
- package/dist/server/routes/asset-api.d.ts +10 -0
- package/dist/server/routes/asset-api.js +294 -0
- package/dist/server/routes/asset-api.js.map +1 -0
- package/dist/server/routes/audit-api.d.ts +24 -0
- package/dist/server/routes/audit-api.js +117 -0
- package/dist/server/routes/audit-api.js.map +1 -0
- package/dist/server/routes/auth-api.d.ts +3 -2
- package/dist/server/routes/auth-api.js +519 -38
- package/dist/server/routes/auth-api.js.map +1 -1
- package/dist/server/routes/capture-api.d.ts +18 -0
- package/dist/server/routes/capture-api.js +257 -0
- package/dist/server/routes/capture-api.js.map +1 -0
- package/dist/server/routes/chat.d.ts +4 -1
- package/dist/server/routes/chat.js +298 -88
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/comments-api.d.ts +15 -0
- package/dist/server/routes/comments-api.js +444 -0
- package/dist/server/routes/comments-api.js.map +1 -0
- package/dist/server/routes/config-api.d.ts +21 -0
- package/dist/server/routes/config-api.js +256 -0
- package/dist/server/routes/config-api.js.map +1 -0
- package/dist/server/routes/connectors-api.d.ts +17 -0
- package/dist/server/routes/connectors-api.js +410 -0
- package/dist/server/routes/connectors-api.js.map +1 -0
- package/dist/server/routes/event-ingest-api.d.ts +15 -0
- package/dist/server/routes/event-ingest-api.js +125 -0
- package/dist/server/routes/event-ingest-api.js.map +1 -0
- package/dist/server/routes/git-http.d.ts +3 -3
- package/dist/server/routes/git-http.js +86 -38
- package/dist/server/routes/git-http.js.map +1 -1
- package/dist/server/routes/graph-api-access.d.ts +35 -0
- package/dist/server/routes/graph-api-access.js +105 -0
- package/dist/server/routes/graph-api-access.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +3 -2
- package/dist/server/routes/graph-api.js +1321 -263
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/health.d.ts +18 -0
- package/dist/server/routes/health.js +74 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/insights-api.d.ts +1 -2
- package/dist/server/routes/insights-api.js +149 -41
- package/dist/server/routes/insights-api.js.map +1 -1
- package/dist/server/routes/mcp.d.ts +7 -3
- package/dist/server/routes/mcp.js +22 -6
- package/dist/server/routes/mcp.js.map +1 -1
- package/dist/server/routes/permissions-api.d.ts +9 -2
- package/dist/server/routes/permissions-api.js +87 -30
- package/dist/server/routes/permissions-api.js.map +1 -1
- package/dist/server/routes/r2-api.d.ts +25 -0
- package/dist/server/routes/r2-api.js +276 -0
- package/dist/server/routes/r2-api.js.map +1 -0
- package/dist/server/routes/secrets-api.d.ts +36 -0
- package/dist/server/routes/secrets-api.js +308 -0
- package/dist/server/routes/secrets-api.js.map +1 -0
- package/dist/server/routes/settings-api.d.ts +29 -0
- package/dist/server/routes/settings-api.js +180 -0
- package/dist/server/routes/settings-api.js.map +1 -0
- package/dist/server/routes/url-api.d.ts +7 -0
- package/dist/server/routes/url-api.js +74 -0
- package/dist/server/routes/url-api.js.map +1 -0
- package/dist/server/routes/views-api.js +81 -7
- package/dist/server/routes/views-api.js.map +1 -1
- package/dist/server/routes/workspace-api.d.ts +2 -1
- package/dist/server/routes/workspace-api.js +124 -35
- package/dist/server/routes/workspace-api.js.map +1 -1
- package/dist/server/routes/ws.d.ts +2 -1
- package/dist/server/routes/ws.js +64 -16
- package/dist/server/routes/ws.js.map +1 -1
- package/dist/server/session-manager.d.ts +48 -5
- package/dist/server/session-manager.js +182 -15
- package/dist/server/session-manager.js.map +1 -1
- package/dist/server/ws-hub.d.ts +138 -14
- package/dist/server/ws-hub.js +0 -0
- package/dist/server/ws-hub.js.map +1 -1
- package/dist/server/yjs-manager.d.ts +285 -7
- package/dist/server/yjs-manager.js +907 -36
- package/dist/server/yjs-manager.js.map +1 -1
- package/dist/server/yjs-persistence.d.ts +165 -0
- package/dist/server/yjs-persistence.js +557 -0
- package/dist/server/yjs-persistence.js.map +1 -0
- package/dist/server/yjs-text-diff.d.ts +32 -0
- package/dist/server/yjs-text-diff.js +61 -0
- package/dist/server/yjs-text-diff.js.map +1 -0
- package/dist/services/access-control.d.ts +73 -0
- package/dist/services/access-control.js +146 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/asset-listing.d.ts +39 -0
- package/dist/services/asset-listing.js +125 -0
- package/dist/services/asset-listing.js.map +1 -0
- package/dist/services/asset-upload-service.d.ts +53 -0
- package/dist/services/asset-upload-service.js +201 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/assets/asset-index-service.d.ts +82 -0
- package/dist/services/assets/asset-index-service.js +167 -0
- package/dist/services/assets/asset-index-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +44 -0
- package/dist/services/assets/base.js +55 -0
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +69 -1
- package/dist/services/assets/index.js +125 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +12 -1
- package/dist/services/assets/local.js +100 -1
- package/dist/services/assets/local.js.map +1 -1
- package/dist/services/assets/r2-sync.d.ts +88 -0
- package/dist/services/assets/r2-sync.js +412 -0
- package/dist/services/assets/r2-sync.js.map +1 -0
- package/dist/services/assets/r2.d.ts +34 -1
- package/dist/services/assets/r2.js +93 -1
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +314 -36
- package/dist/services/auth-service.js +1126 -139
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/bookmark-import-service.d.ts +49 -0
- package/dist/services/bookmark-import-service.js +250 -0
- package/dist/services/bookmark-import-service.js.map +1 -0
- package/dist/services/cloud-inference-billing.d.ts +64 -0
- package/dist/services/cloud-inference-billing.js +313 -0
- package/dist/services/cloud-inference-billing.js.map +1 -0
- package/dist/services/comment-service.d.ts +97 -0
- package/dist/services/comment-service.js +341 -0
- package/dist/services/comment-service.js.map +1 -0
- package/dist/services/csv-service.d.ts +22 -17
- package/dist/services/csv-service.js +55 -92
- package/dist/services/csv-service.js.map +1 -1
- package/dist/services/entity-mutations.d.ts +161 -0
- package/dist/services/entity-mutations.js +296 -0
- package/dist/services/entity-mutations.js.map +1 -0
- package/dist/services/event-processor.d.ts +104 -0
- package/dist/services/event-processor.js +441 -0
- package/dist/services/event-processor.js.map +1 -0
- package/dist/services/folder-creation.d.ts +33 -0
- package/dist/services/folder-creation.js +103 -0
- package/dist/services/folder-creation.js.map +1 -0
- package/dist/services/git.d.ts +54 -0
- package/dist/services/git.js +188 -54
- package/dist/services/git.js.map +1 -1
- package/dist/services/graph-maintenance.d.ts +42 -0
- package/dist/services/graph-maintenance.js +143 -0
- package/dist/services/graph-maintenance.js.map +1 -0
- package/dist/services/import-service.d.ts +45 -2
- package/dist/services/import-service.js +304 -100
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/lint-service.js +9 -16
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.d.ts +12 -1
- package/dist/services/markdown.js +71 -6
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +22 -14
- package/dist/services/memory-service.js +53 -35
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/mention-detector.d.ts +23 -0
- package/dist/services/mention-detector.js +47 -0
- package/dist/services/mention-detector.js.map +1 -0
- package/dist/services/notification-broadcast.d.ts +32 -0
- package/dist/services/notification-broadcast.js +38 -0
- package/dist/services/notification-broadcast.js.map +1 -0
- package/dist/services/notification-service.d.ts +41 -0
- package/dist/services/notification-service.js +100 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/personal-folder.d.ts +40 -0
- package/dist/services/personal-folder.js +101 -0
- package/dist/services/personal-folder.js.map +1 -0
- package/dist/services/user-person-bridge.d.ts +118 -0
- package/dist/services/user-person-bridge.js +306 -0
- package/dist/services/user-person-bridge.js.map +1 -0
- package/dist/services/vector-service.d.ts +146 -6
- package/dist/services/vector-service.js +276 -13
- package/dist/services/vector-service.js.map +1 -1
- package/dist/services/workspace-access.d.ts +106 -0
- package/dist/services/workspace-access.js +149 -0
- package/dist/services/workspace-access.js.map +1 -0
- package/dist/utils/git.d.ts +17 -2
- package/dist/utils/git.js +23 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/log.d.ts +42 -0
- package/dist/utils/log.js +137 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/preflight.js +2 -2
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/version-checker.d.ts +12 -19
- package/dist/utils/version-checker.js +14 -104
- package/dist/utils/version-checker.js.map +1 -1
- package/dist/web/_app/immutable/assets/0.DOumm94J.css +2 -0
- package/dist/web/_app/immutable/assets/13.DlIf1mKh.css +1 -0
- package/dist/web/_app/immutable/assets/14.7d-Q37wc.css +1 -0
- package/dist/web/_app/immutable/assets/15.CmLrbzZp.css +1 -0
- package/dist/web/_app/immutable/assets/2.BftNiAA4.css +1 -0
- package/dist/web/_app/immutable/assets/3.CV0abekd.css +1 -0
- package/dist/web/_app/immutable/assets/4.BgXzUTTk.css +1 -0
- package/dist/web/_app/immutable/assets/9.gsF-Ne6_.css +1 -0
- package/dist/web/_app/immutable/assets/AgentOverlay.CpvH9rhf.css +1 -0
- package/dist/web/_app/immutable/assets/AssetManagerModal.BKJfPAPk.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.bNewSxkH.css +1 -0
- package/dist/web/_app/immutable/assets/ChevronDown.Bz0FjM7b.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMembersPanel.DX1oBeF_.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMutationDialogs.BMRF6Z3z.css +1 -0
- package/dist/web/_app/immutable/assets/FolderPicker.B5KdvRYl.css +1 -0
- package/dist/web/_app/immutable/assets/GalleryView.DgvSjS0I.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.D0QbZFd6.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.DYWYMFSO.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/StopFilledAlt.CkPrHdPD.css +1 -0
- package/dist/web/_app/immutable/assets/TimelineView.DA-H6dvv.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.BS1ildu7.css +1 -0
- package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
- package/dist/web/_app/immutable/assets/formatting.vV0ne105.css +1 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CZTNEAuW.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CsGl1sm0.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.BNK2_mGO.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.DpEwFAQM.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2 +0 -0
- package/dist/web/_app/immutable/assets/inline-list.cqga56xT.css +1 -0
- package/dist/web/_app/immutable/assets/list-columns.BrRrAiZ7.css +1 -0
- package/dist/web/_app/immutable/assets/realtime.DDCWxn3B.css +1 -0
- package/dist/web/_app/immutable/assets/sheet.DJPuqnTg.css +1 -0
- package/dist/web/_app/immutable/assets/speech-dictation.C5CYFhS1.css +1 -0
- package/dist/web/_app/immutable/chunks/0edH8sO82.js +1 -0
- package/dist/web/_app/immutable/chunks/0iDDDyaZ.js +1 -0
- package/dist/web/_app/immutable/chunks/7-y0CE1z.js +1 -0
- package/dist/web/_app/immutable/chunks/7Bu427my2.js +184 -0
- package/dist/web/_app/immutable/chunks/B-V5eMSw2.js +1 -0
- package/dist/web/_app/immutable/chunks/B-i9_YVM.js +1 -0
- package/dist/web/_app/immutable/chunks/B15-kvCe.js +1 -0
- package/dist/web/_app/immutable/chunks/B4cFqqUS.js +3 -0
- package/dist/web/_app/immutable/chunks/B6Lt-qaJ.js +1 -0
- package/dist/web/_app/immutable/chunks/B7hznOQp.js +1 -0
- package/dist/web/_app/immutable/chunks/B7tbGyiU2.js +1 -0
- package/dist/web/_app/immutable/chunks/B8-Lm86o2.js +1 -0
- package/dist/web/_app/immutable/chunks/BBxt8lpa.js +1 -0
- package/dist/web/_app/immutable/chunks/BCaRi2AF.js +1 -0
- package/dist/web/_app/immutable/chunks/BJReLGMs.js +1 -0
- package/dist/web/_app/immutable/chunks/BKzV82vD2.js +83 -0
- package/dist/web/_app/immutable/chunks/BLHrJvbG.js +1 -0
- package/dist/web/_app/immutable/chunks/BQULA6er.js +4 -0
- package/dist/web/_app/immutable/chunks/BQW-EDgP2.js +224 -0
- package/dist/web/_app/immutable/chunks/BR6jMpLB.js +1 -0
- package/dist/web/_app/immutable/chunks/BUBMGU8t2.js +2 -0
- package/dist/web/_app/immutable/chunks/BVnuLlVg.js +1 -0
- package/dist/web/_app/immutable/chunks/BYokDzwE.js +1 -0
- package/dist/web/_app/immutable/chunks/B_Avv9jQ2.js +1 -0
- package/dist/web/_app/immutable/chunks/Bbp76jaT2.js +1 -0
- package/dist/web/_app/immutable/chunks/BddNmQ8j.js +1 -0
- package/dist/web/_app/immutable/chunks/BiJjH5mJ.js +2 -0
- package/dist/web/_app/immutable/chunks/BlyFGPFV.js +22 -0
- package/dist/web/_app/immutable/chunks/Bt88HrRx.js +1 -0
- package/dist/web/_app/immutable/chunks/Bu2iU6hh.js +67 -0
- package/dist/web/_app/immutable/chunks/Buih1pxI.js +1 -0
- package/dist/web/_app/immutable/chunks/BwwLJVvR.js +1 -0
- package/dist/web/_app/immutable/chunks/C0RpyyYZ.js +7 -0
- package/dist/web/_app/immutable/chunks/C2l-EXsT2.js +1 -0
- package/dist/web/_app/immutable/chunks/C35TIzaB.js +1 -0
- package/dist/web/_app/immutable/chunks/C3OdK8z_2.js +1 -0
- package/dist/web/_app/immutable/chunks/C6Nx0jpM.js +1 -0
- package/dist/web/_app/immutable/chunks/CA7O0J_u2.js +1 -0
- package/dist/web/_app/immutable/chunks/CAwjrHdk.js +23 -0
- package/dist/web/_app/immutable/chunks/CCLR-AJL2.js +185 -0
- package/dist/web/_app/immutable/chunks/CD0X7XPW.js +6 -0
- package/dist/web/_app/immutable/chunks/CDTjuBSm2.js +1 -0
- package/dist/web/_app/immutable/chunks/CSUrYOis.js +1 -0
- package/dist/web/_app/immutable/chunks/CUPSJObs.js +1 -0
- package/dist/web/_app/immutable/chunks/CUoGvuxK2.js +2 -0
- package/dist/web/_app/immutable/chunks/CWh8aehb.js +1 -0
- package/dist/web/_app/immutable/chunks/CY4XVBP0.js +1 -0
- package/dist/web/_app/immutable/chunks/CYTTTma0.js +3 -0
- package/dist/web/_app/immutable/chunks/CaoriuNq.js +1 -0
- package/dist/web/_app/immutable/chunks/CcsSt9AW2.js +1 -0
- package/dist/web/_app/immutable/chunks/Cd4VfAZC.js +2 -0
- package/dist/web/_app/immutable/chunks/CePZ1985.js +1 -0
- package/dist/web/_app/immutable/chunks/Cei8CKT4.js +1 -0
- package/dist/web/_app/immutable/chunks/CheXrbDk.js +1 -0
- package/dist/web/_app/immutable/chunks/CkLfUXwy.js +1 -0
- package/dist/web/_app/immutable/chunks/Cl-W0JYt.js +2 -0
- package/dist/web/_app/immutable/chunks/Cna7tYp-.js +1 -0
- package/dist/web/_app/immutable/chunks/Czwe4sGU2.js +3 -0
- package/dist/web/_app/immutable/chunks/D41CbXmM.js +1 -0
- package/dist/web/_app/immutable/chunks/D83_Ss42.js +1 -0
- package/dist/web/_app/immutable/chunks/D9NgbGbO2.js +9 -0
- package/dist/web/_app/immutable/chunks/DA-BuZei.js +2 -0
- package/dist/web/_app/immutable/chunks/DAXW5iLp.js +1 -0
- package/dist/web/_app/immutable/chunks/DCNJWlho2.js +1 -0
- package/dist/web/_app/immutable/chunks/DCtgLRl52.js +1 -0
- package/dist/web/_app/immutable/chunks/DH0epITQ2.js +1 -0
- package/dist/web/_app/immutable/chunks/DIb5rAPU2.js +1 -0
- package/dist/web/_app/immutable/chunks/DOmH4G9o2.js +14 -0
- package/dist/web/_app/immutable/chunks/DQMWa2t7.js +1 -0
- package/dist/web/_app/immutable/chunks/DQ_Xokap2.js +1 -0
- package/dist/web/_app/immutable/chunks/DR1K6PIm.js +1 -0
- package/dist/web/_app/immutable/chunks/DTCHhxD5.js +1 -0
- package/dist/web/_app/immutable/chunks/DU7XA-cL2.js +1 -0
- package/dist/web/_app/immutable/chunks/DVcy5Pp82.js +1 -0
- package/dist/web/_app/immutable/chunks/DWygwzcO2.js +1 -0
- package/dist/web/_app/immutable/chunks/DYXDRmoo2.js +1 -0
- package/dist/web/_app/immutable/chunks/DZEmjBTb.js +5 -0
- package/dist/web/_app/immutable/chunks/DaoOQFPb.js +1 -0
- package/dist/web/_app/immutable/chunks/DdfvtDOY.js +1 -0
- package/dist/web/_app/immutable/chunks/DevZTY1l.js +1 -0
- package/dist/web/_app/immutable/chunks/DiMQob8p.js +1 -0
- package/dist/web/_app/immutable/chunks/DiQJ9DLy.js +1 -0
- package/dist/web/_app/immutable/chunks/Dj5oP_ik.js +2 -0
- package/dist/web/_app/immutable/chunks/DjTJ4D_0.js +3 -0
- package/dist/web/_app/immutable/chunks/Dk4TeNwu.js +1 -0
- package/dist/web/_app/immutable/chunks/Dng3OcRd2.js +1 -0
- package/dist/web/_app/immutable/chunks/Do1OCNEG.js +1 -0
- package/dist/web/_app/immutable/chunks/Do6qOOng.js +1 -0
- package/dist/web/_app/immutable/chunks/DoQwt-f9.js +1 -0
- package/dist/web/_app/immutable/chunks/Dqg3k9HI2.js +1 -0
- package/dist/web/_app/immutable/chunks/DsnqOT222.js +1 -0
- package/dist/web/_app/immutable/chunks/DvJSCDuZ2.js +1 -0
- package/dist/web/_app/immutable/chunks/DvPuaTCl.js +5 -0
- package/dist/web/_app/immutable/chunks/DvYQu1SV.js +1 -0
- package/dist/web/_app/immutable/chunks/HdjeJPly2.js +1 -0
- package/dist/web/_app/immutable/chunks/JDw4tOUY.js +1 -0
- package/dist/web/_app/immutable/chunks/KBbDg4lS2.js +1 -0
- package/dist/web/_app/immutable/chunks/KQXQLJf32.js +1 -0
- package/dist/web/_app/immutable/chunks/LGnNalpn2.js +2 -0
- package/dist/web/_app/immutable/chunks/SH5Fg0Xu.js +1 -0
- package/dist/web/_app/immutable/chunks/Shyla9c12.js +2 -0
- package/dist/web/_app/immutable/chunks/VQbAelHN.js +1 -0
- package/dist/web/_app/immutable/chunks/apNT0aug2.js +1 -0
- package/dist/web/_app/immutable/chunks/e0ySQvQ6.js +1 -0
- package/dist/web/_app/immutable/chunks/eNB_sIHC2.js +1 -0
- package/dist/web/_app/immutable/chunks/g09ZrevW2.js +1 -0
- package/dist/web/_app/immutable/chunks/h4WWBpcD2.js +2692 -0
- package/dist/web/_app/immutable/chunks/kLub81jO.js +1 -0
- package/dist/web/_app/immutable/chunks/kW0z_eo62.js +1 -0
- package/dist/web/_app/immutable/chunks/oBQOivfH.js +1 -0
- package/dist/web/_app/immutable/chunks/ss8hcwTT.js +1 -0
- package/dist/web/_app/immutable/chunks/sub7ikQV.js +2 -0
- package/dist/web/_app/immutable/chunks/uuFM-ygL.js +1 -0
- package/dist/web/_app/immutable/chunks/v7me-ydg.js +2 -0
- package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/dist/web/_app/immutable/chunks/yWi6xIp8.js +1 -0
- package/dist/web/_app/immutable/chunks/zl16E4yc2.js +1 -0
- package/dist/web/_app/immutable/entry/app.Bgniax9U.js +2 -0
- package/dist/web/_app/immutable/entry/start.DeD3x0AC.js +1 -0
- package/dist/web/_app/immutable/nodes/0.D7f7eDDY.js +2 -0
- package/dist/web/_app/immutable/nodes/1.nDAGsQWA.js +1 -0
- package/dist/web/_app/immutable/nodes/10.DFbhcPKT.js +1 -0
- package/dist/web/_app/immutable/nodes/11.CDErrkBt.js +1 -0
- package/dist/web/_app/immutable/nodes/12.QmphOXE2.js +1 -0
- package/dist/web/_app/immutable/nodes/13.Bq5rDhPs.js +1 -0
- package/dist/web/_app/immutable/nodes/14.BlcHqgr6.js +1 -0
- package/dist/web/_app/immutable/nodes/15.COK_-D-x.js +1 -0
- package/dist/web/_app/immutable/nodes/2.DOsCYNHa.js +109 -0
- package/dist/web/_app/immutable/nodes/3.BgE1sIyr.js +2 -0
- package/dist/web/_app/immutable/nodes/4.DvgaHeI4.js +11 -0
- package/dist/web/_app/immutable/nodes/5.CrjeBZES.js +1 -0
- package/dist/web/_app/immutable/nodes/6.DoHxsiEE.js +1 -0
- package/dist/web/_app/immutable/nodes/7.04fnxKIo.js +1 -0
- package/dist/web/_app/immutable/nodes/8.D35_cY6C.js +1 -0
- package/dist/web/_app/immutable/nodes/9.BRionwW6.js +1 -0
- package/dist/web/_app/version.json +1 -1
- package/dist/web/favicon-16.png +0 -0
- package/dist/web/favicon-180.png +0 -0
- package/dist/web/favicon-32.png +0 -0
- package/dist/web/favicon-48.png +0 -0
- package/dist/web/favicon-512.png +0 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/favicon.svg +8 -0
- package/dist/web/index.html +56 -19
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +34 -14
- package/dist/agent/skills/enrich-entities.md +0 -136
- package/dist/agent/skills/obsidian-source-setup.md +0 -246
- package/dist/agent/skills/skill-loader.d.ts +0 -48
- package/dist/agent/skills/skill-loader.js +0 -166
- package/dist/agent/skills/skill-loader.js.map +0 -1
- package/dist/agent/skills/sync-configuration.md +0 -119
- package/dist/agent/skills/sync-setup.md +0 -82
- package/dist/agent/tools/sync-tools.d.ts +0 -35
- package/dist/agent/tools/sync-tools.js +0 -992
- package/dist/agent/tools/sync-tools.js.map +0 -1
- package/dist/auth/github.d.ts +0 -56
- package/dist/auth/github.js +0 -169
- package/dist/auth/github.js.map +0 -1
- package/dist/cli/commands/access.d.ts +0 -11
- package/dist/cli/commands/access.js +0 -156
- package/dist/cli/commands/access.js.map +0 -1
- package/dist/cli/commands/app.d.ts +0 -7
- package/dist/cli/commands/app.js +0 -268
- package/dist/cli/commands/app.js.map +0 -1
- package/dist/cli/commands/auth.d.ts +0 -10
- package/dist/cli/commands/auth.js +0 -79
- package/dist/cli/commands/auth.js.map +0 -1
- package/dist/cli/commands/clear.d.ts +0 -5
- package/dist/cli/commands/clear.js +0 -36
- package/dist/cli/commands/clear.js.map +0 -1
- package/dist/cli/commands/collection.d.ts +0 -10
- package/dist/cli/commands/collection.js +0 -187
- package/dist/cli/commands/collection.js.map +0 -1
- package/dist/cli/commands/enrich.d.ts +0 -11
- package/dist/cli/commands/enrich.js +0 -135
- package/dist/cli/commands/enrich.js.map +0 -1
- package/dist/cli/commands/graphrag.d.ts +0 -12
- package/dist/cli/commands/graphrag.js +0 -122
- package/dist/cli/commands/graphrag.js.map +0 -1
- package/dist/cli/commands/join.d.ts +0 -9
- package/dist/cli/commands/join.js +0 -255
- package/dist/cli/commands/join.js.map +0 -1
- package/dist/cli/commands/members.d.ts +0 -11
- package/dist/cli/commands/members.js +0 -230
- package/dist/cli/commands/members.js.map +0 -1
- package/dist/cli/commands/org.d.ts +0 -10
- package/dist/cli/commands/org.js +0 -132
- package/dist/cli/commands/org.js.map +0 -1
- package/dist/cli/commands/provision.d.ts +0 -8
- package/dist/cli/commands/provision.js +0 -116
- package/dist/cli/commands/provision.js.map +0 -1
- package/dist/cli/commands/resolve.d.ts +0 -8
- package/dist/cli/commands/resolve.js +0 -85
- package/dist/cli/commands/resolve.js.map +0 -1
- package/dist/cli/commands/review.d.ts +0 -19
- package/dist/cli/commands/review.js +0 -128
- package/dist/cli/commands/review.js.map +0 -1
- package/dist/cli/commands/source.d.ts +0 -16
- package/dist/cli/commands/source.js +0 -159
- package/dist/cli/commands/source.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -7
- package/dist/cli/commands/start.js +0 -589
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/sync-collection.d.ts +0 -14
- package/dist/cli/commands/sync-collection.js +0 -355
- package/dist/cli/commands/sync-collection.js.map +0 -1
- package/dist/cli/commands/sync-entities.d.ts +0 -13
- package/dist/cli/commands/sync-entities.js +0 -242
- package/dist/cli/commands/sync-entities.js.map +0 -1
- package/dist/cli/commands/team.d.ts +0 -12
- package/dist/cli/commands/team.js +0 -185
- package/dist/cli/commands/team.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -8
- package/dist/cli/commands/update.js +0 -155
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/user.d.ts +0 -7
- package/dist/cli/commands/user.js +0 -153
- package/dist/cli/commands/user.js.map +0 -1
- package/dist/cli/scaffolding.d.ts +0 -12
- package/dist/cli/scaffolding.js +0 -397
- package/dist/cli/scaffolding.js.map +0 -1
- package/dist/cli/sync-review-interactive.d.ts +0 -31
- package/dist/cli/sync-review-interactive.js +0 -393
- package/dist/cli/sync-review-interactive.js.map +0 -1
- package/dist/core/migration-runner.d.ts +0 -42
- package/dist/core/migration-runner.js +0 -232
- package/dist/core/migration-runner.js.map +0 -1
- package/dist/core/migration-types.d.ts +0 -101
- package/dist/core/migration-types.js +0 -21
- package/dist/core/migration-types.js.map +0 -1
- package/dist/core/migrations/20260219-formalize-memory-location.d.ts +0 -2
- package/dist/core/migrations/20260219-formalize-memory-location.js +0 -35
- package/dist/core/migrations/20260219-formalize-memory-location.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +0 -12
- package/dist/core/migrations/20260220-add-workspace-metadata.js +0 -65
- package/dist/core/migrations/20260220-add-workspace-metadata.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-readme.d.ts +0 -11
- package/dist/core/migrations/20260220-add-workspace-readme.js +0 -82
- package/dist/core/migrations/20260220-add-workspace-readme.js.map +0 -1
- package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +0 -9
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js +0 -64
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +0 -1
- package/dist/core/migrations/index.d.ts +0 -11
- package/dist/core/migrations/index.js +0 -23
- package/dist/core/migrations/index.js.map +0 -1
- package/dist/integrations/asana.d.ts +0 -26
- package/dist/integrations/asana.js +0 -78
- package/dist/integrations/asana.js.map +0 -1
- package/dist/integrations/figma-local.d.ts +0 -16
- package/dist/integrations/figma-local.js +0 -10
- package/dist/integrations/figma-local.js.map +0 -1
- package/dist/integrations/figma.d.ts +0 -17
- package/dist/integrations/figma.js +0 -17
- package/dist/integrations/figma.js.map +0 -1
- package/dist/integrations/granola.d.ts +0 -24
- package/dist/integrations/granola.js +0 -60
- package/dist/integrations/granola.js.map +0 -1
- package/dist/integrations/linear.d.ts +0 -14
- package/dist/integrations/linear.js +0 -80
- package/dist/integrations/linear.js.map +0 -1
- package/dist/integrations/paper-local.d.ts +0 -14
- package/dist/integrations/paper-local.js +0 -10
- package/dist/integrations/paper-local.js.map +0 -1
- package/dist/integrations/paper.d.ts +0 -2
- package/dist/integrations/paper.js +0 -10
- package/dist/integrations/paper.js.map +0 -1
- package/dist/integrations/pipedrive.d.ts +0 -26
- package/dist/integrations/pipedrive.js +0 -97
- package/dist/integrations/pipedrive.js.map +0 -1
- package/dist/integrations/registry.d.ts +0 -15
- package/dist/integrations/registry.js +0 -27
- package/dist/integrations/registry.js.map +0 -1
- package/dist/integrations/types.d.ts +0 -38
- package/dist/integrations/types.js +0 -9
- package/dist/integrations/types.js.map +0 -1
- package/dist/lib/lib/utils.d.ts +0 -2
- package/dist/lib/lib/utils.js +0 -6
- package/dist/lib/lib/utils.js.map +0 -1
- package/dist/mcp/connectors/asana.d.ts +0 -2
- package/dist/mcp/connectors/asana.js +0 -20
- package/dist/mcp/connectors/asana.js.map +0 -1
- package/dist/mcp/connectors/definitions.d.ts +0 -45
- package/dist/mcp/connectors/definitions.js +0 -32
- package/dist/mcp/connectors/definitions.js.map +0 -1
- package/dist/mcp/connectors/figma.d.ts +0 -5
- package/dist/mcp/connectors/figma.js +0 -21
- package/dist/mcp/connectors/figma.js.map +0 -1
- package/dist/mcp/connectors/gdrive.d.ts +0 -2
- package/dist/mcp/connectors/gdrive.js +0 -20
- package/dist/mcp/connectors/gdrive.js.map +0 -1
- package/dist/mcp/connectors/granola.d.ts +0 -2
- package/dist/mcp/connectors/granola.js +0 -12
- package/dist/mcp/connectors/granola.js.map +0 -1
- package/dist/mcp/connectors/linear.d.ts +0 -2
- package/dist/mcp/connectors/linear.js +0 -19
- package/dist/mcp/connectors/linear.js.map +0 -1
- package/dist/mcp/connectors/obsidian.d.ts +0 -2
- package/dist/mcp/connectors/obsidian.js +0 -19
- package/dist/mcp/connectors/obsidian.js.map +0 -1
- package/dist/mcp/connectors/pipedrive.d.ts +0 -2
- package/dist/mcp/connectors/pipedrive.js +0 -20
- package/dist/mcp/connectors/pipedrive.js.map +0 -1
- package/dist/mcp/connectors/slack.d.ts +0 -2
- package/dist/mcp/connectors/slack.js +0 -21
- package/dist/mcp/connectors/slack.js.map +0 -1
- package/dist/mcp/server-oauth-provider.d.ts +0 -56
- package/dist/mcp/server-oauth-provider.js +0 -142
- package/dist/mcp/server-oauth-provider.js.map +0 -1
- package/dist/server/chrome/chrome.css +0 -691
- package/dist/server/chrome/chrome.js +0 -374
- package/dist/server/collab-authority.d.ts +0 -70
- package/dist/server/collab-authority.js +0 -218
- package/dist/server/collab-authority.js.map +0 -1
- package/dist/server/collab.d.ts +0 -29
- package/dist/server/collab.js +0 -195
- package/dist/server/collab.js.map +0 -1
- package/dist/server/commit-scheduler.d.ts +0 -39
- package/dist/server/commit-scheduler.js +0 -113
- package/dist/server/commit-scheduler.js.map +0 -1
- package/dist/server/plugin-loader.d.ts +0 -53
- package/dist/server/plugin-loader.js +0 -155
- package/dist/server/plugin-loader.js.map +0 -1
- package/dist/server/routes/collab.d.ts +0 -6
- package/dist/server/routes/collab.js +0 -10
- package/dist/server/routes/collab.js.map +0 -1
- package/dist/server/routes/git-api.d.ts +0 -9
- package/dist/server/routes/git-api.js +0 -82
- package/dist/server/routes/git-api.js.map +0 -1
- package/dist/server/routes/meeting-ingest-api.d.ts +0 -15
- package/dist/server/routes/meeting-ingest-api.js +0 -323
- package/dist/server/routes/meeting-ingest-api.js.map +0 -1
- package/dist/server/routes/sync-api.d.ts +0 -26
- package/dist/server/routes/sync-api.js +0 -814
- package/dist/server/routes/sync-api.js.map +0 -1
- package/dist/server/routes/webhook.d.ts +0 -14
- package/dist/server/routes/webhook.js +0 -102
- package/dist/server/routes/webhook.js.map +0 -1
- package/dist/services/github-provisioner.d.ts +0 -36
- package/dist/services/github-provisioner.js +0 -126
- package/dist/services/github-provisioner.js.map +0 -1
- package/dist/services/github-service.d.ts +0 -99
- package/dist/services/github-service.js +0 -310
- package/dist/services/github-service.js.map +0 -1
- package/dist/services/insights.d.ts +0 -38
- package/dist/services/insights.js +0 -246
- package/dist/services/insights.js.map +0 -1
- package/dist/services/sync/collection-sync.d.ts +0 -60
- package/dist/services/sync/collection-sync.js +0 -509
- package/dist/services/sync/collection-sync.js.map +0 -1
- package/dist/services/sync/commit.d.ts +0 -60
- package/dist/services/sync/commit.js +0 -354
- package/dist/services/sync/commit.js.map +0 -1
- package/dist/services/sync/context-index.d.ts +0 -69
- package/dist/services/sync/context-index.js +0 -280
- package/dist/services/sync/context-index.js.map +0 -1
- package/dist/services/sync/data-fetcher.d.ts +0 -31
- package/dist/services/sync/data-fetcher.js +0 -12
- package/dist/services/sync/data-fetcher.js.map +0 -1
- package/dist/services/sync/derive.d.ts +0 -34
- package/dist/services/sync/derive.js +0 -164
- package/dist/services/sync/derive.js.map +0 -1
- package/dist/services/sync/enrichment-state.d.ts +0 -31
- package/dist/services/sync/enrichment-state.js +0 -63
- package/dist/services/sync/enrichment-state.js.map +0 -1
- package/dist/services/sync/enrichment.d.ts +0 -25
- package/dist/services/sync/enrichment.js +0 -121
- package/dist/services/sync/enrichment.js.map +0 -1
- package/dist/services/sync/entity-refresh.d.ts +0 -30
- package/dist/services/sync/entity-refresh.js +0 -275
- package/dist/services/sync/entity-refresh.js.map +0 -1
- package/dist/services/sync/frontmatter-extractor.d.ts +0 -40
- package/dist/services/sync/frontmatter-extractor.js +0 -279
- package/dist/services/sync/frontmatter-extractor.js.map +0 -1
- package/dist/services/sync/graph-match-state.d.ts +0 -33
- package/dist/services/sync/graph-match-state.js +0 -61
- package/dist/services/sync/graph-match-state.js.map +0 -1
- package/dist/services/sync/graph-match.d.ts +0 -53
- package/dist/services/sync/graph-match.js +0 -316
- package/dist/services/sync/graph-match.js.map +0 -1
- package/dist/services/sync/graphrag-client.d.ts +0 -43
- package/dist/services/sync/graphrag-client.js +0 -94
- package/dist/services/sync/graphrag-client.js.map +0 -1
- package/dist/services/sync/graphrag-config.d.ts +0 -16
- package/dist/services/sync/graphrag-config.js +0 -39
- package/dist/services/sync/graphrag-config.js.map +0 -1
- package/dist/services/sync/graphrag-context.d.ts +0 -14
- package/dist/services/sync/graphrag-context.js +0 -109
- package/dist/services/sync/graphrag-context.js.map +0 -1
- package/dist/services/sync/graphrag-indexer.d.ts +0 -30
- package/dist/services/sync/graphrag-indexer.js +0 -358
- package/dist/services/sync/graphrag-indexer.js.map +0 -1
- package/dist/services/sync/llm.d.ts +0 -32
- package/dist/services/sync/llm.js +0 -115
- package/dist/services/sync/llm.js.map +0 -1
- package/dist/services/sync/mcp-client.d.ts +0 -71
- package/dist/services/sync/mcp-client.js +0 -299
- package/dist/services/sync/mcp-client.js.map +0 -1
- package/dist/services/sync/model-factory.d.ts +0 -13
- package/dist/services/sync/model-factory.js +0 -38
- package/dist/services/sync/model-factory.js.map +0 -1
- package/dist/services/sync/name-quality.d.ts +0 -31
- package/dist/services/sync/name-quality.js +0 -60
- package/dist/services/sync/name-quality.js.map +0 -1
- package/dist/services/sync/output-schemas.d.ts +0 -92
- package/dist/services/sync/output-schemas.js +0 -43
- package/dist/services/sync/output-schemas.js.map +0 -1
- package/dist/services/sync/prompts.d.ts +0 -19
- package/dist/services/sync/prompts.js +0 -128
- package/dist/services/sync/prompts.js.map +0 -1
- package/dist/services/sync/reconciler.d.ts +0 -48
- package/dist/services/sync/reconciler.js +0 -294
- package/dist/services/sync/reconciler.js.map +0 -1
- package/dist/services/sync/rest-client.d.ts +0 -40
- package/dist/services/sync/rest-client.js +0 -100
- package/dist/services/sync/rest-client.js.map +0 -1
- package/dist/services/sync/source-config.d.ts +0 -67
- package/dist/services/sync/source-config.js +0 -304
- package/dist/services/sync/source-config.js.map +0 -1
- package/dist/services/sync/source-definitions/asana.d.ts +0 -14
- package/dist/services/sync/source-definitions/asana.js +0 -42
- package/dist/services/sync/source-definitions/asana.js.map +0 -1
- package/dist/services/sync/source-definitions/definitions.d.ts +0 -8
- package/dist/services/sync/source-definitions/definitions.js +0 -8
- package/dist/services/sync/source-definitions/definitions.js.map +0 -1
- package/dist/services/sync/source-definitions/gdrive.d.ts +0 -16
- package/dist/services/sync/source-definitions/gdrive.js +0 -68
- package/dist/services/sync/source-definitions/gdrive.js.map +0 -1
- package/dist/services/sync/source-definitions/granola.d.ts +0 -2
- package/dist/services/sync/source-definitions/granola.js +0 -21
- package/dist/services/sync/source-definitions/granola.js.map +0 -1
- package/dist/services/sync/source-definitions/linear.d.ts +0 -2
- package/dist/services/sync/source-definitions/linear.js +0 -62
- package/dist/services/sync/source-definitions/linear.js.map +0 -1
- package/dist/services/sync/source-definitions/obsidian.d.ts +0 -2
- package/dist/services/sync/source-definitions/obsidian.js +0 -55
- package/dist/services/sync/source-definitions/obsidian.js.map +0 -1
- package/dist/services/sync/source-definitions/pipedrive.d.ts +0 -2
- package/dist/services/sync/source-definitions/pipedrive.js +0 -43
- package/dist/services/sync/source-definitions/pipedrive.js.map +0 -1
- package/dist/services/sync/staging.d.ts +0 -53
- package/dist/services/sync/staging.js +0 -130
- package/dist/services/sync/staging.js.map +0 -1
- package/dist/services/sync/structured-extractor.d.ts +0 -57
- package/dist/services/sync/structured-extractor.js +0 -584
- package/dist/services/sync/structured-extractor.js.map +0 -1
- package/dist/services/sync/sync-runner.d.ts +0 -32
- package/dist/services/sync/sync-runner.js +0 -195
- package/dist/services/sync/sync-runner.js.map +0 -1
- package/dist/services/sync/sync-state.d.ts +0 -43
- package/dist/services/sync/sync-state.js +0 -154
- package/dist/services/sync/sync-state.js.map +0 -1
- package/dist/services/sync/types.d.ts +0 -381
- package/dist/services/sync/types.js +0 -8
- package/dist/services/sync/types.js.map +0 -1
- package/dist/services/sync/unstructured-extractor.d.ts +0 -27
- package/dist/services/sync/unstructured-extractor.js +0 -185
- package/dist/services/sync/unstructured-extractor.js.map +0 -1
- package/dist/utils/merge-resolver.d.ts +0 -59
- package/dist/utils/merge-resolver.js +0 -303
- package/dist/utils/merge-resolver.js.map +0 -1
- package/dist/utils/workspace-config.d.ts +0 -8
- package/dist/utils/workspace-config.js +0 -22
- package/dist/utils/workspace-config.js.map +0 -1
- package/dist/web/_app/immutable/assets/0.DdizXOKi.css +0 -1
- package/dist/web/_app/immutable/assets/10.BUrHkYry.css +0 -1
- package/dist/web/_app/immutable/assets/2.n7-yW_Fs.css +0 -1
- package/dist/web/_app/immutable/assets/3.BtaZagnv.css +0 -1
- package/dist/web/_app/immutable/assets/4.DT7X0x5S.css +0 -1
- package/dist/web/_app/immutable/assets/5.DFeGxLYf.css +0 -1
- package/dist/web/_app/immutable/assets/6.CquhUpOu.css +0 -1
- package/dist/web/_app/immutable/assets/7.CjbDRbuG.css +0 -1
- package/dist/web/_app/immutable/assets/8.S1QdUGNM.css +0 -1
- package/dist/web/_app/immutable/assets/9.CT4xL4K3.css +0 -1
- package/dist/web/_app/immutable/assets/Copy.FS8bdfxr.css +0 -1
- package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
- package/dist/web/_app/immutable/assets/ViewToolbar.D-QW2oKe.css +0 -1
- package/dist/web/_app/immutable/assets/index.D6tMDJWk.css +0 -1
- package/dist/web/_app/immutable/chunks/37NdyH6G.js +0 -32
- package/dist/web/_app/immutable/chunks/4Hhzb6pv.js +0 -1
- package/dist/web/_app/immutable/chunks/72bZS3G9.js +0 -1
- package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
- package/dist/web/_app/immutable/chunks/B-7hHz7B.js +0 -1
- package/dist/web/_app/immutable/chunks/B340SUKR.js +0 -1
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
- package/dist/web/_app/immutable/chunks/BDoWDZaG.js +0 -1
- package/dist/web/_app/immutable/chunks/BFyl1ZHO.js +0 -1
- package/dist/web/_app/immutable/chunks/BS2rFAVq.js +0 -1
- package/dist/web/_app/immutable/chunks/BSsDC_p4.js +0 -1
- package/dist/web/_app/immutable/chunks/BTX2Jr8_.js +0 -1
- package/dist/web/_app/immutable/chunks/BWNY8zw6.js +0 -2
- package/dist/web/_app/immutable/chunks/BdPUVvAi.js +0 -1
- package/dist/web/_app/immutable/chunks/BmsJVLyy.js +0 -1
- package/dist/web/_app/immutable/chunks/BoAosqzE.js +0 -1
- package/dist/web/_app/immutable/chunks/Bs-tL5OR.js +0 -1
- package/dist/web/_app/immutable/chunks/Bsacq2UX.js +0 -1
- package/dist/web/_app/immutable/chunks/BuewkNdS.js +0 -4
- package/dist/web/_app/immutable/chunks/ByunV8un.js +0 -1
- package/dist/web/_app/immutable/chunks/C7VoTosa.js +0 -2
- package/dist/web/_app/immutable/chunks/CDV5Q7RN.js +0 -1
- package/dist/web/_app/immutable/chunks/CJ8__CWt.js +0 -1
- package/dist/web/_app/immutable/chunks/CJUKmosC.js +0 -5
- package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
- package/dist/web/_app/immutable/chunks/CT6oIU-C.js +0 -1
- package/dist/web/_app/immutable/chunks/CTRxNfZk.js +0 -1
- package/dist/web/_app/immutable/chunks/CWQRQXxy.js +0 -1
- package/dist/web/_app/immutable/chunks/CXH6iFbA.js +0 -1
- package/dist/web/_app/immutable/chunks/CX_61fY8.js +0 -5
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +0 -1
- package/dist/web/_app/immutable/chunks/CdeYcEuU.js +0 -1
- package/dist/web/_app/immutable/chunks/CmCtpZ1Y.js +0 -1
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
- package/dist/web/_app/immutable/chunks/CrdV0ttd.js +0 -1
- package/dist/web/_app/immutable/chunks/CscoF-YL.js +0 -18
- package/dist/web/_app/immutable/chunks/Cx4YdFMk.js +0 -1
- package/dist/web/_app/immutable/chunks/D7ZqAKi9.js +0 -3
- package/dist/web/_app/immutable/chunks/DGbA7IXh.js +0 -2
- package/dist/web/_app/immutable/chunks/DbbB6Up5.js +0 -1
- package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
- package/dist/web/_app/immutable/chunks/DtM5cEDu.js +0 -1
- package/dist/web/_app/immutable/chunks/Eqahi7_S.js +0 -2
- package/dist/web/_app/immutable/chunks/FFlLQIiS.js +0 -1
- package/dist/web/_app/immutable/chunks/O9Eb9k00.js +0 -1
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
- package/dist/web/_app/immutable/chunks/QF8MAmnc.js +0 -1
- package/dist/web/_app/immutable/chunks/UjzxCpxn.js +0 -1
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
- package/dist/web/_app/immutable/chunks/Y90OgS-9.js +0 -1
- package/dist/web/_app/immutable/chunks/cLyZlkXv.js +0 -1
- package/dist/web/_app/immutable/chunks/iDtAARVW.js +0 -2
- package/dist/web/_app/immutable/chunks/oC_W7W7p.js +0 -1
- package/dist/web/_app/immutable/chunks/rJdWIgh-.js +0 -1
- package/dist/web/_app/immutable/chunks/tvOsokaa.js +0 -1
- package/dist/web/_app/immutable/chunks/uLEXaPwE.js +0 -1
- package/dist/web/_app/immutable/chunks/vSaooFHB.js +0 -1
- package/dist/web/_app/immutable/entry/app.DAR-mtfg.js +0 -2
- package/dist/web/_app/immutable/entry/start.xDnyRaR1.js +0 -1
- package/dist/web/_app/immutable/nodes/0.D0aV-Zro.js +0 -2
- package/dist/web/_app/immutable/nodes/1.C7QoM8qD.js +0 -1
- package/dist/web/_app/immutable/nodes/10.DrDOAjOD.js +0 -1
- package/dist/web/_app/immutable/nodes/2.B0OgNuKW.js +0 -168
- package/dist/web/_app/immutable/nodes/3.BZ4qHGZi.js +0 -1
- package/dist/web/_app/immutable/nodes/4.hm-mxuuj.js +0 -12
- package/dist/web/_app/immutable/nodes/5.Bdbt4fjx.js +0 -4
- package/dist/web/_app/immutable/nodes/6.BXrCI40c.js +0 -2
- package/dist/web/_app/immutable/nodes/7.Chd4i9bm.js +0 -2
- package/dist/web/_app/immutable/nodes/8.B8SF-aNs.js +0 -1
- package/dist/web/_app/immutable/nodes/9.YDeu-RnO.js +0 -1
|
@@ -1,992 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sync & Workspace Tools for Studiograph Agent
|
|
3
|
-
*
|
|
4
|
-
* These tools allow the agent to:
|
|
5
|
-
* - Sync external data into collections (collection-scoped sync)
|
|
6
|
-
* - Refresh individual synced entities from their source
|
|
7
|
-
* - Manage workspace git operations (commit, push, pull, status)
|
|
8
|
-
* - Inspect MCP connectors for sync configuration
|
|
9
|
-
*/
|
|
10
|
-
import { Type as T } from '@sinclair/typebox';
|
|
11
|
-
import { spawnSync } from 'child_process';
|
|
12
|
-
import { gitPush, gitPull } from '../../utils/git.js';
|
|
13
|
-
import { existsSync } from 'fs';
|
|
14
|
-
import { join } from 'path';
|
|
15
|
-
import { homedir } from 'os';
|
|
16
|
-
import { commitRepos } from '../../services/sync/commit.js';
|
|
17
|
-
import { StagingManager } from '../../services/sync/staging.js';
|
|
18
|
-
import { SourceConfigManager } from '../../services/sync/source-config.js';
|
|
19
|
-
import { ConnectorManager } from '../../mcp/connector-manager.js';
|
|
20
|
-
import { SOURCE_DEFINITIONS } from '../../services/sync/source-definitions/definitions.js';
|
|
21
|
-
import { syncRepo, syncWorkspaceRule } from '../../services/sync/collection-sync.js';
|
|
22
|
-
import { refreshEntity } from '../../services/sync/entity-refresh.js';
|
|
23
|
-
import { wrapToolResult } from './graph-tools.js';
|
|
24
|
-
import { VectorService } from '../../services/vector-service.js';
|
|
25
|
-
import { BaseGraphManager } from '../../core/graph.js';
|
|
26
|
-
import { loadUserConfig } from '../../core/user-config.js';
|
|
27
|
-
export function createSyncTools(workspacePath, workspaceConfig, registryRef, getCurrentUser) {
|
|
28
|
-
const getUser = getCurrentUser ?? (() => null);
|
|
29
|
-
const getRegistry = () => registryRef?.registry ?? null;
|
|
30
|
-
function adminOnly() {
|
|
31
|
-
const user = getUser();
|
|
32
|
-
if (!user)
|
|
33
|
-
return null;
|
|
34
|
-
if (user.role === 'admin')
|
|
35
|
-
return null;
|
|
36
|
-
return 'Sync operations require admin access.';
|
|
37
|
-
}
|
|
38
|
-
return [
|
|
39
|
-
// ── Collection-scoped sync tools ─────────────────────────────────────────
|
|
40
|
-
// Sync a collection — runs collection-level rules AND workspace-level rules targeting it
|
|
41
|
-
{
|
|
42
|
-
name: 'sync_collection',
|
|
43
|
-
label: 'Sync Collection',
|
|
44
|
-
description: 'Pull new entities from external sources into a collection (admin only). Runs both collection-level sync rules and any workspace-level sync rules that target this collection. Creates new entities only — existing entities (matched by source_ref) are never updated. Always confirm with the user before calling.',
|
|
45
|
-
parameters: T.Object({
|
|
46
|
-
collection: T.String({ description: 'Collection name to sync' }),
|
|
47
|
-
}),
|
|
48
|
-
execute: async (toolCallId, params) => {
|
|
49
|
-
try {
|
|
50
|
-
const denied = adminOnly();
|
|
51
|
-
if (denied)
|
|
52
|
-
return wrapToolResult({ success: false, error: denied });
|
|
53
|
-
const progress = [];
|
|
54
|
-
const { results } = await syncRepo({
|
|
55
|
-
workspacePath,
|
|
56
|
-
collectionName: params.collection,
|
|
57
|
-
workspaceConfig,
|
|
58
|
-
schemaExtensions: workspaceConfig.schema_extensions,
|
|
59
|
-
onProgress: (msg) => progress.push(msg),
|
|
60
|
-
});
|
|
61
|
-
const totalCreated = results.reduce((s, r) => r.targets.reduce((ts, t) => ts + t.created + t.derived, 0) + s, 0);
|
|
62
|
-
const totalSkipped = results.reduce((s, r) => r.targets.reduce((ts, t) => ts + t.skipped, 0) + s, 0);
|
|
63
|
-
return wrapToolResult({
|
|
64
|
-
success: true,
|
|
65
|
-
results,
|
|
66
|
-
summary: `Created ${totalCreated}, skipped ${totalSkipped}`,
|
|
67
|
-
progress: progress.join('\n'),
|
|
68
|
-
nextSteps: totalCreated > 0 ? 'Commit changes with workspace_commit' : undefined,
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
return wrapToolResult({
|
|
73
|
-
success: false,
|
|
74
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
// Run all workspace-level sync rules
|
|
80
|
-
{
|
|
81
|
-
name: 'sync_workspace',
|
|
82
|
-
label: 'Sync Workspace',
|
|
83
|
-
description: 'Run all workspace-level sync rules (admin only). Each rule fetches from its source once and distributes records to multiple target collections.',
|
|
84
|
-
parameters: T.Object({}),
|
|
85
|
-
execute: async (toolCallId, _params) => {
|
|
86
|
-
try {
|
|
87
|
-
const denied = adminOnly();
|
|
88
|
-
if (denied)
|
|
89
|
-
return wrapToolResult({ success: false, error: denied });
|
|
90
|
-
const rules = workspaceConfig.sync ?? [];
|
|
91
|
-
if (rules.length === 0) {
|
|
92
|
-
return wrapToolResult({ success: true, results: [], summary: 'No workspace-level sync rules configured' });
|
|
93
|
-
}
|
|
94
|
-
const progress = [];
|
|
95
|
-
const results = [];
|
|
96
|
-
for (const rule of rules) {
|
|
97
|
-
const result = await syncWorkspaceRule({
|
|
98
|
-
workspacePath,
|
|
99
|
-
rule,
|
|
100
|
-
workspaceConfig,
|
|
101
|
-
schemaExtensions: workspaceConfig.schema_extensions,
|
|
102
|
-
onProgress: (msg) => progress.push(msg),
|
|
103
|
-
});
|
|
104
|
-
results.push(result);
|
|
105
|
-
}
|
|
106
|
-
const totalCreated = results.reduce((s, r) => r.targets.reduce((ts, t) => ts + t.created + t.derived, 0) + s, 0);
|
|
107
|
-
return wrapToolResult({
|
|
108
|
-
success: true,
|
|
109
|
-
results,
|
|
110
|
-
summary: `Ran ${rules.length} workspace rule(s), created ${totalCreated} entities`,
|
|
111
|
-
progress: progress.join('\n'),
|
|
112
|
-
nextSteps: totalCreated > 0 ? 'Commit changes with workspace_commit' : undefined,
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
catch (error) {
|
|
116
|
-
return wrapToolResult({
|
|
117
|
-
success: false,
|
|
118
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
},
|
|
123
|
-
// Refresh a single synced entity
|
|
124
|
-
{
|
|
125
|
-
name: 'sync_refresh',
|
|
126
|
-
label: 'Refresh Synced Entity',
|
|
127
|
-
description: 'Refresh a single entity from its external source (admin only). Shows what fields have changed.',
|
|
128
|
-
parameters: T.Object({
|
|
129
|
-
entity_id: T.String({ description: 'Entity ID to refresh' }),
|
|
130
|
-
collection: T.Optional(T.String({ description: 'Collection name (auto-detected if omitted)' })),
|
|
131
|
-
entity_type: T.Optional(T.String({ description: 'Entity type (auto-detected if omitted)' })),
|
|
132
|
-
apply: T.Optional(T.Boolean({ description: 'Apply changes immediately (default: false, just show diff)' })),
|
|
133
|
-
}),
|
|
134
|
-
execute: async (toolCallId, params) => {
|
|
135
|
-
const denied = adminOnly();
|
|
136
|
-
if (denied)
|
|
137
|
-
return wrapToolResult({ success: false, error: denied });
|
|
138
|
-
try {
|
|
139
|
-
let { collection, entity_type, entity_id, apply } = params;
|
|
140
|
-
// Auto-detect collection and entity_type if not provided
|
|
141
|
-
if (!collection || !entity_type) {
|
|
142
|
-
for (const repo of workspaceConfig.repos) {
|
|
143
|
-
try {
|
|
144
|
-
const repoPath = join(workspacePath, repo.path);
|
|
145
|
-
if (!existsSync(repoPath))
|
|
146
|
-
continue;
|
|
147
|
-
const graph = new BaseGraphManager({
|
|
148
|
-
repoPath,
|
|
149
|
-
repoName: repo.name,
|
|
150
|
-
gitUser: { id: 'agent', name: 'Agent', email: 'agent@studiograph.local' },
|
|
151
|
-
});
|
|
152
|
-
const entities = graph.list();
|
|
153
|
-
const match = entities.find(e => e.data?.entity_id === entity_id);
|
|
154
|
-
if (match) {
|
|
155
|
-
collection = repo.name;
|
|
156
|
-
entity_type = match.entityType;
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
catch { /* skip */ }
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
if (!collection || !entity_type) {
|
|
164
|
-
return wrapToolResult({
|
|
165
|
-
success: false,
|
|
166
|
-
error: `Entity "${entity_id}" not found in any collection`,
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
const result = await refreshEntity({
|
|
170
|
-
workspacePath,
|
|
171
|
-
collectionName: collection,
|
|
172
|
-
entityType: entity_type,
|
|
173
|
-
entityId: entity_id,
|
|
174
|
-
workspaceConfig: workspaceConfig,
|
|
175
|
-
schemaExtensions: workspaceConfig.schema_extensions,
|
|
176
|
-
apply: apply ?? false,
|
|
177
|
-
});
|
|
178
|
-
if (result.diffs.length === 0 && !result.body_changed) {
|
|
179
|
-
return wrapToolResult({
|
|
180
|
-
success: true,
|
|
181
|
-
message: 'Entity is already up to date with the source.',
|
|
182
|
-
entity_id,
|
|
183
|
-
source_ref: result.source_ref,
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
return wrapToolResult({
|
|
187
|
-
success: true,
|
|
188
|
-
entity_id,
|
|
189
|
-
source_ref: result.source_ref,
|
|
190
|
-
applied: result.applied,
|
|
191
|
-
changes: result.diffs.map(d => ({
|
|
192
|
-
field: d.field,
|
|
193
|
-
from: d.old_value,
|
|
194
|
-
to: d.new_value,
|
|
195
|
-
})),
|
|
196
|
-
body_changed: result.body_changed,
|
|
197
|
-
nextSteps: result.applied
|
|
198
|
-
? 'Changes applied. Commit with workspace_commit.'
|
|
199
|
-
: 'Review the changes above and call sync_refresh with apply: true to apply them.',
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
catch (error) {
|
|
203
|
-
return wrapToolResult({
|
|
204
|
-
success: false,
|
|
205
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
},
|
|
209
|
-
},
|
|
210
|
-
// Show sync status across collections
|
|
211
|
-
{
|
|
212
|
-
name: 'sync_status',
|
|
213
|
-
label: 'Sync Status',
|
|
214
|
-
description: 'Show which collections have sync rules configured, their sources, and last sync time. Use this when users ask about sync configuration or what has been synced.',
|
|
215
|
-
parameters: T.Object({
|
|
216
|
-
collection: T.Optional(T.String({ description: 'Filter to a specific collection' })),
|
|
217
|
-
}),
|
|
218
|
-
execute: async (toolCallId, params) => {
|
|
219
|
-
try {
|
|
220
|
-
const repos = params.collection
|
|
221
|
-
? workspaceConfig.repos.filter(r => r.name === params.collection)
|
|
222
|
-
: workspaceConfig.repos;
|
|
223
|
-
const collections = [];
|
|
224
|
-
for (const repo of repos) {
|
|
225
|
-
const syncRules = repo.sync;
|
|
226
|
-
if (!syncRules || syncRules.length === 0)
|
|
227
|
-
continue;
|
|
228
|
-
let syncedCount = 0;
|
|
229
|
-
let lastSync = null;
|
|
230
|
-
try {
|
|
231
|
-
const repoPath = join(workspacePath, repo.path);
|
|
232
|
-
if (!existsSync(repoPath))
|
|
233
|
-
continue;
|
|
234
|
-
const graph = new BaseGraphManager({
|
|
235
|
-
repoPath,
|
|
236
|
-
repoName: repo.name,
|
|
237
|
-
gitUser: { id: 'agent', name: 'Agent', email: 'agent@studiograph.local' },
|
|
238
|
-
});
|
|
239
|
-
for (const entity of graph.list()) {
|
|
240
|
-
const syncedAt = entity.data?.synced_at;
|
|
241
|
-
if (syncedAt) {
|
|
242
|
-
syncedCount++;
|
|
243
|
-
if (!lastSync || syncedAt > lastSync)
|
|
244
|
-
lastSync = syncedAt;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
catch { /* skip */ }
|
|
249
|
-
collections.push({ name: repo.name, syncRules, syncedCount, lastSync });
|
|
250
|
-
}
|
|
251
|
-
// Also list available source definitions
|
|
252
|
-
const configMgr = new SourceConfigManager(workspacePath);
|
|
253
|
-
const sources = configMgr.getAll().map(s => s.name);
|
|
254
|
-
// Check for new-format too
|
|
255
|
-
const { readdirSync } = await import('fs');
|
|
256
|
-
const sourcesDir = join(workspacePath, '.studiograph', 'sources');
|
|
257
|
-
if (existsSync(sourcesDir)) {
|
|
258
|
-
for (const file of readdirSync(sourcesDir)) {
|
|
259
|
-
if (!file.endsWith('.json'))
|
|
260
|
-
continue;
|
|
261
|
-
const name = file.replace('.json', '');
|
|
262
|
-
if (!sources.includes(name)) {
|
|
263
|
-
const def = configMgr.getDefinition(name);
|
|
264
|
-
if (def)
|
|
265
|
-
sources.push(name);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
return wrapToolResult({
|
|
270
|
-
success: true,
|
|
271
|
-
collections,
|
|
272
|
-
availableSources: sources,
|
|
273
|
-
message: collections.length > 0
|
|
274
|
-
? `${collections.length} collection(s) with sync rules`
|
|
275
|
-
: 'No collections have sync rules configured.',
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
catch (error) {
|
|
279
|
-
return wrapToolResult({
|
|
280
|
-
success: false,
|
|
281
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
},
|
|
285
|
-
},
|
|
286
|
-
// Git commit across workspace repos
|
|
287
|
-
{
|
|
288
|
-
name: 'workspace_commit',
|
|
289
|
-
label: 'Commit Changes',
|
|
290
|
-
description: 'Git commit entity changes across all workspace repos. Works after sync_apply, enrich_run, or manual edits. Always confirm with the user before calling this.',
|
|
291
|
-
parameters: T.Object({
|
|
292
|
-
messagePrefix: T.Optional(T.String({ description: 'Commit message prefix (default: "update")' })),
|
|
293
|
-
}),
|
|
294
|
-
execute: async (toolCallId, params) => {
|
|
295
|
-
try {
|
|
296
|
-
const progress = [];
|
|
297
|
-
await commitRepos(workspacePath, (msg) => progress.push(msg), { messagePrefix: params.messagePrefix ?? 'update' });
|
|
298
|
-
return wrapToolResult({
|
|
299
|
-
success: true,
|
|
300
|
-
progress: progress.join('\n'),
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
catch (error) {
|
|
304
|
-
return wrapToolResult({
|
|
305
|
-
success: false,
|
|
306
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
},
|
|
310
|
-
},
|
|
311
|
-
// List sources and connectors
|
|
312
|
-
{
|
|
313
|
-
name: 'sync_list_sources',
|
|
314
|
-
label: 'List Sync Sources',
|
|
315
|
-
description: 'Read sync source configurations. Returns full source configs with entity_mappings, field maps, transforms, and all settings. Also lists available connectors and known source definitions. Use this whenever users ask about their source config.',
|
|
316
|
-
parameters: T.Object({}),
|
|
317
|
-
execute: async (toolCallId, params) => {
|
|
318
|
-
try {
|
|
319
|
-
const configMgr = new SourceConfigManager(workspacePath);
|
|
320
|
-
const sources = configMgr.getAll();
|
|
321
|
-
// Load connectors but strip sensitive fields
|
|
322
|
-
const connectors = ConnectorManager.loadConfigs(workspacePath).map(c => ({
|
|
323
|
-
name: c.name,
|
|
324
|
-
url: c.url,
|
|
325
|
-
description: c.description,
|
|
326
|
-
}));
|
|
327
|
-
const availableDefinitions = Object.keys(SOURCE_DEFINITIONS);
|
|
328
|
-
return wrapToolResult({
|
|
329
|
-
success: true,
|
|
330
|
-
sources,
|
|
331
|
-
connectors,
|
|
332
|
-
availableDefinitions,
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
catch (error) {
|
|
336
|
-
return wrapToolResult({
|
|
337
|
-
success: false,
|
|
338
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
},
|
|
342
|
-
},
|
|
343
|
-
// Set up a new source
|
|
344
|
-
{
|
|
345
|
-
name: 'sync_setup_source',
|
|
346
|
-
label: 'Setup Sync Source',
|
|
347
|
-
description: 'Add or reconfigure a sync source (admin only).',
|
|
348
|
-
parameters: T.Object({
|
|
349
|
-
name: T.String({ description: 'Source name — must match a built-in source definition (e.g. "linear", "pipedrive", "granola", "asana")' }),
|
|
350
|
-
connector: T.Optional(T.String({ description: 'Connector name (defaults to source name)' })),
|
|
351
|
-
force: T.Optional(T.Boolean({ description: 'Overwrite existing source config' })),
|
|
352
|
-
}),
|
|
353
|
-
execute: async (toolCallId, params) => {
|
|
354
|
-
try {
|
|
355
|
-
const denied = adminOnly();
|
|
356
|
-
if (denied)
|
|
357
|
-
return wrapToolResult({ success: false, error: denied });
|
|
358
|
-
const configMgr = new SourceConfigManager(workspacePath);
|
|
359
|
-
const connectorName = params.connector ?? params.name;
|
|
360
|
-
// Check if source already exists
|
|
361
|
-
const existing = configMgr.get(params.name);
|
|
362
|
-
if (existing && !params.force) {
|
|
363
|
-
return wrapToolResult({
|
|
364
|
-
success: false,
|
|
365
|
-
error: `Source "${params.name}" already exists. Use force: true to overwrite.`,
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
// Verify connector exists
|
|
369
|
-
const connectors = ConnectorManager.loadConfigs(workspacePath);
|
|
370
|
-
const connector = connectors.find(c => c.name === connectorName);
|
|
371
|
-
if (!connector) {
|
|
372
|
-
return wrapToolResult({
|
|
373
|
-
success: false,
|
|
374
|
-
error: `Connector "${connectorName}" not found. Set up the connector first using the CLI: studiograph connector add ${connectorName}`,
|
|
375
|
-
availableConnectors: connectors.map(c => c.name),
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
// Built-in definition required — don't allow custom configs
|
|
379
|
-
const definition = SOURCE_DEFINITIONS[params.name] ?? SOURCE_DEFINITIONS[connectorName];
|
|
380
|
-
if (!definition || !definition.entities || Object.keys(definition.entities).length === 0) {
|
|
381
|
-
return wrapToolResult({
|
|
382
|
-
success: false,
|
|
383
|
-
error: `No built-in source definition for "${params.name}". Available sources: ${Object.keys(SOURCE_DEFINITIONS).join(', ')}`,
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
// Save as new-format source definition
|
|
387
|
-
const savedDef = {
|
|
388
|
-
...definition,
|
|
389
|
-
name: params.name,
|
|
390
|
-
enabled: true,
|
|
391
|
-
added_at: new Date().toISOString(),
|
|
392
|
-
};
|
|
393
|
-
configMgr.saveDefinition(params.name, savedDef);
|
|
394
|
-
const entityTypes = Object.keys(definition.entities);
|
|
395
|
-
return wrapToolResult({
|
|
396
|
-
success: true,
|
|
397
|
-
message: `Source "${params.name}" configured with ${entityTypes.length} entity type(s): ${entityTypes.join(', ')}. Assign it to a collection via sync rules in collection settings.`,
|
|
398
|
-
definition: savedDef,
|
|
399
|
-
});
|
|
400
|
-
}
|
|
401
|
-
catch (error) {
|
|
402
|
-
return wrapToolResult({
|
|
403
|
-
success: false,
|
|
404
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
},
|
|
408
|
-
},
|
|
409
|
-
// Remove a source
|
|
410
|
-
{
|
|
411
|
-
name: 'sync_remove_source',
|
|
412
|
-
label: 'Remove Sync Source',
|
|
413
|
-
description: 'Remove a sync source configuration (admin only).',
|
|
414
|
-
parameters: T.Object({
|
|
415
|
-
name: T.String({ description: 'Source name to remove' }),
|
|
416
|
-
}),
|
|
417
|
-
execute: async (toolCallId, params) => {
|
|
418
|
-
try {
|
|
419
|
-
const denied = adminOnly();
|
|
420
|
-
if (denied)
|
|
421
|
-
return wrapToolResult({ success: false, error: denied });
|
|
422
|
-
const configMgr = new SourceConfigManager(workspacePath);
|
|
423
|
-
const removed = configMgr.remove(params.name);
|
|
424
|
-
return wrapToolResult({
|
|
425
|
-
success: true,
|
|
426
|
-
removed,
|
|
427
|
-
message: removed
|
|
428
|
-
? `Source "${params.name}" removed.`
|
|
429
|
-
: `Source "${params.name}" not found.`,
|
|
430
|
-
});
|
|
431
|
-
}
|
|
432
|
-
catch (error) {
|
|
433
|
-
return wrapToolResult({
|
|
434
|
-
success: false,
|
|
435
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
436
|
-
});
|
|
437
|
-
}
|
|
438
|
-
},
|
|
439
|
-
},
|
|
440
|
-
// ── Connector introspection for sync config building ────────────────────
|
|
441
|
-
// Inspect a connector's tools, categorized for sync
|
|
442
|
-
{
|
|
443
|
-
name: 'sync_inspect_connector',
|
|
444
|
-
label: 'Inspect Connector for Sync',
|
|
445
|
-
description: 'Inspect a connector\'s MCP tools to understand what data types are available for sync. Auto-categorizes tools by purpose (list, get, search, create) and detects syncable entity types with their list/get tool pairs. Use this when building a new source config to understand what the connector offers.',
|
|
446
|
-
parameters: T.Object({
|
|
447
|
-
connector: T.String({ description: 'Connector name (e.g. "pipedrive", "linear", "granola")' }),
|
|
448
|
-
}),
|
|
449
|
-
execute: async (toolCallId, params) => {
|
|
450
|
-
try {
|
|
451
|
-
const reg = getRegistry();
|
|
452
|
-
const tools = reg?.connectors.get(params.connector);
|
|
453
|
-
if (!tools) {
|
|
454
|
-
const available = reg ? [...reg.connectors.keys()] : [];
|
|
455
|
-
return wrapToolResult({
|
|
456
|
-
success: false,
|
|
457
|
-
error: available.length === 0
|
|
458
|
-
? 'No connectors loaded yet. Connectors may still be initializing, or none are configured.'
|
|
459
|
-
: `Connector "${params.connector}" not found`,
|
|
460
|
-
availableConnectors: available,
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
// Categorize tools by purpose
|
|
464
|
-
const categories = {
|
|
465
|
-
list: [],
|
|
466
|
-
get: [],
|
|
467
|
-
search: [],
|
|
468
|
-
create: [],
|
|
469
|
-
update: [],
|
|
470
|
-
delete: [],
|
|
471
|
-
other: [],
|
|
472
|
-
};
|
|
473
|
-
for (const tool of tools) {
|
|
474
|
-
const n = tool.localName;
|
|
475
|
-
if (/(?:^list_|_list$|_list_)/.test(n))
|
|
476
|
-
categories.list.push({ name: n, description: tool.description });
|
|
477
|
-
else if (/(?:^get_|_get$|^read_|_read$)/.test(n))
|
|
478
|
-
categories.get.push({ name: n, description: tool.description });
|
|
479
|
-
else if (/(?:^search_|_search$)/.test(n))
|
|
480
|
-
categories.search.push({ name: n, description: tool.description });
|
|
481
|
-
else if (/(?:^create_|_create$)/.test(n))
|
|
482
|
-
categories.create.push({ name: n, description: tool.description });
|
|
483
|
-
else if (/(?:^update_|_update$)/.test(n))
|
|
484
|
-
categories.update.push({ name: n, description: tool.description });
|
|
485
|
-
else if (/(?:^delete_|_delete$|^remove_|_remove$)/.test(n))
|
|
486
|
-
categories.delete.push({ name: n, description: tool.description });
|
|
487
|
-
else
|
|
488
|
-
categories.other.push({ name: n, description: tool.description });
|
|
489
|
-
}
|
|
490
|
-
// Detect syncable entity types (list + optional get pairs)
|
|
491
|
-
const toolNames = new Set(tools.map(t => t.localName));
|
|
492
|
-
const detected = [];
|
|
493
|
-
for (const tool of categories.list) {
|
|
494
|
-
// Extract entity type from tool name
|
|
495
|
-
let sourceType = null;
|
|
496
|
-
const listMatch = tool.name.match(/^list_(.+?)s?$/);
|
|
497
|
-
if (listMatch)
|
|
498
|
-
sourceType = listMatch[1];
|
|
499
|
-
if (!sourceType) {
|
|
500
|
-
const suffixMatch = tool.name.match(/^(.+?)s?_list(?:_|$)/);
|
|
501
|
-
if (suffixMatch)
|
|
502
|
-
sourceType = suffixMatch[1];
|
|
503
|
-
}
|
|
504
|
-
if (!sourceType)
|
|
505
|
-
continue;
|
|
506
|
-
if (detected.some(d => d.source_type === sourceType))
|
|
507
|
-
continue;
|
|
508
|
-
// Find corresponding get tool
|
|
509
|
-
const getVariants = [`get_${sourceType}`, `${sourceType}_get`, `${sourceType}s_get`, `read_${sourceType}`];
|
|
510
|
-
const getTool = getVariants.find(g => toolNames.has(g)) ?? null;
|
|
511
|
-
detected.push({ source_type: sourceType, list_tool: tool.name, get_tool: getTool });
|
|
512
|
-
}
|
|
513
|
-
return wrapToolResult({
|
|
514
|
-
success: true,
|
|
515
|
-
connector: params.connector,
|
|
516
|
-
totalTools: tools.length,
|
|
517
|
-
categories: Object.fromEntries(Object.entries(categories).filter(([_, v]) => v.length > 0)),
|
|
518
|
-
syncableTypes: detected,
|
|
519
|
-
hint: detected.length > 0
|
|
520
|
-
? 'Use sync_sample_data to fetch a sample record from any list tool and see available fields for field_map building.'
|
|
521
|
-
: 'No list tools detected. This connector may not support sync, or tools may use non-standard naming.',
|
|
522
|
-
});
|
|
523
|
-
}
|
|
524
|
-
catch (error) {
|
|
525
|
-
return wrapToolResult({
|
|
526
|
-
success: false,
|
|
527
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
528
|
-
});
|
|
529
|
-
}
|
|
530
|
-
},
|
|
531
|
-
},
|
|
532
|
-
// Fetch sample data from a connector to inspect field shapes
|
|
533
|
-
{
|
|
534
|
-
name: 'sync_sample_data',
|
|
535
|
-
label: 'Fetch Sample Data',
|
|
536
|
-
description: 'Fetch a sample record from a connector to inspect its field structure. Calls a list tool with limit 1 and returns the field names, types, nesting, and sample values. Use this to auto-build field_map entries for sync source configs.',
|
|
537
|
-
parameters: T.Object({
|
|
538
|
-
connector: T.String({ description: 'Connector name (e.g. "pipedrive", "linear")' }),
|
|
539
|
-
tool: T.String({ description: 'Tool name to call (e.g. "deals_list", "list_issues")' }),
|
|
540
|
-
arguments: T.Optional(T.Object({}, { additionalProperties: true, description: 'Extra arguments to pass to the tool (limit is auto-set to 1 if the tool accepts it)' })),
|
|
541
|
-
}),
|
|
542
|
-
execute: async (toolCallId, params) => {
|
|
543
|
-
try {
|
|
544
|
-
const reg = getRegistry();
|
|
545
|
-
const tools = reg?.connectors.get(params.connector);
|
|
546
|
-
if (!tools) {
|
|
547
|
-
const available = reg ? [...reg.connectors.keys()] : [];
|
|
548
|
-
return wrapToolResult({
|
|
549
|
-
success: false,
|
|
550
|
-
error: available.length === 0
|
|
551
|
-
? 'No connectors loaded yet. Connectors may still be initializing, or none are configured.'
|
|
552
|
-
: `Connector "${params.connector}" not found`,
|
|
553
|
-
availableConnectors: available,
|
|
554
|
-
});
|
|
555
|
-
}
|
|
556
|
-
const tool = tools.find(t => t.localName === params.tool);
|
|
557
|
-
if (!tool) {
|
|
558
|
-
return wrapToolResult({
|
|
559
|
-
success: false,
|
|
560
|
-
error: `Tool "${params.tool}" not found in ${params.connector}`,
|
|
561
|
-
availableTools: tools.slice(0, 30).map(t => t.localName),
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
// Build arguments — try to limit to 1 record
|
|
565
|
-
const args = { ...params.arguments };
|
|
566
|
-
const schema = tool.parameters;
|
|
567
|
-
const props = schema?.properties || {};
|
|
568
|
-
if ('limit' in props && !args.limit)
|
|
569
|
-
args.limit = 1;
|
|
570
|
-
if ('first' in props && !args.first)
|
|
571
|
-
args.first = 1;
|
|
572
|
-
if ('per_page' in props && !args.per_page)
|
|
573
|
-
args.per_page = 1;
|
|
574
|
-
if ('page_size' in props && !args.page_size)
|
|
575
|
-
args.page_size = 1;
|
|
576
|
-
// Call the tool
|
|
577
|
-
const result = await tool.execute(toolCallId, args);
|
|
578
|
-
const text = result?.content?.[0]?.text ?? '';
|
|
579
|
-
// Parse the response
|
|
580
|
-
let data;
|
|
581
|
-
try {
|
|
582
|
-
data = JSON.parse(text);
|
|
583
|
-
}
|
|
584
|
-
catch {
|
|
585
|
-
// Some tools return double-wrapped content
|
|
586
|
-
try {
|
|
587
|
-
const outer = JSON.parse(text);
|
|
588
|
-
if (outer.content?.[0]?.text) {
|
|
589
|
-
data = JSON.parse(outer.content[0].text);
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
catch {
|
|
593
|
-
return wrapToolResult({
|
|
594
|
-
success: true,
|
|
595
|
-
rawResponse: text.slice(0, 3000),
|
|
596
|
-
note: 'Response is not JSON. Showing raw text for manual inspection.',
|
|
597
|
-
});
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
// Extract the first record from common response shapes
|
|
601
|
-
let record = null;
|
|
602
|
-
if (Array.isArray(data)) {
|
|
603
|
-
record = data[0];
|
|
604
|
-
}
|
|
605
|
-
else if (data?.data && Array.isArray(data.data)) {
|
|
606
|
-
record = data.data[0];
|
|
607
|
-
}
|
|
608
|
-
else if (data?.items && Array.isArray(data.items)) {
|
|
609
|
-
record = data.items[0];
|
|
610
|
-
}
|
|
611
|
-
else if (data?.results && Array.isArray(data.results)) {
|
|
612
|
-
record = data.results[0];
|
|
613
|
-
}
|
|
614
|
-
else if (data?.nodes && Array.isArray(data.nodes)) {
|
|
615
|
-
record = data.nodes[0];
|
|
616
|
-
}
|
|
617
|
-
else if (typeof data === 'object' && data !== null && !Array.isArray(data)) {
|
|
618
|
-
// Might be a single record response
|
|
619
|
-
record = data;
|
|
620
|
-
}
|
|
621
|
-
if (!record) {
|
|
622
|
-
return wrapToolResult({
|
|
623
|
-
success: true,
|
|
624
|
-
note: 'No records returned. The source may be empty or the tool may need different arguments.',
|
|
625
|
-
responseShape: typeof data,
|
|
626
|
-
responseKeys: data && typeof data === 'object' ? Object.keys(data) : [],
|
|
627
|
-
});
|
|
628
|
-
}
|
|
629
|
-
// Analyze field structure
|
|
630
|
-
const analyzeFields = (obj, prefix = '') => {
|
|
631
|
-
const fields = [];
|
|
632
|
-
if (!obj || typeof obj !== 'object')
|
|
633
|
-
return fields;
|
|
634
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
635
|
-
const path = prefix ? `${prefix}.${key}` : key;
|
|
636
|
-
const type = value === null ? 'null'
|
|
637
|
-
: Array.isArray(value) ? `array(${value.length})`
|
|
638
|
-
: typeof value;
|
|
639
|
-
// Truncate long strings for display
|
|
640
|
-
let sample = value;
|
|
641
|
-
if (typeof value === 'string' && value.length > 100) {
|
|
642
|
-
sample = value.slice(0, 100) + '...';
|
|
643
|
-
}
|
|
644
|
-
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
645
|
-
fields.push({ path, type: 'object', sample: `{${Object.keys(value).join(', ')}}` });
|
|
646
|
-
// Recurse one level into objects
|
|
647
|
-
fields.push(...analyzeFields(value, path));
|
|
648
|
-
}
|
|
649
|
-
else if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'object') {
|
|
650
|
-
fields.push({ path, type: `array(${value.length})`, sample: `[{${Object.keys(value[0]).join(', ')}}]` });
|
|
651
|
-
}
|
|
652
|
-
else {
|
|
653
|
-
fields.push({ path, type, sample });
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
return fields;
|
|
657
|
-
};
|
|
658
|
-
const fields = analyzeFields(record);
|
|
659
|
-
// Suggest field_map entries for common entity fields
|
|
660
|
-
const topLevelKeys = Object.keys(record);
|
|
661
|
-
const suggestions = {};
|
|
662
|
-
const nameFields = ['title', 'name', 'subject', 'summary'];
|
|
663
|
-
const statusFields = ['status', 'state', 'stage'];
|
|
664
|
-
const dateFields = ['created_at', 'createdAt', 'date', 'start_date', 'due_date', 'dueDate'];
|
|
665
|
-
const descFields = ['description', 'content', 'body', 'notes', 'note'];
|
|
666
|
-
for (const key of topLevelKeys) {
|
|
667
|
-
if (nameFields.includes(key))
|
|
668
|
-
suggestions[key] = 'name';
|
|
669
|
-
else if (statusFields.includes(key))
|
|
670
|
-
suggestions[key] = 'status';
|
|
671
|
-
else if (dateFields.includes(key))
|
|
672
|
-
suggestions[key] = 'date (use date-iso transform)';
|
|
673
|
-
else if (descFields.includes(key))
|
|
674
|
-
suggestions[key] = 'description (or use as content_from)';
|
|
675
|
-
}
|
|
676
|
-
return wrapToolResult({
|
|
677
|
-
success: true,
|
|
678
|
-
connector: params.connector,
|
|
679
|
-
tool: params.tool,
|
|
680
|
-
fieldCount: fields.length,
|
|
681
|
-
fields,
|
|
682
|
-
topLevelKeys,
|
|
683
|
-
suggestedFieldMap: Object.keys(suggestions).length > 0 ? suggestions : undefined,
|
|
684
|
-
hint: 'Use these field paths in field_map when configuring sync_setup_source. Nested fields use dot notation (e.g. "org_id.name": "organization").',
|
|
685
|
-
});
|
|
686
|
-
}
|
|
687
|
-
catch (error) {
|
|
688
|
-
return wrapToolResult({
|
|
689
|
-
success: false,
|
|
690
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
691
|
-
});
|
|
692
|
-
}
|
|
693
|
-
},
|
|
694
|
-
},
|
|
695
|
-
// Reset workspace (discard uncommitted changes)
|
|
696
|
-
{
|
|
697
|
-
name: 'workspace_reset',
|
|
698
|
-
label: 'Reset Workspace',
|
|
699
|
-
description: 'Discard ALL uncommitted changes across workspace repos: reverts modified files (git checkout) and removes untracked files (git clean -fd). Also clears staging if present. This is destructive — always confirm with the user before calling.',
|
|
700
|
-
parameters: T.Object({}),
|
|
701
|
-
execute: async (toolCallId, _params) => {
|
|
702
|
-
try {
|
|
703
|
-
const repos = workspaceConfig.repos ?? [];
|
|
704
|
-
const resetRepos = [];
|
|
705
|
-
const details = [];
|
|
706
|
-
for (const repo of repos) {
|
|
707
|
-
const repoPath = join(workspacePath, repo.path);
|
|
708
|
-
if (!existsSync(repoPath))
|
|
709
|
-
continue;
|
|
710
|
-
// Check if there are changes to reset
|
|
711
|
-
const status = spawnSync('git', ['status', '--porcelain'], { cwd: repoPath, encoding: 'utf-8' });
|
|
712
|
-
if (status.status !== 0 || !status.stdout.trim())
|
|
713
|
-
continue;
|
|
714
|
-
const fileCount = status.stdout.trim().split('\n').length;
|
|
715
|
-
// Revert tracked file changes
|
|
716
|
-
spawnSync('git', ['checkout', '--', '.'], { cwd: repoPath, encoding: 'utf-8' });
|
|
717
|
-
// Remove untracked files and directories
|
|
718
|
-
spawnSync('git', ['clean', '-fd'], { cwd: repoPath, encoding: 'utf-8' });
|
|
719
|
-
resetRepos.push(repo.name);
|
|
720
|
-
details.push(`${repo.name}: ${fileCount} file(s) reset`);
|
|
721
|
-
}
|
|
722
|
-
// Clear staging too
|
|
723
|
-
let clearedStaging = false;
|
|
724
|
-
try {
|
|
725
|
-
const staging = new StagingManager(workspacePath);
|
|
726
|
-
if (staging.hasStaging()) {
|
|
727
|
-
staging.clear();
|
|
728
|
-
clearedStaging = true;
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
catch { /* staging dir may not exist */ }
|
|
732
|
-
const parts = [];
|
|
733
|
-
if (resetRepos.length > 0)
|
|
734
|
-
parts.push(`Reset ${resetRepos.length} repo(s): ${resetRepos.join(', ')}`);
|
|
735
|
-
if (clearedStaging)
|
|
736
|
-
parts.push('Cleared staging');
|
|
737
|
-
return wrapToolResult({
|
|
738
|
-
success: true,
|
|
739
|
-
resetRepos,
|
|
740
|
-
details,
|
|
741
|
-
clearedStaging,
|
|
742
|
-
message: parts.length > 0 ? parts.join('. ') + '.' : 'No changes to reset.',
|
|
743
|
-
});
|
|
744
|
-
}
|
|
745
|
-
catch (error) {
|
|
746
|
-
return wrapToolResult({
|
|
747
|
-
success: false,
|
|
748
|
-
error: String(error instanceof Error ? error.message : error),
|
|
749
|
-
});
|
|
750
|
-
}
|
|
751
|
-
},
|
|
752
|
-
},
|
|
753
|
-
// Reindex search
|
|
754
|
-
{
|
|
755
|
-
name: 'workspace_reindex',
|
|
756
|
-
label: 'Reindex Search',
|
|
757
|
-
description: 'Rebuild the search index (LanceDB) for all workspace collections. Run after sync, enrich, or manual entity edits to update search results.',
|
|
758
|
-
parameters: T.Object({
|
|
759
|
-
repo: T.Optional(T.String({ description: 'Reindex a single collection only' })),
|
|
760
|
-
}),
|
|
761
|
-
execute: async (toolCallId, params) => {
|
|
762
|
-
try {
|
|
763
|
-
const userConfig = loadUserConfig();
|
|
764
|
-
const dbPath = userConfig.vector_db_path || join(homedir(), '.studiograph', 'vector');
|
|
765
|
-
const vectorService = new VectorService(dbPath, userConfig.voyage_api_key);
|
|
766
|
-
await vectorService.init();
|
|
767
|
-
const allRepos = workspaceConfig.repos ?? [];
|
|
768
|
-
const repos = params.repo
|
|
769
|
-
? allRepos.filter(r => r.name === params.repo)
|
|
770
|
-
: allRepos;
|
|
771
|
-
if (params.repo && repos.length === 0) {
|
|
772
|
-
return wrapToolResult({
|
|
773
|
-
success: false,
|
|
774
|
-
error: `Repo "${params.repo}" not found in workspace`,
|
|
775
|
-
availableRepos: allRepos.map(r => r.name),
|
|
776
|
-
});
|
|
777
|
-
}
|
|
778
|
-
const repoResults = {};
|
|
779
|
-
let totalIndexed = 0;
|
|
780
|
-
for (const repo of repos) {
|
|
781
|
-
const repoPath = join(workspacePath, repo.path);
|
|
782
|
-
if (!existsSync(repoPath))
|
|
783
|
-
continue;
|
|
784
|
-
try {
|
|
785
|
-
const graph = new BaseGraphManager({
|
|
786
|
-
repoPath,
|
|
787
|
-
repoName: repo.name,
|
|
788
|
-
gitUser: { id: 'reindex', name: 'reindex', email: 'reindex@studiograph.local' },
|
|
789
|
-
});
|
|
790
|
-
const entities = graph.list();
|
|
791
|
-
if (entities.length > 0) {
|
|
792
|
-
await vectorService.upsertMany(repo.name, entities);
|
|
793
|
-
}
|
|
794
|
-
vectorService.setLastIndexedTime(repo.name);
|
|
795
|
-
repoResults[repo.name] = entities.length;
|
|
796
|
-
totalIndexed += entities.length;
|
|
797
|
-
}
|
|
798
|
-
catch (err) {
|
|
799
|
-
repoResults[repo.name] = -1; // signal failure
|
|
800
|
-
}
|
|
801
|
-
}
|
|
802
|
-
return wrapToolResult({
|
|
803
|
-
success: true,
|
|
804
|
-
indexed: totalIndexed,
|
|
805
|
-
repos: repoResults,
|
|
806
|
-
message: `Indexed ${totalIndexed} entities across ${repos.length} repo(s)`,
|
|
807
|
-
});
|
|
808
|
-
}
|
|
809
|
-
catch (error) {
|
|
810
|
-
return wrapToolResult({
|
|
811
|
-
success: false,
|
|
812
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
813
|
-
});
|
|
814
|
-
}
|
|
815
|
-
},
|
|
816
|
-
},
|
|
817
|
-
// ── Graph status & review ─────────────────────────────────────────────────
|
|
818
|
-
// Show changed files across repos
|
|
819
|
-
{
|
|
820
|
-
name: 'workspace_status',
|
|
821
|
-
label: 'Workspace Status',
|
|
822
|
-
description: 'Show uncommitted git changes across all workspace repos. Use this when users ask about pending changes, what files are modified, or whether there are changes ready to commit.',
|
|
823
|
-
parameters: T.Object({}),
|
|
824
|
-
execute: async (toolCallId, params) => {
|
|
825
|
-
try {
|
|
826
|
-
const repos = workspaceConfig.repos ?? [];
|
|
827
|
-
const changes = {};
|
|
828
|
-
let totalChanged = 0;
|
|
829
|
-
for (const repo of repos) {
|
|
830
|
-
const repoPath = join(workspacePath, repo.path);
|
|
831
|
-
if (!existsSync(repoPath))
|
|
832
|
-
continue;
|
|
833
|
-
const result = spawnSync('git', ['status', '--porcelain'], { cwd: repoPath, encoding: 'utf-8' });
|
|
834
|
-
if (result.status === 0 && result.stdout.trim()) {
|
|
835
|
-
const files = result.stdout.trim().split('\n').filter(Boolean);
|
|
836
|
-
changes[repo.name] = files;
|
|
837
|
-
totalChanged += files.length;
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
return wrapToolResult({
|
|
841
|
-
success: true,
|
|
842
|
-
totalChanged,
|
|
843
|
-
changes,
|
|
844
|
-
message: totalChanged > 0
|
|
845
|
-
? `${totalChanged} file${totalChanged === 1 ? '' : 's'} changed across ${Object.keys(changes).length} repo${Object.keys(changes).length === 1 ? '' : 's'}`
|
|
846
|
-
: 'No uncommitted changes.',
|
|
847
|
-
});
|
|
848
|
-
}
|
|
849
|
-
catch (error) {
|
|
850
|
-
return wrapToolResult({
|
|
851
|
-
success: false,
|
|
852
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
853
|
-
});
|
|
854
|
-
}
|
|
855
|
-
},
|
|
856
|
-
},
|
|
857
|
-
// Show diffs for review
|
|
858
|
-
{
|
|
859
|
-
name: 'workspace_review',
|
|
860
|
-
label: 'Review Changes',
|
|
861
|
-
description: 'Show git diffs for uncommitted entity changes across workspace repos. Use this to preview what will be committed. Optionally filter by entity type or specific file path.',
|
|
862
|
-
parameters: T.Object({
|
|
863
|
-
entityType: T.Optional(T.String({ description: 'Filter diff to a specific entity type (e.g. "person", "deal")' })),
|
|
864
|
-
file: T.Optional(T.String({ description: 'Show diff for a specific file path' })),
|
|
865
|
-
committed: T.Optional(T.Boolean({ description: 'Review last commit instead of uncommitted changes' })),
|
|
866
|
-
}),
|
|
867
|
-
execute: async (toolCallId, params) => {
|
|
868
|
-
try {
|
|
869
|
-
const repos = workspaceConfig.repos ?? [];
|
|
870
|
-
const diffArgs = params.committed
|
|
871
|
-
? ['diff', 'HEAD~1..HEAD']
|
|
872
|
-
: ['diff'];
|
|
873
|
-
const diffs = {};
|
|
874
|
-
for (const repo of repos) {
|
|
875
|
-
const repoPath = join(workspacePath, repo.path);
|
|
876
|
-
if (!existsSync(repoPath))
|
|
877
|
-
continue;
|
|
878
|
-
const args = [...diffArgs];
|
|
879
|
-
if (params.file) {
|
|
880
|
-
args.push('--', params.file);
|
|
881
|
-
}
|
|
882
|
-
else if (params.entityType) {
|
|
883
|
-
args.push('--', `${params.entityType}/`);
|
|
884
|
-
}
|
|
885
|
-
const result = spawnSync('git', args, { cwd: repoPath, encoding: 'utf-8' });
|
|
886
|
-
if (result.status === 0 && result.stdout.trim()) {
|
|
887
|
-
// Truncate very large diffs to avoid overwhelming the context
|
|
888
|
-
const diff = result.stdout;
|
|
889
|
-
diffs[repo.name] = diff.length > 10000
|
|
890
|
-
? diff.slice(0, 10000) + '\n\n... (truncated, use --file for specific entities)'
|
|
891
|
-
: diff;
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
return wrapToolResult({
|
|
895
|
-
success: true,
|
|
896
|
-
hasDiffs: Object.keys(diffs).length > 0,
|
|
897
|
-
diffs,
|
|
898
|
-
message: Object.keys(diffs).length > 0
|
|
899
|
-
? `Diffs from ${Object.keys(diffs).length} repo(s)`
|
|
900
|
-
: 'No changes found.',
|
|
901
|
-
});
|
|
902
|
-
}
|
|
903
|
-
catch (error) {
|
|
904
|
-
return wrapToolResult({
|
|
905
|
-
success: false,
|
|
906
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
907
|
-
});
|
|
908
|
-
}
|
|
909
|
-
},
|
|
910
|
-
},
|
|
911
|
-
// Push all repos
|
|
912
|
-
{
|
|
913
|
-
name: 'workspace_push',
|
|
914
|
-
label: 'Push Repos',
|
|
915
|
-
description: 'Git push all workspace repos to their remotes. Always confirm with the user before calling this. IMPORTANT: Pushing does NOT automatically update a Railway deployment. If the workspace is deployed to Railway, call redeploy_railway after pushing to trigger a fresh deploy with the latest commits.',
|
|
916
|
-
parameters: T.Object({}),
|
|
917
|
-
execute: async (_toolCallId, _params) => {
|
|
918
|
-
try {
|
|
919
|
-
const repos = workspaceConfig.repos ?? [];
|
|
920
|
-
const results = {};
|
|
921
|
-
for (const repo of repos) {
|
|
922
|
-
const repoPath = join(workspacePath, repo.path);
|
|
923
|
-
if (!existsSync(repoPath))
|
|
924
|
-
continue;
|
|
925
|
-
try {
|
|
926
|
-
results[repo.name] = gitPush(repoPath);
|
|
927
|
-
}
|
|
928
|
-
catch (err) {
|
|
929
|
-
results[repo.name] = `error: ${err instanceof Error ? err.message : String(err)}`;
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
const pushed = Object.values(results).filter(r => r === 'pushed').length;
|
|
933
|
-
return wrapToolResult({
|
|
934
|
-
success: true,
|
|
935
|
-
results,
|
|
936
|
-
message: pushed > 0
|
|
937
|
-
? `Pushed ${pushed} repo${pushed === 1 ? '' : 's'}`
|
|
938
|
-
: 'All repos already up to date.',
|
|
939
|
-
});
|
|
940
|
-
}
|
|
941
|
-
catch (error) {
|
|
942
|
-
return wrapToolResult({
|
|
943
|
-
success: false,
|
|
944
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
945
|
-
});
|
|
946
|
-
}
|
|
947
|
-
},
|
|
948
|
-
},
|
|
949
|
-
// Pull all repos
|
|
950
|
-
{
|
|
951
|
-
name: 'workspace_pull',
|
|
952
|
-
label: 'Pull Repos',
|
|
953
|
-
description: 'Git pull all workspace repos from their remotes. Reports conflicts if any.',
|
|
954
|
-
parameters: T.Object({}),
|
|
955
|
-
execute: async (_toolCallId, _params) => {
|
|
956
|
-
try {
|
|
957
|
-
const repos = workspaceConfig.repos ?? [];
|
|
958
|
-
const results = {};
|
|
959
|
-
for (const repo of repos) {
|
|
960
|
-
const repoPath = join(workspacePath, repo.path);
|
|
961
|
-
if (!existsSync(repoPath))
|
|
962
|
-
continue;
|
|
963
|
-
try {
|
|
964
|
-
results[repo.name] = gitPull(repoPath);
|
|
965
|
-
}
|
|
966
|
-
catch (err) {
|
|
967
|
-
results[repo.name] = `error: ${err instanceof Error ? err.message : String(err)}`;
|
|
968
|
-
}
|
|
969
|
-
}
|
|
970
|
-
const updated = Object.values(results).filter(r => r === 'updated').length;
|
|
971
|
-
const conflicts = Object.values(results).filter(r => r === 'conflict').length;
|
|
972
|
-
return wrapToolResult({
|
|
973
|
-
success: conflicts === 0,
|
|
974
|
-
results,
|
|
975
|
-
message: conflicts > 0
|
|
976
|
-
? `${conflicts} repo${conflicts === 1 ? '' : 's'} with merge conflicts — resolve manually`
|
|
977
|
-
: updated > 0
|
|
978
|
-
? `Pulled updates in ${updated} repo${updated === 1 ? '' : 's'}`
|
|
979
|
-
: 'All repos already up to date.',
|
|
980
|
-
});
|
|
981
|
-
}
|
|
982
|
-
catch (error) {
|
|
983
|
-
return wrapToolResult({
|
|
984
|
-
success: false,
|
|
985
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
986
|
-
});
|
|
987
|
-
}
|
|
988
|
-
},
|
|
989
|
-
},
|
|
990
|
-
];
|
|
991
|
-
}
|
|
992
|
-
//# sourceMappingURL=sync-tools.js.map
|