studiograph 1.3.47 → 1.3.48-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -16
- package/dist/agent/agent-pool.d.ts +117 -0
- package/dist/agent/agent-pool.js +287 -0
- package/dist/agent/agent-pool.js.map +1 -0
- package/dist/agent/followups.d.ts +34 -0
- package/dist/agent/followups.js +52 -0
- package/dist/agent/followups.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +113 -22
- package/dist/agent/orchestrator.js +573 -181
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +36 -0
- package/dist/agent/prompts/entity-types-section.js +90 -0
- package/dist/agent/prompts/entity-types-section.js.map +1 -0
- package/dist/agent/prompts/system.md +148 -69
- package/dist/agent/skill-loader.d.ts +30 -17
- package/dist/agent/skill-loader.js +63 -30
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/skills/entity-schema.md +77 -433
- package/dist/agent/skills/interview/entity-templates.md +193 -0
- package/dist/agent/skills/interview/question-domains.md +391 -0
- package/dist/agent/skills/interview/skill.md +204 -0
- package/dist/agent/skills/schema-rules.md +54 -0
- package/dist/agent/tools/capture-tools.d.ts +31 -0
- package/dist/agent/tools/capture-tools.js +40 -0
- package/dist/agent/tools/capture-tools.js.map +1 -0
- package/dist/agent/tools/folder-tools.d.ts +47 -0
- package/dist/agent/tools/folder-tools.js +249 -0
- package/dist/agent/tools/folder-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +7 -6
- package/dist/agent/tools/fs-tools.js +5 -4
- package/dist/agent/tools/fs-tools.js.map +1 -1
- package/dist/agent/tools/graph-tools.d.ts +21 -58
- package/dist/agent/tools/graph-tools.js +635 -332
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/history-tools.d.ts +95 -0
- package/dist/agent/tools/history-tools.js +461 -0
- package/dist/agent/tools/history-tools.js.map +1 -0
- package/dist/agent/tools/load-skill.d.ts +6 -5
- package/dist/agent/tools/load-skill.js +3 -3
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +5 -4
- package/dist/agent/tools/ops-tools.js +130 -236
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +87 -17
- package/dist/agent/tools/permission-tools.js +233 -38
- package/dist/agent/tools/permission-tools.js.map +1 -1
- package/dist/agent/tools/tool-loader.js +5 -4
- package/dist/agent/tools/tool-loader.js.map +1 -1
- package/dist/agent/tools/web-tools.d.ts +18 -0
- package/dist/agent/tools/web-tools.js +283 -0
- package/dist/agent/tools/web-tools.js.map +1 -0
- package/dist/cli/commands/about.d.ts +1 -0
- package/dist/cli/commands/about.js +55 -3
- package/dist/cli/commands/about.js.map +1 -1
- package/dist/cli/commands/admin/audit-workspace.d.ts +23 -0
- package/dist/cli/commands/admin/audit-workspace.js +133 -0
- package/dist/cli/commands/admin/audit-workspace.js.map +1 -0
- package/dist/cli/commands/admin/audit.d.ts +21 -0
- package/dist/cli/commands/admin/audit.js +174 -0
- package/dist/cli/commands/admin/audit.js.map +1 -0
- package/dist/cli/commands/admin/backup.d.ts +54 -0
- package/dist/cli/commands/admin/backup.js +207 -0
- package/dist/cli/commands/admin/backup.js.map +1 -0
- package/dist/cli/commands/admin/folder.d.ts +11 -0
- package/dist/cli/commands/admin/folder.js +186 -0
- package/dist/cli/commands/admin/folder.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +16 -0
- package/dist/cli/commands/admin/index.js +46 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate-assets.d.ts +53 -0
- package/dist/cli/commands/admin/migrate-assets.js +184 -0
- package/dist/cli/commands/admin/migrate-assets.js.map +1 -0
- package/dist/cli/commands/admin/migrate.d.ts +56 -0
- package/dist/cli/commands/admin/migrate.js +263 -0
- package/dist/cli/commands/admin/migrate.js.map +1 -0
- package/dist/cli/commands/admin/restore.d.ts +24 -0
- package/dist/cli/commands/admin/restore.js +228 -0
- package/dist/cli/commands/admin/restore.js.map +1 -0
- package/dist/cli/commands/admin/secrets.d.ts +23 -0
- package/dist/cli/commands/admin/secrets.js +256 -0
- package/dist/cli/commands/admin/secrets.js.map +1 -0
- package/dist/cli/commands/admin/settings.d.ts +28 -0
- package/dist/cli/commands/admin/settings.js +284 -0
- package/dist/cli/commands/admin/settings.js.map +1 -0
- package/dist/cli/commands/admin/token.d.ts +42 -0
- package/dist/cli/commands/admin/token.js +126 -0
- package/dist/cli/commands/admin/token.js.map +1 -0
- package/dist/cli/commands/admin/transfer-ownership.d.ts +15 -0
- package/dist/cli/commands/admin/transfer-ownership.js +106 -0
- package/dist/cli/commands/admin/transfer-ownership.js.map +1 -0
- package/dist/cli/commands/admin/user.d.ts +11 -0
- package/dist/cli/commands/admin/user.js +187 -0
- package/dist/cli/commands/admin/user.js.map +1 -0
- package/dist/cli/commands/clone.d.ts +25 -3
- package/dist/cli/commands/clone.js +142 -36
- package/dist/cli/commands/clone.js.map +1 -1
- package/dist/cli/commands/commit.d.ts +1 -1
- package/dist/cli/commands/commit.js +24 -11
- package/dist/cli/commands/commit.js.map +1 -1
- package/dist/cli/commands/config.d.ts +23 -107
- package/dist/cli/commands/config.js +52 -260
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/connector.d.ts +10 -13
- package/dist/cli/commands/connector.js +16 -58
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.js +215 -68
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/index.js +2 -2
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +10 -30
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.js +12 -4
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/orphans.js +14 -30
- package/dist/cli/commands/orphans.js.map +1 -1
- package/dist/cli/commands/r2.d.ts +3 -0
- package/dist/cli/commands/r2.js +223 -204
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.js +65 -12
- package/dist/cli/commands/redeploy.js.map +1 -1
- package/dist/cli/commands/reset.d.ts +22 -6
- package/dist/cli/commands/reset.js +142 -63
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/serve.js +209 -24
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +372 -202
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/crypto-bundle.d.ts +39 -0
- package/dist/cli/crypto-bundle.js +94 -0
- package/dist/cli/crypto-bundle.js.map +1 -0
- package/dist/cli/index.js +24 -35
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/railway-pin.d.ts +68 -0
- package/dist/cli/railway-pin.js +96 -0
- package/dist/cli/railway-pin.js.map +1 -0
- package/dist/cli/railway-provisioning.d.ts +53 -0
- package/dist/cli/railway-provisioning.js +85 -0
- package/dist/cli/railway-provisioning.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +33 -52
- package/dist/cli/setup-wizard.js +43 -68
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/core/accent-palette.d.ts +22 -0
- package/dist/core/accent-palette.js +47 -0
- package/dist/core/accent-palette.js.map +1 -0
- package/dist/core/cell-anchor.d.ts +29 -0
- package/dist/core/cell-anchor.js +53 -0
- package/dist/core/cell-anchor.js.map +1 -0
- package/dist/core/comment-anchor.d.ts +41 -0
- package/dist/core/comment-anchor.js +147 -0
- package/dist/core/comment-anchor.js.map +1 -0
- package/dist/core/commit-messages.d.ts +57 -0
- package/dist/core/commit-messages.js +85 -0
- package/dist/core/commit-messages.js.map +1 -0
- package/dist/core/embeds.d.ts +56 -0
- package/dist/core/embeds.js +103 -0
- package/dist/core/embeds.js.map +1 -0
- package/dist/core/entity-body-templates.d.ts +21 -0
- package/dist/core/entity-body-templates.js +53 -0
- package/dist/core/entity-body-templates.js.map +1 -0
- package/dist/core/entity-types-catalog.d.ts +65 -0
- package/dist/core/entity-types-catalog.js +140 -0
- package/dist/core/entity-types-catalog.js.map +1 -0
- package/dist/core/folder-paths.d.ts +41 -0
- package/dist/core/folder-paths.js +95 -0
- package/dist/core/folder-paths.js.map +1 -0
- package/dist/core/folder-sidecar.d.ts +36 -0
- package/dist/core/folder-sidecar.js +91 -0
- package/dist/core/folder-sidecar.js.map +1 -0
- package/dist/core/graph.d.ts +675 -14
- package/dist/core/graph.js +2118 -314
- package/dist/core/graph.js.map +1 -1
- package/dist/core/history-diff.d.ts +35 -0
- package/dist/core/history-diff.js +114 -0
- package/dist/core/history-diff.js.map +1 -0
- package/dist/core/schema-registry.d.ts +59 -0
- package/dist/core/schema-registry.js +198 -0
- package/dist/core/schema-registry.js.map +1 -1
- package/dist/core/schemas/connector.d.ts +67 -0
- package/dist/core/schemas/connector.js +100 -0
- package/dist/core/schemas/connector.js.map +1 -0
- package/dist/core/schemas/workspace.d.ts +122 -0
- package/dist/core/schemas/workspace.js +211 -0
- package/dist/core/schemas/workspace.js.map +1 -0
- package/dist/core/secrets/SecretStore.d.ts +77 -0
- package/dist/core/secrets/SecretStore.js +13 -0
- package/dist/core/secrets/SecretStore.js.map +1 -0
- package/dist/core/secrets/SettingsResolver.d.ts +54 -0
- package/dist/core/secrets/SettingsResolver.js +80 -0
- package/dist/core/secrets/SettingsResolver.js.map +1 -0
- package/dist/core/secrets/SettingsStore.d.ts +30 -0
- package/dist/core/secrets/SettingsStore.js +9 -0
- package/dist/core/secrets/SettingsStore.js.map +1 -0
- package/dist/core/secrets/SqliteEncryptedStore.d.ts +90 -0
- package/dist/core/secrets/SqliteEncryptedStore.js +598 -0
- package/dist/core/secrets/SqliteEncryptedStore.js.map +1 -0
- package/dist/core/secrets/audit.d.ts +36 -0
- package/dist/core/secrets/audit.js +60 -0
- package/dist/core/secrets/audit.js.map +1 -0
- package/dist/core/secrets/auth-db-migration.d.ts +129 -0
- package/dist/core/secrets/auth-db-migration.js +653 -0
- package/dist/core/secrets/auth-db-migration.js.map +1 -0
- package/dist/core/secrets/bundle.d.ts +141 -0
- package/dist/core/secrets/bundle.js +435 -0
- package/dist/core/secrets/bundle.js.map +1 -0
- package/dist/core/secrets/dual-write.d.ts +81 -0
- package/dist/core/secrets/dual-write.js +247 -0
- package/dist/core/secrets/dual-write.js.map +1 -0
- package/dist/core/secrets/encryption.d.ts +44 -0
- package/dist/core/secrets/encryption.js +97 -0
- package/dist/core/secrets/encryption.js.map +1 -0
- package/dist/core/secrets/index.d.ts +49 -0
- package/dist/core/secrets/index.js +74 -0
- package/dist/core/secrets/index.js.map +1 -0
- package/dist/core/secrets/master-key.d.ts +38 -0
- package/dist/core/secrets/master-key.js +122 -0
- package/dist/core/secrets/master-key.js.map +1 -0
- package/dist/core/secrets/probes/anthropic.d.ts +98 -0
- package/dist/core/secrets/probes/anthropic.js +300 -0
- package/dist/core/secrets/probes/anthropic.js.map +1 -0
- package/dist/core/secrets/probes/brave.d.ts +9 -0
- package/dist/core/secrets/probes/brave.js +15 -0
- package/dist/core/secrets/probes/brave.js.map +1 -0
- package/dist/core/secrets/probes/r2.d.ts +15 -0
- package/dist/core/secrets/probes/r2.js +14 -0
- package/dist/core/secrets/probes/r2.js.map +1 -0
- package/dist/core/secrets/probes/voyage.d.ts +13 -0
- package/dist/core/secrets/probes/voyage.js +52 -0
- package/dist/core/secrets/probes/voyage.js.map +1 -0
- package/dist/core/secrets/r2-structural-migration.d.ts +39 -0
- package/dist/core/secrets/r2-structural-migration.js +109 -0
- package/dist/core/secrets/r2-structural-migration.js.map +1 -0
- package/dist/core/secrets/read-flip.d.ts +59 -0
- package/dist/core/secrets/read-flip.js +87 -0
- package/dist/core/secrets/read-flip.js.map +1 -0
- package/dist/core/secrets/registry.d.ts +188 -0
- package/dist/core/secrets/registry.js +598 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/types.d.ts +77 -455
- package/dist/core/types.js +17 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +75 -7
- package/dist/core/user-config.js +155 -7
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +717 -1791
- package/dist/core/validation.js +357 -228
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +79 -12
- package/dist/core/workspace-manager.js +213 -73
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +19 -5
- package/dist/core/workspace.js +69 -35
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/comment-virtual-entity.d.ts +36 -0
- package/dist/mcp/comment-virtual-entity.js +71 -0
- package/dist/mcp/comment-virtual-entity.js.map +1 -0
- package/dist/mcp/connector-manager.d.ts +94 -13
- package/dist/mcp/connector-manager.js +283 -62
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/oauth-provider.d.ts +27 -33
- package/dist/mcp/oauth-provider.js +65 -134
- package/dist/mcp/oauth-provider.js.map +1 -1
- package/dist/mcp/oauth-registry.d.ts +62 -0
- package/dist/mcp/oauth-registry.js +85 -0
- package/dist/mcp/oauth-registry.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -3
- package/dist/mcp/server.js +30 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/state-signer.d.ts +41 -0
- package/dist/mcp/state-signer.js +120 -0
- package/dist/mcp/state-signer.js.map +1 -0
- package/dist/mcp/tools.d.ts +35 -2
- package/dist/mcp/tools.js +1051 -117
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/__tests__/helpers/graph-api.d.ts +18 -0
- package/dist/server/__tests__/helpers/graph-api.js +16 -0
- package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
- package/dist/server/body-write-coordinator.d.ts +151 -0
- package/dist/server/body-write-coordinator.js +161 -0
- package/dist/server/body-write-coordinator.js.map +1 -0
- package/dist/server/cloud-billing-flow.d.ts +32 -0
- package/dist/server/cloud-billing-flow.js +75 -0
- package/dist/server/cloud-billing-flow.js.map +1 -0
- package/dist/server/commit-audit.d.ts +26 -0
- package/dist/server/commit-audit.js +30 -0
- package/dist/server/commit-audit.js.map +1 -0
- package/dist/server/index.d.ts +14 -3
- package/dist/server/index.js +451 -193
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/sanitize.d.ts +46 -0
- package/dist/server/middleware/sanitize.js +171 -0
- package/dist/server/middleware/sanitize.js.map +1 -0
- package/dist/server/routes/asset-api.d.ts +10 -0
- package/dist/server/routes/asset-api.js +294 -0
- package/dist/server/routes/asset-api.js.map +1 -0
- package/dist/server/routes/audit-api.d.ts +24 -0
- package/dist/server/routes/audit-api.js +117 -0
- package/dist/server/routes/audit-api.js.map +1 -0
- package/dist/server/routes/auth-api.d.ts +3 -2
- package/dist/server/routes/auth-api.js +519 -38
- package/dist/server/routes/auth-api.js.map +1 -1
- package/dist/server/routes/capture-api.d.ts +18 -0
- package/dist/server/routes/capture-api.js +257 -0
- package/dist/server/routes/capture-api.js.map +1 -0
- package/dist/server/routes/chat.d.ts +4 -1
- package/dist/server/routes/chat.js +298 -88
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/comments-api.d.ts +15 -0
- package/dist/server/routes/comments-api.js +444 -0
- package/dist/server/routes/comments-api.js.map +1 -0
- package/dist/server/routes/config-api.d.ts +21 -0
- package/dist/server/routes/config-api.js +256 -0
- package/dist/server/routes/config-api.js.map +1 -0
- package/dist/server/routes/connectors-api.d.ts +17 -0
- package/dist/server/routes/connectors-api.js +410 -0
- package/dist/server/routes/connectors-api.js.map +1 -0
- package/dist/server/routes/event-ingest-api.d.ts +15 -0
- package/dist/server/routes/event-ingest-api.js +125 -0
- package/dist/server/routes/event-ingest-api.js.map +1 -0
- package/dist/server/routes/git-http.d.ts +3 -3
- package/dist/server/routes/git-http.js +86 -38
- package/dist/server/routes/git-http.js.map +1 -1
- package/dist/server/routes/graph-api-access.d.ts +35 -0
- package/dist/server/routes/graph-api-access.js +105 -0
- package/dist/server/routes/graph-api-access.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +3 -2
- package/dist/server/routes/graph-api.js +1321 -263
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/health.d.ts +18 -0
- package/dist/server/routes/health.js +74 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/insights-api.d.ts +1 -2
- package/dist/server/routes/insights-api.js +149 -41
- package/dist/server/routes/insights-api.js.map +1 -1
- package/dist/server/routes/mcp.d.ts +7 -3
- package/dist/server/routes/mcp.js +22 -6
- package/dist/server/routes/mcp.js.map +1 -1
- package/dist/server/routes/permissions-api.d.ts +9 -2
- package/dist/server/routes/permissions-api.js +87 -30
- package/dist/server/routes/permissions-api.js.map +1 -1
- package/dist/server/routes/r2-api.d.ts +25 -0
- package/dist/server/routes/r2-api.js +276 -0
- package/dist/server/routes/r2-api.js.map +1 -0
- package/dist/server/routes/secrets-api.d.ts +36 -0
- package/dist/server/routes/secrets-api.js +308 -0
- package/dist/server/routes/secrets-api.js.map +1 -0
- package/dist/server/routes/settings-api.d.ts +29 -0
- package/dist/server/routes/settings-api.js +180 -0
- package/dist/server/routes/settings-api.js.map +1 -0
- package/dist/server/routes/url-api.d.ts +7 -0
- package/dist/server/routes/url-api.js +74 -0
- package/dist/server/routes/url-api.js.map +1 -0
- package/dist/server/routes/views-api.js +81 -7
- package/dist/server/routes/views-api.js.map +1 -1
- package/dist/server/routes/workspace-api.d.ts +2 -1
- package/dist/server/routes/workspace-api.js +124 -35
- package/dist/server/routes/workspace-api.js.map +1 -1
- package/dist/server/routes/ws.d.ts +2 -1
- package/dist/server/routes/ws.js +64 -16
- package/dist/server/routes/ws.js.map +1 -1
- package/dist/server/session-manager.d.ts +48 -5
- package/dist/server/session-manager.js +182 -15
- package/dist/server/session-manager.js.map +1 -1
- package/dist/server/ws-hub.d.ts +138 -14
- package/dist/server/ws-hub.js +0 -0
- package/dist/server/ws-hub.js.map +1 -1
- package/dist/server/yjs-manager.d.ts +285 -7
- package/dist/server/yjs-manager.js +907 -36
- package/dist/server/yjs-manager.js.map +1 -1
- package/dist/server/yjs-persistence.d.ts +165 -0
- package/dist/server/yjs-persistence.js +557 -0
- package/dist/server/yjs-persistence.js.map +1 -0
- package/dist/server/yjs-text-diff.d.ts +32 -0
- package/dist/server/yjs-text-diff.js +61 -0
- package/dist/server/yjs-text-diff.js.map +1 -0
- package/dist/services/access-control.d.ts +73 -0
- package/dist/services/access-control.js +146 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/asset-listing.d.ts +39 -0
- package/dist/services/asset-listing.js +125 -0
- package/dist/services/asset-listing.js.map +1 -0
- package/dist/services/asset-upload-service.d.ts +53 -0
- package/dist/services/asset-upload-service.js +201 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/assets/asset-index-service.d.ts +82 -0
- package/dist/services/assets/asset-index-service.js +167 -0
- package/dist/services/assets/asset-index-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +44 -0
- package/dist/services/assets/base.js +55 -0
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +69 -1
- package/dist/services/assets/index.js +125 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +12 -1
- package/dist/services/assets/local.js +100 -1
- package/dist/services/assets/local.js.map +1 -1
- package/dist/services/assets/r2-sync.d.ts +88 -0
- package/dist/services/assets/r2-sync.js +412 -0
- package/dist/services/assets/r2-sync.js.map +1 -0
- package/dist/services/assets/r2.d.ts +34 -1
- package/dist/services/assets/r2.js +93 -1
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +314 -36
- package/dist/services/auth-service.js +1126 -139
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/bookmark-import-service.d.ts +49 -0
- package/dist/services/bookmark-import-service.js +250 -0
- package/dist/services/bookmark-import-service.js.map +1 -0
- package/dist/services/cloud-inference-billing.d.ts +64 -0
- package/dist/services/cloud-inference-billing.js +313 -0
- package/dist/services/cloud-inference-billing.js.map +1 -0
- package/dist/services/comment-service.d.ts +97 -0
- package/dist/services/comment-service.js +341 -0
- package/dist/services/comment-service.js.map +1 -0
- package/dist/services/csv-service.d.ts +22 -17
- package/dist/services/csv-service.js +55 -92
- package/dist/services/csv-service.js.map +1 -1
- package/dist/services/entity-mutations.d.ts +161 -0
- package/dist/services/entity-mutations.js +296 -0
- package/dist/services/entity-mutations.js.map +1 -0
- package/dist/services/event-processor.d.ts +104 -0
- package/dist/services/event-processor.js +441 -0
- package/dist/services/event-processor.js.map +1 -0
- package/dist/services/folder-creation.d.ts +33 -0
- package/dist/services/folder-creation.js +103 -0
- package/dist/services/folder-creation.js.map +1 -0
- package/dist/services/git.d.ts +54 -0
- package/dist/services/git.js +188 -54
- package/dist/services/git.js.map +1 -1
- package/dist/services/graph-maintenance.d.ts +42 -0
- package/dist/services/graph-maintenance.js +143 -0
- package/dist/services/graph-maintenance.js.map +1 -0
- package/dist/services/import-service.d.ts +45 -2
- package/dist/services/import-service.js +304 -100
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/lint-service.js +9 -16
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.d.ts +12 -1
- package/dist/services/markdown.js +71 -6
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +22 -14
- package/dist/services/memory-service.js +53 -35
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/mention-detector.d.ts +23 -0
- package/dist/services/mention-detector.js +47 -0
- package/dist/services/mention-detector.js.map +1 -0
- package/dist/services/notification-broadcast.d.ts +32 -0
- package/dist/services/notification-broadcast.js +38 -0
- package/dist/services/notification-broadcast.js.map +1 -0
- package/dist/services/notification-service.d.ts +41 -0
- package/dist/services/notification-service.js +100 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/personal-folder.d.ts +40 -0
- package/dist/services/personal-folder.js +101 -0
- package/dist/services/personal-folder.js.map +1 -0
- package/dist/services/user-person-bridge.d.ts +118 -0
- package/dist/services/user-person-bridge.js +306 -0
- package/dist/services/user-person-bridge.js.map +1 -0
- package/dist/services/vector-service.d.ts +146 -6
- package/dist/services/vector-service.js +276 -13
- package/dist/services/vector-service.js.map +1 -1
- package/dist/services/workspace-access.d.ts +106 -0
- package/dist/services/workspace-access.js +149 -0
- package/dist/services/workspace-access.js.map +1 -0
- package/dist/utils/git.d.ts +17 -2
- package/dist/utils/git.js +23 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/log.d.ts +42 -0
- package/dist/utils/log.js +137 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/preflight.js +2 -2
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/version-checker.d.ts +12 -19
- package/dist/utils/version-checker.js +14 -104
- package/dist/utils/version-checker.js.map +1 -1
- package/dist/web/_app/immutable/assets/0.DDqq11xY.css +2 -0
- package/dist/web/_app/immutable/assets/12.DlIf1mKh.css +1 -0
- package/dist/web/_app/immutable/assets/13.7d-Q37wc.css +1 -0
- package/dist/web/_app/immutable/assets/14.CmLrbzZp.css +1 -0
- package/dist/web/_app/immutable/assets/2.CGK2ky-K.css +1 -0
- package/dist/web/_app/immutable/assets/3.CV0abekd.css +1 -0
- package/dist/web/_app/immutable/assets/4.fGsEpo95.css +1 -0
- package/dist/web/_app/immutable/assets/AgentOverlay.DqzjAOm4.css +1 -0
- package/dist/web/_app/immutable/assets/AssetManagerModal.BKJfPAPk.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.bNewSxkH.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMembersPanel.DX1oBeF_.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMutationDialogs.BMRF6Z3z.css +1 -0
- package/dist/web/_app/immutable/assets/FolderPicker.B5KdvRYl.css +1 -0
- package/dist/web/_app/immutable/assets/GalleryView.DgvSjS0I.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.D0QbZFd6.css +1 -0
- package/dist/web/_app/immutable/assets/Markdown.B4lW7Llh.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.DYWYMFSO.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/StopFilledAlt.clodJdp5.css +1 -0
- package/dist/web/_app/immutable/assets/TimelineView.DA-H6dvv.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.BS1ildu7.css +1 -0
- package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
- package/dist/web/_app/immutable/assets/formatting.B912lpdG.css +1 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CZTNEAuW.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CsGl1sm0.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.BNK2_mGO.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.DpEwFAQM.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2 +0 -0
- package/dist/web/_app/immutable/assets/inline-list.cqga56xT.css +1 -0
- package/dist/web/_app/immutable/assets/list-columns.DCMVmy_Q.css +1 -0
- package/dist/web/_app/immutable/assets/realtime.DDCWxn3B.css +1 -0
- package/dist/web/_app/immutable/assets/sheet.DJPuqnTg.css +1 -0
- package/dist/web/_app/immutable/assets/speech-dictation.C5CYFhS1.css +1 -0
- package/dist/web/_app/immutable/chunks/0iDDDyaZ.js +1 -0
- package/dist/web/_app/immutable/chunks/2LgrBrpS2.js +2 -0
- package/dist/web/_app/immutable/chunks/3EfPAYzi2.js +1 -0
- package/dist/web/_app/immutable/chunks/7Bu427my2.js +184 -0
- package/dist/web/_app/immutable/chunks/96h3ktuk.js +1 -0
- package/dist/web/_app/immutable/chunks/A6FJA1AF.js +1 -0
- package/dist/web/_app/immutable/chunks/B-FAwCqe2.js +1 -0
- package/dist/web/_app/immutable/chunks/B-V5eMSw2.js +1 -0
- package/dist/web/_app/immutable/chunks/B-i9_YVM.js +1 -0
- package/dist/web/_app/immutable/chunks/B15-kvCe2.js +1 -0
- package/dist/web/_app/immutable/chunks/B1KZ7zY32.js +2 -0
- package/dist/web/_app/immutable/chunks/B4gpzeQ2.js +1 -0
- package/dist/web/_app/immutable/chunks/B6Lt-qaJ2.js +1 -0
- package/dist/web/_app/immutable/chunks/B7tbGyiU2.js +1 -0
- package/dist/web/_app/immutable/chunks/BBxt8lpa.js +1 -0
- package/dist/web/_app/immutable/chunks/BCaRi2AF.js +1 -0
- package/dist/web/_app/immutable/chunks/BJ6Z7eAM.js +2 -0
- package/dist/web/_app/immutable/chunks/BM_vIwVC.js +83 -0
- package/dist/web/_app/immutable/chunks/BQULA6er.js +4 -0
- package/dist/web/_app/immutable/chunks/BQW-EDgP2.js +224 -0
- package/dist/web/_app/immutable/chunks/BR6jMpLB.js +1 -0
- package/dist/web/_app/immutable/chunks/BVnuLlVg.js +1 -0
- package/dist/web/_app/immutable/chunks/BddNmQ8j.js +1 -0
- package/dist/web/_app/immutable/chunks/BeuunHPO.js +1 -0
- package/dist/web/_app/immutable/chunks/BhTmSo4n2.js +1 -0
- package/dist/web/_app/immutable/chunks/BikW7mty2.js +1 -0
- package/dist/web/_app/immutable/chunks/BkyFvJvz.js +1 -0
- package/dist/web/_app/immutable/chunks/BlyFGPFV.js +22 -0
- package/dist/web/_app/immutable/chunks/Bo5dghSu.js +3 -0
- package/dist/web/_app/immutable/chunks/BpPyho8Y.js +3 -0
- package/dist/web/_app/immutable/chunks/BsuvyNDN2.js +2 -0
- package/dist/web/_app/immutable/chunks/BuKi0vpu2.js +7 -0
- package/dist/web/_app/immutable/chunks/BuuYnIjE.js +1 -0
- package/dist/web/_app/immutable/chunks/By4lVKNC.js +2 -0
- package/dist/web/_app/immutable/chunks/ByQGCIwO.js +5 -0
- package/dist/web/_app/immutable/chunks/ByidpUhu.js +1 -0
- package/dist/web/_app/immutable/chunks/C35TIzaB.js +1 -0
- package/dist/web/_app/immutable/chunks/C5dM5op-.js +1 -0
- package/dist/web/_app/immutable/chunks/C6Nx0jpM.js +1 -0
- package/dist/web/_app/immutable/chunks/C6pVyOEl2.js +1 -0
- package/dist/web/_app/immutable/chunks/C80GKPZ9.js +1 -0
- package/dist/web/_app/immutable/chunks/C94TJqPI.js +1 -0
- package/dist/web/_app/immutable/chunks/C9PETsiT.js +1 -0
- package/dist/web/_app/immutable/chunks/CAuAQ81a2.js +1 -0
- package/dist/web/_app/immutable/chunks/CBnzSITi2.js +1 -0
- package/dist/web/_app/immutable/chunks/CC9p2p6w.js +1 -0
- package/dist/web/_app/immutable/chunks/CCLR-AJL2.js +185 -0
- package/dist/web/_app/immutable/chunks/CD0X7XPW.js +6 -0
- package/dist/web/_app/immutable/chunks/CDTjuBSm.js +1 -0
- package/dist/web/_app/immutable/chunks/CH-KYFIm.js +64 -0
- package/dist/web/_app/immutable/chunks/CHj8fObQ2.js +9 -0
- package/dist/web/_app/immutable/chunks/CK-UnH-n2.js +1 -0
- package/dist/web/_app/immutable/chunks/CKH5BEAh.js +1 -0
- package/dist/web/_app/immutable/chunks/CPSupDJp2.js +2 -0
- package/dist/web/_app/immutable/chunks/CSUrYOis.js +1 -0
- package/dist/web/_app/immutable/chunks/CYTTTma0.js +3 -0
- package/dist/web/_app/immutable/chunks/Cbaut_us2.js +1 -0
- package/dist/web/_app/immutable/chunks/CiIpSx5n2.js +1 -0
- package/dist/web/_app/immutable/chunks/CkLfUXwy.js +1 -0
- package/dist/web/_app/immutable/chunks/CokE4L8B2.js +1 -0
- package/dist/web/_app/immutable/chunks/CpLdnbh3.js +1 -0
- package/dist/web/_app/immutable/chunks/CvDrXJk9.js +1 -0
- package/dist/web/_app/immutable/chunks/D00MFB9_2.js +1 -0
- package/dist/web/_app/immutable/chunks/D41CbXmM.js +1 -0
- package/dist/web/_app/immutable/chunks/D5Hj-MPO2.js +1 -0
- package/dist/web/_app/immutable/chunks/D6nLEmZy2.js +1 -0
- package/dist/web/_app/immutable/chunks/D71ZlQBM2.js +2 -0
- package/dist/web/_app/immutable/chunks/D9ql9vXU.js +1 -0
- package/dist/web/_app/immutable/chunks/DAXW5iLp.js +1 -0
- package/dist/web/_app/immutable/chunks/DBzQ8LyQ2.js +2 -0
- package/dist/web/_app/immutable/chunks/DIb5rAPU2.js +1 -0
- package/dist/web/_app/immutable/chunks/DOmH4G9o.js +14 -0
- package/dist/web/_app/immutable/chunks/DQMWa2t72.js +1 -0
- package/dist/web/_app/immutable/chunks/DRsswX8S.js +1 -0
- package/dist/web/_app/immutable/chunks/DTCHhxD5.js +1 -0
- package/dist/web/_app/immutable/chunks/DUwgGBxa.js +1 -0
- package/dist/web/_app/immutable/chunks/DVcy5Pp82.js +1 -0
- package/dist/web/_app/immutable/chunks/DWygwzcO.js +1 -0
- package/dist/web/_app/immutable/chunks/DYXDRmoo.js +1 -0
- package/dist/web/_app/immutable/chunks/DZ-YyRVM.js +1 -0
- package/dist/web/_app/immutable/chunks/D_HVOuHV.js +1 -0
- package/dist/web/_app/immutable/chunks/DaoOQFPb.js +1 -0
- package/dist/web/_app/immutable/chunks/DdLkNvPf.js +23 -0
- package/dist/web/_app/immutable/chunks/DiMQob8p.js +1 -0
- package/dist/web/_app/immutable/chunks/DiQJ9DLy.js +1 -0
- package/dist/web/_app/immutable/chunks/DlORZqfE.js +1 -0
- package/dist/web/_app/immutable/chunks/DmeYl7eL.js +2 -0
- package/dist/web/_app/immutable/chunks/Dng3OcRd2.js +1 -0
- package/dist/web/_app/immutable/chunks/DoKMFfJd.js +1 -0
- package/dist/web/_app/immutable/chunks/DpzG2mVI2.js +1 -0
- package/dist/web/_app/immutable/chunks/DvJSCDuZ2.js +1 -0
- package/dist/web/_app/immutable/chunks/DvPuaTCl2.js +5 -0
- package/dist/web/_app/immutable/chunks/ItgU4ei5.js +1 -0
- package/dist/web/_app/immutable/chunks/JJDMrjj62.js +1 -0
- package/dist/web/_app/immutable/chunks/OTTMDMTW.js +1 -0
- package/dist/web/_app/immutable/chunks/RmiWpCin2.js +1 -0
- package/dist/web/_app/immutable/chunks/ZTiqmKJy2.js +1 -0
- package/dist/web/_app/immutable/chunks/ahC5WoXX2.js +1 -0
- package/dist/web/_app/immutable/chunks/e3SY5t2O2.js +2692 -0
- package/dist/web/_app/immutable/chunks/g09ZrevW.js +1 -0
- package/dist/web/_app/immutable/chunks/go8N1nWD2.js +3 -0
- package/dist/web/_app/immutable/chunks/nTAmRNKw2.js +1 -0
- package/dist/web/_app/immutable/chunks/oBQOivfH2.js +1 -0
- package/dist/web/_app/immutable/chunks/oUTRxd0f.js +1 -0
- package/dist/web/_app/immutable/chunks/s_7BJJYy.js +2 -0
- package/dist/web/_app/immutable/chunks/uuFM-ygL.js +1 -0
- package/dist/web/_app/immutable/chunks/v7me-ydg.js +2 -0
- package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/dist/web/_app/immutable/chunks/zl16E4yc2.js +1 -0
- package/dist/web/_app/immutable/entry/app.CbuUtkoM.js +2 -0
- package/dist/web/_app/immutable/entry/start.DeZyKwOT.js +1 -0
- package/dist/web/_app/immutable/nodes/0.C4PMtdx9.js +2 -0
- package/dist/web/_app/immutable/nodes/1.BwVfPLMn.js +1 -0
- package/dist/web/_app/immutable/nodes/10.DPr_SYan.js +1 -0
- package/dist/web/_app/immutable/nodes/11.CJAmEchE.js +1 -0
- package/dist/web/_app/immutable/nodes/12.ChMWXPMk.js +1 -0
- package/dist/web/_app/immutable/nodes/13.8vOKq8ue.js +1 -0
- package/dist/web/_app/immutable/nodes/14.BOSNmj9h.js +1 -0
- package/dist/web/_app/immutable/nodes/2.7N4BLwhX.js +109 -0
- package/dist/web/_app/immutable/nodes/3.Cd-tx8Ej.js +2 -0
- package/dist/web/_app/immutable/nodes/4.DtuT-syy.js +14 -0
- package/dist/web/_app/immutable/nodes/5.YwNHOrkt.js +1 -0
- package/dist/web/_app/immutable/nodes/6.BSPlYQuq.js +1 -0
- package/dist/web/_app/immutable/nodes/7.DPXzwW0H.js +1 -0
- package/dist/web/_app/immutable/nodes/8.Dhpk7w3X.js +1 -0
- package/dist/web/_app/immutable/nodes/9.Dd4iAQN5.js +1 -0
- package/dist/web/_app/version.json +1 -1
- package/dist/web/favicon-16.png +0 -0
- package/dist/web/favicon-180.png +0 -0
- package/dist/web/favicon-32.png +0 -0
- package/dist/web/favicon-48.png +0 -0
- package/dist/web/favicon-512.png +0 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/favicon.svg +8 -0
- package/dist/web/index.html +54 -19
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +34 -14
- package/dist/agent/skills/enrich-entities.md +0 -136
- package/dist/agent/skills/obsidian-source-setup.md +0 -246
- package/dist/agent/skills/skill-loader.d.ts +0 -48
- package/dist/agent/skills/skill-loader.js +0 -166
- package/dist/agent/skills/skill-loader.js.map +0 -1
- package/dist/agent/skills/sync-configuration.md +0 -119
- package/dist/agent/skills/sync-setup.md +0 -82
- package/dist/agent/tools/sync-tools.d.ts +0 -35
- package/dist/agent/tools/sync-tools.js +0 -992
- package/dist/agent/tools/sync-tools.js.map +0 -1
- package/dist/auth/github.d.ts +0 -56
- package/dist/auth/github.js +0 -169
- package/dist/auth/github.js.map +0 -1
- package/dist/cli/commands/access.d.ts +0 -11
- package/dist/cli/commands/access.js +0 -156
- package/dist/cli/commands/access.js.map +0 -1
- package/dist/cli/commands/app.d.ts +0 -7
- package/dist/cli/commands/app.js +0 -268
- package/dist/cli/commands/app.js.map +0 -1
- package/dist/cli/commands/auth.d.ts +0 -10
- package/dist/cli/commands/auth.js +0 -79
- package/dist/cli/commands/auth.js.map +0 -1
- package/dist/cli/commands/clear.d.ts +0 -5
- package/dist/cli/commands/clear.js +0 -36
- package/dist/cli/commands/clear.js.map +0 -1
- package/dist/cli/commands/collection.d.ts +0 -10
- package/dist/cli/commands/collection.js +0 -187
- package/dist/cli/commands/collection.js.map +0 -1
- package/dist/cli/commands/enrich.d.ts +0 -11
- package/dist/cli/commands/enrich.js +0 -135
- package/dist/cli/commands/enrich.js.map +0 -1
- package/dist/cli/commands/graphrag.d.ts +0 -12
- package/dist/cli/commands/graphrag.js +0 -122
- package/dist/cli/commands/graphrag.js.map +0 -1
- package/dist/cli/commands/join.d.ts +0 -9
- package/dist/cli/commands/join.js +0 -255
- package/dist/cli/commands/join.js.map +0 -1
- package/dist/cli/commands/members.d.ts +0 -11
- package/dist/cli/commands/members.js +0 -230
- package/dist/cli/commands/members.js.map +0 -1
- package/dist/cli/commands/org.d.ts +0 -10
- package/dist/cli/commands/org.js +0 -132
- package/dist/cli/commands/org.js.map +0 -1
- package/dist/cli/commands/provision.d.ts +0 -8
- package/dist/cli/commands/provision.js +0 -116
- package/dist/cli/commands/provision.js.map +0 -1
- package/dist/cli/commands/resolve.d.ts +0 -8
- package/dist/cli/commands/resolve.js +0 -85
- package/dist/cli/commands/resolve.js.map +0 -1
- package/dist/cli/commands/review.d.ts +0 -19
- package/dist/cli/commands/review.js +0 -128
- package/dist/cli/commands/review.js.map +0 -1
- package/dist/cli/commands/source.d.ts +0 -16
- package/dist/cli/commands/source.js +0 -159
- package/dist/cli/commands/source.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -7
- package/dist/cli/commands/start.js +0 -589
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/sync-collection.d.ts +0 -14
- package/dist/cli/commands/sync-collection.js +0 -355
- package/dist/cli/commands/sync-collection.js.map +0 -1
- package/dist/cli/commands/sync-entities.d.ts +0 -13
- package/dist/cli/commands/sync-entities.js +0 -242
- package/dist/cli/commands/sync-entities.js.map +0 -1
- package/dist/cli/commands/team.d.ts +0 -12
- package/dist/cli/commands/team.js +0 -185
- package/dist/cli/commands/team.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -8
- package/dist/cli/commands/update.js +0 -155
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/user.d.ts +0 -7
- package/dist/cli/commands/user.js +0 -153
- package/dist/cli/commands/user.js.map +0 -1
- package/dist/cli/scaffolding.d.ts +0 -12
- package/dist/cli/scaffolding.js +0 -397
- package/dist/cli/scaffolding.js.map +0 -1
- package/dist/cli/sync-review-interactive.d.ts +0 -31
- package/dist/cli/sync-review-interactive.js +0 -393
- package/dist/cli/sync-review-interactive.js.map +0 -1
- package/dist/core/migration-runner.d.ts +0 -42
- package/dist/core/migration-runner.js +0 -232
- package/dist/core/migration-runner.js.map +0 -1
- package/dist/core/migration-types.d.ts +0 -101
- package/dist/core/migration-types.js +0 -21
- package/dist/core/migration-types.js.map +0 -1
- package/dist/core/migrations/20260219-formalize-memory-location.d.ts +0 -2
- package/dist/core/migrations/20260219-formalize-memory-location.js +0 -35
- package/dist/core/migrations/20260219-formalize-memory-location.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +0 -12
- package/dist/core/migrations/20260220-add-workspace-metadata.js +0 -65
- package/dist/core/migrations/20260220-add-workspace-metadata.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-readme.d.ts +0 -11
- package/dist/core/migrations/20260220-add-workspace-readme.js +0 -82
- package/dist/core/migrations/20260220-add-workspace-readme.js.map +0 -1
- package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +0 -9
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js +0 -64
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +0 -1
- package/dist/core/migrations/index.d.ts +0 -11
- package/dist/core/migrations/index.js +0 -23
- package/dist/core/migrations/index.js.map +0 -1
- package/dist/integrations/asana.d.ts +0 -26
- package/dist/integrations/asana.js +0 -78
- package/dist/integrations/asana.js.map +0 -1
- package/dist/integrations/figma-local.d.ts +0 -16
- package/dist/integrations/figma-local.js +0 -10
- package/dist/integrations/figma-local.js.map +0 -1
- package/dist/integrations/figma.d.ts +0 -17
- package/dist/integrations/figma.js +0 -17
- package/dist/integrations/figma.js.map +0 -1
- package/dist/integrations/granola.d.ts +0 -24
- package/dist/integrations/granola.js +0 -60
- package/dist/integrations/granola.js.map +0 -1
- package/dist/integrations/linear.d.ts +0 -14
- package/dist/integrations/linear.js +0 -80
- package/dist/integrations/linear.js.map +0 -1
- package/dist/integrations/paper-local.d.ts +0 -14
- package/dist/integrations/paper-local.js +0 -10
- package/dist/integrations/paper-local.js.map +0 -1
- package/dist/integrations/paper.d.ts +0 -2
- package/dist/integrations/paper.js +0 -10
- package/dist/integrations/paper.js.map +0 -1
- package/dist/integrations/pipedrive.d.ts +0 -26
- package/dist/integrations/pipedrive.js +0 -97
- package/dist/integrations/pipedrive.js.map +0 -1
- package/dist/integrations/registry.d.ts +0 -15
- package/dist/integrations/registry.js +0 -27
- package/dist/integrations/registry.js.map +0 -1
- package/dist/integrations/types.d.ts +0 -38
- package/dist/integrations/types.js +0 -9
- package/dist/integrations/types.js.map +0 -1
- package/dist/lib/lib/utils.d.ts +0 -2
- package/dist/lib/lib/utils.js +0 -6
- package/dist/lib/lib/utils.js.map +0 -1
- package/dist/mcp/connectors/asana.d.ts +0 -2
- package/dist/mcp/connectors/asana.js +0 -20
- package/dist/mcp/connectors/asana.js.map +0 -1
- package/dist/mcp/connectors/definitions.d.ts +0 -45
- package/dist/mcp/connectors/definitions.js +0 -32
- package/dist/mcp/connectors/definitions.js.map +0 -1
- package/dist/mcp/connectors/figma.d.ts +0 -5
- package/dist/mcp/connectors/figma.js +0 -21
- package/dist/mcp/connectors/figma.js.map +0 -1
- package/dist/mcp/connectors/gdrive.d.ts +0 -2
- package/dist/mcp/connectors/gdrive.js +0 -20
- package/dist/mcp/connectors/gdrive.js.map +0 -1
- package/dist/mcp/connectors/granola.d.ts +0 -2
- package/dist/mcp/connectors/granola.js +0 -12
- package/dist/mcp/connectors/granola.js.map +0 -1
- package/dist/mcp/connectors/linear.d.ts +0 -2
- package/dist/mcp/connectors/linear.js +0 -19
- package/dist/mcp/connectors/linear.js.map +0 -1
- package/dist/mcp/connectors/obsidian.d.ts +0 -2
- package/dist/mcp/connectors/obsidian.js +0 -19
- package/dist/mcp/connectors/obsidian.js.map +0 -1
- package/dist/mcp/connectors/pipedrive.d.ts +0 -2
- package/dist/mcp/connectors/pipedrive.js +0 -20
- package/dist/mcp/connectors/pipedrive.js.map +0 -1
- package/dist/mcp/connectors/slack.d.ts +0 -2
- package/dist/mcp/connectors/slack.js +0 -21
- package/dist/mcp/connectors/slack.js.map +0 -1
- package/dist/mcp/server-oauth-provider.d.ts +0 -56
- package/dist/mcp/server-oauth-provider.js +0 -142
- package/dist/mcp/server-oauth-provider.js.map +0 -1
- package/dist/server/chrome/chrome.css +0 -691
- package/dist/server/chrome/chrome.js +0 -374
- package/dist/server/collab-authority.d.ts +0 -70
- package/dist/server/collab-authority.js +0 -218
- package/dist/server/collab-authority.js.map +0 -1
- package/dist/server/collab.d.ts +0 -29
- package/dist/server/collab.js +0 -195
- package/dist/server/collab.js.map +0 -1
- package/dist/server/commit-scheduler.d.ts +0 -39
- package/dist/server/commit-scheduler.js +0 -113
- package/dist/server/commit-scheduler.js.map +0 -1
- package/dist/server/plugin-loader.d.ts +0 -53
- package/dist/server/plugin-loader.js +0 -155
- package/dist/server/plugin-loader.js.map +0 -1
- package/dist/server/routes/collab.d.ts +0 -6
- package/dist/server/routes/collab.js +0 -10
- package/dist/server/routes/collab.js.map +0 -1
- package/dist/server/routes/git-api.d.ts +0 -9
- package/dist/server/routes/git-api.js +0 -82
- package/dist/server/routes/git-api.js.map +0 -1
- package/dist/server/routes/meeting-ingest-api.d.ts +0 -15
- package/dist/server/routes/meeting-ingest-api.js +0 -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
|
@@ -3,18 +3,43 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Pull and push changes across the workspace:
|
|
5
5
|
* - the .studiograph config repo (if it has a git remote)
|
|
6
|
-
* - each entity
|
|
6
|
+
* - each entity folder that is a git repo with a remote
|
|
7
7
|
*
|
|
8
8
|
* Works with both GitHub remotes and the embedded git server.
|
|
9
9
|
*/
|
|
10
10
|
import { Command } from 'commander';
|
|
11
|
-
import { log, outro
|
|
12
|
-
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'fs';
|
|
11
|
+
import { log, outro } from '@clack/prompts';
|
|
12
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'fs';
|
|
13
13
|
import { join } from 'path';
|
|
14
14
|
import { Workspace } from '../../core/workspace.js';
|
|
15
15
|
import { AuthService } from '../../services/auth-service.js';
|
|
16
16
|
import { ConnectorManager } from '../../mcp/connector-manager.js';
|
|
17
|
-
import {
|
|
17
|
+
import { buildConfigBundle } from '../../core/secrets/bundle.js';
|
|
18
|
+
import { gitClone, gitPull, gitPush, gitPushWithCredentials, gitSetRemote, gitHasRemote } from '../../utils/git.js';
|
|
19
|
+
import { getStudiographToken } from '../../core/user-config.js';
|
|
20
|
+
// Owner-only admin escalation header for embedded-git operations. The server
|
|
21
|
+
// lifts the personal-folder restriction only when the caller is the workspace
|
|
22
|
+
// owner (access-control.ts: `includePrivate` is gated to owners and is a no-op
|
|
23
|
+
// for everyone else). `pull`/`push` are owner-CLI commands, so we send it
|
|
24
|
+
// unconditionally — non-owners get no extra access, and the owner can sync
|
|
25
|
+
// other users' private folders during migrations / offboarding. Without it the
|
|
26
|
+
// server returns 404 for any folder the caller doesn't personally own, even
|
|
27
|
+
// the workspace owner. `studiograph clone` sends the same header for the
|
|
28
|
+
// same reason, so clone/pull/push stay consistent.
|
|
29
|
+
const OWNER_INCLUDE_PRIVATE_HEADERS = ['X-Studiograph-Include-Private: 1'];
|
|
30
|
+
function resolveRemoteAuth(base, opts) {
|
|
31
|
+
const token = opts.token?.trim() || process.env.STUDIOGRAPH_TOKEN?.trim() || getStudiographToken(base);
|
|
32
|
+
if (!token) {
|
|
33
|
+
throw new Error(`No API token for ${base}. Run \`studiograph admin token issue ${base}\` to mint one, or pass --token / STUDIOGRAPH_TOKEN.`);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
// Both the main API middleware (server/index.ts) and the git-http handler
|
|
37
|
+
// (routes/git-http.ts authenticateBasic) accept Bearer + Basic with an
|
|
38
|
+
// sg_ token, so one token → one set of headers, no dual-format gymnastics.
|
|
39
|
+
httpHeader: { Authorization: `Bearer ${token}` },
|
|
40
|
+
gitCredentials: { username: '_token_', password: token },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
18
43
|
async function getRepoEntries(workspace, workspaceRoot) {
|
|
19
44
|
const entries = [];
|
|
20
45
|
// The .studiograph config directory is itself a git repo (when GitHub-provisioned)
|
|
@@ -24,8 +49,15 @@ async function getRepoEntries(workspace, workspaceRoot) {
|
|
|
24
49
|
}
|
|
25
50
|
const config = await workspace.loadConfig();
|
|
26
51
|
for (const repo of config.repos) {
|
|
27
|
-
|
|
28
|
-
|
|
52
|
+
// Personal folders are excluded ONLY on this fallback path, which pushes
|
|
53
|
+
// to whatever git remote was manually wired up — typically a third-party
|
|
54
|
+
// host (GitHub, etc.) with no Studiograph permission layer to gate
|
|
55
|
+
// access. Pushing a personal folder there would leak private content to
|
|
56
|
+
// an ungated remote. The Studiograph-server paths (pull/pushRemoteData,
|
|
57
|
+
// the server-aware push) DO sync personal folders, because git-http
|
|
58
|
+
// gates them by owner.
|
|
59
|
+
if (repo.personal)
|
|
60
|
+
continue;
|
|
29
61
|
const repoPath = join(workspaceRoot, repo.path);
|
|
30
62
|
if (!isGitRepo(repoPath) || !gitHasRemote(repoPath))
|
|
31
63
|
continue;
|
|
@@ -42,7 +74,7 @@ function isGitRepo(path) {
|
|
|
42
74
|
function logManualGuidance(entryPath) {
|
|
43
75
|
log.info(` cd ${entryPath} && git pull --rebase`);
|
|
44
76
|
}
|
|
45
|
-
async function pullRemoteConfig(remoteUrl) {
|
|
77
|
+
async function pullRemoteConfig(remoteUrl, includeData = false, authOpts = {}) {
|
|
46
78
|
const workspace = new Workspace();
|
|
47
79
|
if (!workspace.isWorkspace()) {
|
|
48
80
|
console.error('❌ Not a Studiograph workspace. Run `studiograph init` first.');
|
|
@@ -50,72 +82,49 @@ async function pullRemoteConfig(remoteUrl) {
|
|
|
50
82
|
return;
|
|
51
83
|
}
|
|
52
84
|
const base = remoteUrl.replace(/\/+$/, '');
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
process.exit(0);
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
const password = await passwordPrompt({ message: 'Password:' });
|
|
61
|
-
if (typeof password === 'symbol') {
|
|
62
|
-
outro('Cancelled');
|
|
63
|
-
process.exit(0);
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
// Login to get session token
|
|
67
|
-
log.info('Authenticating...');
|
|
68
|
-
let token;
|
|
85
|
+
const workspaceRoot = workspace.getWorkspacePath();
|
|
86
|
+
const sgDir = join(workspaceRoot, '.studiograph');
|
|
87
|
+
// Resolve authentication — sg_ token only (Phase C5).
|
|
88
|
+
let auth;
|
|
69
89
|
try {
|
|
70
|
-
|
|
71
|
-
method: 'POST',
|
|
72
|
-
headers: { 'Content-Type': 'application/json' },
|
|
73
|
-
body: JSON.stringify({ email, password }),
|
|
74
|
-
});
|
|
75
|
-
if (!loginRes.ok) {
|
|
76
|
-
const body = await loginRes.json().catch(() => ({}));
|
|
77
|
-
outro(`Login failed: ${body.error || loginRes.statusText}`);
|
|
78
|
-
process.exit(1);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
const cookies = loginRes.headers.getSetCookie?.() ?? [];
|
|
82
|
-
const tokenCookie = cookies.find(c => c.startsWith('__sg_token='));
|
|
83
|
-
if (!tokenCookie) {
|
|
84
|
-
outro('Login succeeded but no session cookie was returned');
|
|
85
|
-
process.exit(1);
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
token = tokenCookie.split(';')[0];
|
|
90
|
+
auth = resolveRemoteAuth(base, authOpts);
|
|
89
91
|
}
|
|
90
92
|
catch (err) {
|
|
91
|
-
outro(
|
|
93
|
+
outro(err.message);
|
|
92
94
|
process.exit(1);
|
|
93
95
|
return;
|
|
94
96
|
}
|
|
95
97
|
// Fetch config bundle (fall back to auth seed for older servers)
|
|
96
98
|
log.info('Fetching workspace config...');
|
|
97
|
-
const workspaceRoot = workspace.getWorkspacePath();
|
|
98
|
-
const sgDir = join(workspaceRoot, '.studiograph');
|
|
99
99
|
try {
|
|
100
100
|
const bundleRes = await fetch(`${base}/api/config/bundle`, {
|
|
101
|
-
headers:
|
|
101
|
+
headers: auth.httpHeader,
|
|
102
102
|
});
|
|
103
103
|
if (bundleRes.ok) {
|
|
104
104
|
const bundle = await bundleRes.json();
|
|
105
|
-
// 1. Auth seed
|
|
105
|
+
// 1. Auth seed — remote is authoritative for pull, so overwrite any
|
|
106
|
+
// local-shadow rows (e.g. post-clone setup-wizard credentials that
|
|
107
|
+
// would otherwise shadow the real production password_hash).
|
|
106
108
|
writeFileSync(join(sgDir, 'auth-seed.json'), JSON.stringify(bundle.authSeed, null, 2), 'utf-8');
|
|
107
|
-
|
|
108
|
-
|
|
109
|
+
// AuthService appends `.studiograph` to the path it's given —
|
|
110
|
+
// pass workspace root, not `sgDir`, or we end up with
|
|
111
|
+
// `.studiograph/.studiograph/auth.db` (disjoint from the running server).
|
|
112
|
+
const authService = new AuthService(workspaceRoot);
|
|
113
|
+
authService.applySeed({ mode: 'overwrite' });
|
|
109
114
|
authService.close();
|
|
110
115
|
log.success(`Team: ${bundle.authSeed.users.length} user${bundle.authSeed.users.length === 1 ? '' : 's'}`);
|
|
111
|
-
// 2. Workspace config — merge: keep local-only fields (server_url), update shared fields
|
|
116
|
+
// 2. Workspace config — merge: keep local-only fields (server_url), update shared fields.
|
|
117
|
+
//
|
|
118
|
+
// Phase 9b: route through `workspace.writeConfig()` so this CLI
|
|
119
|
+
// pull path shares the same schema validator + dual-write seam as
|
|
120
|
+
// every other writer.
|
|
112
121
|
if (bundle.workspace) {
|
|
113
122
|
const local = await workspace.loadConfig().catch(() => ({}));
|
|
114
123
|
const merged = { ...local, ...bundle.workspace };
|
|
115
124
|
if (local.server_url)
|
|
116
125
|
merged.server_url = local.server_url;
|
|
117
|
-
|
|
118
|
-
log.success(`Workspace config: ${bundle.workspace.repos?.length ?? 0}
|
|
126
|
+
workspace.writeConfig(merged);
|
|
127
|
+
log.success(`Workspace config: ${bundle.workspace.repos?.length ?? 0} folder${(bundle.workspace.repos?.length ?? 0) === 1 ? '' : 's'}`);
|
|
119
128
|
}
|
|
120
129
|
// 3. ABOUT.md
|
|
121
130
|
if (bundle.about !== null && bundle.about !== undefined) {
|
|
@@ -132,21 +141,33 @@ async function pullRemoteConfig(remoteUrl) {
|
|
|
132
141
|
}
|
|
133
142
|
log.success(`Sources: ${sourceNames.join(', ')}`);
|
|
134
143
|
}
|
|
135
|
-
// 5. Connectors (sanitized — no secrets)
|
|
144
|
+
// 5. Connectors (sanitized — no secrets).
|
|
145
|
+
//
|
|
146
|
+
// Phase 9b: route through `ConnectorManager.saveWorkspaceConfig` so
|
|
147
|
+
// every connector save runs the same schema validator + stripSecrets
|
|
148
|
+
// pass. The bundle is already sanitized server-side; the re-strip
|
|
149
|
+
// is idempotent and preserves the single-seam invariant.
|
|
136
150
|
if (bundle.connectors && bundle.connectors.length > 0) {
|
|
137
|
-
const connectorsDir = join(sgDir, 'connectors');
|
|
138
|
-
mkdirSync(connectorsDir, { recursive: true });
|
|
139
151
|
for (const conn of bundle.connectors) {
|
|
140
|
-
|
|
152
|
+
ConnectorManager.saveWorkspaceConfig(conn, workspaceRoot);
|
|
141
153
|
}
|
|
142
154
|
log.success(`Connectors: ${bundle.connectors.map(c => c.name).join(', ')}`);
|
|
143
155
|
}
|
|
144
|
-
|
|
156
|
+
// Pull workspace data (markdown files) if requested
|
|
157
|
+
if (includeData) {
|
|
158
|
+
try {
|
|
159
|
+
await pullRemoteData(base, auth, workspaceRoot);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
log.error(`Data pull failed: ${err.message}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
outro(`Pulled from ${base}${includeData ? ' (config + data)' : ' (config)'}`);
|
|
145
166
|
}
|
|
146
167
|
else if (bundleRes.status === 404) {
|
|
147
168
|
// Older server — fall back to auth seed only
|
|
148
169
|
log.info('Server does not support config bundle, falling back to auth seed...');
|
|
149
|
-
const seedRes = await fetch(`${base}/api/auth/seed`, { headers:
|
|
170
|
+
const seedRes = await fetch(`${base}/api/auth/seed`, { headers: auth.httpHeader });
|
|
150
171
|
if (!seedRes.ok) {
|
|
151
172
|
const body = await seedRes.json().catch(() => ({}));
|
|
152
173
|
outro(`Failed to fetch seed: ${body.error || seedRes.statusText}`);
|
|
@@ -155,8 +176,9 @@ async function pullRemoteConfig(remoteUrl) {
|
|
|
155
176
|
}
|
|
156
177
|
const seed = await seedRes.json();
|
|
157
178
|
writeFileSync(join(sgDir, 'auth-seed.json'), JSON.stringify(seed, null, 2), 'utf-8');
|
|
158
|
-
|
|
159
|
-
authService
|
|
179
|
+
// AuthService appends `.studiograph` — pass workspace root, not `sgDir`.
|
|
180
|
+
const authService = new AuthService(workspaceRoot);
|
|
181
|
+
authService.applySeed({ mode: 'overwrite' });
|
|
160
182
|
authService.close();
|
|
161
183
|
outro(`Pulled ${seed.users.length} user${seed.users.length === 1 ? '' : 's'} from ${base}`);
|
|
162
184
|
}
|
|
@@ -167,17 +189,160 @@ async function pullRemoteConfig(remoteUrl) {
|
|
|
167
189
|
}
|
|
168
190
|
}
|
|
169
191
|
catch (err) {
|
|
192
|
+
// Phase 9c: surface SchemaViolationError with its redaction-safe
|
|
193
|
+
// message (field path + classification, no values). The error class
|
|
194
|
+
// is detected by name to avoid pulling the schemas module into the
|
|
195
|
+
// CLI bundle import graph just for an instanceof check.
|
|
196
|
+
if (err?.name === 'SchemaViolationError' || err?.code === 'schema_violation') {
|
|
197
|
+
outro(`Schema violation:\n${err.message}`);
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
170
200
|
outro(`Failed: ${err.message}`);
|
|
171
201
|
process.exit(1);
|
|
172
202
|
}
|
|
173
203
|
}
|
|
204
|
+
// ─── Remote data pull (git-based) ───────────────────────────────────────────
|
|
205
|
+
// Clones or pulls each folder from the remote's embedded git HTTP server
|
|
206
|
+
// (/git/:repo). Uses git's native conflict detection — diverged folders
|
|
207
|
+
// are reported, not silently overwritten.
|
|
208
|
+
async function pullRemoteData(base, auth, workspaceRoot) {
|
|
209
|
+
// Reload config — it was just updated by pullRemoteConfig
|
|
210
|
+
const workspace = new Workspace(workspaceRoot);
|
|
211
|
+
const config = await workspace.loadConfig();
|
|
212
|
+
let cloned = 0, updated = 0, upToDate = 0, diverged = 0, errors = 0;
|
|
213
|
+
for (const repo of config.repos) {
|
|
214
|
+
const repoPath = join(workspaceRoot, repo.path);
|
|
215
|
+
const remoteUrl = `${base}/git/${repo.name}`;
|
|
216
|
+
// Clone if missing
|
|
217
|
+
if (!existsSync(join(repoPath, '.git'))) {
|
|
218
|
+
try {
|
|
219
|
+
if (existsSync(repoPath))
|
|
220
|
+
rmSync(repoPath, { recursive: true, force: true });
|
|
221
|
+
mkdirSync(repoPath, { recursive: true });
|
|
222
|
+
gitClone(remoteUrl, repoPath, { silent: true, credentials: auth.gitCredentials, extraHeaders: OWNER_INCLUDE_PRIVATE_HEADERS });
|
|
223
|
+
log.success(`${repo.name}: cloned`);
|
|
224
|
+
cloned++;
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
log.error(`${repo.name}: clone failed — ${err.message}`);
|
|
228
|
+
errors++;
|
|
229
|
+
}
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
// Ensure remote points at the requested server (may have been cloned elsewhere)
|
|
233
|
+
try {
|
|
234
|
+
gitSetRemote(repoPath, remoteUrl);
|
|
235
|
+
}
|
|
236
|
+
catch { /* non-fatal */ }
|
|
237
|
+
try {
|
|
238
|
+
const result = gitPull(repoPath, { credentials: auth.gitCredentials, extraHeaders: OWNER_INCLUDE_PRIVATE_HEADERS });
|
|
239
|
+
if (result === 'updated') {
|
|
240
|
+
log.success(`${repo.name}: updated`);
|
|
241
|
+
updated++;
|
|
242
|
+
}
|
|
243
|
+
else if (result === 'up-to-date') {
|
|
244
|
+
upToDate++;
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
log.warn(`${repo.name}: diverged — has local commits not on the server`);
|
|
248
|
+
log.info(` cd ${repoPath} && git pull --rebase`);
|
|
249
|
+
diverged++;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
log.error(`${repo.name}: ${err.message}`);
|
|
254
|
+
errors++;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
log.info(`Data: ${cloned} cloned, ${updated} updated, ${upToDate} up to date${diverged ? `, ${diverged} diverged` : ''}${errors ? `, ${errors} failed` : ''}`);
|
|
258
|
+
if (diverged) {
|
|
259
|
+
throw new Error('One or more folders diverged — resolve conflicts and retry');
|
|
260
|
+
}
|
|
261
|
+
if (errors) {
|
|
262
|
+
throw new Error('One or more folders failed to pull');
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// ─── Remote data push (git-based) ───────────────────────────────────────────
|
|
266
|
+
// Pushes each local folder to the remote's embedded git HTTP server.
|
|
267
|
+
// Uses git's native conflict detection — rejected pushes require a pull first.
|
|
268
|
+
async function pushRemoteData(base, auth, workspace, workspaceRoot) {
|
|
269
|
+
const config = await workspace.loadConfig();
|
|
270
|
+
let pushed = 0, nothingToPush = 0, created = 0, rejected = 0, errors = 0;
|
|
271
|
+
for (const repo of config.repos) {
|
|
272
|
+
const repoPath = join(workspaceRoot, repo.path);
|
|
273
|
+
if (!existsSync(join(repoPath, '.git'))) {
|
|
274
|
+
log.warn(`${repo.name}: not a git repo — skipping`);
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
try {
|
|
278
|
+
// Ensure folder exists on remote (idempotent; 409 means it already exists).
|
|
279
|
+
// Skip for personal folders: they're auto-provisioned server-side on login
|
|
280
|
+
// (auth-api.ts#ensurePrivateFolder), and the POST /api/repos shared-folder
|
|
281
|
+
// path rejects reserved `entries-<id>` names. Detect by flag OR name
|
|
282
|
+
// pattern: clone now preserves `personal` (see clone.ts), so the flag is
|
|
283
|
+
// authoritative for freshly-cloned workspaces — the name-pattern check is
|
|
284
|
+
// a fallback for workspaces cloned before that fix landed. Mirrors the
|
|
285
|
+
// server-aware push below.
|
|
286
|
+
const skipServerFolderEnsure = !!repo.personal || /^entries-\d+$/.test(repo.name);
|
|
287
|
+
if (!skipServerFolderEnsure) {
|
|
288
|
+
const status = await ensureServerFolder(base, repo.name, !!repo.personal, auth.httpHeader);
|
|
289
|
+
if (status === 'created') {
|
|
290
|
+
log.info(`${repo.name}: created on server`);
|
|
291
|
+
created++;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// Point origin at the remote's git server
|
|
295
|
+
gitSetRemote(repoPath, `${base}/git/${repo.name}`);
|
|
296
|
+
// Push with credentials + owner escalation (so the owner can push to
|
|
297
|
+
// any folder, including other users' private ones, during a migration).
|
|
298
|
+
const result = gitPushWithCredentials(repoPath, auth.gitCredentials, { extraHeaders: OWNER_INCLUDE_PRIVATE_HEADERS });
|
|
299
|
+
if (result === 'rejected') {
|
|
300
|
+
log.warn(`${repo.name}: push rejected — run \`studiograph pull --server ${base} --data\` first`);
|
|
301
|
+
rejected++;
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
if (result === 'not-found') {
|
|
305
|
+
log.warn(`${repo.name}: skipped — folder does not exist on the server (stale local clone; safe to remove locally)`);
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
if (result === 'pushed') {
|
|
309
|
+
log.success(`${repo.name}: pushed`);
|
|
310
|
+
pushed++;
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
nothingToPush++;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
log.error(`${repo.name}: ${err.message}`);
|
|
318
|
+
errors++;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
log.info(`Data: ${pushed} pushed${created ? `, ${created} created` : ''}, ${nothingToPush} unchanged${rejected ? `, ${rejected} rejected` : ''}${errors ? `, ${errors} failed` : ''}`);
|
|
322
|
+
if (rejected) {
|
|
323
|
+
throw new Error('One or more folders were rejected — pull and retry');
|
|
324
|
+
}
|
|
325
|
+
if (errors) {
|
|
326
|
+
throw new Error('One or more folders failed to push');
|
|
327
|
+
}
|
|
328
|
+
}
|
|
174
329
|
// ─── pull ─────────────────────────────────────────────────────────────────────
|
|
175
330
|
export const pullCommand = new Command('pull')
|
|
176
331
|
.description('Pull latest changes from remote across the workspace')
|
|
177
|
-
.option('--
|
|
332
|
+
.option('--server <url>', 'Pull config from a remote Studiograph server')
|
|
333
|
+
// `--remote` is a hidden alias kept for one release; remove in the next.
|
|
334
|
+
// See cli-owner-audit §C5. Owner CLI is now the only caller, but scripts
|
|
335
|
+
// and muscle memory may still reach for the old name.
|
|
336
|
+
.option('--remote <url>', 'Deprecated alias for --server (removed in the next release)', undefined)
|
|
337
|
+
.option('--data', 'Also pull workspace folder data (markdown files) from the remote server')
|
|
338
|
+
.option('--token <token>', 'sg_ API token (also reads STUDIOGRAPH_TOKEN; mint via `studiograph admin token issue <url>`)')
|
|
178
339
|
.action(async (opts) => {
|
|
179
|
-
|
|
180
|
-
|
|
340
|
+
const flagServer = opts.server ?? opts.remote;
|
|
341
|
+
if (opts.remote && !opts.server) {
|
|
342
|
+
log.warn('`--remote` is deprecated, use `--server` instead.');
|
|
343
|
+
}
|
|
344
|
+
if (flagServer) {
|
|
345
|
+
return pullRemoteConfig(flagServer, opts.data, { token: opts.token });
|
|
181
346
|
}
|
|
182
347
|
const workspace = new Workspace();
|
|
183
348
|
if (!workspace.isWorkspace()) {
|
|
@@ -203,13 +368,21 @@ export const pullCommand = new Command('pull')
|
|
|
203
368
|
else if (result === 'up-to-date') {
|
|
204
369
|
log.info('.studiograph: already up to date');
|
|
205
370
|
}
|
|
371
|
+
else {
|
|
372
|
+
// Diverged / any other non-clean state — surface it the same way
|
|
373
|
+
// the folder loop does so the user actually sees the problem
|
|
374
|
+
// instead of walking into a silent no-op.
|
|
375
|
+
log.warn('.studiograph: diverged — has local commits not on the server');
|
|
376
|
+
logManualGuidance(configPath);
|
|
377
|
+
hasConflict = true;
|
|
378
|
+
}
|
|
206
379
|
}
|
|
207
380
|
catch (error) {
|
|
208
381
|
log.error(`.studiograph: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
209
382
|
hasError = true;
|
|
210
383
|
}
|
|
211
384
|
}
|
|
212
|
-
// ── Step 2: reload config — picks up any new
|
|
385
|
+
// ── Step 2: reload config — picks up any new folders added server-side ─
|
|
213
386
|
// Must use a fresh Workspace instance — loadConfig() caches this.config on
|
|
214
387
|
// first call, so the original instance would return stale data after the pull.
|
|
215
388
|
const freshWorkspace = new Workspace(workspaceRoot);
|
|
@@ -220,13 +393,12 @@ export const pullCommand = new Command('pull')
|
|
|
220
393
|
freshWorkspace.writeConfig(config);
|
|
221
394
|
}
|
|
222
395
|
const serverUrl = (config.server_url ?? savedServerUrl)?.replace(/\/+$/, '');
|
|
223
|
-
// ── Step 3: pull or clone each
|
|
396
|
+
// ── Step 3: pull or clone each folder ────────────────────────────────
|
|
224
397
|
// Resolve git credentials for the embedded server:
|
|
225
398
|
// 1. Stored JWT from `studiograph join` — per-user access control (preferred)
|
|
226
|
-
// 2. API
|
|
399
|
+
// 2. Stored personal API token from ~/.studiograph/user.json
|
|
227
400
|
let serverGitCredentials;
|
|
228
401
|
if (serverUrl) {
|
|
229
|
-
// Try stored JWT first (saved by studiograph join)
|
|
230
402
|
const serverAuthPath = join(workspaceRoot, '.studiograph', 'server-auth.json');
|
|
231
403
|
if (existsSync(serverAuthPath)) {
|
|
232
404
|
try {
|
|
@@ -237,29 +409,20 @@ export const pullCommand = new Command('pull')
|
|
|
237
409
|
}
|
|
238
410
|
catch { /* non-fatal */ }
|
|
239
411
|
}
|
|
240
|
-
// Fall back to API key (used by workspace owners who set up with `studiograph serve`)
|
|
241
412
|
if (!serverGitCredentials) {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
const seed = JSON.parse(readFileSync(seedPath, 'utf-8'));
|
|
246
|
-
const apiKey = seed.apiKey;
|
|
247
|
-
if (apiKey)
|
|
248
|
-
serverGitCredentials = { username: '_apikey_', password: apiKey };
|
|
249
|
-
}
|
|
413
|
+
const storedToken = getStudiographToken(serverUrl);
|
|
414
|
+
if (storedToken) {
|
|
415
|
+
serverGitCredentials = { username: '_token_', password: storedToken };
|
|
250
416
|
}
|
|
251
|
-
catch { /* non-fatal */ }
|
|
252
417
|
}
|
|
253
418
|
}
|
|
254
419
|
for (const repo of config.repos) {
|
|
255
|
-
if (repo.private)
|
|
256
|
-
continue;
|
|
257
420
|
const repoPath = join(workspaceRoot, repo.path);
|
|
258
|
-
// New
|
|
421
|
+
// New folder — directory missing or exists but isn't a git repo (e.g. failed clone)
|
|
259
422
|
if (!isGitRepo(repoPath)) {
|
|
260
423
|
const cloneUrl = serverUrl ? `${serverUrl}/git/${repo.name}` : null;
|
|
261
424
|
if (!cloneUrl) {
|
|
262
|
-
log.warn(`${repo.name}: new
|
|
425
|
+
log.warn(`${repo.name}: new folder has no remote — skipping`);
|
|
263
426
|
continue;
|
|
264
427
|
}
|
|
265
428
|
try {
|
|
@@ -269,7 +432,11 @@ export const pullCommand = new Command('pull')
|
|
|
269
432
|
if (existsSync(repoPath))
|
|
270
433
|
rmSync(repoPath, { recursive: true, force: true });
|
|
271
434
|
mkdirSync(repoPath, { recursive: true });
|
|
272
|
-
gitClone(cloneUrl, repoPath, {
|
|
435
|
+
gitClone(cloneUrl, repoPath, {
|
|
436
|
+
silent: true,
|
|
437
|
+
credentials: serverGitCredentials,
|
|
438
|
+
extraHeaders: OWNER_INCLUDE_PRIVATE_HEADERS,
|
|
439
|
+
});
|
|
273
440
|
log.success(`${repo.name}: cloned`);
|
|
274
441
|
}
|
|
275
442
|
catch (error) {
|
|
@@ -278,11 +445,14 @@ export const pullCommand = new Command('pull')
|
|
|
278
445
|
}
|
|
279
446
|
continue;
|
|
280
447
|
}
|
|
281
|
-
// Existing
|
|
448
|
+
// Existing folder — pull if it has a remote
|
|
282
449
|
if (!isGitRepo(repoPath) || !gitHasRemote(repoPath))
|
|
283
450
|
continue;
|
|
284
451
|
try {
|
|
285
|
-
const result = gitPull(repoPath, {
|
|
452
|
+
const result = gitPull(repoPath, {
|
|
453
|
+
credentials: serverGitCredentials,
|
|
454
|
+
extraHeaders: OWNER_INCLUDE_PRIVATE_HEADERS,
|
|
455
|
+
});
|
|
286
456
|
if (result === 'updated') {
|
|
287
457
|
log.success(`${repo.name}: updated`);
|
|
288
458
|
}
|
|
@@ -300,12 +470,15 @@ export const pullCommand = new Command('pull')
|
|
|
300
470
|
hasError = true;
|
|
301
471
|
}
|
|
302
472
|
}
|
|
303
|
-
// Apply auth seed if it was updated by pulling .studiograph
|
|
473
|
+
// Apply auth seed if it was updated by pulling .studiograph.
|
|
474
|
+
// Overwrite mode: the seed file just came from the remote config repo
|
|
475
|
+
// and is authoritative over any local-shadow rows.
|
|
304
476
|
const seedPath = join(workspaceRoot, '.studiograph', 'auth-seed.json');
|
|
305
477
|
if (existsSync(seedPath)) {
|
|
306
478
|
try {
|
|
307
|
-
|
|
308
|
-
authService
|
|
479
|
+
// AuthService appends `.studiograph` — pass workspace root.
|
|
480
|
+
const authService = new AuthService(workspaceRoot);
|
|
481
|
+
authService.applySeed({ mode: 'overwrite' });
|
|
309
482
|
authService.close();
|
|
310
483
|
}
|
|
311
484
|
catch {
|
|
@@ -317,12 +490,12 @@ export const pullCommand = new Command('pull')
|
|
|
317
490
|
process.exit(1);
|
|
318
491
|
}
|
|
319
492
|
else if (hasError) {
|
|
320
|
-
outro('❌ Pull failed for one or more
|
|
493
|
+
outro('❌ Pull failed for one or more folders.');
|
|
321
494
|
process.exit(1);
|
|
322
495
|
}
|
|
323
496
|
});
|
|
324
497
|
// ─── Remote config push ─────────────────────────────────────────────────────
|
|
325
|
-
async function pushRemoteConfig(remoteUrl) {
|
|
498
|
+
async function pushRemoteConfig(remoteUrl, includeData = false, authOpts = {}) {
|
|
326
499
|
const workspace = new Workspace();
|
|
327
500
|
if (!workspace.isWorkspace()) {
|
|
328
501
|
console.error('❌ Not a Studiograph workspace. Run `studiograph init` first.');
|
|
@@ -332,45 +505,13 @@ async function pushRemoteConfig(remoteUrl) {
|
|
|
332
505
|
const base = remoteUrl.replace(/\/+$/, '');
|
|
333
506
|
const workspaceRoot = workspace.getWorkspacePath();
|
|
334
507
|
const sgDir = join(workspaceRoot, '.studiograph');
|
|
335
|
-
//
|
|
336
|
-
|
|
337
|
-
if (typeof email === 'symbol') {
|
|
338
|
-
outro('Cancelled');
|
|
339
|
-
process.exit(0);
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
const password = await passwordPrompt({ message: 'Password:' });
|
|
343
|
-
if (typeof password === 'symbol') {
|
|
344
|
-
outro('Cancelled');
|
|
345
|
-
process.exit(0);
|
|
346
|
-
return;
|
|
347
|
-
}
|
|
348
|
-
// Login
|
|
349
|
-
log.info('Authenticating...');
|
|
350
|
-
let token;
|
|
508
|
+
// Resolve authentication — sg_ token only (Phase C5).
|
|
509
|
+
let auth;
|
|
351
510
|
try {
|
|
352
|
-
|
|
353
|
-
method: 'POST',
|
|
354
|
-
headers: { 'Content-Type': 'application/json' },
|
|
355
|
-
body: JSON.stringify({ email, password }),
|
|
356
|
-
});
|
|
357
|
-
if (!loginRes.ok) {
|
|
358
|
-
const body = await loginRes.json().catch(() => ({}));
|
|
359
|
-
outro(`Login failed: ${body.error || loginRes.statusText}`);
|
|
360
|
-
process.exit(1);
|
|
361
|
-
return;
|
|
362
|
-
}
|
|
363
|
-
const cookies = loginRes.headers.getSetCookie?.() ?? [];
|
|
364
|
-
const tokenCookie = cookies.find(c => c.startsWith('__sg_token='));
|
|
365
|
-
if (!tokenCookie) {
|
|
366
|
-
outro('Login succeeded but no session cookie was returned');
|
|
367
|
-
process.exit(1);
|
|
368
|
-
return;
|
|
369
|
-
}
|
|
370
|
-
token = tokenCookie.split(';')[0];
|
|
511
|
+
auth = resolveRemoteAuth(base, authOpts);
|
|
371
512
|
}
|
|
372
513
|
catch (err) {
|
|
373
|
-
outro(
|
|
514
|
+
outro(err.message);
|
|
374
515
|
process.exit(1);
|
|
375
516
|
return;
|
|
376
517
|
}
|
|
@@ -402,13 +543,24 @@ async function pushRemoteConfig(remoteUrl) {
|
|
|
402
543
|
}
|
|
403
544
|
// Connectors (workspace-level, already sanitized)
|
|
404
545
|
const connectors = ConnectorManager.loadWorkspaceConfigs(workspaceRoot);
|
|
405
|
-
|
|
546
|
+
// Phase 3: route the bundle through the same sanitizer the server's
|
|
547
|
+
// GET /api/config/bundle endpoint uses. CLI push and server export now
|
|
548
|
+
// produce byte-identical output for the same workspace state — bootstrap
|
|
549
|
+
// class fields (jwtSecret, deprecated apiKey) drop here so the POST
|
|
550
|
+
// endpoint's strict-reject doesn't bounce older client builds.
|
|
551
|
+
const bundle = buildConfigBundle({
|
|
552
|
+
workspace: config,
|
|
553
|
+
about,
|
|
554
|
+
authSeed: (authSeed ?? { users: [] }),
|
|
555
|
+
sources,
|
|
556
|
+
connectors: connectors,
|
|
557
|
+
});
|
|
406
558
|
// Push to remote
|
|
407
559
|
log.info('Pushing config...');
|
|
408
560
|
try {
|
|
409
561
|
const res = await fetch(`${base}/api/config/bundle`, {
|
|
410
562
|
method: 'POST',
|
|
411
|
-
headers: { 'Content-Type': 'application/json'
|
|
563
|
+
headers: { ...auth.httpHeader, 'Content-Type': 'application/json' },
|
|
412
564
|
body: JSON.stringify(bundle),
|
|
413
565
|
});
|
|
414
566
|
if (!res.ok) {
|
|
@@ -423,7 +575,16 @@ async function pushRemoteConfig(remoteUrl) {
|
|
|
423
575
|
log.success(item);
|
|
424
576
|
}
|
|
425
577
|
}
|
|
426
|
-
|
|
578
|
+
// Push workspace data (markdown files) if requested
|
|
579
|
+
if (includeData) {
|
|
580
|
+
try {
|
|
581
|
+
await pushRemoteData(base, auth, workspace, workspaceRoot);
|
|
582
|
+
}
|
|
583
|
+
catch (err) {
|
|
584
|
+
log.error(`Data push failed: ${err.message}`);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
outro(`Pushed to ${base}${includeData ? ' (config + data)' : ' (config)'}`);
|
|
427
588
|
}
|
|
428
589
|
catch (err) {
|
|
429
590
|
outro(`Failed: ${err.message}`);
|
|
@@ -449,27 +610,41 @@ async function serverFetch(serverUrl, path, authHeader) {
|
|
|
449
610
|
}
|
|
450
611
|
return res.json();
|
|
451
612
|
}
|
|
452
|
-
async function
|
|
613
|
+
async function ensureServerFolder(serverUrl, repoName, isPersonal, authHeader) {
|
|
614
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
615
|
+
if (typeof authHeader === 'string') {
|
|
616
|
+
headers['Authorization'] = authHeader;
|
|
617
|
+
}
|
|
618
|
+
else {
|
|
619
|
+
Object.assign(headers, authHeader);
|
|
620
|
+
}
|
|
453
621
|
const res = await fetch(`${serverUrl}/api/repos`, {
|
|
454
622
|
method: 'POST',
|
|
455
|
-
headers
|
|
456
|
-
body: JSON.stringify({ name: repoName, ...(
|
|
623
|
+
headers,
|
|
624
|
+
body: JSON.stringify({ name: repoName, ...(isPersonal ? { personal: true } : {}) }),
|
|
457
625
|
});
|
|
458
626
|
if (res.ok)
|
|
459
627
|
return 'created';
|
|
460
628
|
if (res.status === 409)
|
|
461
629
|
return 'exists'; // already exists
|
|
462
630
|
const body = await res.json().catch(() => ({}));
|
|
463
|
-
throw new Error(body.error || `Failed to create
|
|
631
|
+
throw new Error(body.error || `Failed to create folder "${repoName}": ${res.statusText}`);
|
|
464
632
|
}
|
|
465
633
|
// ─── push ─────────────────────────────────────────────────────────────────────
|
|
466
634
|
export const pushCommand = new Command('push')
|
|
467
635
|
.description('Push local commits to remote across the workspace')
|
|
468
|
-
.argument('[
|
|
469
|
-
.option('--
|
|
470
|
-
.
|
|
471
|
-
|
|
472
|
-
|
|
636
|
+
.argument('[folder]', 'Push a specific folder (default: all)')
|
|
637
|
+
.option('--server <url>', 'Push config to a remote Studiograph server')
|
|
638
|
+
.option('--remote <url>', 'Deprecated alias for --server (removed in the next release)', undefined)
|
|
639
|
+
.option('--data', 'Also push workspace folder data (markdown files) to the remote server')
|
|
640
|
+
.option('--token <token>', 'sg_ API token (also reads STUDIOGRAPH_TOKEN; mint via `studiograph admin token issue <url>`)')
|
|
641
|
+
.action(async (folder, opts) => {
|
|
642
|
+
const flagServer = opts.server ?? opts.remote;
|
|
643
|
+
if (opts.remote && !opts.server) {
|
|
644
|
+
log.warn('`--remote` is deprecated, use `--server` instead.');
|
|
645
|
+
}
|
|
646
|
+
if (flagServer) {
|
|
647
|
+
return pushRemoteConfig(flagServer, opts.data, { token: opts.token });
|
|
473
648
|
}
|
|
474
649
|
const workspace = new Workspace();
|
|
475
650
|
if (!workspace.isWorkspace()) {
|
|
@@ -480,78 +655,47 @@ export const pushCommand = new Command('push')
|
|
|
480
655
|
const workspaceRoot = workspace.getWorkspacePath();
|
|
481
656
|
const config = await workspace.loadConfig();
|
|
482
657
|
const serverUrl = config.server_url?.replace(/\/+$/, '');
|
|
483
|
-
//
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
658
|
+
// Push every folder — shared and personal alike. Personal folders are
|
|
659
|
+
// per-user, but git-http (canAccessFolder → hasRepoAccess) gates by
|
|
660
|
+
// owner so only the owner ever succeeds; the owner CLI sends the
|
|
661
|
+
// include-private escalation, so the owner can push any of them.
|
|
662
|
+
// Server-side, personal folders are auto-provisioned on login by
|
|
663
|
+
// auth-api.ts#ensurePrivateFolder, so the per-folder ensureServerFolder()
|
|
664
|
+
// call is skipped for them below (the createSharedFolder path would
|
|
665
|
+
// reject `entries-<number>` as a reserved name even though the folder
|
|
666
|
+
// already exists).
|
|
667
|
+
let repos = config.repos;
|
|
668
|
+
if (folder) {
|
|
669
|
+
const match = repos.find(r => r.name === folder);
|
|
487
670
|
if (!match) {
|
|
488
|
-
log.error(`
|
|
671
|
+
log.error(`Folder "${folder}" not found in workspace.`);
|
|
489
672
|
process.exit(1);
|
|
490
673
|
return;
|
|
491
674
|
}
|
|
492
675
|
repos = [match];
|
|
493
676
|
}
|
|
494
|
-
// Server-aware push: workspace has a server_url (set by `studiograph
|
|
677
|
+
// Server-aware push: workspace has a `server_url` (set by `studiograph clone`).
|
|
495
678
|
if (serverUrl) {
|
|
496
|
-
//
|
|
497
|
-
let
|
|
498
|
-
let gitCredentials;
|
|
499
|
-
// 1. Stored JWT from `studiograph join` (per-user access control)
|
|
500
|
-
const pushServerAuthPath = join(workspaceRoot, '.studiograph', 'server-auth.json');
|
|
679
|
+
// sg_ token only. resolveRemoteAuth handles the "no token" error.
|
|
680
|
+
let auth;
|
|
501
681
|
try {
|
|
502
|
-
|
|
503
|
-
const sa = JSON.parse(readFileSync(pushServerAuthPath, 'utf-8'));
|
|
504
|
-
if (sa.email && sa.jwtToken) {
|
|
505
|
-
authHeader = makeBasicAuth(sa.email, sa.jwtToken);
|
|
506
|
-
gitCredentials = { username: sa.email, password: sa.jwtToken };
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
catch { /* non-fatal */ }
|
|
511
|
-
// 2. API key fallback (workspace owners who set up with `studiograph serve`)
|
|
512
|
-
if (!authHeader) {
|
|
513
|
-
try {
|
|
514
|
-
const seedPathPush = join(workspaceRoot, '.studiograph', 'auth-seed.json');
|
|
515
|
-
if (existsSync(seedPathPush)) {
|
|
516
|
-
const seed = JSON.parse(readFileSync(seedPathPush, 'utf-8'));
|
|
517
|
-
const pushApiKey = seed.apiKey;
|
|
518
|
-
if (pushApiKey) {
|
|
519
|
-
authHeader = makeBasicAuth('_apikey_', pushApiKey);
|
|
520
|
-
gitCredentials = { username: '_apikey_', password: pushApiKey };
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
catch { /* non-fatal */ }
|
|
525
|
-
}
|
|
526
|
-
// 3. Interactive credential prompt as last resort
|
|
527
|
-
if (!authHeader) {
|
|
528
|
-
const email = await text({ message: 'Email:', validate: (v) => v.includes('@') ? undefined : 'Enter a valid email' });
|
|
529
|
-
if (typeof email === 'symbol') {
|
|
530
|
-
outro('Cancelled');
|
|
531
|
-
process.exit(0);
|
|
532
|
-
return;
|
|
533
|
-
}
|
|
534
|
-
const pass = await passwordPrompt({ message: 'Password:' });
|
|
535
|
-
if (typeof pass === 'symbol') {
|
|
536
|
-
outro('Cancelled');
|
|
537
|
-
process.exit(0);
|
|
538
|
-
return;
|
|
539
|
-
}
|
|
540
|
-
authHeader = makeBasicAuth(String(email), String(pass));
|
|
541
|
-
gitCredentials = { username: String(email), password: String(pass) };
|
|
682
|
+
auth = resolveRemoteAuth(serverUrl, { token: undefined });
|
|
542
683
|
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
outro('Could not resolve credentials');
|
|
684
|
+
catch (err) {
|
|
685
|
+
outro(err.message);
|
|
546
686
|
process.exit(1);
|
|
547
687
|
return;
|
|
548
688
|
}
|
|
549
|
-
|
|
689
|
+
const authHeader = auth.httpHeader.Authorization;
|
|
690
|
+
const gitCredentials = auth.gitCredentials;
|
|
691
|
+
// Cheap probe — surfaces a 401/expired token before we touch git
|
|
692
|
+
// (which would otherwise fail with a less useful "askpass auth
|
|
693
|
+
// failed" message). One round-trip, idempotent.
|
|
550
694
|
try {
|
|
551
695
|
await serverFetch(serverUrl, '/api/workspace', authHeader);
|
|
552
696
|
}
|
|
553
697
|
catch (err) {
|
|
554
|
-
outro(`Authentication failed
|
|
698
|
+
outro(`Authentication failed (${err.message}). Run \`studiograph admin token issue ${serverUrl}\` to mint a fresh token.`);
|
|
555
699
|
process.exit(1);
|
|
556
700
|
return;
|
|
557
701
|
}
|
|
@@ -562,21 +706,43 @@ export const pushCommand = new Command('push')
|
|
|
562
706
|
log.warn(`${repo.name}: not a git repo, skipping`);
|
|
563
707
|
continue;
|
|
564
708
|
}
|
|
709
|
+
// Personal folders skip the /api/repos POST. Detection has TWO
|
|
710
|
+
// sources: the `personal` flag (clone now preserves it — see
|
|
711
|
+
// clone.ts) and the reserved name pattern as a fallback for
|
|
712
|
+
// workspaces cloned before that fix, whose workspace.json carries a
|
|
713
|
+
// thin repo record without the flag. Anything matching
|
|
714
|
+
// `entries-<digit>` is owned by the user with that id and was
|
|
715
|
+
// auto-provisioned server-side via auth-api.ts#ensurePrivateFolder
|
|
716
|
+
// on login. The /api/repos path goes through createSharedFolder
|
|
717
|
+
// which rejects this exact pattern; the git push that follows
|
|
718
|
+
// hits git-http directly where canAccessFolder gates by owner.
|
|
719
|
+
const isPersonalByPattern = /^entries-\d+$/.test(repo.name);
|
|
720
|
+
const skipServerFolderEnsure = !!repo.personal || isPersonalByPattern;
|
|
565
721
|
try {
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
722
|
+
if (!skipServerFolderEnsure) {
|
|
723
|
+
const status = await ensureServerFolder(serverUrl, repo.name, false, authHeader);
|
|
724
|
+
if (status === 'created') {
|
|
725
|
+
log.info(`${repo.name}: created on server`);
|
|
726
|
+
}
|
|
570
727
|
}
|
|
571
728
|
// Set origin to server git URL
|
|
572
729
|
gitSetRemote(repoPath, `${serverUrl}/git/${repo.name}`);
|
|
573
|
-
// Push with
|
|
574
|
-
|
|
730
|
+
// Push with the resolved sg_ token plus the owner escalation header.
|
|
731
|
+
// The server gates personal/solo folders to their owner-of-record —
|
|
732
|
+
// even the workspace owner gets a 404 without this header (the
|
|
733
|
+
// `includePrivate` flag is owner-only server-side, a no-op for
|
|
734
|
+
// everyone else). Required so the owner can push other users' private
|
|
735
|
+
// folders during migrations. Consistent with `studiograph clone`.
|
|
736
|
+
let result = gitPushWithCredentials(repoPath, gitCredentials, { extraHeaders: OWNER_INCLUDE_PRIVATE_HEADERS });
|
|
575
737
|
if (result === 'rejected') {
|
|
576
738
|
log.warn(`${repo.name}: push rejected — run \`studiograph pull\` first`);
|
|
577
739
|
hasError = true;
|
|
578
740
|
continue;
|
|
579
741
|
}
|
|
742
|
+
if (result === 'not-found') {
|
|
743
|
+
log.warn(`${repo.name}: skipped — folder does not exist on the server (stale local clone; safe to remove locally)`);
|
|
744
|
+
continue;
|
|
745
|
+
}
|
|
580
746
|
if (result === 'pushed') {
|
|
581
747
|
log.success(`${repo.name}: pushed`);
|
|
582
748
|
}
|
|
@@ -598,12 +764,12 @@ export const pushCommand = new Command('push')
|
|
|
598
764
|
// Fallback: plain git push for repos that already have remotes
|
|
599
765
|
const entries = await getRepoEntries(workspace, workspaceRoot);
|
|
600
766
|
if (entries.length === 0) {
|
|
601
|
-
log.info('No
|
|
767
|
+
log.info('No folders with remotes to push to. Use `studiograph clone <url>` to connect to a server.');
|
|
602
768
|
return;
|
|
603
769
|
}
|
|
604
770
|
let hasError = false;
|
|
605
771
|
for (const entry of entries) {
|
|
606
|
-
if (
|
|
772
|
+
if (folder && entry.name !== folder)
|
|
607
773
|
continue;
|
|
608
774
|
try {
|
|
609
775
|
let result = gitPush(entry.path);
|
|
@@ -612,6 +778,10 @@ export const pushCommand = new Command('push')
|
|
|
612
778
|
hasError = true;
|
|
613
779
|
continue;
|
|
614
780
|
}
|
|
781
|
+
if (result === 'not-found') {
|
|
782
|
+
log.warn(`${entry.name}: skipped — folder does not exist on the remote (stale local clone; safe to remove locally)`);
|
|
783
|
+
continue;
|
|
784
|
+
}
|
|
615
785
|
if (result === 'pushed') {
|
|
616
786
|
log.success(`${entry.name}: pushed`);
|
|
617
787
|
}
|
|
@@ -625,7 +795,7 @@ export const pushCommand = new Command('push')
|
|
|
625
795
|
}
|
|
626
796
|
}
|
|
627
797
|
if (hasError) {
|
|
628
|
-
outro('Push failed for one or more
|
|
798
|
+
outro('Push failed for one or more folders.');
|
|
629
799
|
process.exit(1);
|
|
630
800
|
}
|
|
631
801
|
});
|